@wrongstack/webui 0.308.0 → 0.308.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/assets/{AgentRosterView-CIUKmLsb.js → AgentRosterView-BRsiLkYT.js} +1 -1
  2. package/dist/assets/{AnalyticsDashboard-B5nVNt6L.js → AnalyticsDashboard-wgm1_jI-.js} +1 -1
  3. package/dist/assets/{AudienceMemoryPanel-8nS326Uh.js → AudienceMemoryPanel-Dj2zRV6l.js} +1 -1
  4. package/dist/assets/{ChangesView-mapTz0_T.js → ChangesView-Cc7SriFS.js} +1 -1
  5. package/dist/assets/{ChronicleDashboard-DUzceZNb.js → ChronicleDashboard-CyqJjnDP.js} +1 -1
  6. package/dist/assets/{CodeEditor-OjU9rotb.js → CodeEditor-CrQxq-34.js} +1 -1
  7. package/dist/assets/{CodeMap-BB1WETLd.js → CodeMap-CAhE44jp.js} +1 -1
  8. package/dist/assets/{ConfirmModal-LBZaZgsG.js → ConfirmModal-gREeWWsa.js} +1 -1
  9. package/dist/assets/{CronJobsPanel-DJaiJw1W.js → CronJobsPanel-D6AfSxD8.js} +1 -1
  10. package/dist/assets/{DeadCodeScanPanel-nlQ9nL3Y.js → DeadCodeScanPanel-LOzt0Z1Z.js} +1 -1
  11. package/dist/assets/{DebugDashboard-BwSbR59I.js → DebugDashboard-CNdS9FFO.js} +1 -1
  12. package/dist/assets/{DesignGalleryView-DLKWmyVp.js → DesignGalleryView-CDDM4pDl.js} +1 -1
  13. package/dist/assets/{GoalView-BtSGdftD.js → GoalView-mzLqil_K.js} +1 -1
  14. package/dist/assets/{KanbanView-CyVG4DQu.js → KanbanView-Dlsji4r2.js} +1 -1
  15. package/dist/assets/{MailboxDetailView-2NJVLrjb.js → MailboxDetailView-Cxx74zQn.js} +1 -1
  16. package/dist/assets/{MemoryDrawer-n3cwB9m3.js → MemoryDrawer-BnT2jWmE.js} +1 -1
  17. package/dist/assets/MemoryManager-DlVmZ-0S.js +1 -0
  18. package/dist/assets/{ModelPicker-B21-QbDB.js → ModelPicker-CsaLCgdi.js} +1 -1
  19. package/dist/assets/{OfficeMapPanel-BKHjEIu9.js → OfficeMapPanel-B_95mXEy.js} +1 -1
  20. package/dist/assets/{ProcessMonitor-9TOnqT6l.js → ProcessMonitor-Dmmbx4lh.js} +1 -1
  21. package/dist/assets/PromptJournalView-DBCw7oeQ.js +1 -0
  22. package/dist/assets/{QueuePanel--PTd2-7z.js → QueuePanel-CKAGgWxS.js} +1 -1
  23. package/dist/assets/{RefreshDebugView-CuKbgI-T.js → RefreshDebugView-CKPQ_tKX.js} +1 -1
  24. package/dist/assets/{RequirementIntakeView-DnNSLw78.js → RequirementIntakeView-B5JKkW9E.js} +1 -1
  25. package/dist/assets/{SageTabs-B-m4WBoA.js → SageTabs-D04tfLki.js} +2 -2
  26. package/dist/assets/{SddFlowGraph-DdYgCVM_.js → SddFlowGraph-BCgIDw11.js} +1 -1
  27. package/dist/assets/{SddHub-DZCKF3Gw.js → SddHub-CkH8Kv7V.js} +1 -1
  28. package/dist/assets/{SessionInspectView-Cf4ypYKn.js → SessionInspectView-PA6jl9bt.js} +1 -1
  29. package/dist/assets/{SessionList-D4D2Cai9.js → SessionList-vOuy4gzk.js} +1 -1
  30. package/dist/assets/{SessionsDashboard-DoAbZStd.js → SessionsDashboard-DXt34ZON.js} +1 -1
  31. package/dist/assets/{SetupScreen-CMrLwoo9.js → SetupScreen-Cm50YBwk.js} +1 -1
  32. package/dist/assets/{SkillDetailView-sVjQG3qG.js → SkillDetailView-BBu6DBBh.js} +1 -1
  33. package/dist/assets/{SpecsView-B53AUOo3.js → SpecsView-DeHi6LWP.js} +1 -1
  34. package/dist/assets/{TechStackView-iONTty84.js → TechStackView-cARkf3Ep.js} +1 -1
  35. package/dist/assets/{TerminalPanel-1mqoe2_8.js → TerminalPanel-HWOYFCGa.js} +1 -1
  36. package/dist/assets/{Toaster-wXvKXbbS.js → Toaster-CQLQAp7y.js} +1 -1
  37. package/dist/assets/{activity-DWHlYL9x.js → activity-BCIzGgqa.js} +2 -2
  38. package/dist/assets/{activity-DTSVEiLK.js → activity-BZIZDVJp.js} +2 -2
  39. package/dist/assets/{activity-jL8-j1D0.js → activity-CQqsspgO.js} +2 -2
  40. package/dist/assets/{activity-C0qPnCbW.js → activity-ChTE_hao.js} +2 -2
  41. package/dist/assets/{activity-DjnYvN9C.js → activity-CnuG3uZL.js} +2 -2
  42. package/dist/assets/{activity-fdbTRXeg.js → activity-DFBPo9d3.js} +2 -2
  43. package/dist/assets/{activity-phJuGuf4.js → activity-K2WIjlQo.js} +2 -2
  44. package/dist/assets/{i18n-CDoHRskt.js → i18n-CcHSmDoO.js} +2 -2
  45. package/dist/assets/{index-BUQkH6BW.js → index-Bj3blCRO.js} +6 -6
  46. package/dist/assets/index-DBU8t21H.css +1 -0
  47. package/dist/assets/{roster-ws-Cinqwkgb.js → roster-ws-XgkT9mo8.js} +1 -1
  48. package/dist/assets/settings-50uwXQIW.js +1 -0
  49. package/dist/assets/settings-BPT8LWkU.js +1 -0
  50. package/dist/assets/settings-BmJI-gam.js +1 -0
  51. package/dist/assets/settings-CqFe8Jtz.js +1 -0
  52. package/dist/assets/settings-DeM0wvCG.js +1 -0
  53. package/dist/assets/settings-DijFr-kZ.js +1 -0
  54. package/dist/assets/settings-L9mLQIIP.js +1 -0
  55. package/dist/assets/{stores-B0SETQK4.js → stores-kaIFQfXo.js} +1 -1
  56. package/dist/assets/{useWebSocket-DCx7NrvL.js → useWebSocket-DjrFK4tQ.js} +6 -6
  57. package/dist/assets/vector-memory-panel-CjqIA8Vf.js +1 -0
  58. package/dist/assets/ws-client-BVq0hf0a.js +1 -0
  59. package/dist/components/MemoryManager/MemorySearchBreakdown.d.ts +14 -0
  60. package/dist/components/MemoryManager/useMemoryManagerState.d.ts +7 -0
  61. package/dist/components/vector-memory-panel/model.d.ts +16 -0
  62. package/dist/hooks/useWebSocket.d.ts +5 -0
  63. package/dist/index.html +11 -11
  64. package/dist/index.js +2557 -2059
  65. package/dist/lib/ws-client-actions.d.ts +10 -0
  66. package/dist/lib/ws-client-utils.d.ts +7 -6
  67. package/dist/lib/ws-client.d.ts +12 -0
  68. package/dist/types/client-message.d.ts +7 -0
  69. package/dist/types/connections.d.ts +10 -0
  70. package/dist/types/sage.d.ts +28 -0
  71. package/dist/types/server-message.d.ts +6 -3
  72. package/package.json +8 -8
  73. package/dist/assets/MemoryManager-CetsTR6O.js +0 -1
  74. package/dist/assets/PromptJournalView-0F-HTGHg.js +0 -1
  75. package/dist/assets/index-BRs425Ir.css +0 -1
  76. package/dist/assets/settings-4A6zNjep.js +0 -1
  77. package/dist/assets/settings-Bq1PPj3V.js +0 -1
  78. package/dist/assets/settings-BxL8m0v6.js +0 -1
  79. package/dist/assets/settings-CZR4viP9.js +0 -1
  80. package/dist/assets/settings-CbtB0i7o.js +0 -1
  81. package/dist/assets/settings-L8hBHrGD.js +0 -1
  82. package/dist/assets/settings-uLdezc9e.js +0 -1
  83. package/dist/assets/vector-memory-panel-D1zQSMIW.js +0 -1
  84. package/dist/assets/ws-client-C2ppA8xa.js +0 -1
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";var t=e({agent:()=>p,allowlist:()=>d,brain:()=>k,brainOpt:()=>A,cancel:()=>T,connection:()=>s,context:()=>y,default:()=>M,display:()=>C,execution:()=>m,fallbacks:()=>g,features:()=>h,fleet:()=>_,general:()=>a,integrations:()=>v,logs:()=>b,mcp:()=>u,model:()=>o,modelSchema:()=>j,oauth:()=>f,provider:()=>c,providerModels:()=>l,resetConfirmAction:()=>O,resetConfirmBody:()=>D,resetConfirmTitle:()=>E,resetLabel:()=>w,security:()=>x,subtitle:()=>r,tabs:()=>i,title:()=>n,toast:()=>S}),n=`Settings`,r=`Configure every aspect of your agent workspace`,i={general:`General`,provider:`Provider`,connection:`Connections`,agent:`Agent`,execution:`Execution`,fallbacks:`Fallbacks`,routing:`Routing`,fleet:`Fleet`,integrations:`Integrations`,chimera:`Chimera`,context:`Context`,logs:`Logs`,security:`Security`,display:`Display`,displayDesc:`Workbench chrome, status chip, refine timers, and tool/memory injection toggles — mirrors the TUI SettingsPicker.`,generalDesc:`Appearance, language, and display preferences — mirrors the TUI SettingsPicker.`,providerDesc:`API keys, saved providers, and the provider catalog.`,connectionDesc:`WebSocket server URL and connection health.`,agentDesc:`Autonomy, prompt refinement, reasoning, and model routing.`,executionDesc:`Iteration caps, exit behavior, and process circuit breaker.`,fallbacksDesc:`Model fallback chain, favorites, and named fallback profiles.`,routingDesc:`Per-phase and per-role model route matrix.`,fleetDesc:`Subagent concurrency, streaming, and next-step prediction.`,integrationsDesc:`HQ client, MCP servers, and Telegram notifications.`,chimeraDesc:`Post-session code review agent configuration.`,contextDesc:`Feature flags, context strategy, compactor, and plugin controls.`,logsDesc:`Log level, audit detail, filesystem access scope, and debug stream.`,securityDesc:`Brain decision control, shadow agent, and tool access.`},a={themeHeading:`Theme`,themeLight:`Light`,themeDark:`Dark`,themeSystem:`System`,themeSystemHint:`System follows your OS-level light/dark preference.`,preferencesHeading:`Display Preferences`,compactDensity:`Compact density`,compactDensityHint:`Tighter spacing throughout the chat.`,soundOnComplete:`Sound on completion`,soundOnCompleteHint:`Play a soft chime when a run finishes.`,titleAnimation:`Title animation`,titleAnimationHint:`Show animated terminal title in the CLI.`,showThinkingLabel:`Show thinking logs`,showThinkingHint:`Display completed reasoning blocks in the chat history.`,groupToolCallsLabel:`Group tool calls`,groupToolCallsHint:`Collapse consecutive tool calls into a single chip.`,autoCollapseInputLabel:`Auto-collapse input under history`,autoCollapseInputHint:`When a session with messages loads, collapse the composer under the history. Off by default — input stays expanded until you collapse it manually.`,languageHeading:`Language`,languageLabel:`Interface language`,languageHint:`Changes only the interface text. Prompts, skills, and model output are not affected.`,statuslineModeLabel:`Statusline mode (CLI/TUI)`,statuslineModeHint:`Density of the TUI statusline.`,statuslineModeDetailed:`Detailed`,statuslineModeMinimum:`Minimum`,statuslineModeNoColor:`No color`,animationStyleLabel:`Animation style (CLI/TUI)`,animationStyleHint:`Animation for the TUI working-state chip.`,animationStyleRainbow:`Rainbow`,animationStyleWave:`Wave`,animationStylePulse:`Pulse`,animationStyleDots:`Dots`,animationStyleBreathe:`Breathe`,animationStyleCycle:`Cycle`,thinkingWordLabel:`Thinking word (CLI/TUI)`,thinkingWordHint:`Word shown in the TUI status chip. Single short word.`,paletteHeading:`Color palette`,paletteSwitcherTitle:`Color palette`,paletteHint:`Pick the main color (and its derivatives). Neutral surfaces stay the same.`,paletteSignal:`Signal`,paletteEmeraldGold:`Emerald & Gold`,paletteBlueNavy:`Blue Navy`,palettePurplePink:`Purple & Pink`,paletteCyanTeal:`Cyan & Teal`,paletteRoseCopper:`Rose & Copper`,paletteIndigoAmber:`Indigo & Amber`,paletteSageSand:`Sage & Sand`,paletteSlateViolet:`Slate & Violet`,paletteCoralMint:`Coral & Mint`,paletteArcticEmber:`Arctic & Ember`,paletteMossRust:`Moss & Rust`},o={heading:`Model`,loading:`Loading models...`,notFound:`No models found for this provider. The catalog might be empty or still loading.`,selectProviderFirst:`Select a provider first`,context:`{{count}}k context`},s={wsUrlLabel:`WebSocket Server URL`,wsUrlPlaceholder:`ws://localhost:3456`,wsUrlHint:`URL of the agent WebSocket server. The server runs alongside the CLI.`,startingHeading:`Starting the WebSocket Server`,startingBody:`For development, run ./dev.ps1 from the repo root (optionally set WS_HOST/WS_PORT first). Otherwise launch the WebUI with the CLI: wstack --webui.`,healthHeading:`Connection health`,healthHint:`Live ownership, storage, queue, watcher, and latency report for project services.`,healthRefresh:`Refresh`,healthLoading:`Checking services…`,healthUnknown:`Health unknown`,healthDisconnected:`The WebUI WebSocket is disconnected.`,healthRestartRequired:`Restart the backend once to activate connection health reporting.`,healthOptional:`On demand`,endpointInvalidBadge:`socket path too long`,endpointInvalidRemedy:`The IPC socket path exceeds this platform's length limit, so the shared daemon cannot start. Queries fall back to a slower process-local mode. Remedy: set a shorter TMPDIR (e.g. export TMPDIR=/tmp) and restart WrongStack.`,healthCounts:`{{healthy}} healthy · {{attention}} attention · {{sleeping}} sleeping`,healthOverall:{healthy:`Required services healthy`,degraded:`Required service degraded`,error:`Required service unavailable`},healthStatus:{healthy:`Healthy`,degraded:`Degraded`,offline:`Sleeping`,unavailable:`Unavailable`,error:`Error`},services:{kanban:{label:`Kanban IPC`},mailbox:{label:`Mailbox IPC`}},serviceActionRestart:`Restart {{label}}`,webuiTransport:`WebUI transport`,serviceAutoRestarting:`Auto-restarting…`},c={subscriptionHeading:`Subscription login`,apiKeysHeading:`API key providers`,apiKeysBody:`Pick a provider from the catalog and add an API key, or manage saved providers.`,tabCatalog:`Catalog`,tabSaved:`Saved ({{count}})`,searchPlaceholder:`Search {{count}} providers (name / id / family)…`,loadingCatalog:`Loading catalog...`,noMatch:`No providers match "{{query}}".`,configured:`Configured`,reachable:`Reachable`,envVar:`ENV: {{var}}`,modelCount_one:`{{count}} model`,modelCount_other:`{{count}} models`,keyPlaceholder:`{{name}} API key`,orEnv:`Or set {{env}} in the environment instead.`,addApiKey:`Add API key`,manageKeys:`Manage your API keys and provider configurations`,addProvider:`Add Provider`,addCustomHeading:`Add Custom Provider`,localServers:`Local servers — click to pre-fill:`,providerIdPlaceholder:`Provider ID (e.g. my-llm-server)`,apiKeyOptionalPlaceholder:`API Key (optional)`,noSaved:`No saved providers yet`,noSavedHint:`Add a provider to get started`,apiKeysLabel:`API Keys`,savedProviderCount_one:`{{count}} provider`,savedProviderCount_other:`{{count}} providers`,keyCount_one:`{{count}} key configured`,keyCount_other:`{{count}} keys configured`,activeKeyCount_one:`{{count}} active key`,activeKeyCount_other:`{{count}} active keys`,addKey:`Add Key`,noKeys:`No keys configured`,active:`Active`,setActive:`Set Active`,keyLabelPlaceholder:`Key label (e.g. default, production)`,apiKeyPlaceholder:`API key`,saveKey:`Save Key`,savedToast:`Saved key for {{name}}`},l={addCustom:`Add custom model`,addCustomTitle:`Add custom model`,addFromCatalog:`Add from catalog`,catalogSearchPlaceholder:`Search models.dev catalog…`,catalogSearchTitle:`Search models.dev catalog`,colActions:`Actions`,colCaps:`Capabilities`,colContext:`Context`,colCost:`Cost`,colModalities:`Modalities`,colModel:`Model`,colOutput:`Output`,colSource:`Source`,editModel:`Edit model`,emptyState:`No models yet — add from the catalog or create a custom model.`,fieldContext:`Context window`,fieldCostInput:`Input cost`,fieldCostOutput:`Output cost`,fieldDescription:`Description`,fieldFamily:`Family`,fieldInputLimit:`Input limit`,fieldInputModalities:`Input modalities`,fieldLastUpdated:`Last updated`,fieldName:`Name`,fieldOutput:`Max output`,fieldOutputModalities:`Output modalities`,fieldReleaseDate:`Release date`,modelAdded:`Added {{model}}`,modelRemoved:`Removed {{model}}`,modelSaved:`Saved {{model}}`,noResults:`No models found`,removeModel:`Remove model`,sectionCapabilities:`Capability flags`,sectionDates:`Dates`,sectionIdentity:`Identity`,sectionLimits:`Limits`,sectionModalities:`Modalities`,sectionPricing:`Pricing (per 1M tokens, USD)`,tabForm:`Form`,tabRawJson:`Raw JSON`,typeToSearch:`Type to search the catalog…`,useModel:`Use {{model}}`,usingModel:`Using {{model}}`,filterPlaceholder:`Filter models…`},u={status:{connected:`Connected`,connecting:`Connecting`,sleeping:`Sleeping`,discovering:`Discovering`,error:`Error`,stopped:`Stopped`,unknown:`Unknown`},disabled:`MCP servers are disabled.`,wakeTitle:`Wake server`,sleepTitle:`Sleep server`,discoverTitle:`Discover tools`,editTitle:`Edit`,removeTitle:`Remove`,statusLabel:`Status:`,enabledLabel:`Enabled:`,yes:`Yes`,no:`No`,descriptionLabel:`Description:`,pidLabel:`PID:`,errorLabel:`Error:`,toolsLabel:`Tools ({{count}}):`,noTools:`No tools discovered yet`,serverNameRequired:`Server name is required`,dialogTitleEdit:`Edit MCP Server`,dialogTitleAdd:`Add MCP Server`,dialogTitleAddCustom:`Add Custom MCP Server`,fieldName:`Name`,fieldNamePlaceholder:`e.g., github, filesystem`,fieldTransport:`Transport`,fieldUrl:`URL`,fieldCommand:`Command`,fieldCommandPlaceholder:`e.g., npx`,fieldArgs:`Args`,fieldArgsHint:`(space-separated)`,fieldArgsPlaceholder:`e.g., -y @modelcontextprotocol/server-github`,fieldEnv:`Env vars`,fieldEnvHint:`(KEY=value, one per line)`,fieldDescription:`Description`,fieldDescriptionPlaceholder:`GitHub MCP server for repository access`,enableServer:`Enable server`,lazyConnect:`Lazy connect`,lazyConnectHint:`(don't start until first tool call; auto-sleeps when idle)`,saveChanges:`Save Changes`,addServer:`Add Server`,requires:`Requires: {{vars}}`,added:`Added`,heading:`MCP Servers`,summary:`{{connected}} connected · {{sleeping}} sleeping · {{total}} total`,addCustom:`Add Custom`,tabRecommended:`Recommended`,tabServers:`Servers`,tabAddCustom:`Add Custom`,recommendedBody:`One-click add for popular MCP servers. Click Add to pre-fill the configuration, then confirm. Servers requiring credentials will need their env vars set before use.`,loadingServers:`Loading servers...`,noServers:`No MCP servers configured`,noServersHint:`Switch to the Recommended tab to add popular servers, or Add Custom for your own.`,addCustomBody:`Configure a custom MCP server with stdio, SSE, or HTTP transport.`,addCustomBodyHint:`For popular servers, use the Recommended tab instead — everything is pre-configured for you.`,removeConfirmTitle:`Remove server "{{name}}"?`,removeConfirmBody:`This removes the MCP server from your configuration.`,toastAdded:`Server "{{name}}" added`,toastRemoved:`Server "{{name}}" removed`,toastDiscovered:`Discovered {{count}} tools from "{{name}}"`,toastSleeping:`Server "{{name}}" is now sleeping`,toastConnected:`Server "{{name}}" connected`,toastReconnected:`Server "{{name}}" reconnected`,toastDisconnected:`Server "{{name}}" disconnected: {{reason}}`,toastError:`Server "{{name}}" error: {{error}}`},d={title:`Clear saved allowlist?`,body_one:`This will remove the pinned model for {{provider}}. The model picker will fall back to the models.dev catalog.`,body_other:`This will remove the {{count}} pinned models for {{provider}}. The model picker will fall back to the models.dev catalog.`,undoHint:`You can undo this for 8 seconds after confirming.`,keepTitle:`Keep the allowlist (Esc)`,clearTitle:`Clear the allowlist (Enter)`,clear:`Clear allowlist`},f={termsWarning:`Sign in with a subscription instead of an API key. Using a subscription outside its official client may violate the provider's Terms — your account could be rate-limited or banned. An API key is the sanctioned path for programmatic use.`,signIn:`Sign in`,waitingBrowser:`Waiting for you to sign in…`,openSignIn:`Open sign-in page`,pasteLoopbackBusy:`Loopback port busy — paste the redirect URL`,pasteCantReach:`Browser can't reach this server? Paste the redirect URL`,submit:`Submit`,enterCode:`Enter this code at the verification page:`,openVerification:`Open verification page`,waitingCode:`Waiting for authorization…`,exchanging:`Exchanging tokens…`,fetchingModels:`Fetching models…`,signedIn:`Signed in.`,signedInToast:`Signed in — {{provider}}`,signInFailed:`Sign-in failed`,accountCount_one:`{{count}} account saved`,accountCount_other:`{{count}} accounts saved`,active:`Active`,inactive:`Inactive`,retry:`Retry`,retryLogin:`Re-authenticate this account`,newAccount:`New account`,aliasPlaceholder:`e.g. {{default}}`},p={autonomyHeading:`Autonomy & Behavior`,autonomyModeLabel:`Autonomy mode`,autonomyModeHint:`How independently the agent proceeds between turns.`,autonomyModeOff:`Off — full manual control`,autonomyModeSuggest:`Suggest — suggests next steps`,autonomyModeAuto:`Auto — brief confirmation delay`,autonomyModeEternal:`Eternal — autonomous until goal done`,autonomyModeEternalParallel:`Eternal Parallel — multi-agent fleet`,autoProceedDelayLabel:`Auto-proceed delay`,autoProceedDelayHint:`Milliseconds before the agent auto-proceeds in Auto mode. 0 = immediate.`,yoloLabel:`YOLO mode`,yoloHint:`Bypass tool confirmation prompts — the agent runs without asking.`,refineHeading:`Prompt Refinement`,enableRefineLabel:`Enable refine`,enableRefineHint:`Rewrite prompts before sending — clearer instructions, better results.`,refineDelayLabel:`Refine delay`,refineDelayHint:`Countdown before the refined prompt auto-sends.`,refineLanguageLabel:`Refine language`,refineLanguageHint:`Keep your language or translate to English for the model.`,refineLanguageOriginal:`Original — keep your language`,refineLanguageEnglish:`English — translate to English`,refinerProviderLabel:`Refiner provider`,refinerProviderHint:`Provider for goal refinement. Select one from your configured providers.`,refinerProviderDefault:`Session provider`,refinerModelLabel:`Refiner model`,refinerModelHint:`Model for goal refinement. Requires a refiner provider first.`,refinerModelDefault:`Session model`,refinerProfileLabel:`Refiner fallback profile`,refinerProfileHint:`Named fallback profile for goal refinement. Overrides provider+model.`,refinerProfileDefault:`None — use provider+model or session defaults`,reasoningHeading:`Reasoning & Cache`,reasoningModeLabel:`Reasoning mode`,reasoningModeHint:`Control how the model uses extended thinking. Auto = provider default.`,reasoningModeAuto:`Auto — provider default`,reasoningModeOn:`On — force thinking on`,reasoningModeOff:`Off — force thinking off`,reasoningEffortLabel:`Reasoning effort`,reasoningEffortHint:`How much compute the model spends thinking. Only sent when the model supports it.`,reasoningEffortNone:`None`,reasoningEffortMinimal:`Minimal`,reasoningEffortLow:`Low`,reasoningEffortMedium:`Medium`,reasoningEffortHigh:`High`,reasoningEffortXhigh:`Extra High`,reasoningEffortMax:`Max`,preserveThinkingLabel:`Preserve thinking`,preserveThinkingHint:`Keep reasoning blocks across turns for context continuity.`,cacheTtlLabel:`Cache TTL`,cacheTtlHint:`Prompt cache time-to-live. 1h costs more on write but saves on repeat reads (Anthropic).`,cacheTtlDefault:`Default — provider default`,cacheTtl5m:`5 minutes`,cacheTtl1h:`1 hour`,capsHint:`Use wstack models caps to check what the current model supports. Unsupported settings are silently omitted per-request.`,routingHeading:`Model Routing`,routingRouteKey:`Route key`,routingPhasesGroup:`Phases`,routingRolesGroup:`Roles — {{label}}`,routingCustomGroup:`Existing custom routes`,routingTargetAria:`Model route target`,routingTargetEmpty:`— Clear route —`,routingTargetProfilesGroup:`Fallback Profiles`,routingTargetModelsGroup:`Models (provider/model)`,routingSet:`Set`,routingReasoningModeAria:`New route reasoning mode`,routingReasoningEffortAria:`New route reasoning effort`,routingReasoningPreserveAria:`New route reasoning preservation`,routingReasoningModeFor:`Reasoning mode for {{key}}`,routingReasoningEffortFor:`Reasoning effort for {{key}}`,routingReasoningPreserveFor:`Reasoning preservation for {{key}}`,noRoutes:`No model routes yet.`,leaderModel:`leader model`,autonomyDelayMsLabel:`Auto-proceed delay`,autonomyDelayMsHint:`Milliseconds before the agent auto-proceeds in Auto mode. 0 = immediate.`,refineCountdownLabel:`Refine countdown`,refineCountdownHint:`Grace period before the refined prompt auto-sends (milliseconds).`},m={heading:`Execution`,maxIterationsLabel:`Max iterations per run`,maxIterationsHint:`Hard cap on LLM turns per agent.run().`,autoProceedMaxIterationsLabel:`Auto-proceed max iterations`,autoProceedMaxIterationsHint:`Stop auto-proceed after N iterations. 0 = unlimited.`,confirmExitLabel:`Confirm before exit`,confirmExitHint:`First Ctrl+C aborts work, second confirms exit.`,chimeLabel:`Chime on completion`,chimeHint:`Terminal bell when an agent run finishes.`,breakerLabel:`Process circuit breaker`,breakerHint:`Gate bash/exec after repeated failures; trips arm the kill/reset countdown.`,breakerTimeoutLabel:`Breaker kill/reset timeout`,breakerTimeoutHint:`Delay before automatic kill/reset when the breaker trips. 0 = manual recovery.`,availabilityHeading:`Provider/model availability calendar`,availabilityHint:`Prevent autonomous and overnight runs from using selected providers or models during recurring windows.`},h={chimeraDedicatedHeading:`Chimera — Post-session Code Review`,chimeraDedicatedHint:`Automated code quality review that runs after every agent session. Catches regressions, anti-patterns, and potential bugs.`,chimeraSectionEnabled:`Post-session review (Chimera)`,chimeraSectionEnabledHint:`Run a code review agent after every iteration.`,chimeraProviderLabel:`Chimera provider`,chimeraProviderHint:`Provider for the review agent. Select one from your configured providers.`,chimeraProviderSessionDefault:`Session default`,chimeraModelLabel:`Model`,chimeraModelSessionDefault:`Session default`,chimeraModelHint:`Model for the review agent. Requires a provider first.`,chimeraMaxFilesLabel:`Max files per review`,chimeraMaxFilesHint:`Maximum number of changed files included in a single review call.`,chimeraAutoFixLabel:`Auto-fix mode`,chimeraAutoFixHint:`Whether the review agent should automatically apply fixes for issues it finds.`,chimeraAutoFixOff:`Off — review only`,chimeraAutoFixAsk:`Ask — confirm before applying`,chimeraAutoFixAuto:`Auto — apply without confirmation`,autoReviewCascadeOnLabel:`Cascade on`,autoReviewCascadeOnHint:`When a review finds issues at or above this severity, spawn follow-up agents.`,autoReviewCascadeOnOff:`Off`,autoReviewCascadeOnHigh:`High or above`,autoReviewCascadeOnCritical:`Critical only`,chimeraPickModel:`Pick provider/model for Chimera`,chimeraPickModelHint:`Select a provider and model for post-session code review.`,autoReviewSectionEnabled:`Mid-session review (Auto-Review)`,autoReviewSectionEnabledHint:`Run a review agent mid-session on every file change.`,autoReviewFallbackProfileLabel:`Fallback / Round-robin profile`,autoReviewFallbackProfileHint:`Named model profile for auto-review. It supplies the fallback pool and the models used by round-robin or random selection.`,autoReviewFallbackProfileNone:`None — use provider+model or session defaults`,autoReviewModelSelectionLabel:`Profile selection`,autoReviewModelSelectionHint:`Choose the next profile model in order, or pick a random starting model for each review.`,autoReviewModelSelectionRoundRobin:`Round-robin — iterate in profile order`,autoReviewModelSelectionRandom:`Random — pick from the profile`,autoReviewFallbackModelsLabel:`Fallback / Round-robin models`,autoReviewFallbackModelsEmpty:`No fallback / round-robin models configured`,autoReviewFallbackModelsHint:`Models resolved from the selected profile or global chain; they form both the selection pool and the retry chain.`,autoReviewModelLabel:`Model`,autoReviewModelHint:`Model for the auto-review agent. Requires a provider first.`,autoReviewDebounceLabel:`Debounce interval (ms)`,autoReviewDebounceHint:`Minimum gap between review triggers after a file change.`,autoReviewMaxFilesLabel:`Max files per batch`,autoReviewMaxFilesHint:`Files per auto-review call.`,autoReviewMaxConcurrentLabel:`Max concurrent reviews`,autoReviewMaxConcurrentHint:`Parallel review subagent cap.`,autoReviewCascadeLabel:`Cascade on`,autoReviewCascadeHint:`Follow-up agent threshold — spawns security-scanner and bug-hunter above this severity.`,autoReviewCascadeOff:`Off — no cascade`,autoReviewCascadeCritical:`Critical — only critical findings`,autoReviewCascadeHigh:`High — critical or high findings`,autoReviewPickModel:`Pick provider/model for Auto-Review`,autoReviewPickModelHint:`Select a provider and model, or a named fallback profile, for mid-session auto-review.`,pluginsPerPluginHint:`Enable or disable individual plugins. Changes take effect on next session.`},g={heading:`Fallback / Round-robin Models`,body:`These ordered model chains support failover and profile-based round-robin selection. On rate limits, 5xx errors, or stalls, the agent retries on the next available model.`,autoFallbackLabel:`Auto fallback`,autoFallbackHint:`When the chain above is empty, auto-derive one from your keyed providers.`,favoritesOnlyLabel:`Favorites only`,favoritesOnlyHint:`When auto fallback derives a chain, restrict it to your favorite models.`,profilesHeading:`Fallback / Round-robin Profiles`,addProfile:`Add`,noProfiles:`No named fallback profiles yet.`,createDefault:`Create default from active model`,useChain:`Use chain`,setLeader:`Set leader`,profileEmpty:`Profile is empty.`,favoritesHeading:`Favorite Models`,favoritesEmpty:`Favorites are shown first and can constrain auto fallback.`,addModelToProfile:`Add model to profile…`,addFavoriteModel:`Add favorite model…`,inactive:`inactive`},_={heading:`Fleet & Streaming`,fleetChatVerbosityLabel:`Stream fleet events`,fleetChatVerbosityHint:`Show live subagent activity in the fleet panel.`,maxConcurrentLabel:`Max concurrent subagents`,maxConcurrentHint:`Maximum number of subagents that can run simultaneously.`,nextPredictionLabel:`Next-step prediction`,nextPredictionHint:`After a turn completes, predict likely next steps.`,nextStepsToolLabel:`Nextsteps tool`,nextStepsToolHint:`Let the agent record its follow-up suggestions with a tool call instead of writing the block by hand. Applies to the next session.`},v={heading:`Integrations`,hqHeading:`HQ Client`,hqPublishingLabel:`HQ publishing`,hqPublishingHint:`Publish this WebUI/client session to WrongStack HQ.`,hqUrlLabel:`HQ URL`,hqUrlHint:`Leave empty for same-machine auto-discovery.`,hqTokenLabel:`HQ client token`,hqRawContentLabel:`Raw HQ content`,hqRawContentHint:`Send raw content previews to HQ instead of redacted previews.`,telegramHeading:`Telegram Notifications`,telegramSessionEndLabel:`Session end`,telegramSessionEndHint:`Send a summary when a session ends.`,telegramDelegateLabel:`Delegate finished`,telegramDelegateHint:`Send a humanized note when a subagent completes.`,telegramLongToolLabel:`Long-running tools`,telegramLongToolHint:`Notify when a tool exceeds {{ms}}ms. Set 0 to disable.`,telegramChangesApply:`Changes apply immediately.`,telegramNotConfigured:`Telegram is not configured.`,disabledHint:`Enable the feature in the Context tab to use this section.`},y={heading:`Context & Memory`,flagsHeading:`Feature Flags`,memoryLabel:`Memory`,memoryHint:`Persist and recall facts across sessions.`,skillsLabel:`Skills`,skillsHint:`Load domain-specific skill prompts.`,indexOnStartLabel:`Index on start`,indexOnStartHint:`Build the codebase symbol index at session start.`,mcpLabel:`MCP servers`,mcpHint:`Enable Model Context Protocol integrations.`,pluginsLabel:`Plugins`,pluginsHint:`Load and run user-installed plugins.`,modelsRegistryLabel:`Models registry`,modelsRegistryHint:`Use the models.dev catalog for provider discovery.`,autoCompactLabel:`Auto-compact context`,autoCompactHint:`Automatically trim the context window when near limits.`,compactorStrategyLabel:`Compactor strategy`,compactorStrategyHint:`How the context is compacted when it grows too large.`,compactorStrategyHybrid:`Hybrid — fast rules (default)`,compactorStrategyIntelligent:`Intelligent — LLM summarization`,compactorStrategySelective:`Selective — LLM-driven selection`,contextModeLabel:`Context mode`,contextModeHint:`Context window policy — balanced is the default.`,contextModeBalanced:`Balanced — normal context usage`,contextModeFrugal:`Frugal — conservative token use`,contextModeDeep:`Deep — larger context for complex tasks`,tokenSavingLabel:`Token-saving mode`,tokenSavingHint:`Controls the next session's direct tool schemas and system prompt size.`,tokenSavingAuto:`Auto — adapt prompt to the model window`,tokenSavingOff:`Off — no token saving`,tokenSavingMinimal:`Minimal — basic optimization`,tokenSavingLight:`Light — moderate reduction`,tokenSavingMedium:`Medium — significant savings`,tokenSavingAggressive:`Aggressive — smallest direct surface and prompt`,pluginsPerPluginHeading:`🔌 Per-Plugin Controls`,pluginsPerPluginHint:`Enable or disable individual plugins. Changes take effect on next session.`,pluginChimera:`Chimera — post-session code review`,pluginSkills:`Skills — skill library & authoring`,pluginPrompts:`Prompts — prompt library & gen`,pluginCostTracker:`Cost Tracker — token & cost tracking`,pluginTelegram:`Telegram — notification bot`,pluginKnowledgeGraph:`Knowledge Graph — persistent facts`,pluginErrorLens:`Error Lens — failure diagnostics`,pluginTodoTracker:`Todo Tracker — persistent todos`,pluginSecretScanner:`Secret Scanner — credential detection`,pluginLintGate:`Lint Gate — lint before iteration`,pluginDiffSummary:`Diff Summary — compact diffs`,pluginDepGuard:`Dep Guard — dependency rules`,pluginTypeGate:`Type Gate — typecheck before iteration`,pluginInjectionShield:`Injection Shield — prompt injection`,pluginPromptFirewall:`Prompt Firewall — input filtering`,pluginTokenBudget:`Token Budget — token limits`,pluginLoopBreaker:`Loop Breaker — runaway detection`},b={heading:`Logs & Debug`,logLevelLabel:`Log level`,logLevelHint:`Minimum severity for server-side logging.`,logLevelDebug:`Debug — everything`,logLevelInfo:`Info — normal flow`,logLevelWarn:`Warn — problems only`,logLevelError:`Error — failures only`,auditLevelLabel:`Audit level`,auditLevelHint:`Detail level for session audit logs.`,auditLevelMinimal:`Minimal — errors only`,auditLevelStandard:`Standard — tool calls + errors`,auditLevelFull:`Full — every event (large logs)`,fsAccessLabel:`Filesystem access`,fsAccessHint:`Scope of the file tools. Applies on the next session.`,fsAccessUnrestricted:`Unrestricted — any path`,fsAccessProject:`Project — confined to project root`,debugStreamLabel:`Debug stream`,debugStreamHint:`Raw SSE hex-dump to the server stderr for provider debugging.`},x={heading:`Security & Monitoring`,brainHeading:`🧠 Brain — Decision Control`,brainHint:`Decision models, council, escalation and risk ceiling — applied live, saved to the global config.`,shadowHeading:`👁 Shadow Agent — Fleet Monitor`,shadowHint:`The Shadow Agent monitors all fleet agents, tracks their tasks, and detects anomalies.`,toolsHeading:`🔧 Tool Access Control`,toolsHint:`Enable or disable individual tools. Mutating tools are marked in amber.`,breakerHeading:`Process Circuit Breaker`,breakerHint:`Gate bash/exec after repeated failures; trips arm the kill/reset countdown.`},S={switchingTo:`Switching to {{provider}} / {{model}}…`,switching:`Switching model…`,switchingToTarget:`Switching to {{target}}…`,previousModel:`previous model`,modelSwitchedNextRequest:`Model switched: {{from}} → {{to}}. Active for the next LLM request.`,modelSwitchedRunActive:`Model switched: {{from}} → {{to}}. Active for the next LLM request; the current run continues and is not restarted.`,fallbackExists:`Fallback profile "{{name}}" already exists`,selectProviderModelFirst:`Select a provider and model first`,defaultProfileCreated:`Default fallback profile created`,profileEmpty:`Fallback profile "{{name}}" is empty`,leaderSetFrom:`Leader set from {{name}}`,modelSwitchTimeout:`Model switch timed out. Please try again.`},C={workbenchHeading:`Workbench chrome`,workbenchHint:`Toggle visibility of workbench surfaces in the chat view.`,showModelReasoningLabel:`Show model reasoning`,showModelReasoningHint:`Render LLM reasoning/thinking blocks in chat history (TUI parity).`,showAgentSwarmPanelLabel:`Agent swarm panel`,showAgentSwarmPanelHint:`Controls where the agent swarm (fleet + mission queue) is displayed.`,swarmPanelBottom:`Bottom panel`,swarmPanelSidebar:`Right sidebar`,swarmPanelOff:`Off`,titleAnimationLabel:`Title animation`,titleAnimationHint:`Animate the terminal/tab title with run-state status (TUI parity).`,statusChipHeading:`Status chip & statusline`,statusChipHint:`Visual style for the TUI/CLI statusline and working-state chip.`,thinkingWordLabel:`Thinking word`,thinkingWordHint:`Single short word shown in the TUI status chip while the agent is working.`,statuslineModeLabel:`Statusline mode`,statuslineModeHint:`Density of the TUI statusline rail.`,statuslineModeMinimum:`Minimum`,statuslineModeDetailed:`Detailed`,statuslineModeNoColor:`No color`,animationStyleLabel:`Animation style`,animationStyleHint:`Animation for the TUI working-state chip.`,animationStyleRainbow:`Rainbow`,animationStyleWave:`Wave`,animationStylePulse:`Pulse`,animationStyleDots:`Dots`,animationStyleBreathe:`Breathe`,animationStyleCycle:`Cycle`,refineHeading:`Refine countdown & diffs`,refineHint:`Configure the pre-refine grace countdown and the multi-diff summary footer cutoff.`,preRefineSecondsLabel:`Pre-refine countdown`,preRefineSecondsHint:`Grace period before the refiner starts (seconds). 0 = skip the countdown and refine immediately.`,preRefineSecondsPresets:`Presets: {{presets}} seconds (0 = off).`,multiDiffSummaryLabel:`Multi-diff summary`,multiDiffSummaryHint:`Minimum number of files before the aggregate 'N files · +X -Y' footer is shown above per-file blocks.`,multiDiffSummaryPresets:`Presets: {{presets}} (0 = off).`,memoryHeading:`Read tool & SAGE memory injection`,memoryHint:`Toggle what the read tool includes and when SAGE memory blocks are surfaced in tool results.`,readSymbolsLabel:`Read symbols`,readSymbolsHint:`When true, the read tool includes codebase-index symbols alongside file content.`,showSageMemoryInjectLabel:`Show SAGE Memory Inject`,showSageMemoryInjectHint:`When true, surface SAGE memory-injection blocks in tool results.`,sageMemoryInjectThresholdLabel:`SAGE Memory Inject threshold`,sageMemoryInjectThresholdHint:`Minimum relation strength required for an injected SAGE memory (0.72–0.95).`,footnote:`Settings here mirror the TUI /settings picker. Toggles apply live; some fields require a session restart.`,sageRelaxed:`0.72 (relaxed)`,sageDefault:`0.85 (default)`,sageStrict:`0.95 (strict)`},w=`Reset`,T=`Cancel`,E=`Reset all preferences?`,D=`This restores default settings and reloads the page.`,O=`Reset`,k={heading:`Brain`,headingHint:`Decision models, council, escalation and risk ceiling — applied live, saved to the global config.`,riskHeading:`Autonomy ceiling`,escalationHeading:`Escalation`,escalationModeLabel:`Mode`,escalationModeHint:`Headless: the Brain never blocks on a human — unanswered escalations resolve via the safe terminal policy. Applies to CLI/TUI sessions; the standalone WebUI Brain is always headless.`,escalationDecisionTimeoutLabel:`Decision timeout`,escalationDecisionTimeoutHint:`Per-LLM-call time budget for one Brain decision.`,escalationHumanTimeoutLabel:`Human answer timeout`,escalationHumanTimeoutHint:`Interactive mode: how long an escalation prompt may wait before the terminal policy resolves it.`,escalationTerminalPolicyLabel:`Terminal policy`,escalationTerminalPolicyHint:`How a headless escalation resolves with no human available. Conservative accepts a recommended option at low/medium risk; deny-all never auto-accepts; continue-on-recommended accepts a recommended option at ANY risk.`,escalationDecisionLogSizeLabel:`Decision log size`,escalationDecisionLogSizeHint:`Rolling in-memory decision log kept for the status view.`,rulesHeading:`Deterministic rules`,rulesConfigured:`{{count}} configured`,rulesBody:`Evaluated before any provider call — first match wins. Edit them in the global config file; this view is read-only.`,rulesOff:`off`,rulesDropped:`{{count}} rule(s) dropped`,heuristicsHeading:`Heuristics`,heuristicsBody:`Free pattern guesses that settle a question before any model runs. All on by default — turn one off when its guess is wrong for your workload.`,heuristicsLowRiskLabel:`Low-risk auto-answer`,heuristicsLowRiskHint:`Auto-answer low-risk requests that already carry a recommended option.`,heuristicsBlockedLabel:`Blocked-resolved`,heuristicsBlockedHint:`'blocked …' plus an explicit resolution marker in the context resolves to continue.`,heuristicsDeadlockLabel:`Deadlock skip`,heuristicsDeadlockHint:`'deadlock' plus failed work units in the context resolves to skip and continue.`,heuristicsRetryLabel:`Retry exhausted`,heuristicsRetryHint:`'failed'/'retry' plus demonstrably exhausted retries marks the unit failed and moves on.`,heuristicsPingLabel:`Continue ping`,heuristicsPingHint:`A bare continue/proceed ping with no competing alternative resolves to continue.`,heuristicsMarkers:`Markers: {{markers}}`,qualityHeading:`LLM quality`,qualityCircuit_one:`circuit {{state}} · {{count}} fail`,qualityCircuit_other:`circuit {{state}} · {{count}} fails`,qualityResponseBudgetLabel:`Response budget`,qualityResponseBudgetHint:`Output tokens per decision call. A Brain response is one decision plus a one-sentence rationale.`,qualityRejectLabel:`Reject uncertain answers`,qualityRejectHint:`Treat a declined or empty response as 'this tier could not decide' instead of accepting it as an answer.`,qualityMinConfidenceLabel:`Minimum confidence`,qualityMinConfidenceHint:`Reject answers whose self-reported confidence is below this. Responses reporting no confidence always pass.`,qualityDenyTerminalLabel:`Deny is terminal`,qualityDenyTerminalHint:`Whether a deny from the single-LLM tier ends the decision. 'when-decided' makes a genuine refusal terminal while infrastructure failures still escalate.`,traceHeading:`Replay trace`,traceRecordLabel:`Record decision traces`,traceRecordHint:`Per-decision JSONL of every tier, pool target and council vote, with timings and token usage. Off by default — enabling it writes decision content to disk.`,traceContentLabel:`Trace content`,traceContentHint:`'full' keeps question and context (needed to replay a decision); 'redacted' truncates free text; 'none' records metadata only.`,cacheHeading:`Decision cache`,cacheStats:`{{hits}} hit / {{misses}} miss · {{size}} live`,cacheReplayLabel:`Replay identical verdicts`,cacheReplayHint:`Reuse a previous council/LLM verdict for an identical repeated question. Deterministic tiers and ask-human are never cached; a decision the ledger observes to have failed is evicted.`,cacheLifetimeLabel:`Entry lifetime`,cacheLifetimeHint:`How long a cached verdict stays replayable.`,cacheMaxEntriesLabel:`Maximum entries`,cacheMaxEntriesHint:`Cap on live cached verdicts.`,monitorHeading:`Monitor`,monitorBody:`Distress-signal self-activation. The monitor is built once at boot, so these apply to the next session rather than live.`,monitorWatchLabel:`Watch for distress signals`,monitorWatchHint:`Tool-failure streaks, error storms, agent stalls and file churn engage the Brain on their own.`,monitorPolicyLabel:`Signal policy`,monitorPolicyHint:`How a detected signal resolves. 'llm' consults the Brain; 'steer' always intervenes and 'observe' never does — both without a provider call.`,modelsHeading:`Decision models`,modelsSessionBadge:`session model`,modelsResolvedBadge:`{{resolved}}/{{total}} resolved`,modelsUseSessionLabel:`Use session model`,modelsUseSessionHint:`Decide with whatever model the session is running. Turn off by adding models below.`,modelsAddModel:`Add model`,modelsPoolStrategyLabel:`Pool strategy`,modelsPoolStrategyHint:`Fallback: first model is primary, the rest are tried in order on failure. Round-robin: decisions rotate across the pool.`,councilHeading:`Council`,councilConvened:`convened`,councilDisabled:`disabled`,councilEnableLabel:`Enable multi-LLM council`,councilEnableHint:`High-stakes questions are voted on by independent seats (executor / skeptic-with-veto / auditor) instead of one model. Needs ≥2 resolvable voters (explicit seats below, or a ≥2-model pool).`,councilSeatsDerived:`Seats derived from the pool: {{seats}}`,councilCustomLens:`Custom decision lens — sent to the seat verbatim.`,councilCustomOption:`{{persona}} (custom)`,councilVeto:`veto`,councilAddVoter:`Add voter`,councilRiskFloorLabel:`Risk floor`,councilRiskFloorHint:`Minimum question risk that convenes the council instead of the single-model tier.`,councilJudge:`Judge`,councilJudgeDesc:`Tie-breaker model that sees every vote's rationale.`,councilResolved:`resolved: {{model}}`,councilAlsoVoter:`⚠ also a voter`,councilAuto:`auto`,councilPick:`Pick…`,councilAutoReset:`Auto`,councilQuorumLabel:`Quorum`,councilQuorumHint:`Fraction of seats that must return a valid vote.`,councilApprovalLabel:`Approval`,councilApprovalHint:`Fraction of cast vote weight the winning option must exceed.`,councilPerSeatTimeoutLabel:`Per-seat timeout`,councilPerSeatTimeoutHint:`Time budget for a single seat's vote. Slower than the decision timeout means one stalled seat holds up the vote.`,councilMaxConcurrencyLabel:`Max concurrency`,councilMaxConcurrencyHint:`How many seats vote in parallel. Lower this when the pool shares one rate-limited provider.`,councilDistinctnessLabel:`Seat distinctness`,councilDistinctnessHint:`Reject duplicate seats: 'model' requires distinct models, 'provider' requires independent providers so one outage cannot sway the vote.`,councilVoterBudgetLabel:`Voter response budget`,councilVoterBudgetHint:`Output tokens per seat call — reasoning models spend thinking tokens from this budget.`,councilJudgeBudgetLabel:`Judge response budget`,councilJudgeBudgetHint:`Output tokens for the tie-breaking judge call.`,councilSeatTemplate:`Seat template:`,ledgerHeading:`Decision ledger`,ledgerRecordLabel:`Record decisions + outcomes`,ledgerRecordHint:`Persists every decision and its observed outcome; similar past outcomes are fed back into future Brain prompts.`,ledgerAutoDenyLabel:`Auto-deny after failures`,ledgerAutoDenyHint:`Deny deterministically (no LLM) once this many consecutive approvals of a decision group ended in observed failures.`,ledgerMemoryEntriesLabel:`In-memory entries`,ledgerMemoryEntriesHint:`Ring size held in memory, and the number of past entries seeded from disk at boot.`,ledgerRetryWindowLabel:`Intervention retry window`,ledgerRetryWindowHint:`A same-kind monitor intervention re-firing inside this window marks the previous steer as a failure.`,recentHeading:`Recent decisions ({{count}})`,recentEmpty:`No decisions recorded yet this session.`,optInteractive:`Interactive (ask me)`,optHeadless:`Headless (never ask)`,optConservative:`Conservative (default)`,optDenyAll:`Deny all`,optContinueRecommended:`Continue on recommended`,optNeverDefault:`Never (default)`,optWhenDecided:`When decided`,optAlways:`Always`,optFullDefault:`Full (default)`,optRedacted:`Redacted`,optMetadataOnly:`Metadata only`,optConsultBrain:`Consult the Brain (default)`,optAlwaysSteer:`Always steer`,optObserveOnly:`Observe only`,optFallback:`Fallback`,optRoundRobin:`Round-robin`,optMediumPlus:`Medium+`,optHighPlus:`High+`,optCriticalOnly:`Critical only`,optNoneDefault:`None (default)`,optDistinctModels:`Distinct models`,optDistinctProviders:`Distinct providers`,optDefault3:`Default (3)`,optOff:`Off`,pickPoolTitle:`Add Brain pool model`,pickPoolHint:`Ordered decision pool — first is primary.`,pickVoterTitle:`Add council voter`,pickVoterHint:`Dialog stays open — add ≥2 voters, then close.`,pickJudgeTitle:`Pick council judge`,pickJudgeHint:`Tie-breaker that sees every vote.`,persistError:`Settings applied live but not saved.`,riskCopy:{off:`Human decides everything`,low:`Auto-decide low risk only`,medium:`Auto-decide up to medium risk`,high:`Auto-decide up to high risk`,all:`Auto-decide everything`},rulesConfigured_one:`{{count}} configured`,rulesConfigured_other:`{{count}} configured`},A={default15s:`Default (15s)`,waitForever:`Wait forever`,defaultHalf:`Default (0.5)`,all:`All`,n200Default:`200 (default)`,offDefault:`Off (default)`,n20Default:`20 (default)`,m5Default:`5m (default)`,default:`Default`,oneSerial:`1 (serial)`,default500:`Default (500)`,default10m:`Default (10m)`},j={capToolCall:`Tool call`,capReasoning:`Reasoning`,capTemperature:`Temperature`,capAttachment:`Attachment`,capStructuredOutput:`Structured output`,capOpenWeights:`Open weights`},M={title:n,subtitle:r,tabs:i,general:a,model:o,connection:s,provider:c,providerModels:l,mcp:u,allowlist:d,oauth:f,agent:p,execution:m,features:h,fallbacks:g,fleet:_,integrations:v,context:y,logs:b,security:x,toast:S,display:C,resetLabel:w,cancel:T,resetConfirmTitle:E,resetConfirmBody:D,resetConfirmAction:O,brain:k,brainOpt:A,modelSchema:j};export{t as n,M as t};
@@ -0,0 +1 @@
1
+ var e=`Einstellungen`,t=`Konfiguriere jeden Aspekt deines Agenten-Arbeitsbereichs`,n={general:`Allgemein`,provider:`Anbieter`,connection:`Verbindungen`,agent:`Agent`,execution:`Ausführung`,fallbacks:`Fallbacks`,routing:`Routing`,fleet:`Flotte`,integrations:`Integrationen`,chimera:`Chimera`,context:`Kontext`,logs:`Protokolle`,security:`Sicherheit`,display:`Anzeige`,displayDesc:`Workbench-Optik, Status-Chip, Refine-Timer und Tool-/Memory-Injection-Schalter — spiegelt den TUI-SettingsPicker.`,generalDesc:`Darstellung, Sprache und Anzeigeeinstellungen — spiegelt die TUI-Einstellungsauswahl.`,providerDesc:`API-Schlüssel, gespeicherte Anbieter und der Anbieterkatalog.`,connectionDesc:`WebSocket-Server-URL und Verbindungsstatus.`,agentDesc:`Autonomie, Prompt-Verfeinerung, Reasoning und Modell-Routing.`,executionDesc:`Iterationslimits, Beenden-Verhalten und Prozess-Schutzschalter.`,fallbacksDesc:`Modell-Fallback-Kette, Favoriten und benannte Fallback-Profile.`,routingDesc:`Modell-Routing-Matrix pro Phase und Rolle.`,fleetDesc:`Gleichzeitige Subagenten, Streaming und Vorhersage nächster Schritte.`,integrationsDesc:`HQ-Client, MCP-Server und Telegram-Benachrichtigungen.`,chimeraDesc:`Konfiguration des Code-Review-Agents nach der Sitzung.`,contextDesc:`Feature-Flags, Kontextstrategie, Komprimierer und Plugin-Steuerung.`,logsDesc:`Protokollebene, Prüfdetails, Dateisystem-Zugriffsbereich und Debug-Stream.`,securityDesc:`Brain-Entscheidungskontrolle, Schatten-Agent und Tool-Zugriff.`},r={heading:`Modell`,loading:`Modelle werden geladen...`,notFound:`Keine Modelle für diesen Anbieter gefunden. Der Katalog könnte leer sein oder noch laden.`,selectProviderFirst:`Zuerst einen Anbieter wählen`,context:`{{count}}k Kontext`},i={wsUrlLabel:`WebSocket-Server-URL`,wsUrlPlaceholder:`ws://localhost:3456`,wsUrlHint:`URL des Agent-WebSocket-Servers. Der Server läuft neben dem CLI.`,startingHeading:`Den WebSocket-Server starten`,startingBody:`Für die Entwicklung ./dev.ps1 vom Repo-Root ausführen (optional zuvor WS_HOST/WS_PORT setzen). Andernfalls die WebUI über die CLI starten: wstack --webui.`,healthHeading:`Verbindungszustand`,healthHint:`Live-Bericht zu Besitz, Speicher, Warteschlange, Watcher und Latenz der Projektdienste.`,healthRefresh:`Aktualisieren`,healthLoading:`Dienste werden geprüft…`,healthUnknown:`Zustand unbekannt`,healthDisconnected:`Die WebUI-WebSocket-Verbindung ist getrennt.`,healthRestartRequired:`Backend einmal neu starten, um den Verbindungsbericht zu aktivieren.`,healthOptional:`Bei Bedarf`,endpointInvalidBadge:`Socket-Pfad zu lang`,endpointInvalidRemedy:`Der IPC-Socket-Pfad überschreitet die Längenbeschränkung dieser Plattform, daher kann der gemeinsame Daemon nicht gestartet werden. Abfragen fallen auf einen langsameren prozesslokalen Modus zurück. Abhilfe: Setzen Sie ein kürzeres TMPDIR (z. B. export TMPDIR=/tmp) und starten Sie WrongStack neu.`,healthCounts:`{{healthy}} gesund · {{attention}} beachten · {{sleeping}} inaktiv`,healthOverall:{healthy:`Erforderliche Dienste gesund`,degraded:`Erforderlicher Dienst eingeschränkt`,error:`Erforderlicher Dienst nicht verfügbar`},healthStatus:{healthy:`Gesund`,degraded:`Eingeschränkt`,offline:`Inaktiv`,unavailable:`Nicht verfügbar`,error:`Fehler`},services:{kanban:{label:`Kanban IPC`},mailbox:{label:`Mailbox IPC`}},serviceActionRestart:`Neustarten {{label}}`,webuiTransport:`WebUI-Transport`,serviceAutoRestarting:`Automatischer Neustart…`},a={savedProviderCount_one:`{{count}} Anbieter`,savedProviderCount_other:`{{count}} Anbieter`,keyCount_one:`{{count}} Schlüssel konfiguriert`,keyCount_other:`{{count}} Schlüssel konfiguriert`,activeKeyCount_one:`{{count}} aktiver Schlüssel`,activeKeyCount_other:`{{count}} aktive Schlüssel`,subscriptionHeading:`Abonnement-Anmeldung`,apiKeysHeading:`API-Schlüssel-Anbieter`,apiKeysBody:`Wähle einen Anbieter aus dem Katalog und füge einen API-Schlüssel hinzu oder verwalte gespeicherte Anbieter.`,tabCatalog:`Katalog`,tabSaved:`Gespeichert ({{count}})`,searchPlaceholder:`{{count}} Anbieter durchsuchen (Name / ID / Familie)…`,loadingCatalog:`Katalog wird geladen...`,noMatch:`Keine Anbieter passen zu „{{query}}“.`,configured:`Konfiguriert`,reachable:`Erreichbar`,envVar:`ENV: {{var}}`,modelCount_one:`{{count}} Modell`,modelCount_other:`{{count}} Modelle`,keyPlaceholder:`{{name}} API-Schlüssel`,orEnv:`Oder stattdessen {{env}} in der Umgebung setzen.`,addApiKey:`API-Schlüssel hinzufügen`,manageKeys:`Verwalte deine API-Schlüssel und Anbieterkonfigurationen`,addProvider:`Anbieter hinzufügen`,addCustomHeading:`Benutzerdefinierten Anbieter hinzufügen`,localServers:`Lokale Server — zum Ausfüllen klicken:`,providerIdPlaceholder:`Anbieter-ID (z.B. my-llm-server)`,apiKeyOptionalPlaceholder:`API-Schlüssel (optional)`,noSaved:`Noch keine gespeicherten Anbieter`,noSavedHint:`Füge einen Anbieter hinzu, um loszulegen`,apiKeysLabel:`API-Schlüssel`,addKey:`Schlüssel hinzufügen`,noKeys:`Keine Schlüssel konfiguriert`,active:`Aktiv`,setActive:`Als aktiv setzen`,keyLabelPlaceholder:`Schlüsselbezeichnung (z.B. default, production)`,apiKeyPlaceholder:`API-Schlüssel`,saveKey:`Schlüssel speichern`,savedToast:`Schlüssel für {{name}} gespeichert`},o={addCustom:`Benutzerdefiniertes Modell hinzufügen`,addCustomTitle:`Benutzerdefiniertes Modell hinzufügen`,addFromCatalog:`Aus Katalog hinzufügen`,catalogSearchPlaceholder:`models.dev-Katalog durchsuchen…`,catalogSearchTitle:`models.dev-Katalog durchsuchen`,colActions:`Aktionen`,colCaps:`Fähigkeiten`,colContext:`Kontext`,colCost:`Kosten`,colModalities:`Modalitäten`,colModel:`Modell`,colOutput:`Ausgabe`,colSource:`Quelle`,editModel:`Modell bearbeiten`,emptyState:`Noch keine Modelle — aus dem Katalog hinzufügen oder ein benutzerdefiniertes Modell erstellen.`,fieldContext:`Kontextfenster`,fieldCostInput:`Eingabekosten`,fieldCostOutput:`Ausgabekosten`,fieldDescription:`Beschreibung`,fieldFamily:`Familie`,fieldInputLimit:`Eingabelimit`,fieldInputModalities:`Eingabe-Modalitäten`,fieldLastUpdated:`Zuletzt aktualisiert`,fieldName:`Name`,fieldOutput:`Max. Ausgabe`,fieldOutputModalities:`Ausgabe-Modalitäten`,fieldReleaseDate:`Veröffentlichungsdatum`,modelAdded:`{{model}} hinzugefügt`,modelRemoved:`{{model}} entfernt`,modelSaved:`{{model}} gespeichert`,noResults:`Keine Modelle gefunden`,removeModel:`Modell entfernen`,sectionCapabilities:`Fähigkeits-Flags`,sectionDates:`Daten`,sectionIdentity:`Identität`,sectionLimits:`Grenzen`,sectionModalities:`Modalitäten`,sectionPricing:`Preise (pro 1M Token, USD)`,tabForm:`Formular`,tabRawJson:`Rohes JSON`,typeToSearch:`Zum Suchen tippen…`,useModel:`{{model}} verwenden`,usingModel:`{{model}} wird verwendet`,filterPlaceholder:`Modelle filtern…`},s={status:{connected:`Verbunden`,connecting:`Verbinden`,sleeping:`Ruhend`,discovering:`Entdecken`,error:`Fehler`,stopped:`Gestoppt`,unknown:`Unbekannt`},disabled:`MCP-Server sind deaktiviert.`,wakeTitle:`Server wecken`,sleepTitle:`Server schlafen legen`,discoverTitle:`Tools entdecken`,editTitle:`Bearbeiten`,removeTitle:`Entfernen`,statusLabel:`Status:`,enabledLabel:`Aktiviert:`,yes:`Ja`,no:`Nein`,descriptionLabel:`Beschreibung:`,pidLabel:`PID:`,errorLabel:`Fehler:`,toolsLabel:`Tools ({{count}}):`,noTools:`Noch keine Tools entdeckt`,serverNameRequired:`Servername ist erforderlich`,dialogTitleEdit:`MCP-Server bearbeiten`,dialogTitleAdd:`MCP-Server hinzufügen`,dialogTitleAddCustom:`Benutzerdefinierten MCP-Server hinzufügen`,fieldName:`Name`,fieldNamePlaceholder:`z.B. github, filesystem`,fieldTransport:`Transport`,fieldUrl:`URL`,fieldCommand:`Befehl`,fieldCommandPlaceholder:`z.B. npx`,fieldArgs:`Args`,fieldArgsHint:`(leerzeichengetrennt)`,fieldArgsPlaceholder:`z.B. -y @modelcontextprotocol/server-github`,fieldEnv:`Env-Variablen`,fieldEnvHint:`(KEY=Wert, eine pro Zeile)`,fieldDescription:`Beschreibung`,fieldDescriptionPlaceholder:`GitHub-MCP-Server für Repository-Zugriff`,enableServer:`Server aktivieren`,lazyConnect:`Verzögert verbinden`,lazyConnectHint:`(erst beim ersten Tool-Aufruf starten; bei Inaktivität automatisch schlafen)`,saveChanges:`Änderungen speichern`,addServer:`Server hinzufügen`,requires:`Erfordert: {{vars}}`,added:`Hinzugefügt`,heading:`MCP-Server`,summary:`{{connected}} verbunden · {{sleeping}} ruhend · {{total}} gesamt`,addCustom:`Benutzerdefiniert`,tabRecommended:`Empfohlen`,tabServers:`Server`,tabAddCustom:`Benutzerdefiniert`,recommendedBody:`One-Click-Hinzufügen für beliebte MCP-Server. Klicke auf Hinzufügen, um die Konfiguration vorzuausfüllen, und bestätige dann. Server mit Anmeldeinformationen benötigen ihre Env-Variablen vor der Nutzung.`,loadingServers:`Server werden geladen...`,noServers:`Keine MCP-Server konfiguriert`,noServersHint:`Wechsle zum Tab Empfohlen, um beliebte Server hinzuzufügen, oder Benutzerdefiniert für eigene.`,addCustomBody:`Konfiguriere einen benutzerdefinierten MCP-Server mit stdio-, SSE- oder HTTP-Transport.`,addCustomBodyHint:`Für beliebte Server nutze stattdessen den Tab Empfohlen — alles ist vorkonfiguriert.`,removeConfirmTitle:`Server „{{name}}“ entfernen?`,removeConfirmBody:`Dies entfernt den MCP-Server aus deiner Konfiguration.`,toastAdded:`Server „{{name}}“ hinzugefügt`,toastRemoved:`Server „{{name}}“ entfernt`,toastDiscovered:`{{count}} Tools von „{{name}}“ entdeckt`,toastSleeping:`Server „{{name}}“ ruht jetzt`,toastConnected:`Server „{{name}}“ verbunden`,toastReconnected:`Server „{{name}}“ neu verbunden`,toastDisconnected:`Server „{{name}}“ getrennt: {{reason}}`,toastError:`Server „{{name}}“ Fehler: {{error}}`},c={title:`Gespeicherte Allowlist löschen?`,body_one:`Dies entfernt das angeheftete Modell für {{provider}}. Die Modellauswahl fällt auf den models.dev-Katalog zurück.`,body_other:`Dies entfernt die {{count}} angehefteten Modelle für {{provider}}. Die Modellauswahl fällt auf den models.dev-Katalog zurück.`,undoHint:`Sie können dies 8 Sekunden nach dem Bestätigen rückgängig machen.`,keepTitle:`Allowlist behalten (Esc)`,clearTitle:`Allowlist löschen (Enter)`,clear:`Allowlist löschen`},l={termsWarning:`Mit einem Abonnement statt einem API-Schlüssel anmelden. Ein Abonnement außerhalb seines offiziellen Clients zu nutzen, kann die Nutzungsbedingungen des Anbieters verletzen — Ihr Konto könnte ratenlimitiert oder gesperrt werden. Ein API-Schlüssel ist der sanktionierte Weg für programmatische Nutzung.`,signIn:`Anmelden`,waitingBrowser:`Warte auf Ihre Anmeldung…`,openSignIn:`Anmeldeseite öffnen`,pasteLoopbackBusy:`Loopback-Port belegt — Redirect-URL einfügen`,pasteCantReach:`Browser erreicht diesen Server nicht? Redirect-URL einfügen`,submit:`Absenden`,enterCode:`Diesen Code auf der Verifizierungsseite eingeben:`,openVerification:`Verifizierungsseite öffnen`,waitingCode:`Warte auf Autorisierung…`,exchanging:`Tokens werden ausgetauscht…`,fetchingModels:`Modelle werden geladen…`,signedIn:`Angemeldet.`,signedInToast:`Angemeldet — {{provider}}`,signInFailed:`Anmeldung fehlgeschlagen`,accountCount_one:`{{count}} Konto gespeichert`,accountCount_other:`{{count}} Konten gespeichert`,active:`Aktiv`,inactive:`Inaktiv`,retry:`Erneut`,retryLogin:`Dieses Konto erneut authentifizieren`,newAccount:`Neues Konto`,aliasPlaceholder:`z.B. {{default}}`},u={showThinkingLabel:`Thinking-Protokolle anzeigen`,showThinkingHint:`Abgeschlossene Reasoning-Blöcke im Chatverlauf anzeigen.`,groupToolCallsLabel:`Tool-Aufrufe gruppieren`,groupToolCallsHint:`Aufeinanderfolgende Tool-Aufrufe in einem Chip zusammenfassen.`,autoCollapseInputLabel:`Composer unter Verlauf einklappen`,autoCollapseInputHint:`Wenn eine Sitzung mit Nachrichten geladen wird, den Composer unter dem Verlauf einklappen. Standardmäßig aus — der Composer bleibt ausgeklappt, bis du ihn manuell einklappst.`,themeHeading:`Design`,themeLight:`Hell`,themeDark:`Dunkel`,themeSystem:`System`,themeSystemHint:`System folgt deiner Hell-/Dunkel-Einstellung auf Betriebssystemebene.`,preferencesHeading:`Einstellungen`,compactDensity:`Kompakte Dichte`,compactDensityHint:`Engerer Abstand im gesamten Chat.`,soundOnComplete:`Ton bei Fertigstellung`,soundOnCompleteHint:`Spielt einen sanften Ton, wenn ein Durchlauf abgeschlossen ist.`,titleAnimation:`Titelanimation`,titleAnimationHint:`Animierten Terminal-Titel im CLI anzeigen.`,thinkingWordLabel:`Denkwort (CLI/TUI)`,thinkingWordHint:`Wort im TUI-Status-Chip. Ein einzelnes kurzes Wort.`,statuslineModeLabel:`Statuszeilen-Modus (CLI/TUI)`,statuslineModeHint:`Detailgrad der TUI-Statuszeile.`,statuslineModeDetailed:`Detailliert`,statuslineModeMinimum:`Minimal`,statuslineModeNoColor:`Ohne Farbe`,animationStyleLabel:`Animationsstil (CLI/TUI)`,animationStyleHint:`Animation für den TUI-Arbeitsstatus-Chip.`,animationStyleRainbow:`Regenbogen`,animationStyleWave:`Welle`,animationStylePulse:`Puls`,animationStyleDots:`Punkte`,animationStyleBreathe:`Atmen`,animationStyleCycle:`Zyklus`,languageHeading:`Sprache`,languageLabel:`Oberflächensprache`,languageHint:`Ändert nur den Oberflächentext. Prompts, Skills und Modellausgaben bleiben unberührt.`,paletteHeading:`Farbpalette`,paletteSwitcherTitle:`Farbpalette`,paletteHint:`Wähle die Hauptfarbe (und ihre Ableitungen). Neutrale Flächen bleiben gleich.`,paletteSignal:`Signal`,paletteEmeraldGold:`Smaragd & Gold`,paletteBlueNavy:`Marineblau`,palettePurplePink:`Violett & Pink`,paletteCyanTeal:`Cyan & Türkis`,paletteRoseCopper:`Rosa & Kupfer`,paletteIndigoAmber:`Indigo & Bernstein`,paletteSageSand:`Salbei & Sand`,paletteSlateViolet:`Schiefer & Violett`,paletteCoralMint:`Koralle & Minze`,paletteArcticEmber:`Arktis & Glut`,paletteMossRust:`Moos & Rost`},d={autonomyHeading:`Autonomie & Verhalten`,autonomyModeLabel:`Autonomie-Modus`,autonomyModeHint:`Wie unabhängig der Agent zwischen Zügen fortfährt.`,autonomyModeOff:`Aus — volle manuelle Kontrolle`,autonomyModeSuggest:`Vorschlagen — schlägt nächste Schritte vor`,autonomyModeAuto:`Auto — kurze Bestätigungsverzögerung`,autonomyModeEternal:`Eternal — autonom bis Ziel erreicht`,autonomyModeEternalParallel:`Eternal Parallel — Multi-Agent-Flotte`,autoProceedDelayLabel:`Auto-Fortsetzen-Verzögerung`,autoProceedDelayHint:`Millisekunden bevor der Agent im Auto-Modus fortfährt. 0 = sofort.`,yoloLabel:`YOLO-Modus`,yoloHint:`Tool-Bestätigungs-Prompts umgehen — der Agent läuft ohne Nachfrage.`,refineHeading:`Prompt-Verfeinerung`,enableRefineLabel:`Verfeinerung aktivieren`,enableRefineHint:`Prompts vor dem Senden umschreiben — klarere Anweisungen, bessere Ergebnisse.`,refineDelayLabel:`Verfeinerungs-Verzögerung`,refineDelayHint:`Countdown bevor der verfeinerte Prompt automatisch gesendet wird.`,refineLanguageLabel:`Verfeinerungs-Sprache`,refineLanguageHint:`Ihre Sprache behalten oder für das Modell ins Englische übersetzen.`,refineLanguageOriginal:`Original — Sprache behalten`,refineLanguageEnglish:`Englisch — ins Englische übersetzen`,refinerProviderLabel:`Verfeinerungs-Provider`,refinerProviderHint:`Provider-ID für die Zielverfeinerung. Leer = Provider der Sitzung verwenden.`,refinerProviderDefault:`Sitzungs-Provider`,refinerModelLabel:`Verfeinerungs-Modell`,refinerModelHint:`Modell-ID für die Zielverfeinerung. Leer = Modell der Sitzung verwenden.`,refinerModelDefault:`Sitzungsmodell`,refinerProfileLabel:`Fallback-Profil für die Verfeinerung`,refinerProfileHint:`Benanntes Fallback-Profil für die Zielverfeinerung. Überschreibt Provider und Modell.`,refinerProfileDefault:`Keines — Provider und Modell oder Sitzungsstandards verwenden`,reasoningHeading:`Reasoning & Cache`,reasoningModeLabel:`Reasoning-Modus`,reasoningModeHint:`Steuern, wie das Modell Extended Thinking nutzt. Auto = Anbieter-Standard.`,reasoningModeAuto:`Auto — Anbieter-Standard`,reasoningModeOn:`An — Thinking erzwingen`,reasoningModeOff:`Aus — Thinking deaktivieren`,reasoningEffortLabel:`Reasoning-Aufwand`,reasoningEffortHint:`Wie viel Compute das Modell fürs Denken aufwendet. Nur gesendet, wenn das Modell es unterstützt.`,reasoningEffortNone:`Keine`,reasoningEffortMinimal:`Minimal`,reasoningEffortLow:`Niedrig`,reasoningEffortMedium:`Mittel`,reasoningEffortHigh:`Hoch`,reasoningEffortXhigh:`Sehr hoch`,reasoningEffortMax:`Max`,preserveThinkingLabel:`Thinking bewahren`,preserveThinkingHint:`Reasoning-Blöcke über Züge hinweg für Kontextkontinuität behalten.`,cacheTtlLabel:`Cache-TTL`,cacheTtlHint:`Prompt-Cache-Time-to-Live. 1h kostet mehr beim Schreiben, spart aber bei wiederholten Lesevorgängen (Anthropic).`,cacheTtlDefault:`Standard — Anbieter-Standard`,cacheTtl5m:`5 Minuten`,cacheTtl1h:`1 Stunde`,capsHint:`Verwenden Sie wstack models caps um zu prüfen, was das aktuelle Modell unterstützt. Nicht unterstützte Einstellungen werden pro Anfrage still weggelassen.`,routingHeading:`Modell-Routing`,routingRouteKey:`Modell-Routen-Schlüssel`,routingPhasesGroup:`Phasen`,routingRolesGroup:`{{label}} Rollen`,routingCustomGroup:`Benutzerdefinierte bestehende Routen`,routingTargetAria:`Ziel der Modellroute`,routingTargetEmpty:`— Route löschen —`,routingTargetProfilesGroup:`Fallback-Profile`,routingTargetModelsGroup:`Modelle (Provider/Modell)`,routingSet:`Setzen`,routingReasoningModeAria:`Reasoning-Modus neue Route`,routingReasoningEffortAria:`Reasoning-Aufwand neue Route`,routingReasoningPreserveAria:`Reasoning-Bewahrung neue Route`,routingReasoningModeFor:`Reasoning-Modus für {{key}}`,routingReasoningEffortFor:`Reasoning-Aufwand für {{key}}`,routingReasoningPreserveFor:`Reasoning-Bewahrung für {{key}}`,noRoutes:`Noch keine Modell-Routen.`,leaderModel:`Leader-Modell`,autonomyDelayMsLabel:`Verzögerung der automatischen Fortsetzung`,autonomyDelayMsHint:`Millisekunden, bevor der Agent im Auto-Modus automatisch fortfährt. 0 = sofort.`,refineCountdownLabel:`Verfeinerungs-Countdown`,refineCountdownHint:`Gnadenfrist, bevor der verfeinerte Prompt automatisch gesendet wird (Millisekunden).`},f={heading:`Ausführung`,maxIterationsLabel:`Max. Iterationen pro Run`,maxIterationsHint:`Feste Obergrenze für LLM-Züge pro agent.run().`,autoProceedMaxIterationsLabel:`Auto-Fortsetzen max. Iterationen`,autoProceedMaxIterationsHint:`Auto-Fortsetzen nach N Iterationen stoppen. 0 = unbegrenzt.`,confirmExitLabel:`Vor Exit bestätigen`,confirmExitHint:`Erstes Ctrl+C bricht Arbeit ab, zweites bestätigt Exit.`,chimeLabel:`Chime bei Fertigstellung`,chimeHint:`Terminal-Glocke, wenn ein Agent-Run endet.`,breakerLabel:`Prozess-Schutzschalter`,breakerHint:`Sperrt bash/exec nach wiederholten Fehlern; beim Auslösen startet der Kill/Reset-Countdown.`,breakerTimeoutLabel:`Kill/Reset-Timeout des Schutzschalters`,breakerTimeoutHint:`Verzögerung bis zum automatischen Kill/Reset nach dem Auslösen. 0 = manuelle Wiederherstellung.`,availabilityHeading:`Verfügbarkeitskalender für Anbieter/Modelle`,availabilityHint:`Verhindert, dass autonome und nächtliche Ausführungen ausgewählte Anbieter oder Modelle in wiederkehrenden Fenstern verwenden.`},p={heading:`Fallback-/Round-robin-Modelle`,body:`Wenn das aktive Modell rate-limited (429/529), 5xx-Fehler oder hängt — nach eigenen Retries — rotiert der Agent zum nächsten Modell dieser Kette. Auch Standard für SDD-Worker-Subagents.`,autoFallbackLabel:`Auto-Fallback`,autoFallbackHint:`Wenn die Kette oben leer ist, automatisch von Ihren gespeicherten Anbietern ableiten.`,favoritesOnlyLabel:`Nur Favoriten`,favoritesOnlyHint:`Wenn Auto-Fallback eine Kette ableitet, auf Ihre Favoriten beschränken.`,profilesHeading:`Fallback-/Round-robin-Profile`,addProfile:`Hinzufügen`,noProfiles:`Noch keine benannten Fallback-Profile.`,createDefault:`Standard aus aktivem Modell erstellen`,useChain:`Kette verwenden`,setLeader:`Leader setzen`,profileEmpty:`Profil ist leer.`,favoritesHeading:`Favoriten-Modelle`,favoritesEmpty:`Favoriten werden zuerst angezeigt und können Auto-Fallback einschränken.`,addModelToProfile:`Modell zum Profil hinzufügen…`,addFavoriteModel:`Favoritenmodell hinzufügen…`,inactive:`inaktiv`},m={heading:`Flotte & Streaming`,fleetChatVerbosityLabel:`Flotten-Events streamen`,fleetChatVerbosityHint:`Live-Subagent-Aktivität im Flotten-Panel zeigen.`,maxConcurrentLabel:`Max. gleichzeitige Subagents`,maxConcurrentHint:`Maximale Anzahl gleichzeitig laufender Subagents.`,nextPredictionLabel:`Next-Step-Vorhersage`,nextPredictionHint:`Nach Abschluss eines Zugs wahrscheinliche nächste Schritte vorhersagen.`,nextStepsToolLabel:`Nextsteps-Tool`,nextStepsToolHint:`Der Agent kann seine Folgevorschläge per Tool-Aufruf hinterlegen, statt den Block selbst zu schreiben. Gilt ab der nächsten Sitzung.`},h={hqHeading:`HQ-Client`,hqPublishingLabel:`HQ-Veröffentlichung`,hqPublishingHint:`Diese WebUI/Client-Sitzung bei WrongStack HQ veröffentlichen. Gleichmaschinige Clients können lokales HQ-Auth auto-entdecken; Remote-Clients nutzen untenstehende URL/Token.`,hqUrlLabel:`HQ-URL`,hqUrlHint:`Für Auto-Discovery auf gleicher Maschine leer lassen.`,hqTokenLabel:`HQ-Client-Token`,hqRawContentLabel:`Rohe HQ-Inhalte`,hqRawContentHint:`Rohe Inhaltsvorschauen statt geschwärzter Vorschauen an HQ senden.`,telegramHeading:`Telegram-Benachrichtigungen`,telegramSessionEndLabel:`Sitzungsende`,telegramSessionEndHint:`Zusammenfassung senden, wenn eine Sitzung endet.`,telegramDelegateLabel:`Delegat fertig`,telegramDelegateHint:`Vermenschlichte Notiz senden, wenn ein Subagent fertig ist.`,telegramLongToolLabel:`Langlaufende Tools`,telegramLongToolHint:`Benachrichtigen, wenn ein Tool {{ms}}ms überschreitet. 0 zum Deaktivieren.`,telegramChangesApply:`Änderungen werden sofort angewendet.`,telegramNotConfigured:`Telegram ist nicht konfiguriert. Führen Sie /telegram-setup in der CLI aus, um zuerst einen Bot zu verbinden.`,heading:`Integrationen`,disabledHint:`Aktivieren Sie die Funktion im Kontext-Tab, um diesen Bereich zu nutzen.`},g={chimeraDedicatedHeading:`Chimera — Code-Review nach der Sitzung`,chimeraDedicatedHint:`Automatisierte Code-Qualitätsprüfung nach jeder Agentensitzung.`,chimeraSectionEnabled:`Post-Session-Review (Chimera)`,chimeraSectionEnabledHint:`Nach jeder Iteration einen Code-Review-Agenten ausführen.`,chimeraProviderLabel:`Chimera-Anbieter`,chimeraProviderHint:`Anbieter für den Review-Agenten. Aus konfigurierten Anbietern wählen.`,chimeraProviderSessionDefault:`Sitzungsstandard`,chimeraModelLabel:`Modell`,chimeraModelSessionDefault:`Sitzungsstandard`,chimeraModelHint:`Modell für den Review-Agenten. Erfordert zuerst einen Anbieter.`,chimeraMaxFilesLabel:`Max. Dateien pro Review`,chimeraMaxFilesHint:`Maximale Anzahl geänderter Dateien pro Review-Aufruf.`,chimeraAutoFixLabel:`Auto-Fix-Modus`,chimeraAutoFixHint:`Ob der Review-Agent Funde automatisch korrigieren soll.`,chimeraAutoFixOff:`Aus — nur Review`,chimeraAutoFixAsk:`Fragen — vor Anwendung bestätigen`,chimeraAutoFixAuto:`Auto — ohne Bestätigung anwenden`,autoReviewCascadeOnLabel:`Kaskade ab`,autoReviewCascadeOnHint:`Wenn ein Review Funde dieses oder höheren Schweregrads findet, Folgeagenten starten.`,autoReviewCascadeOnOff:`Aus`,autoReviewCascadeOnHigh:`Hoch oder höher`,autoReviewCascadeOnCritical:`Nur kritisch`,chimeraPickModel:`Anbieter/Modell für Chimera wählen`,chimeraPickModelHint:`Anbieter und Modell für das Post-Session-Code-Review wählen.`,autoReviewSectionEnabled:`Mid-Session-Review (Auto-Review)`,autoReviewSectionEnabledHint:`Bei jeder Dateiänderung während der Sitzung einen Review-Agenten ausführen.`,autoReviewFallbackProfileLabel:`Fallback-/Round-robin-Profil`,autoReviewFallbackProfileHint:`Benanntes Modellprofil für Auto-Review; liefert Fallback-Pool und Modelle für Round-robin oder Zufallsauswahl.`,autoReviewFallbackProfileNone:`Keines — Anbieter+Modell oder Sitzungsstandard`,autoReviewModelSelectionLabel:`Profilauswahl`,autoReviewModelSelectionHint:`Wählt das nächste Profilmodell der Reihe nach oder ein zufälliges Startmodell pro Review.`,autoReviewModelSelectionRoundRobin:`Round-robin — in Profilreihenfolge`,autoReviewModelSelectionRandom:`Zufällig — aus dem Profil wählen`,autoReviewFallbackModelsLabel:`Fallback-/Round-robin-Modelle`,autoReviewFallbackModelsEmpty:`Keine Fallback-/Round-robin-Modelle konfiguriert`,autoReviewFallbackModelsHint:`Modelle aus Profil oder globaler Kette; sie bilden Auswahlpool und Wiederholungskette.`,autoReviewModelLabel:`Modell`,autoReviewModelHint:`Modell für Auto-Review-Agent. Erfordert zuerst einen Anbieter.`,autoReviewDebounceLabel:`Entprellintervall (ms)`,autoReviewDebounceHint:`Mindestabstand zwischen Reviews nach Dateiänderung.`,autoReviewMaxFilesLabel:`Max. Dateien pro Batch`,autoReviewMaxFilesHint:`Dateien pro Auto-Review-Aufruf.`,autoReviewMaxConcurrentLabel:`Max. gleichzeitige Reviews`,autoReviewMaxConcurrentHint:`Limit für parallele Review-Subagents.`,autoReviewCascadeLabel:`Kaskade bei`,autoReviewCascadeHint:`Schwellwert für Folgeagenten — startet Sicherheits- und Bug-Scanner.`,autoReviewCascadeOff:`Aus — keine Kaskade`,autoReviewCascadeCritical:`Kritisch — nur kritische Funde`,autoReviewCascadeHigh:`Hoch — kritische oder hohe Funde`,autoReviewPickModel:`Anbieter/Modell für Auto-Review wählen`,autoReviewPickModelHint:`Anbieter/Modell oder Fallback-Profil für Auto-Review wählen.`,pluginsPerPluginHint:`Einzelne Plugins aktivieren oder deaktivieren. Änderungen werden mit der nächsten Sitzung wirksam.`},_={flagsHeading:`Feature-Flags`,mcpLabel:`MCP-Server`,mcpHint:`Model Context Protocol-Integrationen aktivieren.`,pluginsLabel:`Plugins`,pluginsHint:`Vom Nutzer installierte Plugins laden und ausführen.`,memoryLabel:`Speicher`,memoryHint:`Fakten sitzungsübergreifend speichern und abrufen.`,skillsLabel:`Skills`,skillsHint:`Domänenspezifische Skill-Prompts laden.`,modelsRegistryLabel:`Modell-Registry`,modelsRegistryHint:`Das models.dev-Katalog zur Anbieter-Entdeckung nutzen.`,indexOnStartLabel:`Beim Start indizieren`,indexOnStartHint:`Symbol-Index der Codebasis beim Sitzungsstart aufbauen.`,pluginsPerPluginHeading:`🔌 Pro-Plugin-Steuerung`,pluginsPerPluginHint:`Einzelne Plugins aktivieren oder deaktivieren. Änderungen werden mit der nächsten Sitzung wirksam.`,pluginChimera:`Chimera — Code-Review nach Sitzungsende`,pluginSkills:`Skills — Skill-Bibliothek & -Erstellung`,pluginPrompts:`Prompts — Prompt-Bibliothek & Generierung`,pluginCostTracker:`Cost Tracker — Token- & Kostenverfolgung`,pluginTelegram:`Telegram — Benachrichtigungsbot`,pluginKnowledgeGraph:`Knowledge Graph — dauerhafte Fakten`,pluginErrorLens:`Error Lens — Fehlerdiagnose`,pluginTodoTracker:`Todo Tracker — dauerhafte Aufgaben`,pluginSecretScanner:`Secret Scanner — Zugangsdaten-Erkennung`,pluginLintGate:`Lint Gate — Lint vor Iteration`,pluginDiffSummary:`Diff Summary — kompakte Diffs`,pluginDepGuard:`Dep Guard — Abhängigkeitsregeln`,pluginTypeGate:`Type Gate — Typecheck vor Iteration`,pluginInjectionShield:`Injection Shield — Prompt-Injection`,pluginPromptFirewall:`Prompt Firewall — Eingabefilterung`,pluginTokenBudget:`Token Budget — Token-Limits`,pluginLoopBreaker:`Loop Breaker — Erkennung außer Kontrolle`,heading:`Kontext & Debug`,autoCompactLabel:`Kontext auto-kompaktieren`,autoCompactHint:`Kontextfenster in der Nähe von Limits automatisch kürzen.`,compactorStrategyLabel:`Compaktor-Strategie`,compactorStrategyHint:`Wie der Kontext komprimiert wird, wenn er zu groß wird.`,compactorStrategyHybrid:`Hybrid — schnelle Regeln (Standard)`,compactorStrategyIntelligent:`Intelligent — LLM-Zusammenfassung`,compactorStrategySelective:`Selektiv — LLM-gesteuerte Auswahl`,contextModeLabel:`Kontext-Modus`,contextModeHint:`Kontextfenster-Richtlinie — balanced ist Standard.`,contextModeBalanced:`Ausgewogen — normale Kontextnutzung`,contextModeFrugal:`Sparsam — konservative Token-Nutzung`,contextModeDeep:`Tief — größerer Kontext für komplexe Aufgaben`,tokenSavingLabel:`Token-Sparmodus`,tokenSavingHint:`Steuert direkte Tool-Schemas und die System-Prompt-Größe der nächsten Sitzung.`,tokenSavingAuto:`Auto — Prompt an das Modellfenster anpassen`,tokenSavingOff:`Aus — kein Token-Sparen`,tokenSavingMinimal:`Minimal — grundlegende Optimierung`,tokenSavingLight:`Leicht — moderate Reduktion`,tokenSavingMedium:`Mittel — erhebliche Einsparungen`,tokenSavingAggressive:`Aggressiv — kleinste direkte Oberfläche und Prompt`},v={logLevelLabel:`Log-Level`,logLevelHint:`Mindest-Schweregrad für serverseitiges Logging.`,logLevelDebug:`Debug — alles`,logLevelInfo:`Info — normaler Ablauf`,logLevelWarn:`Warn — nur Probleme`,logLevelError:`Error — nur Fehler`,auditLevelLabel:`Audit-Level`,auditLevelHint:`Detaillierungsgrad für Sitzungs-Audit-Logs.`,auditLevelMinimal:`Minimal — nur Fehler`,auditLevelStandard:`Standard — Tool-Aufrufe + Fehler`,auditLevelFull:`Voll — jedes Ereignis (große Logs)`,fsAccessLabel:`Dateisystemzugriff`,fsAccessHint:`Geltungsbereich der Datei-Tools. Gilt ab der nächsten Sitzung.`,fsAccessUnrestricted:`Uneingeschränkt — beliebiger Pfad`,fsAccessProject:`Projekt — auf das Projektverzeichnis beschränkt`,debugStreamLabel:`Debug-Stream`,debugStreamHint:`Roher SSE-Hexdump auf stderr des Servers zum Provider-Debugging.`,heading:`Logs & Debug`},y={heading:`Sicherheit & Überwachung`,brainHeading:`🧠 Brain – Entscheidungssteuerung`,brainHint:`Entscheidungsmodelle, Council, Eskalation und Risikoobergrenze – sofort wirksam, in der globalen Konfiguration gespeichert.`,shadowHeading:`👁 Schatten-Agent – Flottenmonitor`,shadowHint:`Der Schatten-Agent überwacht alle Flottenagenten, verfolgt ihre Aufgaben und erkennt Anomalien.`,toolsHeading:`🔧 Tool Access Control`,toolsHint:`Einzelne Tools aktivieren oder deaktivieren. Verändernde Tools sind bernsteinfarben markiert.`,breakerHeading:`Prozess-Schutzschalter`,breakerHint:`bash/exec nach wiederholten Fehlern sperren; ein Auslösen startet den Kill-/Reset-Countdown.`},b={switchingTo:`Wechseln zu {{provider}} / {{model}}…`,switching:`Modell wird gewechselt…`,switchingToTarget:`Wechsel zu {{target}}…`,previousModel:`vorheriges Modell`,modelSwitchedNextRequest:`Modell gewechselt: {{from}} → {{to}}. Aktiv für die nächste LLM-Anfrage.`,modelSwitchedRunActive:`Modell gewechselt: {{from}} → {{to}}. Aktiv für die nächste LLM-Anfrage; der aktuelle Lauf wird fortgesetzt und nicht neu gestartet.`,fallbackExists:`Fallback-Profil "{{name}}" existiert bereits`,selectProviderModelFirst:`Wählen Sie zuerst einen Anbieter und ein Modell`,defaultProfileCreated:`Standard-Fallback-Profil erstellt`,profileEmpty:`Fallback-Profil "{{name}}" ist leer`,leaderSetFrom:`Leader aus {{name}} gesetzt`,modelSwitchTimeout:`Zeitüberschreitung beim Modellwechsel. Bitte erneut versuchen.`},x={workbenchHeading:`Workbench-Optik`,workbenchHint:`Sichtbarkeit der Workbench-Oberflächen im Chat umschalten.`,showModelReasoningLabel:`Modell-Reasoning anzeigen`,showModelReasoningHint:`LLM-Reasoning/Thinking-Blöcke im Chatverlauf rendern (TUI-Parität).`,showAgentSwarmPanelLabel:`Agent-Schwarm-Panel`,showAgentSwarmPanelHint:`Steuert, wo das Agent-Schwarm-Panel (Fleet + Mission Queue) angezeigt wird.`,swarmPanelBottom:`Unteres Panel`,swarmPanelSidebar:`Rechte Seitenleiste`,swarmPanelOff:`Aus`,titleAnimationLabel:`Titelanimation`,titleAnimationHint:`Terminal-/Tab-Titel mit Laufstatus animieren (TUI-Parität).`,statusChipHeading:`Status-Chip & Statuszeile`,statusChipHint:`Visueller Stil für die TUI/CLI-Statuszeile und den Arbeits-Chip.`,thinkingWordLabel:`Denkwort`,thinkingWordHint:`Einzelnes kurzes Wort, das im TUI-Status-Chip angezeigt wird, während der Agent arbeitet.`,statuslineModeLabel:`Statuszeilen-Modus`,statuslineModeHint:`Detailgrad der TUI-Statusleiste.`,statuslineModeMinimum:`Minimal`,statuslineModeDetailed:`Detailliert`,statuslineModeNoColor:`Ohne Farbe`,animationStyleLabel:`Animationsstil`,animationStyleHint:`Animation für den TUI-Arbeits-Chip.`,animationStyleRainbow:`Regenbogen`,animationStyleWave:`Welle`,animationStylePulse:`Puls`,animationStyleDots:`Punkte`,animationStyleBreathe:`Atmen`,animationStyleCycle:`Wechselnd`,refineHeading:`Refine-Countdown & Diffs`,refineHint:`Grace-Countdown vor dem Refiner und Mindestanzahl von Dateien für die Multi-Diff-Fußzeile konfigurieren.`,preRefineSecondsLabel:`Vor-Refine-Countdown`,preRefineSecondsHint:`Wartezeit vor dem Refiner in Sekunden. 0 = Countdown überspringen und sofort verfeinern.`,preRefineSecondsPresets:`Voreinstellungen: {{presets}} Sekunden (0 = aus).`,multiDiffSummaryLabel:`Multi-Diff-Zusammenfassung`,multiDiffSummaryHint:`Mindestanzahl von Dateien, ab der die aggregierte 'N Dateien · +X -Y' Fußzeile über den Einzelblöcken erscheint.`,multiDiffSummaryPresets:`Voreinstellungen: {{presets}} (0 = aus).`,memoryHeading:`Read-Tool & SAGE-Memory-Injection`,memoryHint:`Umschalten, was das Read-Tool enthält und wann SAGE-Memory-Blöcke in Tool-Ergebnissen erscheinen.`,readSymbolsLabel:`Symbole lesen`,readSymbolsHint:`Wenn aktiv, enthält das Read-Tool Codebase-Index-Symbole neben dem Datei-Inhalt.`,showSageMemoryInjectLabel:`SAGE Memory Inject anzeigen`,showSageMemoryInjectHint:`Wenn aktiv, werden SAGE-Memory-Injection-Blöcke in Tool-Ergebnissen angezeigt.`,sageMemoryInjectThresholdLabel:`SAGE-Memory-Inject-Schwelle`,sageMemoryInjectThresholdHint:`Mindest-Beziehungsstärke für eine injizierte SAGE-Memory (0.72–0.95).`,footnote:`Diese Einstellungen spiegeln den TUI- /settings-Picker wider. Schalter wirken sofort; einige Felder erfordern einen Session-Neustart.`,sageRelaxed:`0,72 (locker)`,sageDefault:`0,85 (Standard)`,sageStrict:`0,95 (streng)`},S=`Zurücksetzen`,C=`Abbrechen`,w=`Alle Einstellungen zurücksetzen?`,T=`Dadurch werden die Standardeinstellungen wiederhergestellt und die Seite neu geladen.`,E=`Zurücksetzen`,D=JSON.parse(`{"heading":"Brain","headingHint":"Entscheidungsmodelle, Rat, Eskalation und Risiko-Decke — live angewendet, in der globalen Konfiguration gespeichert.","riskHeading":"Autonomie-Decke","escalationHeading":"Eskalation","escalationModeLabel":"Modus","escalationModeHint":"Headless: Das Brain blockiert nie auf einen Menschen — unbeantwortete Eskalationen werden über die sichere Endrichtlinie aufgelöst. Gilt für CLI/TUI-Sitzungen; das eigenständige WebUI-Brain ist immer headless.","escalationDecisionTimeoutLabel":"Entscheidungs-Timeout","escalationDecisionTimeoutHint":"Zeitbudget pro LLM-Aufruf für eine Brain-Entscheidung.","escalationHumanTimeoutLabel":"Timeout für menschliche Antwort","escalationHumanTimeoutHint":"Interaktiver Modus: Wie lange ein Eskalations-Prompt warten darf, bevor die Endrichtlinie ihn auflöst.","escalationTerminalPolicyLabel":"Endrichtlinie","escalationTerminalPolicyHint":"Wie eine headless-Eskalation ohne verfügbaren Menschen aufgelöst wird. Konservativ akzeptiert eine empfohlene Option bei niedrigem/mittlerem Risiko; alles-ablehnen akzeptiert nie automatisch; mit-Empfehlung-fortfahren akzeptiert eine empfohlene Option bei JEDEM Risiko.","escalationDecisionLogSizeLabel":"Größe des Entscheidungsprotokolls","escalationDecisionLogSizeHint":"Rollierendes In-Memory-Entscheidungsprotokoll für die Statusansicht.","rulesHeading":"Deterministische Regeln","rulesConfigured":"{{count}} konfiguriert","rulesBody":"Wird vor jedem Provider-Aufruf ausgewertet — der erste Treffer gewinnt. Bearbeiten Sie sie in der globalen Konfigurationsdatei; diese Ansicht ist schreibgeschützt.","rulesOff":"aus","rulesDropped":"{{count}} Regel(n) verworfen","heuristicsHeading":"Heuristiken","heuristicsBody":"Kostenlose Mustervermutungen, die eine Frage lösen, bevor ein Modell läuft. Standardmäßig alle an — schalten Sie eine aus, wenn ihre Vermutung für Ihre Arbeitslast falsch ist.","heuristicsLowRiskLabel":"Automatische Antwort bei niedrigem Risiko","heuristicsLowRiskHint":"Beantwortet risikoarme Anfragen automatisch, die bereits eine empfohlene Option tragen.","heuristicsBlockedLabel":"Blockiert-aufgelöst","heuristicsBlockedHint":"'blocked …' plus ein expliziter Auflösungsmarker im Kontext löst zu „fortfahren\\" auf.","heuristicsDeadlockLabel":"Deadlock überspringen","heuristicsDeadlockHint":"'deadlock' plus fehlgeschlagene Arbeitseinheiten im Kontext löst zu „überspringen und fortfahren\\" auf.","heuristicsRetryLabel":"Wiederholungen erschöpft","heuristicsRetryHint":"'failed'/'retry' plus nachweislich erschöpfte Wiederholungen markiert die Einheit als fehlgeschlagen und fährt fort.","heuristicsPingLabel":"Fortfahren-Ping","heuristicsPingHint":"Ein bloßer Fortfahren/Weiter-Ping ohne konkurrierende Alternative löst zu „fortfahren\\" auf.","heuristicsMarkers":"Marker: {{markers}}","qualityHeading":"LLM-Qualität","qualityCircuit_one":"Schaltung {{state}} · {{count}} Fehler","qualityCircuit_other":"Schaltung {{state}} · {{count}} Fehler","qualityResponseBudgetLabel":"Antwortbudget","qualityResponseBudgetHint":"Ausgabetoken pro Entscheidungsaufruf. Eine Brain-Antwort ist eine Entscheidung plus eine Begründung in einem Satz.","qualityRejectLabel":"Unsichere Antworten ablehnen","qualityRejectHint":"Behandelt eine abgelehnte oder leere Antwort als „diese Stufe konnte nicht entscheiden\\", statt sie als Antwort zu akzeptieren.","qualityMinConfidenceLabel":"Mindestkonfidenz","qualityMinConfidenceHint":"Lehnt Antworten ab, deren selbst gemeldete Konfidenz darunter liegt. Antworten ohne Konfidenzangabe bestehen immer.","qualityDenyTerminalLabel":"Ablehnung ist terminal","qualityDenyTerminalHint":"Ob eine Ablehnung aus der Einzel-LLM-Stufe die Entscheidung beendet. 'when-decided' macht eine echte Ablehnung terminal, während Infrastrukturfehler weiter eskalieren.","traceHeading":"Replay-Spur","traceRecordLabel":"Entscheidungsspuren aufzeichnen","traceRecordHint":"JSONL pro Entscheidung jeder Stufe, jedes Pool-Ziels und jeder Ratsabstimmung, mit Zeiten und Token-Nutzung. Standardmäßig aus — Aktivieren schreibt Entscheidungsinhalte auf die Festplatte.","traceContentLabel":"Spurinhalt","traceContentHint":"'full' behält Frage und Kontext (nötig zum Replay einer Entscheidung); 'redacted' kürzt Freitext; 'none' zeichnet nur Metadaten auf.","cacheHeading":"Entscheidungs-Cache","cacheStats":"{{hits}} Treffer / {{misses}} Fehlschlag · {{size}} live","cacheReplayLabel":"Identische Urteile wiedergeben","cacheReplayHint":"Verwendet ein früheres Rats-/LLM-Urteil für eine identische wiederholte Frage wieder. Deterministische Stufen und Frage-an-Mensch werden nie gecacht; ein Urteil, das das Protokoll als fehlgeschlagen beobachtet, wird entfernt.","cacheLifetimeLabel":"Eintragslebensdauer","cacheLifetimeHint":"Wie lange ein gecachtes Urteil wiedergebbar bleibt.","cacheMaxEntriesLabel":"Maximale Einträge","cacheMaxEntriesHint":"Obergrenze für live gecachte Urteile.","monitorHeading":"Monitor","monitorBody":"Selbstaktivierung bei Notfallsignalen. Der Monitor wird einmal beim Start gebaut, daher gelten diese Einstellungen für die nächste Sitzung statt live.","monitorWatchLabel":"Auf Notfallsignale achten","monitorWatchHint":"Tool-Fehlerketten, Fehlerstürme, Agent-Staus und Datei-Churn aktivieren das Brain von selbst.","monitorPolicyLabel":"Signalrichtlinie","monitorPolicyHint":"Wie ein erkanntes Signal aufgelöst wird. 'llm' konsultiert das Brain; 'steer' greift immer ein und 'observe' nie — beide ohne Provider-Aufruf.","modelsHeading":"Entscheidungsmodelle","modelsSessionBadge":"Sitzungsmodell","modelsResolvedBadge":"{{resolved}}/{{total}} aufgelöst","modelsUseSessionLabel":"Sitzungsmodell verwenden","modelsUseSessionHint":"Mit dem Modell entscheiden, das die Sitzung ausführt. Durch Hinzufügen von Modellen unten ausschalten.","modelsAddModel":"Modell hinzufügen","modelsPoolStrategyLabel":"Pool-Strategie","modelsPoolStrategyHint":"Fallback: Das erste Modell ist primär, der Rest wird bei Fehlern der Reihe nach versucht. Round-Robin: Entscheidungen rotieren durch den Pool.","councilHeading":"Rat","councilConvened":"einberufen","councilDisabled":"deaktiviert","councilEnableLabel":"Multi-LLM-Rat aktivieren","councilEnableHint":"Fragen mit hohem Einsatz werden von unabhängigen Sitzen (Ausführender / Skeptiker-mit-Veto / Prüfer) statt von einem Modell abgestimmt. Erfordert ≥2 auflösbare Wähler (explizite Sitze unten oder ein Pool mit ≥2 Modellen).","councilSeatsDerived":"Aus dem Pool abgeleitete Sitze: {{seats}}","councilCustomLens":"Benutzerdefinierte Entscheidungslinse — wird dem Sitz wörtlich gesendet.","councilCustomOption":"{{persona}} (benutzerdefiniert)","councilVeto":"Veto","councilAddVoter":"Wähler hinzufügen","councilRiskFloorLabel":"Risiko-Untergrenze","councilRiskFloorHint":"Mindestfragenrisiko, das den Rat statt der Einzelmodell-Stufe einberuft.","councilJudge":"Richter","councilJudgeDesc":"Stichentscheid-Modell, das die Begründung jeder Stimme sieht.","councilResolved":"aufgelöst: {{model}}","councilAlsoVoter":"⚠ auch ein Wähler","councilAuto":"auto","councilPick":"Auswählen…","councilAutoReset":"Auto","councilQuorumLabel":"Quorum","councilQuorumHint":"Anteil der Sitze, die eine gültige Stimme abgeben müssen.","councilApprovalLabel":"Zustimmung","councilApprovalHint":"Anteil des abgegebenen Stimmengewichts, den die Gewinneroption überschreiten muss.","councilPerSeatTimeoutLabel":"Timeout pro Sitz","councilPerSeatTimeoutHint":"Zeitbudget für die Stimme eines einzelnen Sitzes. Langsamer als das Entscheidungs-Timeout bedeutet, dass ein hängender Sitz die Abstimmung aufhält.","councilMaxConcurrencyLabel":"Max. Parallelität","councilMaxConcurrencyHint":"Wie viele Sitze parallel abstimmen. Verringern, wenn der Pool einen ratenbegrenzten Provider teilt.","councilDistinctnessLabel":"Sitzverschiedenheit","councilDistinctnessHint":"Doppelte Sitze ablehnen: 'model' erfordert verschiedene Modelle, 'provider' unabhängige Provider, damit ein Ausfall die Abstimmung nicht kippen kann.","councilVoterBudgetLabel":"Wähler-Antwortbudget","councilVoterBudgetHint":"Ausgabetoken pro Sitzaufruf — Reasoning-Modelle verbrauchen ihre Denk-Token aus diesem Budget.","councilJudgeBudgetLabel":"Richter-Antwortbudget","councilJudgeBudgetHint":"Ausgabetoken für den stichentscheidenden Richteraufruf.","councilSeatTemplate":"Sitzvorlage:","ledgerHeading":"Entscheidungsprotokoll","ledgerRecordLabel":"Entscheidungen + Ergebnisse aufzeichnen","ledgerRecordHint":"Speichert jede Entscheidung und ihr beobachtetes Ergebnis; ähnliche vergangene Ergebnisse fließen in zukünftige Brain-Prompts ein.","ledgerAutoDenyLabel":"Nach Fehlern automatisch ablehnen","ledgerAutoDenyHint":"Deterministisch ablehnen (ohne LLM), sobald so viele aufeinanderfolgende Genehmigungen einer Entscheidungsgruppe in beobachteten Fehlern endeten.","ledgerMemoryEntriesLabel":"In-Memory-Einträge","ledgerMemoryEntriesHint":"Ringgröße im Speicher und Anzahl der beim Start von der Festplatte geladenen früheren Einträge.","ledgerRetryWindowLabel":"Interventions-Wiederholungsfenster","ledgerRetryWindowHint":"Eine gleichartige Monitor-Intervention, die innerhalb dieses Fensters erneut auslöst, markiert die vorherige Steuerung als Fehlschlag.","recentHeading":"Letzte Entscheidungen ({{count}})","recentEmpty":"In dieser Sitzung wurden noch keine Entscheidungen aufgezeichnet.","optInteractive":"Interaktiv (mich fragen)","optHeadless":"Headless (nie fragen)","optConservative":"Konservativ (Standard)","optDenyAll":"Alles ablehnen","optContinueRecommended":"Mit Empfehlung fortfahren","optNeverDefault":"Nie (Standard)","optWhenDecided":"Wenn entschieden","optAlways":"Immer","optFullDefault":"Voll (Standard)","optRedacted":"Gekürzt","optMetadataOnly":"Nur Metadaten","optConsultBrain":"Brain konsultieren (Standard)","optAlwaysSteer":"Immer steuern","optObserveOnly":"Nur beobachten","optFallback":"Fallback","optRoundRobin":"Round-Robin","optMediumPlus":"Mittel+","optHighPlus":"Hoch+","optCriticalOnly":"Nur kritisch","optNoneDefault":"Keine (Standard)","optDistinctModels":"Verschiedene Modelle","optDistinctProviders":"Verschiedene Provider","optDefault3":"Standard (3)","optOff":"Aus","pickPoolTitle":"Brain-Pool-Modell hinzufügen","pickPoolHint":"Geordneter Entscheidungspool — der erste ist primär.","pickVoterTitle":"Ratsmitglied hinzufügen","pickVoterHint":"Dialog bleibt offen — ≥2 Wähler hinzufügen, dann schließen.","pickJudgeTitle":"Ratsrichter wählen","pickJudgeHint":"Stichentscheid, der jede Stimme sieht.","persistError":"Einstellungen live angewendet, aber nicht gespeichert.","riskCopy":{"off":"Ein Mensch entscheidet alles","low":"Nur niedriges Risiko automatisch entscheiden","medium":"Automatisch bis mittleres Risiko entscheiden","high":"Automatisch bis hohes Risiko entscheiden","all":"Alles automatisch entscheiden"},"rulesConfigured_one":"{{count}} konfiguriert","rulesConfigured_other":"{{count}} konfiguriert"}`),O={default15s:`Standard (15 s)`,waitForever:`Unbegrenzt warten`,defaultHalf:`Standard (0,5)`,all:`Alle`,n200Default:`200 (Standard)`,offDefault:`Aus (Standard)`,n20Default:`20 (Standard)`,m5Default:`5 min (Standard)`,default:`Standard`,oneSerial:`1 (seriell)`,default500:`Standard (500)`,default10m:`Standard (10 min)`},k={capToolCall:`Tool-Aufruf`,capReasoning:`Reasoning`,capTemperature:`Temperatur`,capAttachment:`Anhang`,capStructuredOutput:`Strukturierte Ausgabe`,capOpenWeights:`Offene Gewichte`},A={title:e,subtitle:t,tabs:n,model:r,connection:i,provider:a,providerModels:o,mcp:s,allowlist:c,oauth:l,general:u,agent:d,execution:f,fallbacks:p,fleet:m,integrations:h,features:g,context:_,logs:v,security:y,toast:b,display:x,resetLabel:S,cancel:C,resetConfirmTitle:w,resetConfirmBody:T,resetConfirmAction:E,brain:D,brainOpt:O,modelSchema:k};export{d as agent,c as allowlist,D as brain,O as brainOpt,C as cancel,i as connection,_ as context,A as default,x as display,f as execution,p as fallbacks,g as features,m as fleet,u as general,h as integrations,v as logs,s as mcp,r as model,k as modelSchema,l as oauth,a as provider,o as providerModels,E as resetConfirmAction,T as resetConfirmBody,w as resetConfirmTitle,S as resetLabel,y as security,t as subtitle,n as tabs,e as title,b as toast};
@@ -1,4 +1,4 @@
1
- import{a as e}from"./chat-store-c0pGYczr.js";import{Ra as t,za as n}from"./vendor-C_zEzV4N.js";import"./i18n-CDoHRskt.js";import{r,t as i}from"./ws-client-C2ppA8xa.js";import"./session-store-BgiP4PnQ.js";import"./codemap-activity-store-BH7Mh4k9.js";import"./mailbox-store-bF96Ih2G.js";import"./ui-store-xx1NssJI.js";var a=`signal`,o=`wrongstack-palette`,s=[{id:`signal`,labelKey:`settings:general.paletteSignal`,swatch:`hsl(345.9 99% 58.8%)`,swatchSecondary:`hsl(37.5 98.4% 50%)`},{id:`emerald-gold`,labelKey:`settings:general.paletteEmeraldGold`,swatch:`hsl(152 66% 48%)`,swatchSecondary:`hsl(42 96% 54%)`},{id:`blue-navy`,labelKey:`settings:general.paletteBlueNavy`,swatch:`hsl(213 90% 60%)`,swatchSecondary:`hsl(36 96% 54%)`},{id:`purple-pink`,labelKey:`settings:general.palettePurplePink`,swatch:`hsl(263 82% 66%)`,swatchSecondary:`hsl(332 94% 62%)`},{id:`cyan-teal`,labelKey:`settings:general.paletteCyanTeal`,swatch:`hsl(180 76% 46%)`,swatchSecondary:`hsl(36 96% 54%)`},{id:`rose-copper`,labelKey:`settings:general.paletteRoseCopper`,swatch:`hsl(14 82% 56%)`,swatchSecondary:`hsl(34 96% 54%)`},{id:`indigo-amber`,labelKey:`settings:general.paletteIndigoAmber`,swatch:`hsl(233 74% 58%)`,swatchSecondary:`hsl(38 96% 54%)`},{id:`sage-sand`,labelKey:`settings:general.paletteSageSand`,swatch:`hsl(130 28% 55%)`,swatchSecondary:`hsl(36 55% 72%)`},{id:`slate-violet`,labelKey:`settings:general.paletteSlateViolet`,swatch:`hsl(248 50% 55%)`,swatchSecondary:`hsl(285 52% 62%)`},{id:`coral-mint`,labelKey:`settings:general.paletteCoralMint`,swatch:`hsl(12 85% 62%)`,swatchSecondary:`hsl(162 55% 55%)`},{id:`arctic-ember`,labelKey:`settings:general.paletteArcticEmber`,swatch:`hsl(195 85% 58%)`,swatchSecondary:`hsl(14 85% 55%)`},{id:`moss-rust`,labelKey:`settings:general.paletteMossRust`,swatch:`hsl(100 45% 38%)`,swatchSecondary:`hsl(18 70% 48%)`}];function c(e){return typeof e==`string`&&s.some(t=>t.id===e)}function l(e){return s.find(t=>t.id===e)??s[0]}function u(e,t){if(typeof window>`u`)return t;try{let n=window.localStorage.getItem(e);return c(n)?n:t}catch{return t}}function d(e,t){t===`signal`?e.removeAttribute(`data-palette`):e.setAttribute(`data-palette`,t)}var f=n()(t(e=>({provider:``,model:``,wsUrl:r(),wsConnected:!1,wsStatus:{state:`connecting`},theme:`system`,palette:`signal`,autoConnect:!0,soundOnComplete:!1,setProvider:t=>e({provider:t}),setModel:t=>e({model:t}),setConfig:t=>e(t),setTheme:t=>e({theme:t}),setPalette:t=>e({palette:t}),setWsConnected:t=>e({wsConnected:t}),setWsStatus:t=>e({wsStatus:t,wsConnected:t.state===`open`}),setSoundOnComplete:t=>e({soundOnComplete:t})}),{name:`wrongstack-config`,partialize:e=>({provider:e.provider,model:e.model,baseUrl:e.baseUrl,theme:e.theme,palette:e.palette,autoConnect:e.autoConnect,soundOnComplete:e.soundOnComplete}),merge:(e,t)=>{let{apiKey:n,...i}=e??{};return{...t,...i,wsUrl:r(),wsConnected:!1,wsStatus:{state:`connecting`},palette:c(i.palette)?i.palette:u(o,t.palette)}}}));function p(e,t){return t>=100?`danger`:`warning`}function ee(e,t){switch(e){case`budget.threshold_reached`:{let e=t,n=e.limit>0?Math.round(e.used/e.limit*100):0;return`${e.subagentId} [${e.kind}] ${n}% (${e.used}/${e.limit})`}case`budget.decision`:{let e=t;return`${e.subagentId} [${e.kind}] → ${e.decision}`}case`consensus.vote_initiated`:{let e=t;return`Vote: "${e.title}" — ${e.eligible.length} voters`}case`consensus.vote_cast`:{let e=t;return`${e.voterId} voted ${e.value}`}case`consensus.vote_resolved`:{let e=t;return`${e.result} — ✅${e.approveCount} ❌${e.rejectCount}`}case`task.pending`:return`Task queued: "${t.description.slice(0,60)}"`;case`task.started`:{let e=t;return`${e.subagentId} started ${e.taskId}`}case`task.completed`:{let e=t;return`Task ${e.taskId} ${e.status} (${e.durationMs}ms)`}case`task.failed`:{let e=t;return`Task ${e.taskId} failed: ${e.error.slice(0,60)}`}case`subagent.budget_extended`:{let e=t;return`${e.subagentId} [${e.kind}] extended → ${e.extendedTo}ms`}default:return e}}var te=200,ne=50,m=300,h=200,re=100;function g(e,t,n){if(!(e.size<=t)){if(n)for(let[r,i]of e){if(e.size<=t)break;n(i)&&e.delete(r)}for(let n of e.keys()){if(e.size<=t)break;e.delete(n)}}}var ie=n()(e=>({coordinatorStatus:`idle`,subagents:new Map,events:[],consensusVotes:new Map,tasks:new Map,taskCounts:{pending:0,running:0,completed:0,failed:0},budgetAlerts:[],lastUpdated:Date.now(),setCoordinatorStatus:(t,n)=>e(e=>({coordinatorStatus:t,coordinatorMode:n,lastUpdated:Date.now()})),updateCoordinatorStats:t=>e(e=>{let n=new Map(e.subagents);for(let e of t.subagentStatuses??[]){let t=n.get(e.id);n.set(e.id,{id:e.id,name:e.name,role:t?.role??`agent`,status:e.status,currentTask:e.currentTask,budgetLimits:t?.budgetLimits,budgetUsage:t?.budgetUsage,lastSeen:t?.lastSeen??Date.now()})}return g(n,h,e=>e.status===`stopped`),{subagents:n,taskCounts:{pending:t.pending,running:t.inFlight,completed:t.completed,failed:0},lastUpdated:Date.now()}}),updateSubagentBudget:(t,n)=>e(e=>{let r=new Map(e.subagents),i=r.get(t);return r.set(t,{id:t,name:i?.name??t,role:i?.role??`agent`,status:i?.status??`idle`,...i,...n,lastSeen:Date.now()}),g(r,h,e=>e.status===`stopped`),{subagents:r,lastUpdated:Date.now()}}),pushEvent:(t,n,r,i,a)=>e(e=>{let o=n.kind??t,s=(t.includes(`budget`)||t.includes(`threshold`))&&typeof n.limit==`number`&&n.limit>0?Math.round(n.used/n.limit*100):void 0,c=s===void 0?t.includes(`consensus.vote_resolved`)?`info`:t.includes(`consensus.vote_initiated`)?`warning`:`info`:s>=100?`danger`:s>=85?`warning`:`info`;return{events:[{id:`${r}-${t}`,ts:r,type:t,subagentId:i,taskId:a,payload:n,kind:o,level:c,message:ee(t,n)},...e.events].slice(0,te),lastUpdated:Date.now()}}),pushConsensusVote:(t,n,r)=>e(e=>{let i=new Map(e.consensusVotes);return i.set(t,{changeId:t,title:n,status:`pending`,eligible:r,votes:[],approveCount:0,rejectCount:0,abstainCount:0,expiresAt:Date.now()+3e5}),g(i,re,e=>e.status!==`pending`),{consensusVotes:i,lastUpdated:Date.now()}}),recordConsensusVote:(t,n,r,i)=>e(e=>{let a=new Map(e.consensusVotes),o=a.get(t);if(!o)return{};let s={...o,votes:[...o.votes.filter(e=>e.agentId!==n),{agentId:n,agentName:r,value:i,votedAt:Date.now()}],approveCount:i===`approve`?o.approveCount+1:o.approveCount,rejectCount:i===`reject`?o.rejectCount+1:o.rejectCount,abstainCount:i===`abstain`?o.abstainCount+1:o.abstainCount};return a.set(t,s),{consensusVotes:a,lastUpdated:Date.now()}}),resolveConsensusVote:(t,n,r,i)=>e(e=>{let a=new Map(e.consensusVotes),o=a.get(t);return o?(a.set(t,{...o,status:n,approveCount:r,rejectCount:i,resolvedAt:Date.now()}),{consensusVotes:a,lastUpdated:Date.now()}):{}}),pushTaskPending:(t,n,r)=>e(e=>{let i=new Map(e.tasks);return i.set(t,{id:t,description:n,status:`pending`,priority:r,queuedAt:Date.now()}),g(i,m,e=>e.status===`completed`||e.status===`failed`),{tasks:i,taskCounts:{...e.taskCounts,pending:e.taskCounts.pending+1},lastUpdated:Date.now()}}),startTask:(t,n)=>e(e=>{let r=new Map(e.tasks),i=r.get(t);return i?r.set(t,{...i,status:`running`,subagentId:n,startedAt:Date.now()}):r.set(t,{id:t,description:``,status:`running`,subagentId:n,startedAt:Date.now()}),{tasks:r,taskCounts:{...e.taskCounts,pending:Math.max(0,e.taskCounts.pending-1),running:e.taskCounts.running+1},lastUpdated:Date.now()}}),completeTask:(t,n,r)=>e(e=>{let i=new Map(e.tasks),a=i.get(t);return a&&i.set(t,{...a,status:n,completedAt:Date.now(),durationMs:r}),g(i,m,e=>e.status===`completed`||e.status===`failed`),{tasks:i,taskCounts:{...e.taskCounts,running:Math.max(0,e.taskCounts.running-1),completed:n===`completed`?e.taskCounts.completed+1:e.taskCounts.completed,failed:n===`failed`?e.taskCounts.failed+1:e.taskCounts.failed},lastUpdated:Date.now()}}),failTask:(t,n)=>e(e=>{let r=new Map(e.tasks),i=r.get(t);return i&&r.set(t,{...i,status:`failed`,error:n,completedAt:Date.now()}),g(r,m,e=>e.status===`completed`||e.status===`failed`),{tasks:r,taskCounts:{...e.taskCounts,running:Math.max(0,e.taskCounts.running-1),failed:e.taskCounts.failed+1},lastUpdated:Date.now()}}),recordBudgetDecision:(t,n,r,i)=>e(e=>{let a=new Map;for(let t of e.budgetAlerts){let e=`${t.subagentId}:${t.kind}`;a.has(e)||a.set(e,t)}let o=`${t}:${n}`,s=a.get(o);return s&&a.set(o,{...s,decision:r,newLimit:i,level:r===`extend`?`warning`:`danger`}),{budgetAlerts:Array.from(a.values()),lastUpdated:Date.now()}}),recordBudgetAlert:(t,n,r,i)=>e(e=>{let a=`${Date.now()}-${t}-${n}`,o=i>0?Math.round(r/i*100):0;return{budgetAlerts:[{id:a,ts:Date.now(),subagentId:t,kind:n,level:p(n,o),used:r,limit:i,pct:o},...e.budgetAlerts].slice(0,ne),lastUpdated:Date.now()}}),recordBudgetExtended:(t,n,r)=>e(e=>{let i=new Map(e.subagents),a=i.get(t);if(a?.budgetLimits){let e={...a.budgetLimits};n===`timeout`&&r&&(e.timeoutMs=r),n===`iterations`&&(e.maxIterations=r),n===`tool_calls`&&(e.maxToolCalls=r),i.set(t,{...a,budgetLimits:e,lastSeen:Date.now()})}return{subagents:i,lastUpdated:Date.now()}}),clear:()=>e({coordinatorStatus:`idle`,coordinatorMode:void 0,subagents:new Map,events:[],consensusVotes:new Map,tasks:new Map,taskCounts:{pending:0,running:0,completed:0,failed:0},budgetAlerts:[],lastUpdated:Date.now()})})),ae=n()(e=>({snapshot:null,lastFiredAt:{},revision:0,setSnapshot:t=>e(e=>({snapshot:t,revision:e.revision+1})),recordFired:(t,n)=>e(e=>({lastFiredAt:{...e.lastFiredAt,[t]:n},revision:e.revision+1})),clear:()=>e({snapshot:null,lastFiredAt:{},revision:0})}));function oe(){return`ref_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}function _(e){switch(e.split(`.`).pop()?.toLowerCase()??``){case`ts`:case`tsx`:return`typescript`;case`js`:case`jsx`:return`javascript`;case`json`:return`json`;case`md`:case`mdx`:return`markdown`;case`css`:return`css`;case`scss`:return`scss`;case`html`:case`htm`:return`html`;case`py`:return`python`;case`rs`:return`rust`;case`go`:return`go`;case`rb`:return`ruby`;case`java`:return`java`;case`c`:return`c`;case`cpp`:case`hpp`:return`cpp`;case`h`:return`c`;case`sh`:case`bash`:return`bash`;case`sql`:return`sql`;case`yaml`:case`yml`:return`yaml`;case`toml`:return`toml`;default:return``}}function v(e,t=20,n=2e3){let r=e.split(`
1
+ import{a as e}from"./chat-store-c0pGYczr.js";import{Ra as t,za as n}from"./vendor-C_zEzV4N.js";import"./i18n-CcHSmDoO.js";import{r,t as i}from"./ws-client-BVq0hf0a.js";import"./session-store-BgiP4PnQ.js";import"./codemap-activity-store-BH7Mh4k9.js";import"./mailbox-store-bF96Ih2G.js";import"./ui-store-xx1NssJI.js";var a=`signal`,o=`wrongstack-palette`,s=[{id:`signal`,labelKey:`settings:general.paletteSignal`,swatch:`hsl(345.9 99% 58.8%)`,swatchSecondary:`hsl(37.5 98.4% 50%)`},{id:`emerald-gold`,labelKey:`settings:general.paletteEmeraldGold`,swatch:`hsl(152 66% 48%)`,swatchSecondary:`hsl(42 96% 54%)`},{id:`blue-navy`,labelKey:`settings:general.paletteBlueNavy`,swatch:`hsl(213 90% 60%)`,swatchSecondary:`hsl(36 96% 54%)`},{id:`purple-pink`,labelKey:`settings:general.palettePurplePink`,swatch:`hsl(263 82% 66%)`,swatchSecondary:`hsl(332 94% 62%)`},{id:`cyan-teal`,labelKey:`settings:general.paletteCyanTeal`,swatch:`hsl(180 76% 46%)`,swatchSecondary:`hsl(36 96% 54%)`},{id:`rose-copper`,labelKey:`settings:general.paletteRoseCopper`,swatch:`hsl(14 82% 56%)`,swatchSecondary:`hsl(34 96% 54%)`},{id:`indigo-amber`,labelKey:`settings:general.paletteIndigoAmber`,swatch:`hsl(233 74% 58%)`,swatchSecondary:`hsl(38 96% 54%)`},{id:`sage-sand`,labelKey:`settings:general.paletteSageSand`,swatch:`hsl(130 28% 55%)`,swatchSecondary:`hsl(36 55% 72%)`},{id:`slate-violet`,labelKey:`settings:general.paletteSlateViolet`,swatch:`hsl(248 50% 55%)`,swatchSecondary:`hsl(285 52% 62%)`},{id:`coral-mint`,labelKey:`settings:general.paletteCoralMint`,swatch:`hsl(12 85% 62%)`,swatchSecondary:`hsl(162 55% 55%)`},{id:`arctic-ember`,labelKey:`settings:general.paletteArcticEmber`,swatch:`hsl(195 85% 58%)`,swatchSecondary:`hsl(14 85% 55%)`},{id:`moss-rust`,labelKey:`settings:general.paletteMossRust`,swatch:`hsl(100 45% 38%)`,swatchSecondary:`hsl(18 70% 48%)`}];function c(e){return typeof e==`string`&&s.some(t=>t.id===e)}function l(e){return s.find(t=>t.id===e)??s[0]}function u(e,t){if(typeof window>`u`)return t;try{let n=window.localStorage.getItem(e);return c(n)?n:t}catch{return t}}function d(e,t){t===`signal`?e.removeAttribute(`data-palette`):e.setAttribute(`data-palette`,t)}var f=n()(t(e=>({provider:``,model:``,wsUrl:r(),wsConnected:!1,wsStatus:{state:`connecting`},theme:`system`,palette:`signal`,autoConnect:!0,soundOnComplete:!1,setProvider:t=>e({provider:t}),setModel:t=>e({model:t}),setConfig:t=>e(t),setTheme:t=>e({theme:t}),setPalette:t=>e({palette:t}),setWsConnected:t=>e({wsConnected:t}),setWsStatus:t=>e({wsStatus:t,wsConnected:t.state===`open`}),setSoundOnComplete:t=>e({soundOnComplete:t})}),{name:`wrongstack-config`,partialize:e=>({provider:e.provider,model:e.model,baseUrl:e.baseUrl,theme:e.theme,palette:e.palette,autoConnect:e.autoConnect,soundOnComplete:e.soundOnComplete}),merge:(e,t)=>{let{apiKey:n,...i}=e??{};return{...t,...i,wsUrl:r(),wsConnected:!1,wsStatus:{state:`connecting`},palette:c(i.palette)?i.palette:u(o,t.palette)}}}));function p(e,t){return t>=100?`danger`:`warning`}function ee(e,t){switch(e){case`budget.threshold_reached`:{let e=t,n=e.limit>0?Math.round(e.used/e.limit*100):0;return`${e.subagentId} [${e.kind}] ${n}% (${e.used}/${e.limit})`}case`budget.decision`:{let e=t;return`${e.subagentId} [${e.kind}] → ${e.decision}`}case`consensus.vote_initiated`:{let e=t;return`Vote: "${e.title}" — ${e.eligible.length} voters`}case`consensus.vote_cast`:{let e=t;return`${e.voterId} voted ${e.value}`}case`consensus.vote_resolved`:{let e=t;return`${e.result} — ✅${e.approveCount} ❌${e.rejectCount}`}case`task.pending`:return`Task queued: "${t.description.slice(0,60)}"`;case`task.started`:{let e=t;return`${e.subagentId} started ${e.taskId}`}case`task.completed`:{let e=t;return`Task ${e.taskId} ${e.status} (${e.durationMs}ms)`}case`task.failed`:{let e=t;return`Task ${e.taskId} failed: ${e.error.slice(0,60)}`}case`subagent.budget_extended`:{let e=t;return`${e.subagentId} [${e.kind}] extended → ${e.extendedTo}ms`}default:return e}}var te=200,ne=50,m=300,h=200,re=100;function g(e,t,n){if(!(e.size<=t)){if(n)for(let[r,i]of e){if(e.size<=t)break;n(i)&&e.delete(r)}for(let n of e.keys()){if(e.size<=t)break;e.delete(n)}}}var ie=n()(e=>({coordinatorStatus:`idle`,subagents:new Map,events:[],consensusVotes:new Map,tasks:new Map,taskCounts:{pending:0,running:0,completed:0,failed:0},budgetAlerts:[],lastUpdated:Date.now(),setCoordinatorStatus:(t,n)=>e(e=>({coordinatorStatus:t,coordinatorMode:n,lastUpdated:Date.now()})),updateCoordinatorStats:t=>e(e=>{let n=new Map(e.subagents);for(let e of t.subagentStatuses??[]){let t=n.get(e.id);n.set(e.id,{id:e.id,name:e.name,role:t?.role??`agent`,status:e.status,currentTask:e.currentTask,budgetLimits:t?.budgetLimits,budgetUsage:t?.budgetUsage,lastSeen:t?.lastSeen??Date.now()})}return g(n,h,e=>e.status===`stopped`),{subagents:n,taskCounts:{pending:t.pending,running:t.inFlight,completed:t.completed,failed:0},lastUpdated:Date.now()}}),updateSubagentBudget:(t,n)=>e(e=>{let r=new Map(e.subagents),i=r.get(t);return r.set(t,{id:t,name:i?.name??t,role:i?.role??`agent`,status:i?.status??`idle`,...i,...n,lastSeen:Date.now()}),g(r,h,e=>e.status===`stopped`),{subagents:r,lastUpdated:Date.now()}}),pushEvent:(t,n,r,i,a)=>e(e=>{let o=n.kind??t,s=(t.includes(`budget`)||t.includes(`threshold`))&&typeof n.limit==`number`&&n.limit>0?Math.round(n.used/n.limit*100):void 0,c=s===void 0?t.includes(`consensus.vote_resolved`)?`info`:t.includes(`consensus.vote_initiated`)?`warning`:`info`:s>=100?`danger`:s>=85?`warning`:`info`;return{events:[{id:`${r}-${t}`,ts:r,type:t,subagentId:i,taskId:a,payload:n,kind:o,level:c,message:ee(t,n)},...e.events].slice(0,te),lastUpdated:Date.now()}}),pushConsensusVote:(t,n,r)=>e(e=>{let i=new Map(e.consensusVotes);return i.set(t,{changeId:t,title:n,status:`pending`,eligible:r,votes:[],approveCount:0,rejectCount:0,abstainCount:0,expiresAt:Date.now()+3e5}),g(i,re,e=>e.status!==`pending`),{consensusVotes:i,lastUpdated:Date.now()}}),recordConsensusVote:(t,n,r,i)=>e(e=>{let a=new Map(e.consensusVotes),o=a.get(t);if(!o)return{};let s={...o,votes:[...o.votes.filter(e=>e.agentId!==n),{agentId:n,agentName:r,value:i,votedAt:Date.now()}],approveCount:i===`approve`?o.approveCount+1:o.approveCount,rejectCount:i===`reject`?o.rejectCount+1:o.rejectCount,abstainCount:i===`abstain`?o.abstainCount+1:o.abstainCount};return a.set(t,s),{consensusVotes:a,lastUpdated:Date.now()}}),resolveConsensusVote:(t,n,r,i)=>e(e=>{let a=new Map(e.consensusVotes),o=a.get(t);return o?(a.set(t,{...o,status:n,approveCount:r,rejectCount:i,resolvedAt:Date.now()}),{consensusVotes:a,lastUpdated:Date.now()}):{}}),pushTaskPending:(t,n,r)=>e(e=>{let i=new Map(e.tasks);return i.set(t,{id:t,description:n,status:`pending`,priority:r,queuedAt:Date.now()}),g(i,m,e=>e.status===`completed`||e.status===`failed`),{tasks:i,taskCounts:{...e.taskCounts,pending:e.taskCounts.pending+1},lastUpdated:Date.now()}}),startTask:(t,n)=>e(e=>{let r=new Map(e.tasks),i=r.get(t);return i?r.set(t,{...i,status:`running`,subagentId:n,startedAt:Date.now()}):r.set(t,{id:t,description:``,status:`running`,subagentId:n,startedAt:Date.now()}),{tasks:r,taskCounts:{...e.taskCounts,pending:Math.max(0,e.taskCounts.pending-1),running:e.taskCounts.running+1},lastUpdated:Date.now()}}),completeTask:(t,n,r)=>e(e=>{let i=new Map(e.tasks),a=i.get(t);return a&&i.set(t,{...a,status:n,completedAt:Date.now(),durationMs:r}),g(i,m,e=>e.status===`completed`||e.status===`failed`),{tasks:i,taskCounts:{...e.taskCounts,running:Math.max(0,e.taskCounts.running-1),completed:n===`completed`?e.taskCounts.completed+1:e.taskCounts.completed,failed:n===`failed`?e.taskCounts.failed+1:e.taskCounts.failed},lastUpdated:Date.now()}}),failTask:(t,n)=>e(e=>{let r=new Map(e.tasks),i=r.get(t);return i&&r.set(t,{...i,status:`failed`,error:n,completedAt:Date.now()}),g(r,m,e=>e.status===`completed`||e.status===`failed`),{tasks:r,taskCounts:{...e.taskCounts,running:Math.max(0,e.taskCounts.running-1),failed:e.taskCounts.failed+1},lastUpdated:Date.now()}}),recordBudgetDecision:(t,n,r,i)=>e(e=>{let a=new Map;for(let t of e.budgetAlerts){let e=`${t.subagentId}:${t.kind}`;a.has(e)||a.set(e,t)}let o=`${t}:${n}`,s=a.get(o);return s&&a.set(o,{...s,decision:r,newLimit:i,level:r===`extend`?`warning`:`danger`}),{budgetAlerts:Array.from(a.values()),lastUpdated:Date.now()}}),recordBudgetAlert:(t,n,r,i)=>e(e=>{let a=`${Date.now()}-${t}-${n}`,o=i>0?Math.round(r/i*100):0;return{budgetAlerts:[{id:a,ts:Date.now(),subagentId:t,kind:n,level:p(n,o),used:r,limit:i,pct:o},...e.budgetAlerts].slice(0,ne),lastUpdated:Date.now()}}),recordBudgetExtended:(t,n,r)=>e(e=>{let i=new Map(e.subagents),a=i.get(t);if(a?.budgetLimits){let e={...a.budgetLimits};n===`timeout`&&r&&(e.timeoutMs=r),n===`iterations`&&(e.maxIterations=r),n===`tool_calls`&&(e.maxToolCalls=r),i.set(t,{...a,budgetLimits:e,lastSeen:Date.now()})}return{subagents:i,lastUpdated:Date.now()}}),clear:()=>e({coordinatorStatus:`idle`,coordinatorMode:void 0,subagents:new Map,events:[],consensusVotes:new Map,tasks:new Map,taskCounts:{pending:0,running:0,completed:0,failed:0},budgetAlerts:[],lastUpdated:Date.now()})})),ae=n()(e=>({snapshot:null,lastFiredAt:{},revision:0,setSnapshot:t=>e(e=>({snapshot:t,revision:e.revision+1})),recordFired:(t,n)=>e(e=>({lastFiredAt:{...e.lastFiredAt,[t]:n},revision:e.revision+1})),clear:()=>e({snapshot:null,lastFiredAt:{},revision:0})}));function oe(){return`ref_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}function _(e){switch(e.split(`.`).pop()?.toLowerCase()??``){case`ts`:case`tsx`:return`typescript`;case`js`:case`jsx`:return`javascript`;case`json`:return`json`;case`md`:case`mdx`:return`markdown`;case`css`:return`css`;case`scss`:return`scss`;case`html`:case`htm`:return`html`;case`py`:return`python`;case`rs`:return`rust`;case`go`:return`go`;case`rb`:return`ruby`;case`java`:return`java`;case`c`:return`c`;case`cpp`:case`hpp`:return`cpp`;case`h`:return`c`;case`sh`:case`bash`:return`bash`;case`sql`:return`sql`;case`yaml`:case`yml`:return`yaml`;case`toml`:return`toml`;default:return``}}function v(e,t=20,n=2e3){let r=e.split(`
2
2
  `),i=!1,a=e;return r.length>t&&(a=r.slice(0,t).join(`
3
3
  `),i=!0),a.length>n&&(a=a.slice(0,n),i=!0),i&&(a=a.replace(/\s+$/,``)+`
4
4
  …`),{text:a,truncated:i}}function y(e){return e.length===0?``:[`[File reference contract]`,`Before answering or modifying anything related to these references, use the available file-reading tools to read each complete project file:`,...e.map(e=>`- ${JSON.stringify(e)}`),`If a read is paginated or chunked, continue on the same path until EOF. Do not treat an inline preview as the complete file.`].join(`
@@ -1,18 +1,18 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,n,o as r,r as i,t as a}from"./chat-store-c0pGYczr.js";import{Ga as o,Ua as s,za as c}from"./vendor-C_zEzV4N.js";import{t as l}from"./i18n-CDoHRskt.js";import{a as u,c as d,i as f,l as p,o as m,s as h,t as g}from"./ws-client-C2ppA8xa.js";import{t as _}from"./session-store-BgiP4PnQ.js";import{i as v,n as y}from"./codemap-activity-store-BH7Mh4k9.js";import{F as b,I as x,P as ee,T as S,_ as C,a as te,b as ne,c as re,f as ie,g as ae,h as oe,i as w,j as T,l as se,o as ce,p as le,r as E,s as D,t as O,u as k,v as ue,y as de}from"./stores-B0SETQK4.js";import{r as A}from"./mailbox-store-bF96Ih2G.js";import{n as j,t as fe}from"./ui-store-xx1NssJI.js";import{n as pe,o as me}from"./view-navigation-CZKugncK.js";import{t as he}from"./codemap-index-store-BFm1TzVW.js";import{n as M}from"./Toaster-wXvKXbbS.js";var N=e(o(),1);function ge(e,t){if(t)return!0;try{return new URLSearchParams(e).get(`shell`)===`desktop`}catch{return!1}}function P(){return typeof window>`u`?!1:ge(window.location.search,!!window.wrongstackDesktopHost)}function F(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function I(e,t=``){return typeof e==`string`?e:t}function L(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function _e(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`provider.thinking_delta`:{let e=I(t.text);return e?{kind:`thinking-delta`,text:e}:null}case`provider.text_delta`:{let e=I(t.text);return e?{kind:`text-delta`,text:e,messageId:I(t.messageId)}:null}case`provider.response`:return{kind:`response`,content:t.content,stopReason:I(t.stopReason)};case`run.result`:return{kind:`run-result`,status:I(t.status),iterations:L(t.iterations,1),...typeof t.finalText==`string`?{finalText:t.finalText}:{}};case`error`:return{kind:`error`,message:I(t.message,`Run failed`)};default:return null}}function R(e){let t=F(e.payload);if(!t)return null;if(e.type===`tool.started`){let e=I(t.name,`tool`);return{kind:`started`,id:I(t.id,e),name:e,input:t.input,messageId:I(t.messageId)}}if(e.type===`tool.progress`){let e=F(t.event);return{kind:`progress`,id:I(t.id),name:I(t.name,`tool`),eventType:I(e?.type),text:I(e?.text).trim()}}return e.type===`tool.executed`?{kind:`executed`,id:I(t.id),name:I(t.name),ok:t.ok!==!1,durationMs:L(t.durationMs),...typeof t.output==`string`?{output:t.output}:{},...Array.isArray(t.sage)?{sage:t.sage.filter(e=>typeof e==`string`)}:{}}:null}function z(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return e}function ve(e){return typeof e==`string`&&e.length>0?e:void 0}function ye(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`fleet.concurrency_update`:return{kind:`concurrency`,active:L(t.fleetConcurrency),maximum:L(t.fleetConcurrencyMax),maxSpawns:z(t.maxSpawns),usedSpawns:z(t.usedSpawns),remainingSpawns:z(t.remainingSpawns),maxSpawnsSource:ve(t.maxSpawnsSource),maxConcurrentSource:ve(t.maxConcurrentSource),effectiveSource:ve(t.effectiveSource),checkpointMaxSpawns:z(t.checkpointMaxSpawns),ceilingMismatch:t.ceilingMismatch===!0||void 0};case`client.status_update`:return{kind:`client-status`,status:t};case`sessions.status_update`:return{kind:`sessions`,sessions:Array.isArray(t.sessions)?t.sessions:[]};case`coordinator.stats`:return{kind:`coordinator`,agents:Array.isArray(t.subagentStatuses)?t.subagentStatuses.filter(e=>F(e)!==null):[]};default:return null}}new Set([...new Set([`mode_changed`,`compaction`,`checkpoint`,`skill_activated`,`skill_deactivated`,`agent_spawned`,`agent_stopped`,`agent_error`,`error`,`provider_retry`,`provider_error`,`message_truncated`])].filter(e=>e!==`checkpoint`));var be=[`[MAILBOX]`,`[MAILBOX BTW]`,`[BY THE WAY —`,`[QUEUED MESSAGES —`,`[FLEET PULSE]`,`[loop-detector]`,`[SESSION RESUME FILE VALIDATION]`,`[SESSION RESUME INTERRUPTED WORK]`];function xe(e){let t=e.trimStart();for(let e of be)if(t.startsWith(e))return!0;return!1}function Se(e){return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,n,o as r,r as i,t as a}from"./chat-store-c0pGYczr.js";import{Ga as o,Ua as s,za as c}from"./vendor-C_zEzV4N.js";import{t as l}from"./i18n-CcHSmDoO.js";import{a as u,c as d,i as f,l as p,o as m,s as h,t as g}from"./ws-client-BVq0hf0a.js";import{t as _}from"./session-store-BgiP4PnQ.js";import{i as v,n as y}from"./codemap-activity-store-BH7Mh4k9.js";import{F as b,I as x,P as ee,T as S,_ as C,a as te,b as ne,c as re,f as ie,g as ae,h as oe,i as w,j as T,l as se,o as ce,p as le,r as E,s as D,t as O,u as k,v as ue,y as de}from"./stores-kaIFQfXo.js";import{r as A}from"./mailbox-store-bF96Ih2G.js";import{n as j,t as fe}from"./ui-store-xx1NssJI.js";import{n as pe,o as me}from"./view-navigation-CZKugncK.js";import{t as he}from"./codemap-index-store-BFm1TzVW.js";import{n as M}from"./Toaster-CQLQAp7y.js";var N=e(o(),1);function ge(e,t){if(t)return!0;try{return new URLSearchParams(e).get(`shell`)===`desktop`}catch{return!1}}function P(){return typeof window>`u`?!1:ge(window.location.search,!!window.wrongstackDesktopHost)}function F(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function I(e,t=``){return typeof e==`string`?e:t}function L(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function _e(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`provider.thinking_delta`:{let e=I(t.text);return e?{kind:`thinking-delta`,text:e}:null}case`provider.text_delta`:{let e=I(t.text);return e?{kind:`text-delta`,text:e,messageId:I(t.messageId)}:null}case`provider.response`:return{kind:`response`,content:t.content,stopReason:I(t.stopReason)};case`run.result`:return{kind:`run-result`,status:I(t.status),iterations:L(t.iterations,1),...typeof t.finalText==`string`?{finalText:t.finalText}:{}};case`error`:return{kind:`error`,message:I(t.message,`Run failed`)};default:return null}}function R(e){let t=F(e.payload);if(!t)return null;if(e.type===`tool.started`){let e=I(t.name,`tool`);return{kind:`started`,id:I(t.id,e),name:e,input:t.input,messageId:I(t.messageId)}}if(e.type===`tool.progress`){let e=F(t.event);return{kind:`progress`,id:I(t.id),name:I(t.name,`tool`),eventType:I(e?.type),text:I(e?.text).trim()}}return e.type===`tool.executed`?{kind:`executed`,id:I(t.id),name:I(t.name),ok:t.ok!==!1,durationMs:L(t.durationMs),...typeof t.output==`string`?{output:t.output}:{},...Array.isArray(t.sage)?{sage:t.sage.filter(e=>typeof e==`string`)}:{}}:null}function z(e){if(!(typeof e!=`number`||!Number.isFinite(e)))return e}function B(e){return typeof e==`string`&&e.length>0?e:void 0}function ve(e){let t=F(e.payload);if(!t)return null;switch(e.type){case`fleet.concurrency_update`:return{kind:`concurrency`,active:L(t.fleetConcurrency),maximum:L(t.fleetConcurrencyMax),maxSpawns:z(t.maxSpawns),usedSpawns:z(t.usedSpawns),remainingSpawns:z(t.remainingSpawns),maxSpawnsSource:B(t.maxSpawnsSource),maxConcurrentSource:B(t.maxConcurrentSource),effectiveSource:B(t.effectiveSource),checkpointMaxSpawns:z(t.checkpointMaxSpawns),ceilingMismatch:t.ceilingMismatch===!0||void 0};case`client.status_update`:return{kind:`client-status`,status:t};case`sessions.status_update`:return{kind:`sessions`,sessions:Array.isArray(t.sessions)?t.sessions:[]};case`coordinator.stats`:return{kind:`coordinator`,agents:Array.isArray(t.subagentStatuses)?t.subagentStatuses.filter(e=>F(e)!==null):[]};default:return null}}new Set([...new Set([`mode_changed`,`compaction`,`checkpoint`,`skill_activated`,`skill_deactivated`,`agent_spawned`,`agent_stopped`,`agent_error`,`error`,`provider_retry`,`provider_error`,`message_truncated`])].filter(e=>e!==`checkpoint`));var ye=[`[MAILBOX]`,`[MAILBOX BTW]`,`[BY THE WAY —`,`[QUEUED MESSAGES —`,`[FLEET PULSE]`,`[loop-detector]`,`[SESSION RESUME FILE VALIDATION]`,`[SESSION RESUME INTERRUPTED WORK]`];function be(e){let t=e.trimStart();for(let e of ye)if(t.startsWith(e))return!0;return!1}function xe(e){return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
2
  <rect width="64" height="64" fill="#121210" />
3
3
  <path fill="#FD9F02" d="M5 27h10v10H5zM27 27h10v10H27zM38 27h10v10H38zM49 27h10v10H49z" />
4
4
  <path fill="#FE2E5F" d="M16 32h10v10H16z" />
5
5
  ${e===`ready`?`<circle cx="50" cy="14" r="14" fill="#22c55e" stroke="#fff" stroke-width="3" />`:e===`error`?`<circle cx="50" cy="14" r="14" fill="#ef4444" stroke="#fff" stroke-width="3" />`:e===`running`?`<circle cx="50" cy="14" r="14" fill="#f59e0b" stroke="#fff" stroke-width="3" />`:e===`attention`?`<circle cx="50" cy="14" r="14" fill="#eab308" stroke="#fff" stroke-width="3"><animate attributeName="opacity" values="1;0.3;1" dur="1s" repeatCount="indefinite"/></circle>`:``}
6
- </svg>`}function Ce(e){return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`}function we(){if(typeof document>`u`)return null;let e=document.querySelector(`link[rel="icon"]`);return e||(e=document.createElement(`link`),e.rel=`icon`,e.type=`image/svg+xml`,document.head.appendChild(e)),e}var B=`idle`;function V(e){B=e;let t=we();t&&(t.href=Ce(Se(e)))}var Te=!1;function Ee(){Te||typeof document>`u`||(Te=!0,document.addEventListener(`visibilitychange`,()=>{!document.hidden&&(B===`ready`||B===`error`||B===`attention`)&&V(`idle`)}))}var De=2048,Oe=2097152,ke=new Set([`image/png`,`image/jpeg`,`image/webp`,`image/gif`]),H=class extends Error{reason;constructor(e,t){super(e),this.reason=t,this.name=`ImageAttachmentError`}};function Ae(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function je(e){let t=e.indexOf(`,`),n=t>=0?e.length-t-1:e.length;return Math.floor(n*3/4)}function Me(e){return/^data:([^;,]+)/.exec(e)?.[1]??`image/png`}async function Ne(e){try{return await createImageBitmap(e)}catch{let t=URL.createObjectURL(e);try{return await new Promise((e,n)=>{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(Error(`image decode failed`)),r.src=t})}finally{URL.revokeObjectURL(t)}}}function Pe(e,t,n,r,i){let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw new H(`canvas 2d context unavailable`,`decode_failed`);o.drawImage(e,0,0,t,n);let s=a.toDataURL(`image/webp`,i);return s.startsWith(`data:image/webp`)?s:r?a.toDataURL(`image/png`):a.toDataURL(`image/jpeg`,i)}var Fe=0;function Ie(){return Fe+=1,`img_${Date.now()}_${Fe}`}async function Le(e){let t=ke.has(e.type),n;try{n=await Ne(e)}catch{throw new H(`Could not decode image "${e.name}"`,`decode_failed`)}let r=n.width,i=n.height,a=Math.max(r,i);if(!(!t||a>De||e.size>Oe)){let t=await Ae(e);return{id:Ie(),dataUrl:t,mediaType:e.type,bytes:je(t),name:e.name||void 0,width:r,height:i}}let o=e.type!==`image/jpeg`,s=Math.min(1,De/a),c=.85,l=Pe(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c);je(l)>4194304&&(s=Math.min(s,1280/a),c=.7,l=Pe(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c)),`close`in n&&n.close();let u=je(l);if(u>4194304)throw new H(`Image "${e.name}" is too large after compression`,`too_large`);return{id:Ie(),dataUrl:l,mediaType:Me(l),bytes:u,name:e.name||void 0,width:Math.max(1,Math.round(r*s)),height:Math.max(1,Math.round(i*s))}}function Re(e){return e.map(e=>{let t=e.dataUrl.indexOf(`,`);return{data:t>=0?e.dataUrl.slice(t+1):e.dataUrl,mediaType:e.mediaType,...e.name?{name:e.name}:{}}})}var U=null;function ze(){if(typeof window>`u`)return null;if(U)return U;let e=window.AudioContext||window.webkitAudioContext;if(!e)return null;try{U=new e}catch{return null}return U}function W(e,t,n){let r=ze();if(!r)return;let i=r.currentTime+t,a=r.createOscillator(),o=r.createGain();a.type=`sine`,a.frequency.value=e,o.gain.setValueAtTime(0,i),o.gain.linearRampToValueAtTime(.18,i+.01),o.gain.exponentialRampToValueAtTime(1e-4,i+n),a.connect(o).connect(r.destination),a.start(i),a.stop(i+n+.02)}function Be(){W(659.25,0,.18),W(880,.12,.24)}function Ve(){W(523.25,0,.15),W(659.25,.1,.15),W(783.99,.2,.25)}var G=`default`;G=typeof window<`u`&&`Notification`in window?Notification.permission:`unsupported`;async function He(){if(G===`unsupported`||G===`granted`||G===`denied`)return G;try{let e=await Notification.requestPermission();return G=e,e}catch{return`denied`}}function Ue(e,t,n){if(!(typeof document>`u`||!document.hidden)&&G===`granted`)try{let r=new Notification(e,{body:t,icon:`/wrongstack.svg`,tag:n??`wrongstack-run`,requireInteraction:n===`wrongstack-confirm`});r.onclick=()=>{window.focus(),r.close()}}catch{}}var We={"iteration.started":Ge,"provider.text_delta":Ke,"provider.thinking_delta":qe,"tool.started":Je,"tool.progress":Ye,"tool.executed":Xe,"tool.confirm_needed":Ze,"run.result":Qe},K=new Map,q=[];function Ge(e){if(!f(e))return;u(e),e.payload.index===1&&(K.clear(),q=[]);let t=e.payload;_.getState().setIteration({index:t.index,max:t.maxIterations??0}),a.getState().setLoading(!0),typeof document<`u`&&document.hidden&&V(`running`),a.getState().runStart===null&&a.getState().setRunStart({at:Date.now(),cost:_.getState().cost}),a.getState().setCurrentAssistantMessage(null)}function Ke(e){if(!f(e))return;let t=_e(e);if(t?.kind!==`text-delta`)return;p.flush(`__thinking__`),a.getState().clearThinking();let n=a.getState().currentAssistantMessageId;n||(n=a.getState().addMessage({role:`assistant`,content:``,streaming:!0}),a.getState().setCurrentAssistantMessage(n)),p.push(n,t.text,(e,t)=>a.getState().appendToMessage(e,t))}function qe(e){if(!f(e))return;let t=_e(e);t?.kind===`thinking-delta`&&p.push(`__thinking__`,t.text,(e,t)=>a.getState().appendThinking(t))}function Je(e){if(!f(e))return;u(e);let n=R(e);if(n?.kind!==`started`)return;n.name===`nextsteps`&&n.id&&K.set(n.id,t(n.input));let r=a.getState().getToolMessageId(n.id);if(r){a.getState().setCurrentToolId(r);return}p.flushAll(),a.getState().clearThinking();let i=a.getState().currentAssistantMessageId;i&&a.getState().finalizeMessage(i,{final:!1}),a.getState().setCurrentAssistantMessage(null);let o=a.getState().addMessage({role:`tool`,content:``,toolName:n.name,toolInput:n.input,toolUseId:n.id});a.getState().setCurrentToolId(o),a.getState().addExecution({id:n.id,name:n.name,input:n.input,ok:!0,startedAt:Date.now()})}function Ye(e){if(!f(e))return;let t=R(e);if(t?.kind!==`progress`)return;let n=t.text;if(!n)return;let r=a.getState().getToolMessageId(t.id);if(!r)return;let i=t.eventType===`warning`?`⚠ `:``;p.push(r,`${i}${n}\n`,(e,n)=>a.getState().appendToolProgressLinesByUseId(t.id,n.split(`
7
- `).filter(e=>e.length>0)))}function Xe(e){if(!f(e))return;u(e);let t=R(e);if(t?.kind!==`executed`)return;if(t.name===`nextsteps`&&t.id){let e=K.get(t.id)??[];K.delete(t.id),t.ok&&e.length>0&&(q=e)}let{currentToolId:n}=a.getState(),r=t.id?a.getState().getToolMessageId(t.id):n;r&&(p.drop(r),t.id?a.getState().setToolResultByUseId(t.id,t.output??``,t.ok):a.getState().setToolResult(r,t.output??``,t.ok),a.getState().updateMessage(r,{toolDurationMs:t.durationMs,...t.sage&&t.sage.length>0?{sageLines:t.sage}:{}})),t.id&&a.getState().updateExecution(t.id,{completedAt:Date.now(),durationMs:t.durationMs,output:t.output,ok:t.ok}),n&&r===n&&a.getState().setCurrentToolId(null)}function Ze(e){if(!f(e))return;let t=e.payload;if(l.getState().yolo===!0&&!t.boundaryReason){g(x.getState().wsUrl).sendConfirm(t.id,`yes`),j.getState().hideConfirm();return}j.getState().showConfirm({id:t.id,toolName:t.toolName,input:t.input,suggestedPattern:t.suggestedPattern,decisionSource:t.decisionSource,riskTier:t.riskTier,boundaryReason:t.boundaryReason});try{Ve()}catch{}He(),Ue(`${_.getState().projectName||`Agent`} needs approval`,`Tool "${t.toolName}" is waiting for your decision.`,`agent-confirm`),typeof document<`u`&&document.hidden&&V(`attention`)}function Qe(e){if(!f(e))return;let t=m(e,{status:`string`},{requestId:`string`,iterations:`number`,finalText:`string`,error:`object`});if(!t)return;let n=t.iterations??1;p.flushAll(),a.getState().flushThinkingLog(Math.max(1,n)),_.getState().setIteration(null),a.getState().setLoading(!1);let o=a.getState().currentAssistantMessageId,s=t.status===`done`?t.finalText?.trim():void 0;if(o){let e=a.getState().messages.find(e=>e.id===o);a.getState().updateMessage(o,{content:e?.content?.trim()?e.content:s??e?.content??``}),a.getState().finalizeMessage(o,{final:!0})}else if(s){let e=a.getState().runStart,t=i(s).stripped.trim(),n=a.getState().messages,r;for(let t=n.length-1;t>=0;t--){let i=n[t];if(i?.role===`assistant`&&(!e||i.timestamp>=e.at)){r=i;break}}let o=r?.content.trim();if(o===void 0||o!==s&&o!==t){let e=a.getState().addMessage({role:`assistant`,content:s});a.getState().finalizeMessage(e,{final:!0})}}t.status===`done`&&q.length>0&&(a.getState().messages.some(e=>e.role===`assistant`&&(e.nextSteps?.steps.length??0)>0)||a.getState().addMessage({role:`assistant`,content:``,nextSteps:{steps:q}}),q=[]),a.getState().setCurrentAssistantMessage(null),a.getState().clearThinking();let c=a.getState().runStart;if(c&&t.status===`done`){let e=a.getState().messages,t=-1,i=0;for(let n=e.length-1;n>=0;n--){let a=r(e[n]);if(a.role===`assistant`&&t===-1&&a.content&&(t=n),a.role===`tool`&&a.timestamp>=c.at&&(i+=1),a.role===`user`&&a.timestamp<=c.at)break}if(t!==-1){let r=_.getState().cost;a.getState().updateMessage(e[t]?.id,{runSummary:{iterations:n,tools:i,durationMs:Date.now()-c.at,costDelta:Math.max(0,r-c.cost)}})}}if(a.getState().setRunStart(null),t.status!==`done`&&t.error)t.requestId&&a.getState().updateMessage(t.requestId,{status:`failed`}),a.getState().addMessage({role:`assistant`,content:`Error: ${t.error.message}`,isError:!0}),M.error(`Run ended: ${t.error.message}`),Ue(`${_.getState().projectName||`Agent`} run failed`,t.error.message),typeof document<`u`&&document.hidden&&V(`error`);else if(t.status===`done`){if(typeof document<`u`&&document.hidden&&(M.success(`Run completed in ${n} iteration${n===1?``:`s`}`),Ue(`${_.getState().projectName||`Agent`} run finished`,`Completed in ${n} iteration${n===1?``:`s`}.`),V(`ready`)),He(),x.getState().soundOnComplete)try{Be()}catch{}typeof document<`u`&&document.dispatchEvent(new CustomEvent(`chat:next-step-countdown`))}let l=a.getState(),u=l.queue[0];if(!u)return;if(u.alreadyDispatched===!0){$e(u);let e=l.dequeueDrainable();return e?et(e):void 0}let d=l.dequeue();if(d)return et(d)}function $e(e){if(e.bubbleAdded===!0)return;let t=e.images??[];a.getState().addMessage({role:`user`,content:e.text,...t.length>0?{attachments:t.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.bubbleAdded=!0}function et(e){let t=g(x.getState().wsUrl),n=e.images??[];if(a.getState().addMessage({role:`user`,content:e.text,...n.length>0?{attachments:n.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.mode===`btw`){e.alreadyDispatched!==!0&&t.sendMailboxMessage({type:`btw`,to:`leader`,subject:`btw from WebUI`,body:e.text,priority:`normal`,audience:`all`});return}a.getState().setLoading(!0),t.sendMessage(e.text,n.length>0?Re(n):void 0)}var tt={"coordinator.status":e=>{let t=e.payload;b.getState().setCoordinatorStatus(t.status,t.mode),t.taskQueue&&b.getState().updateCoordinatorStats({total:t.subagentCount??0,running:0,idle:0,stopped:0,inFlight:t.taskQueue.running,pending:t.taskQueue.pending,completed:t.taskQueue.completed})},"coordinator.stats":e=>{let t=e.payload;b.getState().updateCoordinatorStats(t)},"budget.threshold_reached":e=>{let t=e.payload;b.getState().pushEvent(`budget.threshold_reached`,t,t.ts??Date.now(),t.subagentId,t.taskId),t.limit>0&&t.used/t.limit*100>=85&&b.getState().recordBudgetAlert(t.subagentId,t.kind,t.used,t.limit),b.getState().updateSubagentBudget(t.subagentId,{budgetUsage:{iterations:0,toolCalls:0,tokens:0,costUsd:0,elapsedMs:t.used??0}})},"budget.decision":e=>{let t=e.payload,n=t.extended?.timeoutMs??t.extended?.maxIterations??t.extended?.maxToolCalls;b.getState().recordBudgetDecision(t.subagentId,t.kind,t.decision,n),b.getState().pushEvent(`budget.decision`,{subagentId:t.subagentId,kind:t.kind,decision:t.decision,newLimit:n},Date.now(),t.subagentId)},"subagent.budget_extended":e=>{let t=e.payload;b.getState().recordBudgetExtended(t.subagentId,t.kind,t.extendedTo),b.getState().pushEvent(`subagent.budget_extended`,t,Date.now(),t.subagentId)},"consensus.vote_initiated":e=>{let t=e.payload;b.getState().pushConsensusVote(t.changeId,t.title,t.eligible),b.getState().pushEvent(`consensus.vote_initiated`,t,Date.now()),M.info(`Vote started: `+t.title)},"consensus.vote_cast":e=>{let t=e.payload,n=b.getState().consensusVotes.get(t.changeId)?.eligible.find(e=>e.agentId===t.voterId);b.getState().recordConsensusVote(t.changeId,t.voterId,n?.agentName??t.voterId,t.value),b.getState().pushEvent(`consensus.vote_cast`,t,Date.now(),t.voterId)},"consensus.vote_resolved":e=>{let t=e.payload;b.getState().resolveConsensusVote(t.changeId,t.result,t.approveCount,t.rejectCount),b.getState().pushEvent(`consensus.vote_resolved`,t,Date.now()),M.info(`Vote resolved: `+t.result+` (y`+t.approveCount+` n`+t.rejectCount+`)`)},"task.pending":e=>{let t=e.payload;b.getState().pushTaskPending(t.taskId,t.description,t.priority),b.getState().pushEvent(`task.pending`,t,Date.now())},"task.started":e=>{let t=e.payload;b.getState().startTask(t.taskId,t.subagentId),b.getState().pushEvent(`task.started`,t,Date.now(),t.subagentId)},"task.completed":e=>{let t=e.payload;b.getState().completeTask(t.taskId,t.status,t.durationMs),b.getState().pushEvent(`task.completed`,t,Date.now(),t.subagentId)},"task.failed":e=>{let t=e.payload;b.getState().failTask(t.taskId,t.error),b.getState().pushEvent(`task.failed`,{taskId:t.taskId,subagentId:t.subagentId,error:String(t.error).slice(0,120)},Date.now(),t.subagentId),M.error(`Task failed: `+String(t.error).slice(0,80))}};function J(){let e=g();e?.send?.({type:`mailbox.messages`,payload:{limit:30,incompleteOnly:!0}}),e?.send?.({type:`mailbox.agents`,payload:{}})}var nt=null;function Y(){nt!==null&&clearTimeout(nt),nt=setTimeout(()=>{nt=null,J()},300)}function rt(e){let t=T.getState();if(t.openFiles.length===0){t.setProjectIdentity(e);return}if(t.projectIdentity&&t.projectIdentity!==e){t.clearOpenTabs(),t.setProjectIdentity(e);return}t.setProjectIdentity(e);let n=t.openFiles.filter(e=>e.content===``&&!e.dirty).map(e=>e.path);if(n.length===0)return;T.setState({hydratingPaths:new Set(n)});let r=g();for(let e of n)r?.send?.({type:`files.read`,payload:{filePath:e}})}function it(e){let t=e.payload;if(t.error){T.getState().setError(t.error);return}T.getState().setTree(t.root,t.tree)}function at(e){let t=e.payload,n=T.getState();if(t.error){if(n.hydratingPaths.has(t.filePath)){n.hydrateFileFailed(t.filePath);return}n.setError(t.error);return}if(n.hydratingPaths.has(t.filePath)){n.hydrateFileContent(t.filePath,t.content);return}n.openFile(t.filePath,t.content)}function ot(e){let t=e.payload;t.success?T.getState().markSaved(t.filePath):t.error&&T.getState().setError(`Save failed: ${t.error}`)}function st(e){let t=e.payload;!t.success&&t.error&&T.getState().setError(`Create failed: ${t.error}`)}function ct(e){let t=e.payload;t.success?T.getState().closeFile(t.filePath):t.error&&T.getState().setError(`Delete failed: ${t.error}`)}function lt(e){let t=e.payload;t.success?T.getState().closeFile(t.oldPath):t.error&&T.getState().setError(`Rename failed: ${t.error}`)}function ut(e){let t=e.payload;t.success?T.getState().closeFile(t.srcPath):t.error&&T.getState().setError(`Move failed: ${t.error}`)}var dt=null,ft=500;function pt(e){dt&&clearTimeout(dt),dt=setTimeout(()=>{dt=null;let e=_.getState().cwd;T.getState().setTreeLoading(!0),g().send({type:`files.tree`,payload:{path:e}})},ft)}function mt(e){let t=d(`mailbox.event`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0)),Y()}function ht(e){let t=e.payload;t?.messages&&A.getState().setMessages(t.messages)}function gt(e){let t=e.payload;t?.agents&&A.getState().setAgents(t.agents)}function _t(e){let t=d(`mailbox.received`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0)),Y()}function vt(e){Y()}function yt(e){let t=e.payload;t?.agentId&&A.getState().removeAgent(t.agentId)}function bt(e){A.getState().setMessages([]),J()}function xt(e){Y()}function St(e){let t=e.payload;t&&typeof t.totalRemoved==`number`&&A.getState().setLastCompaction({readByAllRemoved:t.readByAllRemoved??0,expiredRemoved:t.expiredRemoved??0,stalePurged:t.stalePurged??0,totalRemoved:t.totalRemoved,remaining:t.remaining??0}),Y()}function Ct(e){let t=e.payload;if(t?.success){Y();return}M.error(`Mailbox action failed: ${t?.error??`unknown error`}`)}var wt={"files.tree":it,"files.tree.changed":pt,"files.read":at,"files.written":ot,"files.created":st,"files.deleted":ct,"files.renamed":lt,"files.moved":ut,"mailbox.event":mt,"mailbox.messages":ht,"mailbox.agents":gt,"mailbox.received":_t,"mailbox.agent_registered":vt,"mailbox.agent_deregistered":yt,"mailbox.cleared":bt,"mailbox.purged":xt,"mailbox.compacted":St,"mailbox.action_result":Ct};function Tt(e){let t=e.payload;O.getState().setSnapshot(t.worktrees??[],t.baseBranch??``)}function Et(e){let t=e.payload;O.getState().pushEvent(t)}function Dt(e){let t=e.payload;O.getState().setOrphans(t.orphans??[],t.canClean??!1,t.reason)}function Ot(e){let t=e.payload;O.getState().setCleanResult({...t,at:Date.now()})}function kt(e){let t=e.payload;O.getState().setMergeResult({...t,at:Date.now()})}function At(e){let t=e.payload;O.getState().setDiff(t.dir,t.summary)}function jt(e){S.getState().applyEvent(e.payload);let t=d(`subagent.event`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0))}function Mt(e){let t=ye(e);t?.kind===`concurrency`&&S.setState({fleetConcurrency:t.active,fleetConcurrencyMax:t.maximum,...t.maxSpawns===void 0?{}:{fleetMaxSpawns:t.maxSpawns},...t.usedSpawns===void 0?{}:{fleetUsedSpawns:t.usedSpawns},...t.remainingSpawns===void 0?{}:{fleetRemainingSpawns:t.remainingSpawns},...t.effectiveSource===void 0?{}:{fleetBudgetSource:t.effectiveSource},...t.checkpointMaxSpawns===void 0?{}:{fleetCheckpointMaxSpawns:t.checkpointMaxSpawns},...t.ceilingMismatch===void 0?{}:{fleetCeilingMismatch:t.ceilingMismatch}})}function Nt(e){let t=ye(e);if(t?.kind!==`client-status`)return;let n=t.status;ie.getState().setCurrentSession({clientType:n.clientType,clientId:n.clientId,agentCount:n.agentCount,model:n.model,mode:n.mode,toolCalls:n.toolCalls,inputTokens:n.inputTokens,outputTokens:n.outputTokens,cacheTokens:n.cacheTokens,costUsd:n.costUsd,timestamp:n.timestamp})}function Pt(e){let t=ye(e);if(t?.kind!==`sessions`)return;ie.getState().setLiveSessions(t.sessions);let n=Date.now();if(n-It>=5e3&&(It=n,J()),n-Ft<1e3)return;Ft=n;let r=d(`sessions.status_update`,e.payload);r&&(h.getState().pushEvent(r),h.getState().setActive(!0))}var Ft=0,It=0,Lt={"worktree.state":Tt,"worktree.event":Et,"worktree.orphans":Dt,"worktree.cleanup_result":Ot,"worktree.merge_result":kt,"worktree.diff_result":At,"subagent.event":jt,"fleet.concurrency_update":Mt,"client.status_update":Nt,"sessions.status_update":Pt};function Rt(e,t){let n=e=>e.trim().replace(/\s+/g,` `).toLowerCase();return n(e)===n(t)}var zt=50,Bt=200;function Vt(e){return e.length<=300?e:`${e.slice(0,299)}…`}function Ht(e){return{...e,text:Vt(e.text)}}function Ut(e){let t=[];for(let n of Object.values(e))n.state===`exited`&&t.push(n);if(t.length<=Bt)return e;t.sort((e,t)=>(t.exitedAt??t.lastSeenAt).localeCompare(e.exitedAt??e.lastSeenAt));let n={...e};for(let e of t.slice(Bt))delete n[e.id];return n}var Wt=c()(e=>({traces:[],contextMemories:{},transitions:[],pushTrace:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=t.injected.map(Ht),a=t.activated.map(Ht);for(let e of i){let i=n[e.id];n[e.id]={...e,state:i?.state===`active`?`active`:`injected`,trigger:t.trigger,enteredAt:i?.enteredAt??t.at,lastSeenAt:t.at};let a=`${t.at}_injected_${e.id}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e.id,action:`injected`,reason:`${t.trigger} · score ${e.score.toFixed(2)}`})}return{traces:[{...t,activated:a,injected:i},...e.traces.filter(e=>e.runId!==t.runId)].slice(0,zt),contextMemories:Ut(n),transitions:r.slice(0,100)}}),applyContextSnapshot:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=new Set(t.activeMemoryIds);for(let e of t.activeMemoryIds){let r=n[e];n[e]=r?{...r,state:`active`,lastSeenAt:t.at,exitedAt:void 0}:Gt(e,t.at,`active`)}for(let e of t.enteredMemoryIds){let n=`${t.at}_entered_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`entered`,reason:`present in provider request`})}for(let e of t.exitedMemoryIds){let i=n[e];i&&(n[e]={...i,state:`exited`,exitedAt:t.at});let a=`${t.at}_exited_${e}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e,action:`exited`,reason:`absent from provider request`})}for(let[e,a]of Object.entries(n))if((a.state===`injected`||a.state===`active`)&&!i.has(e)&&(n[e]={...a,state:`exited`,exitedAt:t.at},!t.exitedMemoryIds.includes(e))){let n=`${t.at}_exited_before_provider_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`exited`,reason:a.state===`injected`?`removed before provider request`:`absent from provider context snapshot`})}return{contextMemories:Ut(n),transitions:r.slice(0,100)}}),resetContext:()=>e({contextMemories:{},transitions:[]}),clear:()=>e({traces:[],contextMemories:{},transitions:[]})}));function Gt(e,t,n){return{id:e,kind:`unknown`,text:`Memory details were not present in this UI process.`,score:0,relationStrength:0,anchors:[],tags:[],activationReasons:[],importance:0,confidence:0,freshness:0,persistence:`unknown`,state:n,trigger:`context snapshot`,enteredAt:t,lastSeenAt:t,isPlaceholder:!0}}var Kt=100,qt=new Set([`exited`,`superseded`,`archived`,`staled`,`contradicted`]);function Jt(e,t=new Date){let n=e.event,r=X(e.memoryId),i=X(e.at)??t.toISOString(),a={id:`${n}_${t.getTime()}_${Math.random().toString(36).slice(2,7)}`,at:i,event:n};if(n===`memory.accepted`&&r)return{...a,action:`entered`,memoryId:r,label:`${r} entered memory`,detail:Xt(e)};if(n===`memory.merged`&&r){let t=Array.isArray(e.mergedIds)?e.mergedIds.length:0;return{...a,action:`merged`,memoryId:r,label:`${r} merged`,detail:t>0?`${t} records folded in`:void 0}}if(n===`memory.recovered`&&r)return{...a,action:`recovered`,memoryId:r,label:`${r} recovered`,detail:X(e.reason)};if(n===`memory.deleted`&&r)return{...a,action:`exited`,memoryId:r,label:`${r} exited memory`,detail:Zt(e)};if(n===`memory.updated`&&r){let t=X(e.status)??`updated`;return{...a,action:t===`deleted`?`exited`:`updated`,memoryId:r,label:t===`deleted`?`${r} exited memory`:`${r} updated → ${t}`,detail:Xt(e)}}if(n===`memory.graph_edge_added`){let t=X(e.from),n=X(e.to);if(!t?.startsWith(`mem:`)||!n?.startsWith(`mem:`))return null;let r=X(e.relation)??`related_to`,i=Z(e.weight),o=Array.isArray(e.evidence)?e.evidence.filter(e=>typeof e==`string`):[];return{...a,action:`related`,memoryId:t.startsWith(`mem:`)?t.slice(4):void 0,label:`${Qt(t)} ↔ ${Qt(n)}`,detail:[r,i===void 0?void 0:`weight ${i.toFixed(2)}`,o.length>0?`why: ${o.join(`, `)}`:void 0].filter(Boolean).join(` · `)}}return n===`memory.relationships_rebuilt`?{...a,action:`related`,label:`Memory relationships rebuilt`,detail:`${Z(e.added)??0} added / ${Z(e.proposed)??0} proposed`}:n===`memory.superseded`&&r?{...a,action:`superseded`,memoryId:r,label:`${r} → superseded`,detail:X(e.reason)??Xt(e)}:n===`memory.archived`&&r?{...a,action:`archived`,memoryId:r,label:`${r} → archived`,detail:X(e.reason)}:n===`memory.staled`&&r?{...a,action:`staled`,memoryId:r,label:`${r} → staled`,detail:X(e.reason)??`anchor drift detected`}:n===`memory.contradicted`&&r?{...a,action:`contradicted`,memoryId:r,label:`${r} → contradicted`,detail:X(e.reason)??`conflicting evidence`}:null}var Yt=c()(e=>({items:[],pushEvent:t=>e(e=>{let n=Jt(t);return n?{items:[n,...qt.has(n.action)?e.items.filter(e=>!(qt.has(e.action)&&e.memoryId===n.memoryId)):e.items].slice(0,Kt)}:e}),clear:()=>e({items:[]})}));function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Xt(e){let t=[X(e.kind),X(e.persistence)],n=Z(e.confidence),r=Z(e.freshness);return n!==void 0&&t.push(`confidence ${n.toFixed(2)}`),r!==void 0&&t.push(`freshness ${r.toFixed(2)}`),t.filter(Boolean).join(` · `)||void 0}function Zt(e){let t=X(e.reason),n=Z(e.removedEdges);return[t,n===void 0?void 0:`${n} edges removed`].filter(Boolean).join(` · `)||void 0}function Qt(e){let t=e.replace(/^mem:/,``);return t.length>26?`${t.slice(0,23)}…`:t}function $t(e){if(!e||e.length===0)return;let t=e.map(e=>e.status);return t.some(e=>e===`failed`)?`failed`:t.every(e=>e===`completed`||e===`skipped`)?`completed`:t.some(e=>e===`paused`)?`paused`:`running`}function en(e){let t=e.payload,n=Array.isArray(t.phases)?t.phases:void 0,r=$t(n);C.getState().setState({phases:n,activePhaseId:typeof t.activePhaseId==`string`?t.activePhaseId:void 0,overallPercent:typeof t.overallPercent==`number`?t.overallPercent:void 0,autonomous:typeof t.autonomous==`boolean`?t.autonomous:void 0,title:typeof t.title==`string`?t.title:void 0,goal:typeof t.goal==`string`?t.goal:void 0,status:r,multiBoard:t.multiBoard===!0,lastError:r===`failed`?C.getState().lastError:null})}function tn(e){let t=e.payload,n={totalPhases:typeof t.totalPhases==`number`?t.totalPhases:0,completed:typeof t.completed==`number`?t.completed:0,failed:typeof t.failed==`number`?t.failed:0,totalTasks:typeof t.totalTasks==`number`?t.totalTasks:0,completedTasks:typeof t.completedTasks==`number`?t.completedTasks:0,failedTasks:typeof t.failedTasks==`number`?t.failedTasks:0};C.getState().setState({progress:n,overallPercent:typeof t.percentComplete==`number`?Math.round(t.percentComplete):void 0,status:n.failed>0||n.failedTasks>0?`failed`:`running`,lastEvent:`progress`})}function Q(e){let t=e.payload,n=typeof t.title==`string`&&t.title?t.title:`Goal`,r=typeof t.error==`string`&&t.error?t.error:void 0;if(e.type===`goal.paused`){C.getState().setState({status:`paused`,autonomous:!1,lastEvent:`paused`}),M.info(`Goal paused`);return}if(e.type===`goal.resumed`){C.getState().setState({status:`running`,autonomous:!0,lastEvent:`resumed`}),M.info(`Goal resumed`);return}if(e.type===`goal.stopped`){C.getState().setState({status:`stopped`,autonomous:!1,lastEvent:`stopped`}),M.warn(`Goal stopped`);return}if(e.type===`goal.cleared`){C.getState().clear();return}if(e.type===`goal.reverted`){let e=t.ok===!0,n=typeof t.reverted==`number`?t.reverted:0,r=typeof t.reason==`string`?t.reason:void 0;e?M.success(n>0?`Reverted ${n} commit${n===1?``:`s`}`:`Nothing to revert`):M.error(`Revert failed: ${r??`unknown error`}`),C.getState().setState({lastEvent:`reverted`});return}if(e.type===`goal.saved`){C.getState().setState({lastEvent:`saved`}),M.success(`Goal graph saved`);return}if(e.type===`goal.completed`){C.getState().setState({status:`completed`,autonomous:!1,overallPercent:100,lastEvent:`completed`,lastError:null}),M.success(`${n} completed`);return}if(e.type===`goal.failed`||e.type===`goal.error`){let e=r??(typeof t.message==`string`?t.message:`${n} failed`);C.getState().setState({status:`failed`,autonomous:!1,lastEvent:`failed`,lastError:e}),M.error(e)}}function nn(e){let t=e.payload;C.getState().setState({lastEvent:`list`,graphs:Array.isArray(t.graphs)?t.graphs:[]})}function rn(e){let t=e.payload;ae.getState().setGoal(t)}function an(e){let t=e.payload;l.getState().set(t),t.yolo===!0&&j.getState().confirmInfo&&j.getState().hideConfirm()}function on(e){if(!f(e))return;let t=e.payload,n;if(t.decision.type===`answer`){let e=t.decision.rationale&&t.decision.rationale!==t.decision.text?`\n\n_${t.decision.rationale}_`:``;n=`🧠 ${t.decision.text??``}${e}`}else n=t.decision.type===`deny`?`🧠 Denied: ${t.decision.reason??``}`:`🧠 The Brain escalated this question back to you — it needs human judgement.`;a.getState().addMessage({role:`assistant`,content:n})}function sn(e){if(!f(e))return;let t=e.payload,n=t.requestId??t.request?.id;if(n&&t.request?.question&&E.getState().noteQuestion(n,t.request.question),t.event===`brain.council_vote`){E.getState().recordVote(t);let e=t.requestId??`unknown`;h.getState().pushEvent({id:`council_${e}_${t.seatId??`seat-${Date.now()}`}`,kind:`brain:council_vote`,timestamp:Date.now(),source:t.model??t.persona??`seat`,target:`brain`,label:`${t.persona??`voter`} → ${t.status===`valid`?t.optionId??`stance`:t.status??`failed`}`,data:t,color:`#38bdf8`,flowGroup:`brain`});return}if(t.event===`brain.council_resolved`){E.getState().recordResolution(t);let e=t.requestId??`unknown`,n=E.getState().panels.find(t=>t.requestId===e)?.seats??[],r=n.map(e=>`- **${e.persona}**${e.veto?` (veto)`:``} → ${e.status===`valid`?e.optionId??`stance`:e.status}${e.model?` · \`${e.model}\``:``}`),i=[`⚖️ **Council ${t.resolution??`resolved`}**`,`${t.validVoteCount??n.length}/${t.configuredSeatCount??n.length} seats`,`${t.distinctTargetCount??0} distinct target${t.distinctTargetCount===1?``:`s`}`,t.judgeUsed?`judge used`:void 0,t.usage?.totalTokens?`${t.usage.totalTokens} tok`:void 0].filter(Boolean).join(` · `);a.getState().addMessage({role:`assistant`,content:[i,...r,...(t.warnings??[]).map(e=>`> ⚠ ${e}`)].filter(Boolean).join(`
6
+ </svg>`}function Se(e){return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`}function Ce(){if(typeof document>`u`)return null;let e=document.querySelector(`link[rel="icon"]`);return e||(e=document.createElement(`link`),e.rel=`icon`,e.type=`image/svg+xml`,document.head.appendChild(e)),e}var V=`idle`;function H(e){V=e;let t=Ce();t&&(t.href=Se(xe(e)))}var we=!1;function Te(){we||typeof document>`u`||(we=!0,document.addEventListener(`visibilitychange`,()=>{!document.hidden&&(V===`ready`||V===`error`||V===`attention`)&&H(`idle`)}))}var Ee=2048,De=2097152,Oe=new Set([`image/png`,`image/jpeg`,`image/webp`,`image/gif`]),U=class extends Error{reason;constructor(e,t){super(e),this.reason=t,this.name=`ImageAttachmentError`}};function ke(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function Ae(e){let t=e.indexOf(`,`),n=t>=0?e.length-t-1:e.length;return Math.floor(n*3/4)}function je(e){return/^data:([^;,]+)/.exec(e)?.[1]??`image/png`}async function Me(e){try{return await createImageBitmap(e)}catch{let t=URL.createObjectURL(e);try{return await new Promise((e,n)=>{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(Error(`image decode failed`)),r.src=t})}finally{URL.revokeObjectURL(t)}}}function Ne(e,t,n,r,i){let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw new U(`canvas 2d context unavailable`,`decode_failed`);o.drawImage(e,0,0,t,n);let s=a.toDataURL(`image/webp`,i);return s.startsWith(`data:image/webp`)?s:r?a.toDataURL(`image/png`):a.toDataURL(`image/jpeg`,i)}var Pe=0;function Fe(){return Pe+=1,`img_${Date.now()}_${Pe}`}async function Ie(e){let t=Oe.has(e.type),n;try{n=await Me(e)}catch{throw new U(`Could not decode image "${e.name}"`,`decode_failed`)}let r=n.width,i=n.height,a=Math.max(r,i);if(!(!t||a>Ee||e.size>De)){let t=await ke(e);return{id:Fe(),dataUrl:t,mediaType:e.type,bytes:Ae(t),name:e.name||void 0,width:r,height:i}}let o=e.type!==`image/jpeg`,s=Math.min(1,Ee/a),c=.85,l=Ne(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c);Ae(l)>4194304&&(s=Math.min(s,1280/a),c=.7,l=Ne(n,Math.max(1,Math.round(r*s)),Math.max(1,Math.round(i*s)),o,c)),`close`in n&&n.close();let u=Ae(l);if(u>4194304)throw new U(`Image "${e.name}" is too large after compression`,`too_large`);return{id:Fe(),dataUrl:l,mediaType:je(l),bytes:u,name:e.name||void 0,width:Math.max(1,Math.round(r*s)),height:Math.max(1,Math.round(i*s))}}function Le(e){return e.map(e=>{let t=e.dataUrl.indexOf(`,`);return{data:t>=0?e.dataUrl.slice(t+1):e.dataUrl,mediaType:e.mediaType,...e.name?{name:e.name}:{}}})}var W=null;function Re(){if(typeof window>`u`)return null;if(W)return W;let e=window.AudioContext||window.webkitAudioContext;if(!e)return null;try{W=new e}catch{return null}return W}function G(e,t,n){let r=Re();if(!r)return;let i=r.currentTime+t,a=r.createOscillator(),o=r.createGain();a.type=`sine`,a.frequency.value=e,o.gain.setValueAtTime(0,i),o.gain.linearRampToValueAtTime(.18,i+.01),o.gain.exponentialRampToValueAtTime(1e-4,i+n),a.connect(o).connect(r.destination),a.start(i),a.stop(i+n+.02)}function ze(){G(659.25,0,.18),G(880,.12,.24)}function Be(){G(523.25,0,.15),G(659.25,.1,.15),G(783.99,.2,.25)}var K=`default`;K=typeof window<`u`&&`Notification`in window?Notification.permission:`unsupported`;async function Ve(){if(K===`unsupported`||K===`granted`||K===`denied`)return K;try{let e=await Notification.requestPermission();return K=e,e}catch{return`denied`}}function He(e,t,n){if(!(typeof document>`u`||!document.hidden)&&K===`granted`)try{let r=new Notification(e,{body:t,icon:`/wrongstack.svg`,tag:n??`wrongstack-run`,requireInteraction:n===`wrongstack-confirm`});r.onclick=()=>{window.focus(),r.close()}}catch{}}var Ue={"iteration.started":We,"provider.text_delta":Ge,"provider.thinking_delta":Ke,"tool.started":qe,"tool.progress":Je,"tool.executed":Ye,"tool.confirm_needed":Xe,"run.result":Ze},q=new Map,J=[];function We(e){if(!f(e))return;u(e),e.payload.index===1&&(q.clear(),J=[]);let t=e.payload;_.getState().setIteration({index:t.index,max:t.maxIterations??0}),a.getState().setLoading(!0),typeof document<`u`&&document.hidden&&H(`running`),a.getState().runStart===null&&a.getState().setRunStart({at:Date.now(),cost:_.getState().cost}),a.getState().setCurrentAssistantMessage(null)}function Ge(e){if(!f(e))return;let t=_e(e);if(t?.kind!==`text-delta`)return;p.flush(`__thinking__`),a.getState().clearThinking();let n=a.getState().currentAssistantMessageId;n||(n=a.getState().addMessage({role:`assistant`,content:``,streaming:!0}),a.getState().setCurrentAssistantMessage(n)),p.push(n,t.text,(e,t)=>a.getState().appendToMessage(e,t))}function Ke(e){if(!f(e))return;let t=_e(e);t?.kind===`thinking-delta`&&p.push(`__thinking__`,t.text,(e,t)=>a.getState().appendThinking(t))}function qe(e){if(!f(e))return;u(e);let n=R(e);if(n?.kind!==`started`)return;n.name===`nextsteps`&&n.id&&q.set(n.id,t(n.input));let r=a.getState().getToolMessageId(n.id);if(r){a.getState().setCurrentToolId(r);return}p.flushAll(),a.getState().clearThinking();let i=a.getState().currentAssistantMessageId;i&&a.getState().finalizeMessage(i,{final:!1}),a.getState().setCurrentAssistantMessage(null);let o=a.getState().addMessage({role:`tool`,content:``,toolName:n.name,toolInput:n.input,toolUseId:n.id});a.getState().setCurrentToolId(o),a.getState().addExecution({id:n.id,name:n.name,input:n.input,ok:!0,startedAt:Date.now()})}function Je(e){if(!f(e))return;let t=R(e);if(t?.kind!==`progress`)return;let n=t.text;if(!n)return;let r=a.getState().getToolMessageId(t.id);if(!r)return;let i=t.eventType===`warning`?`⚠ `:``;p.push(r,`${i}${n}\n`,(e,n)=>a.getState().appendToolProgressLinesByUseId(t.id,n.split(`
7
+ `).filter(e=>e.length>0)))}function Ye(e){if(!f(e))return;u(e);let t=R(e);if(t?.kind!==`executed`)return;if(t.name===`nextsteps`&&t.id){let e=q.get(t.id)??[];q.delete(t.id),t.ok&&e.length>0&&(J=e)}let{currentToolId:n}=a.getState(),r=t.id?a.getState().getToolMessageId(t.id):n;r&&(p.drop(r),t.id?a.getState().setToolResultByUseId(t.id,t.output??``,t.ok):a.getState().setToolResult(r,t.output??``,t.ok),a.getState().updateMessage(r,{toolDurationMs:t.durationMs,...t.sage&&t.sage.length>0?{sageLines:t.sage}:{}})),t.id&&a.getState().updateExecution(t.id,{completedAt:Date.now(),durationMs:t.durationMs,output:t.output,ok:t.ok}),n&&r===n&&a.getState().setCurrentToolId(null)}function Xe(e){if(!f(e))return;let t=e.payload;if(l.getState().yolo===!0&&!t.boundaryReason){g(x.getState().wsUrl).sendConfirm(t.id,`yes`),j.getState().hideConfirm();return}j.getState().showConfirm({id:t.id,toolName:t.toolName,input:t.input,suggestedPattern:t.suggestedPattern,decisionSource:t.decisionSource,riskTier:t.riskTier,boundaryReason:t.boundaryReason});try{Be()}catch{}Ve(),He(`${_.getState().projectName||`Agent`} needs approval`,`Tool "${t.toolName}" is waiting for your decision.`,`agent-confirm`),typeof document<`u`&&document.hidden&&H(`attention`)}function Ze(e){if(!f(e))return;let t=m(e,{status:`string`},{requestId:`string`,iterations:`number`,finalText:`string`,error:`object`});if(!t)return;let n=t.iterations??1;p.flushAll(),a.getState().flushThinkingLog(Math.max(1,n)),_.getState().setIteration(null),a.getState().setLoading(!1);let o=a.getState().currentAssistantMessageId,s=t.status===`done`?t.finalText?.trim():void 0;if(o){let e=a.getState().messages.find(e=>e.id===o);a.getState().updateMessage(o,{content:e?.content?.trim()?e.content:s??e?.content??``}),a.getState().finalizeMessage(o,{final:!0})}else if(s){let e=a.getState().runStart,t=i(s).stripped.trim(),n=a.getState().messages,r;for(let t=n.length-1;t>=0;t--){let i=n[t];if(i?.role===`assistant`&&(!e||i.timestamp>=e.at)){r=i;break}}let o=r?.content.trim();if(o===void 0||o!==s&&o!==t){let e=a.getState().addMessage({role:`assistant`,content:s});a.getState().finalizeMessage(e,{final:!0})}}t.status===`done`&&J.length>0&&(a.getState().messages.some(e=>e.role===`assistant`&&(e.nextSteps?.steps.length??0)>0)||a.getState().addMessage({role:`assistant`,content:``,nextSteps:{steps:J}}),J=[]),a.getState().setCurrentAssistantMessage(null),a.getState().clearThinking();let c=a.getState().runStart;if(c&&t.status===`done`){let e=a.getState().messages,t=-1,i=0;for(let n=e.length-1;n>=0;n--){let a=r(e[n]);if(a.role===`assistant`&&t===-1&&a.content&&(t=n),a.role===`tool`&&a.timestamp>=c.at&&(i+=1),a.role===`user`&&a.timestamp<=c.at)break}if(t!==-1){let r=_.getState().cost;a.getState().updateMessage(e[t]?.id,{runSummary:{iterations:n,tools:i,durationMs:Date.now()-c.at,costDelta:Math.max(0,r-c.cost)}})}}if(a.getState().setRunStart(null),t.status!==`done`&&t.error)t.requestId&&a.getState().updateMessage(t.requestId,{status:`failed`}),a.getState().addMessage({role:`assistant`,content:`Error: ${t.error.message}`,isError:!0}),M.error(`Run ended: ${t.error.message}`),He(`${_.getState().projectName||`Agent`} run failed`,t.error.message),typeof document<`u`&&document.hidden&&H(`error`);else if(t.status===`done`){if(typeof document<`u`&&document.hidden&&(M.success(`Run completed in ${n} iteration${n===1?``:`s`}`),He(`${_.getState().projectName||`Agent`} run finished`,`Completed in ${n} iteration${n===1?``:`s`}.`),H(`ready`)),Ve(),x.getState().soundOnComplete)try{ze()}catch{}typeof document<`u`&&document.dispatchEvent(new CustomEvent(`chat:next-step-countdown`))}let l=a.getState(),u=l.queue[0];if(!u)return;if(u.alreadyDispatched===!0){Qe(u);let e=l.dequeueDrainable();return e?$e(e):void 0}let d=l.dequeue();if(d)return $e(d)}function Qe(e){if(e.bubbleAdded===!0)return;let t=e.images??[];a.getState().addMessage({role:`user`,content:e.text,...t.length>0?{attachments:t.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.bubbleAdded=!0}function $e(e){let t=g(x.getState().wsUrl),n=e.images??[];if(a.getState().addMessage({role:`user`,content:e.text,...n.length>0?{attachments:n.map(e=>({id:e.id,kind:`image`,dataUrl:e.dataUrl,mediaType:e.mediaType,bytes:e.bytes,name:e.name}))}:{}}),e.mode===`btw`){e.alreadyDispatched!==!0&&t.sendMailboxMessage({type:`btw`,to:`leader`,subject:`btw from WebUI`,body:e.text,priority:`normal`,audience:`all`});return}a.getState().setLoading(!0),t.sendMessage(e.text,n.length>0?Le(n):void 0)}var et={"coordinator.status":e=>{let t=e.payload;b.getState().setCoordinatorStatus(t.status,t.mode),t.taskQueue&&b.getState().updateCoordinatorStats({total:t.subagentCount??0,running:0,idle:0,stopped:0,inFlight:t.taskQueue.running,pending:t.taskQueue.pending,completed:t.taskQueue.completed})},"coordinator.stats":e=>{let t=e.payload;b.getState().updateCoordinatorStats(t)},"budget.threshold_reached":e=>{let t=e.payload;b.getState().pushEvent(`budget.threshold_reached`,t,t.ts??Date.now(),t.subagentId,t.taskId),t.limit>0&&t.used/t.limit*100>=85&&b.getState().recordBudgetAlert(t.subagentId,t.kind,t.used,t.limit),b.getState().updateSubagentBudget(t.subagentId,{budgetUsage:{iterations:0,toolCalls:0,tokens:0,costUsd:0,elapsedMs:t.used??0}})},"budget.decision":e=>{let t=e.payload,n=t.extended?.timeoutMs??t.extended?.maxIterations??t.extended?.maxToolCalls;b.getState().recordBudgetDecision(t.subagentId,t.kind,t.decision,n),b.getState().pushEvent(`budget.decision`,{subagentId:t.subagentId,kind:t.kind,decision:t.decision,newLimit:n},Date.now(),t.subagentId)},"subagent.budget_extended":e=>{let t=e.payload;b.getState().recordBudgetExtended(t.subagentId,t.kind,t.extendedTo),b.getState().pushEvent(`subagent.budget_extended`,t,Date.now(),t.subagentId)},"consensus.vote_initiated":e=>{let t=e.payload;b.getState().pushConsensusVote(t.changeId,t.title,t.eligible),b.getState().pushEvent(`consensus.vote_initiated`,t,Date.now()),M.info(`Vote started: `+t.title)},"consensus.vote_cast":e=>{let t=e.payload,n=b.getState().consensusVotes.get(t.changeId)?.eligible.find(e=>e.agentId===t.voterId);b.getState().recordConsensusVote(t.changeId,t.voterId,n?.agentName??t.voterId,t.value),b.getState().pushEvent(`consensus.vote_cast`,t,Date.now(),t.voterId)},"consensus.vote_resolved":e=>{let t=e.payload;b.getState().resolveConsensusVote(t.changeId,t.result,t.approveCount,t.rejectCount),b.getState().pushEvent(`consensus.vote_resolved`,t,Date.now()),M.info(`Vote resolved: `+t.result+` (y`+t.approveCount+` n`+t.rejectCount+`)`)},"task.pending":e=>{let t=e.payload;b.getState().pushTaskPending(t.taskId,t.description,t.priority),b.getState().pushEvent(`task.pending`,t,Date.now())},"task.started":e=>{let t=e.payload;b.getState().startTask(t.taskId,t.subagentId),b.getState().pushEvent(`task.started`,t,Date.now(),t.subagentId)},"task.completed":e=>{let t=e.payload;b.getState().completeTask(t.taskId,t.status,t.durationMs),b.getState().pushEvent(`task.completed`,t,Date.now(),t.subagentId)},"task.failed":e=>{let t=e.payload;b.getState().failTask(t.taskId,t.error),b.getState().pushEvent(`task.failed`,{taskId:t.taskId,subagentId:t.subagentId,error:String(t.error).slice(0,120)},Date.now(),t.subagentId),M.error(`Task failed: `+String(t.error).slice(0,80))}};function tt(){let e=g();e?.send?.({type:`mailbox.messages`,payload:{limit:30,incompleteOnly:!0}}),e?.send?.({type:`mailbox.agents`,payload:{}})}var nt=null;function Y(){nt!==null&&clearTimeout(nt),nt=setTimeout(()=>{nt=null,tt()},300)}function rt(e){let t=T.getState();if(t.openFiles.length===0){t.setProjectIdentity(e);return}if(t.projectIdentity&&t.projectIdentity!==e){t.clearOpenTabs(),t.setProjectIdentity(e);return}t.setProjectIdentity(e);let n=t.openFiles.filter(e=>e.content===``&&!e.dirty).map(e=>e.path);if(n.length===0)return;T.setState({hydratingPaths:new Set(n)});let r=g();for(let e of n)r?.send?.({type:`files.read`,payload:{filePath:e}})}function it(e){let t=e.payload;if(t.error){T.getState().setError(t.error);return}T.getState().setTree(t.root,t.tree)}function at(e){let t=e.payload,n=T.getState();if(t.error){if(n.hydratingPaths.has(t.filePath)){n.hydrateFileFailed(t.filePath);return}n.setError(t.error);return}if(n.hydratingPaths.has(t.filePath)){n.hydrateFileContent(t.filePath,t.content);return}n.openFile(t.filePath,t.content)}function ot(e){let t=e.payload;t.success?T.getState().markSaved(t.filePath):t.error&&T.getState().setError(`Save failed: ${t.error}`)}function st(e){let t=e.payload;!t.success&&t.error&&T.getState().setError(`Create failed: ${t.error}`)}function ct(e){let t=e.payload;t.success?T.getState().closeFile(t.filePath):t.error&&T.getState().setError(`Delete failed: ${t.error}`)}function lt(e){let t=e.payload;t.success?T.getState().closeFile(t.oldPath):t.error&&T.getState().setError(`Rename failed: ${t.error}`)}function ut(e){let t=e.payload;t.success?T.getState().closeFile(t.srcPath):t.error&&T.getState().setError(`Move failed: ${t.error}`)}var dt=null,ft=500;function pt(e){dt&&clearTimeout(dt),dt=setTimeout(()=>{dt=null;let e=_.getState().cwd;T.getState().setTreeLoading(!0),g().send({type:`files.tree`,payload:{path:e}})},ft)}function mt(e){let t=d(`mailbox.event`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0)),Y()}function ht(e){let t=e.payload;t?.messages&&A.getState().setMessages(t.messages)}function gt(e){let t=e.payload;t?.agents&&A.getState().setAgents(t.agents)}function _t(e){let t=d(`mailbox.received`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0)),Y()}function vt(e){Y()}function yt(e){let t=e.payload;t?.agentId&&A.getState().removeAgent(t.agentId)}function bt(e){A.getState().setMessages([]),tt()}function xt(e){Y()}function St(e){let t=e.payload;t&&typeof t.totalRemoved==`number`&&A.getState().setLastCompaction({readByAllRemoved:t.readByAllRemoved??0,expiredRemoved:t.expiredRemoved??0,stalePurged:t.stalePurged??0,totalRemoved:t.totalRemoved,remaining:t.remaining??0}),Y()}function Ct(e){let t=e.payload;if(t?.success){Y();return}M.error(`Mailbox action failed: ${t?.error??`unknown error`}`)}var wt={"files.tree":it,"files.tree.changed":pt,"files.read":at,"files.written":ot,"files.created":st,"files.deleted":ct,"files.renamed":lt,"files.moved":ut,"mailbox.event":mt,"mailbox.messages":ht,"mailbox.agents":gt,"mailbox.received":_t,"mailbox.agent_registered":vt,"mailbox.agent_deregistered":yt,"mailbox.cleared":bt,"mailbox.purged":xt,"mailbox.compacted":St,"mailbox.action_result":Ct};function Tt(e){let t=e.payload;O.getState().setSnapshot(t.worktrees??[],t.baseBranch??``)}function Et(e){let t=e.payload;O.getState().pushEvent(t)}function Dt(e){let t=e.payload;O.getState().setOrphans(t.orphans??[],t.canClean??!1,t.reason)}function Ot(e){let t=e.payload;O.getState().setCleanResult({...t,at:Date.now()})}function kt(e){let t=e.payload;O.getState().setMergeResult({...t,at:Date.now()})}function At(e){let t=e.payload;O.getState().setDiff(t.dir,t.summary)}function jt(e){S.getState().applyEvent(e.payload);let t=d(`subagent.event`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0))}function Mt(e){let t=ve(e);t?.kind===`concurrency`&&S.setState({fleetConcurrency:t.active,fleetConcurrencyMax:t.maximum,...t.maxSpawns===void 0?{}:{fleetMaxSpawns:t.maxSpawns},...t.usedSpawns===void 0?{}:{fleetUsedSpawns:t.usedSpawns},...t.remainingSpawns===void 0?{}:{fleetRemainingSpawns:t.remainingSpawns},...t.effectiveSource===void 0?{}:{fleetBudgetSource:t.effectiveSource},...t.checkpointMaxSpawns===void 0?{}:{fleetCheckpointMaxSpawns:t.checkpointMaxSpawns},...t.ceilingMismatch===void 0?{}:{fleetCeilingMismatch:t.ceilingMismatch}})}function Nt(e){let t=ve(e);if(t?.kind!==`client-status`)return;let n=t.status;ie.getState().setCurrentSession({clientType:n.clientType,clientId:n.clientId,agentCount:n.agentCount,model:n.model,mode:n.mode,toolCalls:n.toolCalls,inputTokens:n.inputTokens,outputTokens:n.outputTokens,cacheTokens:n.cacheTokens,costUsd:n.costUsd,timestamp:n.timestamp})}function Pt(e){let t=ve(e);if(t?.kind!==`sessions`)return;ie.getState().setLiveSessions(t.sessions);let n=Date.now();if(n-It>=5e3&&(It=n,tt()),n-Ft<1e3)return;Ft=n;let r=d(`sessions.status_update`,e.payload);r&&(h.getState().pushEvent(r),h.getState().setActive(!0))}var Ft=0,It=0,Lt={"worktree.state":Tt,"worktree.event":Et,"worktree.orphans":Dt,"worktree.cleanup_result":Ot,"worktree.merge_result":kt,"worktree.diff_result":At,"subagent.event":jt,"fleet.concurrency_update":Mt,"client.status_update":Nt,"sessions.status_update":Pt};function Rt(e,t){let n=e=>e.trim().replace(/\s+/g,` `).toLowerCase();return n(e)===n(t)}var zt=50,Bt=200;function Vt(e){return e.length<=300?e:`${e.slice(0,299)}…`}function Ht(e){return{...e,text:Vt(e.text)}}function Ut(e){let t=[];for(let n of Object.values(e))n.state===`exited`&&t.push(n);if(t.length<=Bt)return e;t.sort((e,t)=>(t.exitedAt??t.lastSeenAt).localeCompare(e.exitedAt??e.lastSeenAt));let n={...e};for(let e of t.slice(Bt))delete n[e.id];return n}var Wt=c()(e=>({traces:[],contextMemories:{},transitions:[],pushTrace:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=t.injected.map(Ht),a=t.activated.map(Ht);for(let e of i){let i=n[e.id];n[e.id]={...e,state:i?.state===`active`?`active`:`injected`,trigger:t.trigger,enteredAt:i?.enteredAt??t.at,lastSeenAt:t.at};let a=`${t.at}_injected_${e.id}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e.id,action:`injected`,reason:`${t.trigger} · score ${e.score.toFixed(2)}`})}return{traces:[{...t,activated:a,injected:i},...e.traces.filter(e=>e.runId!==t.runId)].slice(0,zt),contextMemories:Ut(n),transitions:r.slice(0,100)}}),applyContextSnapshot:t=>e(e=>{let n={...e.contextMemories},r=[...e.transitions],i=new Set(t.activeMemoryIds);for(let e of t.activeMemoryIds){let r=n[e];n[e]=r?{...r,state:`active`,lastSeenAt:t.at,exitedAt:void 0}:Gt(e,t.at,`active`)}for(let e of t.enteredMemoryIds){let n=`${t.at}_entered_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`entered`,reason:`present in provider request`})}for(let e of t.exitedMemoryIds){let i=n[e];i&&(n[e]={...i,state:`exited`,exitedAt:t.at});let a=`${t.at}_exited_${e}`;r.some(e=>e.id===a)||r.unshift({id:a,at:t.at,memoryId:e,action:`exited`,reason:`absent from provider request`})}for(let[e,a]of Object.entries(n))if((a.state===`injected`||a.state===`active`)&&!i.has(e)&&(n[e]={...a,state:`exited`,exitedAt:t.at},!t.exitedMemoryIds.includes(e))){let n=`${t.at}_exited_before_provider_${e}`;r.some(e=>e.id===n)||r.unshift({id:n,at:t.at,memoryId:e,action:`exited`,reason:a.state===`injected`?`removed before provider request`:`absent from provider context snapshot`})}return{contextMemories:Ut(n),transitions:r.slice(0,100)}}),resetContext:()=>e({contextMemories:{},transitions:[]}),clear:()=>e({traces:[],contextMemories:{},transitions:[]})}));function Gt(e,t,n){return{id:e,kind:`unknown`,text:`Memory details were not present in this UI process.`,score:0,relationStrength:0,anchors:[],tags:[],activationReasons:[],importance:0,confidence:0,freshness:0,persistence:`unknown`,state:n,trigger:`context snapshot`,enteredAt:t,lastSeenAt:t,isPlaceholder:!0}}var Kt=100,qt=new Set([`exited`,`superseded`,`archived`,`staled`,`contradicted`]);function Jt(e,t=new Date){let n=e.event,r=X(e.memoryId),i=X(e.at)??t.toISOString(),a={id:`${n}_${t.getTime()}_${Math.random().toString(36).slice(2,7)}`,at:i,event:n};if(n===`memory.accepted`&&r)return{...a,action:`entered`,memoryId:r,label:`${r} entered memory`,detail:Xt(e)};if(n===`memory.merged`&&r){let t=Array.isArray(e.mergedIds)?e.mergedIds.length:0;return{...a,action:`merged`,memoryId:r,label:`${r} merged`,detail:t>0?`${t} records folded in`:void 0}}if(n===`memory.recovered`&&r)return{...a,action:`recovered`,memoryId:r,label:`${r} recovered`,detail:X(e.reason)};if(n===`memory.deleted`&&r)return{...a,action:`exited`,memoryId:r,label:`${r} exited memory`,detail:Zt(e)};if(n===`memory.updated`&&r){let t=X(e.status)??`updated`;return{...a,action:t===`deleted`?`exited`:`updated`,memoryId:r,label:t===`deleted`?`${r} exited memory`:`${r} updated → ${t}`,detail:Xt(e)}}if(n===`memory.graph_edge_added`){let t=X(e.from),n=X(e.to);if(!t?.startsWith(`mem:`)||!n?.startsWith(`mem:`))return null;let r=X(e.relation)??`related_to`,i=Z(e.weight),o=Array.isArray(e.evidence)?e.evidence.filter(e=>typeof e==`string`):[];return{...a,action:`related`,memoryId:t.startsWith(`mem:`)?t.slice(4):void 0,label:`${Qt(t)} ↔ ${Qt(n)}`,detail:[r,i===void 0?void 0:`weight ${i.toFixed(2)}`,o.length>0?`why: ${o.join(`, `)}`:void 0].filter(Boolean).join(` · `)}}return n===`memory.relationships_rebuilt`?{...a,action:`related`,label:`Memory relationships rebuilt`,detail:`${Z(e.added)??0} added / ${Z(e.proposed)??0} proposed`}:n===`memory.superseded`&&r?{...a,action:`superseded`,memoryId:r,label:`${r} → superseded`,detail:X(e.reason)??Xt(e)}:n===`memory.archived`&&r?{...a,action:`archived`,memoryId:r,label:`${r} → archived`,detail:X(e.reason)}:n===`memory.staled`&&r?{...a,action:`staled`,memoryId:r,label:`${r} → staled`,detail:X(e.reason)??`anchor drift detected`}:n===`memory.contradicted`&&r?{...a,action:`contradicted`,memoryId:r,label:`${r} → contradicted`,detail:X(e.reason)??`conflicting evidence`}:null}var Yt=c()(e=>({items:[],pushEvent:t=>e(e=>{let n=Jt(t);return n?{items:[n,...qt.has(n.action)?e.items.filter(e=>!(qt.has(e.action)&&e.memoryId===n.memoryId)):e.items].slice(0,Kt)}:e}),clear:()=>e({items:[]})}));function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Xt(e){let t=[X(e.kind),X(e.persistence)],n=Z(e.confidence),r=Z(e.freshness);return n!==void 0&&t.push(`confidence ${n.toFixed(2)}`),r!==void 0&&t.push(`freshness ${r.toFixed(2)}`),t.filter(Boolean).join(` · `)||void 0}function Zt(e){let t=X(e.reason),n=Z(e.removedEdges);return[t,n===void 0?void 0:`${n} edges removed`].filter(Boolean).join(` · `)||void 0}function Qt(e){let t=e.replace(/^mem:/,``);return t.length>26?`${t.slice(0,23)}…`:t}function $t(e){if(!e||e.length===0)return;let t=e.map(e=>e.status);return t.some(e=>e===`failed`)?`failed`:t.every(e=>e===`completed`||e===`skipped`)?`completed`:t.some(e=>e===`paused`)?`paused`:`running`}function en(e){let t=e.payload,n=Array.isArray(t.phases)?t.phases:void 0,r=$t(n);C.getState().setState({phases:n,activePhaseId:typeof t.activePhaseId==`string`?t.activePhaseId:void 0,overallPercent:typeof t.overallPercent==`number`?t.overallPercent:void 0,autonomous:typeof t.autonomous==`boolean`?t.autonomous:void 0,title:typeof t.title==`string`?t.title:void 0,goal:typeof t.goal==`string`?t.goal:void 0,status:r,multiBoard:t.multiBoard===!0,lastError:r===`failed`?C.getState().lastError:null})}function tn(e){let t=e.payload,n={totalPhases:typeof t.totalPhases==`number`?t.totalPhases:0,completed:typeof t.completed==`number`?t.completed:0,failed:typeof t.failed==`number`?t.failed:0,totalTasks:typeof t.totalTasks==`number`?t.totalTasks:0,completedTasks:typeof t.completedTasks==`number`?t.completedTasks:0,failedTasks:typeof t.failedTasks==`number`?t.failedTasks:0};C.getState().setState({progress:n,overallPercent:typeof t.percentComplete==`number`?Math.round(t.percentComplete):void 0,status:n.failed>0||n.failedTasks>0?`failed`:`running`,lastEvent:`progress`})}function Q(e){let t=e.payload,n=typeof t.title==`string`&&t.title?t.title:`Goal`,r=typeof t.error==`string`&&t.error?t.error:void 0;if(e.type===`goal.paused`){C.getState().setState({status:`paused`,autonomous:!1,lastEvent:`paused`}),M.info(`Goal paused`);return}if(e.type===`goal.resumed`){C.getState().setState({status:`running`,autonomous:!0,lastEvent:`resumed`}),M.info(`Goal resumed`);return}if(e.type===`goal.stopped`){C.getState().setState({status:`stopped`,autonomous:!1,lastEvent:`stopped`}),M.warn(`Goal stopped`);return}if(e.type===`goal.cleared`){C.getState().clear();return}if(e.type===`goal.reverted`){let e=t.ok===!0,n=typeof t.reverted==`number`?t.reverted:0,r=typeof t.reason==`string`?t.reason:void 0;e?M.success(n>0?`Reverted ${n} commit${n===1?``:`s`}`:`Nothing to revert`):M.error(`Revert failed: ${r??`unknown error`}`),C.getState().setState({lastEvent:`reverted`});return}if(e.type===`goal.saved`){C.getState().setState({lastEvent:`saved`}),M.success(`Goal graph saved`);return}if(e.type===`goal.completed`){C.getState().setState({status:`completed`,autonomous:!1,overallPercent:100,lastEvent:`completed`,lastError:null}),M.success(`${n} completed`);return}if(e.type===`goal.failed`||e.type===`goal.error`){let e=r??(typeof t.message==`string`?t.message:`${n} failed`);C.getState().setState({status:`failed`,autonomous:!1,lastEvent:`failed`,lastError:e}),M.error(e)}}function nn(e){let t=e.payload;C.getState().setState({lastEvent:`list`,graphs:Array.isArray(t.graphs)?t.graphs:[]})}function rn(e){let t=e.payload;ae.getState().setGoal(t)}function an(e){let t=e.payload;l.getState().set(t),t.yolo===!0&&j.getState().confirmInfo&&j.getState().hideConfirm()}function on(e){if(!f(e))return;let t=e.payload,n;if(t.decision.type===`answer`){let e=t.decision.rationale&&t.decision.rationale!==t.decision.text?`\n\n_${t.decision.rationale}_`:``;n=`🧠 ${t.decision.text??``}${e}`}else n=t.decision.type===`deny`?`🧠 Denied: ${t.decision.reason??``}`:`🧠 The Brain escalated this question back to you — it needs human judgement.`;a.getState().addMessage({role:`assistant`,content:n})}function sn(e){if(!f(e))return;let t=e.payload,n=t.requestId??t.request?.id;if(n&&t.request?.question&&E.getState().noteQuestion(n,t.request.question),t.event===`brain.council_vote`){E.getState().recordVote(t);let e=t.requestId??`unknown`;h.getState().pushEvent({id:`council_${e}_${t.seatId??`seat-${Date.now()}`}`,kind:`brain:council_vote`,timestamp:Date.now(),source:t.model??t.persona??`seat`,target:`brain`,label:`${t.persona??`voter`} → ${t.status===`valid`?t.optionId??`stance`:t.status??`failed`}`,data:t,color:`#38bdf8`,flowGroup:`brain`});return}if(t.event===`brain.council_resolved`){E.getState().recordResolution(t);let e=t.requestId??`unknown`,n=E.getState().panels.find(t=>t.requestId===e)?.seats??[],r=n.map(e=>`- **${e.persona}**${e.veto?` (veto)`:``} → ${e.status===`valid`?e.optionId??`stance`:e.status}${e.model?` · \`${e.model}\``:``}`),i=[`⚖️ **Council ${t.resolution??`resolved`}**`,`${t.validVoteCount??n.length}/${t.configuredSeatCount??n.length} seats`,`${t.distinctTargetCount??0} distinct target${t.distinctTargetCount===1?``:`s`}`,t.judgeUsed?`judge used`:void 0,t.usage?.totalTokens?`${t.usage.totalTokens} tok`:void 0].filter(Boolean).join(` · `);a.getState().addMessage({role:`assistant`,content:[i,...r,...(t.warnings??[]).map(e=>`> ⚠ ${e}`)].filter(Boolean).join(`
8
8
  `)});for(let e of t.warnings??[])M.warn(e);return}if(t.event===`brain.intervention`){let e=t.decision?.rationale??t.decision?.text??``,n=t.intervened?`🧠 **Brain intervention** — corrective guidance was sent to the agent.`:`🧠 **Brain check** — a distress signal was reviewed; no action needed.`;a.getState().addMessage({role:`assistant`,content:[n,t.request?.question??``,e?`_${e}_`:``].filter(Boolean).join(`
9
9
 
10
10
  `)}),t.intervened&&M.info(`Brain intervened: agent steered`)}else t.event===`brain.decision_denied`&&M.warn(`Brain denied: ${t.decision?.reason??t.request?.question??`request`}`)}function cn(e){if(!f(e))return;let t=e.payload;h.getState().pushEvent({id:`memory_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,kind:`memory:event`,timestamp:Date.now(),source:`sage`,target:`leader`,label:t.event.replace(/^memory\./,``),data:t,color:`#a78bfa`,flowGroup:`memory`}),t.event===`memory.injector_run`&&Wt.getState().pushTrace(t),t.event===`memory.context_snapshot`&&Wt.getState().applyContextSnapshot(t),Yt.getState().pushEvent(t),t.event===`memory.staled`?M.warn(`Memory became stale: ${String(t.memoryId??``)}`):t.event===`memory.contradicted`?M.warn(`Memory contradicted: ${String(t.memoryId??``)}`):t.event===`memory.hygiene_completed`&&M.info(`SAGE hygiene completed`)}function ln(e){let t=e.payload,n=typeof t.kind==`string`?t.kind:typeof t.event==`string`?t.event:`collab.event`;h.getState().pushEvent({id:`collab_${Date.now()}_${Math.random().toString(36).slice(2,7)}`,kind:`collab:event`,timestamp:Date.now(),source:`collab`,target:typeof t.sessionId==`string`?t.sessionId:`session`,label:n,magnitude:1,data:t,raw:e.payload,color:`hsl(200, 70%, 55%)`,flowGroup:`collab`}),h.getState().setActive(!0)}function un(e){ln(e);let t=e.payload;t?.phase===`consumed`?M.success(`Tool injection applied${t.toolName?` to ${t.toolName}`:``}`):M.info(`Collab tool injection queued`)}function dn(e){let t=e.payload?.entry;if(!t)return;let n=typeof t.iteration==`number`?t.iteration:0,r=typeof t.task==`string`?t.task:void 0,i=typeof t.status==`string`?t.status:void 0,a=typeof t.at==`string`?t.at:new Date().toISOString();ae.getState().appendJournalEntry({iteration:n,task:r,status:i,timestamp:a}),h.getState().pushEvent({id:`eternal_${Date.now()}_${n}`,kind:`eternal:iteration`,timestamp:Date.now(),source:`eternal`,target:`goal`,label:r?`L${n}: ${r}`:`Eternal iteration ${n}`,magnitude:typeof t.costUsd==`number`?t.costUsd:1,data:t,raw:e.payload,color:i===`failure`?`hsl(0, 80%, 55%)`:`hsl(220, 80%, 60%)`,flowGroup:`eternal`}),h.getState().setActive(!0)}function fn(e){let t=e.payload;_.getState().setEnv({cwd:t.cwd,projectRoot:t.projectRoot,projectName:t.projectRoot.split(/[/\\]/).pop()||t.projectRoot}),T.getState().setTreeLoading(!0),rt(t.projectRoot),g().send({type:`files.tree`,payload:{path:t.cwd}})}function pn(e){let t=e.payload,n=j.getState().refinePanel,r=a.getState().pendingRefinement;if(!n&&r){a.getState().setRefining(!1);let e=r.text,n=r.images?.length?r.images.map((e,t)=>({id:`pr_${Date.now()}_${t}`,dataUrl:`data:${e.mime};base64,${e.data}`,mediaType:e.mime,bytes:Math.round(e.data.length*3/4)})):void 0,i=n&&n.length>0&&r.mode===`btw`?`queue`:r.mode??`queue`;if(t.error){a.getState().setPendingRefinement(null),a.getState().enqueue(e,i,n);return}let o=t.refined??``;if(!o||Rt(o,e)){a.getState().setPendingRefinement(null),a.getState().enqueue(e,i,n);return}a.getState().setPendingRefinement(null),j.getState().setRefinePanel({original:e,refined:o,english:t.english||o,status:`ready`,mode:n&&n.length>0&&r.mode===`btw`?`queue`:r.mode,images:n,...t.refinedWith?{provider:t.refinedWith.provider,model:t.refinedWith.model}:{},error:void 0,errorKind:void 0,resolve:()=>{}});return}if(!n)return;if(t.error){if(t.errorKind===`timeout`&&!n.retried&&t.retryTimeoutMs){j.getState().setRefinePanel({...n,status:`refining`,retried:!0}),g().refineModel(n.original,{timeoutMs:t.retryTimeoutMs});return}j.getState().setRefinePanel({...n,status:`failed`,error:t.error,errorKind:t.errorKind,fallbackRef:t.fallbackRef});return}let i=n.original;if(Rt(t.refined,i)){j.getState().setRefinePanel(null),a.getState().addMessage({role:`user`,content:i}),a.getState().setLoading(!0),g().sendMessage(i);return}j.getState().setRefinePanel({...n,status:`ready`,refined:t.refined,english:t.english,...t.refinedWith?{provider:t.refinedWith.provider,model:t.refinedWith.model}:{},error:void 0,errorKind:void 0})}function mn(e){let t=e.payload;de.getState().setInfo({...t,fetchedAt:Date.now()})}function hn(e){let t=e.payload;ne.getState().setFiles(t.files??[],t.error??null)}function gn(e){let t=e.payload;ne.getState().selectedPath===t.path&&ne.getState().setDiff({path:t.path,oldText:t.oldText??``,newText:t.newText??``,binary:t.binary,tooLarge:t.tooLarge,error:t.error})}function _n(e){let t=e.payload;ee.getState().setSnapshot({count:t.count,maxConcurrent:t.maxConcurrent,jobs:t.jobs??[]})}function vn(e){let t=e.payload;ee.getState().recordFired(t.name,t.ts)}function yn(e){let t=e.payload;M.info(t.message??`🦂 Chimera report ready. No follow-up started; open the mailbox to inspect it.`,8e3)}var bn={"goal-state.updated":rn,"prefs.updated":an,"goal.state":en,"goal.progress":tn,"goal.paused":Q,"goal.resumed":Q,"goal.stopped":Q,"goal.cleared":Q,"goal.reverted":Q,"goal.saved":Q,"goal.completed":Q,"goal.failed":Q,"goal.error":Q,"goal.list":nn,"brain.answer":on,"brain.event":sn,"memory.event":cn,"collab.event":ln,"collab.injection.granted":un,"eternal.iteration":dn,"working_dir.changed":fn,"model.refine_result":pn,"git.info":mn,"git.changes":hn,"git.diff":gn,"cron.snapshot":_n,"cron.job_fired":vn,"chimera.report_available":yn};function xn(e){let t=e.payload;!t.jobId||!t.kind||w.getState().jobStarted(t.jobId,t.kind)}function Sn(e){let t=e.payload;!t.jobId||!t.phase||!Number.isFinite(t.completed)||!Number.isFinite(t.total)||w.getState().jobProgress(t.jobId,{phase:t.phase,completed:t.completed??0,total:t.total??0})}function Cn(e){let t=e.payload;t.workspaceId&&w.getState().workspaceCompleted(t.workspaceId)}function wn(e){let t=e.payload;t.snapshot&&w.getState().setSnapshot(t.snapshot,t.stale??!1)}function Tn(e){let t=e.payload;t.reportId&&w.getState().reportReady(t.reportId)}function En(e){let t=e.payload;t.jobId&&w.getState().jobFailed(t.jobId,t.error??`TechStack job failed`)}function Dn(e){let t=e.payload;t.jobId&&w.getState().jobCancelled(t.jobId)}var On={"techstack.job.started":xn,"techstack.job.progress":Sn,"techstack.workspace.completed":Cn,"techstack.snapshot.updated":wn,"techstack.report.ready":Tn,"techstack.job.failed":En,"techstack.job.cancelled":Dn},kn=new Set;function An(){p.flush(`__thinking__`);let e=_.getState().iteration;a.getState().flushThinkingLog(Math.max(1,e?.index??1)),a.getState().clearThinking()}function jn(e){if(!f(e))return;let t=e.payload,n=e=>e.toLocaleString(),r=[...t.tools.breakdown].sort((e,t)=>t.tokens-e.tokens).slice(0,8),i=[...t.messages.breakdown].sort((e,t)=>t.tokens-e.tokens).slice(0,8);a.getState().addMessage({role:`assistant`,content:[`📊 **Context breakdown** (heuristic — 4 chars/token)`,``,`**Total estimate:** ${n(t.total)} tokens`,`• System prompt: ${n(t.systemPrompt)}`,`• Tool schemas: ${n(t.tools.total)} (${t.tools.count} tools)`,`• Messages: ${n(t.messages.total)} (${t.messages.count} messages)`,``,`**Top tool schemas:**`,...r.map(e=>` · ${e.name}: ${n(e.tokens)}`),``,`**Top messages:**`,...i.map(e=>` · #${e.index} ${e.role}: ${n(e.tokens)} — ${e.preview||`(empty)`}`)].join(`
11
11
  `)})}function Mn(e){let t=e.payload;t.success?M.success(t.message):M.error(t.message),g(x.getState().wsUrl).listSavedProviders()}function Nn(e){let t=e.payload;if(!t.success||!t.provider||!t.model)return;x.getState().setProvider(t.provider),x.getState().setModel(t.model);let n=t.previousProvider&&t.previousModel?`${t.previousProvider} / ${t.previousModel}`:s.t(`settings:toast.previousModel`),r=`${t.provider} / ${t.model}`;a.getState().addMessage({role:`system`,content:s.t(t.runActive?`settings:toast.modelSwitchedRunActive`:`settings:toast.modelSwitchedNextRequest`,{from:n,to:r})})}function Pn(e){if(!f(e))return;u(e);let t=e.payload,n=t.reductions.length?t.reductions.map(e=>`${e.phase}: ${e.saved}`).join(`, `):`no-op`;t.repaired&&(n+=`; repaired ${t.repaired.removedToolUses?.length??0} tool_use, ${t.repaired.removedToolResults?.length??0} tool_result, ${t.repaired.removedMessages} empty messages`),a.getState().addMessage({role:`system`,content:`🗜️ Context compacted: ${t.before} → ${t.after} tokens (saved ~${t.saved}). ${n}`}),_.setState({lastInputTokens:t.after})}function Fn(e){if(!f(e))return;u(e);let t=e.payload,n,r;t.budget&&t.budget.availableInputTokens>0?(n=Math.min(100,Math.max(0,Math.round(t.budget.load*100))),r=`input budget`):(n=t.maxContext>0?Math.min(100,Math.max(0,Math.round(t.tokens/t.maxContext*100))):0,r=`context`),a.getState().addMessage({role:`assistant`,content:`Compaction failed at ${t.level} (${n}% ${r}): ${t.message}`,isError:t.fatal}),M.error(`Compaction failed: ${t.message}`)}function In(e){if(!f(e))return;let t=e.payload,n=`${t.tool}: ${t.pattern}`;t.decision===`always`?M.success(`Always allowed ${n}`):M.warn(`Denied ${n}`)}function Ln(e){if(!f(e))return;u(e);let t=e.payload,n=t.removedToolUses.length+t.removedToolResults.length+t.removedMessages,r=t.beforeMessages!==void 0&&t.afterMessages!==void 0?` Messages: ${t.beforeMessages} -> ${t.afterMessages}.`:``;a.getState().addMessage({role:`assistant`,content:`Context repaired: removed ${n} orphan protocol item(s).${r} tool_use ${t.removedToolUses.length}, tool_result ${t.removedToolResults.length}.`})}function Rn(e){if(!f(e))return;u(e);let t=e.payload;_.getState().setContextUsage(t.tokens,t.maxContext)}function zn(e){if(!f(e))return;let t=e.payload,n=_.getState();n.setEnv({maxContext:t.maxContext}),t.source===`provider`&&t.decreased===!0&&typeof t.previousMaxContext==`number`&&t.previousMaxContext>t.maxContext?n.setContextLimitWarning({previousMaxContext:t.previousMaxContext,maxContext:t.maxContext,providerId:t.providerId??n.session?.provider??`provider`,modelId:t.modelId??n.session?.model??`model`}):(t.decreased===!1||t.source===`configured`)&&n.setContextLimitWarning(null)}function Bn(e){if(!f(e))return;let t=e.payload;_.getState().setContextUsage(t.used,t.limit);let n=t.limit>0?Math.round(t.used/t.limit*100):0;M.warn(`Token threshold reached (${n}%)`)}function Vn(e){if(!f(e))return;let t=e.payload.model||`<unknown>`;kn.has(t)||(kn.add(t),M.warn(`Cost estimate unavailable for ${t}`))}function Hn(e){if(!f(e))return;let t=e.payload;_.getState().setContextModes(t.modes.map(e=>({id:e.id,name:e.name,description:e.description,thresholds:e.thresholds,preserveK:e.preserveK,eliseThreshold:e.eliseThreshold,custom:e.custom}))),_.getState().setEnv({contextMode:t.activeId})}function Un(e){if(!f(e))return;let t=e.payload;_.getState().setEnv({contextMode:t.id})}function Wn(e){if(!f(e))return;let t=e.payload;t.phase!==`todos.get`&&(An(),a.getState().addMessage({role:`assistant`,content:`[${t.phase}] ${t.message}`,isError:!0}),a.getState().setLoading(!1))}function Gn(){let[e,t]=(0,N.useState)({isMobile:!1,isSmall:!1,width:0});return(0,N.useEffect)(()=>{if(typeof window>`u`)return;let e=window.matchMedia(`(max-width: 768px)`),n=window.matchMedia(`(max-width: 640px)`),r=()=>{t({isMobile:e.matches,isSmall:n.matches,width:window.innerWidth})};return r(),e.addEventListener(`change`,r),n.addEventListener(`change`,r),()=>{e.removeEventListener(`change`,r),n.removeEventListener(`change`,r)}},[]),e}function Kn(){return typeof window>`u`?!1:window.matchMedia(`(max-width: 768px)`).matches}function qn(e){if(typeof e!=`string`)return Date.now();let t=Date.parse(e);return Number.isFinite(t)?t:Date.now()}function Jn(e){return`replay_${Date.now()}_${e}`}function Yn(){return typeof window>`u`?!1:window.location.pathname===`/debug`||window.location.pathname===`/analytics`||window.location.pathname===`/refresh-debug`}function Xn(e){return typeof e==`string`?e:JSON.stringify(e)}function Zn(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>!!e&&typeof e==`object`&&e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
12
- `):``}function Qn(e){if(typeof e==`string`)return e.trim();if(!e||typeof e!=`object`||Array.isArray(e))return``;let t=e;for(let e of[`id`,`name`,`type`]){let n=t[e];if(typeof n==`string`&&n.trim())return n.trim()}return``}function $n(e,t=[]){let n=[],r=new Map,i=0,a=0,o=(e,t,r)=>{t&&(xe(t)||n.push({id:Jn(n.length),role:e,content:t,timestamp:r}))},s=e=>{n.push({id:Jn(n.length),role:`system`,content:e.text,timestamp:qn(e.ts),isError:e.level===`error`||void 0})},c=e=>{if(typeof e==`string`)for(;a<t.length&&t[a].ts<e;)s(t[a]),a+=1},l=(e,t)=>{let r=e.trim();r&&(i+=1,n.push({id:Jn(n.length),role:`system`,content:``,timestamp:t,thinkingLog:{iteration:i,text:r,startedAt:t,durationMs:0,replayed:!0}}))};for(let t of e){if(c(t.ts),t.role!==`user`&&t.role!==`assistant`&&t.role!==`system`)continue;let e=t.role,i=qn(t.ts);if(typeof t.content==`string`){o(e,t.content,i);continue}if(!Array.isArray(t.content))continue;let a=``,s=[];for(let c of t.content){if(c.type===`thinking`&&typeof c.thinking==`string`){s.push(c.thinking);continue}if(c.type===`text`&&typeof c.text==`string`){a+=(a?`
12
+ `):``}function Qn(e){if(typeof e==`string`)return e.trim();if(!e||typeof e!=`object`||Array.isArray(e))return``;let t=e;for(let e of[`id`,`name`,`type`]){let n=t[e];if(typeof n==`string`&&n.trim())return n.trim()}return``}function $n(e,t=[]){let n=[],r=new Map,i=0,a=0,o=(e,t,r)=>{t&&(be(t)||n.push({id:Jn(n.length),role:e,content:t,timestamp:r}))},s=e=>{n.push({id:Jn(n.length),role:`system`,content:e.text,timestamp:qn(e.ts),isError:e.level===`error`||void 0})},c=e=>{if(typeof e==`string`)for(;a<t.length&&t[a].ts<e;)s(t[a]),a+=1},l=(e,t)=>{let r=e.trim();r&&(i+=1,n.push({id:Jn(n.length),role:`system`,content:``,timestamp:t,thinkingLog:{iteration:i,text:r,startedAt:t,durationMs:0,replayed:!0}}))};for(let t of e){if(c(t.ts),t.role!==`user`&&t.role!==`assistant`&&t.role!==`system`)continue;let e=t.role,i=qn(t.ts);if(typeof t.content==`string`){o(e,t.content,i);continue}if(!Array.isArray(t.content))continue;let a=``,s=[];for(let c of t.content){if(c.type===`thinking`&&typeof c.thinking==`string`){s.push(c.thinking);continue}if(c.type===`text`&&typeof c.text==`string`){a+=(a?`
13
13
  `:``)+c.text;continue}if(c.type===`tool_use`){o(e,a,i),a=``;let t=String(c.id??``),s={id:Jn(n.length),role:`tool`,content:``,toolName:String(c.name??`tool`),toolInput:c.input,toolUseId:t,timestamp:i};n.push(s),t&&r.set(t,s);continue}if(c.type===`tool_result`){let e=String(c.tool_use_id??``),t=r.get(e);t&&(t.toolResult=Xn(c.content),t.isError=!!c.is_error)}}o(e,a,i),e===`assistant`&&s.length>0&&l(s.join(`
14
14
 
15
- `),i)}for(;a<t.length;)s(t[a]),a+=1;return n}function er(e){let t=d(`session.start`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0));let n=e.payload,r=Qn(n.provider),i=Qn(n.model),o=_.getState().session?.id,s=!o||o!==n.sessionId||n.reset;if((n.appVersion||n.latestVersion)&&_.getState().setUpdateInfo({appVersion:String(n.appVersion??``),latestVersion:String(n.latestVersion??``),updateAvailable:!!n.updateAvailable}),Array.isArray(n.providerStatuses)&&k.getState().hydrate(n.providerStatuses.map(e=>({providerId:e.providerId,model:e.model,state:e.state,reason:e.lastErrorKind??e.state,updatedAt:e.lastFailureAt??Date.now(),stateExpiresAt:e.stateExpiresAt??void 0}))),n.needsSetup&&pe(`setup`),s?(Wt.getState().clear(),_.getState().startSession({id:n.sessionId,startedAt:Date.now(),model:i,provider:r})):_.getState().setSession({id:n.sessionId,startedAt:_.getState().session?.startedAt??Date.now(),model:i,provider:r}),_.getState().setEnv({maxContext:n.maxContext,projectRoot:n.projectRoot??``,projectName:n.projectName,cwd:n.cwd,mode:n.mode,contextMode:n.contextMode,inputCost:n.inputCost,outputCost:n.outputCost,cacheReadCost:n.cacheReadCost}),x.getState().setConfig({provider:r,model:i}),s){!n.needsSetup&&P()&&!Yn()&&fe({sidebarOpen:!1}),p.dropAll(),a.getState().clearMessages(),a.getState().setBoundSessionId(n.sessionId),j.getState().setSearchActiveMessageId(null),a.getState().setLoading(!1),_.setState({todos:[]}),V(`ready`);let e=S.getState();if(n.clearedSessionId){let t=new Map;for(let[r,i]of e.agents)i.sessionId!==n.clearedSessionId&&t.set(r,i);S.setState({agents:t})}else e.clear();T.getState().setTreeLoading(!0),rt(_.getState().projectRoot),g().send({type:`files.tree`,payload:{path:_.getState().cwd}})}let c=n.replayMessages,l=n.replayMarkers??[];if(c&&c.length>0){let e=a.getState();(s||e.messages.length===0||e.boundSessionId!==n.sessionId||e.isLoading)&&(e.setMessages($n(c,l)),e.setBoundSessionId(n.sessionId))}if(c){let e=n.replayUsage;if(e){let t=_.getState(),n=e.input??0,r=e.output??0,i=e.cacheRead??0,a=e.cacheWrite??0;_.setState({totalTokens:{input:n,output:r,cacheRead:i,cacheWrite:a},cost:(n*t.inputCost+r*t.outputCost+i*t.cacheReadCost)/1e6})}let t=n.lastInputTokens;typeof t==`number`&&t>0&&_.setState({lastInputTokens:t}),s&&!n.needsSetup&&(Yn()||(P()?fe({sidebarOpen:!1}):j.getState().currentView!==`chat`&&me(`chat`))),Kn()&&j.getState().setSidebarOpen(!1)}}function tr(e,t=140){return e.length>t?`${e.slice(0,t-1)}…`:e}function nr(e){if(!f(e))return;u(e);let t=e.payload,r=Zn(t.content),i=t.usage,o=(i.input??0)+(i.cacheWrite??0)-(i.cacheRead??0);o>0&&_.setState({lastInputTokens:o}),_.getState().updateUsage(t.usage);let{inputCost:s,outputCost:c,cacheReadCost:l}=_.getState(),d=(t.usage.input*s+t.usage.output*c+(t.usage.cacheRead??0)*l)/1e6;d>0&&_.getState().addCost(d);let m=n(t.stopReason);m&&a.getState().setLoading(!1);let h=a.getState().currentAssistantMessageId;if(h){p.flush(h);let e=a.getState().messages.find(e=>e.id===h)?.content??``;r.trim()&&(e.trim()?r.startsWith(e)&&r.length>e.length&&a.getState().updateMessage(h,{content:r}):a.getState().updateMessage(h,{content:r})),a.getState().finalizeMessage(h,{final:m}),t.usage.output>0&&a.getState().updateMessage(h,{usage:t.usage})}else if(r.trim()){let e=a.getState().addMessage({role:`assistant`,content:r,usage:t.usage.output>0?t.usage:void 0});a.getState().finalizeMessage(e,{final:m})}a.getState().setCurrentAssistantMessage(null),p.flush(`__thinking__`),a.getState().clearThinking()}function rr(e){if(!f(e))return;u(e);let t=e.payload;p.flush(`__thinking__`),a.getState().flushThinkingLog(t.index),a.getState().clearThinking();let n=_.getState().iteration;n&&_.getState().setIteration({index:t.index,max:n.max})}function ir(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:`Iteration limit reached: ${t.currentIterations}/${t.currentLimit}.`,isError:!0}),M.warn(`Iteration limit reached (${t.currentIterations}/${t.currentLimit})`)}function ar(e){if(!f(e))return;let t=e.payload,n=Math.max(0,Math.round(t.delayMs/100)/10);M.warn(`${t.providerId} retry ${t.attempt} after ${n}s (${t.status})`)}function or(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:[`Provider error from \`${t.providerId}\` (${t.status}).`,t.description,t.retryable?`_Retryable; WrongStack may recover automatically._`:``].filter(Boolean).join(`
15
+ `),i)}for(;a<t.length;)s(t[a]),a+=1;return n}function er(e){let t=d(`session.start`,e.payload);t&&(h.getState().pushEvent(t),h.getState().setActive(!0));let n=e.payload,r=Qn(n.provider),i=Qn(n.model),o=_.getState().session?.id,s=!o||o!==n.sessionId||n.reset;if((n.appVersion||n.latestVersion)&&_.getState().setUpdateInfo({appVersion:String(n.appVersion??``),latestVersion:String(n.latestVersion??``),updateAvailable:!!n.updateAvailable}),Array.isArray(n.providerStatuses)&&k.getState().hydrate(n.providerStatuses.map(e=>({providerId:e.providerId,model:e.model,state:e.state,reason:e.lastErrorKind??e.state,updatedAt:e.lastFailureAt??Date.now(),stateExpiresAt:e.stateExpiresAt??void 0}))),n.needsSetup&&pe(`setup`),s?(Wt.getState().clear(),_.getState().startSession({id:n.sessionId,startedAt:Date.now(),model:i,provider:r})):_.getState().setSession({id:n.sessionId,startedAt:_.getState().session?.startedAt??Date.now(),model:i,provider:r}),_.getState().setEnv({maxContext:n.maxContext,projectRoot:n.projectRoot??``,projectName:n.projectName,cwd:n.cwd,mode:n.mode,contextMode:n.contextMode,inputCost:n.inputCost,outputCost:n.outputCost,cacheReadCost:n.cacheReadCost}),x.getState().setConfig({provider:r,model:i}),s){!n.needsSetup&&P()&&!Yn()&&fe({sidebarOpen:!1}),p.dropAll(),a.getState().clearMessages(),a.getState().setBoundSessionId(n.sessionId),j.getState().setSearchActiveMessageId(null),a.getState().setLoading(!1),_.setState({todos:[]}),H(`ready`);let e=S.getState();if(n.clearedSessionId){let t=new Map;for(let[r,i]of e.agents)i.sessionId!==n.clearedSessionId&&t.set(r,i);S.setState({agents:t})}else e.clear();T.getState().setTreeLoading(!0),rt(_.getState().projectRoot),g().send({type:`files.tree`,payload:{path:_.getState().cwd}})}let c=n.replayMessages,l=n.replayMarkers??[];if(c&&c.length>0){let e=a.getState();(s||e.messages.length===0||e.boundSessionId!==n.sessionId||e.isLoading)&&(e.setMessages($n(c,l)),e.setBoundSessionId(n.sessionId))}if(c){let e=n.replayUsage;if(e){let t=_.getState(),n=e.input??0,r=e.output??0,i=e.cacheRead??0,a=e.cacheWrite??0;_.setState({totalTokens:{input:n,output:r,cacheRead:i,cacheWrite:a},cost:(n*t.inputCost+r*t.outputCost+i*t.cacheReadCost)/1e6})}let t=n.lastInputTokens;typeof t==`number`&&t>0?_.setState({lastInputTokens:t}):e&&typeof e.input==`number`&&e.input>0&&_.setState({lastInputTokens:e.input}),s&&!n.needsSetup&&(Yn()||(P()?fe({sidebarOpen:!1}):j.getState().currentView!==`chat`&&me(`chat`))),Kn()&&j.getState().setSidebarOpen(!1)}}function tr(e,t=140){return e.length>t?`${e.slice(0,t-1)}…`:e}function nr(e){if(!f(e))return;u(e);let t=e.payload,r=Zn(t.content),i=t.usage,o=(i.input??0)+(i.cacheWrite??0)-(i.cacheRead??0);o>0&&_.setState({lastInputTokens:o}),_.getState().updateUsage(t.usage);let{inputCost:s,outputCost:c,cacheReadCost:l}=_.getState(),d=(t.usage.input*s+t.usage.output*c+(t.usage.cacheRead??0)*l)/1e6;d>0&&_.getState().addCost(d);let m=n(t.stopReason);m&&a.getState().setLoading(!1);let h=a.getState().currentAssistantMessageId;if(h){p.flush(h);let e=a.getState().messages.find(e=>e.id===h)?.content??``;r.trim()&&(e.trim()?r.startsWith(e)&&r.length>e.length&&a.getState().updateMessage(h,{content:r}):a.getState().updateMessage(h,{content:r})),a.getState().finalizeMessage(h,{final:m}),t.usage.output>0&&a.getState().updateMessage(h,{usage:t.usage})}else if(r.trim()){let e=a.getState().addMessage({role:`assistant`,content:r,usage:t.usage.output>0?t.usage:void 0});a.getState().finalizeMessage(e,{final:m})}a.getState().setCurrentAssistantMessage(null),p.flush(`__thinking__`),a.getState().clearThinking()}function rr(e){if(!f(e))return;u(e);let t=e.payload;p.flush(`__thinking__`),a.getState().flushThinkingLog(t.index),a.getState().clearThinking();let n=_.getState().iteration;n&&_.getState().setIteration({index:t.index,max:n.max})}function ir(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:`Iteration limit reached: ${t.currentIterations}/${t.currentLimit}.`,isError:!0}),M.warn(`Iteration limit reached (${t.currentIterations}/${t.currentLimit})`)}function ar(e){if(!f(e))return;let t=e.payload,n=Math.max(0,Math.round(t.delayMs/100)/10);M.warn(`${t.providerId} retry ${t.attempt} after ${n}s (${t.status})`)}function or(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:[`Provider error from \`${t.providerId}\` (${t.status}).`,t.description,t.retryable?`_Retryable; WrongStack may recover automatically._`:``].filter(Boolean).join(`
16
16
 
17
17
  `),isError:!0}),M.error(`${t.providerId} provider error (${t.status})`)}function sr(e){if(!f(e))return;let t=e.payload,n=`${t.from.providerId}/${t.from.model}`,r=`${t.to.providerId}/${t.to.model}`;a.getState().addMessage({role:`assistant`,content:`Provider fallback: \`${n}\` returned ${t.status}; switching to \`${r}\`${t.providerSwitched?` with provider change`:``}.`}),M.warn(`Fallback to ${r}`);let i=se.getState().pending;i&&i.from.providerId===t.from.providerId&&i.from.model===t.from.model&&(typeof t.requestId==`string`&&t.requestId.length>0&&i.requestId!==t.requestId||se.getState().clear())}function cr(e){if(!f(e))return;let t=e.payload;se.getState().setPending({requestId:t.requestId,from:t.from,status:t.status,candidates:t.candidates,autoSwitchSeconds:t.autoSwitchSeconds,timestamp:Date.now()})}function lr(e){let t=e.payload;k.getState().update({providerId:t.providerId,model:t.model,state:t.newState,reason:t.reason,updatedAt:t.timestamp,stateExpiresAt:t.stateExpiresAt});let n=`${t.providerId}/${t.model}`;t.newState===`blocked`&&t.oldState!==`blocked`?M.warn(`${n} entered the limit-reset waiting room`):t.newState===`healthy`&&t.oldState!==`healthy`&&M.success(`${n} recovered and rejoined model routing`)}function ur(e){let t=e.payload;if(t&&typeof t==`object`&&`error`in t){k.getState().setError(`Provider status tracking not available`);return}k.getState().applySnapshot(t)}function dr(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:`Waiting room skipped \`${t.providerId}/${t.model}\`. ${t.lastError}`})}function fr(e){if(!f(e))return;u(e);let t=e.payload;M.warn(`Provider stream event skipped: ${t.eventType}`),a.getState().addMessage({role:`assistant`,content:`Provider stream warning (${t.eventType}): ${t.message}`,isError:!0})}function pr(e){if(!f(e))return;u(e);let t=e.payload,n=t.tools||t.kind||`assistant response`;if(t.action===`steer`){M.info(`Possible repetition noticed for ${n}; changing approach.`);return}a.getState().addMessage({role:`assistant`,content:`Loop guard stopped the turn: ${n} made no progress ${t.repeatCount} time(s) (iteration ${t.iteration+1}).`,isError:!0}),M.warn(`Loop guard stopped the turn`)}function mr(e){if(!f(e))return;u(e);let t=e.payload,n=tr(t.task,180),r=t.subagentId??t.target;a.getState().addMessage({role:`assistant`,content:`Delegating to \`${t.target}\`: ${n}`});let i=S.getState();i.applyEvent({kind:`spawned`,subagentId:r,name:t.target,description:n}),i.applyEvent({kind:`task_started`,subagentId:r,name:t.target,description:n}),i.pushAgentTimelineEntry({subagentId:r,agentName:t.target,content:n,kind:`status`,iteration:0,ts:new Date().toISOString(),status:`delegating`})}function hr(e){if(!f(e))return;u(e);let t=e.payload,n=Math.max(0,Math.round(t.durationMs/100)/10),r=typeof t.costUsd==`number`&&t.costUsd>0?` · $${t.costUsd.toFixed(4)}`:``,i=`${t.iterations} iteration(s), ${t.toolCalls} tool call(s), ${n}s${r}`;a.getState().addMessage({role:`assistant`,content:[`Delegate ${t.ok?`completed`:`failed`} for \`${t.target}\`${t.status?` (${t.status})`:``}.`,t.summary,i].join(`
18
18
  `),isError:!t.ok});let o=S.getState(),s=t.subagentId??t.target;o.applyEvent({kind:`task_completed`,subagentId:s,name:t.target,status:t.ok?`success`:t.status===`timeout`||t.status===`host_timeout`?`timeout`:`failed`,iterations:t.iterations,toolCalls:t.toolCalls,finalText:t.summary,...t.ok?{}:{failureReason:t.status??`failed`}}),o.pushAgentTimelineEntry({subagentId:s,agentName:t.target,content:t.summary,kind:t.ok?`status`:`error`,iteration:t.iterations,ts:new Date().toISOString(),status:t.status??(t.ok?`completed`:`failed`)}),t.ok||M.warn(`Delegate failed: ${t.target}`)}function gr(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:`Session ${t.sessionId} is damaged: ${t.detail}`,isError:!0}),M.error(`Session damage detected`)}function _r(e){if(!f(e))return;let t=e.payload;a.getState().addMessage({role:`assistant`,content:`Session rewound to prompt #${t.toPromptIndex}. Removed ${t.removedEvents} event(s); reverted ${t.revertedFiles.length} file(s).`}),M.info(`Session rewound`)}function vr(e){if(!f(e))return;let t=e.payload;M.success(`Checkpoint #${t.promptIndex} written (${t.fileCount} file(s))`)}function yr(e){if(!f(e))return;let t=e.payload;h.getState().pushEvent({id:`inflight_${Date.now()}`,kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:`In-flight: ${t.context}`,magnitude:1,data:t,raw:e.payload,flowGroup:`session`})}function br(e){f(e)&&e.payload.reason===`recovered`&&M.info(`Recovered previous in-flight operation`)}function xr(){typeof document<`u`&&document.dispatchEvent(new CustomEvent(`chat:session-end`))}function Sr(e){let t=e.payload;oe.getState().setEntries(t.sessions??[],t.error??null)}var Cr={"context.debug":jn,"key.operation_result":Mn,"model.switch_result":Nn,"context.compacted":Pn,"compaction.failed":Fn,"provider.response":nr,"iteration.completed":rr,"iteration.limit_reached":ir,"provider.retry":ar,"provider.error":or,"provider.fallback":sr,"provider.fallback_pending":cr,"provider.status_changed":lr,"provider.active_blocked":dr,"provider.stream_error":fr,"tool.loop_detected":pr,"delegate.started":mr,"delegate.completed":hr,"trust.persisted":In,"context.repaired":Ln,"ctx.pct":Rn,"ctx.max_context":zn,"token.threshold":Bn,"token.cost_estimate_unavailable":Vn,"session.end":xr,"session.damaged":gr,"session.rewound":_r,"checkpoint.written":vr,"in_flight.started":yr,"in_flight.ended":br,"context.modes.list":Hn,"context.mode.changed":Un,"sessions.list":Sr,"provider.status.snapshot":ur,error:Wn};function wr(e){let t=e.payload;a.getState().addMessage({role:`assistant`,content:[`🛠️ **Registered tools** (${t.tools.length})`,``,...t.tools.map(e=>`• \`${e.name}\`${e.params.length?` (${e.params.join(`, `)})`:``} — ${e.description||`_no description_`}`)].join(`
@@ -26,4 +26,4 @@ _empty — nothing remembered yet_`})}function Er(e){let t=e.payload,n=a.getStat
26
26
  _disabled (config.features.skills = false)_`});return}let n=[`🎯 **Skills** (${t.skills.length})`,``,...t.skills.length===0?[`_none registered_`]:t.skills.map(e=>`• \`${e.name}\`${e.version?` v${e.version}`:``} _(${e.source})_ — ${e.description||e.trigger||`_no description_`}`)];t.error&&n.push(``,`⚠ ${t.error}`),a.getState().addMessage({role:`assistant`,content:n.join(`
27
27
  `)})}function Fr(e){if(!f(e))return;let t=e.payload;_.getState().setDroppedTools((t.maxTools??0)>0?t.droppedTools??0:0),a.getState().addMessage({role:`assistant`,content:[`🩺 **Runtime diagnostics**`,``,`**Provider:** \`${t.provider}\` / \`${t.model}\``,`**Mode:** \`${t.mode}\``,`**Session:** \`${t.sessionId}\``,`**CWD:** \`${t.cwd}\``,``,`**Tools:** ${t.tools.count}`,`**Messages:** ${t.messages} · **Todos:** ${t.todos}`,`**Usage:** ${t.usage.input.toLocaleString()} in · ${t.usage.output.toLocaleString()} out${t.usage.cacheRead?` · ${t.usage.cacheRead.toLocaleString()} cache`:``}`,``,`**Features:** memory=${t.features.memory?`✓`:`✗`} · skills=${t.features.skills?`✓`:`✗`} · modelsRegistry=${t.features.modelsRegistry?`✓`:`✗`}`].join(`
28
28
  `)})}function Ir(e){if(!f(e))return;let t=e.payload,n=Math.floor(t.elapsedMs/1e3),r=n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m ${n%60}s`:`${Math.floor(n/3600)}h ${Math.floor(n%3600/60)}m`,i=_.getState().lastInputTokens,o=t.currentRequest?.cacheRead??0;_.getState().setCacheStats(t.cache?{readTokens:t.cache.readTokens,writeTokens:t.cache.writeTokens,hitRatio:t.cache.hitRatio,coverageTokens:Math.max(0,Math.min(i,o))}:null),a.getState().addMessage({role:`assistant`,content:[`📈 **Session stats**`,``,`**Session:** \`${t.sessionId}\``,`**Provider/Model:** \`${t.provider}\` / \`${t.model}\``,`**Elapsed:** ${r}`,``,`**Usage:** ${t.usage.input.toLocaleString()} in · ${t.usage.output.toLocaleString()} out`,...t.cache&&t.cache.readTokens>0?[`**Cache:** ${t.cache.readTokens.toLocaleString()} read · ${t.cache.writeTokens.toLocaleString()} write · hit ratio ${(t.cache.hitRatio*100).toFixed(1)}%`]:[],`**Cost:** ${t.cost.toFixed(4)}`,``,`**Messages:** ${t.messages} · **Files read:** ${t.readFiles} · **Tools available:** ${t.tools}`,...t.sideEffectCount?[`**Side effects:** ⚠ ${t.sideEffectCount}`]:[]].join(`
29
- `)})}function Lr(e){if(!f(e))return;let t=e.payload;_.getState().setTodos(t.todos??[])}function Rr(e){let t=e.payload;_.getState().setModes(t.modes.map(e=>({id:e.id,name:e.name,description:e.description}))),_.getState().setEnv({mode:t.activeId})}function $(e){le.getState().handleResult(e.type,e.payload)}var zr={...We,...Cr,...Lt,...wt,...bn,...tt,...On,"config.doctor.result":Er,"session.start":e=>{er(e),J()},"specs.list":e=>{let t=e.payload;te.getState().setSpecs(t.specs??[])},"specs.detail":e=>{te.getState().setDetail(e.payload)},"sdd.board.snapshot":e=>{re.getState().setSnapshot(e.payload)},"sdd.board.list":e=>{let t=e.payload;re.getState().setBoards(t.boards??[])},"sdd.board.lifecycle_result":e=>{let t=e.payload,n=re.getState();n.setLifecycleResult({...t,at:Date.now()}),n.setDestroying(!1),t.op===`destroy`&&t.ok&&D.getState().reset()},"sdd.spec.snapshot":e=>{D.getState().setSnapshot(e.payload)},"sdd.spec.agent_text":e=>{D.getState().setAgentText(e.payload.text??``)},"sdd.spec.error":e=>{D.getState().setError(e.payload.message??`Error`)},"sdd.run.started":e=>{D.getState().setStartedRunId(e.payload.runId??null)},"goal.assess.result":e=>{let t=e.payload;ue.getState().setResult({realistic:t.realistic,durationClaimed:t.durationClaimed,explanation:t.explanation,recommendedDuration:t.recommendedDuration,concerns:t.concerns,parseFailed:t.parseFailed,parseError:t.parseError,reqSeq:t.reqSeq??0})},"kanban.list":$,"kanban.get":$,"kanban.health":$,"kanban.workbench":$,"kanban.create":$,"kanban.duplicate":$,"kanban.update":$,"kanban.delete":$,"kanban.generate":$,"kanban.snapshot":$,"kanban.taskgraph.export":$,"kanban.taskgraph.sync":$,"kanban.task.ready":$,"kanban.task.add":$,"kanban.task.split":$,"kanban.task.merge":$,"kanban.task.update":$,"kanban.task.move":$,"kanban.task.copy":$,"kanban.task.transfer":$,"kanban.task.transition":$,"kanban.task.chain":$,"kanban.task.chain.get":$,"kanban.task.claim":$,"kanban.task.release":$,"kanban.task.metric.add":$,"kanban.task.metric.update":$,"kanban.task.check.add":$,"kanban.task.check.update":$,"kanban.task.note.add":$,"kanban.task.assign":$,"kanban.task.dispatch":$,"kanban.task.remove":$,"kanban.task.get":$,"kanban.board.history":$,"kanban.run.start":$,"kanban.supervisor.status":$,"kanban.supervisor.audit":$,"kanban.task.verify":$,"kanban.task.verification_started":$,"kanban.task.verification_completed":$,"kanban.decomposition.approve":$,"kanban.decomposition.reject":$,"kanban.decomposition.resolved":$,"kanban.decomposition.applied":$,"tools.list":wr,"memory.list":Tr,"memory.sage.list":Dr,"memory.sage.get":Or,"memory.sage.update":kr,"memory.sage.remember":Ar,"memory.sage.recover":jr,"memory.sage.candidateResolve":Mr,"memory.sage.backfillRecoverable":Nr,"skills.list":Pr,"diag.get":Fr,"stats.get":Ir,side_effects:e=>{if(!f(e))return;let t=e.payload;ce.getState().setSideEffects(t.sideEffects??[])},"todos.updated":Lr,"todos.cleared":e=>{f(e)&&_.getState().setTodos([])},"agent.timeline.message":e=>{if(!f(e))return;let t=e.payload;S.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.content,kind:t.kind,iteration:t.iteration,ts:t.ts,toolName:t.toolName,toolOk:t.toolOk,costUsd:t.costUsd})},"agent.status_changed":e=>{if(!f(e))return;let t=e.payload;S.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.summary??t.status,kind:`status`,iteration:0,ts:t.ts,status:t.status})},"tasks.updated":e=>{},"plan.updated":e=>{},"modes.list":Rr,"session.checkpoints":e=>{},"process.list":e=>{},"projects.list":e=>{},"projects.added":e=>{},"projects.selected":e=>{},"tool.disabled":e=>{},"tool.enabled":e=>{},"provider.response":e=>{nr(e)},"tool.progress":e=>{Ye(e);let t=y(e),n=v.getState();for(let e of t)n.recordFileEvent(e)},"tool.started":e=>{Je(e);let t=y(e);t.length>0&&v.getState().startActivities(t)},"tool.executed":e=>{Xe(e);let t=e.payload;t.id&&v.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.tool_started":e=>{u(e);let t=y(e);t.length>0&&v.getState().startActivities(t)},"codemap.tool_executed":e=>{u(e);let t=e.payload;t.id&&v.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.file_event":e=>{let t=y(e),n=v.getState();for(let e of t)n.recordFileEvent(e)},"codemap.index_updated":e=>{let t=e.payload;he.getState().notifyIndexUpdated(t?.at)},"file.saved":e=>{let t=y(e);if(t.length>0){let e=v.getState();for(let n of t)e.recordFileEvent(n)}},"memory.event":e=>{cn(e);let t=y(e);if(t.length>0){let e=v.getState();for(let n of t)e.recordActivity(n)}}};function Br(e){let t=[];for(let[n,r]of Object.entries(zr))r&&t.push(e.on(n,t=>{e.consumeSuppressedChatEcho(n)||r(t)}));return()=>{for(let e of t)e()}}function Vr(){let{autoConnect:e,wsUrl:t}=x(),n=x(e=>e.setWsStatus);(0,N.useEffect)(()=>{if(!e)return;Ee();let r=g(t),i=!1,a=r.onStatus(e=>{i||n(e)});r.connect().then(()=>{i||r.getPrefs()}).catch(e=>{i||console.warn(JSON.stringify({level:`warn`,event:`webui.ws_connection_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))});let o=Br(r);return()=>{i=!0,o(),a()}},[e,t,n])}function Hr(){let{wsUrl:e}=x(),t=g(e),n=(0,N.useCallback)((e,n,r=!1)=>t.isConnected?r?t.sendMessage(e,n,!0):t.sendMessage(e,n):null,[t]),r=(0,N.useCallback)(()=>t.sendAbort(),[t]),i=(0,N.useCallback)(e=>t.adviseTopic(e),[t]),a=(0,N.useCallback)(e=>t.sendMailboxMessage(e),[t]),{hideConfirm:o}=j(),s=(0,N.useCallback)((e,n)=>{t.sendConfirm(e,n),o()},[t,o]),c=(0,N.useCallback)((e,n)=>t.switchModel(e,n),[t]),l=(0,N.useCallback)(()=>t.listProviders(),[t]),u=(0,N.useCallback)(e=>t.listProviderModels(e),[t]),d=(0,N.useCallback)(()=>t.listSavedProviders(),[t]),f=(0,N.useCallback)((e,n,r)=>t.addKey(e,n,r),[t]),p=(0,N.useCallback)((e,n,r)=>t.updateKey(e,n,r),[t]),m=(0,N.useCallback)((e,n)=>t.deleteKey(e,n),[t]),h=(0,N.useCallback)((e,n)=>t.setActiveKey(e,n),[t]),_=(0,N.useCallback)((e,n,r,i,a,o)=>t.addProvider(e,n,r,i,a,o),[t]),v=(0,N.useCallback)(e=>t.removeProvider(e),[t]),y=(0,N.useCallback)(e=>{oe.getState().setLoading(!0),t.listSessions(e)},[t]),b=(0,N.useCallback)(e=>t.deleteSession(e),[t]),ee=(0,N.useCallback)((e,n)=>{oe.getState().updateEntryName(e,n),t.renameSession(e,n)},[t]),S=(0,N.useCallback)(e=>t.resumeSessionById(e),[t]),C=(0,N.useCallback)(e=>t.inspectSession(e),[t]),te=(0,N.useCallback)(()=>t.saveSession(),[t]),ne=(0,N.useCallback)(e=>t.listTools(e),[t]),re=(0,N.useCallback)(e=>t.listMemory(e),[t]),ie=(0,N.useCallback)(e=>t.listSageMemories(e),[t]),ae=(0,N.useCallback)((e,n)=>t.listSageMemoriesPage(e,n),[t]),w=(0,N.useCallback)((e,n)=>t.listMemoryCandidates(e,n),[t]),T=(0,N.useCallback)((e,n)=>t.getSage(e,n),[t]),se=(0,N.useCallback)((e,n,r)=>t.getSageGraph(e,n,r),[t]),ce=(0,N.useCallback)((e,n,r)=>t.updateSage(e,n,r),[t]),le=(0,N.useCallback)((e,n)=>t.deleteSage(e,n),[t]),E=(0,N.useCallback)((e,n)=>t.rememberSage(e,n),[t]),D=(0,N.useCallback)((e,n)=>t.findMemoriesForFile(e,n),[t]),O=(0,N.useCallback)((e,n)=>t.recoverSage(e,n),[t]),k=(0,N.useCallback)((e,n)=>t.resolveMemoryCandidate(e,n),[t]),ue=(0,N.useCallback)((e,n)=>t.backfillRecoverable(e,n),[t]),de=(0,N.useCallback)(e=>t.listSkills(e),[t]),A=(0,N.useCallback)(e=>t.getDiag(e),[t]),fe=(0,N.useCallback)(e=>t.getStats(e),[t]),pe=(0,N.useCallback)(()=>t.getPlan(),[t]),me=(0,N.useCallback)(()=>t.listModes(),[t]),he=(0,N.useCallback)(e=>t.switchMode(e),[t]),M=(0,N.useCallback)(()=>t.listContextModes(),[t]),ge=(0,N.useCallback)(e=>t.switchContextMode(e),[t]),P=(0,N.useCallback)(e=>t.createContextMode(e),[t]),F=(0,N.useCallback)((e,n)=>t.updateContextMode(e,n),[t]),I=(0,N.useCallback)(e=>t.deleteContextMode(e),[t]),L=(0,N.useCallback)(()=>t.repairContext(),[t]),_e=(0,N.useCallback)((e,n)=>t.refineModel(e,n),[t]),R=(0,N.useCallback)(e=>t.switchAutonomy(e),[t]),z=(0,N.useCallback)(e=>t.updatePrefs(e),[t]);return{client:t,sendMessage:n,adviseTopic:i,sendAbort:r,sendMailboxMessage:a,sendConfirm:s,switchModel:c,listProviders:l,listProviderModels:u,listSavedProviders:d,addKey:f,updateKey:p,deleteKey:m,setActiveKey:h,addProvider:_,removeProvider:v,listSessions:y,deleteSession:b,renameSession:ee,resumeSession:S,inspectSession:C,saveSession:te,listTools:ne,listMemory:re,listSageMemories:ie,listSageMemoriesPage:ae,listMemoryCandidates:w,getSage:T,getSageGraph:se,updateSage:ce,deleteSage:le,rememberSage:E,findMemoriesForFile:D,recoverSage:O,resolveMemoryCandidate:k,backfillRecoverable:ue,listSkills:de,getDiag:A,getStats:fe,getPlan:pe,listModes:me,switchMode:he,listContextModes:M,switchContextMode:ge,createContextMode:P,updateContextMode:F,deleteContextMode:I,repairContext:L,toggleGoalAutonomous:(0,N.useCallback)(e=>{t.send({type:`goal.toggleAutonomous`,payload:{autonomous:e}})},[t]),startGoal:(0,N.useCallback)((e,n,r=!0)=>{t.send({type:`goal.start`,payload:{title:e,phases:n,autonomous:r}})},[t]),pauseGoal:(0,N.useCallback)(()=>{t.send({type:`goal.pause`,payload:{}})},[t]),resumeGoal:(0,N.useCallback)(()=>{t.send({type:`goal.resume`,payload:{}})},[t]),stopGoal:(0,N.useCallback)(()=>{t.send({type:`goal.stop`,payload:{}})},[t]),selectGoal:(0,N.useCallback)(e=>{t.send({type:`goal.selectPhase`,payload:{phaseId:e}})},[t]),switchAutonomy:R,updatePrefs:z,refineModel:_e}}export{Wt as a,Le as c,Yt as i,Re as l,Vr as n,Be as o,Gn as r,H as s,Hr as t,P as u};
29
+ `)})}function Lr(e){if(!f(e))return;let t=e.payload;_.getState().setTodos(t.todos??[])}function Rr(e){let t=e.payload;_.getState().setModes(t.modes.map(e=>({id:e.id,name:e.name,description:e.description}))),_.getState().setEnv({mode:t.activeId})}function $(e){le.getState().handleResult(e.type,e.payload)}var zr={...Ue,...Cr,...Lt,...wt,...bn,...et,...On,"config.doctor.result":Er,"session.start":e=>{er(e),tt()},"specs.list":e=>{let t=e.payload;te.getState().setSpecs(t.specs??[])},"specs.detail":e=>{te.getState().setDetail(e.payload)},"sdd.board.snapshot":e=>{re.getState().setSnapshot(e.payload)},"sdd.board.list":e=>{let t=e.payload;re.getState().setBoards(t.boards??[])},"sdd.board.lifecycle_result":e=>{let t=e.payload,n=re.getState();n.setLifecycleResult({...t,at:Date.now()}),n.setDestroying(!1),t.op===`destroy`&&t.ok&&D.getState().reset()},"sdd.spec.snapshot":e=>{D.getState().setSnapshot(e.payload)},"sdd.spec.agent_text":e=>{D.getState().setAgentText(e.payload.text??``)},"sdd.spec.error":e=>{D.getState().setError(e.payload.message??`Error`)},"sdd.run.started":e=>{D.getState().setStartedRunId(e.payload.runId??null)},"goal.assess.result":e=>{let t=e.payload;ue.getState().setResult({realistic:t.realistic,durationClaimed:t.durationClaimed,explanation:t.explanation,recommendedDuration:t.recommendedDuration,concerns:t.concerns,parseFailed:t.parseFailed,parseError:t.parseError,reqSeq:t.reqSeq??0})},"kanban.list":$,"kanban.get":$,"kanban.health":$,"kanban.workbench":$,"kanban.create":$,"kanban.duplicate":$,"kanban.update":$,"kanban.delete":$,"kanban.generate":$,"kanban.snapshot":$,"kanban.taskgraph.export":$,"kanban.taskgraph.sync":$,"kanban.task.ready":$,"kanban.task.add":$,"kanban.task.split":$,"kanban.task.merge":$,"kanban.task.update":$,"kanban.task.move":$,"kanban.task.copy":$,"kanban.task.transfer":$,"kanban.task.transition":$,"kanban.task.chain":$,"kanban.task.chain.get":$,"kanban.task.claim":$,"kanban.task.release":$,"kanban.task.metric.add":$,"kanban.task.metric.update":$,"kanban.task.check.add":$,"kanban.task.check.update":$,"kanban.task.note.add":$,"kanban.task.assign":$,"kanban.task.dispatch":$,"kanban.task.remove":$,"kanban.task.get":$,"kanban.board.history":$,"kanban.run.start":$,"kanban.supervisor.status":$,"kanban.supervisor.audit":$,"kanban.task.verify":$,"kanban.task.verification_started":$,"kanban.task.verification_completed":$,"kanban.decomposition.approve":$,"kanban.decomposition.reject":$,"kanban.decomposition.resolved":$,"kanban.decomposition.applied":$,"tools.list":wr,"memory.list":Tr,"memory.sage.list":Dr,"memory.sage.get":Or,"memory.sage.update":kr,"memory.sage.remember":Ar,"memory.sage.recover":jr,"memory.sage.candidateResolve":Mr,"memory.sage.backfillRecoverable":Nr,"skills.list":Pr,"diag.get":Fr,"stats.get":Ir,side_effects:e=>{if(!f(e))return;let t=e.payload;ce.getState().setSideEffects(t.sideEffects??[])},"todos.updated":Lr,"todos.cleared":e=>{f(e)&&_.getState().setTodos([])},"agent.timeline.message":e=>{if(!f(e))return;let t=e.payload;S.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.content,kind:t.kind,iteration:t.iteration,ts:t.ts,toolName:t.toolName,toolOk:t.toolOk,costUsd:t.costUsd})},"agent.status_changed":e=>{if(!f(e))return;let t=e.payload;S.getState().pushAgentTimelineEntry({subagentId:t.subagentId,agentName:t.agentName,content:t.summary??t.status,kind:`status`,iteration:0,ts:t.ts,status:t.status})},"tasks.updated":e=>{},"plan.updated":e=>{},"modes.list":Rr,"session.checkpoints":e=>{},"process.list":e=>{},"projects.list":e=>{},"projects.added":e=>{},"projects.selected":e=>{},"tool.disabled":e=>{},"tool.enabled":e=>{},"provider.response":e=>{nr(e)},"tool.progress":e=>{Je(e);let t=y(e),n=v.getState();for(let e of t)n.recordFileEvent(e)},"tool.started":e=>{qe(e);let t=y(e);t.length>0&&v.getState().startActivities(t)},"tool.executed":e=>{Ye(e);let t=e.payload;t.id&&v.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.tool_started":e=>{u(e);let t=y(e);t.length>0&&v.getState().startActivities(t)},"codemap.tool_executed":e=>{u(e);let t=e.payload;t.id&&v.getState().finishTool(t.id,{durationMs:t.durationMs,ok:t.ok!==!1})},"codemap.file_event":e=>{let t=y(e),n=v.getState();for(let e of t)n.recordFileEvent(e)},"codemap.index_updated":e=>{let t=e.payload;he.getState().notifyIndexUpdated(t?.at)},"file.saved":e=>{let t=y(e);if(t.length>0){let e=v.getState();for(let n of t)e.recordFileEvent(n)}},"memory.event":e=>{cn(e);let t=y(e);if(t.length>0){let e=v.getState();for(let n of t)e.recordActivity(n)}}};function Br(e){let t=[];for(let[n,r]of Object.entries(zr))r&&t.push(e.on(n,t=>{e.consumeSuppressedChatEcho(n)||r(t)}));return()=>{for(let e of t)e()}}function Vr(){let{autoConnect:e,wsUrl:t}=x(),n=x(e=>e.setWsStatus);(0,N.useEffect)(()=>{if(!e)return;Te();let r=g(t),i=!1,a=r.onStatus(e=>{i||n(e)});r.connect().then(()=>{i||r.getPrefs()}).catch(e=>{i||console.warn(JSON.stringify({level:`warn`,event:`webui.ws_connection_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))});let o=Br(r);return()=>{i=!0,o(),a()}},[e,t,n])}function Hr(){let{wsUrl:e}=x(),t=g(e),n=(0,N.useCallback)((e,n,r=!1)=>t.isConnected?r?t.sendMessage(e,n,!0):t.sendMessage(e,n):null,[t]),r=(0,N.useCallback)(()=>t.sendAbort(),[t]),i=(0,N.useCallback)(e=>t.adviseTopic(e),[t]),a=(0,N.useCallback)(e=>t.sendMailboxMessage(e),[t]),{hideConfirm:o}=j(),s=(0,N.useCallback)((e,n)=>{t.sendConfirm(e,n),o()},[t,o]),c=(0,N.useCallback)((e,n)=>t.switchModel(e,n),[t]),l=(0,N.useCallback)(()=>t.listProviders(),[t]),u=(0,N.useCallback)(e=>t.listProviderModels(e),[t]),d=(0,N.useCallback)(()=>t.listSavedProviders(),[t]),f=(0,N.useCallback)((e,n,r)=>t.addKey(e,n,r),[t]),p=(0,N.useCallback)((e,n,r)=>t.updateKey(e,n,r),[t]),m=(0,N.useCallback)((e,n)=>t.deleteKey(e,n),[t]),h=(0,N.useCallback)((e,n)=>t.setActiveKey(e,n),[t]),_=(0,N.useCallback)((e,n,r,i,a,o)=>t.addProvider(e,n,r,i,a,o),[t]),v=(0,N.useCallback)(e=>t.removeProvider(e),[t]),y=(0,N.useCallback)(e=>{oe.getState().setLoading(!0),t.listSessions(e)},[t]),b=(0,N.useCallback)(e=>t.deleteSession(e),[t]),ee=(0,N.useCallback)((e,n)=>{oe.getState().updateEntryName(e,n),t.renameSession(e,n)},[t]),S=(0,N.useCallback)(e=>t.resumeSessionById(e),[t]),C=(0,N.useCallback)(e=>t.inspectSession(e),[t]),te=(0,N.useCallback)(()=>t.saveSession(),[t]),ne=(0,N.useCallback)(e=>t.listTools(e),[t]),re=(0,N.useCallback)(e=>t.listMemory(e),[t]),ie=(0,N.useCallback)(e=>t.listSageMemories(e),[t]),ae=(0,N.useCallback)((e,n)=>t.listSageMemoriesPage(e,n),[t]),w=(0,N.useCallback)((e,n)=>t.searchSageBreakdown(e,n),[t]),T=(0,N.useCallback)((e,n)=>t.listMemoryCandidates(e,n),[t]),se=(0,N.useCallback)((e,n)=>t.getSage(e,n),[t]),ce=(0,N.useCallback)((e,n,r)=>t.getSageGraph(e,n,r),[t]),le=(0,N.useCallback)((e,n,r)=>t.updateSage(e,n,r),[t]),E=(0,N.useCallback)((e,n)=>t.deleteSage(e,n),[t]),D=(0,N.useCallback)((e,n)=>t.rememberSage(e,n),[t]),O=(0,N.useCallback)((e,n)=>t.findMemoriesForFile(e,n),[t]),k=(0,N.useCallback)((e,n)=>t.recoverSage(e,n),[t]),ue=(0,N.useCallback)((e,n)=>t.resolveMemoryCandidate(e,n),[t]),de=(0,N.useCallback)((e,n)=>t.backfillRecoverable(e,n),[t]),A=(0,N.useCallback)(e=>t.listSkills(e),[t]),fe=(0,N.useCallback)(e=>t.getDiag(e),[t]),pe=(0,N.useCallback)(e=>t.getStats(e),[t]),me=(0,N.useCallback)(()=>t.getPlan(),[t]),he=(0,N.useCallback)(()=>t.listModes(),[t]),M=(0,N.useCallback)(e=>t.switchMode(e),[t]),ge=(0,N.useCallback)(()=>t.listContextModes(),[t]),P=(0,N.useCallback)(e=>t.switchContextMode(e),[t]),F=(0,N.useCallback)(e=>t.createContextMode(e),[t]),I=(0,N.useCallback)((e,n)=>t.updateContextMode(e,n),[t]),L=(0,N.useCallback)(e=>t.deleteContextMode(e),[t]),_e=(0,N.useCallback)(()=>t.repairContext(),[t]),R=(0,N.useCallback)((e,n)=>t.refineModel(e,n),[t]),z=(0,N.useCallback)(e=>t.switchAutonomy(e),[t]),B=(0,N.useCallback)(e=>t.updatePrefs(e),[t]);return{client:t,sendMessage:n,adviseTopic:i,sendAbort:r,sendMailboxMessage:a,sendConfirm:s,switchModel:c,listProviders:l,listProviderModels:u,listSavedProviders:d,addKey:f,updateKey:p,deleteKey:m,setActiveKey:h,addProvider:_,removeProvider:v,listSessions:y,deleteSession:b,renameSession:ee,resumeSession:S,inspectSession:C,saveSession:te,listTools:ne,listMemory:re,listSageMemories:ie,listSageMemoriesPage:ae,searchSageBreakdown:w,listMemoryCandidates:T,getSage:se,getSageGraph:ce,updateSage:le,deleteSage:E,rememberSage:D,findMemoriesForFile:O,recoverSage:k,resolveMemoryCandidate:ue,backfillRecoverable:de,listSkills:A,getDiag:fe,getStats:pe,getPlan:me,listModes:he,switchMode:M,listContextModes:ge,switchContextMode:P,createContextMode:F,updateContextMode:I,deleteContextMode:L,repairContext:_e,toggleGoalAutonomous:(0,N.useCallback)(e=>{t.send({type:`goal.toggleAutonomous`,payload:{autonomous:e}})},[t]),startGoal:(0,N.useCallback)((e,n,r=!0)=>{t.send({type:`goal.start`,payload:{title:e,phases:n,autonomous:r}})},[t]),pauseGoal:(0,N.useCallback)(()=>{t.send({type:`goal.pause`,payload:{}})},[t]),resumeGoal:(0,N.useCallback)(()=>{t.send({type:`goal.resume`,payload:{}})},[t]),stopGoal:(0,N.useCallback)(()=>{t.send({type:`goal.stop`,payload:{}})},[t]),selectGoal:(0,N.useCallback)(e=>{t.send({type:`goal.selectPhase`,payload:{phaseId:e}})},[t]),switchAutonomy:z,updatePrefs:B,refineModel:R}}export{Wt as a,Ie as c,Yt as i,Le as l,Vr as n,ze as o,Gn as r,U as s,Hr as t,P as u};