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,396 @@
1
+ import { join, resolve } from "node:path";
2
+ import { DomainError } from "../domain/errors.js";
3
+ import { CacheLock } from "./lock.js";
4
+ import { nodeCacheFileSystem, systemCacheClock, systemCacheProcess, systemCacheRandom } from "./filesystem.js";
5
+ import { CACHE_FORMAT, CURRENT_CACHE_SCHEMA_VERSION, MANIFEST_FILE_NAME, } from "./types.js";
6
+ import { deserializeSnapshot, migrateManifestDocument, normalizeRecord, parseManifest, parseRecords, sanitizeSnapshot, serializeRecords, sha256, toDomainRecord, } from "./schema.js";
7
+ const TEMP_PREFIX = ".oc2token-";
8
+ const TEMP_SUFFIX = ".tmp";
9
+ function errorCode(error) {
10
+ if (typeof error === "object" && error !== null && "code" in error) {
11
+ const code = error.code;
12
+ return typeof code === "string" ? code : undefined;
13
+ }
14
+ return undefined;
15
+ }
16
+ function missing(error) {
17
+ return errorCode(error) === "ENOENT";
18
+ }
19
+ function isFutureSchema(error) {
20
+ return error instanceof DomainError && /future schema/i.test(error.message);
21
+ }
22
+ function isRecord(value) {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+ function snapshotGeneration(snapshot) {
26
+ if (isRecord(snapshot) && Number.isSafeInteger(snapshot.generation) && snapshot.generation >= 0) {
27
+ return snapshot.generation;
28
+ }
29
+ return 0;
30
+ }
31
+ function clockNow(clock) {
32
+ const value = clock.now?.() ?? clock.wallNow?.();
33
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
34
+ throw new DomainError("invalid-date", "cache clock must return a valid Date");
35
+ }
36
+ return value;
37
+ }
38
+ function recordsFromSnapshot(snapshot) {
39
+ if (isRecord(snapshot) && Array.isArray(snapshot.records)) {
40
+ return snapshot.records;
41
+ }
42
+ return [];
43
+ }
44
+ function normalizeRecords(records) {
45
+ return records.map((record) => normalizeRecord(record));
46
+ }
47
+ async function quietUnlink(fs, path) {
48
+ try {
49
+ await fs.unlink(path);
50
+ }
51
+ catch (error) {
52
+ if (!missing(error))
53
+ throw error;
54
+ }
55
+ }
56
+ export class NormalizedCacheStore {
57
+ directory;
58
+ manifestPath;
59
+ fs;
60
+ clock;
61
+ process;
62
+ random;
63
+ lock;
64
+ recoverOrphans;
65
+ static sequence = 0;
66
+ // Chains are process-wide so two store instances targeting the same path do
67
+ // not race even when their callers are otherwise unrelated.
68
+ static commitChains = new Map();
69
+ constructor(directoryOrOptions, dependencies = {}) {
70
+ const options = typeof directoryOrOptions === "string"
71
+ ? { ...dependencies, directory: directoryOrOptions }
72
+ : directoryOrOptions;
73
+ const directory = options.directory ?? options.rootDir;
74
+ if (!directory) {
75
+ throw new DomainError("cache-unavailable", "A cache directory is required");
76
+ }
77
+ this.directory = resolve(directory);
78
+ this.manifestPath = join(this.directory, MANIFEST_FILE_NAME);
79
+ this.fs = options.fs ?? nodeCacheFileSystem;
80
+ this.clock = options.clock ?? systemCacheClock;
81
+ this.process = options.process ?? systemCacheProcess;
82
+ this.random = options.random ?? systemCacheRandom;
83
+ this.recoverOrphans = options.recoverOrphans ?? true;
84
+ const lockDependencies = {
85
+ fs: this.fs,
86
+ clock: this.clock,
87
+ process: this.process,
88
+ random: this.random,
89
+ staleLockMs: options.staleLockMs,
90
+ };
91
+ this.lock = new CacheLock(this.directory, lockDependencies);
92
+ }
93
+ async ensureDirectory() {
94
+ await this.fs.mkdir(this.directory, { recursive: true, mode: 0o700 });
95
+ }
96
+ nextName(kind, generation = 0) {
97
+ NormalizedCacheStore.sequence += 1;
98
+ const owner = this.random.uuid().replace(/[^a-zA-Z0-9-]/g, "");
99
+ return `${kind}-${generation}-${this.process.pid}-${owner}-${NormalizedCacheStore.sequence}`;
100
+ }
101
+ async syncDirectory() {
102
+ // Directory fsync is necessary for rename durability on POSIX. Some fake
103
+ // filesystems do not model directory handles, so this operation is best
104
+ // effort and can be replaced by a test adapter.
105
+ try {
106
+ const directoryHandle = await this.fs.open(this.directory, "r");
107
+ try {
108
+ await directoryHandle.sync();
109
+ }
110
+ finally {
111
+ await directoryHandle.close();
112
+ }
113
+ }
114
+ catch (error) {
115
+ if (errorCode(error) === "EISDIR" || errorCode(error) === "EINVAL" || errorCode(error) === "ENOTSUP") {
116
+ return;
117
+ }
118
+ throw error;
119
+ }
120
+ }
121
+ async writeUniqueAndRename(contents, target, tempKind) {
122
+ const temp = join(this.directory, `${TEMP_PREFIX}${this.nextName(tempKind)}${TEMP_SUFFIX}`);
123
+ let handle;
124
+ try {
125
+ handle = await this.fs.open(temp, "wx", 0o600);
126
+ try {
127
+ await handle.writeFile(contents);
128
+ await handle.sync();
129
+ }
130
+ finally {
131
+ await handle.close();
132
+ }
133
+ await this.fs.rename(temp, target);
134
+ await this.syncDirectory();
135
+ }
136
+ catch (error) {
137
+ await quietUnlink(this.fs, temp);
138
+ throw error;
139
+ }
140
+ }
141
+ async currentManifestVersion() {
142
+ try {
143
+ const contents = await this.fs.readFile(this.manifestPath, "utf8");
144
+ const parsed = migrateManifestDocument(JSON.parse(contents));
145
+ return parsed.value.manifestVersion;
146
+ }
147
+ catch {
148
+ return 0;
149
+ }
150
+ }
151
+ /** Remove only OC2Token's own temporary files, never arbitrary cache files. */
152
+ async recoverOrphanTemps() {
153
+ return this.recoverOrphanTempsInternal(false);
154
+ }
155
+ async recoverOrphanTempsInternal(underOwnedLock) {
156
+ const removed = [];
157
+ const skipped = [];
158
+ const errors = [];
159
+ let entries;
160
+ try {
161
+ entries = await this.fs.readdir(this.directory);
162
+ }
163
+ catch (error) {
164
+ if (missing(error))
165
+ return { removed, skipped, errors };
166
+ return { removed, skipped, errors: [{ file: this.directory, error }] };
167
+ }
168
+ if (!underOwnedLock) {
169
+ try {
170
+ await this.fs.stat(this.lock.lockPath);
171
+ // An active writer may still own one of the temp files. Leave all
172
+ // temps untouched until its lock is gone.
173
+ return {
174
+ removed,
175
+ skipped: entries.filter((entry) => this.isTemp(entry)),
176
+ errors,
177
+ };
178
+ }
179
+ catch (error) {
180
+ if (!missing(error)) {
181
+ return { removed, skipped, errors: [{ file: this.lock.lockPath, error }] };
182
+ }
183
+ }
184
+ }
185
+ for (const entry of entries) {
186
+ if (!this.isTemp(entry))
187
+ continue;
188
+ try {
189
+ await this.fs.unlink(join(this.directory, entry));
190
+ removed.push(entry);
191
+ }
192
+ catch (error) {
193
+ if (missing(error)) {
194
+ skipped.push(entry);
195
+ }
196
+ else {
197
+ errors.push({ file: entry, error });
198
+ }
199
+ }
200
+ }
201
+ return { removed, skipped, errors };
202
+ }
203
+ isTemp(entry) {
204
+ return entry.startsWith(TEMP_PREFIX) && entry.endsWith(TEMP_SUFFIX);
205
+ }
206
+ async readDetailed() {
207
+ if (this.recoverOrphans) {
208
+ await this.recoverOrphanTemps();
209
+ }
210
+ let manifestContents;
211
+ try {
212
+ manifestContents = await this.fs.readFile(this.manifestPath, "utf8");
213
+ }
214
+ catch (error) {
215
+ if (missing(error))
216
+ return { status: "empty" };
217
+ return { status: "unavailable", reason: "cache_unavailable", stale: true, error };
218
+ }
219
+ let parsedManifest;
220
+ try {
221
+ parsedManifest = parseManifest(manifestContents);
222
+ }
223
+ catch (error) {
224
+ return {
225
+ status: "unavailable",
226
+ reason: isFutureSchema(error) ? "future_schema" : "cache_corrupt",
227
+ stale: true,
228
+ error,
229
+ };
230
+ }
231
+ const manifest = parsedManifest.value;
232
+ let recordsContents;
233
+ try {
234
+ recordsContents = await this.fs.readFile(join(this.directory, manifest.recordFile), "utf8");
235
+ }
236
+ catch (error) {
237
+ return { status: "unavailable", reason: "cache_corrupt", stale: true, error };
238
+ }
239
+ if (Buffer.byteLength(recordsContents, "utf8") !== manifest.recordBytes || sha256(recordsContents) !== manifest.recordSha256) {
240
+ return {
241
+ status: "unavailable",
242
+ reason: "cache_corrupt",
243
+ stale: true,
244
+ error: new DomainError("cache-corrupt", "The cache record file failed manifest integrity checks"),
245
+ };
246
+ }
247
+ let parsedRecords;
248
+ try {
249
+ parsedRecords = parseRecords(recordsContents);
250
+ }
251
+ catch (error) {
252
+ return {
253
+ status: "unavailable",
254
+ reason: isFutureSchema(error) ? "future_schema" : "cache_corrupt",
255
+ stale: true,
256
+ error,
257
+ };
258
+ }
259
+ const records = parsedRecords.value.records.map(toDomainRecord);
260
+ return {
261
+ status: "available",
262
+ snapshot: deserializeSnapshot(manifest.snapshot, records),
263
+ records,
264
+ manifest,
265
+ migrated: parsedManifest.migrated || parsedRecords.migrated,
266
+ };
267
+ }
268
+ async read(options) {
269
+ if (options?.signal?.aborted) {
270
+ throw new DomainError("cancelled", "The cache read was cancelled");
271
+ }
272
+ const result = await this.readDetailed();
273
+ return result.status === "available" ? result.snapshot : null;
274
+ }
275
+ async commitNormalized(snapshot, records) {
276
+ try {
277
+ await this.ensureDirectory();
278
+ }
279
+ catch (error) {
280
+ return { status: "cache_unavailable", snapshot, records, error };
281
+ }
282
+ let lockResult;
283
+ try {
284
+ lockResult = await this.lock.tryAcquire();
285
+ }
286
+ catch (error) {
287
+ return { status: "cache_unavailable", snapshot, records, error };
288
+ }
289
+ if (lockResult.status === "busy") {
290
+ return { status: "cache_busy", snapshot, records, owner: lockResult.owner };
291
+ }
292
+ try {
293
+ // We hold the lock, so no other process can be writing a temp file.
294
+ await this.recoverOrphanTempsInternal(true);
295
+ const recordsContents = serializeRecords(records);
296
+ const generation = snapshotGeneration(snapshot);
297
+ const recordFile = `records-${generation}-${this.nextName("record")}.json`;
298
+ await this.writeUniqueAndRename(recordsContents, join(this.directory, recordFile), "records");
299
+ const manifest = {
300
+ format: CACHE_FORMAT,
301
+ schemaVersion: CURRENT_CACHE_SCHEMA_VERSION,
302
+ manifestVersion: (await this.currentManifestVersion()) + 1,
303
+ complete: true,
304
+ generation,
305
+ createdAt: clockNow(this.clock).toISOString(),
306
+ recordFile,
307
+ recordBytes: Buffer.byteLength(recordsContents, "utf8"),
308
+ recordSha256: sha256(recordsContents),
309
+ snapshot: sanitizeSnapshot(snapshot),
310
+ };
311
+ const manifestContents = `${JSON.stringify(manifest)}\n`;
312
+ await this.writeUniqueAndRename(manifestContents, this.manifestPath, "manifest");
313
+ const normalizedRecords = records.map((record) => toDomainRecord(normalizeRecord(record)));
314
+ return { status: "committed", snapshot, records: normalizedRecords, manifest, recordFile };
315
+ }
316
+ catch (error) {
317
+ return { status: "cache_unavailable", snapshot, records, error };
318
+ }
319
+ finally {
320
+ await lockResult.release();
321
+ }
322
+ }
323
+ /**
324
+ * Commit is non-blocking across processes: a held lock returns cache_busy and
325
+ * leaves the caller's correct in-memory snapshot untouched. Calls in this
326
+ * process are serialized for the complete record+manifest publication.
327
+ */
328
+ async commitDetailed(snapshot, records = recordsFromSnapshot(snapshot)) {
329
+ const normalized = normalizeRecords(records);
330
+ const previous = NormalizedCacheStore.commitChains.get(this.directory) ?? Promise.resolve();
331
+ const current = previous.catch(() => undefined).then(() => this.commitNormalized(snapshot, records));
332
+ NormalizedCacheStore.commitChains.set(this.directory, current);
333
+ try {
334
+ return await current;
335
+ }
336
+ finally {
337
+ if (NormalizedCacheStore.commitChains.get(this.directory) === current) {
338
+ NormalizedCacheStore.commitChains.delete(this.directory);
339
+ }
340
+ }
341
+ }
342
+ async commit(snapshot, options) {
343
+ if (options?.signal?.aborted) {
344
+ throw new DomainError("cancelled", "The cache commit was cancelled");
345
+ }
346
+ const result = await this.commitDetailed(snapshot);
347
+ if (result.status === "cache_busy") {
348
+ throw new DomainError("cache-busy", "Another OC2Token process owns the cache lock", {
349
+ retryable: true,
350
+ });
351
+ }
352
+ if (result.status === "cache_unavailable") {
353
+ throw new DomainError("cache-unavailable", "The cache commit could not be published", {
354
+ cause: result.error,
355
+ retryable: true,
356
+ });
357
+ }
358
+ }
359
+ }
360
+ export const FileCacheStore = NormalizedCacheStore;
361
+ export const SnapshotCacheStore = NormalizedCacheStore;
362
+ /** Domain-facing facade: detailed callers can inspect cache_busy via commitDetailed. */
363
+ export class SnapshotStoreAdapter {
364
+ detailed;
365
+ constructor(detailed) {
366
+ this.detailed = detailed;
367
+ }
368
+ async read(_options) {
369
+ const result = await this.detailed.readDetailed();
370
+ return result.status === "available" ? result.snapshot : null;
371
+ }
372
+ async commit(snapshot, options) {
373
+ if (options?.signal?.aborted) {
374
+ throw new DomainError("cancelled", "The cache commit was cancelled");
375
+ }
376
+ const result = await this.detailed.commitDetailed(snapshot);
377
+ if (result.status === "cache_busy") {
378
+ throw new DomainError("cache-busy", "Another OC2Token process owns the cache lock", {
379
+ retryable: true,
380
+ });
381
+ }
382
+ if (result.status === "cache_unavailable") {
383
+ throw new DomainError("cache-unavailable", "The cache commit could not be published", {
384
+ cause: result.error,
385
+ retryable: true,
386
+ });
387
+ }
388
+ }
389
+ }
390
+ export function createSnapshotStore(options) {
391
+ return new SnapshotStoreAdapter(new NormalizedCacheStore(options));
392
+ }
393
+ export function createNormalizedCacheStore(options) {
394
+ return new NormalizedCacheStore(options);
395
+ }
396
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/cache/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import type { ProviderKind } from "../domain/index.js";
2
+ import type { StoredSnapshot, UsageRecord } from "../domain/index.js";
3
+ export type { StoredSnapshot, UsageRecord };
4
+ export declare const CACHE_FORMAT: "oc2token.normalized-cache";
5
+ export declare const RECORDS_FORMAT: "oc2token.normalized-records";
6
+ export declare const MANIFEST_FILE_NAME: "manifest.json";
7
+ export declare const LOCK_DIRECTORY_NAME: ".lock";
8
+ export declare const CURRENT_CACHE_SCHEMA_VERSION: 2;
9
+ export interface CacheFileHandle {
10
+ writeFile(data: string): Promise<void>;
11
+ sync(): Promise<void>;
12
+ close(): Promise<void>;
13
+ }
14
+ export interface CacheFileStat {
15
+ readonly mtimeMs: number;
16
+ readonly isFile?: () => boolean;
17
+ readonly isDirectory?: () => boolean;
18
+ }
19
+ /** The smallest filesystem surface needed by the crash-safe store. */
20
+ export interface CacheFileSystem {
21
+ mkdir(path: string, options?: {
22
+ readonly recursive?: boolean;
23
+ readonly mode?: number;
24
+ }): Promise<void>;
25
+ open(path: string, flags: string, mode?: number): Promise<CacheFileHandle>;
26
+ readFile(path: string, encoding: "utf8"): Promise<string>;
27
+ rename(from: string, to: string): Promise<void>;
28
+ unlink(path: string): Promise<void>;
29
+ rm(path: string, options?: {
30
+ readonly recursive?: boolean;
31
+ readonly force?: boolean;
32
+ }): Promise<void>;
33
+ readdir(path: string): Promise<readonly string[]>;
34
+ stat(path: string): Promise<CacheFileStat>;
35
+ }
36
+ export interface CacheClock {
37
+ /** `now` is the cache-local spelling; `wallNow` accepts the shared domain Clock seam. */
38
+ now?(): Date;
39
+ wallNow?(): Date;
40
+ }
41
+ export interface CacheProcess {
42
+ readonly pid: number;
43
+ readonly hostname: string;
44
+ isAlive?(pid: number): Promise<boolean> | boolean;
45
+ }
46
+ export interface CacheRandom {
47
+ uuid(): string;
48
+ }
49
+ export interface CacheDependencies {
50
+ readonly fs?: CacheFileSystem;
51
+ readonly clock?: CacheClock;
52
+ readonly process?: CacheProcess;
53
+ readonly random?: CacheRandom;
54
+ }
55
+ export type CacheReadUnavailableReason = "cache_busy" | "cache_corrupt" | "future_schema" | "cache_unavailable";
56
+ export interface CacheOwner {
57
+ readonly pid: number;
58
+ readonly host: string;
59
+ readonly start: string;
60
+ readonly owner: string;
61
+ }
62
+ export interface CacheManifest {
63
+ readonly format: typeof CACHE_FORMAT;
64
+ readonly schemaVersion: number;
65
+ readonly manifestVersion: number;
66
+ readonly complete: true;
67
+ readonly generation: number;
68
+ readonly createdAt: string;
69
+ readonly recordFile: string;
70
+ readonly recordBytes: number;
71
+ readonly recordSha256: string;
72
+ readonly snapshot: unknown;
73
+ readonly providerFingerprints?: Record<ProviderKind, string>;
74
+ }
75
+ export interface CacheReadAvailable {
76
+ readonly status: "available";
77
+ readonly snapshot: StoredSnapshot;
78
+ readonly records: readonly UsageRecord[];
79
+ readonly manifest: CacheManifest;
80
+ readonly migrated: boolean;
81
+ }
82
+ export interface CacheReadEmpty {
83
+ readonly status: "empty";
84
+ }
85
+ export interface CacheReadUnavailable {
86
+ readonly status: "unavailable";
87
+ readonly reason: CacheReadUnavailableReason;
88
+ readonly stale: true;
89
+ readonly error?: unknown;
90
+ readonly owner?: CacheOwner;
91
+ }
92
+ export type CacheReadResult = CacheReadAvailable | CacheReadEmpty | CacheReadUnavailable;
93
+ export interface CacheCommitSuccess {
94
+ readonly status: "committed";
95
+ readonly snapshot: StoredSnapshot;
96
+ readonly records: readonly UsageRecord[];
97
+ readonly manifest: CacheManifest;
98
+ readonly recordFile: string;
99
+ }
100
+ export interface CacheCommitBusy {
101
+ /** The caller must keep using this in-memory snapshot and retry later. */
102
+ readonly status: "cache_busy";
103
+ readonly snapshot: StoredSnapshot;
104
+ readonly records: readonly UsageRecord[];
105
+ readonly owner?: CacheOwner;
106
+ }
107
+ export interface CacheCommitUnavailable {
108
+ readonly status: "cache_unavailable";
109
+ readonly snapshot: StoredSnapshot;
110
+ readonly records: readonly UsageRecord[];
111
+ readonly error: unknown;
112
+ }
113
+ export type CacheCommitResult = CacheCommitSuccess | CacheCommitBusy | CacheCommitUnavailable;
114
+ export interface OrphanRecoveryResult {
115
+ readonly removed: readonly string[];
116
+ readonly skipped: readonly string[];
117
+ readonly errors: readonly {
118
+ readonly file: string;
119
+ readonly error: unknown;
120
+ }[];
121
+ }
122
+ export interface CacheStoreOptions extends CacheDependencies {
123
+ /** Absolute or relative directory owned by OC2Token. */
124
+ readonly directory?: string;
125
+ /** Alias accepted for callers that call the path a root directory. */
126
+ readonly rootDir?: string;
127
+ readonly staleLockMs?: number;
128
+ /** Set false only for a controlled recovery tool; normal readers leave it true. */
129
+ readonly recoverOrphans?: boolean;
130
+ }
@@ -0,0 +1,6 @@
1
+ export const CACHE_FORMAT = "oc2token.normalized-cache";
2
+ export const RECORDS_FORMAT = "oc2token.normalized-records";
3
+ export const MANIFEST_FILE_NAME = "manifest.json";
4
+ export const LOCK_DIRECTORY_NAME = ".lock";
5
+ export const CURRENT_CACHE_SCHEMA_VERSION = 2;
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cache/types.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG,2BAAoC,CAAC;AACjE,MAAM,CAAC,MAAM,cAAc,GAAG,6BAAsC,CAAC;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAwB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ interface CliIO {
3
+ readonly stdin: NodeJS.ReadStream;
4
+ readonly stdout: NodeJS.WriteStream;
5
+ readonly stderr: NodeJS.WriteStream;
6
+ }
7
+ export declare function main(args?: string[], io?: CliIO): Promise<number>;
8
+ export {};