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.
- package/CHANGELOG.md +52 -0
- package/README.md +59 -51
- package/dist/accountChanges.js +21 -2
- package/dist/accountHealth.d.ts +72 -0
- package/dist/accountHealth.js +286 -0
- package/dist/accountLaunch.d.ts +30 -0
- package/dist/accountLaunch.js +124 -0
- package/dist/accountManager.d.ts +33 -8
- package/dist/accountManager.js +183 -50
- package/dist/accountRegistry.d.ts +10 -0
- package/dist/accountRegistry.js +42 -22
- package/dist/accountSwitch.d.ts +43 -0
- package/dist/accountSwitch.js +115 -0
- package/dist/accountSync.d.ts +30 -0
- package/dist/accountSync.js +180 -0
- package/dist/accountSyncTypes.d.ts +25 -0
- package/dist/accountSyncTypes.js +7 -0
- package/dist/accounts.d.ts +58 -6
- package/dist/accounts.js +408 -189
- package/dist/claudeCredentials.d.ts +38 -0
- package/dist/claudeCredentials.js +74 -0
- package/dist/claudeProfiles.d.ts +40 -0
- package/dist/claudeProfiles.js +102 -10
- package/dist/codexAuth.d.ts +32 -0
- package/dist/codexAuth.js +127 -0
- package/dist/codexPaths.d.ts +21 -0
- package/dist/codexPaths.js +117 -0
- package/dist/codexProfiles.d.ts +58 -5
- package/dist/codexProfiles.js +574 -289
- package/dist/credentialIO.d.ts +12 -5
- package/dist/credentialIO.js +63 -29
- package/dist/credentials.d.ts +8 -0
- package/dist/credentials.js +28 -32
- package/dist/ensureDefaultAccounts.d.ts +8 -0
- package/dist/ensureDefaultAccounts.js +42 -82
- package/dist/index.d.ts +31 -12
- package/dist/index.js +68 -13
- package/dist/keepAlive.d.ts +44 -0
- package/dist/keepAlive.js +106 -0
- package/dist/node.d.ts +4 -1
- package/dist/node.js +4 -1
- package/dist/observedSessionCollector.d.ts +117 -5
- package/dist/observedSessionCollector.js +483 -76
- package/dist/processDetection.d.ts +32 -0
- package/dist/processDetection.js +210 -0
- package/dist/providers/claudeCode.d.ts +23 -2
- package/dist/providers/claudeCode.js +143 -51
- package/dist/providers/codex.d.ts +10 -2
- package/dist/providers/codex.js +95 -12
- package/dist/providers/directoryListingCache.d.ts +85 -0
- package/dist/providers/directoryListingCache.js +244 -0
- package/dist/providers/rolloutWalker.d.ts +28 -5
- package/dist/providers/rolloutWalker.js +100 -16
- package/dist/providers/types.d.ts +48 -1
- package/dist/schemas/accountManager.d.ts +283 -1
- package/dist/schemas/accountManager.js +122 -1
- package/dist/schemas/assistantTurn.d.ts +2 -2
- package/dist/schemas/index.d.ts +6 -1
- package/dist/schemas/index.js +14 -1
- package/dist/schemas/observedSessionV1.d.ts +21 -21
- package/dist/schemas/quota.d.ts +18 -18
- package/dist/schemas/quotaHistory.d.ts +1 -1
- package/dist/schemas/stateFile.d.ts +5 -5
- package/dist/sessionMonitor.js +24 -2
- package/dist/terminalSync.d.ts +5 -5
- package/dist/terminalSync.js +7 -112
- package/dist/writers/atomic.d.ts +2 -0
- package/dist/writers/atomic.js +49 -2
- 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.
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
exports.
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
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:
|
|
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
|
-
|
|
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;
|