sidekick-shared 0.21.6 → 0.23.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 (86) hide show
  1. package/README.md +51 -43
  2. package/dist/accountRegistry.d.ts +2 -0
  3. package/dist/accountStatus.d.ts +1 -0
  4. package/dist/accountStatus.js +6 -0
  5. package/dist/accounts.js +2 -0
  6. package/dist/aggregation/EventAggregator.d.ts +32 -1
  7. package/dist/aggregation/EventAggregator.js +238 -25
  8. package/dist/aggregation/snapshot.js +1 -1
  9. package/dist/aggregation/types.d.ts +23 -1
  10. package/dist/analytics/codeImpact.d.ts +20 -0
  11. package/dist/analytics/codeImpact.js +21 -0
  12. package/dist/analytics/compactionLedger.d.ts +11 -0
  13. package/dist/analytics/compactionLedger.js +31 -0
  14. package/dist/analytics/qualityScore.d.ts +26 -0
  15. package/dist/analytics/qualityScore.js +115 -0
  16. package/dist/codexProfiles.js +2 -0
  17. package/dist/context/composer.d.ts +3 -2
  18. package/dist/context/composer.js +5 -5
  19. package/dist/doctor.d.ts +55 -0
  20. package/dist/doctor.js +244 -0
  21. package/dist/errorHistory.d.ts +32 -0
  22. package/dist/errorHistory.js +94 -0
  23. package/dist/extractors/errorTaxonomy.d.ts +6 -0
  24. package/dist/extractors/errorTaxonomy.js +47 -0
  25. package/dist/extractors/toolCall.d.ts +9 -0
  26. package/dist/extractors/toolCall.js +79 -0
  27. package/dist/handoffUrl.d.ts +7 -0
  28. package/dist/handoffUrl.js +26 -0
  29. package/dist/index.d.ts +32 -9
  30. package/dist/index.js +62 -24
  31. package/dist/parsers/codexParser.js +13 -0
  32. package/dist/parsers/openCodeParser.js +13 -0
  33. package/dist/parsers/planExtractor.js +17 -6
  34. package/dist/paths.d.ts +10 -0
  35. package/dist/paths.js +18 -5
  36. package/dist/projectMigration.d.ts +23 -0
  37. package/dist/projectMigration.js +95 -0
  38. package/dist/providers/codexDatabase.d.ts +1 -11
  39. package/dist/providers/openCodeDatabase.d.ts +1 -31
  40. package/dist/providers/openCodeDatabase.js +9 -8
  41. package/dist/providers/types.d.ts +1 -0
  42. package/dist/readers/decisions.d.ts +2 -1
  43. package/dist/readers/decisions.js +2 -4
  44. package/dist/readers/handoff.d.ts +2 -1
  45. package/dist/readers/handoff.js +13 -8
  46. package/dist/readers/helpers.d.ts +3 -0
  47. package/dist/readers/helpers.js +12 -0
  48. package/dist/readers/notes.d.ts +2 -1
  49. package/dist/readers/notes.js +2 -4
  50. package/dist/readers/plans.js +1 -1
  51. package/dist/readers/tasks.d.ts +2 -1
  52. package/dist/readers/tasks.js +2 -4
  53. package/dist/schemas/index.d.ts +2 -0
  54. package/dist/schemas/index.js +10 -1
  55. package/dist/schemas/observedSessionV1.d.ts +499 -0
  56. package/dist/schemas/observedSessionV1.js +69 -0
  57. package/dist/schemas/sessionEvent.d.ts +13 -0
  58. package/dist/schemas/sessionEvent.js +19 -0
  59. package/dist/search/sessionSearch.d.ts +2 -2
  60. package/dist/search/sessionSearch.js +2 -3
  61. package/dist/sessionMonitor.d.ts +29 -0
  62. package/dist/sessionMonitor.js +71 -0
  63. package/dist/statusline/BurnRateCalculator.d.ts +14 -0
  64. package/dist/statusline/BurnRateCalculator.js +45 -0
  65. package/dist/statusline/formatter.d.ts +16 -0
  66. package/dist/statusline/formatter.js +77 -0
  67. package/dist/statusline/index.d.ts +7 -0
  68. package/dist/statusline/index.js +13 -0
  69. package/dist/types/codex.d.ts +2 -0
  70. package/dist/types/historicalData.d.ts +35 -1
  71. package/dist/types/historicalData.js +6 -2
  72. package/dist/types/observedSessionV1.d.ts +70 -0
  73. package/dist/types/observedSessionV1.js +185 -0
  74. package/dist/types/opencode.d.ts +1 -0
  75. package/dist/types/sessionEvent.d.ts +18 -1
  76. package/dist/watchers/eventBridge.js +1 -0
  77. package/dist/watchers/types.d.ts +5 -0
  78. package/dist/writers/atomic.d.ts +4 -0
  79. package/dist/writers/atomic.js +113 -0
  80. package/dist/writers/decisions.d.ts +12 -0
  81. package/dist/writers/decisions.js +88 -0
  82. package/dist/writers/notes.d.ts +8 -0
  83. package/dist/writers/notes.js +82 -0
  84. package/dist/writers/tasks.d.ts +6 -0
  85. package/dist/writers/tasks.js +100 -0
  86. package/package.json +5 -1
@@ -8,8 +8,16 @@
8
8
  * @module extractors/toolCall
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ToolCallTracker = void 0;
11
12
  exports.extractToolCalls = extractToolCalls;
12
13
  exports.extractToolCall = extractToolCall;
14
+ const errorTaxonomy_1 = require("./errorTaxonomy");
15
+ function outputString(value) {
16
+ if (value == null)
17
+ return undefined;
18
+ const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
19
+ return text.length > 5000 ? `${text.slice(0, 5000)}\n...(truncated)` : text;
20
+ }
13
21
  /**
14
22
  * Extracts ToolCall objects from a SessionEvent.
15
23
  *
@@ -40,17 +48,88 @@ function extractToolCalls(event) {
40
48
  if (block && typeof block === 'object' && 'type' in block && block.type === 'tool_use') {
41
49
  const toolBlock = block;
42
50
  if (toolBlock.name) {
51
+ const isError = toolBlock.is_error === true || toolBlock.error != null;
52
+ const errorOutput = toolBlock.error ?? toolBlock.output;
43
53
  calls.push({
44
54
  name: toolBlock.name,
45
55
  input: toolBlock.input ?? {},
46
56
  timestamp,
47
57
  toolUseId: toolBlock.id,
58
+ ...(isError
59
+ ? {
60
+ isError: true,
61
+ output: outputString(errorOutput),
62
+ errorMessage: (0, errorTaxonomy_1.extractErrorMessage)(errorOutput, toolBlock.name),
63
+ errorCategory: (0, errorTaxonomy_1.categorizeError)(errorOutput),
64
+ }
65
+ : {}),
48
66
  });
49
67
  }
50
68
  }
51
69
  }
52
70
  return calls;
53
71
  }
72
+ /**
73
+ * Stateful shared extractor that correlates provider-normalized tool uses with
74
+ * their later results. Completed calls always carry the canonical taxonomy.
75
+ */
76
+ class ToolCallTracker {
77
+ pending = new Map();
78
+ process(event) {
79
+ const completed = [];
80
+ for (const call of extractToolCalls(event)) {
81
+ if (call.toolUseId)
82
+ this.pending.set(call.toolUseId, call);
83
+ else
84
+ completed.push(call);
85
+ }
86
+ const topLevel = extractToolCall(event);
87
+ if (topLevel) {
88
+ const id = event.message.id;
89
+ if (id) {
90
+ topLevel.toolUseId = id;
91
+ this.pending.set(id, topLevel);
92
+ }
93
+ else {
94
+ completed.push(topLevel);
95
+ }
96
+ }
97
+ const content = event.message.content;
98
+ if (!Array.isArray(content))
99
+ return completed;
100
+ for (const block of content) {
101
+ if (!block ||
102
+ typeof block !== 'object' ||
103
+ !('type' in block) ||
104
+ block.type !== 'tool_result') {
105
+ continue;
106
+ }
107
+ const result = block;
108
+ if (!result.tool_use_id)
109
+ continue;
110
+ const call = this.pending.get(result.tool_use_id);
111
+ if (!call)
112
+ continue;
113
+ this.pending.delete(result.tool_use_id);
114
+ call.duration =
115
+ typeof result.duration === 'number'
116
+ ? result.duration
117
+ : Math.max(0, new Date(event.timestamp).getTime() - call.timestamp.getTime());
118
+ call.isError = result.is_error === true;
119
+ call.output = outputString(result.content);
120
+ if (call.isError) {
121
+ call.errorMessage = (0, errorTaxonomy_1.extractErrorMessage)(result.content, call.name);
122
+ call.errorCategory = (0, errorTaxonomy_1.categorizeError)(result.content);
123
+ }
124
+ completed.push(call);
125
+ }
126
+ return completed;
127
+ }
128
+ reset() {
129
+ this.pending.clear();
130
+ }
131
+ }
132
+ exports.ToolCallTracker = ToolCallTracker;
54
133
  /**
55
134
  * Extracts a single top-level `tool_use` event.
56
135
  *
@@ -0,0 +1,7 @@
1
+ export interface HandoffUrlIdentifiers {
2
+ sessionId: string;
3
+ provider: string;
4
+ projectPath: string;
5
+ }
6
+ /** Renders an external handoff URL using identifiers only. */
7
+ export declare function renderHandoffUrlTemplate(template: string, identifiers: HandoffUrlIdentifiers): string;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderHandoffUrlTemplate = renderHandoffUrlTemplate;
4
+ const ALLOWED_PLACEHOLDERS = new Set(['sessionId', 'provider', 'projectPath']);
5
+ /** Renders an external handoff URL using identifiers only. */
6
+ function renderHandoffUrlTemplate(template, identifiers) {
7
+ if (!template.trim())
8
+ throw new Error('No handoff URL template is configured.');
9
+ const rendered = template.replace(/\{([^}]+)\}/g, (_match, name) => {
10
+ if (!ALLOWED_PLACEHOLDERS.has(name)) {
11
+ throw new Error(`Unsupported handoff URL placeholder: {${name}}`);
12
+ }
13
+ return encodeURIComponent(identifiers[name]);
14
+ });
15
+ let url;
16
+ try {
17
+ url = new URL(rendered);
18
+ }
19
+ catch {
20
+ throw new Error('The rendered handoff URL is invalid.');
21
+ }
22
+ if (['javascript:', 'data:', 'file:'].includes(url.protocol)) {
23
+ throw new Error(`Unsafe handoff URL protocol: ${url.protocol}`);
24
+ }
25
+ return url.toString();
26
+ }
package/dist/index.d.ts CHANGED
@@ -11,11 +11,13 @@ export type { DecisionEntry, DecisionLogStore, DecisionSource } from './types/de
11
11
  export { DECISION_LOG_SCHEMA_VERSION } from './types/decisionLog';
12
12
  export type { KnowledgeNote, KnowledgeNoteStore, KnowledgeNoteType, KnowledgeNoteSource, KnowledgeNoteStatus, KnowledgeNoteImportance, } from './types/knowledgeNote';
13
13
  export { KNOWLEDGE_NOTE_SCHEMA_VERSION, IMPORTANCE_DECAY_FACTORS, STALENESS_THRESHOLDS, } from './types/knowledgeNote';
14
- export type { HistoricalDataStore, DailyData, MonthlyData, AllTimeStats, TokenTotals, ModelUsageRecord, ToolUsageRecord, SessionSummary, } from './types/historicalData';
15
- export { HISTORICAL_DATA_SCHEMA_VERSION, createEmptyTokenTotals } from './types/historicalData';
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';
16
16
  export type { PersistedPlan, PersistedPlanStep, PlanHistoryStore, PlanStepStatus, PlanStatus, PlanSource, PlanStepComplexity, } from './types/plan';
17
17
  export { PLAN_SCHEMA_VERSION, MAX_PLANS_PER_PROJECT } from './types/plan';
18
- export { getConfigDir, getProjectDataPath, getGlobalDataPath, encodeWorkspacePath, getProjectSlug, getProjectSlugRaw, } from './paths';
18
+ export { getConfigDir, getProjectDataPath, getGlobalDataPath, encodeWorkspacePath, getProjectSlug, getProjectSlugRaw, resolveProjectIdentity, } from './paths';
19
+ export type { ProjectIdentity } from './paths';
20
+ export { migrateLegacyProjectStores } from './projectMigration';
19
21
  export { readTasks } from './readers/tasks';
20
22
  export type { ReadTasksOptions } from './readers/tasks';
21
23
  export { readDecisions } from './readers/decisions';
@@ -26,7 +28,15 @@ export { readHistory } from './readers/history';
26
28
  export { readLatestHandoff } from './readers/handoff';
27
29
  export { readPlans, getLatestPlan, writePlans, getPlanAnalytics, readClaudeCodePlanFiles, } from './readers/plans';
28
30
  export type { ReadPlansOptions, PlanAnalytics } from './readers/plans';
31
+ export { atomicWriteJson, atomicWriteJsonSync, updateJsonStoreAtomic } from './writers/atomic';
32
+ export { addTask, completeTask } from './writers/tasks';
33
+ export { addDecision, decisionFingerprint } from './writers/decisions';
34
+ export { addNote } from './writers/notes';
35
+ export { renderHandoffUrlTemplate } from './handoffUrl';
36
+ export type { HandoffUrlIdentifiers } from './handoffUrl';
29
37
  export type { ProviderId, SessionProvider, SessionProviderBase, SessionFileStats, SessionFileInfo, SearchHit, ProjectFolderInfo, SessionReader, ProviderRuntimeStatus, } from './providers/types';
38
+ export { createProviderSessionAdapterV1, derivePendingUserRequestV1, } from './types/observedSessionV1';
39
+ export type { ObservationProvenanceV1, ObservedAgentSessionV1, ObservedValueV1, PendingUserRequestV1, ProviderCapabilitiesV1, ProviderSessionAdapterV1, SessionEvidenceRefV1, } from './types/observedSessionV1';
30
40
  export { detectProvider, getAllDetectedProviders } from './providers/detect';
31
41
  export { ClaudeCodeProvider } from './providers/claudeCode';
32
42
  export { OpenCodeProvider, getOpenCodeDataDir } from './providers/openCode';
@@ -77,16 +87,26 @@ export type { HighlightFormat } from './formatters/eventHighlighter';
77
87
  export { ALL_PHRASES, PHRASE_CATEGORIES, getRandomPhrase } from './phrases';
78
88
  export type { PhraseCategory } from './phrases';
79
89
  export { EventAggregator, parseTodoDependencies } from './aggregation/EventAggregator';
90
+ export { SessionMonitor } from './sessionMonitor';
91
+ export type { SessionMonitorOptions } from './sessionMonitor';
80
92
  export type { SerializedAggregatorState } from './aggregation/EventAggregator';
81
93
  export { saveSnapshot, loadSnapshot, deleteSnapshot, isSnapshotValid, getSnapshotPath, } from './aggregation/snapshot';
82
94
  export type { SessionSnapshot } from './aggregation/snapshot';
83
- export type { EventAggregatorOptions, AggregatedTokens, ModelUsageStats, BurnRateInfo, SubagentLifecycle, AggregatedMetrics, FrequencyMetric, PatternMetric, HeatmapBucketMetric, } from './aggregation/types';
95
+ 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';
97
+ export type { ErrorHistorySessionRecord, ErrorHistoryStore, TopFailingTool } from './errorHistory';
84
98
  export { FrequencyTracker } from './aggregation/FrequencyTracker';
85
99
  export type { FrequencyEntry, SerializedFrequencyState } from './aggregation/FrequencyTracker';
86
100
  export { HeatmapTracker } from './aggregation/HeatmapTracker';
87
101
  export type { HeatmapBucket, SerializedHeatmapState } from './aggregation/HeatmapTracker';
88
102
  export { PatternExtractor } from './aggregation/PatternExtractor';
89
103
  export type { PatternCluster, SerializedPatternState } from './aggregation/PatternExtractor';
104
+ export { calculateQualityTrend, scoreSessionQuality } from './analytics/qualityScore';
105
+ export type { QualityFactorContribution, QualityFactorId, SessionQualityScore, QualityTrend, } from './analytics/qualityScore';
106
+ export { calculateCodeImpact } from './analytics/codeImpact';
107
+ export type { CodeImpact, ModelCostInput } from './analytics/codeImpact';
108
+ export { calculateCompactionLedger, formatCompactionLedger } from './analytics/compactionLedger';
109
+ export type { CompactionLedger } from './analytics/compactionLedger';
90
110
  export { generateHtmlReport, parseTranscript, parseTranscriptFromEvents, openInBrowser, } from './report';
91
111
  export type { TranscriptContentBlock, TranscriptEntry, HtmlReportOptions } from './report';
92
112
  export { readActiveCredentials, writeActiveCredentials } from './credentialIO';
@@ -122,28 +142,29 @@ export { fetchCodexResetCreditsFromApi, fetchCodexQuotaFromApi, quotaFromCodexRa
122
142
  export type { CodexQuotaApiOptions, CodexQuotaCreditsSnapshot, CodexQuotaResolveOptions, CodexQuotaResolveSource, } from './codexQuota';
123
143
  export { CodexQuotaWatcher } from './codexQuotaWatcher';
124
144
  export type { CodexQuotaWatcherOptions } from './codexQuotaWatcher';
125
- export { accumulateZaiUsage, extractNextFlushTime, inferZaiQuotaState, isZaiProviderId, makeUnavailableZaiQuotaState, parseZaiQuotaError, resolveZaiTier, rowsToZaiTurnsAndErrors, turnTokenWeight, ZAI_PROMPT_INVOCATIONS, ZAI_PROVIDER_IDS, ZAI_TIER_BUDGETS, } from './zaiQuota';
126
- export type { ZaiAccumulatedUsage, ZaiAssistantTurn, ZaiOpenCodeRow, ZaiProviderId, ZaiQuotaError, ZaiQuotaErrorKind, ZaiTier, InferZaiQuotaStateOptions, } from './zaiQuota';
127
- export { ZaiQuotaWatcher } from './zaiQuotaWatcher';
128
- export type { ZaiQuotaWatcherOptions } from './zaiQuotaWatcher';
129
145
  export { fetchZaiQuotaFromApi, quotaStateFromZaiQuotaLimitPayload, readZaiCredentials, resolveZaiQuota, } from './zaiQuotaApi';
130
146
  export type { ReadZaiCredentialsOptions, ZaiCredentialSource, ZaiCredentials, ZaiPlatform, ZaiQuotaApiOptions, ZaiQuotaResolveOptions, } from './zaiQuotaApi';
131
147
  export { MultiProviderQuotaService } from './multiProviderQuotaService';
132
148
  export type { MultiProviderQuotaServiceOptions } from './multiProviderQuotaService';
133
149
  export type { ProviderQuotaMap, ProviderQuotaState, RuntimeQuotaProvider } from './providerQuota';
134
150
  export type { QuotaSnapshotProviderId } from './quotaSnapshots';
151
+ export { BurnRateCalculator, estimateTimeToQuota } from './statusline/BurnRateCalculator';
152
+ export { formatStatusline, selectStatuslineAccount } from './statusline/formatter';
153
+ export type { StatuslineInput, StatuslineSelection } from './statusline/formatter';
135
154
  export { getModelContextWindowSize, DEFAULT_CONTEXT_WINDOW } from './modelContext';
136
155
  export { parseModelId, getModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, } from './modelInfo';
137
156
  export type { ModelPricing, CostTokenUsage, CostSource, CostProvenanceInput, CostWithProvenance, ModelInfo, ModelProvider, ParsedModelId, ModelDisplayInfo, } from './modelInfo';
138
157
  export { hydratePricingCatalog, normalizeLiteLlmCatalog, LITELLM_CATALOG_URL, } from './pricingCatalog';
139
158
  export type { HydrateOptions, HydrateResult } from './pricingCatalog';
140
159
  export { extractTokenUsage } from './extractors/tokenUsage';
141
- export { extractToolCall, extractToolCalls } from './extractors/toolCall';
142
160
  export { extractUrls, extractFilePaths, extractCommands } from './extractors/sessionAssets';
143
161
  export type { AssetAgent, ExtractedAsset, ExtractedAssetProvenance, ExtractedAssetType, ExtractedAssets, SourceAssets, } from './extractors/sessionAssets';
144
162
  export { readClaudeAssets, claudeSessions } from './extractors/sources/claudeAssets';
145
163
  export { readCodexAssets, codexSessions } from './extractors/sources/codexAssets';
146
164
  export { gatherAssetsForCwd } from './extractors/gatherAssets';
165
+ export { categorizeError, extractErrorMessage } from './extractors/errorTaxonomy';
166
+ export type { ErrorCategory } from './extractors/errorTaxonomy';
167
+ export { extractToolCall, extractToolCalls, ToolCallTracker } from './extractors/toolCall';
147
168
  export type { GatherAssetsOptions, GatherAssetsResult } from './extractors/gatherAssets';
148
169
  export { messageUsageSchema, sessionMessageSchema, sessionEventSchema, permissionModeSchema, extractSessionEvents, } from './schemas/sessionEvent';
149
170
  export { quotaWindowSchema, quotaStateSchema, quotaFailureKindSchema, quotaProviderIdSchema, quotaSourceSchema, codexResetCreditSchema, codexResetCreditsSnapshotSchema, peakHoursStateSchema, quotaFailureDescriptorSchema, runtimeQuotaProviderSchema, providerQuotaStateSchema, claudeProviderQuotaStateSchema, codexProviderQuotaStateSchema, zaiProviderQuotaStateSchema, providerQuotaMapSchema, } from './schemas/quota';
@@ -153,5 +174,7 @@ export { accountProviderIdSchema, accountManagerResultSchema, beginAccountLoginR
153
174
  export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnReasoningTimelineItemSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnTimelineItemSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './schemas/assistantTurn';
154
175
  export { fetchProviderStatus, fetchOpenAIStatus } from './providerStatus';
155
176
  export type { ProviderStatusState } from './providerStatus';
177
+ export { formatHealthReport, getSessionDiagnostics, runDoctor } from './doctor';
178
+ export type { DeprecatedSetting, DoctorOptions, HealthCheck, HealthCheckStatus, HealthReport, SessionDiagnostics, } from './doctor';
156
179
  export { createPeakHoursNotApplicableState, fetchPeakHoursStatus, isClaudeCodeSessionProvider, scopePeakHoursToSessionProvider, } from './peakHours';
157
180
  export type { PeakHoursState } from './peakHours';
package/dist/index.js CHANGED
@@ -3,12 +3,13 @@
3
3
  * Public API for sidekick-shared.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- 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.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = 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_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.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 = 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 = void 0;
8
- 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.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = void 0;
9
- 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 = 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 = void 0;
10
- exports.gatherAssetsForCwd = exports.codexSessions = exports.readCodexAssets = exports.claudeSessions = exports.readClaudeAssets = exports.extractCommands = exports.extractFilePaths = exports.extractUrls = exports.extractToolCalls = exports.extractToolCall = 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 = exports.MultiProviderQuotaService = exports.resolveZaiQuota = exports.readZaiCredentials = exports.quotaStateFromZaiQuotaLimitPayload = exports.fetchZaiQuotaFromApi = exports.ZaiQuotaWatcher = exports.ZAI_TIER_BUDGETS = exports.ZAI_PROVIDER_IDS = exports.ZAI_PROMPT_INVOCATIONS = exports.turnTokenWeight = exports.rowsToZaiTurnsAndErrors = exports.resolveZaiTier = exports.parseZaiQuotaError = exports.makeUnavailableZaiQuotaState = exports.isZaiProviderId = exports.inferZaiQuotaState = exports.extractNextFlushTime = exports.accumulateZaiUsage = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = void 0;
11
- exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = 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 = 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 = void 0;
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;
12
13
  var codex_1 = require("./types/codex");
13
14
  Object.defineProperty(exports, "isAggregateCodexLimit", { enumerable: true, get: function () { return codex_1.isAggregateCodexLimit; } });
14
15
  var taskPersistence_1 = require("./types/taskPersistence");
@@ -22,6 +23,7 @@ Object.defineProperty(exports, "IMPORTANCE_DECAY_FACTORS", { enumerable: true, g
22
23
  Object.defineProperty(exports, "STALENESS_THRESHOLDS", { enumerable: true, get: function () { return knowledgeNote_1.STALENESS_THRESHOLDS; } });
23
24
  var historicalData_1 = require("./types/historicalData");
24
25
  Object.defineProperty(exports, "HISTORICAL_DATA_SCHEMA_VERSION", { enumerable: true, get: function () { return historicalData_1.HISTORICAL_DATA_SCHEMA_VERSION; } });
26
+ Object.defineProperty(exports, "HISTORICAL_SESSION_RETENTION_LIMIT", { enumerable: true, get: function () { return historicalData_1.HISTORICAL_SESSION_RETENTION_LIMIT; } });
25
27
  Object.defineProperty(exports, "createEmptyTokenTotals", { enumerable: true, get: function () { return historicalData_1.createEmptyTokenTotals; } });
26
28
  var plan_1 = require("./types/plan");
27
29
  Object.defineProperty(exports, "PLAN_SCHEMA_VERSION", { enumerable: true, get: function () { return plan_1.PLAN_SCHEMA_VERSION; } });
@@ -34,6 +36,9 @@ Object.defineProperty(exports, "getGlobalDataPath", { enumerable: true, get: fun
34
36
  Object.defineProperty(exports, "encodeWorkspacePath", { enumerable: true, get: function () { return paths_1.encodeWorkspacePath; } });
35
37
  Object.defineProperty(exports, "getProjectSlug", { enumerable: true, get: function () { return paths_1.getProjectSlug; } });
36
38
  Object.defineProperty(exports, "getProjectSlugRaw", { enumerable: true, get: function () { return paths_1.getProjectSlugRaw; } });
39
+ Object.defineProperty(exports, "resolveProjectIdentity", { enumerable: true, get: function () { return paths_1.resolveProjectIdentity; } });
40
+ var projectMigration_1 = require("./projectMigration");
41
+ Object.defineProperty(exports, "migrateLegacyProjectStores", { enumerable: true, get: function () { return projectMigration_1.migrateLegacyProjectStores; } });
37
42
  // Readers
38
43
  var tasks_1 = require("./readers/tasks");
39
44
  Object.defineProperty(exports, "readTasks", { enumerable: true, get: function () { return tasks_1.readTasks; } });
@@ -51,6 +56,24 @@ Object.defineProperty(exports, "getLatestPlan", { enumerable: true, get: functio
51
56
  Object.defineProperty(exports, "writePlans", { enumerable: true, get: function () { return plans_1.writePlans; } });
52
57
  Object.defineProperty(exports, "getPlanAnalytics", { enumerable: true, get: function () { return plans_1.getPlanAnalytics; } });
53
58
  Object.defineProperty(exports, "readClaudeCodePlanFiles", { enumerable: true, get: function () { return plans_1.readClaudeCodePlanFiles; } });
59
+ // Atomic persistence writers
60
+ var atomic_1 = require("./writers/atomic");
61
+ Object.defineProperty(exports, "atomicWriteJson", { enumerable: true, get: function () { return atomic_1.atomicWriteJson; } });
62
+ Object.defineProperty(exports, "atomicWriteJsonSync", { enumerable: true, get: function () { return atomic_1.atomicWriteJsonSync; } });
63
+ Object.defineProperty(exports, "updateJsonStoreAtomic", { enumerable: true, get: function () { return atomic_1.updateJsonStoreAtomic; } });
64
+ var tasks_2 = require("./writers/tasks");
65
+ Object.defineProperty(exports, "addTask", { enumerable: true, get: function () { return tasks_2.addTask; } });
66
+ Object.defineProperty(exports, "completeTask", { enumerable: true, get: function () { return tasks_2.completeTask; } });
67
+ var decisions_2 = require("./writers/decisions");
68
+ Object.defineProperty(exports, "addDecision", { enumerable: true, get: function () { return decisions_2.addDecision; } });
69
+ Object.defineProperty(exports, "decisionFingerprint", { enumerable: true, get: function () { return decisions_2.decisionFingerprint; } });
70
+ var notes_2 = require("./writers/notes");
71
+ Object.defineProperty(exports, "addNote", { enumerable: true, get: function () { return notes_2.addNote; } });
72
+ var handoffUrl_1 = require("./handoffUrl");
73
+ Object.defineProperty(exports, "renderHandoffUrlTemplate", { enumerable: true, get: function () { return handoffUrl_1.renderHandoffUrlTemplate; } });
74
+ var observedSessionV1_1 = require("./types/observedSessionV1");
75
+ Object.defineProperty(exports, "createProviderSessionAdapterV1", { enumerable: true, get: function () { return observedSessionV1_1.createProviderSessionAdapterV1; } });
76
+ Object.defineProperty(exports, "derivePendingUserRequestV1", { enumerable: true, get: function () { return observedSessionV1_1.derivePendingUserRequestV1; } });
54
77
  var detect_1 = require("./providers/detect");
55
78
  Object.defineProperty(exports, "detectProvider", { enumerable: true, get: function () { return detect_1.detectProvider; } });
56
79
  Object.defineProperty(exports, "getAllDetectedProviders", { enumerable: true, get: function () { return detect_1.getAllDetectedProviders; } });
@@ -180,12 +203,19 @@ Object.defineProperty(exports, "getRandomPhrase", { enumerable: true, get: funct
180
203
  var EventAggregator_1 = require("./aggregation/EventAggregator");
181
204
  Object.defineProperty(exports, "EventAggregator", { enumerable: true, get: function () { return EventAggregator_1.EventAggregator; } });
182
205
  Object.defineProperty(exports, "parseTodoDependencies", { enumerable: true, get: function () { return EventAggregator_1.parseTodoDependencies; } });
206
+ var sessionMonitor_1 = require("./sessionMonitor");
207
+ Object.defineProperty(exports, "SessionMonitor", { enumerable: true, get: function () { return sessionMonitor_1.SessionMonitor; } });
183
208
  var snapshot_1 = require("./aggregation/snapshot");
184
209
  Object.defineProperty(exports, "saveSnapshot", { enumerable: true, get: function () { return snapshot_1.saveSnapshot; } });
185
210
  Object.defineProperty(exports, "loadSnapshot", { enumerable: true, get: function () { return snapshot_1.loadSnapshot; } });
186
211
  Object.defineProperty(exports, "deleteSnapshot", { enumerable: true, get: function () { return snapshot_1.deleteSnapshot; } });
187
212
  Object.defineProperty(exports, "isSnapshotValid", { enumerable: true, get: function () { return snapshot_1.isSnapshotValid; } });
188
213
  Object.defineProperty(exports, "getSnapshotPath", { enumerable: true, get: function () { return snapshot_1.getSnapshotPath; } });
214
+ var errorHistory_1 = require("./errorHistory");
215
+ Object.defineProperty(exports, "ERROR_HISTORY_SCHEMA_VERSION", { enumerable: true, get: function () { return errorHistory_1.ERROR_HISTORY_SCHEMA_VERSION; } });
216
+ Object.defineProperty(exports, "appendErrorHistory", { enumerable: true, get: function () { return errorHistory_1.appendErrorHistory; } });
217
+ Object.defineProperty(exports, "getTopFailingTools", { enumerable: true, get: function () { return errorHistory_1.getTopFailingTools; } });
218
+ Object.defineProperty(exports, "readErrorHistory", { enumerable: true, get: function () { return errorHistory_1.readErrorHistory; } });
189
219
  // Aggregation — analytics engines
190
220
  var FrequencyTracker_1 = require("./aggregation/FrequencyTracker");
191
221
  Object.defineProperty(exports, "FrequencyTracker", { enumerable: true, get: function () { return FrequencyTracker_1.FrequencyTracker; } });
@@ -193,6 +223,14 @@ var HeatmapTracker_1 = require("./aggregation/HeatmapTracker");
193
223
  Object.defineProperty(exports, "HeatmapTracker", { enumerable: true, get: function () { return HeatmapTracker_1.HeatmapTracker; } });
194
224
  var PatternExtractor_1 = require("./aggregation/PatternExtractor");
195
225
  Object.defineProperty(exports, "PatternExtractor", { enumerable: true, get: function () { return PatternExtractor_1.PatternExtractor; } });
226
+ var qualityScore_1 = require("./analytics/qualityScore");
227
+ Object.defineProperty(exports, "calculateQualityTrend", { enumerable: true, get: function () { return qualityScore_1.calculateQualityTrend; } });
228
+ Object.defineProperty(exports, "scoreSessionQuality", { enumerable: true, get: function () { return qualityScore_1.scoreSessionQuality; } });
229
+ var codeImpact_1 = require("./analytics/codeImpact");
230
+ Object.defineProperty(exports, "calculateCodeImpact", { enumerable: true, get: function () { return codeImpact_1.calculateCodeImpact; } });
231
+ var compactionLedger_1 = require("./analytics/compactionLedger");
232
+ Object.defineProperty(exports, "calculateCompactionLedger", { enumerable: true, get: function () { return compactionLedger_1.calculateCompactionLedger; } });
233
+ Object.defineProperty(exports, "formatCompactionLedger", { enumerable: true, get: function () { return compactionLedger_1.formatCompactionLedger; } });
196
234
  // Report — HTML session report generation
197
235
  var report_1 = require("./report");
198
236
  Object.defineProperty(exports, "generateHtmlReport", { enumerable: true, get: function () { return report_1.generateHtmlReport; } });
@@ -305,21 +343,6 @@ Object.defineProperty(exports, "resolveCodexQuota", { enumerable: true, get: fun
305
343
  Object.defineProperty(exports, "resolveCodexQuotaFromLocalSources", { enumerable: true, get: function () { return codexQuota_1.resolveCodexQuotaFromLocalSources; } });
306
344
  var codexQuotaWatcher_1 = require("./codexQuotaWatcher");
307
345
  Object.defineProperty(exports, "CodexQuotaWatcher", { enumerable: true, get: function () { return codexQuotaWatcher_1.CodexQuotaWatcher; } });
308
- var zaiQuota_1 = require("./zaiQuota");
309
- Object.defineProperty(exports, "accumulateZaiUsage", { enumerable: true, get: function () { return zaiQuota_1.accumulateZaiUsage; } });
310
- Object.defineProperty(exports, "extractNextFlushTime", { enumerable: true, get: function () { return zaiQuota_1.extractNextFlushTime; } });
311
- Object.defineProperty(exports, "inferZaiQuotaState", { enumerable: true, get: function () { return zaiQuota_1.inferZaiQuotaState; } });
312
- Object.defineProperty(exports, "isZaiProviderId", { enumerable: true, get: function () { return zaiQuota_1.isZaiProviderId; } });
313
- Object.defineProperty(exports, "makeUnavailableZaiQuotaState", { enumerable: true, get: function () { return zaiQuota_1.makeUnavailableZaiQuotaState; } });
314
- Object.defineProperty(exports, "parseZaiQuotaError", { enumerable: true, get: function () { return zaiQuota_1.parseZaiQuotaError; } });
315
- Object.defineProperty(exports, "resolveZaiTier", { enumerable: true, get: function () { return zaiQuota_1.resolveZaiTier; } });
316
- Object.defineProperty(exports, "rowsToZaiTurnsAndErrors", { enumerable: true, get: function () { return zaiQuota_1.rowsToZaiTurnsAndErrors; } });
317
- Object.defineProperty(exports, "turnTokenWeight", { enumerable: true, get: function () { return zaiQuota_1.turnTokenWeight; } });
318
- Object.defineProperty(exports, "ZAI_PROMPT_INVOCATIONS", { enumerable: true, get: function () { return zaiQuota_1.ZAI_PROMPT_INVOCATIONS; } });
319
- Object.defineProperty(exports, "ZAI_PROVIDER_IDS", { enumerable: true, get: function () { return zaiQuota_1.ZAI_PROVIDER_IDS; } });
320
- Object.defineProperty(exports, "ZAI_TIER_BUDGETS", { enumerable: true, get: function () { return zaiQuota_1.ZAI_TIER_BUDGETS; } });
321
- var zaiQuotaWatcher_1 = require("./zaiQuotaWatcher");
322
- Object.defineProperty(exports, "ZaiQuotaWatcher", { enumerable: true, get: function () { return zaiQuotaWatcher_1.ZaiQuotaWatcher; } });
323
346
  var zaiQuotaApi_1 = require("./zaiQuotaApi");
324
347
  Object.defineProperty(exports, "fetchZaiQuotaFromApi", { enumerable: true, get: function () { return zaiQuotaApi_1.fetchZaiQuotaFromApi; } });
325
348
  Object.defineProperty(exports, "quotaStateFromZaiQuotaLimitPayload", { enumerable: true, get: function () { return zaiQuotaApi_1.quotaStateFromZaiQuotaLimitPayload; } });
@@ -327,6 +350,12 @@ Object.defineProperty(exports, "readZaiCredentials", { enumerable: true, get: fu
327
350
  Object.defineProperty(exports, "resolveZaiQuota", { enumerable: true, get: function () { return zaiQuotaApi_1.resolveZaiQuota; } });
328
351
  var multiProviderQuotaService_1 = require("./multiProviderQuotaService");
329
352
  Object.defineProperty(exports, "MultiProviderQuotaService", { enumerable: true, get: function () { return multiProviderQuotaService_1.MultiProviderQuotaService; } });
353
+ var BurnRateCalculator_1 = require("./statusline/BurnRateCalculator");
354
+ Object.defineProperty(exports, "BurnRateCalculator", { enumerable: true, get: function () { return BurnRateCalculator_1.BurnRateCalculator; } });
355
+ Object.defineProperty(exports, "estimateTimeToQuota", { enumerable: true, get: function () { return BurnRateCalculator_1.estimateTimeToQuota; } });
356
+ var formatter_1 = require("./statusline/formatter");
357
+ Object.defineProperty(exports, "formatStatusline", { enumerable: true, get: function () { return formatter_1.formatStatusline; } });
358
+ Object.defineProperty(exports, "selectStatuslineAccount", { enumerable: true, get: function () { return formatter_1.selectStatuslineAccount; } });
330
359
  // Model Context
331
360
  var modelContext_1 = require("./modelContext");
332
361
  Object.defineProperty(exports, "getModelContextWindowSize", { enumerable: true, get: function () { return modelContext_1.getModelContextWindowSize; } });
@@ -354,9 +383,6 @@ Object.defineProperty(exports, "LITELLM_CATALOG_URL", { enumerable: true, get: f
354
383
  // Extractors — per-event token usage and tool call extraction
355
384
  var tokenUsage_1 = require("./extractors/tokenUsage");
356
385
  Object.defineProperty(exports, "extractTokenUsage", { enumerable: true, get: function () { return tokenUsage_1.extractTokenUsage; } });
357
- var toolCall_1 = require("./extractors/toolCall");
358
- Object.defineProperty(exports, "extractToolCall", { enumerable: true, get: function () { return toolCall_1.extractToolCall; } });
359
- Object.defineProperty(exports, "extractToolCalls", { enumerable: true, get: function () { return toolCall_1.extractToolCalls; } });
360
386
  // Extractors — actionable session assets. Node-only: safe for CLI and
361
387
  // extension-host code, not for browser/webview bundles.
362
388
  var sessionAssets_1 = require("./extractors/sessionAssets");
@@ -371,6 +397,13 @@ Object.defineProperty(exports, "readCodexAssets", { enumerable: true, get: funct
371
397
  Object.defineProperty(exports, "codexSessions", { enumerable: true, get: function () { return codexAssets_1.codexSessions; } });
372
398
  var gatherAssets_1 = require("./extractors/gatherAssets");
373
399
  Object.defineProperty(exports, "gatherAssetsForCwd", { enumerable: true, get: function () { return gatherAssets_1.gatherAssetsForCwd; } });
400
+ var errorTaxonomy_1 = require("./extractors/errorTaxonomy");
401
+ Object.defineProperty(exports, "categorizeError", { enumerable: true, get: function () { return errorTaxonomy_1.categorizeError; } });
402
+ Object.defineProperty(exports, "extractErrorMessage", { enumerable: true, get: function () { return errorTaxonomy_1.extractErrorMessage; } });
403
+ var toolCall_1 = require("./extractors/toolCall");
404
+ Object.defineProperty(exports, "extractToolCall", { enumerable: true, get: function () { return toolCall_1.extractToolCall; } });
405
+ Object.defineProperty(exports, "extractToolCalls", { enumerable: true, get: function () { return toolCall_1.extractToolCalls; } });
406
+ Object.defineProperty(exports, "ToolCallTracker", { enumerable: true, get: function () { return toolCall_1.ToolCallTracker; } });
374
407
  // Schemas — Zod runtime validation for session events
375
408
  var sessionEvent_1 = require("./schemas/sessionEvent");
376
409
  Object.defineProperty(exports, "messageUsageSchema", { enumerable: true, get: function () { return sessionEvent_1.messageUsageSchema; } });
@@ -429,6 +462,11 @@ Object.defineProperty(exports, "assistantTurnToolRefSchema", { enumerable: true,
429
462
  var providerStatus_1 = require("./providerStatus");
430
463
  Object.defineProperty(exports, "fetchProviderStatus", { enumerable: true, get: function () { return providerStatus_1.fetchProviderStatus; } });
431
464
  Object.defineProperty(exports, "fetchOpenAIStatus", { enumerable: true, get: function () { return providerStatus_1.fetchOpenAIStatus; } });
465
+ // Shared diagnostics / health report
466
+ var doctor_1 = require("./doctor");
467
+ Object.defineProperty(exports, "formatHealthReport", { enumerable: true, get: function () { return doctor_1.formatHealthReport; } });
468
+ Object.defineProperty(exports, "getSessionDiagnostics", { enumerable: true, get: function () { return doctor_1.getSessionDiagnostics; } });
469
+ Object.defineProperty(exports, "runDoctor", { enumerable: true, get: function () { return doctor_1.runDoctor; } });
432
470
  // Peak Hours (PromoClock — third-party)
433
471
  var peakHours_1 = require("./peakHours");
434
472
  Object.defineProperty(exports, "createPeakHoursNotApplicableState", { enumerable: true, get: function () { return peakHours_1.createPeakHoursNotApplicableState; } });
@@ -18,6 +18,17 @@ exports.normalizeCodexToolInput = normalizeCodexToolInput;
18
18
  exports.extractPatchFilePaths = extractPatchFilePaths;
19
19
  const codex_1 = require("../types/codex");
20
20
  const openCodeParser_1 = require("./openCodeParser");
21
+ function reportedCompaction(tokensBefore, tokensAfter) {
22
+ if (typeof tokensBefore !== 'number' ||
23
+ typeof tokensAfter !== 'number' ||
24
+ !Number.isFinite(tokensBefore) ||
25
+ !Number.isFinite(tokensAfter) ||
26
+ tokensBefore < tokensAfter ||
27
+ tokensAfter < 0) {
28
+ return {};
29
+ }
30
+ return { compaction: { tokensBefore, tokensAfter } };
31
+ }
21
32
  function normalizeRateLimits(rateLimits) {
22
33
  if (!rateLimits?.primary && !rateLimits?.secondary)
23
34
  return undefined;
@@ -476,6 +487,7 @@ class CodexRolloutParser {
476
487
  content: payload.summary || 'Context compacted',
477
488
  },
478
489
  timestamp,
490
+ ...reportedCompaction(payload.tokens_before, payload.tokens_after),
479
491
  },
480
492
  ];
481
493
  }
@@ -664,6 +676,7 @@ class CodexRolloutParser {
664
676
  content: e.summary || 'Context compacted',
665
677
  },
666
678
  timestamp,
679
+ ...reportedCompaction(e.tokens_before, e.tokens_after),
667
680
  },
668
681
  ];
669
682
  }
@@ -336,6 +336,14 @@ function convertAssistantMessage(message, parts) {
336
336
  reasoning_tokens: message.tokens.reasoning || 0,
337
337
  };
338
338
  const timestamp = toISOString(message.time.completed || message.time.created);
339
+ const retryAttempts = parts
340
+ .filter((part) => part.type === 'retry')
341
+ .map((part) => part.attempt)
342
+ .filter((attempt) => typeof attempt === 'number');
343
+ const finishReasons = parts
344
+ .filter((part) => part.type === 'step-finish')
345
+ .map((part) => part.reason)
346
+ .filter((reason) => typeof reason === 'string' && reason.length > 0);
339
347
  // Emit assistant event (even if content is empty, usage data is valuable)
340
348
  if (content.length > 0 || message.tokens.input > 0 || message.tokens.output > 0) {
341
349
  events.push({
@@ -348,6 +356,11 @@ function convertAssistantMessage(message, parts) {
348
356
  content,
349
357
  },
350
358
  timestamp,
359
+ providerMetadata: {
360
+ ...(retryAttempts.length > 0 ? { retryAttempts } : {}),
361
+ ...(finishReasons.length > 0 ? { finishReasons } : {}),
362
+ ...(message.error ? { providerError: message.error } : {}),
363
+ },
351
364
  });
352
365
  }
353
366
  // Emit synthetic tool_result events for completed tool invocations
@@ -194,7 +194,7 @@ class PlanExtractor {
194
194
  // Capture Write/Edit tool calls to plan files during plan mode
195
195
  if (this._planModeActive && event.type === 'tool_use') {
196
196
  const raw = event.raw;
197
- const input = raw?.input;
197
+ const input = extractToolInput(raw);
198
198
  const filePath = input?.file_path;
199
199
  if (event.toolName === 'Write') {
200
200
  const content = input?.content;
@@ -254,9 +254,9 @@ class PlanExtractor {
254
254
  }
255
255
  extractCodexPlan(event) {
256
256
  const raw = event.raw;
257
- if (!raw?.input)
257
+ const input = extractToolInput(raw);
258
+ if (!input)
258
259
  return false;
259
- const input = raw.input;
260
260
  // Codex UpdatePlan can use either approach[] or plan[] format
261
261
  const approach = (input.approach ?? input.plan);
262
262
  if (!approach || !Array.isArray(approach))
@@ -305,10 +305,11 @@ class PlanExtractor {
305
305
  }
306
306
  finalizePlanMode() {
307
307
  this._planModeActive = false;
308
- // Prefer plan file content (from Write tool) → accumulated assistant text → disk read fallback
308
+ // Prefer captured Write content, then the final file after Edit, then prose fallback.
309
+ // Edit only contains a diff, so reading the file must happen before accumulated text.
309
310
  const markdown = this._planFileContent ||
310
- (this._planTexts.length > 0 ? this._planTexts.join('\n') : null) ||
311
- (this._planFilePath && this._readFile ? this._readFile(this._planFilePath) : null);
311
+ (this._planFilePath && this._readFile ? this._readFile(this._planFilePath) : null) ||
312
+ (this._planTexts.length > 0 ? this._planTexts.join('\n') : null);
312
313
  this._planFileContent = null;
313
314
  this._planFilePath = null;
314
315
  this._planTexts = [];
@@ -328,3 +329,13 @@ class PlanExtractor {
328
329
  }
329
330
  }
330
331
  exports.PlanExtractor = PlanExtractor;
332
+ function extractToolInput(raw) {
333
+ if (!raw)
334
+ return null;
335
+ if (raw.input && typeof raw.input === 'object')
336
+ return raw.input;
337
+ const tool = raw.tool;
338
+ if (tool?.input && typeof tool.input === 'object')
339
+ return tool.input;
340
+ return null;
341
+ }
package/dist/paths.d.ts CHANGED
@@ -30,6 +30,16 @@ export declare function encodeWorkspacePath(workspacePath: string): string;
30
30
  * Resolves symlinks, then encodes for use as a filename.
31
31
  */
32
32
  export declare function getProjectSlug(cwd?: string): string;
33
+ export interface ProjectIdentity {
34
+ cwd: string;
35
+ resolvedCwd: string;
36
+ canonicalSlug: string;
37
+ legacySlug: string;
38
+ candidates: string[];
39
+ hasLegacyMismatch: boolean;
40
+ }
41
+ /** Resolves the canonical project identity used by all new readers and writers. */
42
+ export declare function resolveProjectIdentity(cwd?: string): ProjectIdentity;
33
43
  /**
34
44
  * Derives a project slug WITHOUT resolving symlinks.
35
45
  * Matches the VS Code extension's behavior (encodeWorkspacePath on raw path).