@wrongstack/core 0.267.0 → 0.268.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/{agent-bridge-STJ3JwwK.d.ts → agent-bridge-UhojbpWx.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-CzPGP3jA.d.ts → agent-subagent-runner-Bvtf1o9K.d.ts} +7 -7
  3. package/dist/{brain-Cdg77tVN.d.ts → brain-69wzMKp1.d.ts} +1 -1
  4. package/dist/{compactor-iMZ84CXq.d.ts → compactor-CBQAJoDc.d.ts} +1 -1
  5. package/dist/{config-Du3pYYln.d.ts → config-VKfOZ-6X.d.ts} +70 -2
  6. package/dist/{context-dT5Ueund.d.ts → context-C0U8B9NF.d.ts} +24 -1
  7. package/dist/coordination/index.d.ts +56 -160
  8. package/dist/coordination/index.js +333 -63
  9. package/dist/coordination/index.js.map +1 -1
  10. package/dist/defaults/index.d.ts +26 -25
  11. package/dist/defaults/index.js +94 -68
  12. package/dist/defaults/index.js.map +1 -1
  13. package/dist/execution/index.d.ts +72 -16
  14. package/dist/execution/index.js +151 -36
  15. package/dist/execution/index.js.map +1 -1
  16. package/dist/execution/prompt-enhancer.d.ts +1 -1
  17. package/dist/extension/index.d.ts +7 -6
  18. package/dist/global-mailbox-KByEFFBa.d.ts +663 -0
  19. package/dist/{goal-preamble-SulMTowG.d.ts → goal-preamble-CrYjmdw4.d.ts} +9 -9
  20. package/dist/{goal-store-CABDwdFE.d.ts → goal-store-Y_zdLZ3q.d.ts} +1 -1
  21. package/dist/hq/index.d.ts +195 -0
  22. package/dist/hq/index.js +1884 -0
  23. package/dist/hq/index.js.map +1 -0
  24. package/dist/{index-IEuxQd-E.d.ts → index-BfaS-f_m.d.ts} +2 -2
  25. package/dist/{index-DtCVWel4.d.ts → index-CtQnmkaS.d.ts} +8 -8
  26. package/dist/{index-Bms0m4oy.d.ts → index-gCv830d7.d.ts} +5 -5
  27. package/dist/index.d.ts +46 -42
  28. package/dist/index.js +2955 -1498
  29. package/dist/index.js.map +1 -1
  30. package/dist/infrastructure/index.d.ts +6 -6
  31. package/dist/infrastructure/index.js +45 -18
  32. package/dist/infrastructure/index.js.map +1 -1
  33. package/dist/kernel/index.d.ts +10 -9
  34. package/dist/{pipeline-BfD2k1rT.d.ts → mailbox-types-Ct2hJq0P.d.ts} +1 -244
  35. package/dist/{mcp-servers-C2cBTxUR.d.ts → mcp-servers-HT3Fi7Bl.d.ts} +10 -4
  36. package/dist/models/index.d.ts +5 -5
  37. package/dist/models/index.js +3 -2
  38. package/dist/models/index.js.map +1 -1
  39. package/dist/{models-registry-BqGZNJQ-.d.ts → models-registry-Bvcl3Vaa.d.ts} +1 -1
  40. package/dist/{multi-agent-coordinator-B8R43uPz.d.ts → multi-agent-coordinator-BACjsmkC.d.ts} +1 -1
  41. package/dist/{null-fleet-bus-CnXa5oTH.d.ts → null-fleet-bus-DA7fvhUg.d.ts} +6 -6
  42. package/dist/observability/index.d.ts +2 -2
  43. package/dist/{parallel-eternal-engine-DdNnw9BQ.d.ts → parallel-eternal-engine-Ci71gYu_.d.ts} +9 -15
  44. package/dist/{path-resolver-COIMLCQL.d.ts → path-resolver-O1IJnmKE.d.ts} +4 -3
  45. package/dist/{permission-B75JAi3-.d.ts → permission-Bd-57Lbl.d.ts} +1 -1
  46. package/dist/{permission-policy-DlR9eJAM.d.ts → permission-policy-uNXC6Kge.d.ts} +2 -3
  47. package/dist/pipeline-BDNvENyV.d.ts +245 -0
  48. package/dist/{plan-templates-DSIKCXZN.d.ts → plan-templates-EMsalEtN.d.ts} +5 -5
  49. package/dist/{provider-model-resolve-BNRsNuJx.d.ts → provider-model-resolve-CEb9x886.d.ts} +3 -3
  50. package/dist/{provider-runner-CX7iIvox.d.ts → provider-runner-DWJbpo70.d.ts} +3 -3
  51. package/dist/{retry-policy-BilV1ujH.d.ts → retry-policy-C3s_lvdK.d.ts} +1 -1
  52. package/dist/sdd/index.d.ts +9 -8
  53. package/dist/sdd/index.js +32 -2
  54. package/dist/sdd/index.js.map +1 -1
  55. package/dist/{secret-vault-gkvEZZfE.d.ts → secret-vault-Cgduf5xL.d.ts} +1 -1
  56. package/dist/security/index.d.ts +5 -5
  57. package/dist/security/index.js +39 -29
  58. package/dist/security/index.js.map +1 -1
  59. package/dist/{selector-Bc7eWtT3.d.ts → selector-47LBnBVk.d.ts} +1 -1
  60. package/dist/{session-event-bridge-D-araDEz.d.ts → session-event-bridge-Cw7oqmW2.d.ts} +1 -1
  61. package/dist/{session-reader-D7Dapswh.d.ts → session-reader-DD4v2Obw.d.ts} +1 -1
  62. package/dist/storage/index.d.ts +14 -12
  63. package/dist/storage/index.js +63 -36
  64. package/dist/storage/index.js.map +1 -1
  65. package/dist/tools/index.d.ts +2 -2
  66. package/dist/tools/index.js +166 -31
  67. package/dist/tools/index.js.map +1 -1
  68. package/dist/types/index.d.ts +20 -19
  69. package/dist/types/index.js +68 -51
  70. package/dist/types/index.js.map +1 -1
  71. package/dist/utils/index.d.ts +22 -3
  72. package/dist/utils/index.js +139 -1
  73. package/dist/utils/index.js.map +1 -1
  74. package/package.json +5 -1
@@ -1,4 +1,4 @@
1
- import { M as ModelsRegistry, a as ModelsDevPayload, R as ResolvedProvider, b as ResolvedModel, W as WireFamily } from './config-Du3pYYln.js';
1
+ import { M as ModelsRegistry, a as ModelsDevPayload, R as ResolvedProvider, b as ResolvedModel, W as WireFamily } from './config-VKfOZ-6X.js';
2
2
 
3
3
  interface DefaultModelsRegistryOptions {
4
4
  cacheFile: string;
@@ -1,4 +1,4 @@
1
- import { S as SubagentConfig, M as MultiAgentCoordinator, c as MultiAgentConfig, d as SubagentRunner, F as FleetBus, e as SpawnResult, T as TaskSpec, a as BridgeMessage, A as AgentBridge, C as CoordinatorStatus, f as TaskResult } from './agent-subagent-runner-CzPGP3jA.js';
1
+ import { S as SubagentConfig, M as MultiAgentCoordinator, c as MultiAgentConfig, d as SubagentRunner, F as FleetBus, e as SpawnResult, T as TaskSpec, a as BridgeMessage, A as AgentBridge, C as CoordinatorStatus, f as TaskResult } from './agent-subagent-runner-Bvtf1o9K.js';
2
2
  import { EventEmitter } from 'node:events';
3
3
 
4
4
  /**
@@ -1,12 +1,12 @@
1
- import { A as AgentPhase, b as AgentDefinition, a as DefaultMultiAgentCoordinator, D as DispatchClassifier } from './multi-agent-coordinator-B8R43uPz.js';
2
- import { F as FleetBus, i as FleetUsage, S as SubagentConfig, j as FleetUsageAggregator, f as TaskResult, C as CoordinatorStatus, T as TaskSpec, c as MultiAgentConfig, d as SubagentRunner } from './agent-subagent-runner-CzPGP3jA.js';
3
- import { a as SessionWriter, T as Tool, i as SessionStore } from './context-dT5Ueund.js';
4
- import { B as BrainArbiter, E as EventBus } from './brain-Cdg77tVN.js';
1
+ import { A as AgentPhase, b as AgentDefinition, a as DefaultMultiAgentCoordinator, D as DispatchClassifier } from './multi-agent-coordinator-BACjsmkC.js';
2
+ import { F as FleetBus, i as FleetUsage, S as SubagentConfig, j as FleetUsageAggregator, f as TaskResult, C as CoordinatorStatus, T as TaskSpec, c as MultiAgentConfig, d as SubagentRunner } from './agent-subagent-runner-Bvtf1o9K.js';
3
+ import { a as SessionWriter, T as Tool, i as SessionStore } from './context-C0U8B9NF.js';
4
+ import { B as BrainArbiter, E as EventBus } from './brain-69wzMKp1.js';
5
5
  import { EventEmitter } from 'node:events';
6
6
  import { L as Logger } from './logger-B63L5bTg.js';
7
7
  import { D as DirectorStateSnapshot } from './director-state-BfeCUbmk.js';
8
- import { d as ModelMatrixEntry } from './config-Du3pYYln.js';
9
- import { I as InMemoryAgentBridge } from './agent-bridge-STJ3JwwK.js';
8
+ import { d as ModelMatrixEntry } from './config-VKfOZ-6X.js';
9
+ import { I as InMemoryAgentBridge } from './agent-bridge-UhojbpWx.js';
10
10
 
11
11
  /**
12
12
  * Alert levels the Director can emit when a collab session needs attention.
@@ -1,6 +1,6 @@
1
1
  import { M as MetricsSink, d as MetricLabels, f as MetricsSnapshot, H as HealthRegistry, a as HealthCheck, A as AggregateHealth, T as Tracer, S as Span } from '../observability-D-HZN_mF.js';
2
- import { E as EventBus } from '../brain-Cdg77tVN.js';
3
- import '../context-dT5Ueund.js';
2
+ import { E as EventBus } from '../brain-69wzMKp1.js';
3
+ import '../context-C0U8B9NF.js';
4
4
 
5
5
  /**
6
6
  * In-memory metrics sink. Suitable for embedded use, tests, and /metrics
@@ -1,12 +1,12 @@
1
- import { e as ProviderError, C as Context, T as Tool, m as ToolUseBlock, n as ToolResultBlock } from './context-dT5Ueund.js';
2
- import { R as RetryPolicy, E as ErrorHandler, a as RecoveryDecision } from './retry-policy-BilV1ujH.js';
3
- import { C as Compactor, a as CompactReport } from './compactor-iMZ84CXq.js';
4
- import { M as ModelsRegistry } from './config-Du3pYYln.js';
5
- import { T as ToolExecutorOptions, a as ToolExecutorStrategy, b as ToolBatchResult } from './index-Bms0m4oy.js';
6
- import { g as Agent, h as AgentFactory } from './agent-subagent-runner-CzPGP3jA.js';
7
- import { B as BrainArbiter, E as EventBus } from './brain-Cdg77tVN.js';
8
- import { J as JournalEntry } from './goal-store-CABDwdFE.js';
9
- import { D as DispatchClassifier, a as DefaultMultiAgentCoordinator } from './multi-agent-coordinator-B8R43uPz.js';
1
+ import { e as ProviderError, C as Context, T as Tool, q as ToolUseBlock, r as ToolResultBlock } from './context-C0U8B9NF.js';
2
+ import { R as RetryPolicy, E as ErrorHandler, a as RecoveryDecision } from './retry-policy-C3s_lvdK.js';
3
+ import { C as Compactor, a as CompactReport } from './compactor-CBQAJoDc.js';
4
+ import { M as ModelsRegistry } from './config-VKfOZ-6X.js';
5
+ import { T as ToolExecutorOptions, a as ToolExecutorStrategy, b as ToolBatchResult } from './index-gCv830d7.js';
6
+ import { g as Agent, h as AgentFactory } from './agent-subagent-runner-Bvtf1o9K.js';
7
+ import { B as BrainArbiter, E as EventBus } from './brain-69wzMKp1.js';
8
+ import { J as JournalEntry } from './goal-store-Y_zdLZ3q.js';
9
+ import { D as DispatchClassifier, a as DefaultMultiAgentCoordinator } from './multi-agent-coordinator-BACjsmkC.js';
10
10
 
11
11
  declare class DefaultRetryPolicy implements RetryPolicy {
12
12
  shouldRetry(err: Error | ProviderError, attempt: number): boolean;
@@ -147,12 +147,6 @@ declare class ToolExecutor {
147
147
  * semantics (over-budget spends don't underflow the running total).
148
148
  */
149
149
  private budgetForString;
150
- /**
151
- * Compute the suggestedPattern string for a tool+input pair.
152
- * Matches the logic in DefaultPermissionPolicy so the TUI shows the
153
- * same subject that the trust file would use.
154
- */
155
- private subjectFor;
156
150
  }
157
151
 
158
152
  /**
@@ -1,6 +1,6 @@
1
- import { E as EventBus } from './brain-Cdg77tVN.js';
2
- import { M as ModelsRegistry, b as ResolvedModel } from './config-Du3pYYln.js';
3
- import { c as TokenCounter, U as Usage, d as CacheStats } from './context-dT5Ueund.js';
1
+ import { E as EventBus } from './brain-69wzMKp1.js';
2
+ import { M as ModelsRegistry, b as ResolvedModel } from './config-VKfOZ-6X.js';
3
+ import { c as TokenCounter, U as Usage, d as CacheStats } from './context-C0U8B9NF.js';
4
4
  import { P as PathResolver } from './path-resolver-CPRj4bFY.js';
5
5
 
6
6
  /**
@@ -44,6 +44,7 @@ declare class DefaultTokenCounter implements TokenCounter {
44
44
  cacheStats(): CacheStats;
45
45
  /** Invalidate cached prices so the next account() call fetches fresh data. */
46
46
  invalidateCache(): void;
47
+ private emitAccounted;
47
48
  reset(): void;
48
49
  private applyPrice;
49
50
  }
@@ -1,4 +1,4 @@
1
- import { T as Tool, C as Context, f as Permission } from './context-dT5Ueund.js';
1
+ import { T as Tool, C as Context, f as Permission } from './context-C0U8B9NF.js';
2
2
 
3
3
  interface SecretScrubber {
4
4
  scrub(text: string): string;
@@ -1,6 +1,6 @@
1
- import { T as Tool, C as Context } from './context-dT5Ueund.js';
1
+ import { T as Tool, C as Context } from './context-C0U8B9NF.js';
2
2
  import { I as InputReader } from './input-reader-E-ffP2ee.js';
3
- import { P as PermissionPolicy, a as PermissionDecision } from './permission-B75JAi3-.js';
3
+ import { P as PermissionPolicy, a as PermissionDecision } from './permission-Bd-57Lbl.js';
4
4
 
5
5
  interface PermissionPolicyOptions {
6
6
  trustFile: string;
@@ -118,7 +118,6 @@ declare class DefaultPermissionPolicy implements PermissionPolicy {
118
118
  tool: string;
119
119
  pattern: string;
120
120
  }): void;
121
- private subjectFor;
122
121
  private findNamespaceEntry;
123
122
  }
124
123
  /**
@@ -0,0 +1,245 @@
1
+ import { T as Tool, p as TextBlock, g as ContentBlock } from './context-C0U8B9NF.js';
2
+ import { a as MailboxAgentStatus } from './mailbox-types-Ct2hJq0P.js';
3
+ import { H as HookEvent, f as HookMatcher, I as InProcessHook, S as ShellHook, g as HookEntry } from './config-VKfOZ-6X.js';
4
+
5
+ /** Model capabilities relevant to prompt composition. */
6
+ interface ModelCapabilities {
7
+ maxContextTokens: number;
8
+ supportsTools: boolean;
9
+ supportsVision: boolean;
10
+ supportsReasoning: boolean;
11
+ }
12
+ interface BuildContext {
13
+ cwd: string;
14
+ projectRoot: string;
15
+ tools: Tool[];
16
+ /** Provider id (e.g. "anthropic", "minimax-coding-plan"). */
17
+ provider?: string | undefined;
18
+ /** Model id (e.g. "claude-sonnet-4-6", "MiniMax-M2.7"). */
19
+ model?: string | undefined;
20
+ /**
21
+ * True when the prompt is being built for a SUBAGENT, not the host
22
+ * agent. Subagents are scoped to a single task — they should NOT see
23
+ * the host's strategic plan board (which is anchoring the host across
24
+ * turns, not steering individual subtasks). The plan-injection
25
+ * layer short-circuits when this flag is set.
26
+ */
27
+ subagent?: boolean | undefined;
28
+ /**
29
+ * List of currently online agents in the shared mailbox system.
30
+ * Includes agents from all sessions (TUI, WebUI, CLI) in the same project.
31
+ */
32
+ onlineAgents?: MailboxAgentStatus[] | undefined;
33
+ }
34
+ interface SystemPromptBuilder {
35
+ build(ctx: BuildContext): Promise<TextBlock[]>;
36
+ }
37
+
38
+ /**
39
+ * Registry of lifecycle hooks (both in-process and shell). One instance is
40
+ * shared per session: the boot path loads `config.hooks` as shell entries and
41
+ * plugins add in-process entries via `PluginAPI.registerHook`. The
42
+ * `HookRunner` reads from it at each lifecycle phase.
43
+ */
44
+ declare class HookRegistry {
45
+ private readonly entries;
46
+ /** Register an in-process hook. Returns an unsubscribe function. */
47
+ registerInProcess(event: HookEvent, matcher: HookMatcher | undefined, hook: InProcessHook, owner?: string | undefined): () => void;
48
+ /** Register a single shell hook. Returns an unsubscribe function. */
49
+ registerShell(event: HookEvent, hook: ShellHook): () => void;
50
+ /** Bulk-load shell hooks from a `config.hooks` map. */
51
+ loadShellHooks(hooks: Partial<Record<HookEvent, ShellHook[]>> | undefined): void;
52
+ /** All entries registered for an event, in registration order. */
53
+ list(event: HookEvent): readonly HookEntry[];
54
+ /** True when any entry is registered for the event. */
55
+ has(event: HookEvent): boolean;
56
+ /** Drop every registered hook (used in teardown / tests). */
57
+ clear(): void;
58
+ private remove;
59
+ }
60
+ /**
61
+ * Does a hook matcher apply to a tool name? `*` (or empty) matches everything;
62
+ * otherwise the matcher is a case-insensitive pipe-delimited list of exact
63
+ * tool names (`"edit|write"`). Non-tool events pass `undefined` and always match.
64
+ */
65
+ declare function hookMatcherMatches(matcher: HookMatcher, toolName: string | undefined): boolean;
66
+
67
+ interface Renderer {
68
+ write(text: string | TextBlock): void;
69
+ writeLine(text?: string): void;
70
+ writeBlock(block: ContentBlock): void;
71
+ writeToolCall(name: string, input: unknown): void;
72
+ writeToolResult(name: string, content: unknown, isError: boolean): void;
73
+ writeDiff(unifiedDiff: string): void;
74
+ writeWarning(text: string): void;
75
+ writeError(text: string): void;
76
+ writeInfo(text: string): void;
77
+ clear(): void;
78
+ }
79
+
80
+ /**
81
+ * Container — dependency injection with explicit bind / override / decorate.
82
+ *
83
+ * Invariants:
84
+ * bind() — throws if token already bound
85
+ * override() — throws if nothing to replace
86
+ * decorate() — stacks; cached value cleared on register
87
+ */
88
+ type Token<T> = symbol & {
89
+ readonly __type?: T;
90
+ };
91
+ type Factory<T> = (c: Container) => T;
92
+ type Decorator<T> = (inner: T, c: Container) => T;
93
+ interface BindOptions {
94
+ singleton?: boolean | undefined;
95
+ owner?: string | undefined;
96
+ }
97
+ declare class Container {
98
+ private readonly entries;
99
+ /**
100
+ * Tokens currently mid-resolve. Tracked so we can detect circular
101
+ * dependencies (A → B → A) and throw a structured error instead of
102
+ * overflowing the call stack with "Maximum call stack size exceeded".
103
+ *
104
+ * Not a memoization cache — the per-entry `cache` field is the source
105
+ * of truth for "have I built this before?". This set only lives for
106
+ * the duration of a single resolve call.
107
+ */
108
+ private readonly resolving;
109
+ bind<T>(token: Token<T>, factory: Factory<T>, opts?: BindOptions): void;
110
+ override<T>(token: Token<T>, factory: Factory<T>, opts?: BindOptions): void;
111
+ decorate<T>(token: Token<T>, decorator: Decorator<T>, owner?: string): void;
112
+ resolve<T>(token: Token<T>): T;
113
+ /**
114
+ * Build a human-readable description of the dependency cycle that
115
+ * caused the resolution to re-enter. Lists the tokens in the order
116
+ * they were entered, then appends the re-entered token to close the
117
+ * loop. Falls back to a generic message if the resolving set is
118
+ * somehow empty (shouldn't happen, but defensive).
119
+ */
120
+ private describeCycle;
121
+ has<T>(token: Token<T>): boolean;
122
+ /**
123
+ * Resolve a token if it is bound, otherwise return undefined.
124
+ * Unlike resolve(), this does not throw if the token is unbound.
125
+ */
126
+ safeResolve<T>(token: Token<T>): T | undefined;
127
+ ownerOf<T>(token: Token<T>): string | undefined;
128
+ /**
129
+ * Remove a token's binding (along with any decorators stacked on it).
130
+ * Returns true if the token existed. Use this to withdraw temporary
131
+ * bindings installed by a short-lived run or plugin — without it, the
132
+ * entry persists in the map forever.
133
+ */
134
+ unbind<T>(token: Token<T>): boolean;
135
+ /**
136
+ * Drop every binding. Intended for tests and short-lived CLI invocations
137
+ * that rebuild the container from scratch. Production code should prefer
138
+ * `unbind` on the specific tokens it owns.
139
+ */
140
+ clear(): void;
141
+ list(): Array<{
142
+ token: symbol;
143
+ owner: string;
144
+ }>;
145
+ /**
146
+ * Inspect a binding's full shape, including decorator count and whether
147
+ * a singleton value is cached. Returns null if the token is unbound.
148
+ * Decorator and factory function references are not exposed — only counts
149
+ * and metadata, to keep internal state hidden.
150
+ */
151
+ inspect<T>(token: Token<T>): {
152
+ owner: string;
153
+ singleton: boolean;
154
+ decoratorCount: number;
155
+ cached: boolean;
156
+ } | null;
157
+ }
158
+
159
+ /**
160
+ * Pipeline — Koa-style middleware chain with named middleware
161
+ * and position-aware insertion. Generic over input type T.
162
+ */
163
+ type NextFn<T> = (value: T) => Promise<T>;
164
+ type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;
165
+ /**
166
+ * Called when a middleware crashes (throws or rejects). Used by the
167
+ * Pipeline's error boundary to log the offender without aborting the run.
168
+ *
169
+ * Return `'rethrow'` to propagate the error (default for core middleware),
170
+ * or `'swallow'` to skip past the crashing middleware and continue with the
171
+ * value the previous one produced. Plugin middleware should usually be
172
+ * swallowed so one bad plugin can't kill an agent run.
173
+ */
174
+ type PipelineErrorPolicy = 'rethrow' | 'swallow';
175
+ interface PipelineErrorEvent {
176
+ middleware: string;
177
+ owner?: string | undefined;
178
+ err: unknown;
179
+ }
180
+ type PipelineErrorHandler = (ev: PipelineErrorEvent) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;
181
+ interface Middleware<T> {
182
+ name: string;
183
+ handler: MiddlewareHandler<T>;
184
+ owner?: string | undefined;
185
+ }
186
+ interface PipelineOptions {
187
+ /** When true and the target middleware is not found, operations silently no-op instead of throwing. */
188
+ optional?: boolean | undefined;
189
+ }
190
+ /**
191
+ * Read-only view of a pipeline. Returned to consumers (plugins, hooks)
192
+ * so they can inspect but not mutate the chain.
193
+ */
194
+ interface ReadonlyPipeline<T> {
195
+ readonly size: number;
196
+ list(): readonly string[];
197
+ run(input: T): Promise<T>;
198
+ }
199
+ declare class Pipeline<T> {
200
+ private readonly chain;
201
+ private errorHandler?;
202
+ /**
203
+ * Install an error boundary. When a middleware throws or rejects, the
204
+ * handler is called and decides whether to swallow (continue with the
205
+ * pre-handler value) or rethrow. Without a handler, errors propagate.
206
+ *
207
+ * Wire one per pipeline at boot — the host CLI typically installs a
208
+ * single boundary that logs to the operational log and emits a
209
+ * `pipeline.error` event for /diag.
210
+ */
211
+ setErrorHandler(handler: PipelineErrorHandler | undefined): this;
212
+ use(mw: Middleware<T> | Middleware<unknown>): this;
213
+ prepend(mw: Middleware<T>): this;
214
+ /**
215
+ * Insert middleware at an explicit index. Out-of-range indices are clamped.
216
+ * Use this when insertBefore/insertAfter are insufficient (e.g. to place
217
+ * a middleware at a known position regardless of named targets).
218
+ */
219
+ insertAt(index: number, mw: Middleware<T>): this;
220
+ /**
221
+ * Insert mw immediately before the first occurrence of target.
222
+ * If called multiple times with the same target, each call inserts
223
+ * before the target's current position — so after insertBefore('B', X)
224
+ * then insertBefore('B', Y), the order is Y → X → B.
225
+ */
226
+ insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
227
+ /**
228
+ * Insert mw immediately after the first occurrence of target.
229
+ * If called multiple times with the same target, each call inserts
230
+ * after the target's current position — so after insertAfter('B', X)
231
+ * then insertAfter('B', Y), the order is B → X → Y.
232
+ */
233
+ insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
234
+ replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this;
235
+ remove(name: string, opts?: PipelineOptions): this;
236
+ list(): readonly string[];
237
+ size(): number;
238
+ /** Return a read-only view suitable for passing to plugins. */
239
+ asReadonly(): ReadonlyPipeline<T>;
240
+ run(input: T): Promise<T>;
241
+ private indexOf;
242
+ private ensureUnique;
243
+ }
244
+
245
+ export { type BuildContext as B, Container as C, type Decorator as D, type Factory as F, HookRegistry as H, type MiddlewareHandler as M, type NextFn as N, Pipeline as P, type ReadonlyPipeline as R, type SystemPromptBuilder as S, type Token as T, type Renderer as a, type ModelCapabilities as b, type BindOptions as c, type Middleware as d, type PipelineOptions as e, hookMatcherMatches as h };
@@ -1,9 +1,9 @@
1
- import { E as EventBus, M as MemoryScope, b as MemoryEntry, c as MemoryStore, d as MemoryRelevanceContext, S as ScoredEntry } from './brain-Cdg77tVN.js';
2
- import { S as SecretScrubber } from './permission-B75JAi3-.js';
3
- import { i as SessionStore, h as SessionMetadata, a as SessionWriter, q as ResumedSession, r as SessionData, s as SessionSummary, g as ContentBlock, S as SessionEvent, t as TodoItem, u as ConversationState } from './context-dT5Ueund.js';
4
- import { A as AttachmentStore, a as AddAttachmentInput, b as AttachmentRef, c as Attachment } from './session-reader-D7Dapswh.js';
1
+ import { E as EventBus, M as MemoryScope, b as MemoryEntry, c as MemoryStore, d as MemoryRelevanceContext, S as ScoredEntry } from './brain-69wzMKp1.js';
2
+ import { S as SecretScrubber } from './permission-Bd-57Lbl.js';
3
+ import { i as SessionStore, h as SessionMetadata, a as SessionWriter, t as ResumedSession, u as SessionData, v as SessionSummary, g as ContentBlock, S as SessionEvent, w as TodoItem, x as ConversationState } from './context-C0U8B9NF.js';
4
+ import { A as AttachmentStore, a as AddAttachmentInput, b as AttachmentRef, c as Attachment } from './session-reader-DD4v2Obw.js';
5
5
  import { W as WstackPaths } from './wstack-paths-hOpNLmvf.js';
6
- import { j as ConfigStore, i as Config, k as ConfigLoader, l as SyncConfig } from './config-Du3pYYln.js';
6
+ import { j as ConfigStore, i as Config, k as ConfigLoader, l as SyncConfig } from './config-VKfOZ-6X.js';
7
7
  import { S as SecretVault } from './secret-vault-BAKpgFw_.js';
8
8
 
9
9
  interface SessionStoreOptions {
@@ -1,7 +1,7 @@
1
1
  import { M as ModeStore, a as ModeConfig, b as Mode } from './mode-CZlO9iU1.js';
2
- import { P as Provider, M as Message } from './context-dT5Ueund.js';
3
- import { M as MessageSelector, S as SelectorResult } from './selector-Bc7eWtT3.js';
4
- import { e as ModelsDevModel, R as ResolvedProvider } from './config-Du3pYYln.js';
2
+ import { P as Provider, M as Message } from './context-C0U8B9NF.js';
3
+ import { M as MessageSelector, S as SelectorResult } from './selector-47LBnBVk.js';
4
+ import { e as ModelsDevModel, R as ResolvedProvider } from './config-VKfOZ-6X.js';
5
5
 
6
6
  declare class DefaultModeStore implements ModeStore {
7
7
  private activeModeId;
@@ -1,8 +1,8 @@
1
- import { E as EventBus } from './brain-Cdg77tVN.js';
1
+ import { E as EventBus } from './brain-69wzMKp1.js';
2
2
  import { L as Logger } from './logger-B63L5bTg.js';
3
3
  import { T as Tracer } from './observability-D-HZN_mF.js';
4
- import { P as Provider, R as Request, C as Context, b as Response } from './context-dT5Ueund.js';
5
- import { R as RetryPolicy } from './retry-policy-BilV1ujH.js';
4
+ import { P as Provider, R as Request, C as Context, b as Response } from './context-C0U8B9NF.js';
5
+ import { R as RetryPolicy } from './retry-policy-C3s_lvdK.js';
6
6
 
7
7
  /**
8
8
  * Options passed to a ProviderRunner when calling the provider.
@@ -1,4 +1,4 @@
1
- import { C as Context, b as Response, e as ProviderError } from './context-dT5Ueund.js';
1
+ import { C as Context, b as Response, e as ProviderError } from './context-C0U8B9NF.js';
2
2
 
3
3
  type RecoveryDecision = {
4
4
  /**
@@ -1,15 +1,16 @@
1
1
  import { h as Specification, S as SpecAnalysis, g as SpecValidationResult, e as SpecStatus, f as SpecTemplate, b as SpecRequirement } from '../spec-TBi3Jr6T.js';
2
2
  import { d as TaskGraph, e as TaskNode, i as TaskFilter, j as TaskSort, c as TaskProgress, T as TaskType, a as TaskPriority } from '../task-graph-u1q9Jkyk.js';
3
- import { E as EventBus } from '../brain-Cdg77tVN.js';
4
- import { D as DoneCondition, g as Agent, h as AgentFactory, f as TaskResult } from '../agent-subagent-runner-CzPGP3jA.js';
5
- import '../context-dT5Ueund.js';
6
- import '../index-Bms0m4oy.js';
3
+ import { E as EventBus } from '../brain-69wzMKp1.js';
4
+ import { D as DoneCondition, g as Agent, h as AgentFactory, f as TaskResult } from '../agent-subagent-runner-Bvtf1o9K.js';
5
+ import '../context-C0U8B9NF.js';
6
+ import '../index-gCv830d7.js';
7
7
  import '../logger-B63L5bTg.js';
8
- import '../pipeline-BfD2k1rT.js';
9
- import '../config-Du3pYYln.js';
8
+ import '../pipeline-BDNvENyV.js';
9
+ import '../mailbox-types-Ct2hJq0P.js';
10
+ import '../config-VKfOZ-6X.js';
10
11
  import '../observability-D-HZN_mF.js';
11
- import '../permission-B75JAi3-.js';
12
- import '../retry-policy-BilV1ujH.js';
12
+ import '../permission-Bd-57Lbl.js';
13
+ import '../retry-policy-C3s_lvdK.js';
13
14
 
14
15
  declare class SpecParser {
15
16
  parse(content: string): Specification;
package/dist/sdd/index.js CHANGED
@@ -5697,7 +5697,27 @@ Working rules:
5697
5697
  id: "devops",
5698
5698
  name: "DevOps",
5699
5699
  role: "devops",
5700
- tools: [...TOOLS.build],
5700
+ tools: [
5701
+ ...TOOLS.build,
5702
+ "mcp__ssh__ssh_list_servers",
5703
+ "mcp__ssh__ssh_connection_status",
5704
+ "mcp__ssh__ssh_execute",
5705
+ "mcp__ssh__ssh_execute_sudo",
5706
+ "mcp__ssh__ssh_upload",
5707
+ "mcp__ssh__ssh_download",
5708
+ "mcp__ssh__ssh_sync",
5709
+ "mcp__ssh__ssh_deploy",
5710
+ "mcp__ssh__ssh_health_check",
5711
+ "mcp__ssh__ssh_service_status",
5712
+ "mcp__ssh__ssh_process_manager",
5713
+ "mcp__ssh__ssh_tunnel",
5714
+ "mcp__ssh__ssh_backup_create",
5715
+ "mcp__ssh__ssh_backup_list",
5716
+ "mcp__ssh__ssh_backup_restore",
5717
+ "mcp__ssh__ssh_db_list",
5718
+ "mcp__ssh__ssh_db_query",
5719
+ "mcp__ssh__ssh_profile"
5720
+ ],
5701
5721
  prompt: `You are the DevOps agent. Your job is CI/CD, containerization, and
5702
5722
  deployment configuration: make builds reproducible and deploys safe.
5703
5723
 
@@ -5706,6 +5726,7 @@ Scope:
5706
5726
  - Write Dockerfiles/compose and optimize image size and layer caching
5707
5727
  - Configure deployment (env, secrets handling, health checks, rollback)
5708
5728
  - Diagnose flaky/broken pipelines
5729
+ - Use optional SSH MCP tools for remote hosts when the 'ssh' MCP server is enabled: list servers, run health checks, inspect services, transfer/deploy files, and open tunnels
5709
5730
 
5710
5731
  Input format you accept:
5711
5732
  { "task": "ci | container | deploy | fix-pipeline", "platform": "github-actions | gitlab | docker | k8s", "target": "<what>" }
@@ -5720,7 +5741,8 @@ Working rules:
5720
5741
  - Never hardcode secrets in config; reference the secret store
5721
5742
  - Pin versions for reproducible builds; avoid floating :latest
5722
5743
  - Every deploy path needs a rollback and a health check
5723
- - Treat CI/CD changes as high-risk \u2014 explain blast radius before applying`
5744
+ - Treat CI/CD changes as high-risk \u2014 explain blast radius before applying
5745
+ - For remote SSH work, start with ssh_list_servers / ssh_connection_status, prefer read-only checks first, and do not run destructive commands without explicit user approval`
5724
5746
  },
5725
5747
  budget: MEDIUM_BUDGET,
5726
5748
  capability: {
@@ -5737,6 +5759,13 @@ Working rules:
5737
5759
  "kubernetes",
5738
5760
  "k8s",
5739
5761
  "deploy",
5762
+ "ssh",
5763
+ "remote ssh",
5764
+ "remote server",
5765
+ "sftp",
5766
+ "tunnel",
5767
+ "bastion",
5768
+ "jump host",
5740
5769
  "github actions",
5741
5770
  "container"
5742
5771
  ]
@@ -7083,6 +7112,7 @@ var DefaultMultiAgentCoordinator = class _DefaultMultiAgentCoordinator extends E
7083
7112
  subagentId: result.subagentId,
7084
7113
  taskId: result.taskId,
7085
7114
  status: result.status,
7115
+ result: result.result,
7086
7116
  iterations: result.iterations,
7087
7117
  toolCalls: result.toolCalls,
7088
7118
  durationMs: result.durationMs