@wrongstack/webui-server 0.299.0 → 0.301.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- export declare const CLIENT_CONVERSATION_MESSAGE_TYPES: readonly ['abort', 'ping', 'user_message', 'tool.confirm_result', 'completion.request', 'model.switch', 'model.refine', 'autonomy.switch', 'context.clear', 'context.compact', 'context.debug', 'context.editor.open', 'context.editor.validate', 'context.editor.apply', 'context.mode.create', 'context.mode.delete', 'context.mode.switch', 'context.mode.update', 'context.modes.list', 'context.repair', 'mode.switch', 'modes.list', 'session.checkpoints', 'session.delete', 'session.inspect', 'session.new', 'session.rename', 'session.resume', 'session.rewind', 'session.save', 'sessions.list', 'side_effects.list', 'stats.get', 'todo.update', 'todos.clear', 'todos.get', 'todos.remove'];
1
+ export declare const CLIENT_CONVERSATION_MESSAGE_TYPES: readonly ['abort', 'ping', 'user_message', 'tool.confirm_result', 'topic.advice', 'completion.request', 'model.switch', 'model.refine', 'model.fallback_choice', 'autonomy.switch', 'context.clear', 'context.compact', 'context.debug', 'context.editor.open', 'context.editor.validate', 'context.editor.apply', 'context.mode.create', 'context.mode.delete', 'context.mode.switch', 'context.mode.update', 'context.modes.list', 'context.repair', 'mode.switch', 'modes.list', 'session.checkpoints', 'session.delete', 'session.inspect', 'session.new', 'session.rename', 'session.resume', 'session.rewind', 'session.save', 'sessions.list', 'side_effects.list', 'stats.get', 'todo.update', 'todos.clear', 'todos.get', 'todos.remove'];
2
2
  export declare const CLIENT_COLLABORATION_MESSAGE_TYPES: readonly ['collab.join', 'collab.leave', 'collab.annotate', 'collab.resolve', 'collab.request_pause', 'collab.resume', 'collab.grant_control', 'collab.inject_tool', 'mailbox.action', 'mailbox.agents', 'mailbox.clear', 'mailbox.compact', 'mailbox.messages', 'mailbox.purge', 'mailbox.send'];
3
3
  //# sourceMappingURL=client-conversation.d.ts.map
@@ -67,9 +67,11 @@ var CLIENT_CONVERSATION_MESSAGE_TYPES = [
67
67
  "ping",
68
68
  "user_message",
69
69
  "tool.confirm_result",
70
+ "topic.advice",
70
71
  "completion.request",
71
72
  "model.switch",
72
73
  "model.refine",
74
+ "model.fallback_choice",
73
75
  "autonomy.switch",
74
76
  "context.clear",
75
77
  "context.compact",
@@ -341,6 +343,7 @@ var SERVER_CONVERSATION_MESSAGE_TYPES = [
341
343
  "provider.active_blocked",
342
344
  "provider.error",
343
345
  "provider.fallback",
346
+ "provider.fallback_pending",
344
347
  "provider.response",
345
348
  "provider.retry",
346
349
  "provider.status_changed",
@@ -367,6 +370,7 @@ var SERVER_CONVERSATION_MESSAGE_TYPES = [
367
370
  "tool.loop_detected",
368
371
  "tool.progress",
369
372
  "tool.started",
373
+ "topic.advice_result",
370
374
  "tools.list",
371
375
  "trust.persisted"
372
376
  ];
@@ -382,6 +386,7 @@ var SERVER_COLLABORATION_MESSAGE_TYPES = [
382
386
  "collab.state",
383
387
  "mailbox.action_result",
384
388
  "mailbox.agent_registered",
389
+ "mailbox.agent_deregistered",
385
390
  "mailbox.agents",
386
391
  "mailbox.cleared",
387
392
  "mailbox.compacted",
@@ -761,6 +766,13 @@ function projectToolMessage(message) {
761
766
  }
762
767
  return null;
763
768
  }
769
+ function optionalFinite(value) {
770
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
771
+ return value;
772
+ }
773
+ function optionalString(value) {
774
+ return typeof value === "string" && value.length > 0 ? value : void 0;
775
+ }
764
776
  function projectFleetMessage(message) {
765
777
  const payload = record(message.payload);
766
778
  if (!payload) return null;
@@ -769,7 +781,15 @@ function projectFleetMessage(message) {
769
781
  return {
770
782
  kind: "concurrency",
771
783
  active: finite(payload["fleetConcurrency"]),
772
- maximum: finite(payload["fleetConcurrencyMax"])
784
+ maximum: finite(payload["fleetConcurrencyMax"]),
785
+ maxSpawns: optionalFinite(payload["maxSpawns"]),
786
+ usedSpawns: optionalFinite(payload["usedSpawns"]),
787
+ remainingSpawns: optionalFinite(payload["remainingSpawns"]),
788
+ maxSpawnsSource: optionalString(payload["maxSpawnsSource"]),
789
+ maxConcurrentSource: optionalString(payload["maxConcurrentSource"]),
790
+ effectiveSource: optionalString(payload["effectiveSource"]),
791
+ checkpointMaxSpawns: optionalFinite(payload["checkpointMaxSpawns"]),
792
+ ceilingMismatch: payload["ceilingMismatch"] === true ? true : void 0
773
793
  };
774
794
  case "client.status_update":
775
795
  return { kind: "client-status", status: payload };
@@ -860,6 +880,8 @@ var SURFACE_PROTOCOL_CAPABILITIES = [
860
880
  "chronicle.metrics",
861
881
  "chronicle.status",
862
882
  "connections.health",
883
+ /** Bounded topic-shift advice plus same-session provider-context boundaries. */
884
+ "context.topic-boundary",
863
885
  /** Interview resume/discard + lastAgentText/lastRunId continuity. */
864
886
  "sdd.interview.continuity",
865
887
  /** Launch multi-agent runs from a graph id or resolved spec id. */
@@ -70,6 +70,14 @@ export type FleetProjection = {
70
70
  kind: 'concurrency';
71
71
  active: number;
72
72
  maximum: number;
73
+ maxSpawns?: number | undefined;
74
+ usedSpawns?: number | undefined;
75
+ remainingSpawns?: number | undefined;
76
+ maxSpawnsSource?: string | undefined;
77
+ maxConcurrentSource?: string | undefined;
78
+ effectiveSource?: string | undefined;
79
+ checkpointMaxSpawns?: number | undefined;
80
+ ceilingMismatch?: boolean | undefined;
73
81
  } | {
74
82
  kind: 'client-status';
75
83
  status: Record<string, unknown>;
@@ -1,5 +1,5 @@
1
- export declare const CLIENT_MESSAGE_TYPES: readonly ["abort", "ping", "user_message", "tool.confirm_result", "completion.request", "model.switch", "model.refine", "autonomy.switch", "context.clear", "context.compact", "context.debug", "context.editor.open", "context.editor.validate", "context.editor.apply", "context.mode.create", "context.mode.delete", "context.mode.switch", "context.mode.update", "context.modes.list", "context.repair", "mode.switch", "modes.list", "session.checkpoints", "session.delete", "session.inspect", "session.new", "session.rename", "session.resume", "session.rewind", "session.save", "sessions.list", "side_effects.list", "stats.get", "todo.update", "todos.clear", "todos.get", "todos.remove", "collab.join", "collab.leave", "collab.annotate", "collab.resolve", "collab.request_pause", "collab.resume", "collab.grant_control", "collab.inject_tool", "mailbox.action", "mailbox.agents", "mailbox.clear", "mailbox.compact", "mailbox.messages", "mailbox.purge", "mailbox.send", "files.list", "files.read", "files.tree", "files.write", "git.changes", "git.diff", "git.info", "projects.add", "projects.list", "projects.select", "working_dir.set", "worktree.cleanup", "worktree.diff", "worktree.merge", "worktree.remove", "worktree.scan", "shell.open", "process.kill", "process.killAll", "process.list", "terminal.close", "terminal.create", "terminal.input", "terminal.resize", "codebase.index.server.shutdown", "connections.health", "connections.service_action", "diag.get", "key.add", "key.delete", "key.set_active", "key.update", "prefs.get", "prefs.update", "provider.add", "provider.clear_models", "provider.custom_models.remove", "provider.custom_models.set", "provider.models", "provider.models.search", "provider.probe", "provider.remove", "provider.status.clear", "provider.status.get", "provider.status.retry", "provider.undo_clear", "provider.update", "providers.list", "providers.saved", "tool.disable", "tool.enable", "tools.list", "webui.shutdown", "goal-state.get", "goal.addTask", "goal.assess", "goal.assignTask", "goal.clear", "goal.get", "goal.list", "goal.load", "goal.moveTask", "goal.pause", "goal.resume", "goal.retryTask", "goal.revert", "goal.runTask", "goal.save", "goal.selectPhase", "goal.start", "goal.state", "goal.status", "goal.stop", "goal.taskStatus", "goal.toggleAutonomous", "plan.get", "plan.item.update", "plan.template_use", "task.update", "tasks.get", "sdd.board.cancel_task", "sdd.board.cleanup_worktrees", "sdd.board.delete_task", "sdd.board.destroy", "sdd.board.get", "sdd.board.list", "sdd.board.pause", "sdd.board.reassign", "sdd.board.resume", "sdd.board.retry", "sdd.board.retry_all_failed", "sdd.board.rollback", "sdd.board.set_task_fallbacks", "sdd.board.set_task_model", "sdd.board.set_task_verification", "sdd.board.split_task", "sdd.board.stop", "sdd.run.from_graph", "sdd.run.from_spec", "sdd.run.start", "sdd.spec.approve", "sdd.spec.discard", "sdd.spec.get", "sdd.spec.message", "sdd.spec.start", "specs.get", "specs.list", "specs.taskStatus", "brain.ask", "brain.config.get", "brain.config.set", "brain.risk", "brain.status", "chronicle.facet", "chronicle.facets", "chronicle.graph", "chronicle.metrics", "chronicle.query", "chronicle.status", "config.doctor", "design.list", "design.materialize", "design.set", "design.state", "design.swap", "design.tune", "design.use", "design.verify", "memory.list", "memory.sage.backfillRecoverable", "memory.sage.candidateResolve", "memory.sage.delete", "memory.sage.forFile", "memory.sage.get", "memory.sage.graph", "memory.sage.list", "memory.sage.listPage", "memory.sage.recover", "memory.sage.remember", "memory.sage.update", "auth.oauth.cancel", "auth.oauth.code", "auth.oauth.start", "mcp.add", "mcp.disable", "mcp.discover", "mcp.enable", "mcp.list", "mcp.prompt.get", "mcp.prompts", "mcp.remove", "mcp.resource.read", "mcp.resources", "mcp.restart", "mcp.sleep", "mcp.update", "mcp.wake", "prompts.content", "prompts.create", "prompts.favorite", "prompts.list", "prompts.recent", "prompts.search", "prompts.used", "skills.content", "skills.create", "skills.edit", "skills.export", "skills.install", "skills.list", "skills.uninstall", "skills.update"];
2
- export declare const SERVER_MESSAGE_TYPES: readonly ["error", "log", "pong", "side_effects", "agent.status_changed", "agent.timeline.message", "client.status_update", "chimera.report_available", "compaction.failed", "completion.result", "context.compacted", "context.debug", "context.editor.snapshot", "context.editor.validation", "context.editor.applied", "context.mode.changed", "context.modes.list", "context.repaired", "ctx.max_context", "ctx.pct", "delegate.completed", "delegate.started", "iteration.completed", "iteration.limit_reached", "iteration.started", "model.refine_result", "modes.list", "provider.active_blocked", "provider.error", "provider.fallback", "provider.response", "provider.retry", "provider.status_changed", "provider.stream_error", "provider.text_delta", "provider.thinking_delta", "run.result", "session.checkpoints", "session.damaged", "session.end", "session.inspect", "session.rewound", "session.start", "session.stats", "sessions.list", "sessions.status_update", "stats.get", "token.cost_estimate_unavailable", "token.threshold", "tool.confirm_needed", "tool.disabled", "tool.enabled", "tool.executed", "tool.loop_detected", "tool.progress", "tool.started", "tools.list", "trust.persisted", "collab.annotation.added", "collab.annotation.resolved", "collab.event", "collab.injection.granted", "collab.participant.joined", "collab.participant.left", "collab.pause.granted", "collab.pause.released", "collab.state", "mailbox.action_result", "mailbox.agent_registered", "mailbox.agents", "mailbox.cleared", "mailbox.compacted", "mailbox.event", "mailbox.messages", "mailbox.sent", "mailbox.purged", "mailbox.received", "subagent.budget_extended", "subagent.event", "checkpoint.written", "codemap.file_event", "codemap.index_updated", "codemap.tool_executed", "codemap.tool_started", "file.saved", "files.list", "files.read", "files.tree", "files.written", "git.changes", "git.diff", "git.info", "process.list", "projects.added", "projects.list", "projects.selected", "terminal.exit", "terminal.output", "working_dir.changed", "worktree.cleanup_result", "worktree.diff_result", "worktree.event", "worktree.merge_result", "worktree.orphans", "worktree.state", "auth.oauth.status", "codebase.index.server.shutdown_result", "connections.health_error", "connections.health_result", "connections.service_action_result", "diag.get", "key.operation_result", "model.switch_result", "prefs.updated", "provider.catalog", "provider.models", "provider.models.search_result", "provider.probe", "provider.status.snapshot", "providers.saved", "budget.decision", "budget.threshold_reached", "coordinator.stats", "coordinator.status", "eternal.iteration", "fleet.concurrency_update", "goal-state.updated", "goal.assess.result", "goal.list", "goal.paused", "goal.resumed", "goal.saved", "goal.error", "goal.stopped", "goal.failed", "goal.completed", "goal.cleared", "goal.reverted", "goal.progress", "goal.state", "in_flight.ended", "in_flight.started", "plan.updated", "task.completed", "task.failed", "task.pending", "task.started", "tasks.updated", "todos.cleared", "todos.updated", "kanban.task.activity", "sdd.board.lifecycle_result", "sdd.board.list", "sdd.board.snapshot", "sdd.run.started", "sdd.spec.agent_text", "sdd.spec.error", "sdd.spec.snapshot", "specs.detail", "specs.list", "consensus.vote_cast", "consensus.vote_initiated", "consensus.vote_resolved", "cron.job_fired", "cron.snapshot", "techstack.job.cancelled", "techstack.job.failed", "techstack.job.progress", "techstack.job.started", "techstack.report.delivered", "techstack.report.ready", "techstack.snapshot.updated", "techstack.workspace.completed", "brain.answer", "brain.config", "brain.event", "brain.status", "chronicle.error", "chronicle.facet_result", "chronicle.facets_result", "chronicle.graph_result", "chronicle.metrics_result", "chronicle.query_result", "chronicle.status_result", "config.doctor.result", "design.list", "design.materialize", "design.set", "design.state", "design.swap", "design.tune", "design.use", "design.verify", "memory.event", "memory.list", "memory.sage.backfillRecoverable", "memory.sage.candidateResolve", "memory.sage.delete", "memory.sage.forFile", "memory.sage.get", "memory.sage.graph", "memory.sage.list", "memory.sage.listPage", "memory.sage.recover", "memory.sage.remember", "memory.sage.update", "mcp.content.error", "mcp.content.selected", "mcp.list", "mcp.operation_result", "mcp.prompts", "mcp.resources", "mcp.server.added", "mcp.server.connected", "mcp.server.disconnected", "mcp.server.discovered", "mcp.server.error", "mcp.server.reconnected", "mcp.server.removed", "mcp.server.sleeping", "mcp.server.updated", "mcp.server.waking", "prompts.content", "prompts.created", "prompts.favorite", "prompts.list", "prompts.recent", "prompts.search", "prompts.used", "skills.content", "skills.created", "skills.edited", "skills.exported", "skills.installed", "skills.list", "skills.uninstalled", "skills.updated"];
1
+ export declare const CLIENT_MESSAGE_TYPES: readonly ["abort", "ping", "user_message", "tool.confirm_result", "topic.advice", "completion.request", "model.switch", "model.refine", "model.fallback_choice", "autonomy.switch", "context.clear", "context.compact", "context.debug", "context.editor.open", "context.editor.validate", "context.editor.apply", "context.mode.create", "context.mode.delete", "context.mode.switch", "context.mode.update", "context.modes.list", "context.repair", "mode.switch", "modes.list", "session.checkpoints", "session.delete", "session.inspect", "session.new", "session.rename", "session.resume", "session.rewind", "session.save", "sessions.list", "side_effects.list", "stats.get", "todo.update", "todos.clear", "todos.get", "todos.remove", "collab.join", "collab.leave", "collab.annotate", "collab.resolve", "collab.request_pause", "collab.resume", "collab.grant_control", "collab.inject_tool", "mailbox.action", "mailbox.agents", "mailbox.clear", "mailbox.compact", "mailbox.messages", "mailbox.purge", "mailbox.send", "files.list", "files.read", "files.tree", "files.write", "git.changes", "git.diff", "git.info", "projects.add", "projects.list", "projects.select", "working_dir.set", "worktree.cleanup", "worktree.diff", "worktree.merge", "worktree.remove", "worktree.scan", "shell.open", "process.kill", "process.killAll", "process.list", "terminal.close", "terminal.create", "terminal.input", "terminal.resize", "codebase.index.server.shutdown", "connections.health", "connections.service_action", "diag.get", "key.add", "key.delete", "key.set_active", "key.update", "prefs.get", "prefs.update", "provider.add", "provider.clear_models", "provider.custom_models.remove", "provider.custom_models.set", "provider.models", "provider.models.search", "provider.probe", "provider.remove", "provider.status.clear", "provider.status.get", "provider.status.retry", "provider.undo_clear", "provider.update", "providers.list", "providers.saved", "tool.disable", "tool.enable", "tools.list", "webui.shutdown", "goal-state.get", "goal.addTask", "goal.assess", "goal.assignTask", "goal.clear", "goal.get", "goal.list", "goal.load", "goal.moveTask", "goal.pause", "goal.resume", "goal.retryTask", "goal.revert", "goal.runTask", "goal.save", "goal.selectPhase", "goal.start", "goal.state", "goal.status", "goal.stop", "goal.taskStatus", "goal.toggleAutonomous", "plan.get", "plan.item.update", "plan.template_use", "task.update", "tasks.get", "sdd.board.cancel_task", "sdd.board.cleanup_worktrees", "sdd.board.delete_task", "sdd.board.destroy", "sdd.board.get", "sdd.board.list", "sdd.board.pause", "sdd.board.reassign", "sdd.board.resume", "sdd.board.retry", "sdd.board.retry_all_failed", "sdd.board.rollback", "sdd.board.set_task_fallbacks", "sdd.board.set_task_model", "sdd.board.set_task_verification", "sdd.board.split_task", "sdd.board.stop", "sdd.run.from_graph", "sdd.run.from_spec", "sdd.run.start", "sdd.spec.approve", "sdd.spec.discard", "sdd.spec.get", "sdd.spec.message", "sdd.spec.start", "specs.get", "specs.list", "specs.taskStatus", "brain.ask", "brain.config.get", "brain.config.set", "brain.risk", "brain.status", "chronicle.facet", "chronicle.facets", "chronicle.graph", "chronicle.metrics", "chronicle.query", "chronicle.status", "config.doctor", "design.list", "design.materialize", "design.set", "design.state", "design.swap", "design.tune", "design.use", "design.verify", "memory.list", "memory.sage.backfillRecoverable", "memory.sage.candidateResolve", "memory.sage.delete", "memory.sage.forFile", "memory.sage.get", "memory.sage.graph", "memory.sage.list", "memory.sage.listPage", "memory.sage.recover", "memory.sage.remember", "memory.sage.update", "auth.oauth.cancel", "auth.oauth.code", "auth.oauth.start", "mcp.add", "mcp.disable", "mcp.discover", "mcp.enable", "mcp.list", "mcp.prompt.get", "mcp.prompts", "mcp.remove", "mcp.resource.read", "mcp.resources", "mcp.restart", "mcp.sleep", "mcp.update", "mcp.wake", "prompts.content", "prompts.create", "prompts.favorite", "prompts.list", "prompts.recent", "prompts.search", "prompts.used", "skills.content", "skills.create", "skills.edit", "skills.export", "skills.install", "skills.list", "skills.uninstall", "skills.update"];
2
+ export declare const SERVER_MESSAGE_TYPES: readonly ["error", "log", "pong", "side_effects", "agent.status_changed", "agent.timeline.message", "client.status_update", "chimera.report_available", "compaction.failed", "completion.result", "context.compacted", "context.debug", "context.editor.snapshot", "context.editor.validation", "context.editor.applied", "context.mode.changed", "context.modes.list", "context.repaired", "ctx.max_context", "ctx.pct", "delegate.completed", "delegate.started", "iteration.completed", "iteration.limit_reached", "iteration.started", "model.refine_result", "modes.list", "provider.active_blocked", "provider.error", "provider.fallback", "provider.fallback_pending", "provider.response", "provider.retry", "provider.status_changed", "provider.stream_error", "provider.text_delta", "provider.thinking_delta", "run.result", "session.checkpoints", "session.damaged", "session.end", "session.inspect", "session.rewound", "session.start", "session.stats", "sessions.list", "sessions.status_update", "stats.get", "token.cost_estimate_unavailable", "token.threshold", "tool.confirm_needed", "tool.disabled", "tool.enabled", "tool.executed", "tool.loop_detected", "tool.progress", "tool.started", "topic.advice_result", "tools.list", "trust.persisted", "collab.annotation.added", "collab.annotation.resolved", "collab.event", "collab.injection.granted", "collab.participant.joined", "collab.participant.left", "collab.pause.granted", "collab.pause.released", "collab.state", "mailbox.action_result", "mailbox.agent_registered", "mailbox.agent_deregistered", "mailbox.agents", "mailbox.cleared", "mailbox.compacted", "mailbox.event", "mailbox.messages", "mailbox.sent", "mailbox.purged", "mailbox.received", "subagent.budget_extended", "subagent.event", "checkpoint.written", "codemap.file_event", "codemap.index_updated", "codemap.tool_executed", "codemap.tool_started", "file.saved", "files.list", "files.read", "files.tree", "files.written", "git.changes", "git.diff", "git.info", "process.list", "projects.added", "projects.list", "projects.selected", "terminal.exit", "terminal.output", "working_dir.changed", "worktree.cleanup_result", "worktree.diff_result", "worktree.event", "worktree.merge_result", "worktree.orphans", "worktree.state", "auth.oauth.status", "codebase.index.server.shutdown_result", "connections.health_error", "connections.health_result", "connections.service_action_result", "diag.get", "key.operation_result", "model.switch_result", "prefs.updated", "provider.catalog", "provider.models", "provider.models.search_result", "provider.probe", "provider.status.snapshot", "providers.saved", "budget.decision", "budget.threshold_reached", "coordinator.stats", "coordinator.status", "eternal.iteration", "fleet.concurrency_update", "goal-state.updated", "goal.assess.result", "goal.list", "goal.paused", "goal.resumed", "goal.saved", "goal.error", "goal.stopped", "goal.failed", "goal.completed", "goal.cleared", "goal.reverted", "goal.progress", "goal.state", "in_flight.ended", "in_flight.started", "plan.updated", "task.completed", "task.failed", "task.pending", "task.started", "tasks.updated", "todos.cleared", "todos.updated", "kanban.task.activity", "sdd.board.lifecycle_result", "sdd.board.list", "sdd.board.snapshot", "sdd.run.started", "sdd.spec.agent_text", "sdd.spec.error", "sdd.spec.snapshot", "specs.detail", "specs.list", "consensus.vote_cast", "consensus.vote_initiated", "consensus.vote_resolved", "cron.job_fired", "cron.snapshot", "techstack.job.cancelled", "techstack.job.failed", "techstack.job.progress", "techstack.job.started", "techstack.report.delivered", "techstack.report.ready", "techstack.snapshot.updated", "techstack.workspace.completed", "brain.answer", "brain.config", "brain.event", "brain.status", "chronicle.error", "chronicle.facet_result", "chronicle.facets_result", "chronicle.graph_result", "chronicle.metrics_result", "chronicle.query_result", "chronicle.status_result", "config.doctor.result", "design.list", "design.materialize", "design.set", "design.state", "design.swap", "design.tune", "design.use", "design.verify", "memory.event", "memory.list", "memory.sage.backfillRecoverable", "memory.sage.candidateResolve", "memory.sage.delete", "memory.sage.forFile", "memory.sage.get", "memory.sage.graph", "memory.sage.list", "memory.sage.listPage", "memory.sage.recover", "memory.sage.remember", "memory.sage.update", "mcp.content.error", "mcp.content.selected", "mcp.list", "mcp.operation_result", "mcp.prompts", "mcp.resources", "mcp.server.added", "mcp.server.connected", "mcp.server.disconnected", "mcp.server.discovered", "mcp.server.error", "mcp.server.reconnected", "mcp.server.removed", "mcp.server.sleeping", "mcp.server.updated", "mcp.server.waking", "prompts.content", "prompts.created", "prompts.favorite", "prompts.list", "prompts.recent", "prompts.search", "prompts.used", "skills.content", "skills.created", "skills.edited", "skills.exported", "skills.installed", "skills.list", "skills.uninstalled", "skills.updated"];
3
3
  export type ExactClientMessageType = (typeof CLIENT_MESSAGE_TYPES)[number];
4
4
  export type ExactServerMessageType = (typeof SERVER_MESSAGE_TYPES)[number];
5
5
  export declare function isRegisteredMessageType(type: string, direction: 'client' | 'server'): boolean;
@@ -1,3 +1,3 @@
1
- export declare const SERVER_CONVERSATION_MESSAGE_TYPES: readonly ['error', 'log', 'pong', 'side_effects', 'agent.status_changed', 'agent.timeline.message', 'client.status_update', 'chimera.report_available', 'compaction.failed', 'completion.result', 'context.compacted', 'context.debug', 'context.editor.snapshot', 'context.editor.validation', 'context.editor.applied', 'context.mode.changed', 'context.modes.list', 'context.repaired', 'ctx.max_context', 'ctx.pct', 'delegate.completed', 'delegate.started', 'iteration.completed', 'iteration.limit_reached', 'iteration.started', 'model.refine_result', 'modes.list', 'provider.active_blocked', 'provider.error', 'provider.fallback', 'provider.response', 'provider.retry', 'provider.status_changed', 'provider.stream_error', 'provider.text_delta', 'provider.thinking_delta', 'run.result', 'session.checkpoints', 'session.damaged', 'session.end', 'session.inspect', 'session.rewound', 'session.start', 'session.stats', 'sessions.list', 'sessions.status_update', 'stats.get', 'token.cost_estimate_unavailable', 'token.threshold', 'tool.confirm_needed', 'tool.disabled', 'tool.enabled', 'tool.executed', 'tool.loop_detected', 'tool.progress', 'tool.started', 'tools.list', 'trust.persisted'];
2
- export declare const SERVER_COLLABORATION_MESSAGE_TYPES: readonly ['collab.annotation.added', 'collab.annotation.resolved', 'collab.event', 'collab.injection.granted', 'collab.participant.joined', 'collab.participant.left', 'collab.pause.granted', 'collab.pause.released', 'collab.state', 'mailbox.action_result', 'mailbox.agent_registered', 'mailbox.agents', 'mailbox.cleared', 'mailbox.compacted', 'mailbox.event', 'mailbox.messages', 'mailbox.sent', 'mailbox.purged', 'mailbox.received', 'subagent.budget_extended', 'subagent.event'];
1
+ export declare const SERVER_CONVERSATION_MESSAGE_TYPES: readonly ['error', 'log', 'pong', 'side_effects', 'agent.status_changed', 'agent.timeline.message', 'client.status_update', 'chimera.report_available', 'compaction.failed', 'completion.result', 'context.compacted', 'context.debug', 'context.editor.snapshot', 'context.editor.validation', 'context.editor.applied', 'context.mode.changed', 'context.modes.list', 'context.repaired', 'ctx.max_context', 'ctx.pct', 'delegate.completed', 'delegate.started', 'iteration.completed', 'iteration.limit_reached', 'iteration.started', 'model.refine_result', 'modes.list', 'provider.active_blocked', 'provider.error', 'provider.fallback', 'provider.fallback_pending', 'provider.response', 'provider.retry', 'provider.status_changed', 'provider.stream_error', 'provider.text_delta', 'provider.thinking_delta', 'run.result', 'session.checkpoints', 'session.damaged', 'session.end', 'session.inspect', 'session.rewound', 'session.start', 'session.stats', 'sessions.list', 'sessions.status_update', 'stats.get', 'token.cost_estimate_unavailable', 'token.threshold', 'tool.confirm_needed', 'tool.disabled', 'tool.enabled', 'tool.executed', 'tool.loop_detected', 'tool.progress', 'tool.started', 'topic.advice_result', 'tools.list', 'trust.persisted'];
2
+ export declare const SERVER_COLLABORATION_MESSAGE_TYPES: readonly ['collab.annotation.added', 'collab.annotation.resolved', 'collab.event', 'collab.injection.granted', 'collab.participant.joined', 'collab.participant.left', 'collab.pause.granted', 'collab.pause.released', 'collab.state', 'mailbox.action_result', 'mailbox.agent_registered', 'mailbox.agent_deregistered', 'mailbox.agents', 'mailbox.cleared', 'mailbox.compacted', 'mailbox.event', 'mailbox.messages', 'mailbox.sent', 'mailbox.purged', 'mailbox.received', 'subagent.budget_extended', 'subagent.event'];
3
3
  //# sourceMappingURL=server-conversation.d.ts.map
@@ -1,6 +1,8 @@
1
1
  export declare const SURFACE_PROTOCOL_VERSION: 1;
2
2
  export declare const SURFACE_PROTOCOL_MIN_VERSION: 1;
3
3
  export declare const SURFACE_PROTOCOL_CAPABILITIES: readonly ['protocol.directional-decoder', 'protocol.recursive-key-safety', 'chronicle.query', 'chronicle.facet', 'chronicle.facets', 'chronicle.graph', 'chronicle.metrics', 'chronicle.status', 'connections.health',
4
+ /** Bounded topic-shift advice plus same-session provider-context boundaries. */
5
+ 'context.topic-boundary',
4
6
  /** Interview resume/discard + lastAgentText/lastRunId continuity. */
5
7
  'sdd.interview.continuity',
6
8
  /** Launch multi-agent runs from a graph id or resolved spec id. */
@@ -1,3 +1,5 @@
1
+ import type { TrustBoundary } from '@wrongstack/core/security';
2
+ import { authorizeWebUIAction } from './privileged-actions.js';
1
3
  import type { WebSocket } from 'ws';
2
4
  import type { WSClientMessage, WSServerMessage } from './types.js';
3
5
  export type ConnectionHealthStatus = 'healthy' | 'degraded' | 'offline' | 'unavailable' | 'error';
@@ -41,6 +43,14 @@ export interface ConnectionsHealthContext {
41
43
  send(ws: WebSocket, message: WSServerMessage): void;
42
44
  backend: ConnectionsHealthReport['backend'];
43
45
  collect?: (() => Promise<ConnectionsHealthReport>) | undefined;
46
+ /**
47
+ * Policy authority for `connections.service_action`. Optional so the
48
+ * read-only `connections.health` route keeps working without one, but the
49
+ * action route REFUSES when it is absent rather than proceeding unchecked —
50
+ * a missing boundary must not read as "allowed".
51
+ */
52
+ trustBoundary?: TrustBoundary | undefined;
53
+ logger?: Parameters<typeof authorizeWebUIAction>[2];
44
54
  }
45
55
  /** One read-only health report for every per-project backend connection. */
46
56
  export declare function handleConnectionsHealthRoute(context: ConnectionsHealthContext, ws: WebSocket, message: WSClientMessage): Promise<boolean>;
@@ -7,6 +7,12 @@ export interface ContextEditorMessage {
7
7
  content: string | ContextEditorBlock[];
8
8
  ts?: string | undefined;
9
9
  }
10
+ export interface ContextEditorRemoval {
11
+ messageIndex: number;
12
+ blockIndex?: number | undefined;
13
+ start?: number | undefined;
14
+ end?: number | undefined;
15
+ }
10
16
  export interface ContextEditorMetrics {
11
17
  messages: number;
12
18
  blocks: number;
@@ -85,6 +91,7 @@ export interface ContextEditorSnapshot {
85
91
  preview: string;
86
92
  blockCount: number | null;
87
93
  warnings: ContextEditorWarning[];
94
+ pairedAssistantIndices: number[];
88
95
  }>;
89
96
  diagnostics: ContextEditorDiagnostics;
90
97
  }
@@ -99,6 +106,7 @@ export declare function validateContextEditorProposal(input: {
99
106
  tools?: ReturnType<ToolRegistry['list']> | undefined;
100
107
  baseRevision: string;
101
108
  messages: unknown;
109
+ removals: unknown;
102
110
  allowRepair: boolean;
103
111
  runActive?: boolean | undefined;
104
112
  }): ContextEditorValidationResult;
@@ -107,6 +115,7 @@ export declare function applyContextEditorProposal(input: {
107
115
  tools?: ReturnType<ToolRegistry['list']> | undefined;
108
116
  baseRevision: string;
109
117
  messages: unknown;
118
+ removals: unknown;
110
119
  allowRepair: boolean;
111
120
  runActive?: boolean | undefined;
112
121
  }): Promise<ContextEditorValidationResult | ContextEditorAppliedResult>;
@@ -2,6 +2,7 @@ import type { WebSocket } from 'ws';
2
2
  import type { WSClientMessage } from './types.js';
3
3
  export interface ConversationRouteHandlers {
4
4
  userMessage: (ws: WebSocket, msg: WSClientMessage) => Promise<void> | void;
5
+ topicAdvice: (ws: WebSocket, msg: WSClientMessage) => Promise<void> | void;
5
6
  abort: (ws: WebSocket, msg: WSClientMessage) => Promise<void> | void;
6
7
  ping: (ws: WebSocket, msg: WSClientMessage) => Promise<void> | void;
7
8
  confirmTool: (ws: WebSocket, msg: WSClientMessage) => Promise<void> | void;
@@ -21,6 +21,11 @@ export interface MailboxBridgeParams {
21
21
  * spawn `wstack mailbox serve` and wait briefly for the lock to become
22
22
  * healthy. Failure stays non-fatal: the WebUI can run without external
23
23
  * agent HTTP connectivity.
24
+ *
25
+ * Gated on `features.mailboxBridge`, which defaults to 'off' — the
26
+ * bridge only serves EXTERNAL agents and no WebUI code path reads the
27
+ * handle stashed on `ctx.meta`, so a detached ~130 MB CLI process per
28
+ * project was overhead nobody collected on. Opt in with 'auto'.
24
29
  */
25
30
  export declare function discoverMailboxBridgeForWebui(params: MailboxBridgeParams): Promise<void>;
26
31
  //# sourceMappingURL=discover-mailbox-bridge.d.ts.map
@@ -51,7 +51,7 @@ export declare function createEmbeddedProviderOperations(ctx: EmbeddedProviderCo
51
51
  apiKey?: string | undefined;
52
52
  models?: string[] | undefined;
53
53
  customModels?: ProviderConfig['customModels'] | undefined;
54
- }) => Promise<void>;
54
+ }) => Promise<boolean>;
55
55
  handleProviderRemove: (ws: WebSocket, providerId: string) => Promise<void>;
56
56
  handleProviderClearModels: (ws: WebSocket, providerId: string) => Promise<void>;
57
57
  handleCustomModelSet: (ws: WebSocket, providerId: string, modelId: string, definition: NonNullable<ProviderConfig['customModels']>[string]) => Promise<void>;
@@ -33,6 +33,11 @@ export interface RegisterWebuiInstanceParams {
33
33
  startedAt: string;
34
34
  /** Registry base dir (dirname of globalConfigPath); undefined ⇒ registry default. */
35
35
  registryBaseDir: string | undefined;
36
+ /**
37
+ * This instance's API access token, recorded so a same-project TUI/REPL can
38
+ * authenticate `POST /api/fleet/ping` (H3). See `WebUIInstanceRecord`.
39
+ */
40
+ authToken?: string | undefined;
36
41
  }
37
42
  export interface RegisterWebuiInstanceDeps {
38
43
  registerFn?: (record: WebUIInstanceRecord, baseDir?: string) => Promise<void>;
@@ -73,7 +78,19 @@ export interface WebuiShutdownResources {
73
78
  /** Run and drop every event-bus unsubscriber. */
74
79
  unsubscribeEvents: () => void;
75
80
  /** Dispose long-lived handlers, timers, watchers, and project services owned by the host. */
76
- disposeResources?: (() => void) | undefined;
81
+ disposeResources?: (() => void | Promise<void>) | undefined;
82
+ /**
83
+ * Stop session-owned child processes (MCP, bash/exec tools, mailbox helpers,
84
+ * dev servers). Runs **before** the HTTP/WS close so children cannot keep
85
+ * stdio handles open and strand the parent event loop (issue #322).
86
+ * Bounded by {@link childCleanupTimeoutMs}; failures are best-effort.
87
+ */
88
+ stopOwnedChildren?: (() => void | Promise<void>) | undefined;
89
+ /**
90
+ * Upper bound for {@link stopOwnedChildren} + async dispose before servers
91
+ * close. Default 10_000 ms.
92
+ */
93
+ childCleanupTimeoutMs?: number | undefined;
77
94
  /** Close every connected socket and clear the client map. */
78
95
  closeClients: () => void;
79
96
  /** Close the static HTTP server (no-op when WS-only). */
@@ -99,10 +116,11 @@ export interface WebuiShutdownResources {
99
116
  * second Ctrl+C, or a signal after another server in the same process
100
117
  * already stopped) return immediately.
101
118
  *
102
- * Order matches the original inline handler: abort runs → unsubscribe
103
- * eventsclose clientsunregister from the instance registry (async,
104
- * awaited inside the wss.close callback)close HTTP close WS → on
105
- * close, once the unregister settles, `onStopped()`.
119
+ * Order (issue #322): abort runs → unsubscribe events → stop owned children
120
+ * (bounded)dispose resources (bounded) close clients close HTTP/WS
121
+ * unregister from the instance registryonStopped once unregister settles.
122
+ * Registry removal is deferred until after child cleanup so operators do not
123
+ * see a "stopped" registry entry while the process tree is still alive.
106
124
  */
107
125
  export declare function createWebuiShutdown(res: WebuiShutdownResources): () => void;
108
126
  /**