sidekick-shared 0.24.4 → 0.25.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 (98) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +200 -52
  3. package/dist/accountChangeSignal.d.ts +3 -0
  4. package/dist/accountChangeSignal.js +19 -0
  5. package/dist/accountChanges.d.ts +21 -0
  6. package/dist/accountChanges.js +151 -0
  7. package/dist/accountManager.d.ts +13 -0
  8. package/dist/accountManager.js +60 -32
  9. package/dist/accountRegistry.d.ts +3 -1
  10. package/dist/accountRegistry.js +64 -41
  11. package/dist/accounts.js +40 -19
  12. package/dist/autoSwitch.d.ts +2 -1
  13. package/dist/autoSwitch.js +32 -7
  14. package/dist/browser.d.ts +10 -3
  15. package/dist/browser.js +17 -1
  16. package/dist/codexProfiles.d.ts +14 -0
  17. package/dist/codexProfiles.js +268 -116
  18. package/dist/codexQuotaWatcher.d.ts +6 -0
  19. package/dist/codexQuotaWatcher.js +101 -47
  20. package/dist/context/sessionContext.js +2 -4
  21. package/dist/ensureDefaultAccounts.js +4 -4
  22. package/dist/index.d.ts +32 -15
  23. package/dist/index.js +54 -9
  24. package/dist/modelAliases.d.ts +13 -0
  25. package/dist/modelAliases.js +58 -0
  26. package/dist/modelCatalog.d.ts +32 -0
  27. package/dist/modelCatalog.js +145 -0
  28. package/dist/modelContext.d.ts +36 -3
  29. package/dist/modelContext.js +109 -34
  30. package/dist/modelInfo.d.ts +30 -1
  31. package/dist/modelInfo.js +116 -26
  32. package/dist/multiProviderQuotaService.d.ts +8 -0
  33. package/dist/multiProviderQuotaService.js +64 -3
  34. package/dist/node.d.ts +8 -2
  35. package/dist/node.js +11 -1
  36. package/dist/observedContextWindows.d.ts +13 -0
  37. package/dist/observedContextWindows.js +13 -0
  38. package/dist/observedSessionCollector.d.ts +75 -4
  39. package/dist/observedSessionCollector.js +452 -42
  40. package/dist/parsers/codexHistory.d.ts +32 -0
  41. package/dist/parsers/codexHistory.js +125 -0
  42. package/dist/parsers/mcpToolName.d.ts +26 -0
  43. package/dist/parsers/mcpToolName.js +31 -0
  44. package/dist/parsers/sessionActivityDetector.d.ts +6 -0
  45. package/dist/parsers/sessionActivityDetector.js +17 -0
  46. package/dist/parsers/sessionPathResolver.d.ts +11 -4
  47. package/dist/parsers/sessionPathResolver.js +11 -4
  48. package/dist/paths.d.ts +7 -3
  49. package/dist/paths.js +7 -3
  50. package/dist/providerIds.d.ts +11 -0
  51. package/dist/providerIds.js +9 -0
  52. package/dist/providerQuota.d.ts +3 -1
  53. package/dist/providerQuota.js +3 -0
  54. package/dist/providers/claudeCode.d.ts +11 -1
  55. package/dist/providers/claudeCode.js +222 -39
  56. package/dist/providers/codex.d.ts +39 -1
  57. package/dist/providers/codex.js +326 -39
  58. package/dist/providers/codexDatabase.d.ts +9 -0
  59. package/dist/providers/codexDatabase.js +107 -2
  60. package/dist/providers/diagnostics.d.ts +13 -0
  61. package/dist/providers/diagnostics.js +88 -0
  62. package/dist/providers/factory.d.ts +14 -0
  63. package/dist/providers/factory.js +57 -0
  64. package/dist/providers/openCode.d.ts +20 -1
  65. package/dist/providers/openCode.js +361 -11
  66. package/dist/providers/openCodeDatabase.d.ts +10 -0
  67. package/dist/providers/openCodeDatabase.js +69 -0
  68. package/dist/providers/types.d.ts +57 -2
  69. package/dist/providers/types.js +4 -0
  70. package/dist/quota.d.ts +4 -1
  71. package/dist/quota.js +3 -7
  72. package/dist/quotaHistory.d.ts +3 -2
  73. package/dist/quotaHistory.js +2 -2
  74. package/dist/quotaPoller.d.ts +13 -1
  75. package/dist/quotaPoller.js +65 -3
  76. package/dist/quotaSnapshots.js +8 -77
  77. package/dist/schemas/accountManager.d.ts +2 -2
  78. package/dist/schemas/accountManager.js +2 -4
  79. package/dist/schemas/accountStatus.d.ts +3 -0
  80. package/dist/schemas/accountStatus.js +1 -0
  81. package/dist/schemas/index.d.ts +1 -0
  82. package/dist/schemas/index.js +7 -2
  83. package/dist/schemas/observedSessionV1.d.ts +27 -26
  84. package/dist/schemas/observedSessionV1.js +6 -4
  85. package/dist/schemas/quota.d.ts +2 -2
  86. package/dist/schemas/quota.js +3 -6
  87. package/dist/schemas/quotaHistory.d.ts +2 -2
  88. package/dist/schemas/tokenEstimation.d.ts +1 -1
  89. package/dist/sessionMonitor.d.ts +15 -0
  90. package/dist/sessionMonitor.js +142 -0
  91. package/dist/sessionPreviews.d.ts +85 -0
  92. package/dist/sessionPreviews.js +549 -0
  93. package/dist/sessionTranscripts.js +10 -4
  94. package/dist/types/observedSessionV1.d.ts +6 -2
  95. package/dist/types/observedSessionV1.js +14 -8
  96. package/dist/writers/atomic.d.ts +20 -0
  97. package/dist/writers/atomic.js +190 -19
  98. package/package.json +22 -1
package/dist/node.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * for browser bundles — use `sidekick-shared/browser` there.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = exports.readSessionTranscript = exports.listRecentSessions = exports.getObservedContextWindowPath = exports.recordObservedContextWindow = exports.loadObservedContextWindows = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmContextWindows = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = void 0;
10
+ exports.fileFingerprintParts = exports.fileFingerprint = exports.observedSessionSourceFromProvider = exports.ObservedSessionCollector = exports.readSessionPreviewAsync = exports.readSessionPreview = exports.listSessionPreviewsAsync = exports.listSessionPreviews = exports.readCodexHistory = exports.findCodexRolloutFile = exports.readSessionTranscript = exports.listRecentSessions = exports.getObservedContextWindowPath = exports.recordObservedContextWindow = exports.loadObservedContextWindows = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmContextWindows = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = void 0;
11
11
  var pricingCatalog_1 = require("./pricingCatalog");
12
12
  Object.defineProperty(exports, "hydratePricingCatalog", { enumerable: true, get: function () { return pricingCatalog_1.hydratePricingCatalog; } });
13
13
  Object.defineProperty(exports, "normalizeLiteLlmCatalog", { enumerable: true, get: function () { return pricingCatalog_1.normalizeLiteLlmCatalog; } });
@@ -20,7 +20,17 @@ Object.defineProperty(exports, "getObservedContextWindowPath", { enumerable: tru
20
20
  var sessionTranscripts_1 = require("./sessionTranscripts");
21
21
  Object.defineProperty(exports, "listRecentSessions", { enumerable: true, get: function () { return sessionTranscripts_1.listRecentSessions; } });
22
22
  Object.defineProperty(exports, "readSessionTranscript", { enumerable: true, get: function () { return sessionTranscripts_1.readSessionTranscript; } });
23
+ var codex_1 = require("./providers/codex");
24
+ Object.defineProperty(exports, "findCodexRolloutFile", { enumerable: true, get: function () { return codex_1.findCodexRolloutFile; } });
25
+ var codexHistory_1 = require("./parsers/codexHistory");
26
+ Object.defineProperty(exports, "readCodexHistory", { enumerable: true, get: function () { return codexHistory_1.readCodexHistory; } });
27
+ var sessionPreviews_1 = require("./sessionPreviews");
28
+ Object.defineProperty(exports, "listSessionPreviews", { enumerable: true, get: function () { return sessionPreviews_1.listSessionPreviews; } });
29
+ Object.defineProperty(exports, "listSessionPreviewsAsync", { enumerable: true, get: function () { return sessionPreviews_1.listSessionPreviewsAsync; } });
30
+ Object.defineProperty(exports, "readSessionPreview", { enumerable: true, get: function () { return sessionPreviews_1.readSessionPreview; } });
31
+ Object.defineProperty(exports, "readSessionPreviewAsync", { enumerable: true, get: function () { return sessionPreviews_1.readSessionPreviewAsync; } });
23
32
  var observedSessionCollector_1 = require("./observedSessionCollector");
24
33
  Object.defineProperty(exports, "ObservedSessionCollector", { enumerable: true, get: function () { return observedSessionCollector_1.ObservedSessionCollector; } });
25
34
  Object.defineProperty(exports, "observedSessionSourceFromProvider", { enumerable: true, get: function () { return observedSessionCollector_1.observedSessionSourceFromProvider; } });
26
35
  Object.defineProperty(exports, "fileFingerprint", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprint; } });
36
+ Object.defineProperty(exports, "fileFingerprintParts", { enumerable: true, get: function () { return observedSessionCollector_1.fileFingerprintParts; } });
@@ -14,6 +14,19 @@
14
14
  * Precedence, most-trusted first: runtime → observed (here) → LiteLLM catalog →
15
15
  * static table. See `modelContext.ts`.
16
16
  *
17
+ * ## Where the store lives — two seams, one story
18
+ *
19
+ * Reader ({@link loadObservedContextWindows}) and writer
20
+ * ({@link recordObservedContextWindow}) resolve the store path identically:
21
+ * explicit `cacheDir` option → `setConfigDir()` / `SIDEKICK_CONFIG_DIR` (via
22
+ * `getConfigDir()`) → platform default. The global config-dir override is the
23
+ * deployment-level seam external consumers use to relocate every Sidekick
24
+ * store at once; the per-call `cacheDir` is the isolation seam for tests and
25
+ * multi-tenant hosts. Providers deliberately do NOT thread `cacheDir` —
26
+ * `CodexProvider` records observations with default options, which follow the
27
+ * global override, so a default-options load always sees what a
28
+ * default-options record wrote.
29
+ *
17
30
  * @module observedContextWindows
18
31
  */
19
32
  export interface ObservedContextWindowOptions {
@@ -15,6 +15,19 @@
15
15
  * Precedence, most-trusted first: runtime → observed (here) → LiteLLM catalog →
16
16
  * static table. See `modelContext.ts`.
17
17
  *
18
+ * ## Where the store lives — two seams, one story
19
+ *
20
+ * Reader ({@link loadObservedContextWindows}) and writer
21
+ * ({@link recordObservedContextWindow}) resolve the store path identically:
22
+ * explicit `cacheDir` option → `setConfigDir()` / `SIDEKICK_CONFIG_DIR` (via
23
+ * `getConfigDir()`) → platform default. The global config-dir override is the
24
+ * deployment-level seam external consumers use to relocate every Sidekick
25
+ * store at once; the per-call `cacheDir` is the isolation seam for tests and
26
+ * multi-tenant hosts. Providers deliberately do NOT thread `cacheDir` —
27
+ * `CodexProvider` records observations with default options, which follow the
28
+ * global override, so a default-options load always sees what a
29
+ * default-options record wrote.
30
+ *
18
31
  * @module observedContextWindows
19
32
  */
20
33
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
@@ -1,24 +1,43 @@
1
- import type { ObservedAgentSessionV1, ProviderCapabilitiesV1 } from './types/observedSessionV1';
1
+ import type { ObservedAgentSessionV1, ProviderCapabilitiesV1, ProviderSessionAdapterV1Options } from './types/observedSessionV1';
2
2
  import type { SessionProviderBase } from './providers/types';
3
+ export interface ObservedSessionFingerprintParts {
4
+ sizeBytes: number;
5
+ mtimeMs: number;
6
+ }
3
7
  export interface ObservedSessionReference {
4
8
  sessionId: string;
5
9
  /** Opaque source locator used only by the source implementation. Never emitted in diagnostics. */
6
10
  sourceKey?: string;
11
+ /** Backward-compatible opaque fingerprint. */
7
12
  fingerprintHint?: string;
13
+ /** Structured fingerprint for consumers that previously parsed fingerprintHint. */
14
+ fingerprintParts?: ObservedSessionFingerprintParts;
15
+ }
16
+ export interface ObservedSessionSourceSubscribeOptions {
17
+ pollIntervalMs?: number;
8
18
  }
9
19
  export interface ObservedSessionCollectionSource<T = unknown> {
10
20
  providerId: string;
11
21
  discover(): Promise<ObservedSessionReference[]> | ObservedSessionReference[];
12
22
  read(reference: ObservedSessionReference): Promise<T> | T;
23
+ refreshCached?(reference: ObservedSessionReference, value: T, observedAt: string): Promise<T> | T;
24
+ /** Low-level invalidation signal; the collector performs fingerprint reconciliation. */
25
+ subscribe?(listener: () => void, options?: ObservedSessionSourceSubscribeOptions): {
26
+ dispose(): void;
27
+ };
13
28
  dispose?(): void;
14
29
  }
15
30
  export interface ProviderObservedSessionCollectionSource extends ObservedSessionCollectionSource<ObservedAgentSessionV1> {
16
31
  capabilities: ProviderCapabilitiesV1;
17
32
  }
18
33
  export type ObservedSessionDiagnosticKind = 'provider-discovery-failed' | 'session-read-failed' | 'provider-recovered' | 'session-recovered';
34
+ export type ObservedSessionDiagnosticSeverity = 'info' | 'warning' | 'error';
35
+ export type ObservedSessionDiagnosticPhase = 'discover' | 'read' | 'recover';
19
36
  /** Content-safe diagnostics: identifiers and retry metadata only. */
20
37
  export interface ObservedSessionDiagnostic {
21
38
  kind: ObservedSessionDiagnosticKind;
39
+ severity: ObservedSessionDiagnosticSeverity;
40
+ phase: ObservedSessionDiagnosticPhase;
22
41
  providerId: string;
23
42
  sessionId?: string;
24
43
  attempt?: number;
@@ -28,6 +47,13 @@ export interface ObservedSessionCollection<T = unknown> {
28
47
  providerId: string;
29
48
  sessionId: string;
30
49
  value: T;
50
+ fingerprint: string | null;
51
+ fingerprintParts: ObservedSessionFingerprintParts | null;
52
+ cacheHit: boolean;
53
+ /** Time this observation was returned. */
54
+ observedAt: string;
55
+ /** Time content was last parsed; unchanged on a cache hit. */
56
+ contentObservedAt: string;
31
57
  }
32
58
  export interface ObservedSessionCollectorOptions<T = unknown> {
33
59
  sources: ObservedSessionCollectionSource<T>[];
@@ -37,26 +63,69 @@ export interface ObservedSessionCollectorOptions<T = unknown> {
37
63
  now(): number;
38
64
  };
39
65
  fingerprint?: (source: ObservedSessionCollectionSource<T>, reference: ObservedSessionReference) => Promise<string | null> | string | null;
66
+ maxConcurrentReads?: number;
67
+ yieldBetweenReads?: () => Promise<void> | void;
40
68
  onObservation?: (observation: ObservedSessionCollection<T>) => void;
41
69
  onDiagnostic?: (diagnostic: ObservedSessionDiagnostic) => void;
42
70
  }
71
+ export type ObservedSessionChangeType = 'added' | 'changed' | 'removed';
72
+ export interface ObservedSessionChange {
73
+ type: ObservedSessionChangeType;
74
+ reference: ObservedSessionReference;
75
+ previousFingerprint: string | null;
76
+ previousFingerprintParts: ObservedSessionFingerprintParts | null;
77
+ fingerprint: string | null;
78
+ fingerprintParts: ObservedSessionFingerprintParts | null;
79
+ }
80
+ export interface ObservedSessionChangeBatch {
81
+ providerId: string;
82
+ changes: ObservedSessionChange[];
83
+ observedAt: string;
84
+ }
85
+ export interface KnownObservedSessionFingerprint {
86
+ providerId: string;
87
+ sessionId: string;
88
+ fingerprint: string;
89
+ fingerprintParts?: ObservedSessionFingerprintParts;
90
+ }
91
+ export interface ObservedSessionSubscribeOptions {
92
+ debounceMs?: number;
93
+ pollIntervalMs?: number;
94
+ knownFingerprints?: readonly KnownObservedSessionFingerprint[];
95
+ }
43
96
  /**
44
- * One-shot, host-scheduled observed-session collection with independent
45
- * provider/session isolation and bounded retry state.
97
+ * Fail-soft observed-session collection with fingerprint-keyed parse caching,
98
+ * cooperative reads, and optional provider-level subscriptions.
46
99
  */
47
100
  export declare class ObservedSessionCollector<T = unknown> {
48
101
  private readonly options;
49
102
  private readonly failures;
103
+ private readonly cache;
104
+ private readonly subscriptions;
50
105
  private readonly initialBackoffMs;
51
106
  private readonly maxBackoffMs;
52
107
  private readonly clock;
108
+ private readonly maxConcurrentReads;
109
+ private readonly yieldBetweenReads;
53
110
  constructor(options: ObservedSessionCollectorOptions<T>);
54
111
  collect(): Promise<ObservedSessionCollection<T>[]>;
112
+ /**
113
+ * Subscribe to debounced provider changes. The listener receives fingerprints
114
+ * only; call collect() to consume changed sessions through the parse cache.
115
+ */
116
+ subscribe(listener: (batch: ObservedSessionChangeBatch) => void, options?: ObservedSessionSubscribeOptions): {
117
+ dispose(): void;
118
+ };
55
119
  reset(): void;
56
120
  dispose(): void;
57
121
  private collectSource;
58
122
  private collectSession;
123
+ private makeObservation;
124
+ private emitObservation;
125
+ private reconcileSource;
59
126
  private fingerprint;
127
+ private evictMissing;
128
+ private mapWithConcurrency;
60
129
  private fail;
61
130
  private recover;
62
131
  private emitDiagnostic;
@@ -66,6 +135,8 @@ export declare class ObservedSessionCollector<T = unknown> {
66
135
  * Adapt a provider using path-only discovery and independent adapter reads, so
67
136
  * one malformed session cannot reject discovery of its healthy siblings.
68
137
  */
69
- export declare function observedSessionSourceFromProvider(provider: SessionProviderBase, cwd: string): ProviderObservedSessionCollectionSource;
138
+ export declare function observedSessionSourceFromProvider(provider: SessionProviderBase, cwd: string, options?: ProviderSessionAdapterV1Options): ProviderObservedSessionCollectionSource;
139
+ /** Structured size/mtime fingerprint; returns null for inaccessible or synthetic paths. */
140
+ export declare function fileFingerprintParts(sourcePath: string): ObservedSessionFingerprintParts | null;
70
141
  /** Size/mtime fingerprint suitable for retry bypass; returns null for synthetic DB locators. */
71
142
  export declare function fileFingerprint(sourcePath: string): string | null;