sidekick-shared 0.26.4 → 0.26.6

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 (69) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +59 -51
  3. package/dist/accountChanges.js +21 -2
  4. package/dist/accountHealth.d.ts +72 -0
  5. package/dist/accountHealth.js +286 -0
  6. package/dist/accountLaunch.d.ts +30 -0
  7. package/dist/accountLaunch.js +124 -0
  8. package/dist/accountManager.d.ts +33 -8
  9. package/dist/accountManager.js +183 -50
  10. package/dist/accountRegistry.d.ts +10 -0
  11. package/dist/accountRegistry.js +42 -22
  12. package/dist/accountSwitch.d.ts +43 -0
  13. package/dist/accountSwitch.js +115 -0
  14. package/dist/accountSync.d.ts +30 -0
  15. package/dist/accountSync.js +180 -0
  16. package/dist/accountSyncTypes.d.ts +25 -0
  17. package/dist/accountSyncTypes.js +7 -0
  18. package/dist/accounts.d.ts +58 -6
  19. package/dist/accounts.js +408 -189
  20. package/dist/claudeCredentials.d.ts +38 -0
  21. package/dist/claudeCredentials.js +74 -0
  22. package/dist/claudeProfiles.d.ts +40 -0
  23. package/dist/claudeProfiles.js +102 -10
  24. package/dist/codexAuth.d.ts +32 -0
  25. package/dist/codexAuth.js +127 -0
  26. package/dist/codexPaths.d.ts +21 -0
  27. package/dist/codexPaths.js +117 -0
  28. package/dist/codexProfiles.d.ts +58 -5
  29. package/dist/codexProfiles.js +574 -289
  30. package/dist/credentialIO.d.ts +12 -5
  31. package/dist/credentialIO.js +63 -29
  32. package/dist/credentials.d.ts +8 -0
  33. package/dist/credentials.js +28 -32
  34. package/dist/ensureDefaultAccounts.d.ts +8 -0
  35. package/dist/ensureDefaultAccounts.js +42 -82
  36. package/dist/index.d.ts +31 -12
  37. package/dist/index.js +68 -13
  38. package/dist/keepAlive.d.ts +44 -0
  39. package/dist/keepAlive.js +106 -0
  40. package/dist/node.d.ts +4 -1
  41. package/dist/node.js +4 -1
  42. package/dist/observedSessionCollector.d.ts +117 -5
  43. package/dist/observedSessionCollector.js +483 -76
  44. package/dist/processDetection.d.ts +32 -0
  45. package/dist/processDetection.js +210 -0
  46. package/dist/providers/claudeCode.d.ts +23 -2
  47. package/dist/providers/claudeCode.js +143 -51
  48. package/dist/providers/codex.d.ts +10 -2
  49. package/dist/providers/codex.js +95 -12
  50. package/dist/providers/directoryListingCache.d.ts +85 -0
  51. package/dist/providers/directoryListingCache.js +244 -0
  52. package/dist/providers/rolloutWalker.d.ts +28 -5
  53. package/dist/providers/rolloutWalker.js +100 -16
  54. package/dist/providers/types.d.ts +48 -1
  55. package/dist/schemas/accountManager.d.ts +283 -1
  56. package/dist/schemas/accountManager.js +122 -1
  57. package/dist/schemas/assistantTurn.d.ts +2 -2
  58. package/dist/schemas/index.d.ts +6 -1
  59. package/dist/schemas/index.js +14 -1
  60. package/dist/schemas/observedSessionV1.d.ts +21 -21
  61. package/dist/schemas/quota.d.ts +18 -18
  62. package/dist/schemas/quotaHistory.d.ts +1 -1
  63. package/dist/schemas/stateFile.d.ts +5 -5
  64. package/dist/sessionMonitor.js +24 -2
  65. package/dist/terminalSync.d.ts +5 -5
  66. package/dist/terminalSync.js +7 -112
  67. package/dist/writers/atomic.d.ts +2 -0
  68. package/dist/writers/atomic.js +49 -2
  69. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3,15 +3,16 @@
3
3
  * Public API for sidekick-shared.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isAggregateCodexLimit = exports.fileFingerprintParts = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = exports.weekKey = exports.usageBucketKey = exports.summarizeUsageRows = exports.bucketUsage = exports.importSessionHistory = exports.ACTIVE_SESSION_MTIME_THRESHOLD_MS = exports.sessionSummaryFromStats = exports.removeSessionSummary = exports.markFileImported = exports.isFileImported = exports.applySessionSummary = exports.pruneUsageCache = exports.getUsageCacheDir = exports.collectUsageEvents = exports.USAGE_CACHE_VERSION = exports.MAX_USAGE_CACHE_FILES = exports.findActiveBillingBlock = exports.computeBillingBlocks = exports.BILLING_BLOCK_DURATION_MS = exports.writeStateFile = exports.readStateFile = exports.quotaToStateFile = exports.getStateFilePath = exports.billingBlockToStateFile = exports.STATE_FILE_SCHEMA_VERSION = exports.STATE_FILE_NAME = exports.sessionFingerprintParts = exports.fingerprintString = exports.readSessionReportInputs = exports.readSessionFileStats = exports.providerContextSizeFn = exports.firstUserPrompt = exports.computeSessionFileStats = exports.readSessionTranscript = exports.listRecentSessions = exports.projectSessionTranscript = exports.estimateSerializedTokens = exports.estimateTextTokens = exports.TOKEN_TOTAL_LABEL = exports.TOKEN_CONTEXT_LABEL = exports.sumTokenTotals = exports.summarizeTokens = exports.calculateNormalizedUsageCost = exports.extractNormalizedUsage = exports.normalizeProviderUsage = void 0;
7
- exports.derivePendingUserRequestV1 = exports.createProviderSessionAdapterV1 = exports.createSessionProviders = exports.SESSION_PROVIDER_IDS = exports.renderHandoffUrlTemplate = exports.addNote = exports.decisionFingerprint = exports.addDecision = exports.completeTask = exports.addTask = exports.withFileLockSync = exports.updateJsonStoreAtomicSync = exports.updateJsonStoreAtomic = exports.atomicWriteFileSync = 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.setConfigDir = exports.getDefaultConfigDir = exports.getConfigDirOverride = exports.getConfigDir = exports.CONFIG_DIR_ENV_VAR = 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 = void 0;
8
- exports.readSessionPreview = exports.listSessionPreviewsAsync = exports.listSessionPreviews = exports.readCodexHistory = exports.parseMcpToolName = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionFilesWithStats = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.SESSION_ACTIVITY_STALENESS_MS = exports.SESSION_ACTIVITY_GRACE_PERIOD_MS = exports.refreshSessionActivityState = exports.detectSessionActivity = exports.classifySessionActivity = 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.walkRolloutFilesAsync = exports.walkRolloutFiles = exports.findCodexRolloutFile = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports._resetProviderDetectionCache = exports.getObservedActivityReason = void 0;
9
- 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.parseLocalDateKey = exports.formatTokenCount = exports.formatLocalDateKey = exports.formatDurationMs = exports.addLocalDays = exports.createJsonlTail = exports.toFollowEvents = exports.resolveSessionPath = 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.readSessionPreviewAsync = void 0;
10
- exports.finalizeAccountLogin = exports.getAccountLoginStatusAsync = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.formatCompactionLedger = exports.calculateCompactionLedger = exports.describeCostProvenance = exports.classifyCostProvenance = 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.MAX_SNAPSHOT_FILES = exports.pruneSnapshots = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.SessionMonitor = exports.parseTodoDependencies = void 0;
11
- 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.switchToCodexAccountAsync = exports.switchToCodexAccount = exports.finalizeCodexAccountAsync = exports.finalizeCodexAccount = exports.prepareCodexAccountAsync = 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.onAccountsChanged = exports.getActiveAccountStatus = exports.ACCOUNT_PROVIDER_IDS = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.switchAccountAsync = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLoginAsync = void 0;
12
- exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.resolveModelPricing = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.resolveModelContextWindow = exports.getModelContextWindowSize = exports.selectStatuslineAccount = exports.formatStatusline = exports.estimateTimeToQuota = exports.BurnRateCalculator = exports.RUNTIME_QUOTA_PROVIDER_IDS = 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.quotaFromStatuslinePayload = exports.parseClaudeStatuslinePayload = exports.evaluateQuotaThresholds = exports.describeQuotaThresholdAlert = exports.DEFAULT_QUOTA_THRESHOLDS = exports.QUOTA_FRESH_MAX_AGE_MS = exports.QUOTA_AGING_MAX_AGE_MS = exports.formatQuotaAge = exports.classifyQuotaFreshness = exports.resolveQuota = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.QUOTA_PROVIDER_IDS = void 0;
13
- 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.getObservedContextWindowPath = exports.recordObservedContextWindow = exports.loadObservedContextWindows = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmContextWindows = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.RESOLVED_MODEL_CATALOG_SCHEMA_VERSION = exports.resolveModelAlias = exports.registerModelAlias = exports.importResolvedModelCatalog = exports.exportResolvedModelCatalog = exports.MODEL_PROVIDER_IDS = exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = void 0;
14
- exports.fetchProviderServiceStatus = exports.diagnoseProviderFailure = exports.mergeFailingToolWindows = exports.failingToolTrend = exports.FAILING_TOOL_TREND_ARROWS = exports.scopePeakHoursToSessionProvider = exports.PEAK_HOURS_DESCRIPTION = exports.PEAK_HOURS_CACHE_MS = exports.isClaudeCodeSessionProvider = exports.getScheduledPeakHoursState = exports.fetchPeakHoursStatus = exports.DEFAULT_PEAK_HOURS_TIMEOUT_MS = exports.createPeakHoursNotApplicableState = exports._resetPeakHoursCache = exports.runDoctor = exports.getSessionDiagnostics = exports.formatHealthReport = exports.toLegacyProviderStatus = 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 = void 0;
6
+ exports.DirectoryListingCache = exports.fileFingerprintParts = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = exports.weekKey = exports.usageBucketKey = exports.summarizeUsageRows = exports.bucketUsage = exports.importSessionHistory = exports.ACTIVE_SESSION_MTIME_THRESHOLD_MS = exports.sessionSummaryFromStats = exports.removeSessionSummary = exports.markFileImported = exports.isFileImported = exports.applySessionSummary = exports.pruneUsageCache = exports.getUsageCacheDir = exports.collectUsageEvents = exports.USAGE_CACHE_VERSION = exports.MAX_USAGE_CACHE_FILES = exports.findActiveBillingBlock = exports.computeBillingBlocks = exports.BILLING_BLOCK_DURATION_MS = exports.writeStateFile = exports.readStateFile = exports.quotaToStateFile = exports.getStateFilePath = exports.billingBlockToStateFile = exports.STATE_FILE_SCHEMA_VERSION = exports.STATE_FILE_NAME = exports.sessionFingerprintParts = exports.fingerprintString = exports.readSessionReportInputs = exports.readSessionFileStats = exports.providerContextSizeFn = exports.firstUserPrompt = exports.computeSessionFileStats = exports.readSessionTranscript = exports.listRecentSessions = exports.projectSessionTranscript = exports.estimateSerializedTokens = exports.estimateTextTokens = exports.TOKEN_TOTAL_LABEL = exports.TOKEN_CONTEXT_LABEL = exports.sumTokenTotals = exports.summarizeTokens = exports.calculateNormalizedUsageCost = exports.extractNormalizedUsage = exports.normalizeProviderUsage = void 0;
7
+ exports.createSessionProviders = exports.SESSION_PROVIDER_IDS = exports.renderHandoffUrlTemplate = exports.addNote = exports.decisionFingerprint = exports.addDecision = exports.completeTask = exports.addTask = exports.withFileLockSync = exports.updateJsonStoreAtomicSync = exports.updateJsonStoreAtomic = exports.atomicWriteFileSync = 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.setConfigDir = exports.getDefaultConfigDir = exports.getConfigDirOverride = exports.getConfigDir = exports.CONFIG_DIR_ENV_VAR = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyDataStore = exports.createEmptyTokenTotals = exports.HISTORICAL_SESSION_RETENTION_LIMIT = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = exports.isAggregateCodexLimit = exports.splitWatchedPath = void 0;
8
+ exports.listSessionPreviews = exports.readCodexHistory = exports.parseMcpToolName = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionFilesWithStats = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.SESSION_ACTIVITY_STALENESS_MS = exports.SESSION_ACTIVITY_GRACE_PERIOD_MS = exports.refreshSessionActivityState = exports.detectSessionActivity = exports.classifySessionActivity = 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.walkRolloutFilesAsync = exports.walkRolloutFiles = exports.findCodexRolloutFile = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports._resetProviderDetectionCache = exports.getObservedActivityReason = exports.derivePendingUserRequestV1 = exports.createProviderSessionAdapterV1 = void 0;
9
+ 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.parseLocalDateKey = exports.formatTokenCount = exports.formatLocalDateKey = exports.formatDurationMs = exports.addLocalDays = exports.createJsonlTail = exports.toFollowEvents = exports.resolveSessionPath = 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.readSessionPreviewAsync = exports.readSessionPreview = exports.listSessionPreviewsAsync = void 0;
10
+ exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = exports.codexIdentitiesMatch = exports.readCodexAccessTokenExpiry = exports.readCodexLastRefresh = exports.readCodexAuthIdentity = exports.parseCodexAuthJson = exports.CLAUDE_REFRESH_TOKEN_LIFETIME_ESTIMATE_MS = exports.CLAUDE_ACCESS_TOKEN_LIFETIME_MS = exports.resolveClaudeRefreshExpiry = exports.isNewerClaudeCredential = exports.claudeCredentialFreshness = exports.parseClaudeCredentialBlob = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentialsRaw = exports.readClaudeMaxCredentials = exports.deleteStoredCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.formatCompactionLedger = exports.calculateCompactionLedger = exports.describeCostProvenance = exports.classifyCostProvenance = 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.MAX_SNAPSHOT_FILES = exports.pruneSnapshots = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.SessionMonitor = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = void 0;
11
+ exports.upsertSavedAccountProfile = exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.ACCOUNT_CONSUMER_REACHABILITY = exports.describeAccountConsumer = exports.detectRunningAccountConsumersSync = exports.detectRunningAccountConsumers = exports.findRunningProcessesSync = exports.findRunningProcesses = exports.keepAliveCommand = exports.refreshInactiveAccounts = exports.getAccountLaunchEnv = exports.getHealthSidecarPath = exports.readHealthSidecar = exports.listAccountsWithHealth = exports.getAccountHealth = exports.cleanupAbandonedLogins = exports.syncLiveAccountStateSync = exports.syncLiveAccountState = exports.getLastSwitchPath = exports.readLastSwitch = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.getLastSwitch = exports.undoLastSwitch = exports.switchAccountAsync = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLoginAsync = exports.finalizeAccountLogin = exports.getAccountLoginStatusAsync = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.cleanupAbandonedClaudeLogins = exports.syncClaudeLiveState = exports.switchToAccountAsync = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = void 0;
12
+ exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.QUOTA_PROVIDER_IDS = exports.FIVE_HOUR_WINDOW_MS = exports.AutoSwitchController = exports.decideAutoSwitch = exports.DEFAULT_AUTO_SWITCH_CONFIG = exports.removeLauncher = exports.writeLauncher = exports.CODEX_KEYRING_FIX_HINT = exports.getCodexCredentialStoreMode = exports.cleanupAbandonedCodexLogins = exports.syncCodexLiveState = exports.removeCodexAccount = exports.switchToCodexAccountAsync = exports.switchToCodexAccount = exports.finalizeCodexAccountAsync = exports.finalizeCodexAccount = exports.prepareCodexAccountAsync = exports.prepareCodexAccount = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.resolveActiveCodexAccount = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.readLiveClaudeIdentity = exports.readClaudeProfileIdentity = exports.isClaudeProfileAuthenticated = exports.CLAUDE_SECURESTORAGE_CONFIG_DIR_ENV = exports.buildClaudeChildEnv = exports.claudeKeychainAccountName = exports.claudeKeychainService = exports.claudeKeychainSuffix = exports.getClaudeConfigPath = exports.getDefaultClaudeHome = exports.getLiveClaudeHome = exports.getClaudeProfileHome = exports.getClaudeProfilesDir = exports.onAccountsChanged = exports.getActiveAccountStatus = exports.ACCOUNT_PROVIDER_IDS = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = void 0;
13
+ exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.resolveModelPricing = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.resolveModelContextWindow = exports.getModelContextWindowSize = exports.selectStatuslineAccount = exports.formatStatusline = exports.estimateTimeToQuota = exports.BurnRateCalculator = exports.RUNTIME_QUOTA_PROVIDER_IDS = 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.quotaFromStatuslinePayload = exports.parseClaudeStatuslinePayload = exports.evaluateQuotaThresholds = exports.describeQuotaThresholdAlert = exports.DEFAULT_QUOTA_THRESHOLDS = exports.QUOTA_FRESH_MAX_AGE_MS = exports.QUOTA_AGING_MAX_AGE_MS = exports.formatQuotaAge = exports.classifyQuotaFreshness = exports.resolveQuota = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = void 0;
14
+ 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.getObservedContextWindowPath = exports.recordObservedContextWindow = exports.loadObservedContextWindows = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmContextWindows = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.RESOLVED_MODEL_CATALOG_SCHEMA_VERSION = exports.resolveModelAlias = exports.registerModelAlias = exports.importResolvedModelCatalog = exports.exportResolvedModelCatalog = exports.MODEL_PROVIDER_IDS = exports.formatCost = exports.sortModelIds = void 0;
15
+ exports.fetchProviderServiceStatus = exports.diagnoseProviderFailure = exports.mergeFailingToolWindows = exports.failingToolTrend = exports.FAILING_TOOL_TREND_ARROWS = exports.scopePeakHoursToSessionProvider = exports.PEAK_HOURS_DESCRIPTION = exports.PEAK_HOURS_CACHE_MS = exports.isClaudeCodeSessionProvider = exports.getScheduledPeakHoursState = exports.fetchPeakHoursStatus = exports.DEFAULT_PEAK_HOURS_TIMEOUT_MS = exports.createPeakHoursNotApplicableState = exports._resetPeakHoursCache = exports.runDoctor = exports.getSessionDiagnostics = exports.formatHealthReport = exports.toLegacyProviderStatus = 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 = void 0;
15
16
  var usageNormalization_1 = require("./usageNormalization");
16
17
  Object.defineProperty(exports, "normalizeProviderUsage", { enumerable: true, get: function () { return usageNormalization_1.normalizeProviderUsage; } });
17
18
  Object.defineProperty(exports, "extractNormalizedUsage", { enumerable: true, get: function () { return usageNormalization_1.extractNormalizedUsage; } });
@@ -76,6 +77,9 @@ Object.defineProperty(exports, "ObservedSessionCollector", { enumerable: true, g
76
77
  Object.defineProperty(exports, "observedSessionSourceFromProvider", { enumerable: true, get: function () { return observedSessionCollector_1.observedSessionSourceFromProvider; } });
77
78
  Object.defineProperty(exports, "fileFingerprint", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprint; } });
78
79
  Object.defineProperty(exports, "fileFingerprintParts", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprintParts; } });
80
+ var directoryListingCache_1 = require("./providers/directoryListingCache");
81
+ Object.defineProperty(exports, "DirectoryListingCache", { enumerable: true, get: function () { return directoryListingCache_1.DirectoryListingCache; } });
82
+ Object.defineProperty(exports, "splitWatchedPath", { enumerable: true, get: function () { return directoryListingCache_1.splitWatchedPath; } });
79
83
  var codex_1 = require("./types/codex");
80
84
  Object.defineProperty(exports, "isAggregateCodexLimit", { enumerable: true, get: function () { return codex_1.isAggregateCodexLimit; } });
81
85
  var taskPersistence_1 = require("./types/taskPersistence");
@@ -352,10 +356,25 @@ Object.defineProperty(exports, "openInBrowser", { enumerable: true, get: functio
352
356
  var credentialIO_1 = require("./credentialIO");
353
357
  Object.defineProperty(exports, "readActiveCredentials", { enumerable: true, get: function () { return credentialIO_1.readActiveCredentials; } });
354
358
  Object.defineProperty(exports, "writeActiveCredentials", { enumerable: true, get: function () { return credentialIO_1.writeActiveCredentials; } });
359
+ Object.defineProperty(exports, "deleteStoredCredentials", { enumerable: true, get: function () { return credentialIO_1.deleteStoredCredentials; } });
355
360
  // Credentials
356
361
  var credentials_1 = require("./credentials");
357
362
  Object.defineProperty(exports, "readClaudeMaxCredentials", { enumerable: true, get: function () { return credentials_1.readClaudeMaxCredentials; } });
363
+ Object.defineProperty(exports, "readClaudeMaxCredentialsRaw", { enumerable: true, get: function () { return credentials_1.readClaudeMaxCredentialsRaw; } });
358
364
  Object.defineProperty(exports, "readClaudeMaxAccessTokenSync", { enumerable: true, get: function () { return credentials_1.readClaudeMaxAccessTokenSync; } });
365
+ var claudeCredentials_1 = require("./claudeCredentials");
366
+ Object.defineProperty(exports, "parseClaudeCredentialBlob", { enumerable: true, get: function () { return claudeCredentials_1.parseClaudeCredentialBlob; } });
367
+ Object.defineProperty(exports, "claudeCredentialFreshness", { enumerable: true, get: function () { return claudeCredentials_1.claudeCredentialFreshness; } });
368
+ Object.defineProperty(exports, "isNewerClaudeCredential", { enumerable: true, get: function () { return claudeCredentials_1.isNewerClaudeCredential; } });
369
+ Object.defineProperty(exports, "resolveClaudeRefreshExpiry", { enumerable: true, get: function () { return claudeCredentials_1.resolveClaudeRefreshExpiry; } });
370
+ Object.defineProperty(exports, "CLAUDE_ACCESS_TOKEN_LIFETIME_MS", { enumerable: true, get: function () { return claudeCredentials_1.CLAUDE_ACCESS_TOKEN_LIFETIME_MS; } });
371
+ Object.defineProperty(exports, "CLAUDE_REFRESH_TOKEN_LIFETIME_ESTIMATE_MS", { enumerable: true, get: function () { return claudeCredentials_1.CLAUDE_REFRESH_TOKEN_LIFETIME_ESTIMATE_MS; } });
372
+ var codexAuth_1 = require("./codexAuth");
373
+ Object.defineProperty(exports, "parseCodexAuthJson", { enumerable: true, get: function () { return codexAuth_1.parseAuthJson; } });
374
+ Object.defineProperty(exports, "readCodexAuthIdentity", { enumerable: true, get: function () { return codexAuth_1.readAuthIdentityFromRaw; } });
375
+ Object.defineProperty(exports, "readCodexLastRefresh", { enumerable: true, get: function () { return codexAuth_1.readLastRefresh; } });
376
+ Object.defineProperty(exports, "readCodexAccessTokenExpiry", { enumerable: true, get: function () { return codexAuth_1.readAccessTokenExpiry; } });
377
+ Object.defineProperty(exports, "codexIdentitiesMatch", { enumerable: true, get: function () { return codexAuth_1.identitiesMatch; } });
359
378
  // Accounts
360
379
  var ensureDefaultAccounts_1 = require("./ensureDefaultAccounts");
361
380
  Object.defineProperty(exports, "ensureDefaultAccounts", { enumerable: true, get: function () { return ensureDefaultAccounts_1.ensureDefaultAccounts; } });
@@ -365,6 +384,9 @@ Object.defineProperty(exports, "writeAccountRegistry", { enumerable: true, get:
365
384
  Object.defineProperty(exports, "readActiveClaudeAccount", { enumerable: true, get: function () { return accounts_1.readActiveClaudeAccount; } });
366
385
  Object.defineProperty(exports, "addCurrentAccount", { enumerable: true, get: function () { return accounts_1.addCurrentAccount; } });
367
386
  Object.defineProperty(exports, "switchToAccount", { enumerable: true, get: function () { return accounts_1.switchToAccount; } });
387
+ Object.defineProperty(exports, "switchToAccountAsync", { enumerable: true, get: function () { return accounts_1.switchToAccountAsync; } });
388
+ Object.defineProperty(exports, "syncClaudeLiveState", { enumerable: true, get: function () { return accounts_1.syncClaudeLiveState; } });
389
+ Object.defineProperty(exports, "cleanupAbandonedClaudeLogins", { enumerable: true, get: function () { return accounts_1.cleanupAbandonedClaudeLogins; } });
368
390
  Object.defineProperty(exports, "resolveActiveClaudeHome", { enumerable: true, get: function () { return accounts_1.resolveActiveClaudeHome; } });
369
391
  Object.defineProperty(exports, "applyActiveClaudeToLiveHome", { enumerable: true, get: function () { return accounts_1.applyActiveClaudeToLiveHome; } });
370
392
  Object.defineProperty(exports, "reconcileClaudeAuthState", { enumerable: true, get: function () { return accounts_1.reconcileClaudeAuthState; } });
@@ -382,8 +404,34 @@ Object.defineProperty(exports, "finalizeAccountLoginAsync", { enumerable: true,
382
404
  Object.defineProperty(exports, "spawnAccountLogin", { enumerable: true, get: function () { return accountManager_1.spawnAccountLogin; } });
383
405
  Object.defineProperty(exports, "switchAccount", { enumerable: true, get: function () { return accountManager_1.switchAccount; } });
384
406
  Object.defineProperty(exports, "switchAccountAsync", { enumerable: true, get: function () { return accountManager_1.switchAccountAsync; } });
407
+ Object.defineProperty(exports, "undoLastSwitch", { enumerable: true, get: function () { return accountManager_1.undoLastSwitch; } });
408
+ Object.defineProperty(exports, "getLastSwitch", { enumerable: true, get: function () { return accountManager_1.getLastSwitch; } });
385
409
  Object.defineProperty(exports, "listAllAccounts", { enumerable: true, get: function () { return accountManager_1.listAllAccounts; } });
386
410
  Object.defineProperty(exports, "resolveClaudeLoginCommand", { enumerable: true, get: function () { return accountManager_1.resolveClaudeLoginCommand; } });
411
+ var accountSwitch_1 = require("./accountSwitch");
412
+ Object.defineProperty(exports, "readLastSwitch", { enumerable: true, get: function () { return accountSwitch_1.readLastSwitch; } });
413
+ Object.defineProperty(exports, "getLastSwitchPath", { enumerable: true, get: function () { return accountSwitch_1.getLastSwitchPath; } });
414
+ var accountSync_1 = require("./accountSync");
415
+ Object.defineProperty(exports, "syncLiveAccountState", { enumerable: true, get: function () { return accountSync_1.syncLiveAccountState; } });
416
+ Object.defineProperty(exports, "syncLiveAccountStateSync", { enumerable: true, get: function () { return accountSync_1.syncLiveAccountStateSync; } });
417
+ Object.defineProperty(exports, "cleanupAbandonedLogins", { enumerable: true, get: function () { return accountSync_1.cleanupAbandonedLogins; } });
418
+ var accountHealth_1 = require("./accountHealth");
419
+ Object.defineProperty(exports, "getAccountHealth", { enumerable: true, get: function () { return accountHealth_1.getAccountHealth; } });
420
+ Object.defineProperty(exports, "listAccountsWithHealth", { enumerable: true, get: function () { return accountHealth_1.listAccountsWithHealth; } });
421
+ Object.defineProperty(exports, "readHealthSidecar", { enumerable: true, get: function () { return accountHealth_1.readHealthSidecar; } });
422
+ Object.defineProperty(exports, "getHealthSidecarPath", { enumerable: true, get: function () { return accountHealth_1.getHealthSidecarPath; } });
423
+ var accountLaunch_1 = require("./accountLaunch");
424
+ Object.defineProperty(exports, "getAccountLaunchEnv", { enumerable: true, get: function () { return accountLaunch_1.getAccountLaunchEnv; } });
425
+ var keepAlive_1 = require("./keepAlive");
426
+ Object.defineProperty(exports, "refreshInactiveAccounts", { enumerable: true, get: function () { return keepAlive_1.refreshInactiveAccounts; } });
427
+ Object.defineProperty(exports, "keepAliveCommand", { enumerable: true, get: function () { return keepAlive_1.keepAliveCommand; } });
428
+ var processDetection_1 = require("./processDetection");
429
+ Object.defineProperty(exports, "findRunningProcesses", { enumerable: true, get: function () { return processDetection_1.findRunningProcesses; } });
430
+ Object.defineProperty(exports, "findRunningProcessesSync", { enumerable: true, get: function () { return processDetection_1.findRunningProcessesSync; } });
431
+ Object.defineProperty(exports, "detectRunningAccountConsumers", { enumerable: true, get: function () { return processDetection_1.detectRunningAccountConsumers; } });
432
+ Object.defineProperty(exports, "detectRunningAccountConsumersSync", { enumerable: true, get: function () { return processDetection_1.detectRunningAccountConsumersSync; } });
433
+ Object.defineProperty(exports, "describeAccountConsumer", { enumerable: true, get: function () { return processDetection_1.describeAccountConsumer; } });
434
+ Object.defineProperty(exports, "ACCOUNT_CONSUMER_REACHABILITY", { enumerable: true, get: function () { return processDetection_1.ACCOUNT_CONSUMER_REACHABILITY; } });
387
435
  var accountRegistry_1 = require("./accountRegistry");
388
436
  Object.defineProperty(exports, "getAccountsDir", { enumerable: true, get: function () { return accountRegistry_1.getAccountsDir; } });
389
437
  Object.defineProperty(exports, "readSavedAccountRegistry", { enumerable: true, get: function () { return accountRegistry_1.readSavedAccountRegistry; } });
@@ -403,10 +451,17 @@ Object.defineProperty(exports, "onAccountsChanged", { enumerable: true, get: fun
403
451
  var claudeProfiles_1 = require("./claudeProfiles");
404
452
  Object.defineProperty(exports, "getClaudeProfilesDir", { enumerable: true, get: function () { return claudeProfiles_1.getClaudeProfilesDir; } });
405
453
  Object.defineProperty(exports, "getClaudeProfileHome", { enumerable: true, get: function () { return claudeProfiles_1.getClaudeProfileHome; } });
454
+ Object.defineProperty(exports, "getLiveClaudeHome", { enumerable: true, get: function () { return claudeProfiles_1.getLiveClaudeHome; } });
455
+ Object.defineProperty(exports, "getDefaultClaudeHome", { enumerable: true, get: function () { return claudeProfiles_1.getDefaultClaudeHome; } });
456
+ Object.defineProperty(exports, "getClaudeConfigPath", { enumerable: true, get: function () { return claudeProfiles_1.getClaudeConfigPath; } });
406
457
  Object.defineProperty(exports, "claudeKeychainSuffix", { enumerable: true, get: function () { return claudeProfiles_1.claudeKeychainSuffix; } });
407
458
  Object.defineProperty(exports, "claudeKeychainService", { enumerable: true, get: function () { return claudeProfiles_1.claudeKeychainService; } });
459
+ Object.defineProperty(exports, "claudeKeychainAccountName", { enumerable: true, get: function () { return claudeProfiles_1.claudeKeychainAccountName; } });
460
+ Object.defineProperty(exports, "buildClaudeChildEnv", { enumerable: true, get: function () { return claudeProfiles_1.buildClaudeChildEnv; } });
461
+ Object.defineProperty(exports, "CLAUDE_SECURESTORAGE_CONFIG_DIR_ENV", { enumerable: true, get: function () { return claudeProfiles_1.CLAUDE_SECURESTORAGE_CONFIG_DIR_ENV; } });
408
462
  Object.defineProperty(exports, "isClaudeProfileAuthenticated", { enumerable: true, get: function () { return claudeProfiles_1.isClaudeProfileAuthenticated; } });
409
463
  Object.defineProperty(exports, "readClaudeProfileIdentity", { enumerable: true, get: function () { return claudeProfiles_1.readClaudeProfileIdentity; } });
464
+ Object.defineProperty(exports, "readLiveClaudeIdentity", { enumerable: true, get: function () { return claudeProfiles_1.readLiveClaudeIdentity; } });
410
465
  var codexProfiles_1 = require("./codexProfiles");
411
466
  Object.defineProperty(exports, "getCodexProfilesDir", { enumerable: true, get: function () { return codexProfiles_1.getCodexProfilesDir; } });
412
467
  Object.defineProperty(exports, "getCodexProfileHome", { enumerable: true, get: function () { return codexProfiles_1.getCodexProfileHome; } });
@@ -424,11 +479,11 @@ Object.defineProperty(exports, "finalizeCodexAccountAsync", { enumerable: true,
424
479
  Object.defineProperty(exports, "switchToCodexAccount", { enumerable: true, get: function () { return codexProfiles_1.switchToCodexAccount; } });
425
480
  Object.defineProperty(exports, "switchToCodexAccountAsync", { enumerable: true, get: function () { return codexProfiles_1.switchToCodexAccountAsync; } });
426
481
  Object.defineProperty(exports, "removeCodexAccount", { enumerable: true, get: function () { return codexProfiles_1.removeCodexAccount; } });
482
+ Object.defineProperty(exports, "syncCodexLiveState", { enumerable: true, get: function () { return codexProfiles_1.syncCodexLiveState; } });
483
+ Object.defineProperty(exports, "cleanupAbandonedCodexLogins", { enumerable: true, get: function () { return codexProfiles_1.cleanupAbandonedCodexLogins; } });
484
+ Object.defineProperty(exports, "getCodexCredentialStoreMode", { enumerable: true, get: function () { return codexProfiles_1.getCodexCredentialStoreMode; } });
485
+ Object.defineProperty(exports, "CODEX_KEYRING_FIX_HINT", { enumerable: true, get: function () { return codexProfiles_1.CODEX_KEYRING_FIX_HINT; } });
427
486
  var terminalSync_1 = require("./terminalSync");
428
- Object.defineProperty(exports, "setTerminalActiveProfile", { enumerable: true, get: function () { return terminalSync_1.setTerminalActiveProfile; } });
429
- Object.defineProperty(exports, "installShellHook", { enumerable: true, get: function () { return terminalSync_1.installShellHook; } });
430
- Object.defineProperty(exports, "uninstallShellHook", { enumerable: true, get: function () { return terminalSync_1.uninstallShellHook; } });
431
- Object.defineProperty(exports, "isShellHookInstalled", { enumerable: true, get: function () { return terminalSync_1.isShellHookInstalled; } });
432
487
  Object.defineProperty(exports, "writeLauncher", { enumerable: true, get: function () { return terminalSync_1.writeLauncher; } });
433
488
  Object.defineProperty(exports, "removeLauncher", { enumerable: true, get: function () { return terminalSync_1.removeLauncher; } });
434
489
  var autoSwitch_1 = require("./autoSwitch");
@@ -0,0 +1,44 @@
1
+ import type { AccountProviderId } from './accountRegistry';
2
+ export interface KeepAliveRunner {
3
+ (command: string, args: string[], env: NodeJS.ProcessEnv, timeoutMs: number): Promise<{
4
+ status: number | null;
5
+ stdout: string;
6
+ }>;
7
+ }
8
+ export interface RefreshInactiveAccountsOptions {
9
+ providers?: AccountProviderId[];
10
+ /** Per-account CLI timeout. Default 20 s. */
11
+ timeoutMs?: number;
12
+ /** Report what would run without running it. */
13
+ dryRun?: boolean;
14
+ /** Also refresh accounts whose credential is still fresh. Default false. */
15
+ includeFresh?: boolean;
16
+ runner?: KeepAliveRunner;
17
+ now?: number;
18
+ }
19
+ export interface RefreshInactiveAccountsResult {
20
+ refreshed: Array<{
21
+ id: string;
22
+ providerId: AccountProviderId;
23
+ }>;
24
+ skipped: Array<{
25
+ id: string;
26
+ providerId: AccountProviderId;
27
+ reason: string;
28
+ }>;
29
+ failed: Array<{
30
+ id: string;
31
+ providerId: AccountProviderId;
32
+ error: string;
33
+ }>;
34
+ }
35
+ /** The command each CLI runs to load (and refresh) its stored login. */
36
+ export declare function keepAliveCommand(provider: AccountProviderId): {
37
+ command: string;
38
+ args: string[];
39
+ };
40
+ /**
41
+ * Serialised, bounded refresh of every inactive account that is `expiring`
42
+ * (or `unknown` for Claude). Never touches the live account.
43
+ */
44
+ export declare function refreshInactiveAccounts(options?: RefreshInactiveAccountsOptions): Promise<RefreshInactiveAccountsResult>;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keepAliveCommand = keepAliveCommand;
4
+ exports.refreshInactiveAccounts = refreshInactiveAccounts;
5
+ /**
6
+ * Opt-in keep-alive for saved-but-inactive accounts. Sidekick never calls the
7
+ * providers' OAuth endpoints itself: it runs the official CLI inside the
8
+ * profile's isolated home and lets the CLI refresh (and rotate) the token
9
+ * where it belongs, then re-reads the store to record the new expiry.
10
+ */
11
+ const child_process_1 = require("child_process");
12
+ const accountHealth_1 = require("./accountHealth");
13
+ const accountLaunch_1 = require("./accountLaunch");
14
+ /** The command each CLI runs to load (and refresh) its stored login. */
15
+ function keepAliveCommand(provider) {
16
+ if (provider === 'codex')
17
+ return { command: 'codex', args: ['login', 'status'] };
18
+ const override = process.env.SIDEKICK_CLAUDE_KEEPALIVE_ARGS?.trim();
19
+ return { command: 'claude', args: override ? override.split(/\s+/) : ['auth', 'status'] };
20
+ }
21
+ const defaultRunner = (command, args, env, timeoutMs) => new Promise((resolve) => {
22
+ try {
23
+ (0, child_process_1.execFile)(command, args, { encoding: 'utf8', env, timeout: timeoutMs, killSignal: 'SIGKILL', windowsHide: true }, (error, stdout) => {
24
+ const status = error
25
+ ? (error.code ?? null)
26
+ : 0;
27
+ resolve({
28
+ status: typeof status === 'number' ? status : null,
29
+ stdout: String(stdout ?? ''),
30
+ });
31
+ });
32
+ }
33
+ catch {
34
+ resolve({ status: null, stdout: '' });
35
+ }
36
+ });
37
+ function eligible(view, includeFresh) {
38
+ if (view.health.isLive)
39
+ return 'live account; the CLI refreshes it in normal use';
40
+ if (view.health.state === 'expired')
41
+ return 'expired; sign in again';
42
+ if (view.health.state === 'missing')
43
+ return 'no stored credentials';
44
+ if (view.health.state === 'fresh' && !includeFresh)
45
+ return 'fresh';
46
+ if (view.providerId === 'codex' && view.health.state === 'unknown')
47
+ return 'api-key login';
48
+ return null;
49
+ }
50
+ /**
51
+ * Serialised, bounded refresh of every inactive account that is `expiring`
52
+ * (or `unknown` for Claude). Never touches the live account.
53
+ */
54
+ async function refreshInactiveAccounts(options = {}) {
55
+ const result = { refreshed: [], skipped: [], failed: [] };
56
+ const timeoutMs = options.timeoutMs ?? 20_000;
57
+ const runner = options.runner ?? defaultRunner;
58
+ const views = (0, accountHealth_1.listAccountsWithHealth)(undefined, { now: options.now }).filter((view) => !options.providers || options.providers.includes(view.providerId));
59
+ for (const view of views) {
60
+ const reason = eligible(view, options.includeFresh ?? false);
61
+ if (reason) {
62
+ result.skipped.push({ id: view.id, providerId: view.providerId, reason });
63
+ continue;
64
+ }
65
+ const launch = (0, accountLaunch_1.getAccountLaunchEnv)(view.providerId, view.id, { materialize: true });
66
+ if (launch.error) {
67
+ result.skipped.push({ id: view.id, providerId: view.providerId, reason: launch.error });
68
+ continue;
69
+ }
70
+ const { command, args } = keepAliveCommand(view.providerId);
71
+ if (options.dryRun) {
72
+ result.skipped.push({
73
+ id: view.id,
74
+ providerId: view.providerId,
75
+ reason: `dry run: would run ${command} ${args.join(' ')}`,
76
+ });
77
+ continue;
78
+ }
79
+ const env = { ...process.env, ...launch.env };
80
+ for (const name of launch.envUnset)
81
+ delete env[name];
82
+ try {
83
+ const run = await runner(command, args, env, timeoutMs);
84
+ const after = (0, accountHealth_1.getAccountHealth)(view.providerId, view.id, {
85
+ probe: 'store',
86
+ now: options.now,
87
+ });
88
+ if (after.state === 'fresh') {
89
+ result.refreshed.push({ id: view.id, providerId: view.providerId });
90
+ }
91
+ else {
92
+ result.failed.push({
93
+ id: view.id,
94
+ providerId: view.providerId,
95
+ error: run.status === 0
96
+ ? `${command} ran but the stored credential is still ${after.state}.`
97
+ : `${command} exited with status ${run.status ?? 'unknown'}.`,
98
+ });
99
+ }
100
+ }
101
+ catch (err) {
102
+ result.failed.push({ id: view.id, providerId: view.providerId, error: String(err) });
103
+ }
104
+ }
105
+ return result;
106
+ }
package/dist/node.d.ts CHANGED
@@ -37,6 +37,9 @@ export type { CodexHistoryEntry, ReadCodexHistoryOptions } from './parsers/codex
37
37
  export { listSessionPreviews, listSessionPreviewsAsync, readSessionPreview, readSessionPreviewAsync, } from './sessionPreviews';
38
38
  export type { AsyncSessionPreviewOptions, ListSessionPreviewsAsyncOptions, ListSessionPreviewsOptions, ReadSessionPreviewAsyncOptions, ReadSessionPreviewOptions, SessionPreview, SessionPreviewListResult, SessionPreviewReadResult, } from './sessionPreviews';
39
39
  export { ObservedSessionCollector, observedSessionSourceFromProvider, fileFingerprint, fileFingerprintParts, } from './observedSessionCollector';
40
- export type { KnownObservedSessionFingerprint, ObservedSessionChange, ObservedSessionChangeBatch, ObservedSessionChangeType, ObservedSessionReference, ObservedSessionFingerprintParts, ObservedSessionSourceSubscribeOptions, ObservedSessionSubscribeOptions, ObservedSessionCollectionSource, ProviderObservedSessionCollectionSource, ObservedSessionDiagnosticKind, ObservedSessionDiagnosticPhase, ObservedSessionDiagnosticSeverity, ObservedSessionDiagnostic, ObservedSessionCollection, ObservedSessionCollectorOptions, } from './observedSessionCollector';
40
+ export type { KnownObservedSessionFingerprint, ObservedSessionChange, ObservedSessionChangeBatch, ObservedSessionChangeType, ObservedSessionReference, ObservedSessionFingerprintParts, ObservedSessionSourceSubscribeOptions, ObservedSessionSubscribeOptions, ObservedSessionCollectionSource, ProviderObservedSessionCollectionSource, ObservedSessionDiagnosticKind, ObservedSessionDiagnosticPhase, ObservedSessionDiagnosticSeverity, ObservedSessionDiagnostic, ObservedSessionCollection, ObservedSessionCollectorOptions, ObservedSessionCollectOptions, ObservedSessionDiscoverOptions, ObservedSessionDiscoveryStats, ObservedSessionDiscoveryTrigger, ObservedSessionSourceSignal, ObservedSessionSourceListener, ObservedSessionResolution, } from './observedSessionCollector';
41
+ export { DirectoryListingCache, splitWatchedPath } from './providers/directoryListingCache';
42
+ export type { CachedDirectoryListing, CachedFileStat, DirectoryListingCacheOptions, DirectoryListingCounters, ListDirectoryOptions, } from './providers/directoryListingCache';
43
+ export type { ListSessionFilesOptions, SessionEnumerationCounters, WatchedSessionFile, } from './providers/types';
41
44
  export type { ProviderServiceSeverity, ProviderServiceComponent, ProviderServiceIncident, ProviderServiceStatusFailureReason, ObservedProviderServiceStatus, UnavailableProviderServiceStatus, ProviderServiceStatus, FetchProviderServiceStatusOptions, } from './providerServiceStatusTypes';
42
45
  export { fetchProviderServiceStatus } from './providerServiceStatus';
package/dist/node.js CHANGED
@@ -8,7 +8,7 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.readSessionPreviewAsync = exports.readSessionPreview = exports.listSessionPreviewsAsync = exports.listSessionPreviews = exports.readCodexHistory = exports.walkRolloutFilesAsync = exports.walkRolloutFiles = exports.findCodexRolloutFile = exports.weekKey = exports.usageBucketKey = exports.summarizeUsageRows = exports.bucketUsage = exports.importSessionHistory = exports.ACTIVE_SESSION_MTIME_THRESHOLD_MS = exports.sessionSummaryFromStats = exports.removeSessionSummary = exports.markFileImported = exports.isFileImported = exports.applySessionSummary = exports.pruneUsageCache = exports.getUsageCacheDir = exports.collectUsageEvents = exports.USAGE_CACHE_VERSION = exports.MAX_USAGE_CACHE_FILES = exports.findActiveBillingBlock = exports.computeBillingBlocks = exports.BILLING_BLOCK_DURATION_MS = exports.writeStateFile = exports.readStateFile = exports.quotaToStateFile = exports.getStateFilePath = exports.billingBlockToStateFile = exports.STATE_FILE_SCHEMA_VERSION = exports.STATE_FILE_NAME = exports.sessionFingerprintParts = exports.fingerprintString = exports.readSessionReportInputs = exports.readSessionFileStats = exports.providerContextSizeFn = exports.firstUserPrompt = exports.computeSessionFileStats = exports.readSessionTranscript = exports.listRecentSessions = exports.getObservedContextWindowPath = exports.recordObservedContextWindow = exports.loadObservedContextWindows = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmContextWindows = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = void 0;
11
- exports.fetchProviderServiceStatus = exports.fileFingerprintParts = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = void 0;
11
+ exports.fetchProviderServiceStatus = exports.splitWatchedPath = exports.DirectoryListingCache = exports.fileFingerprintParts = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = void 0;
12
12
  var pricingCatalog_1 = require("./pricingCatalog");
13
13
  Object.defineProperty(exports, "hydratePricingCatalog", { enumerable: true, get: function () { return pricingCatalog_1.hydratePricingCatalog; } });
14
14
  Object.defineProperty(exports, "normalizeLiteLlmCatalog", { enumerable: true, get: function () { return pricingCatalog_1.normalizeLiteLlmCatalog; } });
@@ -80,5 +80,8 @@ Object.defineProperty(exports, "ObservedSessionCollector", { enumerable: true, g
80
80
  Object.defineProperty(exports, "observedSessionSourceFromProvider", { enumerable: true, get: function () { return observedSessionCollector_1.observedSessionSourceFromProvider; } });
81
81
  Object.defineProperty(exports, "fileFingerprint", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprint; } });
82
82
  Object.defineProperty(exports, "fileFingerprintParts", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprintParts; } });
83
+ var directoryListingCache_1 = require("./providers/directoryListingCache");
84
+ Object.defineProperty(exports, "DirectoryListingCache", { enumerable: true, get: function () { return directoryListingCache_1.DirectoryListingCache; } });
85
+ Object.defineProperty(exports, "splitWatchedPath", { enumerable: true, get: function () { return directoryListingCache_1.splitWatchedPath; } });
83
86
  var providerServiceStatus_1 = require("./providerServiceStatus");
84
87
  Object.defineProperty(exports, "fetchProviderServiceStatus", { enumerable: true, get: function () { return providerServiceStatus_1.fetchProviderServiceStatus; } });
@@ -12,27 +12,79 @@ export interface ObservedSessionReference {
12
12
  /** Structured fingerprint for consumers that previously parsed fingerprintHint. */
13
13
  fingerprintParts?: ObservedSessionFingerprintParts;
14
14
  }
15
+ /** Payload-free counters a source may fill while discovering. */
16
+ export interface ObservedSessionDiscoveryStats {
17
+ directoriesListed?: number;
18
+ directoriesStatted?: number;
19
+ filesStatted?: number;
20
+ }
21
+ /** Optional bounds for `discover()`. Sources that ignore them still satisfy the contract. */
22
+ export interface ObservedSessionDiscoverOptions {
23
+ /** Return at most this many references, newest first. */
24
+ limit?: number;
25
+ /** Only references modified at or after this epoch-ms. */
26
+ since?: number;
27
+ /** Out-param: fields the source leaves undefined are omitted from diagnostics. */
28
+ stats?: ObservedSessionDiscoveryStats;
29
+ }
30
+ /**
31
+ * What a source's `subscribe()` listener receives. A recursive `fs.watch`
32
+ * supplies a root-relative `filename` that lets the collector reconcile one
33
+ * session instead of rediscovering the provider.
34
+ */
35
+ export interface ObservedSessionSourceSignal {
36
+ trigger?: 'event' | 'poll';
37
+ /** Watch root the event was observed under. */
38
+ root?: string;
39
+ /** Root-relative path from `fs.watch`; null or undefined when unknown. */
40
+ filename?: string | null;
41
+ eventType?: string;
42
+ }
43
+ /**
44
+ * A string arrives when a source hands the listener straight to `fs.watch`
45
+ * (the event type); the collector treats anything but a signal object as
46
+ * "unknown" and falls back to full discovery.
47
+ */
48
+ export type ObservedSessionSourceListener = (signal?: ObservedSessionSourceSignal | string) => void;
49
+ /** How a source classifies one watch signal, resolved with at most one stat. */
50
+ export type ObservedSessionResolution = {
51
+ status: 'ignored';
52
+ } | {
53
+ status: 'unknown';
54
+ } | {
55
+ status: 'missing';
56
+ sessionId: string;
57
+ } | {
58
+ status: 'present';
59
+ reference: ObservedSessionReference;
60
+ };
15
61
  export interface ObservedSessionSourceSubscribeOptions {
16
62
  pollIntervalMs?: number;
17
63
  }
18
64
  export interface ObservedSessionCollectionSource<T = unknown> {
19
65
  providerId: string;
20
- discover(): Promise<ObservedSessionReference[]> | ObservedSessionReference[];
66
+ discover(options?: ObservedSessionDiscoverOptions): Promise<ObservedSessionReference[]> | ObservedSessionReference[];
21
67
  read(reference: ObservedSessionReference): Promise<T> | T;
22
68
  refreshCached?(reference: ObservedSessionReference, value: T, observedAt: string): Promise<T> | T;
23
69
  /** Low-level invalidation signal; the collector performs fingerprint reconciliation. */
24
- subscribe?(listener: () => void, options?: ObservedSessionSourceSubscribeOptions): {
70
+ subscribe?(listener: ObservedSessionSourceListener, options?: ObservedSessionSourceSubscribeOptions): {
25
71
  dispose(): void;
26
72
  };
73
+ /**
74
+ * Map one watch signal to one session. Absent, or when the signal has no
75
+ * filename, the collector falls back to full discovery.
76
+ */
77
+ resolveReference?(signal: ObservedSessionSourceSignal): Promise<ObservedSessionResolution> | ObservedSessionResolution;
27
78
  dispose?(): void;
28
79
  }
29
80
  export interface ProviderObservedSessionCollectionSource extends ObservedSessionCollectionSource<ObservedAgentSessionV1> {
30
81
  capabilities: ProviderCapabilitiesV1;
31
82
  }
32
- export type ObservedSessionDiagnosticKind = 'provider-discovery-failed' | 'session-read-failed' | 'provider-recovered' | 'session-recovered';
83
+ export type ObservedSessionDiagnosticKind = 'provider-discovery-failed' | 'provider-discovery-completed' | 'session-read-failed' | 'provider-recovered' | 'session-recovered';
33
84
  export type ObservedSessionDiagnosticSeverity = 'info' | 'warning' | 'error';
34
85
  export type ObservedSessionDiagnosticPhase = 'discover' | 'read' | 'recover';
35
- /** Content-safe diagnostics: identifiers and retry metadata only. */
86
+ export type ObservedSessionDiscoveryTrigger = 'event' | 'poll' | 'initial' | 'collect';
87
+ /** Content-safe diagnostics: identifiers, retry metadata, and discovery cost only. */
36
88
  export interface ObservedSessionDiagnostic {
37
89
  kind: ObservedSessionDiagnosticKind;
38
90
  severity: ObservedSessionDiagnosticSeverity;
@@ -41,6 +93,15 @@ export interface ObservedSessionDiagnostic {
41
93
  sessionId?: string;
42
94
  attempt?: number;
43
95
  retryAt?: number;
96
+ /** `provider-discovery-completed` only: what started the discovery. */
97
+ trigger?: ObservedSessionDiscoveryTrigger;
98
+ durationMs?: number;
99
+ referenceCount?: number;
100
+ directoriesListed?: number;
101
+ directoriesStatted?: number;
102
+ filesStatted?: number;
103
+ /** True when `limit` or `since` bounded the discovery. */
104
+ partial?: boolean;
44
105
  }
45
106
  export interface ObservedSessionCollection<T = unknown> {
46
107
  providerId: string;
@@ -66,6 +127,23 @@ export interface ObservedSessionCollectorOptions<T = unknown> {
66
127
  yieldBetweenReads?: () => Promise<void> | void;
67
128
  onObservation?: (observation: ObservedSessionCollection<T>) => void;
68
129
  onDiagnostic?: (diagnostic: ObservedSessionDiagnostic) => void;
130
+ /**
131
+ * Ceiling on the wait between two full discoveries of one provider
132
+ * (default 2 s). The wait actually applied is the smaller of this and four
133
+ * times the previous discovery's duration, so cheap sources stay prompt.
134
+ */
135
+ minReconcileGapMs?: number;
136
+ /** Parse-cache bound by entry count (default 20 000), least-recently-observed first. */
137
+ maxCacheEntries?: number;
138
+ /** Parse-cache bound by approximate bytes (default 128 MiB). */
139
+ maxCacheBytes?: number;
140
+ /** Size estimate per cached value; defaults to the JSON length, computed once per parse. */
141
+ approximateValueBytes?: (value: T) => number;
142
+ }
143
+ /** Bounds for one `collect()`; a bounded pass never evicts sessions outside it. */
144
+ export interface ObservedSessionCollectOptions {
145
+ limit?: number;
146
+ since?: number;
69
147
  }
70
148
  export type ObservedSessionChangeType = 'added' | 'changed' | 'removed';
71
149
  export interface ObservedSessionChange {
@@ -90,6 +168,8 @@ export interface KnownObservedSessionFingerprint {
90
168
  export interface ObservedSessionSubscribeOptions {
91
169
  debounceMs?: number;
92
170
  pollIntervalMs?: number;
171
+ /** Overrides the collector's `minReconcileGapMs` for this subscription. */
172
+ minReconcileGapMs?: number;
93
173
  knownFingerprints?: readonly KnownObservedSessionFingerprint[];
94
174
  }
95
175
  /**
@@ -101,16 +181,33 @@ export declare class ObservedSessionCollector<T = unknown> {
101
181
  private readonly failures;
102
182
  private readonly cache;
103
183
  private readonly subscriptions;
184
+ /** Latest complete reference set per provider, kept current by scoped reconciles. */
185
+ private readonly lastDiscovery;
186
+ /** One full discovery per provider at a time; concurrent callers share it. */
187
+ private readonly inflightDiscovery;
188
+ private readonly fullPassState;
189
+ /** Scoped results newer than an in-flight walk, so the walk cannot undo them. */
190
+ private readonly scopedReferences;
191
+ private generation;
192
+ private passId;
104
193
  private readonly initialBackoffMs;
105
194
  private readonly maxBackoffMs;
106
195
  private readonly clock;
107
196
  private readonly maxConcurrentReads;
197
+ private readonly minReconcileGapMs;
108
198
  private readonly yieldBetweenReads;
109
199
  constructor(options: ObservedSessionCollectorOptions<T>);
110
- collect(): Promise<ObservedSessionCollection<T>[]>;
200
+ collect(options?: ObservedSessionCollectOptions): Promise<ObservedSessionCollection<T>[]>;
201
+ /** Number of parsed sessions currently cached. */
202
+ get cacheSize(): number;
111
203
  /**
112
204
  * Subscribe to debounced provider changes. The listener receives fingerprints
113
205
  * only; call collect() to consume changed sessions through the parse cache.
206
+ *
207
+ * A signal that names a file is reconciled with one stat. Signals without a
208
+ * filename, catch-up polls, and the initial pass run a full discovery, at
209
+ * most once per gap per provider; bursts inside the debounce window join a
210
+ * single trailing pass.
114
211
  */
115
212
  subscribe(listener: (batch: ObservedSessionChangeBatch) => void, options?: ObservedSessionSubscribeOptions): {
116
213
  dispose(): void;
@@ -121,6 +218,21 @@ export declare class ObservedSessionCollector<T = unknown> {
121
218
  private collectSession;
122
219
  private makeObservation;
123
220
  private emitObservation;
221
+ /**
222
+ * Runs `discover()` once per provider at a time. Unbounded discoveries are
223
+ * shared with concurrent callers and update the gap bookkeeping; every
224
+ * discovery emits one payload-free cost diagnostic.
225
+ */
226
+ private runDiscovery;
227
+ /**
228
+ * Starts (or joins) a discovery and reports the generation it started at,
229
+ * so a reconcile that joins a walk begun earlier by `collect()` compares
230
+ * scoped results against the walk's start rather than its own entry.
231
+ */
232
+ private startDiscovery;
233
+ private effectiveGapMs;
234
+ /** Reconcile one watch signal against `known` with at most one stat. */
235
+ private reconcileSignal;
124
236
  private reconcileSource;
125
237
  private fingerprint;
126
238
  private evictMissing;