sidekick-shared 0.24.5 → 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 (76) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +159 -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/accountRegistry.d.ts +3 -1
  8. package/dist/accountRegistry.js +5 -0
  9. package/dist/browser.d.ts +8 -3
  10. package/dist/browser.js +15 -1
  11. package/dist/codexQuotaWatcher.d.ts +6 -0
  12. package/dist/codexQuotaWatcher.js +101 -47
  13. package/dist/index.d.ts +23 -13
  14. package/dist/index.js +34 -10
  15. package/dist/modelAliases.d.ts +13 -0
  16. package/dist/modelAliases.js +58 -0
  17. package/dist/modelCatalog.d.ts +32 -0
  18. package/dist/modelCatalog.js +145 -0
  19. package/dist/modelContext.d.ts +36 -3
  20. package/dist/modelContext.js +109 -34
  21. package/dist/modelInfo.d.ts +30 -1
  22. package/dist/modelInfo.js +116 -26
  23. package/dist/multiProviderQuotaService.d.ts +8 -0
  24. package/dist/multiProviderQuotaService.js +64 -3
  25. package/dist/node.d.ts +4 -4
  26. package/dist/node.js +4 -1
  27. package/dist/observedSessionCollector.d.ts +75 -4
  28. package/dist/observedSessionCollector.js +452 -42
  29. package/dist/parsers/codexHistory.d.ts +4 -2
  30. package/dist/parsers/codexHistory.js +9 -2
  31. package/dist/parsers/sessionActivityDetector.d.ts +6 -0
  32. package/dist/parsers/sessionActivityDetector.js +17 -0
  33. package/dist/providerIds.d.ts +11 -0
  34. package/dist/providerIds.js +9 -0
  35. package/dist/providerQuota.d.ts +3 -1
  36. package/dist/providerQuota.js +3 -0
  37. package/dist/providers/claudeCode.d.ts +10 -1
  38. package/dist/providers/claudeCode.js +204 -39
  39. package/dist/providers/codex.d.ts +18 -1
  40. package/dist/providers/codex.js +269 -40
  41. package/dist/providers/codexDatabase.d.ts +9 -0
  42. package/dist/providers/codexDatabase.js +107 -2
  43. package/dist/providers/diagnostics.d.ts +13 -0
  44. package/dist/providers/diagnostics.js +88 -0
  45. package/dist/providers/factory.d.ts +14 -0
  46. package/dist/providers/factory.js +57 -0
  47. package/dist/providers/openCode.d.ts +20 -1
  48. package/dist/providers/openCode.js +361 -11
  49. package/dist/providers/openCodeDatabase.d.ts +10 -0
  50. package/dist/providers/openCodeDatabase.js +69 -0
  51. package/dist/providers/types.d.ts +52 -2
  52. package/dist/providers/types.js +4 -0
  53. package/dist/quota.d.ts +4 -1
  54. package/dist/quota.js +3 -7
  55. package/dist/quotaHistory.d.ts +2 -1
  56. package/dist/quotaPoller.d.ts +13 -1
  57. package/dist/quotaPoller.js +65 -3
  58. package/dist/schemas/accountManager.d.ts +2 -2
  59. package/dist/schemas/accountManager.js +2 -4
  60. package/dist/schemas/accountStatus.d.ts +3 -0
  61. package/dist/schemas/accountStatus.js +1 -0
  62. package/dist/schemas/index.d.ts +1 -0
  63. package/dist/schemas/index.js +7 -2
  64. package/dist/schemas/observedSessionV1.d.ts +27 -26
  65. package/dist/schemas/observedSessionV1.js +6 -4
  66. package/dist/schemas/quota.d.ts +2 -2
  67. package/dist/schemas/quota.js +3 -6
  68. package/dist/schemas/quotaHistory.d.ts +2 -2
  69. package/dist/schemas/tokenEstimation.d.ts +1 -1
  70. package/dist/sessionMonitor.d.ts +15 -0
  71. package/dist/sessionMonitor.js +142 -0
  72. package/dist/sessionPreviews.d.ts +26 -1
  73. package/dist/sessionPreviews.js +319 -4
  74. package/dist/types/observedSessionV1.d.ts +6 -2
  75. package/dist/types/observedSessionV1.js +14 -8
  76. package/package.json +22 -1
@@ -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;