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.
Files changed (133) hide show
  1. package/dist/commands/reflect.d.ts.map +1 -1
  2. package/dist/commands/reflect.js +4 -0
  3. package/dist/commands/reflect.js.map +1 -1
  4. package/dist/commands/route.d.ts.map +1 -1
  5. package/dist/commands/route.js +3 -0
  6. package/dist/commands/route.js.map +1 -1
  7. package/dist/commands/server.d.ts.map +1 -1
  8. package/dist/commands/server.js +14 -0
  9. package/dist/commands/server.js.map +1 -1
  10. package/dist/core/CircuitBreakingIntelligenceProvider.d.ts +7 -0
  11. package/dist/core/CircuitBreakingIntelligenceProvider.d.ts.map +1 -1
  12. package/dist/core/CircuitBreakingIntelligenceProvider.js +50 -0
  13. package/dist/core/CircuitBreakingIntelligenceProvider.js.map +1 -1
  14. package/dist/core/ClaudeCliIntelligenceProvider.d.ts +5 -0
  15. package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
  16. package/dist/core/ClaudeCliIntelligenceProvider.js +6 -1
  17. package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
  18. package/dist/core/CodexCliIntelligenceProvider.d.ts +58 -0
  19. package/dist/core/CodexCliIntelligenceProvider.d.ts.map +1 -1
  20. package/dist/core/CodexCliIntelligenceProvider.js +293 -27
  21. package/dist/core/CodexCliIntelligenceProvider.js.map +1 -1
  22. package/dist/core/GeminiCliIntelligenceProvider.d.ts +8 -0
  23. package/dist/core/GeminiCliIntelligenceProvider.d.ts.map +1 -1
  24. package/dist/core/GeminiCliIntelligenceProvider.js +8 -0
  25. package/dist/core/GeminiCliIntelligenceProvider.js.map +1 -1
  26. package/dist/core/MessagingToneGate.d.ts +23 -2
  27. package/dist/core/MessagingToneGate.d.ts.map +1 -1
  28. package/dist/core/MessagingToneGate.js +15 -1
  29. package/dist/core/MessagingToneGate.js.map +1 -1
  30. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  31. package/dist/core/PostUpdateMigrator.js +61 -0
  32. package/dist/core/PostUpdateMigrator.js.map +1 -1
  33. package/dist/core/SafeGitExecutor.d.ts.map +1 -1
  34. package/dist/core/SafeGitExecutor.js +79 -1
  35. package/dist/core/SafeGitExecutor.js.map +1 -1
  36. package/dist/core/SessionManager.d.ts.map +1 -1
  37. package/dist/core/SessionManager.js +22 -0
  38. package/dist/core/SessionManager.js.map +1 -1
  39. package/dist/core/TelegramRelay.d.ts +1 -0
  40. package/dist/core/TelegramRelay.d.ts.map +1 -1
  41. package/dist/core/TelegramRelay.js +9 -1
  42. package/dist/core/TelegramRelay.js.map +1 -1
  43. package/dist/core/componentCategories.d.ts.map +1 -1
  44. package/dist/core/componentCategories.js +10 -0
  45. package/dist/core/componentCategories.js.map +1 -1
  46. package/dist/core/intelligenceProviderFactory.d.ts +8 -0
  47. package/dist/core/intelligenceProviderFactory.d.ts.map +1 -1
  48. package/dist/core/intelligenceProviderFactory.js +1 -0
  49. package/dist/core/intelligenceProviderFactory.js.map +1 -1
  50. package/dist/core/raw-file-path.d.ts +33 -0
  51. package/dist/core/raw-file-path.d.ts.map +1 -0
  52. package/dist/core/raw-file-path.js +105 -0
  53. package/dist/core/raw-file-path.js.map +1 -0
  54. package/dist/core/types.d.ts +17 -9
  55. package/dist/core/types.d.ts.map +1 -1
  56. package/dist/core/types.js.map +1 -1
  57. package/dist/messaging/OutboundAdvisory.d.ts +152 -0
  58. package/dist/messaging/OutboundAdvisory.d.ts.map +1 -0
  59. package/dist/messaging/OutboundAdvisory.js +453 -0
  60. package/dist/messaging/OutboundAdvisory.js.map +1 -0
  61. package/dist/messaging/TelegramAdapter.d.ts +6 -0
  62. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  63. package/dist/messaging/TelegramAdapter.js +4 -1
  64. package/dist/messaging/TelegramAdapter.js.map +1 -1
  65. package/dist/messaging/pending-relay-store.d.ts +7 -0
  66. package/dist/messaging/pending-relay-store.d.ts.map +1 -1
  67. package/dist/messaging/pending-relay-store.js +9 -3
  68. package/dist/messaging/pending-relay-store.js.map +1 -1
  69. package/dist/messaging/slack/SlackAdapter.d.ts +3 -0
  70. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  71. package/dist/messaging/slack/SlackAdapter.js +8 -1
  72. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  73. package/dist/monitoring/FeatureMetricsLedger.d.ts +123 -1
  74. package/dist/monitoring/FeatureMetricsLedger.d.ts.map +1 -1
  75. package/dist/monitoring/FeatureMetricsLedger.js +211 -25
  76. package/dist/monitoring/FeatureMetricsLedger.js.map +1 -1
  77. package/dist/monitoring/delivery-failure-sentinel.d.ts +6 -1
  78. package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -1
  79. package/dist/monitoring/delivery-failure-sentinel.js +15 -3
  80. package/dist/monitoring/delivery-failure-sentinel.js.map +1 -1
  81. package/dist/providers/adapters/anthropic-interactive-pool/index.d.ts.map +1 -1
  82. package/dist/providers/adapters/anthropic-interactive-pool/index.js +1 -0
  83. package/dist/providers/adapters/anthropic-interactive-pool/index.js.map +1 -1
  84. package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts +93 -0
  85. package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts.map +1 -1
  86. package/dist/providers/adapters/openai-codex/transport/codexSpawn.js +339 -0
  87. package/dist/providers/adapters/openai-codex/transport/codexSpawn.js.map +1 -1
  88. package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts +84 -0
  89. package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts.map +1 -0
  90. package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js +208 -0
  91. package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js.map +1 -0
  92. package/dist/providers/uxConfirm/OverrideDetector.d.ts.map +1 -1
  93. package/dist/providers/uxConfirm/OverrideDetector.js +1 -0
  94. package/dist/providers/uxConfirm/OverrideDetector.js.map +1 -1
  95. package/dist/providers/uxConfirm/TaskClassifier.d.ts.map +1 -1
  96. package/dist/providers/uxConfirm/TaskClassifier.js +1 -0
  97. package/dist/providers/uxConfirm/TaskClassifier.js.map +1 -1
  98. package/dist/scaffold/templates.d.ts.map +1 -1
  99. package/dist/scaffold/templates.js +10 -3
  100. package/dist/scaffold/templates.js.map +1 -1
  101. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  102. package/dist/scheduler/JobScheduler.js +8 -0
  103. package/dist/scheduler/JobScheduler.js.map +1 -1
  104. package/dist/security/LLMSanitizer.d.ts.map +1 -1
  105. package/dist/security/LLMSanitizer.js +7 -1
  106. package/dist/security/LLMSanitizer.js.map +1 -1
  107. package/dist/server/AgentServer.d.ts +1 -0
  108. package/dist/server/AgentServer.d.ts.map +1 -1
  109. package/dist/server/AgentServer.js +22 -0
  110. package/dist/server/AgentServer.js.map +1 -1
  111. package/dist/server/CapabilityIndex.js +1 -1
  112. package/dist/server/CapabilityIndex.js.map +1 -1
  113. package/dist/server/routes.d.ts +12 -0
  114. package/dist/server/routes.d.ts.map +1 -1
  115. package/dist/server/routes.js +226 -4
  116. package/dist/server/routes.js.map +1 -1
  117. package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
  118. package/dist/threadline/PipeSessionSpawner.js +2 -0
  119. package/dist/threadline/PipeSessionSpawner.js.map +1 -1
  120. package/dist/threadline/WarrantsReplyGate.d.ts.map +1 -1
  121. package/dist/threadline/WarrantsReplyGate.js +5 -1
  122. package/dist/threadline/WarrantsReplyGate.js.map +1 -1
  123. package/package.json +4 -2
  124. package/scripts/lint-llm-attribution.js +418 -0
  125. package/scripts/lint-no-direct-destructive.js +4 -0
  126. package/scripts/pre-push-gate.js +24 -0
  127. package/src/data/builtin-manifest.json +67 -67
  128. package/src/scaffold/templates.ts +10 -3
  129. package/src/templates/scripts/telegram-reply.sh +202 -10
  130. package/upgrades/1.3.486.md +38 -0
  131. package/upgrades/1.3.487.md +39 -0
  132. package/upgrades/side-effects/outbound-advisory-inform-only.md +252 -0
  133. 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
- /** Totals + per-feature rollup. */
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;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,oBAAoB,CAAC;IAC3D,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAyCD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,2BAA2B;IAwB7C,iFAAiF;IACjF,OAAO,CAAC,kBAAkB;IAe1B,oFAAoF;IACpF,MAAM,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAuBpC,0FAA0F;IAC1F,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAIrF,uEAAuE;IACvE,SAAS,CAAC,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,aAAa,EAAE;IA+F9D,mCAAmC;IACnC,OAAO,CAAC,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,qBAAqB;IAsBlE;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAaxC,KAAK,IAAI,IAAI;CAKd"}
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
- const sinceMs = opts.sinceHours && opts.sinceHours > 0 ? this.now() - opts.sinceHours * 3_600_000 : 0;
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 window).
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 Intelligence:
171
- // "which provider actually ran this sentinel"). Bounded by GROUP BY DISTINCT.
172
- const fwRows = this.db
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
- for (const row of fwRows) {
179
- if (row.framework) {
180
- const s = fwByFeature.get(row.feature) ?? new Set();
181
- s.add(row.framework);
182
- fwByFeature.set(row.feature, s);
183
- }
184
- if (row.model) {
185
- const s = modelByFeature.get(row.feature) ?? new Set();
186
- s.add(row.model);
187
- modelByFeature.set(row.feature, s);
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
- /** Totals + per-feature rollup. */
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 features = this.byFeature(opts);
223
- const sinceMs = opts.sinceHours && opts.sinceHours > 0 ? this.now() - opts.sinceHours * 3_600_000 : 0;
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
- }, { calls: 0, realCalls: 0, llmCalls: 0, events: 0, tokensIn: 0, tokensOut: 0, fired: 0, noop: 0, errors: 0, shed: 0 });
237
- return { sinceMs, totals, features };
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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAgMrE,MAAM,MAAM,GAAG;IACb;;;;;;;;;;;;;;KAcG;IACH,2EAA2E;IAC3E,yFAAyF;CAC1F,CAAC;AAEF;;;;;GAKG;AACH,MAAM,aAAa,GAAyC;IAC1D,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,uDAAuD,EAAE;IACnF,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,8DAA8D,EAAE;CAC/F,CAAC;AAEF,SAAS,UAAU,CAAC,SAAmB,EAAE,CAAS;IAChD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,mCAAmC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,OAAO,oBAAoB;IACvB,EAAE,CAAuB;IACzB,GAAG,CAAe;IAClB,UAAU,CAA+C;IACzD,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,IAAiC;QAC3C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,8EAA8E;QAC9E,2DAA2D;QAC3D,IAAI,CAAC,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAC3C,sBAAsB,EACtB,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CACvE,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,wEAAwE;QACxE,oBAAoB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC/B;;mJAE6I,CAC9I,CAAC;IACJ,CAAC;IAED,iFAAiF;IACzE,kBAAkB;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5G,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2EAA2E;YAC3E,sEAAsE;YACtE,0EAA0E;QAC5E,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,MAAM,CAAC,CAAsB;QAC3B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAClB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;gBAChE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK;gBACrB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;gBAC5B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;gBAC9B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;gBAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;gBAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,WAAW,CAAC,OAAe,EAAE,OAA6B,EAAE,SAAkB;QAC5E,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAEO,WAAW,CAAC,IAA6B;QAC/C,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,uEAAuE;IACvE,SAAS,CAAC,OAAgC,EAAE;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;;;;OAKG;IACK,aAAa,CACnB,OAAe,EACf,CAAmC;QAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;;;;;;;;;;;;;;;;6BAmBqB,CACtB;aACA,GAAG,CAAC,OAAO,CAA2C,CAAC;QAE1D,uEAAuE;QACvE,kEAAkE;QAClE,8DAA8D;QAC9D,wDAAwD;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CACN;;2CAEmC,CACpC;aACA,GAAG,CAAC,OAAO,CAAmD,CAAC;QAClE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;QAED,gEAAgE;QAChE,gEAAgE;QAChE,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;QACtD,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACnB,OAAO,CACN;2EACiE,CAClE;iBACA,GAAG,CAAC,OAAO,CAA+E,CAAC;YAC9F,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;oBAClB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;oBAC5D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACrB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBACd,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;oBAC/D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACjB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC;YAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1B,KAAK;gBACL,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7B,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACnC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACzC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACvE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACtE,KAAK;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7B,IAAI;gBACJ,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC/C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACrD,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;gBACnC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;gBACpC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACzC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;aAChD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,cAAc,CAAC,OAAgC,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAmD,CAAC;QACxD,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,EAAE;iBACX,OAAO,CACN;;;;;;;;;;;;;;;;;0DAiBgD,CACjD;iBACA,GAAG,CAAC,OAAO,CAAkD,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,+DAA+D;YAC/D,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC9E,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9F,KAAK;gBACL,SAAS,EAAE,KAAK,GAAG,IAAI;gBACvB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACnC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACzC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC3B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7B,IAAI;gBACJ,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBACzD,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC;aACtD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAU,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAE1E,0EAA0E;IAC1E,OAAO,CAAC,OAAgC,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,mEAAmE;QACnE,6DAA6D;QAC7D,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7E,oEAAoE;QACpE,uDAAuD;QACvD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAgC,CAAC;QACnE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACrD,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjH,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvG,CAAC;QAED,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,GAAG,GACP,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAChB;oBACC,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,SAAS,EAAE,CAAC;oBACZ,YAAY,EAAE,CAAC;oBACf,KAAK,EAAE,CAAC;oBACR,IAAI,EAAE,CAAC;oBACP,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC;iBACQ,CAAC;YACpB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;YACvB,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;YAC/B,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;YAC7B,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;YAC/B,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC;YACrC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;YACvB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;YACzB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;YACrB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,CAChE,CAAC;QAEF,0EAA0E;QAC1E,uEAAuE;QACvE,sEAAsE;QACtE,wBAAwB;QACxB,MAAM,WAAW,GAAG,IAAI,GAAG,EAGxB,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;YACzB,MAAM,GAAG,GACP,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,EAAE,WAAW,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;YACpG,MAAM,iBAAiB,GAAG,EAAE,KAAK,aAAa,IAAI,GAAG,CAAC,KAAK,KAAK,kBAAkB,CAAC;YACnF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;gBACxC,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC,oBAAoB,CAAC;YACvD,CAAC;YACD,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC;YAC5B,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,kBAAkB,CAAC;YACjD,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,aAAa,GAAuB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACxE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS;YACT,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;YAC5C,QAAQ,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACxE,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,MAAM,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC;YACnE,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACT,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;YACrB,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;YAC7B,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC;YAC3B,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;YACvB,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC;YAC3B,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;YAC7B,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC;YACnC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;YACrB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;YACnB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;YACvB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;YAC9C,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;YAC1C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;SACtC,CACF,CAAC;QAEF,yEAAyE;QACzE,sEAAsE;QACtE,oDAAoD;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QACvD,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,mBAAmB,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAErG,OAAO;YACL,OAAO;YACP,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE;YACtF,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,QAAgB;QAC7B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,6EAA6E;YAC7E,2EAA2E;YAC3E,wBAAwB;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC"}
@@ -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) => Promise<{
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":"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"}
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
- const payload = JSON.stringify({ text });
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')),