sidekick-shared 0.23.0 → 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 (90) hide show
  1. package/README.md +139 -57
  2. package/dist/accountManager.js +10 -0
  3. package/dist/aggregation/EventAggregator.d.ts +8 -1
  4. package/dist/aggregation/EventAggregator.js +82 -136
  5. package/dist/aggregation/snapshot.d.ts +1 -1
  6. package/dist/aggregation/snapshot.js +2 -1
  7. package/dist/aggregation/types.d.ts +5 -0
  8. package/dist/autoSwitch.d.ts +1 -1
  9. package/dist/autoSwitch.js +14 -3
  10. package/dist/browser.d.ts +6 -0
  11. package/dist/browser.js +10 -1
  12. package/dist/codexQuota.d.ts +2 -0
  13. package/dist/codexQuota.js +27 -0
  14. package/dist/codexQuotaWatcher.d.ts +7 -0
  15. package/dist/codexQuotaWatcher.js +37 -19
  16. package/dist/context/sessionContext.js +43 -15
  17. package/dist/credentialIO.js +19 -5
  18. package/dist/errorHistory.d.ts +1 -0
  19. package/dist/errorHistory.js +3 -2
  20. package/dist/extractors/tokenUsage.js +1 -1
  21. package/dist/extractors/toolCall.js +2 -2
  22. package/dist/index.d.ts +14 -4
  23. package/dist/index.js +25 -7
  24. package/dist/modelInfo.d.ts +17 -7
  25. package/dist/modelInfo.js +11 -2
  26. package/dist/multiProviderQuotaService.js +13 -2
  27. package/dist/node.d.ts +4 -0
  28. package/dist/node.js +8 -1
  29. package/dist/observedSessionCollector.d.ts +68 -0
  30. package/dist/observedSessionCollector.js +178 -0
  31. package/dist/parsers/codexParser.js +24 -6
  32. package/dist/parsers/openCodeParser.js +22 -1
  33. package/dist/parsers/sessionActivityDetector.js +2 -0
  34. package/dist/parsers/sessionPathResolver.js +19 -16
  35. package/dist/parsers/subagentScanner.d.ts +1 -1
  36. package/dist/parsers/subagentScanner.js +4 -5
  37. package/dist/parsers/subagentTraceParser.js +15 -12
  38. package/dist/providerStatus.js +13 -2
  39. package/dist/providers/claudeCode.js +63 -5
  40. package/dist/providers/codex.js +56 -17
  41. package/dist/providers/detect.js +32 -3
  42. package/dist/providers/openCodeDatabase.js +12 -3
  43. package/dist/quota.js +8 -0
  44. package/dist/quotaPoller.js +17 -6
  45. package/dist/quotaSnapshots.js +80 -26
  46. package/dist/readers/decisions.js +3 -1
  47. package/dist/readers/handoff.js +1 -1
  48. package/dist/readers/notes.js +9 -4
  49. package/dist/readers/plans.js +2 -4
  50. package/dist/readers/tasks.js +3 -1
  51. package/dist/report/htmlHelpers.js +6 -1
  52. package/dist/report/openBrowser.js +3 -3
  53. package/dist/report/transcriptParser.d.ts +3 -11
  54. package/dist/report/transcriptParser.js +69 -154
  55. package/dist/schemas/index.d.ts +7 -1
  56. package/dist/schemas/index.js +18 -2
  57. package/dist/schemas/observedSessionV1.d.ts +32 -1
  58. package/dist/schemas/observedSessionV1.js +11 -1
  59. package/dist/schemas/sessionEvent.d.ts +353 -12
  60. package/dist/schemas/sessionEvent.js +76 -14
  61. package/dist/schemas/tokenEstimation.d.ts +14 -0
  62. package/dist/schemas/tokenEstimation.js +10 -0
  63. package/dist/schemas/transcript.d.ts +24 -0
  64. package/dist/schemas/transcript.js +81 -0
  65. package/dist/schemas/usageNormalization.d.ts +55 -0
  66. package/dist/schemas/usageNormalization.js +41 -0
  67. package/dist/sessionTranscripts.d.ts +16 -0
  68. package/dist/sessionTranscripts.js +47 -0
  69. package/dist/statusline/formatter.js +8 -1
  70. package/dist/terminalSync.js +16 -7
  71. package/dist/tokenEstimation.d.ts +24 -0
  72. package/dist/tokenEstimation.js +62 -0
  73. package/dist/transcript.d.ts +92 -0
  74. package/dist/transcript.js +240 -0
  75. package/dist/types/historicalData.d.ts +14 -0
  76. package/dist/types/historicalData.js +22 -0
  77. package/dist/types/observedSessionV1.d.ts +3 -1
  78. package/dist/types/observedSessionV1.js +20 -6
  79. package/dist/types/sessionEvent.d.ts +66 -7
  80. package/dist/usageNormalization.d.ts +69 -0
  81. package/dist/usageNormalization.js +100 -0
  82. package/dist/watchers/factory.js +14 -3
  83. package/dist/watchers/jsonlTail.js +34 -14
  84. package/dist/watchers/jsonlWatcher.js +5 -3
  85. package/dist/watchers/providerReaderWatcher.js +4 -2
  86. package/dist/watchers/sqliteWatcher.d.ts +2 -0
  87. package/dist/watchers/sqliteWatcher.js +27 -14
  88. package/dist/writers/atomic.js +100 -13
  89. package/dist/zaiQuotaWatcher.js +6 -0
  90. package/package.json +1 -1
@@ -15,6 +15,9 @@ export interface CodexQuotaWatcherOptions {
15
15
  discoveryPollIntervalMs?: number;
16
16
  maxTailBytes?: number;
17
17
  maxSessionFiles?: number;
18
+ /** Minimum interval between expensive rollout-tail fallback scans. */
19
+ localScanCacheMs?: number;
20
+ now?: () => number;
18
21
  providerFactory?: () => CodexProvider;
19
22
  getActiveAccount?: CodexAccountReader;
20
23
  readSnapshot?: SnapshotReader;
@@ -39,6 +42,8 @@ export declare class CodexQuotaWatcher implements Disposable {
39
42
  private readonly watchFile;
40
43
  private readonly maxTailBytes;
41
44
  private readonly maxSessionFiles;
45
+ private readonly localScanCacheMs;
46
+ private readonly now;
42
47
  private readonly workspaceId;
43
48
  private readonly appendHistorySample;
44
49
  private readonly listeners;
@@ -48,6 +53,8 @@ export declare class CodexQuotaWatcher implements Disposable {
48
53
  private fileWatcher;
49
54
  private sessionPath;
50
55
  private lastEmissionKey;
56
+ private lastLocalScanAt;
57
+ private lastLocalScanState;
51
58
  private running;
52
59
  constructor(workspacePath: string, options?: CodexQuotaWatcherOptions);
53
60
  start(): void;
@@ -41,6 +41,7 @@ const quotaSnapshots_1 = require("./quotaSnapshots");
41
41
  const quotaHistory_1 = require("./quotaHistory");
42
42
  const codex_1 = require("./providers/codex");
43
43
  const DEFAULT_DISCOVERY_POLL_INTERVAL_MS = 30_000;
44
+ const DEFAULT_LOCAL_SCAN_CACHE_MS = 5 * 60_000;
44
45
  function accountEmail(account) {
45
46
  return account?.email ?? account?.metadata?.email;
46
47
  }
@@ -81,6 +82,8 @@ class CodexQuotaWatcher {
81
82
  watchFile;
82
83
  maxTailBytes;
83
84
  maxSessionFiles;
85
+ localScanCacheMs;
86
+ now;
84
87
  workspaceId;
85
88
  appendHistorySample;
86
89
  listeners = [];
@@ -90,6 +93,8 @@ class CodexQuotaWatcher {
90
93
  fileWatcher = null;
91
94
  sessionPath = null;
92
95
  lastEmissionKey = null;
96
+ lastLocalScanAt = Number.NEGATIVE_INFINITY;
97
+ lastLocalScanState = null;
93
98
  running = false;
94
99
  constructor(workspacePath, options = {}) {
95
100
  this.workspacePath = workspacePath;
@@ -110,6 +115,8 @@ class CodexQuotaWatcher {
110
115
  this.watchFile = options.watchFile ?? fs.watch;
111
116
  this.maxTailBytes = options.maxTailBytes;
112
117
  this.maxSessionFiles = options.maxSessionFiles;
118
+ this.localScanCacheMs = options.localScanCacheMs ?? DEFAULT_LOCAL_SCAN_CACHE_MS;
119
+ this.now = options.now ?? Date.now;
113
120
  this.workspaceId = options.workspaceId;
114
121
  this.appendHistorySample = options.appendHistorySample ?? quotaHistory_1.appendQuotaHistorySample;
115
122
  }
@@ -255,28 +262,39 @@ class CodexQuotaWatcher {
255
262
  }
256
263
  emitCachedOrUnavailable() {
257
264
  const account = this.getActiveAccount();
258
- let localProvider = null;
259
- try {
260
- localProvider = this.providerFactory();
261
- const local = (0, codexQuota_1.resolveCodexQuotaFromLocalSources)({
262
- workspacePath: this.workspacePath,
263
- activeAccount: account,
264
- readSnapshot: this.readSnapshot,
265
- writeSnapshot: this.writeSnapshot,
266
- provider: localProvider,
267
- maxTailBytes: this.maxTailBytes,
268
- maxSessionFiles: this.maxSessionFiles,
269
- });
270
- if (local) {
271
- this.emitState(local);
265
+ const scanNow = this.now();
266
+ if (scanNow - this.lastLocalScanAt < this.localScanCacheMs) {
267
+ if (this.lastLocalScanState) {
268
+ this.emitState(this.lastLocalScanState);
272
269
  return;
273
270
  }
274
271
  }
275
- catch {
276
- // Fall through to account-scoped cache or unavailable state.
277
- }
278
- finally {
279
- localProvider?.dispose();
272
+ else {
273
+ let localProvider = null;
274
+ this.lastLocalScanAt = scanNow;
275
+ this.lastLocalScanState = null;
276
+ try {
277
+ localProvider = this.providerFactory();
278
+ this.lastLocalScanState = (0, codexQuota_1.resolveCodexQuotaFromLocalSources)({
279
+ workspacePath: this.workspacePath,
280
+ activeAccount: account,
281
+ readSnapshot: this.readSnapshot,
282
+ writeSnapshot: this.writeSnapshot,
283
+ provider: localProvider,
284
+ maxTailBytes: this.maxTailBytes,
285
+ maxSessionFiles: this.maxSessionFiles,
286
+ });
287
+ if (this.lastLocalScanState) {
288
+ this.emitState(this.lastLocalScanState);
289
+ return;
290
+ }
291
+ }
292
+ catch {
293
+ // Fall through to account-scoped cache or unavailable state.
294
+ }
295
+ finally {
296
+ localProvider?.dispose();
297
+ }
280
298
  }
281
299
  const cached = account ? this.readSnapshot('codex', account.id) : null;
282
300
  if (cached) {
@@ -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;
@@ -57,6 +58,10 @@ function buildSessionContextSnapshot(events, options = {}) {
57
58
  if (event.rateLimits)
58
59
  lastRateLimits = event.rateLimits;
59
60
  }
61
+ return assembleSessionContextSnapshot(aggregator, sourceState, lastPermissionMode, lastRateLimits, options);
62
+ }
63
+ function assembleSessionContextSnapshot(aggregator, sourceState, lastPermissionMode, lastRateLimits, options) {
64
+ const providerId = options.providerId;
60
65
  const metrics = aggregator.getMetrics();
61
66
  const model = options.model ?? metrics.currentModel ?? metrics.modelStats[0]?.model;
62
67
  const contextWindow = options.contextWindow ??
@@ -100,24 +105,46 @@ function buildSessionContextSnapshot(events, options = {}) {
100
105
  };
101
106
  }
102
107
  function createSessionContextProjector(options = {}) {
103
- let events = [];
108
+ let aggregator = createProjectorAggregator(options);
109
+ let sourceState = createSourceExtractionState(options);
110
+ let lastPermissionMode;
111
+ let lastRateLimits;
112
+ const process = (event) => {
113
+ aggregator.processEvent(event);
114
+ extractSourcesFromEvent(event, sourceState);
115
+ if (event.permissionMode)
116
+ lastPermissionMode = event.permissionMode;
117
+ if (event.rateLimits)
118
+ lastRateLimits = event.rateLimits;
119
+ };
120
+ const snapshot = () => assembleSessionContextSnapshot(aggregator, sourceState, lastPermissionMode, lastRateLimits, options);
104
121
  return {
105
122
  processEvent(event) {
106
- events.push(event);
107
- return buildSessionContextSnapshot(events, options);
123
+ process(event);
124
+ return snapshot();
108
125
  },
109
126
  processEvents(newEvents) {
110
- events.push(...newEvents);
111
- return buildSessionContextSnapshot(events, options);
127
+ for (const event of newEvents)
128
+ process(event);
129
+ return snapshot();
112
130
  },
113
131
  getSnapshot() {
114
- return buildSessionContextSnapshot(events, options);
132
+ return snapshot();
115
133
  },
116
134
  reset() {
117
- events = [];
135
+ aggregator = createProjectorAggregator(options);
136
+ sourceState = createSourceExtractionState(options);
137
+ lastPermissionMode = undefined;
138
+ lastRateLimits = undefined;
118
139
  },
119
140
  };
120
141
  }
142
+ function createProjectorAggregator(options) {
143
+ return new EventAggregator_1.EventAggregator({
144
+ providerId: options.providerId,
145
+ computeContextSize: options.computeContextSize,
146
+ });
147
+ }
121
148
  function readSessionContextSnapshot(provider, sessionPath, options = {}) {
122
149
  const reader = provider.createReader(sessionPath);
123
150
  const events = reader.readAll();
@@ -177,22 +204,23 @@ function extractSourcesFromEvent(event, state) {
177
204
  layer: 'summary',
178
205
  sourceType: 'summary',
179
206
  title: 'Context summary',
180
- text: extractText(event.message.content) || 'Context compacted',
207
+ text: extractText(event.message?.content) || 'Context compacted',
181
208
  });
182
209
  break;
183
210
  }
184
211
  }
185
212
  function extractSystemSource(event, state) {
186
- const text = extractText(event.message.content);
187
- const label = event.message.sourceLabel ?? event.message.role ?? 'system';
188
- 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;
189
217
  if (text) {
190
218
  addSource(state, {
191
219
  event,
192
220
  layer: 'system',
193
221
  sourceType: 'system',
194
222
  title: label,
195
- sourceRef: event.message.id,
223
+ sourceRef: message?.id,
196
224
  text,
197
225
  });
198
226
  }
@@ -202,7 +230,7 @@ function extractSystemSource(event, state) {
202
230
  layer: 'runtime',
203
231
  sourceType: event.rateLimits ? 'rate_limit' : 'runtime',
204
232
  title: event.rateLimits ? 'Runtime usage and rate limits' : 'Runtime usage',
205
- sourceRef: event.message.id,
233
+ sourceRef: message?.id,
206
234
  text: describeUsage(usage, event.rateLimits),
207
235
  metadata: {
208
236
  usage,
@@ -394,7 +422,7 @@ function limitSources(sources, limit) {
394
422
  }
395
423
  function latestModel(events) {
396
424
  for (let i = events.length - 1; i >= 0; i--) {
397
- const model = events[i].message.model;
425
+ const model = events[i].message?.model;
398
426
  if (model)
399
427
  return model;
400
428
  }
@@ -519,7 +547,7 @@ function truncateWithInfo(text, maxChars) {
519
547
  return { text: `${text.slice(0, maxChars - 3)}...`, truncated: true };
520
548
  }
521
549
  function estimateTokens(text) {
522
- return Math.max(1, Math.ceil(text.length / 4));
550
+ return (0, tokenEstimation_1.estimateTextTokens)(text).count;
523
551
  }
524
552
  function isRecord(value) {
525
553
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -52,6 +52,12 @@ const os = __importStar(require("os"));
52
52
  const child_process_1 = require("child_process");
53
53
  const claudeProfiles_1 = require("./claudeProfiles");
54
54
  exports.KEYCHAIN_SERVICE = 'Claude Code-credentials';
55
+ function quoteSecurityInteractiveArg(value) {
56
+ // `security -i` is not a POSIX shell: adjacent quoted segments do NOT
57
+ // concatenate (so the shell-style '\'' splice splits the token), and
58
+ // backslash escapes the next character even inside single quotes.
59
+ return `'${value.replace(/\\/g, '\\\\').replace(/'/g, `\\'`)}'`;
60
+ }
55
61
  function getCredentialsFilePath(configDir) {
56
62
  return path.join(configDir ?? path.join(os.homedir(), '.claude'), '.credentials.json');
57
63
  }
@@ -93,16 +99,24 @@ function writeActiveCredentials(credentials, configDir) {
93
99
  const json = JSON.stringify(credentials);
94
100
  JSON.parse(json); // validate round-trip
95
101
  if (process.platform === 'darwin') {
96
- (0, child_process_1.execFileSync)('security', [
102
+ const service = (0, claudeProfiles_1.claudeKeychainService)(configDir);
103
+ const account = process.env.USER || 'user';
104
+ const command = [
97
105
  'add-generic-password',
98
106
  '-U',
99
107
  '-s',
100
- (0, claudeProfiles_1.claudeKeychainService)(configDir),
108
+ quoteSecurityInteractiveArg(service),
101
109
  '-a',
102
- process.env.USER || 'user',
110
+ quoteSecurityInteractiveArg(account),
103
111
  '-w',
104
- json,
105
- ], { stdio: ['pipe', 'pipe', 'pipe'], timeout: 4000, killSignal: 'SIGKILL' });
112
+ quoteSecurityInteractiveArg(json),
113
+ ].join(' ');
114
+ (0, child_process_1.execFileSync)('security', ['-i'], {
115
+ input: command + '\n',
116
+ stdio: ['pipe', 'pipe', 'pipe'],
117
+ timeout: 4000,
118
+ killSignal: 'SIGKILL',
119
+ });
106
120
  return;
107
121
  }
108
122
  // Linux / WSL / Windows — file-based
@@ -1,5 +1,6 @@
1
1
  import type { ErrorRollup, ErrorRollupEntry } from './aggregation/types';
2
2
  export declare const ERROR_HISTORY_SCHEMA_VERSION: 1;
3
+ export declare const MAX_ERROR_HISTORY_SESSIONS = 500;
3
4
  export interface ErrorHistorySessionRecord {
4
5
  sessionId: string;
5
6
  providerId: string;
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ERROR_HISTORY_SCHEMA_VERSION = void 0;
36
+ exports.MAX_ERROR_HISTORY_SESSIONS = exports.ERROR_HISTORY_SCHEMA_VERSION = void 0;
37
37
  exports.appendErrorHistory = appendErrorHistory;
38
38
  exports.readErrorHistory = readErrorHistory;
39
39
  exports.getTopFailingTools = getTopFailingTools;
@@ -41,6 +41,7 @@ const fs = __importStar(require("fs"));
41
41
  const paths_1 = require("./paths");
42
42
  const atomic_1 = require("./writers/atomic");
43
43
  exports.ERROR_HISTORY_SCHEMA_VERSION = 1;
44
+ exports.MAX_ERROR_HISTORY_SESSIONS = 500;
44
45
  function emptyStore() {
45
46
  return {
46
47
  schemaVersion: exports.ERROR_HISTORY_SCHEMA_VERSION,
@@ -59,7 +60,7 @@ async function appendErrorHistory(identity, rollup, filePath = (0, paths_1.getGl
59
60
  await (0, atomic_1.updateJsonStoreAtomic)(filePath, emptyStore, (store) => ({
60
61
  ...store,
61
62
  schemaVersion: exports.ERROR_HISTORY_SCHEMA_VERSION,
62
- sessions: [...store.sessions, record],
63
+ sessions: [...(Array.isArray(store.sessions) ? store.sessions : []), record].slice(-exports.MAX_ERROR_HISTORY_SESSIONS),
63
64
  lastSaved: record.endedAt,
64
65
  }));
65
66
  return record;
@@ -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,
@@ -85,7 +85,7 @@ class ToolCallTracker {
85
85
  }
86
86
  const topLevel = extractToolCall(event);
87
87
  if (topLevel) {
88
- const id = event.message.id;
88
+ const id = event.message?.id;
89
89
  if (id) {
90
90
  topLevel.toolUseId = id;
91
91
  this.pending.set(id, topLevel);
@@ -94,7 +94,7 @@ class ToolCallTracker {
94
94
  completed.push(topLevel);
95
95
  }
96
96
  }
97
- const content = event.message.content;
97
+ const content = event.message?.content;
98
98
  if (!Array.isArray(content))
99
99
  return completed;
100
100
  for (const block of content) {
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';
@@ -11,8 +21,8 @@ export type { DecisionEntry, DecisionLogStore, DecisionSource } from './types/de
11
21
  export { DECISION_LOG_SCHEMA_VERSION } from './types/decisionLog';
12
22
  export type { KnowledgeNote, KnowledgeNoteStore, KnowledgeNoteType, KnowledgeNoteSource, KnowledgeNoteStatus, KnowledgeNoteImportance, } from './types/knowledgeNote';
13
23
  export { KNOWLEDGE_NOTE_SCHEMA_VERSION, IMPORTANCE_DECAY_FACTORS, STALENESS_THRESHOLDS, } from './types/knowledgeNote';
14
- export type { HistoricalDataStore, DailyData, MonthlyData, AllTimeStats, TokenTotals, ModelUsageRecord, ToolUsageRecord, SessionSummary, SessionHistoryRecord, } from './types/historicalData';
15
- export { HISTORICAL_DATA_SCHEMA_VERSION, HISTORICAL_SESSION_RETENTION_LIMIT, createEmptyTokenTotals, } from './types/historicalData';
24
+ export type { HistoricalDataStore, DailyData, HourlyData, MonthlyData, AllTimeStats, TokenTotals, ModelUsageRecord, ToolUsageRecord, SessionSummary, SessionHistoryRecord, } from './types/historicalData';
25
+ export { HISTORICAL_DATA_SCHEMA_VERSION, HISTORICAL_SESSION_RETENTION_LIMIT, createEmptyTokenTotals, createEmptyDataStore, } from './types/historicalData';
16
26
  export type { PersistedPlan, PersistedPlanStep, PlanHistoryStore, PlanStepStatus, PlanStatus, PlanSource, PlanStepComplexity, } from './types/plan';
17
27
  export { PLAN_SCHEMA_VERSION, MAX_PLANS_PER_PROJECT } from './types/plan';
18
28
  export { getConfigDir, getProjectDataPath, getGlobalDataPath, encodeWorkspacePath, getProjectSlug, getProjectSlugRaw, resolveProjectIdentity, } from './paths';
@@ -93,7 +103,7 @@ export type { SerializedAggregatorState } from './aggregation/EventAggregator';
93
103
  export { saveSnapshot, loadSnapshot, deleteSnapshot, isSnapshotValid, getSnapshotPath, } from './aggregation/snapshot';
94
104
  export type { SessionSnapshot } from './aggregation/snapshot';
95
105
  export type { EventAggregatorOptions, AggregatedTokens, ModelUsageStats, BurnRateInfo, SubagentLifecycle, AggregatedMetrics, FrequencyMetric, PatternMetric, HeatmapBucketMetric, ErrorRollup, ErrorRollupEntry, ErrorBucketMetric, } from './aggregation/types';
96
- export { ERROR_HISTORY_SCHEMA_VERSION, appendErrorHistory, getTopFailingTools, readErrorHistory, } from './errorHistory';
106
+ export { ERROR_HISTORY_SCHEMA_VERSION, MAX_ERROR_HISTORY_SESSIONS, appendErrorHistory, getTopFailingTools, readErrorHistory, } from './errorHistory';
97
107
  export type { ErrorHistorySessionRecord, ErrorHistoryStore, TopFailingTool } from './errorHistory';
98
108
  export { FrequencyTracker } from './aggregation/FrequencyTracker';
99
109
  export type { FrequencyEntry, SerializedFrequencyState } from './aggregation/FrequencyTracker';
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.normalizeToolName = 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.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.toFollowEvents = 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 = void 0;
8
- 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 = exports.scoreSessionQuality = exports.calculateQualityTrend = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.readErrorHistory = exports.getTopFailingTools = exports.appendErrorHistory = 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 = void 0;
9
- 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 = 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 = void 0;
10
- 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 = 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 = void 0;
11
- 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 = 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 = 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 = 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");
@@ -25,6 +41,7 @@ var historicalData_1 = require("./types/historicalData");
25
41
  Object.defineProperty(exports, "HISTORICAL_DATA_SCHEMA_VERSION", { enumerable: true, get: function () { return historicalData_1.HISTORICAL_DATA_SCHEMA_VERSION; } });
26
42
  Object.defineProperty(exports, "HISTORICAL_SESSION_RETENTION_LIMIT", { enumerable: true, get: function () { return historicalData_1.HISTORICAL_SESSION_RETENTION_LIMIT; } });
27
43
  Object.defineProperty(exports, "createEmptyTokenTotals", { enumerable: true, get: function () { return historicalData_1.createEmptyTokenTotals; } });
44
+ Object.defineProperty(exports, "createEmptyDataStore", { enumerable: true, get: function () { return historicalData_1.createEmptyDataStore; } });
28
45
  var plan_1 = require("./types/plan");
29
46
  Object.defineProperty(exports, "PLAN_SCHEMA_VERSION", { enumerable: true, get: function () { return plan_1.PLAN_SCHEMA_VERSION; } });
30
47
  Object.defineProperty(exports, "MAX_PLANS_PER_PROJECT", { enumerable: true, get: function () { return plan_1.MAX_PLANS_PER_PROJECT; } });
@@ -213,6 +230,7 @@ Object.defineProperty(exports, "isSnapshotValid", { enumerable: true, get: funct
213
230
  Object.defineProperty(exports, "getSnapshotPath", { enumerable: true, get: function () { return snapshot_1.getSnapshotPath; } });
214
231
  var errorHistory_1 = require("./errorHistory");
215
232
  Object.defineProperty(exports, "ERROR_HISTORY_SCHEMA_VERSION", { enumerable: true, get: function () { return errorHistory_1.ERROR_HISTORY_SCHEMA_VERSION; } });
233
+ Object.defineProperty(exports, "MAX_ERROR_HISTORY_SESSIONS", { enumerable: true, get: function () { return errorHistory_1.MAX_ERROR_HISTORY_SESSIONS; } });
216
234
  Object.defineProperty(exports, "appendErrorHistory", { enumerable: true, get: function () { return errorHistory_1.appendErrorHistory; } });
217
235
  Object.defineProperty(exports, "getTopFailingTools", { enumerable: true, get: function () { return errorHistory_1.getTopFailingTools; } });
218
236
  Object.defineProperty(exports, "readErrorHistory", { enumerable: true, get: function () { return errorHistory_1.readErrorHistory; } });
@@ -24,16 +24,20 @@ export interface ModelPricing {
24
24
  cacheWriteCostPerMillion: number;
25
25
  cacheReadCostPerMillion: number;
26
26
  }
27
- /** Token usage for cost calculation. */
27
+ /**
28
+ * Token usage for the legacy cost calculation contract.
29
+ * @deprecated Use NormalizedUsage and calculateNormalizedUsageCost. This shape
30
+ * cannot state whether reasoning is already included in output.
31
+ */
28
32
  export interface CostTokenUsage {
29
33
  inputTokens: number;
30
34
  outputTokens: number;
31
35
  cacheWriteTokens: number;
32
36
  cacheReadTokens: number;
33
37
  /**
34
- * OpenAI o-series / Codex "reasoning" tokens. Billed at the output rate by
35
- * OpenAI, so we multiply by `outputCostPerMillion` inside calculateCost.
36
- * Optional for backward compatibility with existing callers.
38
+ * Legacy disjoint reasoning category. The compatibility calculator always
39
+ * adds it at the output rate, even when a provider already included it in
40
+ * output. Use NormalizedUsage to state inclusion semantics.
37
41
  */
38
42
  reasoningTokens?: number;
39
43
  }
@@ -55,7 +59,10 @@ export interface ModelInfo {
55
59
  }
56
60
  /** Provenance for a displayed cost value. */
57
61
  export type CostSource = 'reported' | 'estimated' | 'unpriced';
58
- /** Input for cost calculation that preserves reported-vs-estimated provenance. */
62
+ /**
63
+ * Input for the legacy cost calculation contract.
64
+ * @deprecated Use NormalizedUsageCostInput.
65
+ */
59
66
  export interface CostProvenanceInput {
60
67
  usage: CostTokenUsage;
61
68
  modelId: string;
@@ -128,8 +135,9 @@ export declare function getModelInfo(modelId: string): ModelInfo;
128
135
  /**
129
136
  * Calculates cost from token usage and an explicit pricing object.
130
137
  *
131
- * Reasoning tokens (OpenAI o-series / Codex) are billed at the output rate,
132
- * matching OpenAI's billing behavior.
138
+ * Legacy behavior treats reasoning as disjoint and adds it at the output rate.
139
+ * @deprecated Use calculateNormalizedUsageCost. This legacy function always
140
+ * adds reasoning to output and cannot represent provider inclusion semantics.
133
141
  */
134
142
  export declare function calculateCostWithPricing(usage: CostTokenUsage, pricing: ModelPricing): number;
135
143
  /**
@@ -137,11 +145,13 @@ export declare function calculateCostWithPricing(usage: CostTokenUsage, pricing:
137
145
  *
138
146
  * Returns `null` for unknown models. Callers should render `—` in that case,
139
147
  * not $0 — so users don't confuse "missing pricing" with "free".
148
+ * @deprecated Use calculateNormalizedUsageCost.
140
149
  */
141
150
  export declare function calculateCost(usage: CostTokenUsage, modelId: string): number | null;
142
151
  /**
143
152
  * Calculates cost while preserving whether the value was provider-reported,
144
153
  * locally estimated from pricing, or unavailable because the model is unpriced.
154
+ * @deprecated Use calculateNormalizedUsageCost.
145
155
  */
146
156
  export declare function calculateCostWithProvenance(input: CostProvenanceInput): CostWithProvenance;
147
157
  /**
package/dist/modelInfo.js CHANGED
@@ -142,6 +142,12 @@ const PRICING_TABLE = {
142
142
  cacheWriteCostPerMillion: 6.25,
143
143
  cacheReadCostPerMillion: 0.5,
144
144
  },
145
+ 'claude-opus-4-5': {
146
+ inputCostPerMillion: 5.0,
147
+ outputCostPerMillion: 25.0,
148
+ cacheWriteCostPerMillion: 6.25,
149
+ cacheReadCostPerMillion: 0.5,
150
+ },
145
151
  'claude-opus-4.5': {
146
152
  inputCostPerMillion: 5.0,
147
153
  outputCostPerMillion: 25.0,
@@ -380,8 +386,9 @@ function getModelInfo(modelId) {
380
386
  /**
381
387
  * Calculates cost from token usage and an explicit pricing object.
382
388
  *
383
- * Reasoning tokens (OpenAI o-series / Codex) are billed at the output rate,
384
- * matching OpenAI's billing behavior.
389
+ * Legacy behavior treats reasoning as disjoint and adds it at the output rate.
390
+ * @deprecated Use calculateNormalizedUsageCost. This legacy function always
391
+ * adds reasoning to output and cannot represent provider inclusion semantics.
385
392
  */
386
393
  function calculateCostWithPricing(usage, pricing) {
387
394
  const reasoning = usage.reasoningTokens ?? 0;
@@ -396,6 +403,7 @@ function calculateCostWithPricing(usage, pricing) {
396
403
  *
397
404
  * Returns `null` for unknown models. Callers should render `—` in that case,
398
405
  * not $0 — so users don't confuse "missing pricing" with "free".
406
+ * @deprecated Use calculateNormalizedUsageCost.
399
407
  */
400
408
  function calculateCost(usage, modelId) {
401
409
  const pricing = getModelPricing(modelId);
@@ -406,6 +414,7 @@ function calculateCost(usage, modelId) {
406
414
  /**
407
415
  * Calculates cost while preserving whether the value was provider-reported,
408
416
  * locally estimated from pricing, or unavailable because the model is unpriced.
417
+ * @deprecated Use calculateNormalizedUsageCost.
409
418
  */
410
419
  function calculateCostWithProvenance(input) {
411
420
  if (typeof input.reportedCostUsd === 'number' && Number.isFinite(input.reportedCostUsd)) {