sidekick-shared 0.22.0 → 0.23.1

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 (120) hide show
  1. package/README.md +75 -63
  2. package/dist/accountManager.js +10 -0
  3. package/dist/accountRegistry.d.ts +2 -0
  4. package/dist/accountStatus.d.ts +1 -0
  5. package/dist/accountStatus.js +6 -0
  6. package/dist/accounts.js +2 -0
  7. package/dist/aggregation/EventAggregator.d.ts +36 -2
  8. package/dist/aggregation/EventAggregator.js +259 -33
  9. package/dist/aggregation/snapshot.d.ts +1 -1
  10. package/dist/aggregation/snapshot.js +2 -1
  11. package/dist/aggregation/types.d.ts +25 -1
  12. package/dist/analytics/codeImpact.d.ts +20 -0
  13. package/dist/analytics/codeImpact.js +21 -0
  14. package/dist/analytics/compactionLedger.d.ts +11 -0
  15. package/dist/analytics/compactionLedger.js +31 -0
  16. package/dist/analytics/qualityScore.d.ts +26 -0
  17. package/dist/analytics/qualityScore.js +115 -0
  18. package/dist/autoSwitch.d.ts +1 -1
  19. package/dist/autoSwitch.js +14 -3
  20. package/dist/codexProfiles.js +2 -0
  21. package/dist/codexQuota.d.ts +2 -0
  22. package/dist/codexQuota.js +27 -0
  23. package/dist/codexQuotaWatcher.d.ts +7 -0
  24. package/dist/codexQuotaWatcher.js +37 -19
  25. package/dist/context/composer.d.ts +3 -2
  26. package/dist/context/composer.js +5 -5
  27. package/dist/context/sessionContext.js +35 -9
  28. package/dist/credentialIO.js +19 -5
  29. package/dist/doctor.d.ts +55 -0
  30. package/dist/doctor.js +244 -0
  31. package/dist/errorHistory.d.ts +33 -0
  32. package/dist/errorHistory.js +95 -0
  33. package/dist/extractors/errorTaxonomy.d.ts +6 -0
  34. package/dist/extractors/errorTaxonomy.js +47 -0
  35. package/dist/extractors/toolCall.d.ts +9 -0
  36. package/dist/extractors/toolCall.js +79 -0
  37. package/dist/handoffUrl.d.ts +7 -0
  38. package/dist/handoffUrl.js +26 -0
  39. package/dist/index.d.ts +32 -9
  40. package/dist/index.js +64 -24
  41. package/dist/modelInfo.js +6 -0
  42. package/dist/multiProviderQuotaService.js +13 -2
  43. package/dist/parsers/codexParser.js +17 -1
  44. package/dist/parsers/openCodeParser.js +13 -0
  45. package/dist/parsers/planExtractor.js +17 -6
  46. package/dist/parsers/sessionActivityDetector.js +2 -0
  47. package/dist/parsers/sessionPathResolver.js +19 -16
  48. package/dist/parsers/subagentScanner.d.ts +1 -1
  49. package/dist/parsers/subagentScanner.js +4 -5
  50. package/dist/parsers/subagentTraceParser.js +4 -7
  51. package/dist/paths.d.ts +10 -0
  52. package/dist/paths.js +18 -5
  53. package/dist/projectMigration.d.ts +23 -0
  54. package/dist/projectMigration.js +95 -0
  55. package/dist/providerStatus.js +13 -2
  56. package/dist/providers/claudeCode.js +18 -4
  57. package/dist/providers/codex.js +42 -13
  58. package/dist/providers/codexDatabase.d.ts +1 -11
  59. package/dist/providers/detect.js +32 -3
  60. package/dist/providers/openCodeDatabase.d.ts +1 -31
  61. package/dist/providers/openCodeDatabase.js +21 -11
  62. package/dist/providers/types.d.ts +1 -0
  63. package/dist/quota.js +8 -0
  64. package/dist/quotaPoller.js +17 -6
  65. package/dist/quotaSnapshots.js +80 -26
  66. package/dist/readers/decisions.d.ts +2 -1
  67. package/dist/readers/decisions.js +5 -5
  68. package/dist/readers/handoff.d.ts +2 -1
  69. package/dist/readers/handoff.js +13 -8
  70. package/dist/readers/helpers.d.ts +3 -0
  71. package/dist/readers/helpers.js +12 -0
  72. package/dist/readers/notes.d.ts +2 -1
  73. package/dist/readers/notes.js +11 -8
  74. package/dist/readers/plans.js +3 -5
  75. package/dist/readers/tasks.d.ts +2 -1
  76. package/dist/readers/tasks.js +5 -5
  77. package/dist/report/htmlHelpers.js +6 -1
  78. package/dist/report/openBrowser.js +3 -3
  79. package/dist/schemas/index.d.ts +2 -0
  80. package/dist/schemas/index.js +10 -1
  81. package/dist/schemas/observedSessionV1.d.ts +499 -0
  82. package/dist/schemas/observedSessionV1.js +69 -0
  83. package/dist/schemas/sessionEvent.d.ts +13 -0
  84. package/dist/schemas/sessionEvent.js +19 -0
  85. package/dist/search/sessionSearch.d.ts +2 -2
  86. package/dist/search/sessionSearch.js +2 -3
  87. package/dist/sessionMonitor.d.ts +29 -0
  88. package/dist/sessionMonitor.js +71 -0
  89. package/dist/statusline/BurnRateCalculator.d.ts +14 -0
  90. package/dist/statusline/BurnRateCalculator.js +45 -0
  91. package/dist/statusline/formatter.d.ts +16 -0
  92. package/dist/statusline/formatter.js +84 -0
  93. package/dist/statusline/index.d.ts +7 -0
  94. package/dist/statusline/index.js +13 -0
  95. package/dist/terminalSync.js +16 -7
  96. package/dist/types/codex.d.ts +2 -0
  97. package/dist/types/historicalData.d.ts +49 -1
  98. package/dist/types/historicalData.js +28 -2
  99. package/dist/types/observedSessionV1.d.ts +70 -0
  100. package/dist/types/observedSessionV1.js +186 -0
  101. package/dist/types/opencode.d.ts +1 -0
  102. package/dist/types/sessionEvent.d.ts +19 -1
  103. package/dist/watchers/eventBridge.js +1 -0
  104. package/dist/watchers/factory.js +14 -3
  105. package/dist/watchers/jsonlTail.js +34 -14
  106. package/dist/watchers/jsonlWatcher.js +5 -3
  107. package/dist/watchers/providerReaderWatcher.js +4 -2
  108. package/dist/watchers/sqliteWatcher.d.ts +2 -0
  109. package/dist/watchers/sqliteWatcher.js +27 -14
  110. package/dist/watchers/types.d.ts +5 -0
  111. package/dist/writers/atomic.d.ts +4 -0
  112. package/dist/writers/atomic.js +200 -0
  113. package/dist/writers/decisions.d.ts +12 -0
  114. package/dist/writers/decisions.js +88 -0
  115. package/dist/writers/notes.d.ts +8 -0
  116. package/dist/writers/notes.js +82 -0
  117. package/dist/writers/tasks.d.ts +6 -0
  118. package/dist/writers/tasks.js +100 -0
  119. package/dist/zaiQuotaWatcher.js +6 -0
  120. package/package.json +5 -1
@@ -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, HourlyData, MonthlyData, AllTimeStats, TokenTotals, ModelUsageRecord, ToolUsageRecord, SessionSummary, SessionHistoryRecord, } from './types/historicalData';
15
+ export { HISTORICAL_DATA_SCHEMA_VERSION, HISTORICAL_SESSION_RETENTION_LIMIT, createEmptyTokenTotals, createEmptyDataStore, } 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, MAX_ERROR_HISTORY_SESSIONS, 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.TRUNCATION_PATTERNS = exports.JsonlParser = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports.derivePendingUserRequestV1 = exports.createProviderSessionAdapterV1 = exports.renderHandoffUrlTemplate = exports.addNote = exports.decisionFingerprint = exports.addDecision = exports.completeTask = exports.addTask = exports.updateJsonStoreAtomic = exports.atomicWriteJsonSync = exports.atomicWriteJson = exports.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = exports.migrateLegacyProjectStores = exports.resolveProjectIdentity = exports.getProjectSlugRaw = exports.getProjectSlug = exports.encodeWorkspacePath = exports.getGlobalDataPath = exports.getProjectDataPath = exports.getConfigDir = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyDataStore = exports.createEmptyTokenTotals = exports.HISTORICAL_SESSION_RETENTION_LIMIT = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = exports.isAggregateCodexLimit = void 0;
7
+ exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.readSessionContextSnapshot = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.detectSessionActivity = exports.extractTaskInfo = exports.scanSubagentDir = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.CodexRolloutParser = exports.parseDbPartData = exports.parseDbMessageData = exports.convertOpenCodeMessage = exports.detectPlanModeFromText = exports.normalizeToolInput = exports.normalizeToolName = void 0;
8
+ exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.formatCompactionLedger = exports.calculateCompactionLedger = exports.calculateCodeImpact = exports.scoreSessionQuality = exports.calculateQualityTrend = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.readErrorHistory = exports.getTopFailingTools = exports.appendErrorHistory = exports.MAX_ERROR_HISTORY_SESSIONS = exports.ERROR_HISTORY_SCHEMA_VERSION = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.SessionMonitor = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.formatTokenCount = exports.formatDurationMs = exports.createJsonlTail = exports.toFollowEvents = void 0;
9
+ exports.removeCodexAccount = exports.switchToCodexAccount = exports.finalizeCodexAccount = exports.prepareCodexAccount = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.resolveActiveCodexAccount = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.readClaudeProfileIdentity = exports.isClaudeProfileAuthenticated = exports.claudeKeychainService = exports.claudeKeychainSuffix = exports.getClaudeProfileHome = exports.getClaudeProfilesDir = exports.getActiveAccountStatus = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLogin = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = void 0;
10
+ exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = exports.selectStatuslineAccount = exports.formatStatusline = exports.estimateTimeToQuota = exports.BurnRateCalculator = exports.MultiProviderQuotaService = exports.resolveZaiQuota = exports.readZaiCredentials = exports.quotaStateFromZaiQuotaLimitPayload = exports.fetchZaiQuotaFromApi = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = exports.quotaFromCodexRateLimits = exports.fetchCodexQuotaFromApi = exports.fetchCodexResetCreditsFromApi = exports.getWorkspaceIdFromPath = exports.pruneQuotaHistory = exports.readQuotaHistoryDailyBuckets = exports.readQuotaHistoryRange = exports.appendQuotaHistorySample = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.FIVE_HOUR_WINDOW_MS = exports.AutoSwitchController = exports.decideAutoSwitch = exports.DEFAULT_AUTO_SWITCH_CONFIG = exports.removeLauncher = exports.writeLauncher = exports.isShellHookInstalled = exports.uninstallShellHook = exports.installShellHook = exports.setTerminalActiveProfile = void 0;
11
+ exports.accountEntrySchema = exports.accountLoginStatusSchema = exports.beginAccountLoginResultSchema = exports.accountManagerResultSchema = exports.accountProviderIdSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.codexResetCreditsSnapshotSchema = exports.codexResetCreditSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = exports.ToolCallTracker = exports.extractToolCalls = exports.extractToolCall = exports.extractErrorMessage = exports.categorizeError = exports.gatherAssetsForCwd = exports.codexSessions = exports.readCodexAssets = exports.claudeSessions = exports.readClaudeAssets = exports.extractCommands = exports.extractFilePaths = exports.extractUrls = exports.extractTokenUsage = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.formatCost = exports.sortModelIds = exports.compareModelIds = void 0;
12
+ exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.runDoctor = exports.getSessionDiagnostics = exports.formatHealthReport = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.listAllAccountsResultSchema = exports.savedAccountProfileSchema = void 0;
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,7 +23,9 @@ 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; } });
28
+ Object.defineProperty(exports, "createEmptyDataStore", { enumerable: true, get: function () { return historicalData_1.createEmptyDataStore; } });
26
29
  var plan_1 = require("./types/plan");
27
30
  Object.defineProperty(exports, "PLAN_SCHEMA_VERSION", { enumerable: true, get: function () { return plan_1.PLAN_SCHEMA_VERSION; } });
28
31
  Object.defineProperty(exports, "MAX_PLANS_PER_PROJECT", { enumerable: true, get: function () { return plan_1.MAX_PLANS_PER_PROJECT; } });
@@ -34,6 +37,9 @@ Object.defineProperty(exports, "getGlobalDataPath", { enumerable: true, get: fun
34
37
  Object.defineProperty(exports, "encodeWorkspacePath", { enumerable: true, get: function () { return paths_1.encodeWorkspacePath; } });
35
38
  Object.defineProperty(exports, "getProjectSlug", { enumerable: true, get: function () { return paths_1.getProjectSlug; } });
36
39
  Object.defineProperty(exports, "getProjectSlugRaw", { enumerable: true, get: function () { return paths_1.getProjectSlugRaw; } });
40
+ Object.defineProperty(exports, "resolveProjectIdentity", { enumerable: true, get: function () { return paths_1.resolveProjectIdentity; } });
41
+ var projectMigration_1 = require("./projectMigration");
42
+ Object.defineProperty(exports, "migrateLegacyProjectStores", { enumerable: true, get: function () { return projectMigration_1.migrateLegacyProjectStores; } });
37
43
  // Readers
38
44
  var tasks_1 = require("./readers/tasks");
39
45
  Object.defineProperty(exports, "readTasks", { enumerable: true, get: function () { return tasks_1.readTasks; } });
@@ -51,6 +57,24 @@ Object.defineProperty(exports, "getLatestPlan", { enumerable: true, get: functio
51
57
  Object.defineProperty(exports, "writePlans", { enumerable: true, get: function () { return plans_1.writePlans; } });
52
58
  Object.defineProperty(exports, "getPlanAnalytics", { enumerable: true, get: function () { return plans_1.getPlanAnalytics; } });
53
59
  Object.defineProperty(exports, "readClaudeCodePlanFiles", { enumerable: true, get: function () { return plans_1.readClaudeCodePlanFiles; } });
60
+ // Atomic persistence writers
61
+ var atomic_1 = require("./writers/atomic");
62
+ Object.defineProperty(exports, "atomicWriteJson", { enumerable: true, get: function () { return atomic_1.atomicWriteJson; } });
63
+ Object.defineProperty(exports, "atomicWriteJsonSync", { enumerable: true, get: function () { return atomic_1.atomicWriteJsonSync; } });
64
+ Object.defineProperty(exports, "updateJsonStoreAtomic", { enumerable: true, get: function () { return atomic_1.updateJsonStoreAtomic; } });
65
+ var tasks_2 = require("./writers/tasks");
66
+ Object.defineProperty(exports, "addTask", { enumerable: true, get: function () { return tasks_2.addTask; } });
67
+ Object.defineProperty(exports, "completeTask", { enumerable: true, get: function () { return tasks_2.completeTask; } });
68
+ var decisions_2 = require("./writers/decisions");
69
+ Object.defineProperty(exports, "addDecision", { enumerable: true, get: function () { return decisions_2.addDecision; } });
70
+ Object.defineProperty(exports, "decisionFingerprint", { enumerable: true, get: function () { return decisions_2.decisionFingerprint; } });
71
+ var notes_2 = require("./writers/notes");
72
+ Object.defineProperty(exports, "addNote", { enumerable: true, get: function () { return notes_2.addNote; } });
73
+ var handoffUrl_1 = require("./handoffUrl");
74
+ Object.defineProperty(exports, "renderHandoffUrlTemplate", { enumerable: true, get: function () { return handoffUrl_1.renderHandoffUrlTemplate; } });
75
+ var observedSessionV1_1 = require("./types/observedSessionV1");
76
+ Object.defineProperty(exports, "createProviderSessionAdapterV1", { enumerable: true, get: function () { return observedSessionV1_1.createProviderSessionAdapterV1; } });
77
+ Object.defineProperty(exports, "derivePendingUserRequestV1", { enumerable: true, get: function () { return observedSessionV1_1.derivePendingUserRequestV1; } });
54
78
  var detect_1 = require("./providers/detect");
55
79
  Object.defineProperty(exports, "detectProvider", { enumerable: true, get: function () { return detect_1.detectProvider; } });
56
80
  Object.defineProperty(exports, "getAllDetectedProviders", { enumerable: true, get: function () { return detect_1.getAllDetectedProviders; } });
@@ -180,12 +204,20 @@ Object.defineProperty(exports, "getRandomPhrase", { enumerable: true, get: funct
180
204
  var EventAggregator_1 = require("./aggregation/EventAggregator");
181
205
  Object.defineProperty(exports, "EventAggregator", { enumerable: true, get: function () { return EventAggregator_1.EventAggregator; } });
182
206
  Object.defineProperty(exports, "parseTodoDependencies", { enumerable: true, get: function () { return EventAggregator_1.parseTodoDependencies; } });
207
+ var sessionMonitor_1 = require("./sessionMonitor");
208
+ Object.defineProperty(exports, "SessionMonitor", { enumerable: true, get: function () { return sessionMonitor_1.SessionMonitor; } });
183
209
  var snapshot_1 = require("./aggregation/snapshot");
184
210
  Object.defineProperty(exports, "saveSnapshot", { enumerable: true, get: function () { return snapshot_1.saveSnapshot; } });
185
211
  Object.defineProperty(exports, "loadSnapshot", { enumerable: true, get: function () { return snapshot_1.loadSnapshot; } });
186
212
  Object.defineProperty(exports, "deleteSnapshot", { enumerable: true, get: function () { return snapshot_1.deleteSnapshot; } });
187
213
  Object.defineProperty(exports, "isSnapshotValid", { enumerable: true, get: function () { return snapshot_1.isSnapshotValid; } });
188
214
  Object.defineProperty(exports, "getSnapshotPath", { enumerable: true, get: function () { return snapshot_1.getSnapshotPath; } });
215
+ var errorHistory_1 = require("./errorHistory");
216
+ Object.defineProperty(exports, "ERROR_HISTORY_SCHEMA_VERSION", { enumerable: true, get: function () { return errorHistory_1.ERROR_HISTORY_SCHEMA_VERSION; } });
217
+ Object.defineProperty(exports, "MAX_ERROR_HISTORY_SESSIONS", { enumerable: true, get: function () { return errorHistory_1.MAX_ERROR_HISTORY_SESSIONS; } });
218
+ Object.defineProperty(exports, "appendErrorHistory", { enumerable: true, get: function () { return errorHistory_1.appendErrorHistory; } });
219
+ Object.defineProperty(exports, "getTopFailingTools", { enumerable: true, get: function () { return errorHistory_1.getTopFailingTools; } });
220
+ Object.defineProperty(exports, "readErrorHistory", { enumerable: true, get: function () { return errorHistory_1.readErrorHistory; } });
189
221
  // Aggregation — analytics engines
190
222
  var FrequencyTracker_1 = require("./aggregation/FrequencyTracker");
191
223
  Object.defineProperty(exports, "FrequencyTracker", { enumerable: true, get: function () { return FrequencyTracker_1.FrequencyTracker; } });
@@ -193,6 +225,14 @@ var HeatmapTracker_1 = require("./aggregation/HeatmapTracker");
193
225
  Object.defineProperty(exports, "HeatmapTracker", { enumerable: true, get: function () { return HeatmapTracker_1.HeatmapTracker; } });
194
226
  var PatternExtractor_1 = require("./aggregation/PatternExtractor");
195
227
  Object.defineProperty(exports, "PatternExtractor", { enumerable: true, get: function () { return PatternExtractor_1.PatternExtractor; } });
228
+ var qualityScore_1 = require("./analytics/qualityScore");
229
+ Object.defineProperty(exports, "calculateQualityTrend", { enumerable: true, get: function () { return qualityScore_1.calculateQualityTrend; } });
230
+ Object.defineProperty(exports, "scoreSessionQuality", { enumerable: true, get: function () { return qualityScore_1.scoreSessionQuality; } });
231
+ var codeImpact_1 = require("./analytics/codeImpact");
232
+ Object.defineProperty(exports, "calculateCodeImpact", { enumerable: true, get: function () { return codeImpact_1.calculateCodeImpact; } });
233
+ var compactionLedger_1 = require("./analytics/compactionLedger");
234
+ Object.defineProperty(exports, "calculateCompactionLedger", { enumerable: true, get: function () { return compactionLedger_1.calculateCompactionLedger; } });
235
+ Object.defineProperty(exports, "formatCompactionLedger", { enumerable: true, get: function () { return compactionLedger_1.formatCompactionLedger; } });
196
236
  // Report — HTML session report generation
197
237
  var report_1 = require("./report");
198
238
  Object.defineProperty(exports, "generateHtmlReport", { enumerable: true, get: function () { return report_1.generateHtmlReport; } });
@@ -305,21 +345,6 @@ Object.defineProperty(exports, "resolveCodexQuota", { enumerable: true, get: fun
305
345
  Object.defineProperty(exports, "resolveCodexQuotaFromLocalSources", { enumerable: true, get: function () { return codexQuota_1.resolveCodexQuotaFromLocalSources; } });
306
346
  var codexQuotaWatcher_1 = require("./codexQuotaWatcher");
307
347
  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
348
  var zaiQuotaApi_1 = require("./zaiQuotaApi");
324
349
  Object.defineProperty(exports, "fetchZaiQuotaFromApi", { enumerable: true, get: function () { return zaiQuotaApi_1.fetchZaiQuotaFromApi; } });
325
350
  Object.defineProperty(exports, "quotaStateFromZaiQuotaLimitPayload", { enumerable: true, get: function () { return zaiQuotaApi_1.quotaStateFromZaiQuotaLimitPayload; } });
@@ -327,6 +352,12 @@ Object.defineProperty(exports, "readZaiCredentials", { enumerable: true, get: fu
327
352
  Object.defineProperty(exports, "resolveZaiQuota", { enumerable: true, get: function () { return zaiQuotaApi_1.resolveZaiQuota; } });
328
353
  var multiProviderQuotaService_1 = require("./multiProviderQuotaService");
329
354
  Object.defineProperty(exports, "MultiProviderQuotaService", { enumerable: true, get: function () { return multiProviderQuotaService_1.MultiProviderQuotaService; } });
355
+ var BurnRateCalculator_1 = require("./statusline/BurnRateCalculator");
356
+ Object.defineProperty(exports, "BurnRateCalculator", { enumerable: true, get: function () { return BurnRateCalculator_1.BurnRateCalculator; } });
357
+ Object.defineProperty(exports, "estimateTimeToQuota", { enumerable: true, get: function () { return BurnRateCalculator_1.estimateTimeToQuota; } });
358
+ var formatter_1 = require("./statusline/formatter");
359
+ Object.defineProperty(exports, "formatStatusline", { enumerable: true, get: function () { return formatter_1.formatStatusline; } });
360
+ Object.defineProperty(exports, "selectStatuslineAccount", { enumerable: true, get: function () { return formatter_1.selectStatuslineAccount; } });
330
361
  // Model Context
331
362
  var modelContext_1 = require("./modelContext");
332
363
  Object.defineProperty(exports, "getModelContextWindowSize", { enumerable: true, get: function () { return modelContext_1.getModelContextWindowSize; } });
@@ -354,9 +385,6 @@ Object.defineProperty(exports, "LITELLM_CATALOG_URL", { enumerable: true, get: f
354
385
  // Extractors — per-event token usage and tool call extraction
355
386
  var tokenUsage_1 = require("./extractors/tokenUsage");
356
387
  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
388
  // Extractors — actionable session assets. Node-only: safe for CLI and
361
389
  // extension-host code, not for browser/webview bundles.
362
390
  var sessionAssets_1 = require("./extractors/sessionAssets");
@@ -371,6 +399,13 @@ Object.defineProperty(exports, "readCodexAssets", { enumerable: true, get: funct
371
399
  Object.defineProperty(exports, "codexSessions", { enumerable: true, get: function () { return codexAssets_1.codexSessions; } });
372
400
  var gatherAssets_1 = require("./extractors/gatherAssets");
373
401
  Object.defineProperty(exports, "gatherAssetsForCwd", { enumerable: true, get: function () { return gatherAssets_1.gatherAssetsForCwd; } });
402
+ var errorTaxonomy_1 = require("./extractors/errorTaxonomy");
403
+ Object.defineProperty(exports, "categorizeError", { enumerable: true, get: function () { return errorTaxonomy_1.categorizeError; } });
404
+ Object.defineProperty(exports, "extractErrorMessage", { enumerable: true, get: function () { return errorTaxonomy_1.extractErrorMessage; } });
405
+ var toolCall_1 = require("./extractors/toolCall");
406
+ Object.defineProperty(exports, "extractToolCall", { enumerable: true, get: function () { return toolCall_1.extractToolCall; } });
407
+ Object.defineProperty(exports, "extractToolCalls", { enumerable: true, get: function () { return toolCall_1.extractToolCalls; } });
408
+ Object.defineProperty(exports, "ToolCallTracker", { enumerable: true, get: function () { return toolCall_1.ToolCallTracker; } });
374
409
  // Schemas — Zod runtime validation for session events
375
410
  var sessionEvent_1 = require("./schemas/sessionEvent");
376
411
  Object.defineProperty(exports, "messageUsageSchema", { enumerable: true, get: function () { return sessionEvent_1.messageUsageSchema; } });
@@ -429,6 +464,11 @@ Object.defineProperty(exports, "assistantTurnToolRefSchema", { enumerable: true,
429
464
  var providerStatus_1 = require("./providerStatus");
430
465
  Object.defineProperty(exports, "fetchProviderStatus", { enumerable: true, get: function () { return providerStatus_1.fetchProviderStatus; } });
431
466
  Object.defineProperty(exports, "fetchOpenAIStatus", { enumerable: true, get: function () { return providerStatus_1.fetchOpenAIStatus; } });
467
+ // Shared diagnostics / health report
468
+ var doctor_1 = require("./doctor");
469
+ Object.defineProperty(exports, "formatHealthReport", { enumerable: true, get: function () { return doctor_1.formatHealthReport; } });
470
+ Object.defineProperty(exports, "getSessionDiagnostics", { enumerable: true, get: function () { return doctor_1.getSessionDiagnostics; } });
471
+ Object.defineProperty(exports, "runDoctor", { enumerable: true, get: function () { return doctor_1.runDoctor; } });
432
472
  // Peak Hours (PromoClock — third-party)
433
473
  var peakHours_1 = require("./peakHours");
434
474
  Object.defineProperty(exports, "createPeakHoursNotApplicableState", { enumerable: true, get: function () { return peakHours_1.createPeakHoursNotApplicableState; } });
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,
@@ -174,7 +174,7 @@ class MultiProviderQuotaService {
174
174
  providerId: 'claude-code',
175
175
  });
176
176
  this.lastEmittedClaudeState = nextState;
177
- if (nextState.available) {
177
+ if (nextState.available && nextState.stale !== true) {
178
178
  this.lastSuccessfulClaudeState = nextState;
179
179
  }
180
180
  this.quotaByProvider = {
@@ -323,7 +323,18 @@ class MultiProviderQuotaService {
323
323
  }
324
324
  }
325
325
  this.cachedFallbackActive = hasVisibleCachedSuccess;
326
- if (!hasVisibleCachedSuccess) {
326
+ if (hasVisibleCachedSuccess) {
327
+ this.emitClaudeState({
328
+ ...this.lastSuccessfulClaudeState,
329
+ error: state.error,
330
+ failureKind: state.failureKind,
331
+ httpStatus: state.httpStatus,
332
+ retryAfterMs: state.retryAfterMs,
333
+ source: 'cache',
334
+ stale: true,
335
+ });
336
+ }
337
+ else {
327
338
  this.emitClaudeState(state);
328
339
  }
329
340
  }
@@ -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
  }
@@ -769,7 +782,10 @@ class CodexRolloutParser {
769
782
  return [];
770
783
  const mappedUsage = usage
771
784
  ? {
772
- input_tokens: usage.input_tokens || 0,
785
+ // Codex reports cached_input_tokens as a subset of input_tokens,
786
+ // while MessageUsage categories are disjoint. Normalize once here
787
+ // so aggregation and pricing do not count cached input twice.
788
+ input_tokens: Math.max(0, (usage.input_tokens || 0) - (usage.cached_input_tokens || 0)),
773
789
  output_tokens: usage.output_tokens || 0,
774
790
  cache_read_input_tokens: usage.cached_input_tokens || 0,
775
791
  cache_creation_input_tokens: 0,
@@ -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
+ }
@@ -126,6 +126,8 @@ function detectSessionActivity(sessionPath) {
126
126
  }
127
127
  if (!hasTerminal) {
128
128
  for (const pattern of ENDING_PATTERNS) {
129
+ if (pattern === '"type":"user"' && line.includes('"type":"tool_result"'))
130
+ continue;
129
131
  if (line.includes(pattern)) {
130
132
  lastEndingIndex = i;
131
133
  break;
@@ -81,10 +81,9 @@ const os = __importStar(require("os"));
81
81
  function encodeWorkspacePath(workspacePath) {
82
82
  // Normalize path separators to forward slash
83
83
  const normalized = workspacePath.replace(/\\/g, '/');
84
- // Replace colons, slashes, and underscores with hyphens
85
- // Windows: C:\Users\foo_bar -> C:/Users/foo_bar -> C--Users-foo-bar
86
- // Unix: /home/user/foo_bar -> -home-user-foo-bar
87
- return normalized.replace(/[:/_]/g, '-');
84
+ // Claude Code replaces every non-alphanumeric path character, including
85
+ // dots and spaces, with a hyphen.
86
+ return normalized.replace(/[^a-zA-Z0-9]/g, '-');
88
87
  }
89
88
  /**
90
89
  * Gets the session directory path for a workspace.
@@ -249,12 +248,7 @@ function discoverSessionDirectory(workspacePath) {
249
248
  });
250
249
  // Try to match by workspace path components
251
250
  // Normalize workspace path for comparison
252
- const normalizedWorkspace = workspacePath
253
- .replace(/\\/g, '/')
254
- .replace(/:/g, '-')
255
- .replace(/_/g, '-')
256
- .replace(/\//g, '-')
257
- .toLowerCase();
251
+ const normalizedWorkspace = encodeWorkspacePath(workspacePath).toLowerCase();
258
252
  for (const dir of existingDirs) {
259
253
  // Check if the directory name matches (case-insensitive)
260
254
  if (dir.toLowerCase() === normalizedWorkspace) {
@@ -262,7 +256,10 @@ function discoverSessionDirectory(workspacePath) {
262
256
  }
263
257
  }
264
258
  // Fallback: match by final path component (project name)
265
- const workspaceBasename = path.basename(workspacePath).replace(/_/g, '-').toLowerCase();
259
+ const workspaceBasename = path
260
+ .basename(workspacePath)
261
+ .replace(/[^a-zA-Z0-9]/g, '-')
262
+ .toLowerCase();
266
263
  for (const dir of existingDirs) {
267
264
  const dirLower = dir.toLowerCase();
268
265
  // Check if dir ends with the project name
@@ -406,12 +403,18 @@ function findAllSessions(workspacePath) {
406
403
  .filter((file) => file.endsWith('.jsonl'))
407
404
  .map((file) => {
408
405
  const fullPath = path.join(sessionDir, file);
409
- const stats = fs.statSync(fullPath);
410
- return {
411
- path: fullPath,
412
- mtime: stats.mtime.getTime(),
413
- };
406
+ try {
407
+ const stats = fs.statSync(fullPath);
408
+ return {
409
+ path: fullPath,
410
+ mtime: stats.mtime.getTime(),
411
+ };
412
+ }
413
+ catch {
414
+ return null;
415
+ }
414
416
  })
417
+ .filter((file) => file !== null)
415
418
  .sort((a, b) => b.mtime - a.mtime)
416
419
  .map((file) => file.path);
417
420
  return files;
@@ -26,7 +26,7 @@ import type { SubagentStats, TaskState } from '../types/sessionEvent';
26
26
  * }
27
27
  * ```
28
28
  */
29
- export declare function scanSubagentDir(sessionDir: string, sessionId: string, logger?: (msg: string) => void): SubagentStats[];
29
+ export declare function scanSubagentDir(sessionDir: string, sessionId: string, logger?: (msg: string) => void, skipFiles?: ReadonlySet<string>): SubagentStats[];
30
30
  /**
31
31
  * Handles TaskUpdate tool input and updates task state.
32
32
  */