sidekick-shared 0.28.3 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +149 -19
  3. package/dist/authStatus.d.ts +54 -0
  4. package/dist/authStatus.js +91 -0
  5. package/dist/browser.d.ts +12 -6
  6. package/dist/browser.js +17 -1
  7. package/dist/codex.d.ts +23 -0
  8. package/dist/codex.js +44 -0
  9. package/dist/codexProfiles.d.ts +1 -0
  10. package/dist/codexProfiles.js +8 -11
  11. package/dist/esm/authStatus.js +87 -0
  12. package/dist/esm/browser.js +4 -2
  13. package/dist/esm/codex.js +18 -0
  14. package/dist/esm/codexProfiles.js +8 -11
  15. package/dist/esm/formatting.js +10 -1
  16. package/dist/esm/index.js +9 -6
  17. package/dist/esm/modelCatalog.js +2 -1
  18. package/dist/esm/modelInfo.js +422 -45
  19. package/dist/esm/node.js +9 -3
  20. package/dist/esm/parsers/codexParser.js +175 -54
  21. package/dist/esm/parsers/codexRolloutOrigin.js +107 -0
  22. package/dist/esm/parsers/openCodeParser.js +83 -21
  23. package/dist/esm/pricing.js +18 -0
  24. package/dist/esm/pricingCatalog.js +14 -7
  25. package/dist/esm/promptHistory.js +66 -4
  26. package/dist/esm/providerFailure.js +124 -3
  27. package/dist/esm/providers/codex.js +2 -24
  28. package/dist/esm/providers/codexDatabase.js +3 -19
  29. package/dist/esm/providers/codexRollouts.js +24 -1
  30. package/dist/esm/providers/openCode.js +9 -17
  31. package/dist/esm/report/htmlReportGenerator.js +42 -5
  32. package/dist/esm/report/transcriptParser.js +13 -11
  33. package/dist/esm/schemas/providerFailure.js +3 -1
  34. package/dist/esm/schemas/transcript.js +4 -0
  35. package/dist/esm/sessionPromptHistory.js +2 -2
  36. package/dist/esm/statusline/payload.js +9 -0
  37. package/dist/esm/testing/credentialGuard.js +87 -5
  38. package/dist/esm/toolCallOrigins.js +310 -0
  39. package/dist/esm/transcript.js +42 -3
  40. package/dist/esm/usage/usageEvents.js +146 -17
  41. package/dist/esm/usage/usageReports.js +39 -6
  42. package/dist/esm/watchers/jsonlTail.js +378 -59
  43. package/dist/formatting.d.ts +26 -1
  44. package/dist/formatting.js +11 -1
  45. package/dist/index.d.ts +16 -10
  46. package/dist/index.js +35 -12
  47. package/dist/modelCatalog.js +2 -1
  48. package/dist/modelInfo.d.ts +185 -16
  49. package/dist/modelInfo.js +431 -47
  50. package/dist/node.d.ts +16 -5
  51. package/dist/node.js +31 -2
  52. package/dist/parsers/codexParser.d.ts +55 -0
  53. package/dist/parsers/codexParser.js +175 -54
  54. package/dist/parsers/codexRolloutOrigin.d.ts +49 -0
  55. package/dist/parsers/codexRolloutOrigin.js +111 -0
  56. package/dist/parsers/openCodeParser.d.ts +38 -0
  57. package/dist/parsers/openCodeParser.js +86 -21
  58. package/dist/pricing.d.ts +22 -0
  59. package/dist/pricing.js +50 -0
  60. package/dist/pricingCatalog.d.ts +10 -0
  61. package/dist/pricingCatalog.js +13 -6
  62. package/dist/promptHistory.d.ts +65 -4
  63. package/dist/promptHistory.js +68 -5
  64. package/dist/providerFailure.d.ts +44 -0
  65. package/dist/providerFailure.js +126 -4
  66. package/dist/providers/codex.d.ts +3 -22
  67. package/dist/providers/codex.js +3 -26
  68. package/dist/providers/codexDatabase.d.ts +3 -2
  69. package/dist/providers/codexDatabase.js +4 -22
  70. package/dist/providers/codexRollouts.d.ts +22 -0
  71. package/dist/providers/codexRollouts.js +24 -0
  72. package/dist/providers/openCode.js +8 -16
  73. package/dist/report/htmlReportGenerator.js +42 -5
  74. package/dist/report/transcriptParser.d.ts +10 -1
  75. package/dist/report/transcriptParser.js +13 -11
  76. package/dist/schemas/providerFailure.d.ts +39 -0
  77. package/dist/schemas/providerFailure.js +2 -0
  78. package/dist/schemas/transcript.d.ts +2 -0
  79. package/dist/schemas/transcript.js +4 -0
  80. package/dist/sessionPromptHistory.d.ts +7 -1
  81. package/dist/sessionPromptHistory.js +1 -1
  82. package/dist/statusline/payload.d.ts +10 -0
  83. package/dist/statusline/payload.js +14 -0
  84. package/dist/testing/credentialGuard.d.ts +14 -0
  85. package/dist/testing/credentialGuard.js +87 -5
  86. package/dist/toolCallOrigins.d.ts +70 -0
  87. package/dist/toolCallOrigins.js +346 -0
  88. package/dist/transcript.d.ts +12 -0
  89. package/dist/transcript.js +42 -3
  90. package/dist/types/opencode.d.ts +2 -0
  91. package/dist/usage/usageEvents.d.ts +54 -6
  92. package/dist/usage/usageEvents.js +146 -17
  93. package/dist/usage/usageReports.d.ts +35 -4
  94. package/dist/usage/usageReports.js +39 -6
  95. package/dist/watchers/jsonlTail.d.ts +101 -4
  96. package/dist/watchers/jsonlTail.js +380 -60
  97. package/package.json +41 -1
package/dist/browser.js CHANGED
@@ -10,7 +10,8 @@
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.resolveModelPricing = exports.getModelPricing = exports.parseModelId = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.SESSION_PROVIDER_IDS = exports.RUNTIME_QUOTA_PROVIDER_IDS = exports.QUOTA_PROVIDER_IDS = exports.MODEL_PROVIDER_IDS = exports.ACCOUNT_PROVIDER_IDS = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.parseMcpToolName = exports.parseLocalDateKey = exports.formatTokenCount = exports.formatLocalDateKey = exports.formatDurationMs = exports.addLocalDays = exports.projectSessionTranscript = exports.estimateSerializedTokens = exports.estimateTextTokens = exports.ASCII_CHARS_PER_TOKEN = exports.SYNTHETIC_MODEL = exports.ClaudeUsageDeduper = exports.TOKEN_TOTAL_LABEL = exports.TOKEN_SUBAGENTS_LABEL = exports.TOKEN_SESSION_TOTAL_LABEL = exports.TOKEN_MAIN_THREAD_LABEL = exports.TOKEN_CONTEXT_LABEL = exports.sumTokenTotals = exports.summarizeTokens = exports.formatTokenBreakdown = exports.calculateNormalizedUsageCost = exports.extractNormalizedUsage = exports.normalizeProviderUsage = exports.DEFAULT_CONTEXT_WINDOW = exports.resolveModelContextWindow = exports.getModelContextWindowSize = void 0;
13
- exports.quotaWindowShortLabel = exports.quotaWindowLabel = exports.quotaWindowHasData = exports.quotaWindowApplies = exports.formatExtraUsage = exports.extraQuotaRows = exports.claudePlanLabel = exports.TOOL_CATEGORIES = exports.classifyTool = exports.renderHandoffUrlTemplate = exports.isHumanPrompt = exports.humanPromptText = exports.HUMAN_CODEX_SOURCES = exports.HUMAN_CLAUDE_ENTRYPOINTS = exports.resolveCodexCallUsage = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.DEFAULT_MAX_TRACKED_TOOL_CALLS = exports.CodexRolloutParser = exports.isAggregateCodexLimit = exports.PROVIDER_RECOVERY_ACTIONS = exports.PROVIDER_FAILURE_EVIDENCE_SOURCES = exports.PROVIDER_FAILURE_CODES = exports.PROVIDER_CREDENTIAL_KINDS = exports.PROVIDER_AUTHENTICATION_STATES = exports.PROVIDER_AUTHENTICATION_SOURCES = exports.diagnoseProviderFailure = exports.mergeFailingToolWindows = exports.failingToolTrend = exports.FAILING_TOOL_TREND_ARROWS = exports.sessionSummaryFromStats = exports.removeSessionSummary = exports.markFileImported = exports.isFileImported = exports.applySessionSummary = exports.weekKey = exports.usageBucketKey = exports.summarizeUsageRows = exports.bucketUsage = exports.findActiveBillingBlock = exports.computeBillingBlocks = exports.BILLING_BLOCK_DURATION_MS = exports.RESOLVED_MODEL_CATALOG_SCHEMA_VERSION = exports.resolveModelAlias = exports.registerModelAlias = exports.importResolvedModelCatalog = exports.exportResolvedModelCatalog = exports.formatCost = exports.sortModelIds = void 0;
13
+ exports.HUMAN_CLAUDE_ENTRYPOINTS = exports.codexSpawnParentFromSource = exports.codexRolloutOrigin = exports.resolveCodexCallUsage = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.DEFAULT_MAX_TRACKED_TOOL_CALLS = exports.CodexRolloutParser = exports.isAggregateCodexLimit = exports.parseCodexLoginStatus = exports.parseClaudeAuthStatus = exports.decodeCodexErrorInfo = exports.CODEX_ERROR_INFO_KINDS = exports.PROVIDER_RECOVERY_ACTIONS = exports.PROVIDER_FAILURE_EVIDENCE_SOURCES = exports.PROVIDER_FAILURE_CODES = exports.PROVIDER_CREDENTIAL_KINDS = exports.PROVIDER_AUTHENTICATION_STATES = exports.PROVIDER_AUTHENTICATION_SOURCES = exports.diagnoseProviderFailure = exports.mergeFailingToolWindows = exports.failingToolTrend = exports.FAILING_TOOL_TREND_ARROWS = exports.sessionSummaryFromStats = exports.removeSessionSummary = exports.markFileImported = exports.isFileImported = exports.applySessionSummary = exports.weekKey = exports.usageBucketKey = exports.summarizeUsageRows = exports.bucketUsage = exports.findActiveBillingBlock = exports.computeBillingBlocks = exports.BILLING_BLOCK_DURATION_MS = exports.RESOLVED_MODEL_CATALOG_SCHEMA_VERSION = exports.resolveModelAlias = exports.registerModelAlias = exports.importResolvedModelCatalog = exports.exportResolvedModelCatalog = exports.mergeCostComponents = exports.costSourceFromPricingProvenance = exports.getPricingCatalogInfo = exports.clearRegisteredModelPricing = exports.registerModelPricing = exports.isMovingModelAlias = exports.canonicalModelId = exports.formatCost = exports.sortModelIds = void 0;
14
+ exports.quotaWindowShortLabel = exports.quotaWindowLabel = exports.quotaWindowHasData = exports.quotaWindowApplies = exports.formatExtraUsage = exports.extraQuotaRows = exports.claudePlanLabel = exports.TOOL_CATEGORIES = exports.classifyTool = exports.renderHandoffUrlTemplate = exports.isHumanPrompt = exports.humanPromptText = exports.HUMAN_CODEX_SOURCES = void 0;
14
15
  var modelContext_1 = require("./modelContext");
15
16
  Object.defineProperty(exports, "getModelContextWindowSize", { enumerable: true, get: function () { return modelContext_1.getModelContextWindowSize; } });
16
17
  Object.defineProperty(exports, "resolveModelContextWindow", { enumerable: true, get: function () { return modelContext_1.resolveModelContextWindow; } });
@@ -75,6 +76,13 @@ Object.defineProperty(exports, "getModelDisplayInfo", { enumerable: true, get: f
75
76
  Object.defineProperty(exports, "compareModelIds", { enumerable: true, get: function () { return modelInfo_1.compareModelIds; } });
76
77
  Object.defineProperty(exports, "sortModelIds", { enumerable: true, get: function () { return modelInfo_1.sortModelIds; } });
77
78
  Object.defineProperty(exports, "formatCost", { enumerable: true, get: function () { return modelInfo_1.formatCost; } });
79
+ Object.defineProperty(exports, "canonicalModelId", { enumerable: true, get: function () { return modelInfo_1.canonicalModelId; } });
80
+ Object.defineProperty(exports, "isMovingModelAlias", { enumerable: true, get: function () { return modelInfo_1.isMovingModelAlias; } });
81
+ Object.defineProperty(exports, "registerModelPricing", { enumerable: true, get: function () { return modelInfo_1.registerModelPricing; } });
82
+ Object.defineProperty(exports, "clearRegisteredModelPricing", { enumerable: true, get: function () { return modelInfo_1.clearRegisteredModelPricing; } });
83
+ Object.defineProperty(exports, "getPricingCatalogInfo", { enumerable: true, get: function () { return modelInfo_1.getPricingCatalogInfo; } });
84
+ Object.defineProperty(exports, "costSourceFromPricingProvenance", { enumerable: true, get: function () { return modelInfo_1.costSourceFromPricingProvenance; } });
85
+ Object.defineProperty(exports, "mergeCostComponents", { enumerable: true, get: function () { return modelInfo_1.mergeCostComponents; } });
78
86
  var modelCatalog_1 = require("./modelCatalog");
79
87
  Object.defineProperty(exports, "exportResolvedModelCatalog", { enumerable: true, get: function () { return modelCatalog_1.exportResolvedModelCatalog; } });
80
88
  Object.defineProperty(exports, "importResolvedModelCatalog", { enumerable: true, get: function () { return modelCatalog_1.importResolvedModelCatalog; } });
@@ -108,6 +116,11 @@ Object.defineProperty(exports, "PROVIDER_CREDENTIAL_KINDS", { enumerable: true,
108
116
  Object.defineProperty(exports, "PROVIDER_FAILURE_CODES", { enumerable: true, get: function () { return providerFailure_1.PROVIDER_FAILURE_CODES; } });
109
117
  Object.defineProperty(exports, "PROVIDER_FAILURE_EVIDENCE_SOURCES", { enumerable: true, get: function () { return providerFailure_1.PROVIDER_FAILURE_EVIDENCE_SOURCES; } });
110
118
  Object.defineProperty(exports, "PROVIDER_RECOVERY_ACTIONS", { enumerable: true, get: function () { return providerFailure_1.PROVIDER_RECOVERY_ACTIONS; } });
119
+ Object.defineProperty(exports, "CODEX_ERROR_INFO_KINDS", { enumerable: true, get: function () { return providerFailure_1.CODEX_ERROR_INFO_KINDS; } });
120
+ Object.defineProperty(exports, "decodeCodexErrorInfo", { enumerable: true, get: function () { return providerFailure_1.decodeCodexErrorInfo; } });
121
+ var authStatus_1 = require("./authStatus");
122
+ Object.defineProperty(exports, "parseClaudeAuthStatus", { enumerable: true, get: function () { return authStatus_1.parseClaudeAuthStatus; } });
123
+ Object.defineProperty(exports, "parseCodexLoginStatus", { enumerable: true, get: function () { return authStatus_1.parseCodexLoginStatus; } });
111
124
  var codex_1 = require("./types/codex");
112
125
  Object.defineProperty(exports, "isAggregateCodexLimit", { enumerable: true, get: function () { return codex_1.isAggregateCodexLimit; } });
113
126
  // Codex rollout parsing (pure: no filesystem access)
@@ -118,6 +131,9 @@ Object.defineProperty(exports, "extractPatchFilePaths", { enumerable: true, get:
118
131
  Object.defineProperty(exports, "normalizeCodexToolName", { enumerable: true, get: function () { return codexParser_1.normalizeCodexToolName; } });
119
132
  Object.defineProperty(exports, "normalizeCodexToolInput", { enumerable: true, get: function () { return codexParser_1.normalizeCodexToolInput; } });
120
133
  Object.defineProperty(exports, "resolveCodexCallUsage", { enumerable: true, get: function () { return codexParser_1.resolveCodexCallUsage; } });
134
+ var codexRolloutOrigin_1 = require("./parsers/codexRolloutOrigin");
135
+ Object.defineProperty(exports, "codexRolloutOrigin", { enumerable: true, get: function () { return codexRolloutOrigin_1.codexRolloutOrigin; } });
136
+ Object.defineProperty(exports, "codexSpawnParentFromSource", { enumerable: true, get: function () { return codexRolloutOrigin_1.codexSpawnParentFromSource; } });
121
137
  var humanPrompt_1 = require("./humanPrompt");
122
138
  Object.defineProperty(exports, "HUMAN_CLAUDE_ENTRYPOINTS", { enumerable: true, get: function () { return humanPrompt_1.HUMAN_CLAUDE_ENTRYPOINTS; } });
123
139
  Object.defineProperty(exports, "HUMAN_CODEX_SOURCES", { enumerable: true, get: function () { return humanPrompt_1.HUMAN_CODEX_SOURCES; } });
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `sidekick-shared/codex` — a small Node-only entry for Codex homes, the
3
+ * child-process environment, `auth.json` helpers, credential-store mode,
4
+ * rollout lookup, and the atomic JSON writers those helpers rely on.
5
+ *
6
+ * Loads a handful of modules and no Zod, so a host that only launches or
7
+ * locates Codex does not pay for the full `sidekick-shared/node` surface.
8
+ * Everything here is also exported from the package root and from
9
+ * `sidekick-shared/node`.
10
+ *
11
+ * @module codex
12
+ */
13
+ export { getSystemCodexHome, resolveSidekickCodexHome, getCodexExecutionEnv, getCodexMonitoringHomes, getCodexSessionsDirs, getCodexCredentialStoreMode, forceFileCredentialStore, CODEX_SESSIONS_SUBDIR, CODEX_ARCHIVED_SESSIONS_SUBDIR, } from './codexPaths';
14
+ export type { CodexCredentialStoreMode, CodexSessionsDirsOptions } from './codexPaths';
15
+ export { parseAuthJson as parseCodexAuthJson, readAuthIdentityFromRaw as readCodexAuthIdentity, readLastRefresh as readCodexLastRefresh, readAccessTokenExpiry as readCodexAccessTokenExpiry, identitiesMatch as codexIdentitiesMatch, codexRefreshFingerprint, compareCodexAuthFreshness, } from './codexAuth';
16
+ export type { CodexAuthIdentity, CodexAuthJsonFile } from './codexAuth';
17
+ export { findCodexRolloutFile } from './providers/codexRollouts';
18
+ export type { FindCodexRolloutFileOptions } from './providers/codexRollouts';
19
+ export { atomicWriteJson, atomicWriteJsonSync } from './writers/atomic';
20
+ export { parseClaudeAuthStatus, parseCodexLoginStatus } from './authStatus';
21
+ export type { ParsedClaudeAuthStatus, ParsedCodexLoginStatus } from './authStatus';
22
+ export { codexRolloutOrigin, codexSpawnParentFromSource } from './parsers/codexRolloutOrigin';
23
+ export type { CodexRolloutOrigin } from './parsers/codexRolloutOrigin';
package/dist/codex.js ADDED
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * `sidekick-shared/codex` — a small Node-only entry for Codex homes, the
4
+ * child-process environment, `auth.json` helpers, credential-store mode,
5
+ * rollout lookup, and the atomic JSON writers those helpers rely on.
6
+ *
7
+ * Loads a handful of modules and no Zod, so a host that only launches or
8
+ * locates Codex does not pay for the full `sidekick-shared/node` surface.
9
+ * Everything here is also exported from the package root and from
10
+ * `sidekick-shared/node`.
11
+ *
12
+ * @module codex
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.codexSpawnParentFromSource = exports.codexRolloutOrigin = exports.parseCodexLoginStatus = exports.parseClaudeAuthStatus = exports.atomicWriteJsonSync = exports.atomicWriteJson = exports.findCodexRolloutFile = exports.compareCodexAuthFreshness = exports.codexRefreshFingerprint = exports.codexIdentitiesMatch = exports.readCodexAccessTokenExpiry = exports.readCodexLastRefresh = exports.readCodexAuthIdentity = exports.parseCodexAuthJson = exports.CODEX_ARCHIVED_SESSIONS_SUBDIR = exports.CODEX_SESSIONS_SUBDIR = exports.forceFileCredentialStore = exports.getCodexCredentialStoreMode = exports.getCodexSessionsDirs = exports.getCodexMonitoringHomes = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.getSystemCodexHome = void 0;
16
+ var codexPaths_1 = require("./codexPaths");
17
+ Object.defineProperty(exports, "getSystemCodexHome", { enumerable: true, get: function () { return codexPaths_1.getSystemCodexHome; } });
18
+ Object.defineProperty(exports, "resolveSidekickCodexHome", { enumerable: true, get: function () { return codexPaths_1.resolveSidekickCodexHome; } });
19
+ Object.defineProperty(exports, "getCodexExecutionEnv", { enumerable: true, get: function () { return codexPaths_1.getCodexExecutionEnv; } });
20
+ Object.defineProperty(exports, "getCodexMonitoringHomes", { enumerable: true, get: function () { return codexPaths_1.getCodexMonitoringHomes; } });
21
+ Object.defineProperty(exports, "getCodexSessionsDirs", { enumerable: true, get: function () { return codexPaths_1.getCodexSessionsDirs; } });
22
+ Object.defineProperty(exports, "getCodexCredentialStoreMode", { enumerable: true, get: function () { return codexPaths_1.getCodexCredentialStoreMode; } });
23
+ Object.defineProperty(exports, "forceFileCredentialStore", { enumerable: true, get: function () { return codexPaths_1.forceFileCredentialStore; } });
24
+ Object.defineProperty(exports, "CODEX_SESSIONS_SUBDIR", { enumerable: true, get: function () { return codexPaths_1.CODEX_SESSIONS_SUBDIR; } });
25
+ Object.defineProperty(exports, "CODEX_ARCHIVED_SESSIONS_SUBDIR", { enumerable: true, get: function () { return codexPaths_1.CODEX_ARCHIVED_SESSIONS_SUBDIR; } });
26
+ var codexAuth_1 = require("./codexAuth");
27
+ Object.defineProperty(exports, "parseCodexAuthJson", { enumerable: true, get: function () { return codexAuth_1.parseAuthJson; } });
28
+ Object.defineProperty(exports, "readCodexAuthIdentity", { enumerable: true, get: function () { return codexAuth_1.readAuthIdentityFromRaw; } });
29
+ Object.defineProperty(exports, "readCodexLastRefresh", { enumerable: true, get: function () { return codexAuth_1.readLastRefresh; } });
30
+ Object.defineProperty(exports, "readCodexAccessTokenExpiry", { enumerable: true, get: function () { return codexAuth_1.readAccessTokenExpiry; } });
31
+ Object.defineProperty(exports, "codexIdentitiesMatch", { enumerable: true, get: function () { return codexAuth_1.identitiesMatch; } });
32
+ Object.defineProperty(exports, "codexRefreshFingerprint", { enumerable: true, get: function () { return codexAuth_1.codexRefreshFingerprint; } });
33
+ Object.defineProperty(exports, "compareCodexAuthFreshness", { enumerable: true, get: function () { return codexAuth_1.compareCodexAuthFreshness; } });
34
+ var codexRollouts_1 = require("./providers/codexRollouts");
35
+ Object.defineProperty(exports, "findCodexRolloutFile", { enumerable: true, get: function () { return codexRollouts_1.findCodexRolloutFile; } });
36
+ var atomic_1 = require("./writers/atomic");
37
+ Object.defineProperty(exports, "atomicWriteJson", { enumerable: true, get: function () { return atomic_1.atomicWriteJson; } });
38
+ Object.defineProperty(exports, "atomicWriteJsonSync", { enumerable: true, get: function () { return atomic_1.atomicWriteJsonSync; } });
39
+ var authStatus_1 = require("./authStatus");
40
+ Object.defineProperty(exports, "parseClaudeAuthStatus", { enumerable: true, get: function () { return authStatus_1.parseClaudeAuthStatus; } });
41
+ Object.defineProperty(exports, "parseCodexLoginStatus", { enumerable: true, get: function () { return authStatus_1.parseCodexLoginStatus; } });
42
+ var codexRolloutOrigin_1 = require("./parsers/codexRolloutOrigin");
43
+ Object.defineProperty(exports, "codexRolloutOrigin", { enumerable: true, get: function () { return codexRolloutOrigin_1.codexRolloutOrigin; } });
44
+ Object.defineProperty(exports, "codexSpawnParentFromSource", { enumerable: true, get: function () { return codexRolloutOrigin_1.codexSpawnParentFromSource; } });
@@ -23,6 +23,7 @@ interface CodexLoginStatus {
23
23
  loggedIn: boolean;
24
24
  authMode?: 'chatgpt' | 'api-key';
25
25
  }
26
+ /** `codex login status` counts only on exit 0; the text is read by {@link parseCodexLoginStatus}. */
26
27
  export declare function parseCodexLoginStatusOutput(status: number | null, stdout: string): CodexLoginStatus;
27
28
  /**
28
29
  * Blocks the caller's event loop for up to {@link PROBE_TIMEOUT_MS}. Async code
@@ -79,6 +79,7 @@ const accountRegistry_1 = require("./accountRegistry");
79
79
  // re-serializing would drop fields added by newer codex versions, and the
80
80
  // rotated refresh token inside is only valid in its freshest form.
81
81
  const atomic_1 = require("./writers/atomic");
82
+ const authStatus_1 = require("./authStatus");
82
83
  const codexAuth_1 = require("./codexAuth");
83
84
  const codexPaths_1 = require("./codexPaths");
84
85
  const accountHealth_1 = require("./accountHealth");
@@ -285,18 +286,14 @@ function readMetadataFromLegacyCredentials(codexHome) {
285
286
  return {};
286
287
  }
287
288
  const PROBE_TIMEOUT_MS = 4000;
289
+ /** `codex login status` counts only on exit 0; the text is read by {@link parseCodexLoginStatus}. */
288
290
  function parseCodexLoginStatusOutput(status, stdout) {
289
- const trimmed = stdout.trim();
290
- if (status === 0 && /^Logged in/i.test(trimmed)) {
291
- if (/API key/i.test(trimmed)) {
292
- return { loggedIn: true, authMode: 'api-key' };
293
- }
294
- if (/ChatGPT/i.test(trimmed)) {
295
- return { loggedIn: true, authMode: 'chatgpt' };
296
- }
297
- return { loggedIn: true };
298
- }
299
- return { loggedIn: false };
291
+ if (status !== 0)
292
+ return { loggedIn: false };
293
+ const parsed = (0, authStatus_1.parseCodexLoginStatus)(stdout);
294
+ if (!parsed.loggedIn)
295
+ return { loggedIn: false };
296
+ return parsed.method ? { loggedIn: true, authMode: parsed.method } : { loggedIn: true };
300
297
  }
301
298
  /**
302
299
  * Blocks the caller's event loop for up to {@link PROBE_TIMEOUT_MS}. Async code
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Pure parsers for the provider CLIs' read-only sign-in status commands,
3
+ * `claude auth status --json` and `codex login status`. They do no I/O. The
4
+ * caller runs the command with its own environment, home, and timeout, and
5
+ * passes the output here.
6
+ *
7
+ * A status command reports which credential the CLI would use. It does not
8
+ * prove that a request will authenticate: an expired or revoked token can
9
+ * still read as logged in.
10
+ *
11
+ * @module authStatus
12
+ */
13
+ /** Larger outputs are not a status report; reading stops there. */
14
+ const MAX_STATUS_OUTPUT = 256 * 1024;
15
+ const MAX_DETAIL = 200;
16
+ function stringField(record, key) {
17
+ const value = record[key];
18
+ if (typeof value !== 'string')
19
+ return undefined;
20
+ const trimmed = value.trim();
21
+ return trimmed && trimmed.length <= 512 ? trimmed : undefined;
22
+ }
23
+ function parseJsonObject(output) {
24
+ const trimmed = output.trim();
25
+ const candidates = [trimmed];
26
+ // Tolerate warning lines printed ahead of the JSON document, which must
27
+ // then start a line and run to the end of the output.
28
+ const start = trimmed.search(/\n[ \t]*\{/);
29
+ if (start >= 0)
30
+ candidates.push(trimmed.slice(start).trim());
31
+ for (const candidate of candidates) {
32
+ if (!candidate.startsWith('{') || !candidate.endsWith('}'))
33
+ continue;
34
+ try {
35
+ const parsed = JSON.parse(candidate);
36
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
37
+ return parsed;
38
+ }
39
+ catch {
40
+ /* Try the next candidate. */
41
+ }
42
+ }
43
+ return undefined;
44
+ }
45
+ /**
46
+ * Parse the stdout of `claude auth status --json`. Claude Code exits 1 while
47
+ * printing valid signed-out JSON, so parse stdout whatever the exit status
48
+ * was. Only a JSON `"loggedIn": true` counts as logged in.
49
+ */
50
+ export function parseClaudeAuthStatus(stdout) {
51
+ const raw = typeof stdout === 'string' && stdout.length <= MAX_STATUS_OUTPUT
52
+ ? parseJsonObject(stdout)
53
+ : undefined;
54
+ if (!raw)
55
+ return { loggedIn: false };
56
+ const method = stringField(raw, 'authMethod');
57
+ const email = stringField(raw, 'email');
58
+ const subscriptionType = stringField(raw, 'subscriptionType');
59
+ return {
60
+ loggedIn: raw.loggedIn === true,
61
+ ...(method ? { method } : {}),
62
+ ...(email ? { email } : {}),
63
+ ...(subscriptionType ? { subscriptionType } : {}),
64
+ raw,
65
+ };
66
+ }
67
+ /**
68
+ * Parse the output of `codex login status`. Codex prints its status line to
69
+ * stderr (`Logged in using ChatGPT`, `Logged in using an API key - sk-…`,
70
+ * `Not logged in`), so pass both streams. The exit status is not consulted:
71
+ * callers that require exit 0 check it themselves.
72
+ */
73
+ export function parseCodexLoginStatus(stdout, stderr) {
74
+ const combined = `${typeof stdout === 'string' ? stdout : ''}\n${typeof stderr === 'string' ? stderr : ''}`.trim();
75
+ const firstLine = combined.split(/\r?\n/, 1)[0]?.trim() ?? '';
76
+ const detail = (/^(Logged in using .*?API key)\s+-\s.*$/i.exec(firstLine)?.[1] ?? firstLine)
77
+ .slice(0, MAX_DETAIL)
78
+ .trim();
79
+ const withDetail = detail ? { detail } : {};
80
+ if (!/^Logged in/i.test(combined))
81
+ return { loggedIn: false, ...withDetail };
82
+ if (/API key/i.test(combined))
83
+ return { loggedIn: true, method: 'api-key', ...withDetail };
84
+ if (/ChatGPT/i.test(combined))
85
+ return { loggedIn: true, method: 'chatgpt', ...withDetail };
86
+ return { loggedIn: true, ...withDetail };
87
+ }
@@ -18,16 +18,18 @@ export { parseMcpToolName } from './parsers/mcpToolName';
18
18
  export { buildSessionContextSnapshot, calculateSessionContextPressure, createSessionContextProjector, } from './context/sessionContext';
19
19
  export { ACCOUNT_PROVIDER_IDS, MODEL_PROVIDER_IDS, QUOTA_PROVIDER_IDS, RUNTIME_QUOTA_PROVIDER_IDS, SESSION_PROVIDER_IDS, } from './providerIds';
20
20
  export { assistantTurnEventsFromSessionEvents, extractTurnSubagents, isAssistantTurnSubagentTool, reasoningSummary, segmentAssistantTurn, } from './turns/assistantTurn';
21
- export { parseModelId, getModelPricing, resolveModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, } from './modelInfo';
21
+ export { parseModelId, getModelPricing, resolveModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, canonicalModelId, isMovingModelAlias, registerModelPricing, clearRegisteredModelPricing, getPricingCatalogInfo, costSourceFromPricingProvenance, mergeCostComponents, } from './modelInfo';
22
22
  export { exportResolvedModelCatalog, importResolvedModelCatalog, registerModelAlias, resolveModelAlias, RESOLVED_MODEL_CATALOG_SCHEMA_VERSION, } from './modelCatalog';
23
23
  export { BILLING_BLOCK_DURATION_MS, computeBillingBlocks, findActiveBillingBlock, } from './usage/billingBlocks';
24
24
  export { bucketUsage, summarizeUsageRows, usageBucketKey, weekKey } from './usage/usageReports';
25
25
  export { applySessionSummary, isFileImported, markFileImported, removeSessionSummary, sessionSummaryFromStats, } from './historicalStore';
26
26
  export { FAILING_TOOL_TREND_ARROWS, failingToolTrend, mergeFailingToolWindows, } from './failingTools';
27
- export { diagnoseProviderFailure, PROVIDER_AUTHENTICATION_SOURCES, PROVIDER_AUTHENTICATION_STATES, PROVIDER_CREDENTIAL_KINDS, PROVIDER_FAILURE_CODES, PROVIDER_FAILURE_EVIDENCE_SOURCES, PROVIDER_RECOVERY_ACTIONS, } from './providerFailure';
27
+ export { diagnoseProviderFailure, PROVIDER_AUTHENTICATION_SOURCES, PROVIDER_AUTHENTICATION_STATES, PROVIDER_CREDENTIAL_KINDS, PROVIDER_FAILURE_CODES, PROVIDER_FAILURE_EVIDENCE_SOURCES, PROVIDER_RECOVERY_ACTIONS, CODEX_ERROR_INFO_KINDS, decodeCodexErrorInfo, } from './providerFailure';
28
+ export { parseClaudeAuthStatus, parseCodexLoginStatus } from './authStatus';
28
29
  export { isAggregateCodexLimit } from './types/codex';
29
30
  // Codex rollout parsing (pure: no filesystem access)
30
31
  export { CodexRolloutParser, DEFAULT_MAX_TRACKED_TOOL_CALLS, extractPatchFilePaths, normalizeCodexToolName, normalizeCodexToolInput, resolveCodexCallUsage, } from './parsers/codexParser';
32
+ export { codexRolloutOrigin, codexSpawnParentFromSource } from './parsers/codexRolloutOrigin';
31
33
  export { HUMAN_CLAUDE_ENTRYPOINTS, HUMAN_CODEX_SOURCES, humanPromptText, isHumanPrompt, } from './humanPrompt';
32
34
  export { renderHandoffUrlTemplate } from './handoffUrl';
33
35
  // Tool categories across providers
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `sidekick-shared/codex` — a small Node-only entry for Codex homes, the
3
+ * child-process environment, `auth.json` helpers, credential-store mode,
4
+ * rollout lookup, and the atomic JSON writers those helpers rely on.
5
+ *
6
+ * Loads a handful of modules and no Zod, so a host that only launches or
7
+ * locates Codex does not pay for the full `sidekick-shared/node` surface.
8
+ * Everything here is also exported from the package root and from
9
+ * `sidekick-shared/node`.
10
+ *
11
+ * @module codex
12
+ */
13
+ export { getSystemCodexHome, resolveSidekickCodexHome, getCodexExecutionEnv, getCodexMonitoringHomes, getCodexSessionsDirs, getCodexCredentialStoreMode, forceFileCredentialStore, CODEX_SESSIONS_SUBDIR, CODEX_ARCHIVED_SESSIONS_SUBDIR, } from './codexPaths';
14
+ export { parseAuthJson as parseCodexAuthJson, readAuthIdentityFromRaw as readCodexAuthIdentity, readLastRefresh as readCodexLastRefresh, readAccessTokenExpiry as readCodexAccessTokenExpiry, identitiesMatch as codexIdentitiesMatch, codexRefreshFingerprint, compareCodexAuthFreshness, } from './codexAuth';
15
+ export { findCodexRolloutFile } from './providers/codexRollouts';
16
+ export { atomicWriteJson, atomicWriteJsonSync } from './writers/atomic';
17
+ export { parseClaudeAuthStatus, parseCodexLoginStatus } from './authStatus';
18
+ export { codexRolloutOrigin, codexSpawnParentFromSource } from './parsers/codexRolloutOrigin';
@@ -7,6 +7,7 @@ import { getAccountsDir, getActiveSavedAccount, listSavedAccountProfiles, remove
7
7
  // re-serializing would drop fields added by newer codex versions, and the
8
8
  // rotated refresh token inside is only valid in its freshest form.
9
9
  import { atomicWriteFileSync as atomicWriteFile, atomicWriteJsonSync as atomicWriteJson, withFileLockSync, } from './writers/atomic';
10
+ import { parseCodexLoginStatus } from './authStatus';
10
11
  import { identitiesMatch, codexRefreshFingerprint, compareCodexAuthFreshness, readAuthIdentityFromRaw, readLastRefresh, STALE_AUTH_THRESHOLD_MS, } from './codexAuth';
11
12
  import { ensureCodexProfileDirs, forceFileCredentialStore, getCodexCredentialStoreMode, getCodexProfileDir, getCodexProfileHome, getCodexProfileStatePath, getCodexBackupPath, getCodexLoginDir, getCodexLoginsDir, getCodexLoginHome, getCodexLoginStatePath, getCodexProfilesDir, getSystemCodexHome, readFileOrNull, resolveSidekickCodexHome, } from './codexPaths';
12
13
  import { getAccountHealth, readHealthSidecar, writeCodexHealthSidecar, } from './accountHealth';
@@ -206,18 +207,14 @@ function readMetadataFromLegacyCredentials(codexHome) {
206
207
  return {};
207
208
  }
208
209
  const PROBE_TIMEOUT_MS = 4000;
210
+ /** `codex login status` counts only on exit 0; the text is read by {@link parseCodexLoginStatus}. */
209
211
  export function parseCodexLoginStatusOutput(status, stdout) {
210
- const trimmed = stdout.trim();
211
- if (status === 0 && /^Logged in/i.test(trimmed)) {
212
- if (/API key/i.test(trimmed)) {
213
- return { loggedIn: true, authMode: 'api-key' };
214
- }
215
- if (/ChatGPT/i.test(trimmed)) {
216
- return { loggedIn: true, authMode: 'chatgpt' };
217
- }
218
- return { loggedIn: true };
219
- }
220
- return { loggedIn: false };
212
+ if (status !== 0)
213
+ return { loggedIn: false };
214
+ const parsed = parseCodexLoginStatus(stdout);
215
+ if (!parsed.loggedIn)
216
+ return { loggedIn: false };
217
+ return parsed.method ? { loggedIn: true, authMode: parsed.method } : { loggedIn: true };
221
218
  }
222
219
  /**
223
220
  * Blocks the caller's event loop for up to {@link PROBE_TIMEOUT_MS}. Async code
@@ -2,10 +2,19 @@
2
2
  * Pure display formatting helpers shared by CLI, extension host, webviews,
3
3
  * and downstream apps.
4
4
  *
5
- * This module intentionally has no Node-only imports.
5
+ * This module intentionally has no Node-only imports, and no runtime imports
6
+ * at all: bundles that only format values must not retain the pricing tables
7
+ * in `modelInfo.ts`. Type-only imports are fine.
6
8
  *
7
9
  * @module formatting
8
10
  */
11
+ export function formatCost(cost, options) {
12
+ const source = options?.source;
13
+ if (cost === null || cost === undefined || source === 'unpriced')
14
+ return '—';
15
+ const formatted = cost < 0.01 ? `$${cost.toFixed(4)}` : `$${cost.toFixed(2)}`;
16
+ return source === 'estimated' ? `${formatted} (est.)` : formatted;
17
+ }
9
18
  /** Format a token count with compact `k` / `M` suffixes. */
10
19
  export function formatTokenCount(value, options = {}) {
11
20
  if (!Number.isFinite(value))
package/dist/esm/index.js CHANGED
@@ -6,7 +6,8 @@ export { formatTokenBreakdown, summarizeTokens, sumTokenTotals, TOKEN_CONTEXT_LA
6
6
  export { ASCII_CHARS_PER_TOKEN, estimateTextTokens, estimateSerializedTokens, } from './tokenEstimation';
7
7
  export { projectSessionTranscript } from './transcript';
8
8
  export { listRecentSessions, readSessionTranscript } from './sessionTranscripts';
9
- export { collectPromptHistory, isPromptHistorySessionSettled, parsePromptHistoryCursor, } from './promptHistory';
9
+ export { collectPromptHistory, isPromptHistorySessionSettled, parsePromptHistoryCursor, PROMPT_HISTORY_ORDINAL_MAX_RECORD_BYTES, } from './promptHistory';
10
+ export { findToolCallOrigins } from './toolCallOrigins';
10
11
  export { collectSessionPromptHistory } from './sessionPromptHistory';
11
12
  export { HUMAN_CLAUDE_ENTRYPOINTS, HUMAN_CODEX_SOURCES, humanPromptText, isHumanPrompt, } from './humanPrompt';
12
13
  export { computeSessionFileStats, firstUserPrompt, providerContextSizeFn, readSessionFileStats, } from './sessionStats';
@@ -56,6 +57,7 @@ export { JsonlParser, TRUNCATION_PATTERNS } from './parsers/jsonl';
56
57
  export { normalizeToolName, normalizeToolInput, detectPlanModeFromText, convertOpenCodeMessage, parseDbMessageData, parseDbPartData, } from './parsers/openCodeParser';
57
58
  // Parsers — Codex
58
59
  export { CodexRolloutParser, DEFAULT_MAX_TRACKED_TOOL_CALLS, extractPatchFilePaths, normalizeCodexToolName, normalizeCodexToolInput, resolveCodexCallUsage, } from './parsers/codexParser';
60
+ export { codexRolloutOrigin, codexSpawnParentFromSource } from './parsers/codexRolloutOrigin';
59
61
  // Parsers — Subagent scanning
60
62
  export { scanSubagentDir, extractTaskInfo, readAgentMeta } from './parsers/subagentScanner';
61
63
  // Usage — split-line dedupe, subagent tokens, session totals
@@ -93,7 +95,7 @@ export { PlanExtractor, parsePlanMarkdown as parsePlanMarkdownShared, extractPro
93
95
  export { parseChangelog } from './parsers/changelogParser';
94
96
  export { createWatcher, resolveSessionPath } from './watchers/factory';
95
97
  export { toFollowEvents } from './watchers/eventBridge';
96
- export { createJsonlTail, DEFAULT_JSONL_TAIL_MAX_LINE_BYTES, DEFAULT_JSONL_TAIL_READ_BYTES, } from './watchers/jsonlTail';
98
+ export { createJsonlTail, DEFAULT_JSONL_TAIL_MAX_LINE_BYTES, DEFAULT_JSONL_TAIL_READ_BYTES, JSONL_TAIL_CHECKPOINT_VERSION, JsonlTailSymlinkError, } from './watchers/jsonlTail';
97
99
  // Formatters
98
100
  export { addLocalDays, formatDurationMs, formatLocalDateKey, formatTokenCount, parseLocalDateKey, } from './formatting';
99
101
  export { formatToolSummary } from './formatters/toolSummary';
@@ -125,7 +127,7 @@ export { inspectClaudeCredentialStores, repairClaudeCredentialStores, parseKeych
125
127
  // Credentials
126
128
  export { readClaudeMaxCredentials, readClaudeMaxCredentialsRaw, readClaudeMaxAccessTokenSync, } from './credentials';
127
129
  export { parseClaudeCredentialBlob, claudeCredentialFreshness, isNewerClaudeCredential, resolveClaudeRefreshExpiry, claudeRefreshFingerprint, claudeLoginOnly, mergeClaudeLoginIntoLive, CLAUDE_ACCESS_TOKEN_LIFETIME_MS, CLAUDE_REFRESH_TOKEN_LIFETIME_ESTIMATE_MS, } from './claudeCredentials';
128
- export { parseAuthJson as parseCodexAuthJson, readAuthIdentityFromRaw as readCodexAuthIdentity, readLastRefresh as readCodexLastRefresh, readAccessTokenExpiry as readCodexAccessTokenExpiry, identitiesMatch as codexIdentitiesMatch, } from './codexAuth';
130
+ export { parseAuthJson as parseCodexAuthJson, readAuthIdentityFromRaw as readCodexAuthIdentity, readLastRefresh as readCodexLastRefresh, readAccessTokenExpiry as readCodexAccessTokenExpiry, identitiesMatch as codexIdentitiesMatch, codexRefreshFingerprint, compareCodexAuthFreshness, } from './codexAuth';
129
131
  // Accounts
130
132
  export { ensureDefaultAccounts } from './ensureDefaultAccounts';
131
133
  export { readAccountRegistry, writeAccountRegistry, readActiveClaudeAccount, addCurrentAccount, switchToAccount, switchToAccountAsync, syncClaudeLiveState, cleanupAbandonedClaudeLogins, resolveActiveClaudeHome, applyActiveClaudeToLiveHome, reconcileClaudeAuthState, removeAccount, listAccounts, getActiveAccount, resolveActiveClaudeAccount, isMultiAccountEnabled, } from './accounts';
@@ -165,7 +167,7 @@ export { formatStatusline, selectStatuslineAccount } from './statusline/formatte
165
167
  // Model Context
166
168
  export { getModelContextWindowSize, resolveModelContextWindow, DEFAULT_CONTEXT_WINDOW, } from './modelContext';
167
169
  // Model Info & Pricing
168
- export { parseModelId, getModelPricing, resolveModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, MODEL_PROVIDER_IDS, } from './modelInfo';
170
+ export { parseModelId, getModelPricing, resolveModelPricing, getModelInfo, calculateCost, calculateCostWithPricing, calculateCostWithProvenance, mergeCostSources, shortModelName, getModelDisplayInfo, compareModelIds, sortModelIds, formatCost, MODEL_PROVIDER_IDS, canonicalModelId, isMovingModelAlias, registerModelPricing, clearRegisteredModelPricing, getPricingCatalogInfo, costSourceFromPricingProvenance, mergeCostComponents, } from './modelInfo';
169
171
  export { exportResolvedModelCatalog, importResolvedModelCatalog, registerModelAlias, resolveModelAlias, RESOLVED_MODEL_CATALOG_SCHEMA_VERSION, } from './modelCatalog';
170
172
  // Pricing Catalog (LiteLLM hydration) — Node-only. Safe for extension host
171
173
  // and CLI; do NOT import from browser bundles (webviews).
@@ -201,12 +203,13 @@ export { formatHealthReport, getSessionDiagnostics, runDoctor } from './doctor';
201
203
  // Peak Hours (PromoClock — third-party)
202
204
  export { _resetPeakHoursCache, createPeakHoursNotApplicableState, DEFAULT_PEAK_HOURS_TIMEOUT_MS, fetchPeakHoursStatus, getScheduledPeakHoursState, isClaudeCodeSessionProvider, PEAK_HOURS_CACHE_MS, PEAK_HOURS_DESCRIPTION, scopePeakHoursToSessionProvider, } from './peakHours';
203
205
  export { FAILING_TOOL_TREND_ARROWS, failingToolTrend, mergeFailingToolWindows, } from './failingTools';
204
- export { diagnoseProviderFailure, PROVIDER_AUTHENTICATION_SOURCES, PROVIDER_AUTHENTICATION_STATES, PROVIDER_CREDENTIAL_KINDS, PROVIDER_FAILURE_CODES, PROVIDER_FAILURE_EVIDENCE_SOURCES, PROVIDER_RECOVERY_ACTIONS, } from './providerFailure';
206
+ export { diagnoseProviderFailure, PROVIDER_AUTHENTICATION_SOURCES, PROVIDER_AUTHENTICATION_STATES, PROVIDER_CREDENTIAL_KINDS, PROVIDER_FAILURE_CODES, PROVIDER_FAILURE_EVIDENCE_SOURCES, PROVIDER_RECOVERY_ACTIONS, CODEX_ERROR_INFO_KINDS, decodeCodexErrorInfo, } from './providerFailure';
207
+ export { parseClaudeAuthStatus, parseCodexLoginStatus } from './authStatus';
205
208
  export { fetchProviderServiceStatus } from './providerServiceStatus';
206
209
  export { inspectCodexCredentialStores, repairCodexCredentialStores } from './codexCredentialDoctor';
207
210
  export { readStoredCodexAccount, syncCodexLiveStateAsync } from './codexProfiles';
208
211
  // Codex rollout directories (live and archived)
209
- export { getCodexSessionsDirs, CODEX_SESSIONS_SUBDIR, CODEX_ARCHIVED_SESSIONS_SUBDIR, } from './codexPaths';
212
+ export { getCodexSessionsDirs, forceFileCredentialStore, CODEX_SESSIONS_SUBDIR, CODEX_ARCHIVED_SESSIONS_SUBDIR, } from './codexPaths';
210
213
  // Tool categories across providers
211
214
  export { classifyTool, TOOL_CATEGORIES } from './toolCategory';
212
215
  // Workspace roots (realpath plus git worktree expansion)
@@ -28,7 +28,8 @@ export function exportResolvedModelCatalog(ids) {
28
28
  id,
29
29
  canonicalId,
30
30
  contextWindow: resolveModelContextWindow(id),
31
- pricing: resolveModelPricing(id),
31
+ // Registered prices are this realm's local configuration, never exported.
32
+ pricing: resolveModelPricing(id, { includeRegistered: false }),
32
33
  };
33
34
  }
34
35
  const selectedCanonicalIds = new Set(Object.values(models).flatMap(({ id, canonicalId }) => [id, canonicalId]));