@wrongstack/core 0.260.0 → 0.265.1

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 (99) hide show
  1. package/dist/{agent-bridge-BbskZ7HH.d.ts → agent-bridge-DrkBxszZ.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-BNIGZx18.d.ts → agent-subagent-runner-DM2pP-B6.d.ts} +116 -12
  3. package/dist/{brain-C2yDd7Lw.d.ts → brain-BXd_61kQ.d.ts} +32 -3
  4. package/dist/{compactor-t0R_AIt_.d.ts → compactor-B8pOf45Y.d.ts} +1 -1
  5. package/dist/{config-FG6As4H5.d.ts → config-BMCj_XDs.d.ts} +86 -12
  6. package/dist/{context-JFOVvu6z.d.ts → context-MRk5PhNv.d.ts} +26 -1
  7. package/dist/coordination/index.d.ts +1737 -15
  8. package/dist/coordination/index.js +3152 -494
  9. package/dist/coordination/index.js.map +1 -1
  10. package/dist/{default-config-CXsDvOmP.d.ts → default-config-B0cj-Hry.d.ts} +11 -1
  11. package/dist/defaults/index.d.ts +28 -28
  12. package/dist/defaults/index.js +1804 -1363
  13. package/dist/defaults/index.js.map +1 -1
  14. package/dist/dispatcher-types.d-BBeXBQgS.d.ts +66 -0
  15. package/dist/execution/index.d.ts +16 -16
  16. package/dist/execution/index.js +933 -672
  17. package/dist/execution/index.js.map +1 -1
  18. package/dist/execution/prompt-enhancer.d.ts +1 -1
  19. package/dist/execution/prompt-enhancer.js +7 -1
  20. package/dist/execution/prompt-enhancer.js.map +1 -1
  21. package/dist/extension/index.d.ts +6 -6
  22. package/dist/extension/index.js.map +1 -1
  23. package/dist/{goal-preamble-B1IXJtLX.d.ts → goal-preamble-DvHDSKSe.d.ts} +26 -10
  24. package/dist/{goal-store-CPXz6Mml.d.ts → goal-store-DtLMySNb.d.ts} +1 -1
  25. package/dist/{index-CebbJB94.d.ts → index-B-ch8K9C.d.ts} +8 -8
  26. package/dist/{index-BPcg4N3M.d.ts → index-CEDeNodM.d.ts} +5 -5
  27. package/dist/index.d.ts +189 -104
  28. package/dist/index.js +24693 -21162
  29. package/dist/index.js.map +1 -1
  30. package/dist/infrastructure/index.d.ts +6 -6
  31. package/dist/infrastructure/index.js +12 -8
  32. package/dist/infrastructure/index.js.map +1 -1
  33. package/dist/kernel/index.d.ts +9 -9
  34. package/dist/kernel/index.js +7 -2
  35. package/dist/kernel/index.js.map +1 -1
  36. package/dist/{llm-selector-DXxI2tlu.d.ts → llm-selector-C0tfTCUe.d.ts} +14 -2
  37. package/dist/{mcp-servers-OwNHo43-.d.ts → mcp-servers-2x4w6Jn9.d.ts} +3 -3
  38. package/dist/models/index.d.ts +5 -5
  39. package/dist/models/index.js +80 -31
  40. package/dist/models/index.js.map +1 -1
  41. package/dist/{models-registry-Djlmq4uB.d.ts → models-registry-DmJlKuNp.d.ts} +1 -1
  42. package/dist/{multi-agent-coordinator-CEmrSCMJ.d.ts → multi-agent-coordinator-DyCkCZnU.d.ts} +2 -2
  43. package/dist/{null-fleet-bus-DT92xqgJ.d.ts → null-fleet-bus-CG9QY2aP.d.ts} +6 -6
  44. package/dist/observability/index.d.ts +2 -2
  45. package/dist/observability/index.js +8 -3
  46. package/dist/observability/index.js.map +1 -1
  47. package/dist/{parallel-eternal-engine-0SItuq5r.d.ts → parallel-eternal-engine-Jw9uhEoT.d.ts} +9 -9
  48. package/dist/{path-resolver-DKBh6Jlo.d.ts → path-resolver-Dy2ej-gE.d.ts} +3 -3
  49. package/dist/{permission-BJ7eO9Vl.d.ts → permission-B9SB45lp.d.ts} +1 -1
  50. package/dist/{permission-policy-DEXOfnpm.d.ts → permission-policy-CkjSXabK.d.ts} +2 -2
  51. package/dist/{pipeline-zflkI2dp.d.ts → pipeline-DPDxH_7m.d.ts} +59 -4
  52. package/dist/{plan-templates-BFXyRkEK.d.ts → plan-templates-CzD9GnAU.d.ts} +32 -8
  53. package/dist/{provider-runner-BC-uywtT.d.ts → provider-runner-DMa70ODu.d.ts} +3 -3
  54. package/dist/{retry-policy-Cavrzmtk.d.ts → retry-policy-CN0khdlj.d.ts} +1 -1
  55. package/dist/sdd/index.d.ts +8 -8
  56. package/dist/sdd/index.js +313 -122
  57. package/dist/sdd/index.js.map +1 -1
  58. package/dist/{secret-vault-CDvDYXWX.d.ts → secret-vault-B2yw84VT.d.ts} +43 -4
  59. package/dist/secret-vault-BAKpgFw_.d.ts +57 -0
  60. package/dist/security/index.d.ts +5 -5
  61. package/dist/security/index.js +411 -225
  62. package/dist/security/index.js.map +1 -1
  63. package/dist/{selector-B7AivHsu.d.ts → selector-CzHh_igB.d.ts} +1 -1
  64. package/dist/{session-event-bridge-BmIDxdJd.d.ts → session-event-bridge-BUI6Jf-4.d.ts} +8 -2
  65. package/dist/{session-reader-DtofsB-2.d.ts → session-reader-CMgdMSRP.d.ts} +1 -1
  66. package/dist/skills/index.js +67 -64
  67. package/dist/skills/index.js.map +1 -1
  68. package/dist/storage/index.d.ts +132 -16
  69. package/dist/storage/index.js +851 -432
  70. package/dist/storage/index.js.map +1 -1
  71. package/dist/tools/index.d.ts +57 -0
  72. package/dist/tools/index.js +411 -0
  73. package/dist/tools/index.js.map +1 -0
  74. package/dist/types/index.d.ts +21 -21
  75. package/dist/types/index.js +928 -711
  76. package/dist/types/index.js.map +1 -1
  77. package/dist/utils/error.d.ts +7 -0
  78. package/dist/utils/error.js +8 -0
  79. package/dist/utils/error.js.map +1 -0
  80. package/dist/utils/index.d.ts +8 -68
  81. package/dist/utils/index.js +20 -10
  82. package/dist/utils/index.js.map +1 -1
  83. package/dist/{wstack-paths-CJjEwPXn.d.ts → wstack-paths-hOpNLmvf.d.ts} +2 -0
  84. package/package.json +5 -1
  85. package/skills/api-design/SKILL.md +1 -1
  86. package/skills/audit-log/SKILL.md +6 -6
  87. package/skills/bug-hunter/SKILL.md +5 -5
  88. package/skills/chimera/SKILL.md +4 -4
  89. package/skills/docker-deploy/SKILL.md +1 -1
  90. package/skills/git-flow/SKILL.md +3 -3
  91. package/skills/multi-agent/SKILL.md +3 -3
  92. package/skills/node-modern/SKILL.md +1 -0
  93. package/skills/observability/SKILL.md +2 -2
  94. package/skills/output-standards/SKILL.md +51 -28
  95. package/skills/refactor-planner/SKILL.md +3 -3
  96. package/skills/security-scanner/SKILL.md +4 -3
  97. package/skills/tech-stack/SKILL.md +1 -2
  98. package/dist/package-outdated-watcher-C70ag2G9.d.ts +0 -581
  99. package/dist/secret-vault-BJDY28ev.d.ts +0 -25
@@ -1,4 +1,4 @@
1
- import { M as ModelsRegistry, a as ModelsDevPayload, R as ResolvedProvider, b as ResolvedModel, W as WireFamily } from './config-FG6As4H5.js';
1
+ import { M as ModelsRegistry, a as ModelsDevPayload, R as ResolvedProvider, b as ResolvedModel, W as WireFamily } from './config-BMCj_XDs.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-BNIGZx18.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-DM2pP-B6.js';
2
2
  import { EventEmitter } from 'node:events';
3
3
 
4
4
  /**
@@ -319,4 +319,4 @@ declare class DefaultMultiAgentCoordinator extends EventEmitter implements Multi
319
319
  private isDone;
320
320
  }
321
321
 
322
- export { type AgentDefinition as A, type DispatchClassifier as D, HEAVY_BUDGET as H, LIGHT_BUDGET as L, MEDIUM_BUDGET as M, TOOLS as T, DefaultMultiAgentCoordinator as a, type AgentBudgetTier as b, type AgentCapability as c, type AgentPhase as d, DEFAULT_DISPATCH_ROLE as e, type DispatchCandidate as f, type DispatchMethod as g, type DispatchOptions as h, type DispatchResult as i, type MultiAgentCoordinatorOptions as j, dispatchAgent as k, makeLLMClassifier as m, scoreAgents as s };
322
+ export { type AgentPhase as A, type DispatchClassifier as D, HEAVY_BUDGET as H, LIGHT_BUDGET as L, MEDIUM_BUDGET as M, TOOLS as T, DefaultMultiAgentCoordinator as a, type AgentDefinition as b, type AgentBudgetTier as c, type AgentCapability as d, DEFAULT_DISPATCH_ROLE as e, type DispatchCandidate as f, type DispatchMethod as g, type DispatchOptions as h, type DispatchResult as i, type MultiAgentCoordinatorOptions as j, dispatchAgent as k, makeLLMClassifier as m, scoreAgents as s };
@@ -1,11 +1,11 @@
1
- import { d as AgentPhase, A as AgentDefinition, a as DefaultMultiAgentCoordinator, D as DispatchClassifier } from './multi-agent-coordinator-CEmrSCMJ.js';
2
- import { F as FleetBus, u as FleetUsage, S as SubagentConfig, v as FleetUsageAggregator, f as TaskResult, C as CoordinatorStatus, T as TaskSpec, c as MultiAgentConfig, d as SubagentRunner } from './agent-subagent-runner-BNIGZx18.js';
3
- import { a as SessionWriter, T as Tool, i as SessionStore } from './context-JFOVvu6z.js';
4
- import { B as BrainArbiter, E as EventBus } from './brain-C2yDd7Lw.js';
1
+ import { A as AgentPhase, b as AgentDefinition, a as DefaultMultiAgentCoordinator, D as DispatchClassifier } from './multi-agent-coordinator-DyCkCZnU.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-DM2pP-B6.js';
3
+ import { a as SessionWriter, T as Tool, i as SessionStore } from './context-MRk5PhNv.js';
4
+ import { B as BrainArbiter, E as EventBus } from './brain-BXd_61kQ.js';
5
5
  import { EventEmitter } from 'node:events';
6
6
  import { D as DirectorStateSnapshot } from './director-state-BfeCUbmk.js';
7
- import { d as ModelMatrixEntry } from './config-FG6As4H5.js';
8
- import { I as InMemoryAgentBridge } from './agent-bridge-BbskZ7HH.js';
7
+ import { d as ModelMatrixEntry } from './config-BMCj_XDs.js';
8
+ import { I as InMemoryAgentBridge } from './agent-bridge-DrkBxszZ.js';
9
9
 
10
10
  /**
11
11
  * 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-C2yDd7Lw.js';
3
- import '../context-JFOVvu6z.js';
2
+ import { E as EventBus } from '../brain-BXd_61kQ.js';
3
+ import '../context-MRk5PhNv.js';
4
4
 
5
5
  /**
6
6
  * In-memory metrics sink. Suitable for embedded use, tests, and /metrics
@@ -126,6 +126,11 @@ var NoopMetricsSink = class {
126
126
  }
127
127
  };
128
128
 
129
+ // src/utils/error.ts
130
+ function toErrorMessage(err) {
131
+ return err instanceof Error ? err.message : String(err);
132
+ }
133
+
129
134
  // src/observability/health.ts
130
135
  var SEVERITY = {
131
136
  healthy: 0,
@@ -168,7 +173,7 @@ var DefaultHealthRegistry = class {
168
173
  try {
169
174
  return await Promise.race([check.check(), timeout]);
170
175
  } catch (err) {
171
- return { status: "unhealthy", detail: err instanceof Error ? err.message : String(err) };
176
+ return { status: "unhealthy", detail: toErrorMessage(err) };
172
177
  } finally {
173
178
  if (timer) clearTimeout(timer);
174
179
  }
@@ -361,7 +366,7 @@ async function startMetricsServer(opts) {
361
366
  } catch (err) {
362
367
  res.statusCode = 500;
363
368
  res.setHeader("content-type", "text/plain; charset=utf-8");
364
- res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);
369
+ res.end(`metrics render failed: ${toErrorMessage(err)}`);
365
370
  return;
366
371
  }
367
372
  res.statusCode = 200;
@@ -379,7 +384,7 @@ async function startMetricsServer(opts) {
379
384
  (err) => {
380
385
  res.statusCode = 500;
381
386
  res.setHeader("content-type", "text/plain; charset=utf-8");
382
- res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);
387
+ res.end(`health run failed: ${toErrorMessage(err)}`);
383
388
  }
384
389
  );
385
390
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/observability/metrics.ts","../../src/observability/health.ts","../../src/observability/tracer.ts","../../src/observability/otel-tracer.ts","../../src/observability/event-bridge.ts","../../src/observability/prometheus.ts","../../src/observability/otlp-metrics.ts","../../src/observability/otlp-traces.ts"],"names":["DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n MetricLabels,\n MetricSeries,\n MetricsSink,\n MetricsSnapshot,\n} from '../types/observability.js';\n\ninterface CounterState {\n value: number;\n}\n\ninterface GaugeState {\n value: number;\n}\n\ninterface HistogramState {\n count: number;\n sum: number;\n min: number;\n max: number;\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\n // on p99 for typical agent workloads — small memory footprint, no exporter\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\n samples: number[];\n}\n\nconst RESERVOIR_SIZE = 1024;\n\nfunction labelKey(labels: MetricLabels | undefined): string {\n if (!labels) return '';\n const keys = Object.keys(labels).sort();\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\n return sorted[idx] ?? 0;\n}\n\n/**\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\n * scrape over HTTP. For production push-based pipelines, write an adapter\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\n */\nexport class InMemoryMetricsSink implements MetricsSink {\n private counters = new Map<string, Map<string, CounterState>>();\n private gauges = new Map<string, Map<string, GaugeState>>();\n private histograms = new Map<string, Map<string, HistogramState>>();\n\n counter(name: string, value = 1, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.counters, name);\n const key = labelKey(labels);\n const state = series.get(key) ?? { value: 0 };\n state.value += value;\n series.set(key, state);\n }\n\n gauge(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.gauges, name);\n series.set(labelKey(labels), { value });\n }\n\n histogram(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.histograms, name);\n const key = labelKey(labels);\n let state = series.get(key);\n if (!state) {\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\n series.set(key, state);\n }\n state.count++;\n state.sum += value;\n if (value < state.min) state.min = value;\n if (value > state.max) state.max = value;\n if (state.samples.length < RESERVOIR_SIZE) {\n state.samples.push(value);\n } else {\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\n const r = Math.floor(Math.random() * state.count);\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\n }\n }\n\n snapshot(): MetricsSnapshot {\n const series: MetricSeries[] = [];\n\n for (const [name, byLabel] of this.counters) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'counter',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.gauges) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'gauge',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.histograms) {\n for (const [key, state] of byLabel) {\n const sorted = [...state.samples].sort((a, b) => a - b);\n series.push({\n name,\n type: 'histogram',\n labels: parseLabelKey(key),\n values: {\n count: state.count,\n sum: state.sum,\n min: state.min,\n max: state.max,\n p50: quantile(sorted, 0.5),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n });\n }\n }\n\n return { timestamp: Date.now(), series };\n }\n\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n private getOrCreate<V>(bag: Map<string, Map<string, V>>, name: string): Map<string, V> {\n let series = bag.get(name);\n if (!series) {\n series = new Map();\n bag.set(name, series);\n }\n return series;\n }\n}\n\nfunction parseLabelKey(key: string): MetricLabels {\n if (!key) return {};\n const labels: MetricLabels = {};\n for (const pair of key.split(',')) {\n const eq = pair.indexOf('=');\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return labels;\n}\n\n/** Cheap noop sink — drop-in default when observability is not configured. */\nexport class NoopMetricsSink implements MetricsSink {\n counter(): void {}\n gauge(): void {}\n histogram(): void {}\n snapshot(): MetricsSnapshot {\n return { timestamp: Date.now(), series: [] };\n }\n reset(): void {}\n}\n","import type {\n AggregateHealth,\n HealthCheck,\n HealthCheckResult,\n HealthRegistry,\n HealthStatus,\n} from '../types/observability.js';\n\nconst SEVERITY: Record<HealthStatus, number> = {\n healthy: 0,\n degraded: 1,\n unhealthy: 2,\n};\n\n/**\n * Aggregates registered health checks. Worst status wins — one unhealthy check\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\n * the response.\n */\nexport class DefaultHealthRegistry implements HealthRegistry {\n private checks = new Map<string, HealthCheck>();\n private readonly timeoutMs: number;\n\n constructor(opts: { timeoutMs?: number | undefined } = {}) {\n this.timeoutMs = opts.timeoutMs ?? 5_000;\n }\n\n register(check: HealthCheck): void {\n this.checks.set(check.name, check);\n }\n\n unregister(name: string): void {\n this.checks.delete(name);\n }\n\n async run(): Promise<AggregateHealth> {\n const results = await Promise.all(\n Array.from(this.checks.values()).map(async (c) => {\n const result = await this.runOne(c);\n return { name: c.name, ...result };\n }),\n );\n\n let status: HealthStatus = 'healthy';\n for (const r of results) {\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\n }\n\n return { status, timestamp: Date.now(), checks: results };\n }\n\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<HealthCheckResult>((resolve) => {\n timer = setTimeout(\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\n this.timeoutMs,\n );\n });\n try {\n return await Promise.race([check.check(), timeout]);\n } catch (err) {\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n","import type { Span, Tracer } from '../types/observability.js';\n\n/**\n * Default tracer is a noop — zero overhead when observability is not wired up.\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\n */\nexport class NoopTracer implements Tracer {\n startSpan(): Span {\n return NOOP_SPAN;\n }\n}\n\nconst NOOP_SPAN: Span = {\n setAttribute() {},\n recordError() {},\n end() {},\n};\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string | undefined; name?: string | undefined }): unknown;\n setStatus?(status: { code: number; message?: string | undefined }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { MetricsSink } from '../types/observability.js';\n\n/**\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\n * that detaches all listeners. This is the single integration point between\n * the agent's event stream and the observability layer — no metric calls\n * leak into core call sites.\n */\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\n const unsubs: Array<() => void> = [];\n\n unsubs.push(\n events.on('session.started', () => sink.counter('agent.sessions.started')),\n events.on('session.ended', (e) => {\n sink.counter('agent.sessions.ended');\n sink.histogram('agent.session.tokens.input', e.usage.input);\n sink.histogram('agent.session.tokens.output', e.usage.output);\n }),\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\n events.on('provider.response', (e) => {\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\n sink.counter('provider.tokens.input', e.usage.input);\n sink.counter('provider.tokens.output', e.usage.output);\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\n }),\n events.on('provider.retry', (e) =>\n sink.counter('provider.retries.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n }),\n ),\n events.on('provider.error', (e) =>\n sink.counter('provider.errors.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n retryable: String(e.retryable),\n }),\n ),\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\n events.on('tool.executed', (e) => {\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\n }),\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\n events.on('compaction.fired', (e) => {\n sink.counter('compaction.fired.total');\n sink.histogram('compaction.reduction_tokens', e.report.before - e.report.after);\n }),\n events.on('mcp.server.connected', (e) =>\n sink.counter('mcp.connects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.reconnected', (e) =>\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.disconnected', (e) =>\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\n ),\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\n );\n\n return () => {\n for (const u of unsubs) u();\n };\n}\n","import type { HealthRegistry, MetricsSink, MetricsSnapshot } from '../types/observability.js';\n\n/** TLS options for HTTPS metrics endpoint. */\nexport interface MetricsTlsOptions {\n cert: string;\n key: string;\n}\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<\n string,\n { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }\n >();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string | undefined;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string | undefined;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry | undefined;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string | undefined;\n /** Enable HTTPS by providing TLS key/cert. Both required. */\n tls?: MetricsTlsOptions | undefined;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const tls = opts.tls;\n const useHttps = !!(tls?.cert && tls?.key);\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n type RequestListener = (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => void;\n const listener: RequestListener = (req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n if (healthRegistry && url === healthPath) {\n healthRegistry.run().then(\n (agg) => {\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n };\n\n let server: import('node:http').Server;\n if (useHttps && tls) {\n const { createServer } = await import('node:https');\n const { readFileSync } = await import('node:fs');\n server = createServer(\n { cert: readFileSync(tls.cert), key: readFileSync(tls.key) },\n listener,\n );\n } else {\n const { createServer } = await import('node:http');\n server = createServer(listener);\n }\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n const protocol = useHttps ? 'https' : 'http';\n return {\n port: boundPort,\n url: `${protocol}://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number | undefined;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string | undefined;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string | undefined;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number | undefined;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch | undefined;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: ((err: unknown) => void) | undefined;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number | undefined;\n asInt?: string | undefined;\n count?: string | undefined;\n sum?: number | undefined;\n quantileValues?: { quantile: number | undefined; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string | undefined;\n unit?: string | undefined;\n sum?: { dataPoints: OtlpDataPoint[] | undefined; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] | undefined };\n summary?: { dataPoints: OtlpDataPoint[] | undefined };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string | undefined };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string | undefined } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint | undefined;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string | undefined };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number | undefined;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number | undefined;\n /** Authorization header. */\n authorization?: string | undefined;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string | undefined;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number | undefined;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch | undefined;\n /** Called on push failure. Defaults to silent. */\n onError?: ((err: unknown) => void) | undefined;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string | undefined };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string | undefined } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) => encodeAttr(k, v)),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(opts: OtlpTraceExporterOptions): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/observability/metrics.ts","../../src/utils/error.ts","../../src/observability/health.ts","../../src/observability/tracer.ts","../../src/observability/otel-tracer.ts","../../src/observability/event-bridge.ts","../../src/observability/prometheus.ts","../../src/observability/otlp-metrics.ts","../../src/observability/otlp-traces.ts"],"names":["DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n MetricLabels,\n MetricSeries,\n MetricsSink,\n MetricsSnapshot,\n} from '../types/observability.js';\n\ninterface CounterState {\n value: number;\n}\n\ninterface GaugeState {\n value: number;\n}\n\ninterface HistogramState {\n count: number;\n sum: number;\n min: number;\n max: number;\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\n // on p99 for typical agent workloads — small memory footprint, no exporter\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\n samples: number[];\n}\n\nconst RESERVOIR_SIZE = 1024;\n\nfunction labelKey(labels: MetricLabels | undefined): string {\n if (!labels) return '';\n const keys = Object.keys(labels).sort();\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\n return sorted[idx] ?? 0;\n}\n\n/**\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\n * scrape over HTTP. For production push-based pipelines, write an adapter\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\n */\nexport class InMemoryMetricsSink implements MetricsSink {\n private counters = new Map<string, Map<string, CounterState>>();\n private gauges = new Map<string, Map<string, GaugeState>>();\n private histograms = new Map<string, Map<string, HistogramState>>();\n\n counter(name: string, value = 1, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.counters, name);\n const key = labelKey(labels);\n const state = series.get(key) ?? { value: 0 };\n state.value += value;\n series.set(key, state);\n }\n\n gauge(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.gauges, name);\n series.set(labelKey(labels), { value });\n }\n\n histogram(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.histograms, name);\n const key = labelKey(labels);\n let state = series.get(key);\n if (!state) {\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\n series.set(key, state);\n }\n state.count++;\n state.sum += value;\n if (value < state.min) state.min = value;\n if (value > state.max) state.max = value;\n if (state.samples.length < RESERVOIR_SIZE) {\n state.samples.push(value);\n } else {\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\n const r = Math.floor(Math.random() * state.count);\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\n }\n }\n\n snapshot(): MetricsSnapshot {\n const series: MetricSeries[] = [];\n\n for (const [name, byLabel] of this.counters) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'counter',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.gauges) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'gauge',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.histograms) {\n for (const [key, state] of byLabel) {\n const sorted = [...state.samples].sort((a, b) => a - b);\n series.push({\n name,\n type: 'histogram',\n labels: parseLabelKey(key),\n values: {\n count: state.count,\n sum: state.sum,\n min: state.min,\n max: state.max,\n p50: quantile(sorted, 0.5),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n });\n }\n }\n\n return { timestamp: Date.now(), series };\n }\n\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n private getOrCreate<V>(bag: Map<string, Map<string, V>>, name: string): Map<string, V> {\n let series = bag.get(name);\n if (!series) {\n series = new Map();\n bag.set(name, series);\n }\n return series;\n }\n}\n\nfunction parseLabelKey(key: string): MetricLabels {\n if (!key) return {};\n const labels: MetricLabels = {};\n for (const pair of key.split(',')) {\n const eq = pair.indexOf('=');\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return labels;\n}\n\n/** Cheap noop sink — drop-in default when observability is not configured. */\nexport class NoopMetricsSink implements MetricsSink {\n counter(): void {}\n gauge(): void {}\n histogram(): void {}\n snapshot(): MetricsSnapshot {\n return { timestamp: Date.now(), series: [] };\n }\n reset(): void {}\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import { toErrorMessage } from '../utils/error.js';\nimport type {\n AggregateHealth,\n HealthCheck,\n HealthCheckResult,\n HealthRegistry,\n HealthStatus,\n} from '../types/observability.js';\n\nconst SEVERITY: Record<HealthStatus, number> = {\n healthy: 0,\n degraded: 1,\n unhealthy: 2,\n};\n\n/**\n * Aggregates registered health checks. Worst status wins — one unhealthy check\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\n * the response.\n */\nexport class DefaultHealthRegistry implements HealthRegistry {\n private checks = new Map<string, HealthCheck>();\n private readonly timeoutMs: number;\n\n constructor(opts: { timeoutMs?: number | undefined } = {}) {\n this.timeoutMs = opts.timeoutMs ?? 5_000;\n }\n\n register(check: HealthCheck): void {\n this.checks.set(check.name, check);\n }\n\n unregister(name: string): void {\n this.checks.delete(name);\n }\n\n async run(): Promise<AggregateHealth> {\n const results = await Promise.all(\n Array.from(this.checks.values()).map(async (c) => {\n const result = await this.runOne(c);\n return { name: c.name, ...result };\n }),\n );\n\n let status: HealthStatus = 'healthy';\n for (const r of results) {\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\n }\n\n return { status, timestamp: Date.now(), checks: results };\n }\n\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<HealthCheckResult>((resolve) => {\n timer = setTimeout(\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\n this.timeoutMs,\n );\n });\n try {\n return await Promise.race([check.check(), timeout]);\n } catch (err) {\n return { status: 'unhealthy', detail: toErrorMessage(err) };\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n","import type { Span, Tracer } from '../types/observability.js';\n\n/**\n * Default tracer is a noop — zero overhead when observability is not wired up.\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\n */\nexport class NoopTracer implements Tracer {\n startSpan(): Span {\n return NOOP_SPAN;\n }\n}\n\nconst NOOP_SPAN: Span = {\n setAttribute() {},\n recordError() {},\n end() {},\n};\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string | undefined; name?: string | undefined }): unknown;\n setStatus?(status: { code: number; message?: string | undefined }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { MetricsSink } from '../types/observability.js';\n\n/**\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\n * that detaches all listeners. This is the single integration point between\n * the agent's event stream and the observability layer — no metric calls\n * leak into core call sites.\n */\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\n const unsubs: Array<() => void> = [];\n\n unsubs.push(\n events.on('session.started', () => sink.counter('agent.sessions.started')),\n events.on('session.ended', (e) => {\n sink.counter('agent.sessions.ended');\n sink.histogram('agent.session.tokens.input', e.usage.input);\n sink.histogram('agent.session.tokens.output', e.usage.output);\n }),\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\n events.on('provider.response', (e) => {\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\n sink.counter('provider.tokens.input', e.usage.input);\n sink.counter('provider.tokens.output', e.usage.output);\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\n }),\n events.on('provider.retry', (e) =>\n sink.counter('provider.retries.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n }),\n ),\n events.on('provider.error', (e) =>\n sink.counter('provider.errors.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n retryable: String(e.retryable),\n }),\n ),\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\n events.on('tool.executed', (e) => {\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\n }),\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\n events.on('compaction.fired', (e) => {\n sink.counter('compaction.fired.total');\n sink.histogram('compaction.reduction_tokens', e.report.before - e.report.after);\n }),\n events.on('mcp.server.connected', (e) =>\n sink.counter('mcp.connects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.reconnected', (e) =>\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.disconnected', (e) =>\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\n ),\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\n );\n\n return () => {\n for (const u of unsubs) u();\n };\n}\n","import type { HealthRegistry, MetricsSink, MetricsSnapshot } from '../types/observability.js';\nimport { toErrorMessage } from '../utils/error.js';\n\n/** TLS options for HTTPS metrics endpoint. */\nexport interface MetricsTlsOptions {\n cert: string;\n key: string;\n}\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<\n string,\n { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }\n >();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string | undefined;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string | undefined;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry | undefined;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string | undefined;\n /** Enable HTTPS by providing TLS key/cert. Both required. */\n tls?: MetricsTlsOptions | undefined;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const tls = opts.tls;\n const useHttps = !!(tls?.cert && tls?.key);\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n type RequestListener = (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => void;\n const listener: RequestListener = (req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${toErrorMessage(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n if (healthRegistry && url === healthPath) {\n healthRegistry.run().then(\n (agg) => {\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${toErrorMessage(err)}`);\n },\n );\n return;\n }\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n };\n\n let server: import('node:http').Server;\n if (useHttps && tls) {\n const { createServer } = await import('node:https');\n const { readFileSync } = await import('node:fs');\n server = createServer(\n { cert: readFileSync(tls.cert), key: readFileSync(tls.key) },\n listener,\n );\n } else {\n const { createServer } = await import('node:http');\n server = createServer(listener);\n }\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n const protocol = useHttps ? 'https' : 'http';\n return {\n port: boundPort,\n url: `${protocol}://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number | undefined;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string | undefined;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string | undefined;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number | undefined;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch | undefined;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: ((err: unknown) => void) | undefined;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number | undefined;\n asInt?: string | undefined;\n count?: string | undefined;\n sum?: number | undefined;\n quantileValues?: { quantile: number | undefined; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string | undefined;\n unit?: string | undefined;\n sum?: { dataPoints: OtlpDataPoint[] | undefined; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] | undefined };\n summary?: { dataPoints: OtlpDataPoint[] | undefined };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string | undefined };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string | undefined } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint | undefined;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string | undefined };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number | undefined;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number | undefined;\n /** Authorization header. */\n authorization?: string | undefined;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string | undefined;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number | undefined;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch | undefined;\n /** Called on push failure. Defaults to silent. */\n onError?: ((err: unknown) => void) | undefined;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string | undefined };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string | undefined } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) => encodeAttr(k, v)),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(opts: OtlpTraceExporterOptions): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n"]}
@@ -1,12 +1,12 @@
1
- import { e as ProviderError, C as Context, T as Tool, l as ToolUseBlock, m as ToolResultBlock } from './context-JFOVvu6z.js';
2
- import { R as RetryPolicy, E as ErrorHandler, a as RecoveryDecision } from './retry-policy-Cavrzmtk.js';
3
- import { C as Compactor, a as CompactReport } from './compactor-t0R_AIt_.js';
4
- import { M as ModelsRegistry } from './config-FG6As4H5.js';
5
- import { T as ToolExecutorOptions, a as ToolExecutorStrategy, b as ToolBatchResult } from './index-BPcg4N3M.js';
6
- import { g as Agent, h as AgentFactory } from './agent-subagent-runner-BNIGZx18.js';
7
- import { B as BrainArbiter, E as EventBus } from './brain-C2yDd7Lw.js';
8
- import { J as JournalEntry } from './goal-store-CPXz6Mml.js';
9
- import { D as DispatchClassifier, a as DefaultMultiAgentCoordinator } from './multi-agent-coordinator-CEmrSCMJ.js';
1
+ import { e as ProviderError, C as Context, T as Tool, l as ToolUseBlock, m as ToolResultBlock } from './context-MRk5PhNv.js';
2
+ import { R as RetryPolicy, E as ErrorHandler, a as RecoveryDecision } from './retry-policy-CN0khdlj.js';
3
+ import { C as Compactor, a as CompactReport } from './compactor-B8pOf45Y.js';
4
+ import { M as ModelsRegistry } from './config-BMCj_XDs.js';
5
+ import { T as ToolExecutorOptions, a as ToolExecutorStrategy, b as ToolBatchResult } from './index-CEDeNodM.js';
6
+ import { g as Agent, h as AgentFactory } from './agent-subagent-runner-DM2pP-B6.js';
7
+ import { B as BrainArbiter, E as EventBus } from './brain-BXd_61kQ.js';
8
+ import { J as JournalEntry } from './goal-store-DtLMySNb.js';
9
+ import { D as DispatchClassifier, a as DefaultMultiAgentCoordinator } from './multi-agent-coordinator-DyCkCZnU.js';
10
10
 
11
11
  declare class DefaultRetryPolicy implements RetryPolicy {
12
12
  shouldRetry(err: Error | ProviderError, attempt: number): boolean;
@@ -1,6 +1,6 @@
1
- import { E as EventBus } from './brain-C2yDd7Lw.js';
2
- import { M as ModelsRegistry, b as ResolvedModel } from './config-FG6As4H5.js';
3
- import { c as TokenCounter, U as Usage, d as CacheStats } from './context-JFOVvu6z.js';
1
+ import { E as EventBus } from './brain-BXd_61kQ.js';
2
+ import { M as ModelsRegistry, b as ResolvedModel } from './config-BMCj_XDs.js';
3
+ import { c as TokenCounter, U as Usage, d as CacheStats } from './context-MRk5PhNv.js';
4
4
  import { P as PathResolver } from './path-resolver-CPRj4bFY.js';
5
5
 
6
6
  /**
@@ -1,4 +1,4 @@
1
- import { T as Tool, C as Context, f as Permission } from './context-JFOVvu6z.js';
1
+ import { T as Tool, C as Context, f as Permission } from './context-MRk5PhNv.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-JFOVvu6z.js';
1
+ import { T as Tool, C as Context } from './context-MRk5PhNv.js';
2
2
  import { I as InputReader } from './input-reader-E-ffP2ee.js';
3
- import { P as PermissionPolicy, a as PermissionDecision } from './permission-BJ7eO9Vl.js';
3
+ import { P as PermissionPolicy, a as PermissionDecision } from './permission-B9SB45lp.js';
4
4
 
5
5
  interface PermissionPolicyOptions {
6
6
  trustFile: string;
@@ -1,5 +1,5 @@
1
- import { T as Tool, n as TextBlock, g as ContentBlock } from './context-JFOVvu6z.js';
2
- import { H as HookEvent, e as HookMatcher, I as InProcessHook, S as ShellHook, f as HookEntry } from './config-FG6As4H5.js';
1
+ import { T as Tool, n as TextBlock, g as ContentBlock } from './context-MRk5PhNv.js';
2
+ import { H as HookEvent, e as HookMatcher, I as InProcessHook, S as ShellHook, f as HookEntry } from './config-BMCj_XDs.js';
3
3
 
4
4
  /**
5
5
  * Mailbox — persistent inter-agent messaging system with cross-session support.
@@ -27,7 +27,7 @@ import { H as HookEvent, e as HookMatcher, I as InProcessHook, S as ShellHook, f
27
27
  *
28
28
  * @module mailbox-types
29
29
  */
30
- type MailboxMessageType = 'note' | 'ask' | 'assign' | 'steer' | 'btw' | 'broadcast' | 'status' | 'result';
30
+ type MailboxMessageType = 'note' | 'ask' | 'assign' | 'steer' | 'btw' | 'broadcast' | 'status' | 'result' | 'control';
31
31
  /**
32
32
  * Per-recipient read status. `readBy` maps agentId → ISO8601 timestamp of
33
33
  * when that agent first read the message. An empty map means unread by all.
@@ -196,6 +196,18 @@ interface MailboxAckInput {
196
196
  /** Optional outcome summary. */
197
197
  outcome?: string | undefined;
198
198
  }
199
+ /**
200
+ * Batch acknowledgment input — applies a batch of acks under a single file
201
+ * lock + single file rewrite. Each entry has the same shape as
202
+ * {@link MailboxAckInput} minus the per-batch defaults documented on
203
+ * `ackMany`. Use this when an agent is acking several fresh messages at
204
+ * once (the common case in the mailbox loop) — it collapses N full-file
205
+ * rewrites into one.
206
+ */
207
+ interface MailboxAckBatchInput {
208
+ /** Ack entries to apply. */
209
+ acks: MailboxAckInput[];
210
+ }
199
211
  interface AgentRegistrationInput {
200
212
  agentId: string;
201
213
  sessionId: string;
@@ -239,6 +251,28 @@ interface AgentHeartbeatInput {
239
251
  iterations?: number | undefined;
240
252
  toolCalls?: number | undefined;
241
253
  }
254
+ interface PurgeOptions {
255
+ /**
256
+ * Purge completed messages older than this many milliseconds.
257
+ * Default: 1 day (86_400_000 ms)
258
+ */
259
+ completedMaxAgeMs?: number | undefined;
260
+ /**
261
+ * Purge incomplete messages older than this many milliseconds.
262
+ * Default: 7 days (604_800_000 ms)
263
+ */
264
+ incompleteMaxAgeMs?: number | undefined;
265
+ }
266
+ interface PurgeResult {
267
+ /** Messages removed because they were completed and too old. */
268
+ completedPurged: number;
269
+ /** Messages removed because they were incomplete and too old. */
270
+ incompletePurged: number;
271
+ /** Total messages removed. */
272
+ totalPurged: number;
273
+ /** Messages remaining in the mailbox after purge. */
274
+ remaining: number;
275
+ }
242
276
  interface Mailbox {
243
277
  /** Send a message. Returns the created message. */
244
278
  send(input: MailboxSendInput): Promise<MailboxMessage>;
@@ -246,6 +280,17 @@ interface Mailbox {
246
280
  query(query: MailboxQuery): Promise<MailboxMessage[]>;
247
281
  /** Acknowledge a message (read/complete). Returns updated message. */
248
282
  ack(input: MailboxAckInput): Promise<MailboxMessage | null>;
283
+ /**
284
+ * Acknowledge many messages in one shot. Acquires the file lock once and
285
+ * rewrites the message file once, regardless of how many acks are in the
286
+ * batch. Returns the messages that were actually updated (messages whose
287
+ * ids are not in the file are skipped silently).
288
+ *
289
+ * This is the preferred path when an agent has multiple fresh messages
290
+ * to receipt at once — the per-message {@link ack} path does a full
291
+ * read-modify-rewrite of the mailbox file for every call.
292
+ */
293
+ ackMany(input: MailboxAckBatchInput): Promise<MailboxMessage[]>;
249
294
  /** Get a snapshot of online/offline agents and their current tasks. */
250
295
  getAgentStatuses(): Promise<MailboxAgentStatus[]>;
251
296
  /**
@@ -275,6 +320,16 @@ interface Mailbox {
275
320
  * Agents and read receipts are preserved; only messages are cleared.
276
321
  */
277
322
  clearAll(): Promise<void>;
323
+ /**
324
+ * Purge orphaned and stale messages from the mailbox.
325
+ *
326
+ * Stale messages are:
327
+ * - Completed messages older than `completedMaxAgeMs` (default: 1 day)
328
+ * - Incomplete messages older than `incompleteMaxAgeMs` (default: 7 days)
329
+ *
330
+ * This does NOT touch agent registrations or client registry.
331
+ */
332
+ purgeStale(opts?: PurgeOptions): Promise<PurgeResult>;
278
333
  /**
279
334
  * Register a client (REPL/TUI/WebUI). Called once per client on startup.
280
335
  * Subsequent calls are idempotent — they update lastSeenAt.
@@ -530,4 +585,4 @@ declare class Pipeline<T> {
530
585
  private ensureUnique;
531
586
  }
532
587
 
533
- export { type AgentRegistrationInput as A, 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 Mailbox as b, type MailboxSendInput as c, type MailboxMessage as d, type MailboxQuery as e, type MailboxAckInput as f, type MailboxAgentStatus as g, type AgentHeartbeatInput as h, type ClientRegistrationInput as i, type ClientHeartbeatInput as j, type ClientStatus as k, type MailboxMessageType as l, type MailboxTaskContext as m, type ReadReceipts as n, type RegisteredAgent as o, normalizeRecipient as p, type ModelCapabilities as q, type BindOptions as r, type Middleware as s, type PipelineOptions as t, hookMatcherMatches as u };
588
+ export { type AgentHeartbeatInput as A, 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 Mailbox as c, type MailboxMessage as d, type AgentRegistrationInput as e, type BindOptions as f, type MailboxAckInput as g, type MailboxAgentStatus as h, type MailboxMessageType as i, type MailboxQuery as j, type MailboxSendInput as k, type MailboxTaskContext as l, type Middleware as m, type PipelineOptions as n, type ReadReceipts as o, type RegisteredAgent as p, hookMatcherMatches as q, normalizeRecipient as r, type MailboxAckBatchInput as s, type PurgeOptions as t, type PurgeResult as u, type ClientRegistrationInput as v, type ClientHeartbeatInput as w, type ClientStatus as x };