oc2token 0.1.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +399 -0
  3. package/dist/src/accounting/index.d.ts +1 -0
  4. package/dist/src/accounting/index.js +2 -0
  5. package/dist/src/accounting/index.js.map +1 -0
  6. package/dist/src/accounting/reducer.d.ts +21 -0
  7. package/dist/src/accounting/reducer.js +105 -0
  8. package/dist/src/accounting/reducer.js.map +1 -0
  9. package/dist/src/antigravity/discovery.d.ts +18 -0
  10. package/dist/src/antigravity/discovery.js +95 -0
  11. package/dist/src/antigravity/discovery.js.map +1 -0
  12. package/dist/src/antigravity/doctor.d.ts +6 -0
  13. package/dist/src/antigravity/doctor.js +78 -0
  14. package/dist/src/antigravity/doctor.js.map +1 -0
  15. package/dist/src/antigravity/index.d.ts +3 -0
  16. package/dist/src/antigravity/index.js +4 -0
  17. package/dist/src/antigravity/index.js.map +1 -0
  18. package/dist/src/antigravity/proto.d.ts +73 -0
  19. package/dist/src/antigravity/proto.js +259 -0
  20. package/dist/src/antigravity/proto.js.map +1 -0
  21. package/dist/src/antigravity/scanner.d.ts +8 -0
  22. package/dist/src/antigravity/scanner.js +552 -0
  23. package/dist/src/antigravity/scanner.js.map +1 -0
  24. package/dist/src/application.d.ts +73 -0
  25. package/dist/src/application.js +657 -0
  26. package/dist/src/application.js.map +1 -0
  27. package/dist/src/cache/filesystem.d.ts +8 -0
  28. package/dist/src/cache/filesystem.js +70 -0
  29. package/dist/src/cache/filesystem.js.map +1 -0
  30. package/dist/src/cache/index.d.ts +5 -0
  31. package/dist/src/cache/index.js +6 -0
  32. package/dist/src/cache/index.js.map +1 -0
  33. package/dist/src/cache/lock.d.ts +40 -0
  34. package/dist/src/cache/lock.js +227 -0
  35. package/dist/src/cache/lock.js.map +1 -0
  36. package/dist/src/cache/schema.d.ts +45 -0
  37. package/dist/src/cache/schema.js +308 -0
  38. package/dist/src/cache/schema.js.map +1 -0
  39. package/dist/src/cache/store.d.ts +46 -0
  40. package/dist/src/cache/store.js +396 -0
  41. package/dist/src/cache/store.js.map +1 -0
  42. package/dist/src/cache/types.d.ts +130 -0
  43. package/dist/src/cache/types.js +6 -0
  44. package/dist/src/cache/types.js.map +1 -0
  45. package/dist/src/cli.d.ts +8 -0
  46. package/dist/src/cli.js +874 -0
  47. package/dist/src/cli.js.map +1 -0
  48. package/dist/src/codex/discovery.d.ts +6 -0
  49. package/dist/src/codex/discovery.js +88 -0
  50. package/dist/src/codex/discovery.js.map +1 -0
  51. package/dist/src/codex/doctor.d.ts +6 -0
  52. package/dist/src/codex/doctor.js +52 -0
  53. package/dist/src/codex/doctor.js.map +1 -0
  54. package/dist/src/codex/index.d.ts +3 -0
  55. package/dist/src/codex/index.js +3 -0
  56. package/dist/src/codex/index.js.map +1 -0
  57. package/dist/src/codex/scanner.d.ts +6 -0
  58. package/dist/src/codex/scanner.js +487 -0
  59. package/dist/src/codex/scanner.js.map +1 -0
  60. package/dist/src/codex/types.d.ts +31 -0
  61. package/dist/src/codex/types.js +5 -0
  62. package/dist/src/codex/types.js.map +1 -0
  63. package/dist/src/collector/collector.d.ts +15 -0
  64. package/dist/src/collector/collector.js +597 -0
  65. package/dist/src/collector/collector.js.map +1 -0
  66. package/dist/src/collector/index.d.ts +3 -0
  67. package/dist/src/collector/index.js +3 -0
  68. package/dist/src/collector/index.js.map +1 -0
  69. package/dist/src/collector/types.d.ts +55 -0
  70. package/dist/src/collector/types.js +18 -0
  71. package/dist/src/collector/types.js.map +1 -0
  72. package/dist/src/dashboard/render/ansi.d.ts +53 -0
  73. package/dist/src/dashboard/render/ansi.js +106 -0
  74. package/dist/src/dashboard/render/ansi.js.map +1 -0
  75. package/dist/src/dashboard/render/dashboard.d.ts +13 -0
  76. package/dist/src/dashboard/render/dashboard.js +750 -0
  77. package/dist/src/dashboard/render/dashboard.js.map +1 -0
  78. package/dist/src/dashboard/render/format.d.ts +23 -0
  79. package/dist/src/dashboard/render/format.js +169 -0
  80. package/dist/src/dashboard/render/format.js.map +1 -0
  81. package/dist/src/dashboard/render/redraw.d.ts +13 -0
  82. package/dist/src/dashboard/render/redraw.js +24 -0
  83. package/dist/src/dashboard/render/redraw.js.map +1 -0
  84. package/dist/src/dashboard/render/types.d.ts +83 -0
  85. package/dist/src/dashboard/render/types.js +528 -0
  86. package/dist/src/dashboard/render/types.js.map +1 -0
  87. package/dist/src/dashboard/scheduler/index.d.ts +1 -0
  88. package/dist/src/dashboard/scheduler/index.js +2 -0
  89. package/dist/src/dashboard/scheduler/index.js.map +1 -0
  90. package/dist/src/dashboard/scheduler/refresh-scheduler.d.ts +46 -0
  91. package/dist/src/dashboard/scheduler/refresh-scheduler.js +137 -0
  92. package/dist/src/dashboard/scheduler/refresh-scheduler.js.map +1 -0
  93. package/dist/src/dashboard/settings/index.d.ts +25 -0
  94. package/dist/src/dashboard/settings/index.js +162 -0
  95. package/dist/src/dashboard/settings/index.js.map +1 -0
  96. package/dist/src/dashboard/state/index.d.ts +2 -0
  97. package/dist/src/dashboard/state/index.js +3 -0
  98. package/dist/src/dashboard/state/index.js.map +1 -0
  99. package/dist/src/dashboard/state/refresh-coordinator.d.ts +72 -0
  100. package/dist/src/dashboard/state/refresh-coordinator.js +346 -0
  101. package/dist/src/dashboard/state/refresh-coordinator.js.map +1 -0
  102. package/dist/src/dashboard/state/types.d.ts +68 -0
  103. package/dist/src/dashboard/state/types.js +2 -0
  104. package/dist/src/dashboard/state/types.js.map +1 -0
  105. package/dist/src/domain/contracts.d.ts +219 -0
  106. package/dist/src/domain/contracts.js +2 -0
  107. package/dist/src/domain/contracts.js.map +1 -0
  108. package/dist/src/domain/errors.d.ts +25 -0
  109. package/dist/src/domain/errors.js +65 -0
  110. package/dist/src/domain/errors.js.map +1 -0
  111. package/dist/src/domain/index.d.ts +5 -0
  112. package/dist/src/domain/index.js +6 -0
  113. package/dist/src/domain/index.js.map +1 -0
  114. package/dist/src/domain/records.d.ts +59 -0
  115. package/dist/src/domain/records.js +141 -0
  116. package/dist/src/domain/records.js.map +1 -0
  117. package/dist/src/domain/tokens.d.ts +51 -0
  118. package/dist/src/domain/tokens.js +93 -0
  119. package/dist/src/domain/tokens.js.map +1 -0
  120. package/dist/src/domain/windows.d.ts +59 -0
  121. package/dist/src/domain/windows.js +272 -0
  122. package/dist/src/domain/windows.js.map +1 -0
  123. package/dist/src/index.d.ts +9 -0
  124. package/dist/src/index.js +9 -0
  125. package/dist/src/index.js.map +1 -0
  126. package/dist/src/opencode/adapter.d.ts +47 -0
  127. package/dist/src/opencode/adapter.js +118 -0
  128. package/dist/src/opencode/adapter.js.map +1 -0
  129. package/dist/src/opencode/client.d.ts +64 -0
  130. package/dist/src/opencode/client.js +118 -0
  131. package/dist/src/opencode/client.js.map +1 -0
  132. package/dist/src/opencode/doctor.d.ts +28 -0
  133. package/dist/src/opencode/doctor.js +82 -0
  134. package/dist/src/opencode/doctor.js.map +1 -0
  135. package/dist/src/opencode/index.d.ts +5 -0
  136. package/dist/src/opencode/index.js +6 -0
  137. package/dist/src/opencode/index.js.map +1 -0
  138. package/dist/src/opencode/stats.d.ts +8 -0
  139. package/dist/src/opencode/stats.js +174 -0
  140. package/dist/src/opencode/stats.js.map +1 -0
  141. package/dist/src/opencode/transport.d.ts +54 -0
  142. package/dist/src/opencode/transport.js +621 -0
  143. package/dist/src/opencode/transport.js.map +1 -0
  144. package/dist/src/output/index.d.ts +20 -0
  145. package/dist/src/output/index.js +46 -0
  146. package/dist/src/output/index.js.map +1 -0
  147. package/dist/src/output/json.d.ts +72 -0
  148. package/dist/src/output/json.js +133 -0
  149. package/dist/src/output/json.js.map +1 -0
  150. package/dist/src/output/table.d.ts +4 -0
  151. package/dist/src/output/table.js +81 -0
  152. package/dist/src/output/table.js.map +1 -0
  153. package/dist/src/pricing/index.d.ts +1 -0
  154. package/dist/src/pricing/index.js +2 -0
  155. package/dist/src/pricing/index.js.map +1 -0
  156. package/dist/src/pricing/pricing.d.ts +19 -0
  157. package/dist/src/pricing/pricing.js +441 -0
  158. package/dist/src/pricing/pricing.js.map +1 -0
  159. package/package.json +27 -0
@@ -0,0 +1,308 @@
1
+ import { createHash } from "node:crypto";
2
+ import { DomainError } from "../domain/errors.js";
3
+ import { parseTokenComponents, recorded_total, } from "../domain/index.js";
4
+ import { CACHE_FORMAT, CURRENT_CACHE_SCHEMA_VERSION, RECORDS_FORMAT, } from "./types.js";
5
+ const FORBIDDEN_KEY = /(?:prompt|tool.?input|tool.?output|api.?key|authorization|password|secret|session.?title|session.?name|raw.?content)/i;
6
+ const SAFE_ID = /^[^\u0000-\u001f]{1,512}$/;
7
+ const SAFE_REVISION = /^[a-zA-Z0-9._:-]{1,256}$/;
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ function fail(message, cause) {
12
+ throw new DomainError("cache-corrupt", message, { cause });
13
+ }
14
+ function stringField(value, name, pattern = SAFE_ID) {
15
+ if (typeof value !== "string" || !pattern.test(value)) {
16
+ fail(`${name} must be a bounded string`);
17
+ }
18
+ return value;
19
+ }
20
+ function dateField(value, name) {
21
+ const date = value instanceof Date ? value : new Date(String(value));
22
+ if (Number.isNaN(date.getTime())) {
23
+ fail(`${name} must be a valid date`);
24
+ }
25
+ return date.toISOString();
26
+ }
27
+ function recordField(value, name) {
28
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
29
+ fail(`${name} must be a non-negative safe integer`);
30
+ }
31
+ return value;
32
+ }
33
+ function recordFromUnknown(value, index) {
34
+ if (!isRecord(value)) {
35
+ fail(`records[${index}] must be an object`);
36
+ }
37
+ const components = parseTokenComponents(value);
38
+ const sessionID = stringField(value.sessionID, `records[${index}].sessionID`);
39
+ const messageID = stringField(value.messageID, `records[${index}].messageID`);
40
+ const key = stringField(value.key ?? `${sessionID}/${messageID}`, `records[${index}].key`);
41
+ const model = stringField(value.model ?? "unknown", `records[${index}].model`);
42
+ const tokenRevision = stringField(value.tokenRevision ?? revisionFor(components, value.completeness), `records[${index}].tokenRevision`, SAFE_REVISION);
43
+ const completeness = value.completeness ?? "final";
44
+ if (completeness !== "final" && completeness !== "provisional") {
45
+ fail(`records[${index}].completeness must be final or provisional`);
46
+ }
47
+ const rawProvider = value.provider ?? "opencode";
48
+ if (rawProvider !== "opencode" && rawProvider !== "codex" && rawProvider !== "antigravity") {
49
+ fail(`records[${index}].provider must be one of opencode, codex, antigravity`);
50
+ }
51
+ const provider = rawProvider;
52
+ // Project field: optional, may contain slashes (paths). Validate length and control chars separately.
53
+ let project;
54
+ if (value.project !== undefined && value.project !== null) {
55
+ if (typeof value.project !== "string") {
56
+ fail(`records[${index}].project must be a string when present`);
57
+ }
58
+ const trimmed = value.project.trim();
59
+ if (trimmed.length === 0) {
60
+ project = undefined;
61
+ }
62
+ else {
63
+ if (trimmed.length > 1024 || /[\u0000-\u001f]/.test(trimmed)) {
64
+ fail(`records[${index}].project must be 1..1024 chars without control characters`);
65
+ }
66
+ project = trimmed;
67
+ }
68
+ }
69
+ const normalized = {
70
+ key,
71
+ sessionID,
72
+ messageID,
73
+ createdAt: dateField(value.createdAt, `records[${index}].createdAt`),
74
+ model,
75
+ ...components,
76
+ recorded_total: recorded_total(components),
77
+ tokenRevision,
78
+ observedAt: dateField(value.observedAt ?? new Date(), `records[${index}].observedAt`),
79
+ completeness,
80
+ provider,
81
+ ...(project === undefined ? {} : { project }),
82
+ };
83
+ // A caller-provided total is metadata only. It is never trusted or written;
84
+ // the normalized sum is recomputed from the five validated components.
85
+ if ("recorded_total" in value && value.recorded_total !== normalized.recorded_total) {
86
+ fail(`records[${index}].recorded_total does not match its components`);
87
+ }
88
+ return normalized;
89
+ }
90
+ function revisionFor(components, completeness) {
91
+ return createHash("sha256")
92
+ .update(JSON.stringify({ ...components, completeness }))
93
+ .digest("hex");
94
+ }
95
+ /** Convert a domain record to a whitelist-only JSON record. */
96
+ export function normalizeRecord(record) {
97
+ return recordFromUnknown(record, 0);
98
+ }
99
+ export function toDomainRecord(record) {
100
+ // The domain record intentionally contains Date values. The cast is limited
101
+ // to this boundary; all fields were validated by parseRecordsDocument first.
102
+ return {
103
+ ...record,
104
+ createdAt: new Date(record.createdAt),
105
+ observedAt: new Date(record.observedAt),
106
+ };
107
+ }
108
+ export function serializeRecords(records) {
109
+ const normalized = records.map(normalizeRecord);
110
+ const document = {
111
+ format: RECORDS_FORMAT,
112
+ schemaVersion: CURRENT_CACHE_SCHEMA_VERSION,
113
+ records: normalized,
114
+ };
115
+ return `${JSON.stringify(document)}\n`;
116
+ }
117
+ function schemaVersion(value) {
118
+ const version = value.schemaVersion ?? value.version ?? 0;
119
+ if (!Number.isSafeInteger(version) || version < 0) {
120
+ fail("schemaVersion must be a non-negative integer");
121
+ }
122
+ return version;
123
+ }
124
+ /** Migrate the small v0 record shape used by early development snapshots. */
125
+ export function migrateRecordsDocument(value) {
126
+ if (!isRecord(value)) {
127
+ fail("records document must be an object");
128
+ }
129
+ const version = schemaVersion(value);
130
+ if (version > CURRENT_CACHE_SCHEMA_VERSION) {
131
+ throw new DomainError("cache-corrupt", "records document uses a future schema");
132
+ }
133
+ const rawRecords = value.records ?? value.items;
134
+ if (!Array.isArray(rawRecords)) {
135
+ fail("records document must contain a records array");
136
+ }
137
+ const records = rawRecords.map((record, index) => {
138
+ if (version === 0 && isRecord(record)) {
139
+ const legacyTokens = isRecord(record.tokens) ? record.tokens : {};
140
+ return {
141
+ ...record,
142
+ ...legacyTokens,
143
+ createdAt: record.createdAt ?? record.timestamp,
144
+ observedAt: record.observedAt ?? record.observed,
145
+ cacheRead: record.cacheRead ?? (isRecord(record.cache) ? record.cache.read : undefined),
146
+ cacheWrite: record.cacheWrite ?? (isRecord(record.cache) ? record.cache.write : undefined),
147
+ };
148
+ }
149
+ return record;
150
+ }).map(recordFromUnknown);
151
+ return {
152
+ migrated: version !== CURRENT_CACHE_SCHEMA_VERSION || value.format !== RECORDS_FORMAT,
153
+ value: { format: RECORDS_FORMAT, schemaVersion: CURRENT_CACHE_SCHEMA_VERSION, records },
154
+ };
155
+ }
156
+ function safeSnapshotValue(value, depth = 0) {
157
+ if (depth > 12) {
158
+ fail("snapshot metadata is too deeply nested");
159
+ }
160
+ if (value instanceof Date) {
161
+ return { $oc2Date: dateField(value, "snapshot date") };
162
+ }
163
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
164
+ if (typeof value === "string" && value.length > 8192) {
165
+ fail("snapshot metadata string is too large");
166
+ }
167
+ return value;
168
+ }
169
+ if (typeof value === "number") {
170
+ if (!Number.isSafeInteger(value)) {
171
+ fail("snapshot metadata number must be a safe integer");
172
+ }
173
+ return value;
174
+ }
175
+ if (Array.isArray(value)) {
176
+ if (value.length > 4096) {
177
+ fail("snapshot metadata array is too large");
178
+ }
179
+ return value.map((entry) => safeSnapshotValue(entry, depth + 1));
180
+ }
181
+ if (isRecord(value)) {
182
+ const result = {};
183
+ for (const [key, entry] of Object.entries(value)) {
184
+ if (entry === undefined) {
185
+ continue;
186
+ }
187
+ if (FORBIDDEN_KEY.test(key) || key === "content" || key === "parts" || key === "title") {
188
+ continue;
189
+ }
190
+ result[key] = safeSnapshotValue(entry, depth + 1);
191
+ }
192
+ return result;
193
+ }
194
+ fail("snapshot metadata contains an unsupported value");
195
+ }
196
+ export function sanitizeSnapshot(snapshot) {
197
+ return safeSnapshotValue(snapshot);
198
+ }
199
+ function decodeSnapshotValue(value) {
200
+ if (Array.isArray(value))
201
+ return value.map(decodeSnapshotValue);
202
+ if (!isRecord(value))
203
+ return value;
204
+ if (Object.keys(value).length === 1 && typeof value.$oc2Date === "string") {
205
+ return new Date(value.$oc2Date);
206
+ }
207
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, decodeSnapshotValue(entry)]));
208
+ }
209
+ export function deserializeSnapshot(value, records) {
210
+ const decoded = decodeSnapshotValue(value);
211
+ if (isRecord(decoded) && "records" in decoded) {
212
+ return { ...decoded, records };
213
+ }
214
+ return decoded;
215
+ }
216
+ export function serializeSnapshot(snapshot) {
217
+ return sanitizeSnapshot(snapshot);
218
+ }
219
+ export function sha256(contents) {
220
+ return createHash("sha256").update(contents, "utf8").digest("hex");
221
+ }
222
+ function safeRecordFile(value) {
223
+ if (typeof value !== "string" || !/^records-[a-zA-Z0-9._-]+\.json$/.test(value)) {
224
+ fail("manifest recordFile is not a safe records filename");
225
+ }
226
+ return value;
227
+ }
228
+ export function migrateManifestDocument(value) {
229
+ if (!isRecord(value)) {
230
+ fail("manifest must be an object");
231
+ }
232
+ const version = schemaVersion(value);
233
+ if (version > CURRENT_CACHE_SCHEMA_VERSION) {
234
+ throw new DomainError("cache-corrupt", "manifest uses a future schema");
235
+ }
236
+ const source = (version === 0 && isRecord(value.snapshotData) ? value.snapshotData : value.snapshot) ?? {};
237
+ const recordFile = value.recordFile ?? value.recordsFile;
238
+ const generation = value.generation ?? 0;
239
+ if (!Number.isSafeInteger(generation) || generation < 0) {
240
+ fail("manifest generation must be a non-negative integer");
241
+ }
242
+ const recordBytes = value.recordBytes ?? value.bytes;
243
+ if (!Number.isSafeInteger(recordBytes) || recordBytes < 0) {
244
+ fail("manifest recordBytes must be a non-negative integer");
245
+ }
246
+ const recordSha256 = stringField(value.recordSha256 ?? value.sha256, "manifest recordSha256", /^[a-f0-9]{64}$/i);
247
+ const createdAt = dateField(value.createdAt ?? value.created ?? new Date(0), "manifest createdAt");
248
+ const complete = value.complete ?? (version === 0 ? true : undefined);
249
+ if (complete !== true) {
250
+ fail("manifest is incomplete");
251
+ }
252
+ let providerFingerprints;
253
+ if (isRecord(value.providerFingerprints)) {
254
+ const fingerprints = {};
255
+ for (const [key, entry] of Object.entries(value.providerFingerprints)) {
256
+ if ((key === "opencode" || key === "codex" || key === "antigravity") &&
257
+ typeof entry === "string" &&
258
+ entry.length > 0 &&
259
+ entry.length <= 512 &&
260
+ /^[a-zA-Z0-9._:-]{1,256}$/.test(entry)) {
261
+ fingerprints[key] = entry;
262
+ }
263
+ }
264
+ if (Object.keys(fingerprints).length > 0) {
265
+ providerFingerprints = fingerprints;
266
+ }
267
+ }
268
+ const manifest = {
269
+ format: CACHE_FORMAT,
270
+ schemaVersion: CURRENT_CACHE_SCHEMA_VERSION,
271
+ manifestVersion: Number.isSafeInteger(value.manifestVersion) ? value.manifestVersion : 1,
272
+ complete: true,
273
+ generation: generation,
274
+ createdAt,
275
+ recordFile: safeRecordFile(recordFile),
276
+ recordBytes: recordBytes,
277
+ recordSha256,
278
+ snapshot: sanitizeSnapshot(source),
279
+ ...(providerFingerprints ? { providerFingerprints } : {}),
280
+ };
281
+ return {
282
+ value: manifest,
283
+ migrated: version !== CURRENT_CACHE_SCHEMA_VERSION ||
284
+ value.format !== CACHE_FORMAT ||
285
+ (value.providerFingerprints !== undefined && providerFingerprints === undefined),
286
+ };
287
+ }
288
+ export function parseRecords(contents) {
289
+ try {
290
+ return migrateRecordsDocument(JSON.parse(contents));
291
+ }
292
+ catch (error) {
293
+ if (error instanceof DomainError)
294
+ throw error;
295
+ fail("records JSON is invalid", error);
296
+ }
297
+ }
298
+ export function parseManifest(contents) {
299
+ try {
300
+ return migrateManifestDocument(JSON.parse(contents));
301
+ }
302
+ catch (error) {
303
+ if (error instanceof DomainError)
304
+ throw error;
305
+ fail("manifest JSON is invalid", error);
306
+ }
307
+ }
308
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/cache/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { SnapshotStore, SnapshotStoreCommitOptions, SnapshotStoreReadOptions } from "../domain/index.js";
2
+ import { type CacheCommitResult, type CacheReadResult, type CacheStoreOptions, type OrphanRecoveryResult, type StoredSnapshot, type UsageRecord } from "./types.js";
3
+ export declare class NormalizedCacheStore implements SnapshotStore {
4
+ readonly directory: string;
5
+ readonly manifestPath: string;
6
+ private readonly fs;
7
+ private readonly clock;
8
+ private readonly process;
9
+ private readonly random;
10
+ private readonly lock;
11
+ private readonly recoverOrphans;
12
+ private static sequence;
13
+ private static readonly commitChains;
14
+ constructor(directory: string, dependencies?: CacheStoreOptions);
15
+ constructor(options: CacheStoreOptions);
16
+ private ensureDirectory;
17
+ private nextName;
18
+ private syncDirectory;
19
+ private writeUniqueAndRename;
20
+ private currentManifestVersion;
21
+ /** Remove only OC2Token's own temporary files, never arbitrary cache files. */
22
+ recoverOrphanTemps(): Promise<OrphanRecoveryResult>;
23
+ private recoverOrphanTempsInternal;
24
+ private isTemp;
25
+ readDetailed(): Promise<CacheReadResult>;
26
+ read(options?: SnapshotStoreReadOptions): Promise<StoredSnapshot | null>;
27
+ private commitNormalized;
28
+ /**
29
+ * Commit is non-blocking across processes: a held lock returns cache_busy and
30
+ * leaves the caller's correct in-memory snapshot untouched. Calls in this
31
+ * process are serialized for the complete record+manifest publication.
32
+ */
33
+ commitDetailed(snapshot: StoredSnapshot, records?: readonly UsageRecord[]): Promise<CacheCommitResult>;
34
+ commit(snapshot: StoredSnapshot, options?: SnapshotStoreCommitOptions): Promise<void>;
35
+ }
36
+ export declare const FileCacheStore: typeof NormalizedCacheStore;
37
+ export declare const SnapshotCacheStore: typeof NormalizedCacheStore;
38
+ /** Domain-facing facade: detailed callers can inspect cache_busy via commitDetailed. */
39
+ export declare class SnapshotStoreAdapter implements SnapshotStore {
40
+ readonly detailed: NormalizedCacheStore;
41
+ constructor(detailed: NormalizedCacheStore);
42
+ read(_options?: SnapshotStoreReadOptions): Promise<StoredSnapshot | null>;
43
+ commit(snapshot: StoredSnapshot, options?: SnapshotStoreCommitOptions): Promise<void>;
44
+ }
45
+ export declare function createSnapshotStore(options: CacheStoreOptions): SnapshotStoreAdapter;
46
+ export declare function createNormalizedCacheStore(options: CacheStoreOptions): NormalizedCacheStore;