instar 1.3.485 → 1.3.487
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.
- package/dist/commands/reflect.d.ts.map +1 -1
- package/dist/commands/reflect.js +4 -0
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/route.d.ts.map +1 -1
- package/dist/commands/route.js +3 -0
- package/dist/commands/route.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +14 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts +7 -0
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.js +50 -0
- package/dist/core/CircuitBreakingIntelligenceProvider.js.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts +5 -0
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js +6 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.d.ts +58 -0
- package/dist/core/CodexCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.js +293 -27
- package/dist/core/CodexCliIntelligenceProvider.js.map +1 -1
- package/dist/core/GeminiCliIntelligenceProvider.d.ts +8 -0
- package/dist/core/GeminiCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/GeminiCliIntelligenceProvider.js +8 -0
- package/dist/core/GeminiCliIntelligenceProvider.js.map +1 -1
- package/dist/core/MessagingToneGate.d.ts +23 -2
- package/dist/core/MessagingToneGate.d.ts.map +1 -1
- package/dist/core/MessagingToneGate.js +15 -1
- package/dist/core/MessagingToneGate.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +61 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SafeGitExecutor.d.ts.map +1 -1
- package/dist/core/SafeGitExecutor.js +79 -1
- package/dist/core/SafeGitExecutor.js.map +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +22 -0
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/TelegramRelay.d.ts +1 -0
- package/dist/core/TelegramRelay.d.ts.map +1 -1
- package/dist/core/TelegramRelay.js +9 -1
- package/dist/core/TelegramRelay.js.map +1 -1
- package/dist/core/componentCategories.d.ts.map +1 -1
- package/dist/core/componentCategories.js +10 -0
- package/dist/core/componentCategories.js.map +1 -1
- package/dist/core/intelligenceProviderFactory.d.ts +8 -0
- package/dist/core/intelligenceProviderFactory.d.ts.map +1 -1
- package/dist/core/intelligenceProviderFactory.js +1 -0
- package/dist/core/intelligenceProviderFactory.js.map +1 -1
- package/dist/core/raw-file-path.d.ts +33 -0
- package/dist/core/raw-file-path.d.ts.map +1 -0
- package/dist/core/raw-file-path.js +105 -0
- package/dist/core/raw-file-path.js.map +1 -0
- package/dist/core/types.d.ts +17 -9
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/OutboundAdvisory.d.ts +152 -0
- package/dist/messaging/OutboundAdvisory.d.ts.map +1 -0
- package/dist/messaging/OutboundAdvisory.js +453 -0
- package/dist/messaging/OutboundAdvisory.js.map +1 -0
- package/dist/messaging/TelegramAdapter.d.ts +6 -0
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +4 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/messaging/pending-relay-store.d.ts +7 -0
- package/dist/messaging/pending-relay-store.d.ts.map +1 -1
- package/dist/messaging/pending-relay-store.js +9 -3
- package/dist/messaging/pending-relay-store.js.map +1 -1
- package/dist/messaging/slack/SlackAdapter.d.ts +3 -0
- package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
- package/dist/messaging/slack/SlackAdapter.js +8 -1
- package/dist/messaging/slack/SlackAdapter.js.map +1 -1
- package/dist/monitoring/FeatureMetricsLedger.d.ts +123 -1
- package/dist/monitoring/FeatureMetricsLedger.d.ts.map +1 -1
- package/dist/monitoring/FeatureMetricsLedger.js +211 -25
- package/dist/monitoring/FeatureMetricsLedger.js.map +1 -1
- package/dist/monitoring/delivery-failure-sentinel.d.ts +6 -1
- package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -1
- package/dist/monitoring/delivery-failure-sentinel.js +15 -3
- package/dist/monitoring/delivery-failure-sentinel.js.map +1 -1
- package/dist/providers/adapters/anthropic-interactive-pool/index.d.ts.map +1 -1
- package/dist/providers/adapters/anthropic-interactive-pool/index.js +1 -0
- package/dist/providers/adapters/anthropic-interactive-pool/index.js.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts +93 -0
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.js +339 -0
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.js.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts +84 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts.map +1 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js +208 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js.map +1 -0
- package/dist/providers/uxConfirm/OverrideDetector.d.ts.map +1 -1
- package/dist/providers/uxConfirm/OverrideDetector.js +1 -0
- package/dist/providers/uxConfirm/OverrideDetector.js.map +1 -1
- package/dist/providers/uxConfirm/TaskClassifier.d.ts.map +1 -1
- package/dist/providers/uxConfirm/TaskClassifier.js +1 -0
- package/dist/providers/uxConfirm/TaskClassifier.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +10 -3
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scheduler/JobScheduler.d.ts.map +1 -1
- package/dist/scheduler/JobScheduler.js +8 -0
- package/dist/scheduler/JobScheduler.js.map +1 -1
- package/dist/security/LLMSanitizer.d.ts.map +1 -1
- package/dist/security/LLMSanitizer.js +7 -1
- package/dist/security/LLMSanitizer.js.map +1 -1
- package/dist/server/AgentServer.d.ts +1 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +22 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +12 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +226 -4
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
- package/dist/threadline/PipeSessionSpawner.js +2 -0
- package/dist/threadline/PipeSessionSpawner.js.map +1 -1
- package/dist/threadline/WarrantsReplyGate.d.ts.map +1 -1
- package/dist/threadline/WarrantsReplyGate.js +5 -1
- package/dist/threadline/WarrantsReplyGate.js.map +1 -1
- package/package.json +4 -2
- package/scripts/lint-llm-attribution.js +418 -0
- package/scripts/lint-no-direct-destructive.js +4 -0
- package/scripts/pre-push-gate.js +24 -0
- package/src/data/builtin-manifest.json +67 -67
- package/src/scaffold/templates.ts +10 -3
- package/src/templates/scripts/telegram-reply.sh +202 -10
- package/upgrades/1.3.486.md +38 -0
- package/upgrades/1.3.487.md +39 -0
- package/upgrades/side-effects/outbound-advisory-inform-only.md +252 -0
- package/upgrades/side-effects/token-audit-completeness.md +84 -0
|
@@ -40,6 +40,18 @@ export interface FeatureMetricRecord {
|
|
|
40
40
|
outcome: FeatureMetricOutcome;
|
|
41
41
|
tokensIn?: number;
|
|
42
42
|
tokensOut?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Cache-read input tokens (token-audit-completeness). PINNED SEMANTICS
|
|
45
|
+
* (P18 — the schema is the perception): tokensCached ⊆ tokensIn on every
|
|
46
|
+
* framework — tokensIn's meaning is UNCHANGED (historical row continuity;
|
|
47
|
+
* claude↔codex comparability), tokensCached is an informational subset,
|
|
48
|
+
* and fresh cost is derivable as tokensIn − tokensCached. For claude this
|
|
49
|
+
* is cache_read_input_tokens ONLY (cache CREATION costs ~1.25× fresh and
|
|
50
|
+
* stays plain input; cache READS cost ~0.1× — collapsing them would point
|
|
51
|
+
* the cost signal in two directions at once). For codex,
|
|
52
|
+
* cached_input_tokens maps directly.
|
|
53
|
+
*/
|
|
54
|
+
tokensCached?: number;
|
|
43
55
|
latencyMs?: number;
|
|
44
56
|
/** Resolved model string the provider actually ran (e.g. "gpt-5.4-mini", "claude-haiku-4-5"). */
|
|
45
57
|
model?: string;
|
|
@@ -63,6 +75,8 @@ export interface FeatureRollup {
|
|
|
63
75
|
events: number;
|
|
64
76
|
tokensIn: number;
|
|
65
77
|
tokensOut: number;
|
|
78
|
+
/** Cache-read subset of tokensIn (token-audit-completeness). */
|
|
79
|
+
tokensCached: number;
|
|
66
80
|
/** Distinct frameworks that served this feature in the window (Observable Intelligence). */
|
|
67
81
|
frameworks: string[];
|
|
68
82
|
/** Distinct models this feature ran in the window. */
|
|
@@ -80,6 +94,74 @@ export interface FeatureRollup {
|
|
|
80
94
|
maxLatencyMs: number;
|
|
81
95
|
waitedCalls: number;
|
|
82
96
|
avgWaitMs: number;
|
|
97
|
+
/** This feature's slice of the feature×model partition (summary() only). */
|
|
98
|
+
byModel?: FeatureModelRollup[];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* One feature×model×framework group (token-audit-completeness, Slice 2).
|
|
102
|
+
* llm-kind rows only. NULL model/framework render "unknown". The presence
|
|
103
|
+
* counts ride the same single GROUP BY query — usage-presence is a NULL
|
|
104
|
+
* test, not a SUM (a recorded 0 must count as reported; one large row must
|
|
105
|
+
* not mask N null rows).
|
|
106
|
+
*/
|
|
107
|
+
export interface FeatureModelRollup {
|
|
108
|
+
feature: string;
|
|
109
|
+
model: string;
|
|
110
|
+
framework: string;
|
|
111
|
+
calls: number;
|
|
112
|
+
realCalls: number;
|
|
113
|
+
tokensIn: number;
|
|
114
|
+
tokensOut: number;
|
|
115
|
+
tokensCached: number;
|
|
116
|
+
fired: number;
|
|
117
|
+
noop: number;
|
|
118
|
+
errors: number;
|
|
119
|
+
shed: number;
|
|
120
|
+
/** Success (fired+noop) rows whose tokens_in is non-NULL. */
|
|
121
|
+
successRowsWithUsage: number;
|
|
122
|
+
/** Error rows whose tokens_in is non-NULL (surfaces error-path recording). */
|
|
123
|
+
errorRowsWithUsage: number;
|
|
124
|
+
}
|
|
125
|
+
/** Aggregate model×framework rollup across all features (totals.byModel). */
|
|
126
|
+
export interface ModelRollup {
|
|
127
|
+
model: string;
|
|
128
|
+
framework: string;
|
|
129
|
+
calls: number;
|
|
130
|
+
realCalls: number;
|
|
131
|
+
tokensIn: number;
|
|
132
|
+
tokensOut: number;
|
|
133
|
+
tokensCached: number;
|
|
134
|
+
fired: number;
|
|
135
|
+
noop: number;
|
|
136
|
+
errors: number;
|
|
137
|
+
shed: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Per-framework usage-reporting coverage (the drift tripwire's durable
|
|
141
|
+
* surface). Denominator = SUCCESSFUL llm rows only (fired + noop) — error
|
|
142
|
+
* rows legitimately lack usage (claude parses usage only on success; codex
|
|
143
|
+
* timeouts can kill the child pre-flush), and including them would normalize
|
|
144
|
+
* coverage below 1.0 and train operators to ignore the tripwire. Error rows
|
|
145
|
+
* are reported alongside (errorRowsWithUsage also surfaces the error-path
|
|
146
|
+
* recording directly). Exemption is keyed PER PROVIDER IMPLEMENTATION, not
|
|
147
|
+
* per framework: claude-code rows with model 'interactive-pool' are excluded
|
|
148
|
+
* from the claude denominator (that provider NEVER invokes onUsage by
|
|
149
|
+
* documented contract); gemini-cli is exempt; pi-cli is NOT exempt
|
|
150
|
+
* (PiCliIntelligenceProvider invokes onUsage — exempting it would mask a
|
|
151
|
+
* future pi parse-rot).
|
|
152
|
+
*/
|
|
153
|
+
export interface UsageCoverageRow {
|
|
154
|
+
framework: string;
|
|
155
|
+
successRows: number;
|
|
156
|
+
successRowsWithUsage: number;
|
|
157
|
+
/** successRowsWithUsage / successRows (0..1); 0 when denominator is 0. */
|
|
158
|
+
coverage: number;
|
|
159
|
+
errorRows: number;
|
|
160
|
+
errorRowsWithUsage: number;
|
|
161
|
+
/** True = this framework's provider cannot surface usage by documented contract. */
|
|
162
|
+
exempt: boolean;
|
|
163
|
+
/** claude-code only: interactive-pool rows excluded from the denominator. */
|
|
164
|
+
excludedRows?: number;
|
|
83
165
|
}
|
|
84
166
|
export interface FeatureMetricsSummary {
|
|
85
167
|
sinceMs: number;
|
|
@@ -90,10 +172,23 @@ export interface FeatureMetricsSummary {
|
|
|
90
172
|
events: number;
|
|
91
173
|
tokensIn: number;
|
|
92
174
|
tokensOut: number;
|
|
175
|
+
tokensCached: number;
|
|
93
176
|
fired: number;
|
|
94
177
|
noop: number;
|
|
95
178
|
errors: number;
|
|
96
179
|
shed: number;
|
|
180
|
+
/** Aggregate model×framework breakdown (token-audit-completeness). */
|
|
181
|
+
byModel: ModelRollup[];
|
|
182
|
+
/** Per-framework usage-reporting coverage (drift tripwire surface). */
|
|
183
|
+
usageCoverage: UsageCoverageRow[];
|
|
184
|
+
/** Unlabeled (tokensIn+tokensOut) share of total token spend. 0 on zero denominator. */
|
|
185
|
+
unlabeledTokenShare: number;
|
|
186
|
+
/**
|
|
187
|
+
* Unlabeled realCalls share of total realCalls. Token-blind unlabeled
|
|
188
|
+
* calls contribute 0/0 to the token share, so a token-weighted metric
|
|
189
|
+
* alone reads 0.00 while unlabeled traffic runs at volume.
|
|
190
|
+
*/
|
|
191
|
+
unlabeledCallShare: number;
|
|
97
192
|
};
|
|
98
193
|
features: FeatureRollup[];
|
|
99
194
|
}
|
|
@@ -117,11 +212,38 @@ export declare class FeatureMetricsLedger {
|
|
|
117
212
|
record(r: FeatureMetricRecord): void;
|
|
118
213
|
/** Convenience for programmatic (non-LLM) guards: invocation + verdict, no token cost. */
|
|
119
214
|
recordEvent(feature: string, outcome: FeatureMetricOutcome, verdictId?: string): void;
|
|
215
|
+
private sinceMsFrom;
|
|
120
216
|
/** Per-feature rollup over the lookback window (default: all time). */
|
|
121
217
|
byFeature(opts?: {
|
|
122
218
|
sinceHours?: number;
|
|
123
219
|
}): FeatureRollup[];
|
|
124
|
-
/**
|
|
220
|
+
/**
|
|
221
|
+
* Core per-feature rollup. `includeProviderScan: false` skips the DISTINCT
|
|
222
|
+
* frameworks/models window scan — summary() derives those arrays from the
|
|
223
|
+
* byFeatureModel partition instead (its group keys ARE feature×framework×
|
|
224
|
+
* model), so the per-model slice lands at NET-ZERO window scans, not +1.
|
|
225
|
+
*/
|
|
226
|
+
private byFeatureCore;
|
|
227
|
+
/**
|
|
228
|
+
* Feature×model×framework partition (token-audit-completeness, Slice 2).
|
|
229
|
+
* llm-kind rows only; NULL model/framework render "unknown". ONE composite-
|
|
230
|
+
* key GROUP BY carries the usage-presence counts itself — SQLite
|
|
231
|
+
* COUNT(expr) counts non-NULL, so `COUNT(CASE WHEN outcome IN
|
|
232
|
+
* ('fired','noop') THEN tokens_in END)` is the success-rows-with-usage
|
|
233
|
+
* count (a recorded 0 counts as reported; a SUM would let one large row
|
|
234
|
+
* mask N null rows). No latency percentiles on this dimension.
|
|
235
|
+
*/
|
|
236
|
+
byFeatureModel(opts?: {
|
|
237
|
+
sinceHours?: number;
|
|
238
|
+
}): FeatureModelRollup[];
|
|
239
|
+
/**
|
|
240
|
+
* Frameworks whose provider implementation cannot surface per-call usage by
|
|
241
|
+
* documented contract (the cannot-surface list, keyed per implementation —
|
|
242
|
+
* see the provider usage-contract test, which derives expectations from
|
|
243
|
+
* fixtures, never from this list).
|
|
244
|
+
*/
|
|
245
|
+
private static readonly USAGE_EXEMPT_FRAMEWORKS;
|
|
246
|
+
/** Totals + per-feature rollup, enriched with the per-model partition. */
|
|
125
247
|
summary(opts?: {
|
|
126
248
|
sinceHours?: number;
|
|
127
249
|
}): FeatureMetricsSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureMetricsLedger.d.ts","sourceRoot":"","sources":["../../src/monitoring/FeatureMetricsLedger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,OAAO,CAAC;AAChD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,4GAA4G;IAC5G,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sDAAsD;IACtD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"FeatureMetricsLedger.d.ts","sourceRoot":"","sources":["../../src/monitoring/FeatureMetricsLedger.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,7 @@ const SCHEMA = [
|
|
|
49
49
|
*/
|
|
50
50
|
const ADDED_COLUMNS = [
|
|
51
51
|
{ name: 'framework', ddl: 'ALTER TABLE feature_metrics ADD COLUMN framework TEXT' },
|
|
52
|
+
{ name: 'tokens_cached', ddl: 'ALTER TABLE feature_metrics ADD COLUMN tokens_cached INTEGER' },
|
|
52
53
|
];
|
|
53
54
|
function percentile(sortedAsc, p) {
|
|
54
55
|
if (sortedAsc.length === 0)
|
|
@@ -84,8 +85,8 @@ export class FeatureMetricsLedger {
|
|
|
84
85
|
}
|
|
85
86
|
catch { /* already closed */ } });
|
|
86
87
|
this.insertStmt = this.db.prepare(`INSERT INTO feature_metrics
|
|
87
|
-
(ts, feature, kind, outcome, tokens_in, tokens_out, latency_ms, model, framework, waited, wait_ms, verdict_id)
|
|
88
|
-
VALUES (@ts, @feature, @kind, @outcome, @tokensIn, @tokensOut, @latencyMs, @model, @framework, @waited, @waitMs, @verdictId)`);
|
|
88
|
+
(ts, feature, kind, outcome, tokens_in, tokens_out, tokens_cached, latency_ms, model, framework, waited, wait_ms, verdict_id)
|
|
89
|
+
VALUES (@ts, @feature, @kind, @outcome, @tokensIn, @tokensOut, @tokensCached, @latencyMs, @model, @framework, @waited, @waitMs, @verdictId)`);
|
|
89
90
|
}
|
|
90
91
|
/** Add post-ship columns to an existing table, idempotently (pragma-guarded). */
|
|
91
92
|
ensureAddedColumns() {
|
|
@@ -114,6 +115,7 @@ export class FeatureMetricsLedger {
|
|
|
114
115
|
outcome: r.outcome,
|
|
115
116
|
tokensIn: r.tokensIn ?? null,
|
|
116
117
|
tokensOut: r.tokensOut ?? null,
|
|
118
|
+
tokensCached: r.tokensCached ?? null,
|
|
117
119
|
latencyMs: r.latencyMs ?? null,
|
|
118
120
|
model: r.model ?? null,
|
|
119
121
|
framework: r.framework ?? null,
|
|
@@ -131,9 +133,20 @@ export class FeatureMetricsLedger {
|
|
|
131
133
|
recordEvent(feature, outcome, verdictId) {
|
|
132
134
|
this.record({ feature, kind: 'event', outcome, verdictId });
|
|
133
135
|
}
|
|
136
|
+
sinceMsFrom(opts) {
|
|
137
|
+
return opts.sinceHours && opts.sinceHours > 0 ? this.now() - opts.sinceHours * 3_600_000 : 0;
|
|
138
|
+
}
|
|
134
139
|
/** Per-feature rollup over the lookback window (default: all time). */
|
|
135
140
|
byFeature(opts = {}) {
|
|
136
|
-
|
|
141
|
+
return this.byFeatureCore(this.sinceMsFrom(opts), { includeProviderScan: true });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Core per-feature rollup. `includeProviderScan: false` skips the DISTINCT
|
|
145
|
+
* frameworks/models window scan — summary() derives those arrays from the
|
|
146
|
+
* byFeatureModel partition instead (its group keys ARE feature×framework×
|
|
147
|
+
* model), so the per-model slice lands at NET-ZERO window scans, not +1.
|
|
148
|
+
*/
|
|
149
|
+
byFeatureCore(sinceMs, o) {
|
|
137
150
|
const agg = this.db
|
|
138
151
|
.prepare(`SELECT
|
|
139
152
|
feature,
|
|
@@ -142,6 +155,7 @@ export class FeatureMetricsLedger {
|
|
|
142
155
|
SUM(CASE WHEN kind='event' THEN 1 ELSE 0 END) AS events,
|
|
143
156
|
COALESCE(SUM(tokens_in), 0) AS tokensIn,
|
|
144
157
|
COALESCE(SUM(tokens_out), 0) AS tokensOut,
|
|
158
|
+
COALESCE(SUM(tokens_cached), 0) AS tokensCached,
|
|
145
159
|
SUM(CASE WHEN outcome='fired' THEN 1 ELSE 0 END) AS fired,
|
|
146
160
|
SUM(CASE WHEN outcome='noop' THEN 1 ELSE 0 END) AS noop,
|
|
147
161
|
SUM(CASE WHEN outcome='error' THEN 1 ELSE 0 END) AS errors,
|
|
@@ -155,7 +169,10 @@ export class FeatureMetricsLedger {
|
|
|
155
169
|
GROUP BY feature
|
|
156
170
|
ORDER BY calls DESC`)
|
|
157
171
|
.all(sinceMs);
|
|
158
|
-
// Percentiles in JS from the per-feature latency lists (bounded by the
|
|
172
|
+
// Percentiles in JS from the per-feature latency lists (bounded by the
|
|
173
|
+
// window). This is the one full-row-materializing query and stays
|
|
174
|
+
// single-keyed — a future per-model percentile must reuse one
|
|
175
|
+
// composite-key query, never a second full-window load.
|
|
159
176
|
const latRows = this.db
|
|
160
177
|
.prepare(`SELECT feature, latency_ms FROM feature_metrics
|
|
161
178
|
WHERE ts >= ? AND latency_ms IS NOT NULL
|
|
@@ -167,24 +184,27 @@ export class FeatureMetricsLedger {
|
|
|
167
184
|
arr.push(row.latency_ms);
|
|
168
185
|
latByFeature.set(row.feature, arr);
|
|
169
186
|
}
|
|
170
|
-
// Distinct provider/model per feature in the window (Observable
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
.prepare(`SELECT DISTINCT feature, framework, model FROM feature_metrics
|
|
174
|
-
WHERE ts >= ? AND (framework IS NOT NULL OR model IS NOT NULL)`)
|
|
175
|
-
.all(sinceMs);
|
|
187
|
+
// Distinct provider/model per feature in the window (Observable
|
|
188
|
+
// Intelligence). Skipped when the caller derives these from the
|
|
189
|
+
// byFeatureModel partition (summary()).
|
|
176
190
|
const fwByFeature = new Map();
|
|
177
191
|
const modelByFeature = new Map();
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
192
|
+
if (o.includeProviderScan) {
|
|
193
|
+
const fwRows = this.db
|
|
194
|
+
.prepare(`SELECT DISTINCT feature, framework, model FROM feature_metrics
|
|
195
|
+
WHERE ts >= ? AND (framework IS NOT NULL OR model IS NOT NULL)`)
|
|
196
|
+
.all(sinceMs);
|
|
197
|
+
for (const row of fwRows) {
|
|
198
|
+
if (row.framework) {
|
|
199
|
+
const s = fwByFeature.get(row.feature) ?? new Set();
|
|
200
|
+
s.add(row.framework);
|
|
201
|
+
fwByFeature.set(row.feature, s);
|
|
202
|
+
}
|
|
203
|
+
if (row.model) {
|
|
204
|
+
const s = modelByFeature.get(row.feature) ?? new Set();
|
|
205
|
+
s.add(row.model);
|
|
206
|
+
modelByFeature.set(row.feature, s);
|
|
207
|
+
}
|
|
188
208
|
}
|
|
189
209
|
}
|
|
190
210
|
return agg.map((a) => {
|
|
@@ -201,6 +221,7 @@ export class FeatureMetricsLedger {
|
|
|
201
221
|
events: Number(a.events) || 0,
|
|
202
222
|
tokensIn: Number(a.tokensIn) || 0,
|
|
203
223
|
tokensOut: Number(a.tokensOut) || 0,
|
|
224
|
+
tokensCached: Number(a.tokensCached) || 0,
|
|
204
225
|
frameworks: Array.from(fwByFeature.get(String(a.feature)) ?? []).sort(),
|
|
205
226
|
models: Array.from(modelByFeature.get(String(a.feature)) ?? []).sort(),
|
|
206
227
|
fired,
|
|
@@ -217,10 +238,158 @@ export class FeatureMetricsLedger {
|
|
|
217
238
|
};
|
|
218
239
|
});
|
|
219
240
|
}
|
|
220
|
-
/**
|
|
241
|
+
/**
|
|
242
|
+
* Feature×model×framework partition (token-audit-completeness, Slice 2).
|
|
243
|
+
* llm-kind rows only; NULL model/framework render "unknown". ONE composite-
|
|
244
|
+
* key GROUP BY carries the usage-presence counts itself — SQLite
|
|
245
|
+
* COUNT(expr) counts non-NULL, so `COUNT(CASE WHEN outcome IN
|
|
246
|
+
* ('fired','noop') THEN tokens_in END)` is the success-rows-with-usage
|
|
247
|
+
* count (a recorded 0 counts as reported; a SUM would let one large row
|
|
248
|
+
* mask N null rows). No latency percentiles on this dimension.
|
|
249
|
+
*/
|
|
250
|
+
byFeatureModel(opts = {}) {
|
|
251
|
+
const sinceMs = this.sinceMsFrom(opts);
|
|
252
|
+
let rows;
|
|
253
|
+
try {
|
|
254
|
+
rows = this.db
|
|
255
|
+
.prepare(`SELECT
|
|
256
|
+
feature,
|
|
257
|
+
model,
|
|
258
|
+
framework,
|
|
259
|
+
COUNT(*) AS calls,
|
|
260
|
+
COALESCE(SUM(tokens_in), 0) AS tokensIn,
|
|
261
|
+
COALESCE(SUM(tokens_out), 0) AS tokensOut,
|
|
262
|
+
COALESCE(SUM(tokens_cached), 0) AS tokensCached,
|
|
263
|
+
SUM(CASE WHEN outcome='fired' THEN 1 ELSE 0 END) AS fired,
|
|
264
|
+
SUM(CASE WHEN outcome='noop' THEN 1 ELSE 0 END) AS noop,
|
|
265
|
+
SUM(CASE WHEN outcome='error' THEN 1 ELSE 0 END) AS errors,
|
|
266
|
+
SUM(CASE WHEN outcome='shed' THEN 1 ELSE 0 END) AS shed,
|
|
267
|
+
COUNT(CASE WHEN outcome IN ('fired','noop') THEN tokens_in END) AS successRowsWithUsage,
|
|
268
|
+
COUNT(CASE WHEN outcome='error' THEN tokens_in END) AS errorRowsWithUsage
|
|
269
|
+
FROM feature_metrics
|
|
270
|
+
WHERE ts >= ? AND kind='llm'
|
|
271
|
+
GROUP BY feature, model, framework
|
|
272
|
+
ORDER BY tokensIn + tokensOut DESC, calls DESC`)
|
|
273
|
+
.all(sinceMs);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// @silent-fallback-ok: identical failure envelope to byFeature on a DB
|
|
277
|
+
// whose ALTER was swallowed — degrade to [] rather than throw.
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
return rows.map((r) => {
|
|
281
|
+
const calls = Number(r.calls) || 0;
|
|
282
|
+
const shed = Number(r.shed) || 0;
|
|
283
|
+
return {
|
|
284
|
+
feature: String(r.feature),
|
|
285
|
+
model: r.model === null || r.model === undefined ? 'unknown' : String(r.model),
|
|
286
|
+
framework: r.framework === null || r.framework === undefined ? 'unknown' : String(r.framework),
|
|
287
|
+
calls,
|
|
288
|
+
realCalls: calls - shed,
|
|
289
|
+
tokensIn: Number(r.tokensIn) || 0,
|
|
290
|
+
tokensOut: Number(r.tokensOut) || 0,
|
|
291
|
+
tokensCached: Number(r.tokensCached) || 0,
|
|
292
|
+
fired: Number(r.fired) || 0,
|
|
293
|
+
noop: Number(r.noop) || 0,
|
|
294
|
+
errors: Number(r.errors) || 0,
|
|
295
|
+
shed,
|
|
296
|
+
successRowsWithUsage: Number(r.successRowsWithUsage) || 0,
|
|
297
|
+
errorRowsWithUsage: Number(r.errorRowsWithUsage) || 0,
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Frameworks whose provider implementation cannot surface per-call usage by
|
|
303
|
+
* documented contract (the cannot-surface list, keyed per implementation —
|
|
304
|
+
* see the provider usage-contract test, which derives expectations from
|
|
305
|
+
* fixtures, never from this list).
|
|
306
|
+
*/
|
|
307
|
+
static USAGE_EXEMPT_FRAMEWORKS = new Set(['gemini-cli']);
|
|
308
|
+
/** Totals + per-feature rollup, enriched with the per-model partition. */
|
|
221
309
|
summary(opts = {}) {
|
|
222
|
-
const
|
|
223
|
-
|
|
310
|
+
const sinceMs = this.sinceMsFrom(opts);
|
|
311
|
+
// ONE byFeatureModel call, partitioned in JS — per-feature slicing
|
|
312
|
+
// queries are forbidden (N× full-window scans on synchronous
|
|
313
|
+
// better-sqlite3).
|
|
314
|
+
const partition = this.byFeatureModel(opts);
|
|
315
|
+
const features = this.byFeatureCore(sinceMs, { includeProviderScan: false });
|
|
316
|
+
// Derive per-feature byModel + frameworks/models from the partition
|
|
317
|
+
// (scan-neutral: subsumes the DISTINCT provider scan).
|
|
318
|
+
const byFeaturePartition = new Map();
|
|
319
|
+
for (const row of partition) {
|
|
320
|
+
const arr = byFeaturePartition.get(row.feature) ?? [];
|
|
321
|
+
arr.push(row);
|
|
322
|
+
byFeaturePartition.set(row.feature, arr);
|
|
323
|
+
}
|
|
324
|
+
for (const f of features) {
|
|
325
|
+
const rows = byFeaturePartition.get(f.feature) ?? [];
|
|
326
|
+
f.byModel = rows;
|
|
327
|
+
f.frameworks = Array.from(new Set(rows.filter((r) => r.framework !== 'unknown').map((r) => r.framework))).sort();
|
|
328
|
+
f.models = Array.from(new Set(rows.filter((r) => r.model !== 'unknown').map((r) => r.model))).sort();
|
|
329
|
+
}
|
|
330
|
+
// totals.byModel — aggregate the same partition by model×framework.
|
|
331
|
+
const modelAgg = new Map();
|
|
332
|
+
for (const row of partition) {
|
|
333
|
+
const key = `${row.model}${row.framework}`;
|
|
334
|
+
const acc = modelAgg.get(key) ??
|
|
335
|
+
{
|
|
336
|
+
model: row.model,
|
|
337
|
+
framework: row.framework,
|
|
338
|
+
calls: 0,
|
|
339
|
+
realCalls: 0,
|
|
340
|
+
tokensIn: 0,
|
|
341
|
+
tokensOut: 0,
|
|
342
|
+
tokensCached: 0,
|
|
343
|
+
fired: 0,
|
|
344
|
+
noop: 0,
|
|
345
|
+
errors: 0,
|
|
346
|
+
shed: 0,
|
|
347
|
+
};
|
|
348
|
+
acc.calls += row.calls;
|
|
349
|
+
acc.realCalls += row.realCalls;
|
|
350
|
+
acc.tokensIn += row.tokensIn;
|
|
351
|
+
acc.tokensOut += row.tokensOut;
|
|
352
|
+
acc.tokensCached += row.tokensCached;
|
|
353
|
+
acc.fired += row.fired;
|
|
354
|
+
acc.noop += row.noop;
|
|
355
|
+
acc.errors += row.errors;
|
|
356
|
+
acc.shed += row.shed;
|
|
357
|
+
modelAgg.set(key, acc);
|
|
358
|
+
}
|
|
359
|
+
const byModel = Array.from(modelAgg.values()).sort((a, b) => b.tokensIn + b.tokensOut - (a.tokensIn + a.tokensOut));
|
|
360
|
+
// usageCoverage — per framework from the SAME partition (no second window
|
|
361
|
+
// scan). Success-only denominator; interactive-pool rows excluded from
|
|
362
|
+
// the claude-code denominator (that provider never invokes onUsage by
|
|
363
|
+
// documented contract).
|
|
364
|
+
const coverageAgg = new Map();
|
|
365
|
+
for (const row of partition) {
|
|
366
|
+
const fw = row.framework;
|
|
367
|
+
const acc = coverageAgg.get(fw) ??
|
|
368
|
+
{ successRows: 0, successRowsWithUsage: 0, errorRows: 0, errorRowsWithUsage: 0, excludedRows: 0 };
|
|
369
|
+
const isInteractivePool = fw === 'claude-code' && row.model === 'interactive-pool';
|
|
370
|
+
if (isInteractivePool) {
|
|
371
|
+
acc.excludedRows += row.fired + row.noop;
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
acc.successRows += row.fired + row.noop;
|
|
375
|
+
acc.successRowsWithUsage += row.successRowsWithUsage;
|
|
376
|
+
}
|
|
377
|
+
acc.errorRows += row.errors;
|
|
378
|
+
acc.errorRowsWithUsage += row.errorRowsWithUsage;
|
|
379
|
+
coverageAgg.set(fw, acc);
|
|
380
|
+
}
|
|
381
|
+
const usageCoverage = Array.from(coverageAgg.entries())
|
|
382
|
+
.map(([framework, c]) => ({
|
|
383
|
+
framework,
|
|
384
|
+
successRows: c.successRows,
|
|
385
|
+
successRowsWithUsage: c.successRowsWithUsage,
|
|
386
|
+
coverage: c.successRows > 0 ? c.successRowsWithUsage / c.successRows : 0,
|
|
387
|
+
errorRows: c.errorRows,
|
|
388
|
+
errorRowsWithUsage: c.errorRowsWithUsage,
|
|
389
|
+
exempt: FeatureMetricsLedger.USAGE_EXEMPT_FRAMEWORKS.has(framework),
|
|
390
|
+
...(c.excludedRows > 0 ? { excludedRows: c.excludedRows } : {}),
|
|
391
|
+
}))
|
|
392
|
+
.sort((a, b) => a.framework.localeCompare(b.framework));
|
|
224
393
|
const totals = features.reduce((acc, f) => {
|
|
225
394
|
acc.calls += f.calls;
|
|
226
395
|
acc.realCalls += f.realCalls;
|
|
@@ -228,13 +397,30 @@ export class FeatureMetricsLedger {
|
|
|
228
397
|
acc.events += f.events;
|
|
229
398
|
acc.tokensIn += f.tokensIn;
|
|
230
399
|
acc.tokensOut += f.tokensOut;
|
|
400
|
+
acc.tokensCached += f.tokensCached;
|
|
231
401
|
acc.fired += f.fired;
|
|
232
402
|
acc.noop += f.noop;
|
|
233
403
|
acc.errors += f.errors;
|
|
234
404
|
acc.shed += f.shed;
|
|
235
405
|
return acc;
|
|
236
|
-
}, {
|
|
237
|
-
|
|
406
|
+
}, {
|
|
407
|
+
calls: 0, realCalls: 0, llmCalls: 0, events: 0,
|
|
408
|
+
tokensIn: 0, tokensOut: 0, tokensCached: 0,
|
|
409
|
+
fired: 0, noop: 0, errors: 0, shed: 0,
|
|
410
|
+
});
|
|
411
|
+
// Unlabeled shares — both needed: token-blind unlabeled calls contribute
|
|
412
|
+
// 0/0 to the token share, so the call share is what catches unlabeled
|
|
413
|
+
// traffic running at volume. Zero denominators → 0.
|
|
414
|
+
const unlabeled = features.find((f) => f.feature === 'unlabeled');
|
|
415
|
+
const totalTokens = totals.tokensIn + totals.tokensOut;
|
|
416
|
+
const unlabeledTokens = unlabeled ? unlabeled.tokensIn + unlabeled.tokensOut : 0;
|
|
417
|
+
const unlabeledTokenShare = totalTokens > 0 ? unlabeledTokens / totalTokens : 0;
|
|
418
|
+
const unlabeledCallShare = totals.realCalls > 0 ? (unlabeled?.realCalls ?? 0) / totals.realCalls : 0;
|
|
419
|
+
return {
|
|
420
|
+
sinceMs,
|
|
421
|
+
totals: { ...totals, byModel, usageCoverage, unlabeledTokenShare, unlabeledCallShare },
|
|
422
|
+
features,
|
|
423
|
+
};
|
|
238
424
|
}
|
|
239
425
|
/**
|
|
240
426
|
* Delete rows older than `cutoffMs`. Returns rows deleted. Fail-open.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureMetricsLedger.js","sourceRoot":"","sources":["../../src/monitoring/FeatureMetricsLedger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FeatureMetricsLedger.js","sourceRoot":"","sources":["../../src/monitoring/FeatureMetricsLedger.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,7 +97,12 @@ export interface SentinelDeps {
|
|
|
97
97
|
/** Override clock (tests). */
|
|
98
98
|
now?: () => number;
|
|
99
99
|
/** Override fetch (tests). Default uses node:http to localhost. */
|
|
100
|
-
postReply?: (port: number, token: string, agentId: string, topicId: number, text: string, deliveryId: string, isSystem?: boolean
|
|
100
|
+
postReply?: (port: number, token: string, agentId: string, topicId: number, text: string, deliveryId: string, isSystem?: boolean,
|
|
101
|
+
/** Serialized queue-row metadata (kind/senderClass/advisoryAck) — the
|
|
102
|
+
* redrive forwards it whole so a queued automated send is never
|
|
103
|
+
* mis-kinded (spec outbound-jargon-filepath-gap §2.5). Null on legacy
|
|
104
|
+
* rows. */
|
|
105
|
+
metadataJson?: string | null) => Promise<{
|
|
101
106
|
status: number;
|
|
102
107
|
body: string;
|
|
103
108
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-failure-sentinel.d.ts","sourceRoot":"","sources":["../../src/monitoring/delivery-failure-sentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,qCAAqC,CAAC;AAG9F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AActE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,UAAU,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,CACvB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,KAClF,MAAM,IAAI,CAAC;IAChB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"delivery-failure-sentinel.d.ts","sourceRoot":"","sources":["../../src/monitoring/delivery-failure-sentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -338,7 +338,7 @@ export class DeliveryFailureSentinel extends EventEmitter {
|
|
|
338
338
|
// POST /telegram/reply with the delivery-id header for server-side dedup.
|
|
339
339
|
let resp;
|
|
340
340
|
try {
|
|
341
|
-
resp = await this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, text, row.delivery_id);
|
|
341
|
+
resp = await this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, text, row.delivery_id, false, row.message_metadata ?? null);
|
|
342
342
|
}
|
|
343
343
|
catch (err) {
|
|
344
344
|
return this.handlePolicyDecision(row, evaluatePolicy({
|
|
@@ -591,9 +591,21 @@ function humanDuration(ms) {
|
|
|
591
591
|
const remMinutes = minutes % 60;
|
|
592
592
|
return `${hours}h ${remMinutes}m`;
|
|
593
593
|
}
|
|
594
|
-
async function defaultPostReply(port, token, agentId, topicId, text, deliveryId, isSystem = false) {
|
|
594
|
+
async function defaultPostReply(port, token, agentId, topicId, text, deliveryId, isSystem = false, metadataJson = null) {
|
|
595
595
|
return new Promise((resolve, reject) => {
|
|
596
|
-
|
|
596
|
+
// Forward the queued row's kind metadata whole (§2.5) — a malformed
|
|
597
|
+
// stored value is dropped rather than failing the redrive.
|
|
598
|
+
let metadata;
|
|
599
|
+
if (metadataJson) {
|
|
600
|
+
try {
|
|
601
|
+
metadata = JSON.parse(metadataJson);
|
|
602
|
+
}
|
|
603
|
+
catch {
|
|
604
|
+
/* @silent-fallback-ok — §2.5: a malformed stored metadata value is dropped rather than failing the redrive */
|
|
605
|
+
metadata = undefined;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
const payload = JSON.stringify(metadata ? { text, metadata } : { text });
|
|
597
609
|
const headers = {
|
|
598
610
|
'Content-Type': 'application/json',
|
|
599
611
|
'Content-Length': String(Buffer.byteLength(payload, 'utf-8')),
|