sidekick-shared 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +115 -37
  2. package/dist/aggregation/EventAggregator.d.ts +5 -1
  3. package/dist/aggregation/EventAggregator.js +64 -131
  4. package/dist/aggregation/types.d.ts +3 -0
  5. package/dist/browser.d.ts +6 -0
  6. package/dist/browser.js +10 -1
  7. package/dist/context/sessionContext.js +8 -6
  8. package/dist/extractors/tokenUsage.js +1 -1
  9. package/dist/index.d.ts +11 -1
  10. package/dist/index.js +23 -7
  11. package/dist/modelInfo.d.ts +17 -7
  12. package/dist/modelInfo.js +5 -2
  13. package/dist/node.d.ts +4 -0
  14. package/dist/node.js +8 -1
  15. package/dist/observedSessionCollector.d.ts +68 -0
  16. package/dist/observedSessionCollector.js +178 -0
  17. package/dist/parsers/codexParser.js +21 -6
  18. package/dist/parsers/openCodeParser.js +22 -1
  19. package/dist/parsers/subagentTraceParser.js +11 -5
  20. package/dist/providers/claudeCode.js +45 -1
  21. package/dist/providers/codex.js +17 -7
  22. package/dist/report/transcriptParser.d.ts +3 -11
  23. package/dist/report/transcriptParser.js +69 -154
  24. package/dist/schemas/index.d.ts +7 -1
  25. package/dist/schemas/index.js +18 -2
  26. package/dist/schemas/observedSessionV1.d.ts +32 -1
  27. package/dist/schemas/observedSessionV1.js +11 -1
  28. package/dist/schemas/sessionEvent.d.ts +353 -12
  29. package/dist/schemas/sessionEvent.js +76 -14
  30. package/dist/schemas/tokenEstimation.d.ts +14 -0
  31. package/dist/schemas/tokenEstimation.js +10 -0
  32. package/dist/schemas/transcript.d.ts +24 -0
  33. package/dist/schemas/transcript.js +81 -0
  34. package/dist/schemas/usageNormalization.d.ts +55 -0
  35. package/dist/schemas/usageNormalization.js +41 -0
  36. package/dist/sessionTranscripts.d.ts +16 -0
  37. package/dist/sessionTranscripts.js +47 -0
  38. package/dist/tokenEstimation.d.ts +24 -0
  39. package/dist/tokenEstimation.js +62 -0
  40. package/dist/transcript.d.ts +92 -0
  41. package/dist/transcript.js +240 -0
  42. package/dist/types/observedSessionV1.d.ts +3 -1
  43. package/dist/types/observedSessionV1.js +14 -1
  44. package/dist/types/sessionEvent.d.ts +65 -7
  45. package/dist/usageNormalization.d.ts +69 -0
  46. package/dist/usageNormalization.js +100 -0
  47. package/package.json +1 -1
@@ -19,8 +19,9 @@ const noiseClassifier_1 = require("../formatters/noiseClassifier");
19
19
  const FrequencyTracker_1 = require("./FrequencyTracker");
20
20
  const HeatmapTracker_1 = require("./HeatmapTracker");
21
21
  const PatternExtractor_1 = require("./PatternExtractor");
22
- const modelInfo_1 = require("../modelInfo");
23
22
  const errorTaxonomy_1 = require("../extractors/errorTaxonomy");
23
+ const tokenEstimation_1 = require("../tokenEstimation");
24
+ const usageNormalization_1 = require("../usageNormalization");
24
25
  // ── Defaults ──
25
26
  const DEFAULT_TIMELINE_CAP = 200;
26
27
  const DEFAULT_LATENCY_CAP = 100;
@@ -29,7 +30,7 @@ const DEFAULT_BURN_WINDOW_MS = 5 * 60_000;
29
30
  const DEFAULT_BURN_SAMPLE_MS = 10_000;
30
31
  const COMPACTION_DROP_THRESHOLD = 0.8; // >20% drop
31
32
  /** Schema version for serialized snapshots. */
32
- exports.SNAPSHOT_SCHEMA_VERSION = 3;
33
+ exports.SNAPSHOT_SCHEMA_VERSION = 4;
33
34
  // ── Goal gate detection regex ──
34
35
  const GOAL_GATE_REGEX = /\b(CRITICAL|MUST|blocker|required|must.?complete|goal.?gate|essential|do.?not.?skip|blocking)\b/i;
35
36
  // ── Todo dependency parsing ──
@@ -75,6 +76,8 @@ class EventAggregator {
75
76
  outputTokens = 0;
76
77
  cacheWriteTokens = 0;
77
78
  cacheReadTokens = 0;
79
+ reasoningTokens = 0;
80
+ totalTokens = 0;
78
81
  reportedCost = 0;
79
82
  // Per-model usage
80
83
  modelUsage = new Map();
@@ -168,22 +171,25 @@ class EventAggregator {
168
171
  this.sessionStartTime = event.timestamp;
169
172
  }
170
173
  this.lastEventTime = event.timestamp;
171
- // Guard: some event types (e.g. 'summary') have no message field in the raw JSONL
174
+ this.recordProviderMetadata(event);
175
+ // Bookkeeping rows can be useful without a message payload.
172
176
  if (!event.message) {
173
177
  if (event.type === 'summary') {
174
178
  this.recordExplicitCompaction(event.timestamp, event.compaction);
175
- this.addTimelineFromSessionEvent(event);
176
179
  }
180
+ this.trackPermissionMode(event);
181
+ this.addTimelineFromSessionEvent(event);
182
+ this.feedAnalytics(event.timestamp, event.type === 'summary' ? (event.summary ?? '') : '', this.extractToolNameFromEvent(event));
177
183
  return;
178
184
  }
179
185
  // 2. Track model
180
186
  if (event.message.model) {
181
187
  this.currentModel = event.message.model;
182
188
  }
183
- this.recordProviderMetadata(event);
184
189
  // 3. Skip system/audit events and synthetic token-count events for messageCount
185
190
  const msgId = event.message.id ?? '';
186
- if (event.type !== 'system' && !msgId.startsWith('token-count-')) {
191
+ if ((event.type === 'user' || event.type === 'assistant') &&
192
+ !msgId.startsWith('token-count-')) {
187
193
  this.messageCount++;
188
194
  }
189
195
  // 4. Latency tracking
@@ -191,9 +197,10 @@ class EventAggregator {
191
197
  this.processLatency(event);
192
198
  }
193
199
  // 5. Token accumulation
194
- if (event.message.usage) {
195
- const usageCost = this.accumulateUsage(event.message.usage, event.timestamp, event.message.model);
196
- this.attributePlanUsage(event.message.usage.input_tokens + event.message.usage.output_tokens, usageCost);
200
+ const normalizedUsage = (0, usageNormalization_1.extractNormalizedUsage)(event);
201
+ if (normalizedUsage) {
202
+ const usageCost = this.accumulateUsage(normalizedUsage, event.timestamp, event.message.model);
203
+ this.attributePlanUsage(normalizedUsage.totalTokens, usageCost);
197
204
  }
198
205
  if (event.type !== 'system') {
199
206
  // 6. Tool extraction from content blocks
@@ -239,91 +246,25 @@ class EventAggregator {
239
246
  }
240
247
  // 3. Token accumulation from FollowEvent fields
241
248
  if (event.tokens) {
242
- const inputTok = event.tokens.input;
243
- const outputTok = event.tokens.output;
244
- const cacheRead = event.cacheTokens?.read ?? 0;
245
- const cacheWrite = event.cacheTokens?.write ?? 0;
246
- this.inputTokens += inputTok;
247
- this.outputTokens += outputTok;
248
- this.cacheReadTokens += cacheRead;
249
- this.cacheWriteTokens += cacheWrite;
250
- this.attributePlanUsage(inputTok + outputTok, event.cost ?? 0);
251
- // Tokens since last burn sample
252
- this.tokensSinceLastSample += inputTok + outputTok;
253
- // Context size
254
- let contextSize;
255
- if (this.computeContextSize) {
256
- contextSize = this.computeContextSize({
257
- inputTokens: inputTok,
258
- outputTokens: outputTok,
259
- cacheWriteTokens: cacheWrite,
260
- cacheReadTokens: cacheRead,
261
- });
262
- }
263
- else {
264
- contextSize = inputTok + cacheWrite + cacheRead;
265
- }
266
- // Compaction detection
267
- if (this.resolvePendingHeuristicCompaction(contextSize)) {
268
- // The drop belongs to the explicit compaction marker just recorded.
269
- }
270
- else if (this.previousContextSize > 0 &&
271
- contextSize < this.previousContextSize * COMPACTION_DROP_THRESHOLD) {
272
- this.compactionEvents.push({
273
- timestamp: new Date(event.timestamp),
274
- contextBefore: this.previousContextSize,
275
- contextAfter: contextSize,
276
- tokensReclaimed: this.previousContextSize - contextSize,
277
- source: 'heuristic',
278
- });
279
- }
280
- this.previousContextSize = contextSize;
281
- this.currentContextSize = contextSize;
282
- // Per-model usage. If the provider reported a cost, use it; otherwise
283
- // resolve pricing from the catalog (null = unpriced → priced: false,
284
- // UI renders "—").
285
- if (event.model) {
286
- const model = event.model;
287
- const pricing = event.cost ? null : (0, modelInfo_1.getModelPricing)(model);
288
- const computed = event.cost
289
- ? event.cost
290
- : pricing
291
- ? (0, modelInfo_1.calculateCostWithPricing)({
292
- inputTokens: inputTok,
293
- outputTokens: outputTok,
294
- cacheWriteTokens: cacheWrite,
295
- cacheReadTokens: cacheRead,
296
- }, pricing)
297
- : 0;
298
- const evPriced = event.cost != null || pricing != null;
299
- const acc = this.modelUsage.get(model) ?? {
300
- calls: 0,
301
- tokens: 0,
302
- inputTokens: 0,
303
- outputTokens: 0,
304
- cacheWriteTokens: 0,
305
- cacheReadTokens: 0,
306
- cost: 0,
307
- priced: true,
308
- };
309
- acc.calls++;
310
- acc.tokens += inputTok + outputTok + cacheWrite + cacheRead;
311
- acc.inputTokens += inputTok;
312
- acc.outputTokens += outputTok;
313
- acc.cacheWriteTokens += cacheWrite;
314
- acc.cacheReadTokens += cacheRead;
315
- acc.cost += computed;
316
- if (!evPriced)
317
- acc.priced = false;
318
- this.modelUsage.set(model, acc);
319
- }
249
+ const normalized = (0, usageNormalization_1.normalizeProviderUsage)({
250
+ semantics: 'sidekick',
251
+ provider: event.providerId,
252
+ source: 'follow-event',
253
+ model: event.model,
254
+ inputTokens: event.tokens.input,
255
+ outputTokens: event.tokens.output,
256
+ cacheReadTokens: event.cacheTokens?.read,
257
+ cacheWriteTokens: event.cacheTokens?.write,
258
+ reasoningIncludedInOutput: false,
259
+ reportedCostUsd: event.cost,
260
+ });
261
+ const cost = this.accumulateUsage(normalized, event.timestamp, event.model);
262
+ this.attributePlanUsage(normalized.totalTokens, cost);
320
263
  }
321
- // Cost accumulation
322
- if (event.cost) {
264
+ else if (typeof event.cost === 'number' && Number.isFinite(event.cost) && event.cost >= 0) {
265
+ // Compatibility for cost-only follow events.
323
266
  this.reportedCost += event.cost;
324
267
  }
325
- // Burn rate sampling
326
- this.updateBurnRate(event.timestamp);
327
268
  // 4. Tool tracking from FollowEvent
328
269
  if (event.type === 'tool_use' && event.toolName) {
329
270
  this.recordFollowToolUse(event);
@@ -366,6 +307,8 @@ class EventAggregator {
366
307
  outputTokens: this.outputTokens,
367
308
  cacheWriteTokens: this.cacheWriteTokens,
368
309
  cacheReadTokens: this.cacheReadTokens,
310
+ reasoningTokens: this.reasoningTokens,
311
+ totalTokens: this.totalTokens,
369
312
  reportedCost: this.reportedCost,
370
313
  };
371
314
  }
@@ -482,6 +425,8 @@ class EventAggregator {
482
425
  this.outputTokens = 0;
483
426
  this.cacheWriteTokens = 0;
484
427
  this.cacheReadTokens = 0;
428
+ this.reasoningTokens = 0;
429
+ this.totalTokens = 0;
485
430
  this.reportedCost = 0;
486
431
  this.modelUsage.clear();
487
432
  this.currentContextSize = 0;
@@ -556,6 +501,8 @@ class EventAggregator {
556
501
  output: this.outputTokens,
557
502
  cacheWrite: this.cacheWriteTokens,
558
503
  cacheRead: this.cacheReadTokens,
504
+ reasoning: this.reasoningTokens,
505
+ total: this.totalTokens,
559
506
  reportedCost: this.reportedCost,
560
507
  },
561
508
  modelUsage: Array.from(this.modelUsage.entries()),
@@ -601,6 +548,8 @@ class EventAggregator {
601
548
  this.outputTokens = state.tokens.output;
602
549
  this.cacheWriteTokens = state.tokens.cacheWrite;
603
550
  this.cacheReadTokens = state.tokens.cacheRead;
551
+ this.reasoningTokens = state.tokens.reasoning;
552
+ this.totalTokens = state.tokens.total;
604
553
  this.reportedCost = state.tokens.reportedCost;
605
554
  this.modelUsage = new Map(state.modelUsage);
606
555
  this.currentContextSize = state.contextSize;
@@ -655,41 +604,24 @@ class EventAggregator {
655
604
  // Private: Token & Context
656
605
  // ═══════════════════════════════════════════════════════════════════════
657
606
  accumulateUsage(usage, timestamp, model) {
658
- const inputTok = usage.input_tokens;
659
- const outputTok = usage.output_tokens;
660
- const cacheWrite = usage.cache_creation_input_tokens ?? 0;
661
- const cacheRead = usage.cache_read_input_tokens ?? 0;
662
- const reasoningTok = usage.reasoning_tokens ?? 0;
663
- const reported = usage.reported_cost ?? 0;
664
- // Resolve provider pricing when we have a model ID. Lets sessions with no
665
- // reported_cost (Claude Code, Codex) still show real dollar figures.
607
+ const inputTok = usage.uncachedInputTokens;
608
+ const outputTok = usage.outputTokens;
609
+ const cacheWrite = usage.cacheWriteTokens;
610
+ const cacheRead = usage.cacheReadTokens;
611
+ const reasoningTok = usage.reasoningTokens;
666
612
  const modelKey = model ?? this.currentModel;
667
- const pricing = modelKey ? (0, modelInfo_1.getModelPricing)(modelKey) : null;
668
- let priced = reported > 0 || pricing !== null;
669
- let cost;
670
- if (reported > 0) {
671
- cost = reported;
672
- }
673
- else if (pricing) {
674
- cost = (0, modelInfo_1.calculateCostWithPricing)({
675
- inputTokens: inputTok,
676
- outputTokens: outputTok,
677
- cacheWriteTokens: cacheWrite,
678
- cacheReadTokens: cacheRead,
679
- reasoningTokens: reasoningTok,
680
- }, pricing);
681
- }
682
- else {
683
- cost = 0;
684
- priced = false;
685
- }
613
+ const pricedUsage = (0, usageNormalization_1.calculateNormalizedUsageCost)({ usage, modelId: modelKey ?? undefined });
614
+ const priced = pricedUsage.source !== 'unpriced';
615
+ const cost = pricedUsage.costUsd ?? 0;
686
616
  this.inputTokens += inputTok;
687
617
  this.outputTokens += outputTok;
688
618
  this.cacheWriteTokens += cacheWrite;
689
619
  this.cacheReadTokens += cacheRead;
620
+ this.reasoningTokens += reasoningTok;
621
+ this.totalTokens += usage.totalTokens;
690
622
  this.reportedCost += cost;
691
623
  // Burn rate sample accumulation
692
- this.tokensSinceLastSample += inputTok + outputTok;
624
+ this.tokensSinceLastSample += usage.totalTokens;
693
625
  // Context size computation
694
626
  let contextSize;
695
627
  if (this.computeContextSize) {
@@ -698,7 +630,7 @@ class EventAggregator {
698
630
  outputTokens: outputTok,
699
631
  cacheWriteTokens: cacheWrite,
700
632
  cacheReadTokens: cacheRead,
701
- reasoningTokens: usage.reasoning_tokens,
633
+ reasoningTokens: reasoningTok,
702
634
  });
703
635
  }
704
636
  else {
@@ -744,7 +676,7 @@ class EventAggregator {
744
676
  priced: true,
745
677
  };
746
678
  acc.calls++;
747
- acc.tokens += inputTok + outputTok + cacheWrite + cacheRead;
679
+ acc.tokens += usage.totalTokens;
748
680
  acc.inputTokens += inputTok;
749
681
  acc.outputTokens += outputTok;
750
682
  acc.cacheWriteTokens += cacheWrite;
@@ -821,7 +753,7 @@ class EventAggregator {
821
753
  // Private: Tool Extraction from SessionEvent content blocks
822
754
  // ═══════════════════════════════════════════════════════════════════════
823
755
  extractToolsFromContent(event) {
824
- const content = event.message.content;
756
+ const content = event.message?.content;
825
757
  if (!Array.isArray(content))
826
758
  return;
827
759
  for (const block of content) {
@@ -974,7 +906,7 @@ class EventAggregator {
974
906
  this.finishReasons.set(reason, (this.finishReasons.get(reason) ?? 0) + 1);
975
907
  }
976
908
  if (metadata.providerError) {
977
- this.recordError('ProviderAPI', (0, errorTaxonomy_1.categorizeError)(metadata.providerError, metadata.providerError.type), event.timestamp, event.message.model ?? this.currentModel ?? 'unknown');
909
+ this.recordError('ProviderAPI', (0, errorTaxonomy_1.categorizeError)(metadata.providerError, metadata.providerError.type), event.timestamp, event.message?.model ?? this.currentModel ?? 'unknown');
978
910
  }
979
911
  }
980
912
  recordError(tool, category, timestamp, model) {
@@ -1078,7 +1010,7 @@ class EventAggregator {
1078
1010
  // Private: Task State from SessionEvent
1079
1011
  // ═══════════════════════════════════════════════════════════════════════
1080
1012
  extractTaskStateFromEvent(event) {
1081
- const content = event.message.content;
1013
+ const content = event.message?.content;
1082
1014
  if (!Array.isArray(content))
1083
1015
  return;
1084
1016
  for (const block of content) {
@@ -1493,7 +1425,7 @@ class EventAggregator {
1493
1425
  // Private: Subagent Tracking from SessionEvent
1494
1426
  // ═══════════════════════════════════════════════════════════════════════
1495
1427
  extractSubagentFromEvent(event) {
1496
- const content = event.message.content;
1428
+ const content = event.message?.content;
1497
1429
  if (!Array.isArray(content))
1498
1430
  return;
1499
1431
  for (const block of content) {
@@ -1659,7 +1591,7 @@ class EventAggregator {
1659
1591
  // Private: Context Attribution from SessionEvent
1660
1592
  // ═══════════════════════════════════════════════════════════════════════
1661
1593
  attributeContextFromEvent(event) {
1662
- const content = event.message.content;
1594
+ const content = event.message?.content;
1663
1595
  if (event.type === 'user') {
1664
1596
  if (Array.isArray(content)) {
1665
1597
  for (const block of content) {
@@ -1866,7 +1798,8 @@ class EventAggregator {
1866
1798
  break;
1867
1799
  case 'system':
1868
1800
  tlType = 'session_start';
1869
- description = this.extractTextContent(event) ?? event.message.sourceLabel ?? 'System event';
1801
+ description =
1802
+ this.extractTextContent(event) ?? event.message?.sourceLabel ?? 'System event';
1870
1803
  noiseLevel = 'system';
1871
1804
  break;
1872
1805
  default:
@@ -1958,10 +1891,10 @@ class EventAggregator {
1958
1891
  // Private: Helper methods
1959
1892
  // ═══════════════════════════════════════════════════════════════════════
1960
1893
  estimateTokens(text) {
1961
- return Math.ceil(text.length / 4);
1894
+ return (0, tokenEstimation_1.estimateTextTokens)(text).count;
1962
1895
  }
1963
1896
  hasTextContent(event) {
1964
- const content = event.message.content;
1897
+ const content = event.message?.content;
1965
1898
  if (typeof content === 'string')
1966
1899
  return content.length > 0;
1967
1900
  if (Array.isArray(content)) {
@@ -1970,7 +1903,7 @@ class EventAggregator {
1970
1903
  return false;
1971
1904
  }
1972
1905
  extractTextContent(event) {
1973
- const content = event.message.content;
1906
+ const content = event.message?.content;
1974
1907
  if (typeof content === 'string')
1975
1908
  return content;
1976
1909
  if (Array.isArray(content)) {
@@ -1999,7 +1932,7 @@ class EventAggregator {
1999
1932
  // Private: Gonzo/Lazyjournal analytics
2000
1933
  // ═══════════════════════════════════════════════════════════════════════
2001
1934
  extractToolNameFromEvent(event) {
2002
- const content = event.message.content;
1935
+ const content = event.message?.content;
2003
1936
  if (!Array.isArray(content))
2004
1937
  return undefined;
2005
1938
  for (const block of content) {
@@ -56,6 +56,9 @@ export interface AggregatedTokens {
56
56
  outputTokens: number;
57
57
  cacheWriteTokens: number;
58
58
  cacheReadTokens: number;
59
+ reasoningTokens: number;
60
+ /** Overall total after applying provider reasoning-in-output semantics. */
61
+ totalTokens: number;
59
62
  reportedCost: number;
60
63
  }
61
64
  /** Per-model usage breakdown. */
package/dist/browser.d.ts CHANGED
@@ -8,6 +8,12 @@
8
8
  * For pricing hydration (LiteLLM catalog refresh), use `sidekick-shared/node`.
9
9
  */
10
10
  export { getModelContextWindowSize, DEFAULT_CONTEXT_WINDOW } from './modelContext';
11
+ export { normalizeProviderUsage, extractNormalizedUsage, calculateNormalizedUsageCost, } from './usageNormalization';
12
+ export type { UsageProvider, UsageSemantics, UsageNormalizationProvenance, ProviderUsageInput, AnthropicUsageInput, OpenAIUsageInput, SidekickUsageInput, NormalizedUsage, PricingProvenance, NormalizedUsageCostInput, NormalizedUsageCost, } from './usageNormalization';
13
+ export { estimateTextTokens, estimateSerializedTokens } from './tokenEstimation';
14
+ export type { ExactTokenCounterContext, ExactTokenCounter, TokenEstimationMethod, TokenEstimationConfidence, TokenEstimationOptions, TokenEstimate, } from './tokenEstimation';
15
+ export { projectSessionTranscript } from './transcript';
16
+ export type { TranscriptFidelity, TranscriptSourceProvenance, CanonicalTranscriptBlock, CanonicalTranscriptMessage, CanonicalToolCall, CanonicalTranscriptUsageTotals, CanonicalSessionTranscript, ProjectSessionTranscriptOptions, } from './transcript';
11
17
  export { formatDurationMs, formatTokenCount } from './formatting';
12
18
  export type { FormatDurationMsOptions, FormatTokenCountOptions } from './formatting';
13
19
  export { buildSessionContextSnapshot, calculateSessionContextPressure, createSessionContextProjector, } from './context/sessionContext';
package/dist/browser.js CHANGED
@@ -9,10 +9,19 @@
9
9
  * For pricing hydration (LiteLLM catalog refresh), use `sidekick-shared/node`.
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.formatTokenCount = exports.formatDurationMs = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = void 0;
12
+ exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.formatTokenCount = exports.formatDurationMs = exports.projectSessionTranscript = exports.estimateSerializedTokens = exports.estimateTextTokens = exports.calculateNormalizedUsageCost = exports.extractNormalizedUsage = exports.normalizeProviderUsage = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = void 0;
13
13
  var modelContext_1 = require("./modelContext");
14
14
  Object.defineProperty(exports, "getModelContextWindowSize", { enumerable: true, get: function () { return modelContext_1.getModelContextWindowSize; } });
15
15
  Object.defineProperty(exports, "DEFAULT_CONTEXT_WINDOW", { enumerable: true, get: function () { return modelContext_1.DEFAULT_CONTEXT_WINDOW; } });
16
+ var usageNormalization_1 = require("./usageNormalization");
17
+ Object.defineProperty(exports, "normalizeProviderUsage", { enumerable: true, get: function () { return usageNormalization_1.normalizeProviderUsage; } });
18
+ Object.defineProperty(exports, "extractNormalizedUsage", { enumerable: true, get: function () { return usageNormalization_1.extractNormalizedUsage; } });
19
+ Object.defineProperty(exports, "calculateNormalizedUsageCost", { enumerable: true, get: function () { return usageNormalization_1.calculateNormalizedUsageCost; } });
20
+ var tokenEstimation_1 = require("./tokenEstimation");
21
+ Object.defineProperty(exports, "estimateTextTokens", { enumerable: true, get: function () { return tokenEstimation_1.estimateTextTokens; } });
22
+ Object.defineProperty(exports, "estimateSerializedTokens", { enumerable: true, get: function () { return tokenEstimation_1.estimateSerializedTokens; } });
23
+ var transcript_1 = require("./transcript");
24
+ Object.defineProperty(exports, "projectSessionTranscript", { enumerable: true, get: function () { return transcript_1.projectSessionTranscript; } });
16
25
  var formatting_1 = require("./formatting");
17
26
  Object.defineProperty(exports, "formatDurationMs", { enumerable: true, get: function () { return formatting_1.formatDurationMs; } });
18
27
  Object.defineProperty(exports, "formatTokenCount", { enumerable: true, get: function () { return formatting_1.formatTokenCount; } });
@@ -12,6 +12,7 @@ exports.createSessionContextProjector = createSessionContextProjector;
12
12
  exports.readSessionContextSnapshot = readSessionContextSnapshot;
13
13
  const EventAggregator_1 = require("../aggregation/EventAggregator");
14
14
  const modelContext_1 = require("../modelContext");
15
+ const tokenEstimation_1 = require("../tokenEstimation");
15
16
  const DEFAULT_CONTEXT_SOURCE_LIMIT = 200;
16
17
  const DEFAULT_SNIPPET_MAX_CHARS = 240;
17
18
  const DEFAULT_BODY_MAX_CHARS = 5000;
@@ -209,16 +210,17 @@ function extractSourcesFromEvent(event, state) {
209
210
  }
210
211
  }
211
212
  function extractSystemSource(event, state) {
212
- const text = extractText(event.message.content);
213
- const label = event.message.sourceLabel ?? event.message.role ?? 'system';
214
- const usage = event.message.usage;
213
+ const message = event.message;
214
+ const text = extractText(message?.content);
215
+ const label = message?.sourceLabel ?? message?.role ?? 'system';
216
+ const usage = message?.usage;
215
217
  if (text) {
216
218
  addSource(state, {
217
219
  event,
218
220
  layer: 'system',
219
221
  sourceType: 'system',
220
222
  title: label,
221
- sourceRef: event.message.id,
223
+ sourceRef: message?.id,
222
224
  text,
223
225
  });
224
226
  }
@@ -228,7 +230,7 @@ function extractSystemSource(event, state) {
228
230
  layer: 'runtime',
229
231
  sourceType: event.rateLimits ? 'rate_limit' : 'runtime',
230
232
  title: event.rateLimits ? 'Runtime usage and rate limits' : 'Runtime usage',
231
- sourceRef: event.message.id,
233
+ sourceRef: message?.id,
232
234
  text: describeUsage(usage, event.rateLimits),
233
235
  metadata: {
234
236
  usage,
@@ -545,7 +547,7 @@ function truncateWithInfo(text, maxChars) {
545
547
  return { text: `${text.slice(0, maxChars - 3)}...`, truncated: true };
546
548
  }
547
549
  function estimateTokens(text) {
548
- return Math.max(1, Math.ceil(text.length / 4));
550
+ return (0, tokenEstimation_1.estimateTextTokens)(text).count;
549
551
  }
550
552
  function isRecord(value) {
551
553
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -35,7 +35,7 @@ function extractTokenUsage(event) {
35
35
  outputTokens: usage.output_tokens ?? 0,
36
36
  cacheWriteTokens: usage.cache_creation_input_tokens ?? 0,
37
37
  cacheReadTokens: usage.cache_read_input_tokens ?? 0,
38
- model: event.message.model ?? 'unknown',
38
+ model: event.message?.model ?? 'unknown',
39
39
  timestamp: new Date(event.timestamp),
40
40
  reportedCost: usage.reported_cost,
41
41
  reasoningTokens: usage.reasoning_tokens,
package/dist/index.d.ts CHANGED
@@ -1,7 +1,17 @@
1
1
  /**
2
2
  * Public API for sidekick-shared.
3
3
  */
4
- export type { SessionEvent, ClaudeSessionEvent, MessageUsage, SessionMessage, TokenUsage, ToolCall, ToolAnalytics, TimelineEvent, PendingToolCall, TaskStatus as SessionTaskStatus, TrackedTask, TaskState, SubagentStats, PendingUserRequest, ResponseLatency, LatencyStats, PlanStep, PlanState, SessionStats, CompactionEvent, TruncationEvent, ContextAttribution, TurnAttribution, ContextSizePoint, PermissionMode, PermissionModeChange, } from './types/sessionEvent';
4
+ export { normalizeProviderUsage, extractNormalizedUsage, calculateNormalizedUsageCost, } from './usageNormalization';
5
+ export type { UsageProvider, UsageSemantics, UsageNormalizationProvenance, ProviderUsageInput, AnthropicUsageInput, OpenAIUsageInput, SidekickUsageInput, NormalizedUsage, PricingProvenance, NormalizedUsageCostInput, NormalizedUsageCost, } from './usageNormalization';
6
+ export { estimateTextTokens, estimateSerializedTokens } from './tokenEstimation';
7
+ export type { ExactTokenCounterContext, ExactTokenCounter, TokenEstimationMethod, TokenEstimationConfidence, TokenEstimationOptions, TokenEstimate, } from './tokenEstimation';
8
+ export { projectSessionTranscript } from './transcript';
9
+ export type { TranscriptFidelity, TranscriptSourceProvenance, CanonicalTranscriptBlock, CanonicalTranscriptMessage, CanonicalToolCall, CanonicalTranscriptUsageTotals, CanonicalSessionTranscript, ProjectSessionTranscriptOptions, } from './transcript';
10
+ export { listRecentSessions, readSessionTranscript } from './sessionTranscripts';
11
+ export type { ProviderSessionIndex, ListRecentSessionsOptions } from './sessionTranscripts';
12
+ export { ObservedSessionCollector, observedSessionSourceFromProvider, fileFingerprint, } from './observedSessionCollector';
13
+ export type { ObservedSessionReference, ObservedSessionCollectionSource, ObservedSessionDiagnosticKind, ObservedSessionDiagnostic, ObservedSessionCollection, ObservedSessionCollectorOptions, } from './observedSessionCollector';
14
+ export type { SessionEvent, ClaudeSessionEvent, MessageUsage, SessionMessage, SessionEventBase, MessageSessionEvent, UserSessionEvent, AssistantSessionEvent, SummarySessionEvent, SystemSessionEvent, ToolUseSessionEvent, ToolResultSessionEvent, TokenUsage, ToolCall, ToolAnalytics, TimelineEvent, PendingToolCall, TaskStatus as SessionTaskStatus, TrackedTask, TaskState, SubagentStats, PendingUserRequest, ResponseLatency, LatencyStats, PlanStep, PlanState, SessionStats, CompactionEvent, TruncationEvent, ContextAttribution, TurnAttribution, ContextSizePoint, PermissionMode, PermissionModeChange, } from './types/sessionEvent';
5
15
  export type { OpenCodeSession, OpenCodeMessage, OpenCodePart, OpenCodeTextPart, OpenCodeReasoningPart, OpenCodeToolInvocationPart, OpenCodeCompactionPart, OpenCodeDbToolPart, OpenCodeStepStartPart, OpenCodeStepFinishPart, OpenCodePatchPart, OpenCodeSubtaskPart, OpenCodeAgentPart, OpenCodeFilePart, OpenCodeRetryPart, OpenCodeSnapshotPart, OpenCodeProject, DbProject as OpenCodeDbProject, DbSession as OpenCodeDbSession, DbMessage as OpenCodeDbMessage, DbPart as OpenCodeDbPart, } from './types/opencode';
6
16
  export type { CodexRolloutLine, CodexSessionMeta, CodexResponseItem, CodexMessageItem, CodexContentPart, CodexReasoningItem, CodexFunctionCallItem, CodexFunctionCallOutputItem, CodexLocalShellCallItem, CodexWebSearchCallItem, CodexCustomToolCallItem, CodexCustomToolCallOutputItem, CodexCompacted, CodexTurnContext, CodexEventMsg, CodexEvent, CodexTurnStartedEvent, CodexTurnCompleteEvent, CodexTaskStartedEvent, CodexTaskCompleteEvent, CodexTurnAbortedEvent, CodexTokenCountEvent, CodexTokenUsage, CodexRateLimits, CodexAgentMessageEvent, CodexAgentReasoningEvent, CodexUserMessageEvent, CodexExecCommandBeginEvent, CodexExecCommandEndEvent, CodexMcpToolCallBeginEvent, CodexMcpToolCallEndEvent, CodexErrorEvent, CodexContextCompactedEvent, CodexPatchAppliedEvent, CodexBackgroundEvent, CodexGenericEvent, CodexDbThread, CodexReasoningSummary, } from './types/codex';
7
17
  export { isAggregateCodexLimit } from './types/codex';
package/dist/index.js CHANGED
@@ -3,13 +3,29 @@
3
3
  * Public API for sidekick-shared.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TRUNCATION_PATTERNS = exports.JsonlParser = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports.derivePendingUserRequestV1 = exports.createProviderSessionAdapterV1 = exports.renderHandoffUrlTemplate = exports.addNote = exports.decisionFingerprint = exports.addDecision = exports.completeTask = exports.addTask = exports.updateJsonStoreAtomic = exports.atomicWriteJsonSync = exports.atomicWriteJson = exports.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = exports.migrateLegacyProjectStores = exports.resolveProjectIdentity = exports.getProjectSlugRaw = exports.getProjectSlug = exports.encodeWorkspacePath = exports.getGlobalDataPath = exports.getProjectDataPath = exports.getConfigDir = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyDataStore = exports.createEmptyTokenTotals = exports.HISTORICAL_SESSION_RETENTION_LIMIT = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = exports.isAggregateCodexLimit = void 0;
7
- exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.readSessionContextSnapshot = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.detectSessionActivity = exports.extractTaskInfo = exports.scanSubagentDir = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.CodexRolloutParser = exports.parseDbPartData = exports.parseDbMessageData = exports.convertOpenCodeMessage = exports.detectPlanModeFromText = exports.normalizeToolInput = exports.normalizeToolName = void 0;
8
- exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.formatCompactionLedger = exports.calculateCompactionLedger = exports.calculateCodeImpact = exports.scoreSessionQuality = exports.calculateQualityTrend = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.readErrorHistory = exports.getTopFailingTools = exports.appendErrorHistory = exports.MAX_ERROR_HISTORY_SESSIONS = exports.ERROR_HISTORY_SCHEMA_VERSION = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.SessionMonitor = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.formatTokenCount = exports.formatDurationMs = exports.createJsonlTail = exports.toFollowEvents = void 0;
9
- exports.removeCodexAccount = exports.switchToCodexAccount = exports.finalizeCodexAccount = exports.prepareCodexAccount = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.resolveActiveCodexAccount = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.readClaudeProfileIdentity = exports.isClaudeProfileAuthenticated = exports.claudeKeychainService = exports.claudeKeychainSuffix = exports.getClaudeProfileHome = exports.getClaudeProfilesDir = exports.getActiveAccountStatus = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLogin = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = void 0;
10
- exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = exports.selectStatuslineAccount = exports.formatStatusline = exports.estimateTimeToQuota = exports.BurnRateCalculator = exports.MultiProviderQuotaService = exports.resolveZaiQuota = exports.readZaiCredentials = exports.quotaStateFromZaiQuotaLimitPayload = exports.fetchZaiQuotaFromApi = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = exports.quotaFromCodexRateLimits = exports.fetchCodexQuotaFromApi = exports.fetchCodexResetCreditsFromApi = exports.getWorkspaceIdFromPath = exports.pruneQuotaHistory = exports.readQuotaHistoryDailyBuckets = exports.readQuotaHistoryRange = exports.appendQuotaHistorySample = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.FIVE_HOUR_WINDOW_MS = exports.AutoSwitchController = exports.decideAutoSwitch = exports.DEFAULT_AUTO_SWITCH_CONFIG = exports.removeLauncher = exports.writeLauncher = exports.isShellHookInstalled = exports.uninstallShellHook = exports.installShellHook = exports.setTerminalActiveProfile = void 0;
11
- exports.accountEntrySchema = exports.accountLoginStatusSchema = exports.beginAccountLoginResultSchema = exports.accountManagerResultSchema = exports.accountProviderIdSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.codexResetCreditsSnapshotSchema = exports.codexResetCreditSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = exports.ToolCallTracker = exports.extractToolCalls = exports.extractToolCall = exports.extractErrorMessage = exports.categorizeError = exports.gatherAssetsForCwd = exports.codexSessions = exports.readCodexAssets = exports.claudeSessions = exports.readClaudeAssets = exports.extractCommands = exports.extractFilePaths = exports.extractUrls = exports.extractTokenUsage = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.formatCost = exports.sortModelIds = exports.compareModelIds = void 0;
12
- exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.runDoctor = exports.getSessionDiagnostics = exports.formatHealthReport = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.listAllAccountsResultSchema = exports.savedAccountProfileSchema = void 0;
6
+ exports.addNote = exports.decisionFingerprint = exports.addDecision = exports.completeTask = exports.addTask = exports.updateJsonStoreAtomic = exports.atomicWriteJsonSync = exports.atomicWriteJson = exports.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = exports.migrateLegacyProjectStores = exports.resolveProjectIdentity = exports.getProjectSlugRaw = exports.getProjectSlug = exports.encodeWorkspacePath = exports.getGlobalDataPath = exports.getProjectDataPath = exports.getConfigDir = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyDataStore = exports.createEmptyTokenTotals = exports.HISTORICAL_SESSION_RETENTION_LIMIT = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = exports.isAggregateCodexLimit = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = exports.readSessionTranscript = exports.listRecentSessions = exports.projectSessionTranscript = exports.estimateSerializedTokens = exports.estimateTextTokens = exports.calculateNormalizedUsageCost = exports.extractNormalizedUsage = exports.normalizeProviderUsage = void 0;
7
+ exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.detectSessionActivity = exports.extractTaskInfo = exports.scanSubagentDir = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.CodexRolloutParser = exports.parseDbPartData = exports.parseDbMessageData = exports.convertOpenCodeMessage = exports.detectPlanModeFromText = exports.normalizeToolInput = exports.normalizeToolName = exports.TRUNCATION_PATTERNS = exports.JsonlParser = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports.derivePendingUserRequestV1 = exports.createProviderSessionAdapterV1 = exports.renderHandoffUrlTemplate = void 0;
8
+ exports.scoreSessionQuality = exports.calculateQualityTrend = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.readErrorHistory = exports.getTopFailingTools = exports.appendErrorHistory = exports.MAX_ERROR_HISTORY_SESSIONS = exports.ERROR_HISTORY_SCHEMA_VERSION = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.SessionMonitor = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.formatTokenCount = exports.formatDurationMs = exports.createJsonlTail = exports.toFollowEvents = exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.readSessionContextSnapshot = void 0;
9
+ exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.readClaudeProfileIdentity = exports.isClaudeProfileAuthenticated = exports.claudeKeychainService = exports.claudeKeychainSuffix = exports.getClaudeProfileHome = exports.getClaudeProfilesDir = exports.getActiveAccountStatus = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLogin = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.formatCompactionLedger = exports.calculateCompactionLedger = exports.calculateCodeImpact = void 0;
10
+ exports.selectStatuslineAccount = exports.formatStatusline = exports.estimateTimeToQuota = exports.BurnRateCalculator = exports.MultiProviderQuotaService = exports.resolveZaiQuota = exports.readZaiCredentials = exports.quotaStateFromZaiQuotaLimitPayload = exports.fetchZaiQuotaFromApi = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = exports.quotaFromCodexRateLimits = exports.fetchCodexQuotaFromApi = exports.fetchCodexResetCreditsFromApi = exports.getWorkspaceIdFromPath = exports.pruneQuotaHistory = exports.readQuotaHistoryDailyBuckets = exports.readQuotaHistoryRange = exports.appendQuotaHistorySample = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.FIVE_HOUR_WINDOW_MS = exports.AutoSwitchController = exports.decideAutoSwitch = exports.DEFAULT_AUTO_SWITCH_CONFIG = exports.removeLauncher = exports.writeLauncher = exports.isShellHookInstalled = exports.uninstallShellHook = exports.installShellHook = exports.setTerminalActiveProfile = exports.removeCodexAccount = exports.switchToCodexAccount = exports.finalizeCodexAccount = exports.prepareCodexAccount = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.resolveActiveCodexAccount = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = void 0;
11
+ exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.codexResetCreditsSnapshotSchema = exports.codexResetCreditSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = exports.ToolCallTracker = exports.extractToolCalls = exports.extractToolCall = exports.extractErrorMessage = exports.categorizeError = exports.gatherAssetsForCwd = exports.codexSessions = exports.readCodexAssets = exports.claudeSessions = exports.readClaudeAssets = exports.extractCommands = exports.extractFilePaths = exports.extractUrls = exports.extractTokenUsage = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = void 0;
12
+ exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.runDoctor = exports.getSessionDiagnostics = exports.formatHealthReport = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.listAllAccountsResultSchema = exports.savedAccountProfileSchema = exports.accountEntrySchema = exports.accountLoginStatusSchema = exports.beginAccountLoginResultSchema = exports.accountManagerResultSchema = exports.accountProviderIdSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = void 0;
13
+ var usageNormalization_1 = require("./usageNormalization");
14
+ Object.defineProperty(exports, "normalizeProviderUsage", { enumerable: true, get: function () { return usageNormalization_1.normalizeProviderUsage; } });
15
+ Object.defineProperty(exports, "extractNormalizedUsage", { enumerable: true, get: function () { return usageNormalization_1.extractNormalizedUsage; } });
16
+ Object.defineProperty(exports, "calculateNormalizedUsageCost", { enumerable: true, get: function () { return usageNormalization_1.calculateNormalizedUsageCost; } });
17
+ var tokenEstimation_1 = require("./tokenEstimation");
18
+ Object.defineProperty(exports, "estimateTextTokens", { enumerable: true, get: function () { return tokenEstimation_1.estimateTextTokens; } });
19
+ Object.defineProperty(exports, "estimateSerializedTokens", { enumerable: true, get: function () { return tokenEstimation_1.estimateSerializedTokens; } });
20
+ var transcript_1 = require("./transcript");
21
+ Object.defineProperty(exports, "projectSessionTranscript", { enumerable: true, get: function () { return transcript_1.projectSessionTranscript; } });
22
+ var sessionTranscripts_1 = require("./sessionTranscripts");
23
+ Object.defineProperty(exports, "listRecentSessions", { enumerable: true, get: function () { return sessionTranscripts_1.listRecentSessions; } });
24
+ Object.defineProperty(exports, "readSessionTranscript", { enumerable: true, get: function () { return sessionTranscripts_1.readSessionTranscript; } });
25
+ var observedSessionCollector_1 = require("./observedSessionCollector");
26
+ Object.defineProperty(exports, "ObservedSessionCollector", { enumerable: true, get: function () { return observedSessionCollector_1.ObservedSessionCollector; } });
27
+ Object.defineProperty(exports, "observedSessionSourceFromProvider", { enumerable: true, get: function () { return observedSessionCollector_1.observedSessionSourceFromProvider; } });
28
+ Object.defineProperty(exports, "fileFingerprint", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprint; } });
13
29
  var codex_1 = require("./types/codex");
14
30
  Object.defineProperty(exports, "isAggregateCodexLimit", { enumerable: true, get: function () { return codex_1.isAggregateCodexLimit; } });
15
31
  var taskPersistence_1 = require("./types/taskPersistence");