@miller-tech/uap 2.11.1 → 2.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/config/capacity-policy.json +15 -3
  2. package/config/model-profiles/qwen38.json +42 -34
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/bin/cli.js +39 -0
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/capacity/policy.d.ts +15 -0
  7. package/dist/capacity/policy.d.ts.map +1 -1
  8. package/dist/capacity/policy.js +23 -0
  9. package/dist/capacity/policy.js.map +1 -1
  10. package/dist/capacity/probe.d.ts.map +1 -1
  11. package/dist/capacity/probe.js +6 -1
  12. package/dist/capacity/probe.js.map +1 -1
  13. package/dist/cli/deliver.d.ts.map +1 -1
  14. package/dist/cli/deliver.js +148 -2
  15. package/dist/cli/deliver.js.map +1 -1
  16. package/dist/cli/inference.d.ts +13 -0
  17. package/dist/cli/inference.d.ts.map +1 -0
  18. package/dist/cli/inference.js +132 -0
  19. package/dist/cli/inference.js.map +1 -0
  20. package/dist/cli/loops.d.ts +39 -0
  21. package/dist/cli/loops.d.ts.map +1 -0
  22. package/dist/cli/loops.js +154 -0
  23. package/dist/cli/loops.js.map +1 -0
  24. package/dist/cli/wizard-config.d.ts.map +1 -1
  25. package/dist/cli/wizard-config.js +5 -1
  26. package/dist/cli/wizard-config.js.map +1 -1
  27. package/dist/cli/worktree.d.ts.map +1 -1
  28. package/dist/cli/worktree.js +8 -4
  29. package/dist/cli/worktree.js.map +1 -1
  30. package/dist/delivery/adversarial-attack.d.ts +99 -0
  31. package/dist/delivery/adversarial-attack.d.ts.map +1 -0
  32. package/dist/delivery/adversarial-attack.js +326 -0
  33. package/dist/delivery/adversarial-attack.js.map +1 -0
  34. package/dist/delivery/adversarial-gate.d.ts +120 -0
  35. package/dist/delivery/adversarial-gate.d.ts.map +1 -0
  36. package/dist/delivery/adversarial-gate.js +259 -0
  37. package/dist/delivery/adversarial-gate.js.map +1 -0
  38. package/dist/delivery/adversarial-sanction.d.ts +52 -0
  39. package/dist/delivery/adversarial-sanction.d.ts.map +1 -0
  40. package/dist/delivery/adversarial-sanction.js +134 -0
  41. package/dist/delivery/adversarial-sanction.js.map +1 -0
  42. package/dist/delivery/agentic-executor.d.ts +69 -22
  43. package/dist/delivery/agentic-executor.d.ts.map +1 -1
  44. package/dist/delivery/agentic-executor.js +152 -8
  45. package/dist/delivery/agentic-executor.js.map +1 -1
  46. package/dist/delivery/applier.d.ts +8 -0
  47. package/dist/delivery/applier.d.ts.map +1 -1
  48. package/dist/delivery/applier.js +3 -1
  49. package/dist/delivery/applier.js.map +1 -1
  50. package/dist/delivery/convergence-loop.d.ts +15 -0
  51. package/dist/delivery/convergence-loop.d.ts.map +1 -1
  52. package/dist/delivery/convergence-loop.js.map +1 -1
  53. package/dist/delivery/criteria-lint.d.ts +74 -0
  54. package/dist/delivery/criteria-lint.d.ts.map +1 -0
  55. package/dist/delivery/criteria-lint.js +134 -0
  56. package/dist/delivery/criteria-lint.js.map +1 -0
  57. package/dist/delivery/deliver-toggle.d.ts +21 -0
  58. package/dist/delivery/deliver-toggle.d.ts.map +1 -0
  59. package/dist/delivery/deliver-toggle.js +40 -0
  60. package/dist/delivery/deliver-toggle.js.map +1 -0
  61. package/dist/delivery/delivery-evidence.d.ts +109 -0
  62. package/dist/delivery/delivery-evidence.d.ts.map +1 -0
  63. package/dist/delivery/delivery-evidence.js +139 -0
  64. package/dist/delivery/delivery-evidence.js.map +1 -0
  65. package/dist/delivery/epic-mission.d.ts +5 -1
  66. package/dist/delivery/epic-mission.d.ts.map +1 -1
  67. package/dist/delivery/epic-mission.js +34 -6
  68. package/dist/delivery/epic-mission.js.map +1 -1
  69. package/dist/delivery/execution-gate.d.ts.map +1 -1
  70. package/dist/delivery/execution-gate.js +90 -7
  71. package/dist/delivery/execution-gate.js.map +1 -1
  72. package/dist/delivery/index.d.ts +9 -1
  73. package/dist/delivery/index.d.ts.map +1 -1
  74. package/dist/delivery/index.js +9 -1
  75. package/dist/delivery/index.js.map +1 -1
  76. package/dist/delivery/journey-depth.d.ts +61 -0
  77. package/dist/delivery/journey-depth.d.ts.map +1 -0
  78. package/dist/delivery/journey-depth.js +91 -0
  79. package/dist/delivery/journey-depth.js.map +1 -0
  80. package/dist/delivery/master-pipeline.d.ts +50 -0
  81. package/dist/delivery/master-pipeline.d.ts.map +1 -0
  82. package/dist/delivery/master-pipeline.js +52 -0
  83. package/dist/delivery/master-pipeline.js.map +1 -0
  84. package/dist/delivery/mission-acceptance.d.ts.map +1 -1
  85. package/dist/delivery/mission-acceptance.js +54 -2
  86. package/dist/delivery/mission-acceptance.js.map +1 -1
  87. package/dist/delivery/orchestrated-mission.d.ts +4 -1
  88. package/dist/delivery/orchestrated-mission.d.ts.map +1 -1
  89. package/dist/delivery/orchestrated-mission.js +18 -9
  90. package/dist/delivery/orchestrated-mission.js.map +1 -1
  91. package/dist/delivery/plan-check.d.ts +1 -0
  92. package/dist/delivery/plan-check.d.ts.map +1 -1
  93. package/dist/delivery/plan-check.js +48 -0
  94. package/dist/delivery/plan-check.js.map +1 -1
  95. package/dist/delivery/task-orchestrator.d.ts +16 -9
  96. package/dist/delivery/task-orchestrator.d.ts.map +1 -1
  97. package/dist/delivery/task-orchestrator.js +4 -2
  98. package/dist/delivery/task-orchestrator.js.map +1 -1
  99. package/dist/delivery/task-workspace.d.ts +35 -5
  100. package/dist/delivery/task-workspace.d.ts.map +1 -1
  101. package/dist/delivery/task-workspace.js +53 -7
  102. package/dist/delivery/task-workspace.js.map +1 -1
  103. package/dist/delivery/test-oracle-additive.d.ts +26 -6
  104. package/dist/delivery/test-oracle-additive.d.ts.map +1 -1
  105. package/dist/delivery/test-oracle-additive.js +40 -15
  106. package/dist/delivery/test-oracle-additive.js.map +1 -1
  107. package/dist/delivery/user-validation.d.ts +14 -0
  108. package/dist/delivery/user-validation.d.ts.map +1 -1
  109. package/dist/delivery/user-validation.js +103 -9
  110. package/dist/delivery/user-validation.js.map +1 -1
  111. package/dist/delivery/verifier-ladder.d.ts.map +1 -1
  112. package/dist/delivery/verifier-ladder.js +24 -6
  113. package/dist/delivery/verifier-ladder.js.map +1 -1
  114. package/dist/inference/analysis.d.ts +138 -0
  115. package/dist/inference/analysis.d.ts.map +1 -0
  116. package/dist/inference/analysis.js +243 -0
  117. package/dist/inference/analysis.js.map +1 -0
  118. package/dist/inference/probe.d.ts +85 -0
  119. package/dist/inference/probe.d.ts.map +1 -0
  120. package/dist/inference/probe.js +403 -0
  121. package/dist/inference/probe.js.map +1 -0
  122. package/dist/models/types.d.ts.map +1 -1
  123. package/dist/models/types.js +45 -18
  124. package/dist/models/types.js.map +1 -1
  125. package/dist/self-tuning/profiles/qwen38.d.ts +17 -8
  126. package/dist/self-tuning/profiles/qwen38.d.ts.map +1 -1
  127. package/dist/self-tuning/profiles/qwen38.js +21 -11
  128. package/dist/self-tuning/profiles/qwen38.js.map +1 -1
  129. package/dist/utils/model-slots.d.ts +11 -5
  130. package/dist/utils/model-slots.d.ts.map +1 -1
  131. package/dist/utils/model-slots.js +11 -5
  132. package/dist/utils/model-slots.js.map +1 -1
  133. package/docs/INDEX.md +1 -0
  134. package/docs/guides/CAPACITY_POLICY.md +24 -0
  135. package/docs/guides/INFERENCE_HEALTH.md +184 -0
  136. package/docs/guides/PROXY.md +1 -0
  137. package/docs/guides/QWEN38_EXL3.md +268 -0
  138. package/docs/plans/hlg-master-architecture-uplift-2026-09-24.md +67 -0
  139. package/docs/reference/CONFIGURATION.md +10 -1
  140. package/docs/reference/CONFIGURATION_REFERENCE.md +14 -0
  141. package/package.json +2 -2
  142. package/scripts/lib/llama-upstream.sh +7 -1
  143. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  144. package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
  145. package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
  146. package/src/policies/enforcers/expert_review_required.py +1 -4
  147. package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
  148. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
  149. package/tools/agents/scripts/anthropic_proxy.py +374 -16
  150. package/tools/agents/scripts/confidence_escalation.py +4 -2
  151. package/tools/agents/scripts/project_telemetry.py +1 -0
  152. package/tools/agents/scripts/tool_risk.py +1 -0
  153. package/tools/agents/scripts/tool_risk_calibrate.py +1 -0
  154. package/tools/agents/scripts/toolcall_path_normalizer.py +1 -0
  155. package/tools/agents/tests/test_anthropic_proxy_streaming.py +52 -1
  156. package/tools/agents/tests/test_confidence_escalation.py +3 -2
  157. package/tools/agents/tests/test_count_tokens_scale_per_session.py +126 -0
  158. package/tools/agents/tests/test_expert_review_pr_scope.py +10 -11
  159. package/tools/agents/tests/test_lockstep_escalation.py +324 -0
  160. package/tools/agents/tests/test_thinking_template_kwargs.py +10 -4
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Inference-stack health analysis — the deterministic core.
3
+ *
4
+ * Written after a live incident on 2026-09-21. A llama.cpp server that had
5
+ * been up 18 hours was still reporting `active (running)` and GREEN from
6
+ * `uap doctor`, while its prefill throughput had fallen roughly 8x and five
7
+ * client requests had blown a 1800s deadline overnight. Liveness checks could
8
+ * not see it, because nothing was down.
9
+ *
10
+ * Three things were wrong, and each needs a different kind of evidence:
11
+ *
12
+ * 1. Throughput decayed with uptime. Invisible in any single sample — and
13
+ * invisible in an hourly average too, because prefill tok/s depends
14
+ * heavily on prompt length. It only showed up once the samples were
15
+ * BUCKETED BY PROMPT SIZE and compared across time.
16
+ * 2. Context checkpoints were starved. `--ctx-checkpoints` is per slot, and
17
+ * at 1 the checkpoint froze at n_past=11903 while 43k+ tokens were
18
+ * reusable, so ~32k tokens were re-prefilled every single turn.
19
+ * 3. KV was pinned at the VBR floor, i.e. the pool was saturated and the
20
+ * cache had silently dropped to its lowest quality tier.
21
+ *
22
+ * Everything here is pure: callers supply already-collected samples. That
23
+ * keeps the judgment testable without a GPU, a systemd unit, or a journal.
24
+ */
25
+ export const DEFAULT_THRESHOLDS = {
26
+ // Measured 2026-09-21: 682 -> 77 tok/s (ratio 0.11) was a hard failure;
27
+ // 682 -> 375 (0.55) was already visibly hurting turn latency.
28
+ degradeRatioRed: 0.35,
29
+ degradeRatioWarn: 0.65,
30
+ minSamplesPerEra: 4,
31
+ // Restoring under half of what was reusable means most of the prefix is
32
+ // being recomputed every turn.
33
+ checkpointRecoveryWarn: 0.5,
34
+ kvFloorSlack: 0.15,
35
+ timeoutsWarn: 1,
36
+ };
37
+ /** Prompt-size buckets. Prefill tok/s is strongly size-dependent, so an
38
+ * average across mixed sizes is not comparable over time. */
39
+ export function sizeBucket(tokens) {
40
+ if (tokens < 5_000)
41
+ return '<5k';
42
+ if (tokens < 15_000)
43
+ return '5-15k';
44
+ if (tokens < 30_000)
45
+ return '15-30k';
46
+ return '>30k';
47
+ }
48
+ /**
49
+ * Compare early-life against recent prefill throughput WITHIN a size bucket.
50
+ *
51
+ * Splitting the samples in half and averaging each side would be wrong: if
52
+ * the workload's prompt sizes drift (and they do — conversations grow), the
53
+ * mean moves for reasons that have nothing to do with the server. So pick the
54
+ * bucket that has enough samples on BOTH sides and compare only within it.
55
+ */
56
+ export function analyzeTrend(samples, thresholds = DEFAULT_THRESHOLDS) {
57
+ if (samples.length < thresholds.minSamplesPerEra * 2) {
58
+ return { earlyCount: 0, recentCount: 0, note: 'not enough prefill samples for a trend' };
59
+ }
60
+ // Bucket FIRST, then split each bucket at its OWN median time.
61
+ //
62
+ // This used to split every sample at the GLOBAL median and bucket the two
63
+ // halves. That silently dropped any bucket whose samples were skewed in
64
+ // time — and a real agent workload skews hard, because conversations grow,
65
+ // so large prompts arrive late. Measured on a live 6h journal:
66
+ //
67
+ // bucket early recent outcome
68
+ // <5k 41 17 reported: 0.78 (mild)
69
+ // 15-30k 2 21 EXCLUDED — needed 4 per era
70
+ //
71
+ // The excluded bucket had gone 616 -> 73 tok/s across its 23 samples. An 8x
72
+ // collapse, invisible, while the report showed a benign 0.78. A bucket's own
73
+ // chronology is what "did this get slower" means; the other buckets' arrival
74
+ // times are irrelevant to it.
75
+ const byBucket = new Map();
76
+ for (const r of samples) {
77
+ // A NaN or negative reading is a parse artefact, not a measurement.
78
+ if (!Number.isFinite(r.tokensPerSecond) || r.tokensPerSecond < 0)
79
+ continue;
80
+ const b = sizeBucket(r.tokens);
81
+ (byBucket.get(b) ?? byBucket.set(b, []).get(b)).push(r);
82
+ }
83
+ const buckets = [];
84
+ for (const [bucket, rows] of byBucket) {
85
+ if (rows.length < thresholds.minSamplesPerEra * 2)
86
+ continue;
87
+ const ordered = [...rows].sort((a, b) => a.at - b.at);
88
+ const mid = Math.floor(ordered.length / 2);
89
+ const ev = ordered.slice(0, mid).map((x) => x.tokensPerSecond);
90
+ const rv = ordered.slice(mid).map((x) => x.tokensPerSecond);
91
+ if (ev.length < thresholds.minSamplesPerEra || rv.length < thresholds.minSamplesPerEra)
92
+ continue;
93
+ const earlyMean = ev.reduce((a, b) => a + b, 0) / ev.length;
94
+ const recentMean = rv.reduce((a, b) => a + b, 0) / rv.length;
95
+ // An all-zero early era cannot produce a meaningful ratio.
96
+ if (!(earlyMean > 0) || !Number.isFinite(recentMean))
97
+ continue;
98
+ buckets.push({
99
+ bucket,
100
+ earlyMean,
101
+ recentMean,
102
+ ratio: recentMean / earlyMean,
103
+ earlyCount: ev.length,
104
+ recentCount: rv.length,
105
+ });
106
+ }
107
+ if (buckets.length === 0) {
108
+ return {
109
+ earlyCount: 0,
110
+ recentCount: 0,
111
+ note: 'no prompt-size bucket had enough samples to split — cannot compare like with like',
112
+ };
113
+ }
114
+ // Rank by SEVERITY, not by sample count. Picking the fattest bucket hid the
115
+ // worst one: on a real 30h journal the 5-15k bucket sat at 0.289 (RED) while
116
+ // the reported >30k bucket showed 0.522 (WARN) purely because it had more
117
+ // samples — understating severity and flipping the remedy from "restart" to
118
+ // "watch it". A thin bucket collapsing 10x emitted nothing at all.
119
+ buckets.sort((a, b) => a.ratio - b.ratio || b.earlyCount + b.recentCount - (a.earlyCount + a.recentCount));
120
+ const worst = buckets[0];
121
+ return { ...worst, buckets };
122
+ }
123
+ /** How much of the reusable prefix the checkpoints actually deliver. */
124
+ export function analyzeCheckpoints(samples) {
125
+ const usable = samples.filter((s) => s.reusable > 0);
126
+ if (usable.length === 0)
127
+ return { samples: 0 };
128
+ const recoveries = usable.map((s) => Math.min(1, s.restored / s.reusable));
129
+ const wasted = usable.map((s) => Math.max(0, s.reusable - s.restored));
130
+ return {
131
+ recovery: recoveries.reduce((a, b) => a + b, 0) / recoveries.length,
132
+ wastedTokens: wasted.reduce((a, b) => a + b, 0) / wasted.length,
133
+ samples: usable.length,
134
+ };
135
+ }
136
+ /** Name the other slowed buckets, so a single headline number does not read
137
+ * as though only one prompt size is affected. */
138
+ function alsoAffected(trend) {
139
+ const others = (trend.buckets ?? []).filter((b) => b.bucket !== trend.bucket && b.ratio < 1);
140
+ if (others.length === 0)
141
+ return '';
142
+ return `; also down in ${others.map((b) => `${b.bucket} (${Math.round((1 - b.ratio) * 100)}%)`).join(', ')}`;
143
+ }
144
+ const rank = { GREEN: 0, WARN: 1, RED: 2, UNKNOWN: 0 };
145
+ /** Roll a snapshot up into a verdict. Pure; no I/O, no clock. */
146
+ export function assessInference(snap, thresholds = DEFAULT_THRESHOLDS) {
147
+ const findings = [];
148
+ const trend = analyzeTrend(snap.prefill, thresholds);
149
+ const checkpoints = analyzeCheckpoints(snap.checkpoints);
150
+ // 1. Throughput decay over this process's life.
151
+ if (trend.ratio !== undefined) {
152
+ const pct = Math.round((1 - trend.ratio) * 100);
153
+ if (trend.ratio < thresholds.degradeRatioRed) {
154
+ findings.push({
155
+ health: 'RED',
156
+ code: 'prefill-decay',
157
+ message: `prefill in the ${trend.bucket} bucket fell ${pct}% over this process's life ` +
158
+ `(${Math.round(trend.earlyMean)} -> ${Math.round(trend.recentMean)} tok/s)` +
159
+ alsoAffected(trend),
160
+ remedy: 'restart the inference server; if it returns within days, investigate the prompt cache and idle-slot caching',
161
+ });
162
+ }
163
+ else if (trend.ratio < thresholds.degradeRatioWarn) {
164
+ findings.push({
165
+ health: 'WARN',
166
+ code: 'prefill-decay',
167
+ message: `prefill in the ${trend.bucket} bucket is down ${pct}% ` +
168
+ `(${Math.round(trend.earlyMean)} -> ${Math.round(trend.recentMean)} tok/s)` +
169
+ alsoAffected(trend),
170
+ remedy: 'watch it; a restart restores throughput if the decay continues',
171
+ });
172
+ }
173
+ }
174
+ // 2. Checkpoint starvation — reusable prefix that is not actually reused.
175
+ if (checkpoints.recovery !== undefined && checkpoints.recovery < thresholds.checkpointRecoveryWarn) {
176
+ const cp = snap.ctxCheckpoints;
177
+ findings.push({
178
+ health: checkpoints.wastedTokens > 20_000 ? 'RED' : 'WARN',
179
+ code: 'checkpoint-starved',
180
+ message: `checkpoints recover only ${Math.round(checkpoints.recovery * 100)}% of the reusable prefix ` +
181
+ `(~${Math.round(checkpoints.wastedTokens).toLocaleString()} tokens re-prefilled per turn)`,
182
+ remedy: cp !== undefined && cp <= 2
183
+ ? `raise --ctx-checkpoints (currently ${cp}); it is per SLOT, so a low value cannot track a growing conversation`
184
+ : 'check --ctx-checkpoints and --checkpoint-min-step against the conversation length',
185
+ });
186
+ }
187
+ // 3. KV pinned at the VBR floor = the pool is saturated.
188
+ if (snap.kvBitsPerValue !== undefined && snap.kvFloorBitsPerValue !== undefined) {
189
+ if (snap.kvBitsPerValue <= snap.kvFloorBitsPerValue + thresholds.kvFloorSlack) {
190
+ findings.push({
191
+ health: 'WARN',
192
+ code: 'kv-at-floor',
193
+ message: `KV is pinned at the VBR floor (${snap.kvBitsPerValue} bpv, floor ${snap.kvFloorBitsPerValue}) ` +
194
+ '— the pool is saturated and cache quality is at its lowest tier',
195
+ remedy: 'reduce the context pool, the rail count, or the per-session cap; or raise --vbr-vram if VRAM allows',
196
+ });
197
+ }
198
+ }
199
+ // 4. Client-visible timeouts. A symptom, but the one users actually feel.
200
+ if ((snap.generationTimeouts ?? 0) >= thresholds.timeoutsWarn) {
201
+ findings.push({
202
+ health: 'RED',
203
+ code: 'generation-timeouts',
204
+ message: `${snap.generationTimeouts} generation timeout(s) in the window — clients lost work`,
205
+ remedy: 'fix the cause (prefill decay / checkpoint starvation) rather than raising the deadline',
206
+ });
207
+ }
208
+ // 5. A window spanning a restart makes the early/recent split meaningless:
209
+ // the "decay" may simply be the boundary between two processes.
210
+ if ((snap.processCount ?? 1) > 1 && trend.ratio !== undefined) {
211
+ findings.push({
212
+ health: 'WARN',
213
+ code: 'spans-restart',
214
+ message: `the window spans ${snap.processCount} server processes — a trend across a restart ` +
215
+ 'compares different process lifetimes, not decay within one',
216
+ remedy: 'narrow --since/--until to a single process, or omit them to use the current one',
217
+ });
218
+ }
219
+ // 6. Rail/pool sanity: under --kv-unified the pool is SHARED, so N rails
220
+ // each believing they own it is an overcommit waiting to happen.
221
+ if (snap.rails !== undefined && snap.rails > 1 && snap.poolCells !== undefined) {
222
+ findings.push({
223
+ health: 'GREEN',
224
+ code: 'shared-pool',
225
+ message: `${snap.rails} rails share one ${snap.poolCells.toLocaleString()}-cell pool ` +
226
+ `(${Math.floor(snap.poolCells / snap.rails).toLocaleString()} each if evenly divided)`,
227
+ });
228
+ }
229
+ const worst = findings.reduce((acc, f) => (rank[f.health] > rank[acc] ? f.health : acc), findings.length > 0 ? 'GREEN' : 'UNKNOWN');
230
+ // No evidence at all is UNKNOWN, never a fabricated GREEN — the same
231
+ // fail-open posture the capacity doctor uses.
232
+ //
233
+ // But "no evidence" is about the SAMPLED signals (trend, checkpoints, KV).
234
+ // A finding that fired is itself evidence, so an actionable one must never
235
+ // be masked by an UNKNOWN rollup: generation timeouts are counted from the
236
+ // proxy journal and can fire with none of the sampled signals present,
237
+ // which let a RED finding pass --strict with exit 0.
238
+ const actionable = findings.some((f) => f.health !== 'GREEN');
239
+ const noSampledEvidence = trend.ratio === undefined && checkpoints.samples === 0 && snap.kvBitsPerValue === undefined;
240
+ const health = actionable || !noSampledEvidence ? worst : 'UNKNOWN';
241
+ return { health, findings, trend, checkpoints };
242
+ }
243
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/inference/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { CheckpointSample, InferenceSnapshot, PrefillSample } from './analysis.js';
2
+ export interface ProbeDeps {
3
+ /** Run a command and return stdout; throw on failure. */
4
+ exec?: (cmd: string, args: string[]) => string;
5
+ /** Fetch a URL and return the body; throw on failure. */
6
+ fetchText?: (url: string) => Promise<string>;
7
+ now?: () => number;
8
+ }
9
+ /** Strip userinfo before a URL reaches the report. Node's fetch turns
10
+ * `http://user:pass@host` into an Authorization header, and `--json` exists
11
+ * to be piped into monitors and stored. */
12
+ export declare function redactUrl(url: string): string;
13
+ /** Pull `-np`, `-c` and `--ctx-checkpoints` out of a systemd ExecStart blob. */
14
+ export declare function parseExecStartFlags(execStart: string): {
15
+ rails?: number;
16
+ poolCells?: number;
17
+ ctxCheckpoints?: number;
18
+ };
19
+ export interface UnitState {
20
+ active?: string;
21
+ mainPid?: number;
22
+ uptimeSeconds?: number;
23
+ execStart?: string;
24
+ /** ISO-ish timestamp systemd reported, passed to journalctl --since. */
25
+ activeEnterTimestamp?: string;
26
+ }
27
+ /**
28
+ * systemd renders timestamps as "Mon 2026-09-21 09:54:00 AEST", which
29
+ * Date.parse rejects outright (NaN) because of the weekday prefix and the
30
+ * non-standard zone abbreviation. Pull out the ISO-ish core and parse that as
31
+ * local time — which is the zone systemd printed it in.
32
+ *
33
+ * Returns NaN for anything unparseable, so callers keep reporting "unknown"
34
+ * rather than inventing an uptime.
35
+ */
36
+ export declare function parseSystemdTimestamp(value?: string): number;
37
+ export declare function probeUnit(unit: string, deps?: ProbeDeps): UnitState | null;
38
+ export declare function parseServerJournal(text: string, year?: number): {
39
+ prefill: PrefillSample[];
40
+ checkpoints: CheckpointSample[];
41
+ processCount: number;
42
+ };
43
+ export declare function probeJournal(unit: string, since: string | undefined, deps?: ProbeDeps, until?: string): {
44
+ prefill: PrefillSample[];
45
+ checkpoints: CheckpointSample[];
46
+ processCount: number;
47
+ } | null;
48
+ export declare function countProxyTimeouts(unit: string, since: string, deps?: ProbeDeps, until?: string): number | undefined;
49
+ export interface SlotsInfo {
50
+ slots?: number;
51
+ nCtx?: number;
52
+ kvBitsPerValue?: number;
53
+ anyProcessing?: boolean;
54
+ }
55
+ export declare function probeSlots(baseUrl: string, deps?: ProbeDeps): Promise<SlotsInfo | null>;
56
+ /** VBR floor from /props, so the "pinned at the floor" test uses the server's
57
+ * own configured floor rather than a hardcoded constant. */
58
+ export declare function probeVbrFloor(baseUrl: string, deps?: ProbeDeps): Promise<number | undefined>;
59
+ export interface MetricsInfo {
60
+ promptTokens?: number;
61
+ promptSeconds?: number;
62
+ cachedPromptTokens?: number;
63
+ busySlotsPerDecode?: number;
64
+ }
65
+ export declare function parseMetrics(text: string): MetricsInfo;
66
+ export declare function probeMetrics(baseUrl: string, deps?: ProbeDeps): Promise<MetricsInfo | null>;
67
+ export interface CollectOptions {
68
+ serverUnit: string;
69
+ proxyUnit: string;
70
+ baseUrl: string;
71
+ /** journalctl --since expression; default: this process's start. */
72
+ since?: string;
73
+ /** journalctl --until expression — for analysing a PAST incident window. */
74
+ until?: string;
75
+ }
76
+ export interface Collected {
77
+ snapshot: InferenceSnapshot;
78
+ unit: UnitState | null;
79
+ slots: SlotsInfo | null;
80
+ metrics: MetricsInfo | null;
81
+ /** Probes that could not run, so the report can say so out loud. */
82
+ unavailable: string[];
83
+ }
84
+ export declare function collect(opts: CollectOptions, deps?: ProbeDeps): Promise<Collected>;
85
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/inference/probe.ts"],"names":[],"mappings":"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"}