@vibe-agent-toolkit/resources 0.1.39-rc.13 → 0.1.39-rc.14

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 (57) hide show
  1. package/dist/content-cache.d.ts +67 -0
  2. package/dist/content-cache.d.ts.map +1 -0
  3. package/dist/content-cache.js +160 -0
  4. package/dist/content-cache.js.map +1 -0
  5. package/dist/external-link-cache.d.ts +16 -2
  6. package/dist/external-link-cache.d.ts.map +1 -1
  7. package/dist/external-link-cache.js +43 -13
  8. package/dist/external-link-cache.js.map +1 -1
  9. package/dist/external-link-validator.d.ts +75 -2
  10. package/dist/external-link-validator.d.ts.map +1 -1
  11. package/dist/external-link-validator.js +184 -4
  12. package/dist/external-link-validator.js.map +1 -1
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +12 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/link-auth-classify.d.ts +34 -0
  18. package/dist/link-auth-classify.d.ts.map +1 -0
  19. package/dist/link-auth-classify.js +42 -0
  20. package/dist/link-auth-classify.js.map +1 -0
  21. package/dist/link-auth-config-build.d.ts +47 -0
  22. package/dist/link-auth-config-build.d.ts.map +1 -0
  23. package/dist/link-auth-config-build.js +86 -0
  24. package/dist/link-auth-config-build.js.map +1 -0
  25. package/dist/link-auth-content-fetch.d.ts +75 -0
  26. package/dist/link-auth-content-fetch.d.ts.map +1 -0
  27. package/dist/link-auth-content-fetch.js +101 -0
  28. package/dist/link-auth-content-fetch.js.map +1 -0
  29. package/dist/link-auth-deps-memo.d.ts +40 -0
  30. package/dist/link-auth-deps-memo.d.ts.map +1 -0
  31. package/dist/link-auth-deps-memo.js +47 -0
  32. package/dist/link-auth-deps-memo.js.map +1 -0
  33. package/dist/link-auth-transport.d.ts +44 -0
  34. package/dist/link-auth-transport.d.ts.map +1 -0
  35. package/dist/link-auth-transport.js +151 -0
  36. package/dist/link-auth-transport.js.map +1 -0
  37. package/dist/resource-registry.d.ts.map +1 -1
  38. package/dist/resource-registry.js +15 -1
  39. package/dist/resource-registry.js.map +1 -1
  40. package/dist/schemas/link-auth.d.ts +1049 -303
  41. package/dist/schemas/link-auth.d.ts.map +1 -1
  42. package/dist/schemas/link-auth.js +39 -20
  43. package/dist/schemas/link-auth.js.map +1 -1
  44. package/dist/schemas/project-config.d.ts +2697 -749
  45. package/dist/schemas/project-config.d.ts.map +1 -1
  46. package/package.json +4 -4
  47. package/src/content-cache.ts +190 -0
  48. package/src/external-link-cache.ts +50 -13
  49. package/src/external-link-validator.ts +268 -5
  50. package/src/index.ts +23 -0
  51. package/src/link-auth-classify.ts +61 -0
  52. package/src/link-auth-config-build.ts +130 -0
  53. package/src/link-auth-content-fetch.ts +146 -0
  54. package/src/link-auth-deps-memo.ts +56 -0
  55. package/src/link-auth-transport.ts +179 -0
  56. package/src/resource-registry.ts +17 -2
  57. package/src/schemas/link-auth.ts +47 -21
@@ -1 +1 @@
1
- {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/schemas/project-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,qCAC+B,CAAC;AAEjE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;EASY,CAAC;AAErD,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaiB,CAAC;AAEzD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO6B,CAAC;AAEjE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAsEtB,CAAC;;;iBAEI,CAAC;mBACd,CAAC;;;;;;;mBAkEa,CAAC;;;;;;iBA8DN,CAAC;mBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA/DD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8DN,CAAC;mBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA/LsC,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAMpE;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;EAGrC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;EAG5C,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAkB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAM2C,CAAC;AAEpF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2B3B;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOyD,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAnE3B,CAAC;;;iBAEI,CAAC;mBACd,CAAC;;;;;;;mBAkEa,CAAC;;;;;;iBA8DN,CAAC;mBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAxFjB;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAmBa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8DN,CAAC;mBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlDkC,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA7FnB,CAAC;;;qBAEI,CAAC;uBACd,CAAC;;;;;;;uBAkEa,CAAC;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAxFjB;;;;;;eAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmBa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBApIP,CAAC;;;qBAEI,CAAC;uBACd,CAAC;;;;;;;uBAkEa,CAAC;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAxFjB;;;;;;eAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmBa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA/DD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBADN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlCiD,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAM9D;;;;;;;;GAQG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBwB,CAAC;AAExE,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAE9F;;;GAGG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;EAa+B,CAAC;AAE3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAciC,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK8B,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAlMpB,CAAC;;;yBAEI,CAAC;2BACd,CAAC;;;;;;;2BAkEa,CAAC;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAxFjB;;;;;;mBAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmBa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BApIP,CAAC;;;yBAEI,CAAC;2BACd,CAAC;;;;;;;2BAkEa,CAAC;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAxFjB;;;;;;mBAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmBa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA/DD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBADN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBApIP,CAAC;;;qBAEI,CAAC;uBACd,CAAC;;;;;;;uBAkEa,CAAC;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA/DD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8DN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA/DD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA8DN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBADN,CAAC;2BACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBADN,CAAC;uBACI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuE6C,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/schemas/project-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/resources",
3
- "version": "0.1.39-rc.13",
3
+ "version": "0.1.39-rc.14",
4
4
  "description": "Markdown resource parsing, validation, and link integrity checking",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,13 +33,13 @@
33
33
  "author": "Jeff Dutton",
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@vibe-agent-toolkit/agent-schema": "0.1.39-rc.13",
37
- "@vibe-agent-toolkit/utils": "0.1.39-rc.13",
36
+ "@vibe-agent-toolkit/agent-schema": "0.1.39-rc.14",
37
+ "@vibe-agent-toolkit/utils": "0.1.39-rc.14",
38
38
  "ajv": "^8.17.1",
39
39
  "ajv-formats": "^3.0.1",
40
40
  "github-slugger": "^2.0.0",
41
41
  "markdown-link-check": "^3.14.2",
42
- "parse5": "^7.2.1",
42
+ "parse5": "^7.3.0",
43
43
  "picomatch": "^4.0.3",
44
44
  "remark-frontmatter": "^5.0.0",
45
45
  "remark-gfm": "^4.0.0",
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Per-entry content cache for the linkAuth content-fetch primitive (design
3
+ * issue #113 §6.2 + §6.3).
4
+ *
5
+ * Layout: under `cacheDir/` each entry is two files keyed by `sha256(url).hex`:
6
+ * - `<hash>.json` — metadata (status, content-type, etag/last-modified,
7
+ * fetchedAt, rewrittenUrl, schema version)
8
+ * - `<hash>.bin` — raw response bytes, binary-clean
9
+ *
10
+ * The split lets one entry read load only what we need: metadata for the
11
+ * TTL/version check, then the bytes only on a hit. A single-JSON layout would
12
+ * have meant base64-encoding bytes (~33% bloat) and reparsing every entry on
13
+ * every lookup. Two-file layout pays one extra `open()` per hit and scales
14
+ * better as content size grows.
15
+ *
16
+ * **Cross-user isolation is the caller's job** (§6.3) — pass a cacheDir
17
+ * already scoped to the OS user (e.g. `<cacheDir>/content/auth-<osUser>/`).
18
+ * The cache class itself only knows about the directory it was given.
19
+ *
20
+ * **TTL** defaults to 30 minutes per §6.3. The content-fetch primitive's
21
+ * `forceRefresh` option bypasses the cache; this class has no `clear()` —
22
+ * stale entries fall out naturally on TTL expiry, and `forceRefresh` covers
23
+ * "I authenticated as the wrong identity" per §6.3.
24
+ *
25
+ * **Fail-soft IO** per #125 review: ENOENT/EACCES/EROFS/corrupted-JSON all
26
+ * degrade to a miss (for reads) or a no-op (for writes). A non-persisted
27
+ * entry costs an extra fetch on the next run; an exception costs the whole
28
+ * current run.
29
+ *
30
+ * **Strict metadata shape**: `set()` writes only declared `ContentMetadata`
31
+ * fields, even if the caller passes structurally-typed extras. The fetch
32
+ * primitive is the authority on what may be persisted, and a cache that
33
+ * silently passes through unknown fields could leak a token value if the
34
+ * primitive (or future code) ever forgot.
35
+ */
36
+
37
+ import { createHash } from 'node:crypto';
38
+ import { promises as fs } from 'node:fs';
39
+
40
+ import { safePath } from '@vibe-agent-toolkit/utils';
41
+
42
+ /**
43
+ * Cache schema version. Bump when `ContentMetadata` or the on-disk layout
44
+ * changes. Entries with a missing or non-matching version are read as a miss
45
+ * (rather than misparsed) — the next fetch repopulates them under the new
46
+ * schema.
47
+ */
48
+ const CACHE_VERSION = 1;
49
+
50
+ const DEFAULT_TTL_MINUTES = 30;
51
+
52
+ export interface ContentMetadata {
53
+ readonly status: number;
54
+ readonly contentType: string | null;
55
+ readonly etag: string | null;
56
+ readonly lastModified: string | null;
57
+ /** Epoch ms when the response was received (used for TTL evaluation). */
58
+ readonly fetchedAt: number;
59
+ /** The rewritten URL the bytes were fetched from (§6.3 cache-key discipline). */
60
+ readonly rewrittenUrl: string;
61
+ }
62
+
63
+ export interface ContentCacheEntry {
64
+ readonly bytes: Uint8Array;
65
+ readonly metadata: ContentMetadata;
66
+ }
67
+
68
+ interface StoredMetadata extends ContentMetadata {
69
+ readonly version: number;
70
+ }
71
+
72
+ export class ContentCache {
73
+ private readonly cacheDir: string;
74
+ private readonly ttlMs: number;
75
+
76
+ /**
77
+ * @param cacheDir - Already-OS-user-scoped directory for entries. Caller
78
+ * builds this; the class does not know about users or scoping.
79
+ * @param ttlMinutes - Time-to-live in minutes. Defaults to the §6.3 30-min
80
+ * "session" window.
81
+ */
82
+ constructor(cacheDir: string, ttlMinutes: number = DEFAULT_TTL_MINUTES) {
83
+ this.cacheDir = cacheDir;
84
+ this.ttlMs = ttlMinutes * 60 * 1000;
85
+ }
86
+
87
+ async get(url: string): Promise<ContentCacheEntry | null> {
88
+ const key = this.keyFor(url);
89
+ const jsonPath = safePath.join(this.cacheDir, `${key}.json`);
90
+ const binPath = safePath.join(this.cacheDir, `${key}.bin`);
91
+
92
+ const stored = await this.readMetadata(jsonPath);
93
+ if (stored === null) return null;
94
+ if (stored.version !== CACHE_VERSION) return null;
95
+ if (this.isExpired(stored)) return null;
96
+
97
+ const bytes = await this.readBytes(binPath);
98
+ if (bytes === null) return null;
99
+
100
+ // Strip the version field — that is an on-disk concern, not part of
101
+ // the caller-facing `ContentMetadata` contract.
102
+ return {
103
+ bytes,
104
+ metadata: pickMetadata(stored),
105
+ };
106
+ }
107
+
108
+ async set(url: string, bytes: Uint8Array, metadata: ContentMetadata): Promise<void> {
109
+ const key = this.keyFor(url);
110
+ const jsonPath = safePath.join(this.cacheDir, `${key}.json`);
111
+ const binPath = safePath.join(this.cacheDir, `${key}.bin`);
112
+
113
+ // Whitelist exactly the declared ContentMetadata fields — defense in depth
114
+ // against a caller that smuggles extra structurally-typed fields, so a
115
+ // future regression in the primitive cannot accidentally persist a token
116
+ // through this cache.
117
+ const stored: StoredMetadata = { ...pickMetadata(metadata), version: CACHE_VERSION };
118
+
119
+ try {
120
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheDir is constructor parameter, controlled by caller
121
+ await fs.mkdir(this.cacheDir, { recursive: true });
122
+ // Write order matters: .bin first, then .json. The reader checks .json
123
+ // first (version + TTL); a partially-written entry where .bin lands but
124
+ // .json doesn't reads as a miss (no .json). The hazard we are avoiding
125
+ // is the reverse — a fresh .json with a stale .bin from a prior set()
126
+ // for the same URL would serve old bytes under new metadata. Writing
127
+ // .json second guarantees that whenever .json reflects the new entry,
128
+ // .bin already does too.
129
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- binPath derived from cacheDir
130
+ await fs.writeFile(binPath, Buffer.from(bytes));
131
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- jsonPath derived from cacheDir
132
+ await fs.writeFile(jsonPath, JSON.stringify(stored), 'utf-8');
133
+ } catch {
134
+ // Fail-soft per #125 review: a write IO failure (EACCES on the dir,
135
+ // ENOSPC on the disk, EROFS on read-only mounts) becomes a no-op. The
136
+ // current run still has the fresh bytes; only the disk persistence is
137
+ // lost.
138
+ }
139
+ }
140
+
141
+ private keyFor(url: string): string {
142
+ return createHash('sha256').update(url).digest('hex');
143
+ }
144
+
145
+ private isExpired(stored: StoredMetadata): boolean {
146
+ return Date.now() - stored.fetchedAt > this.ttlMs;
147
+ }
148
+
149
+ private async readMetadata(jsonPath: string): Promise<StoredMetadata | null> {
150
+ try {
151
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- jsonPath derived from cacheDir
152
+ const raw = await fs.readFile(jsonPath, 'utf-8');
153
+ return JSON.parse(raw) as StoredMetadata;
154
+ } catch {
155
+ // ENOENT (never written), EACCES (perms revoked), SyntaxError
156
+ // (corrupted JSON) — all degrade to a miss. The next fetch repopulates.
157
+ return null;
158
+ }
159
+ }
160
+
161
+ private async readBytes(binPath: string): Promise<Uint8Array | null> {
162
+ try {
163
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- binPath derived from cacheDir
164
+ const buf = await fs.readFile(binPath);
165
+ // Return a fresh Uint8Array view that does not alias the Node Buffer's
166
+ // underlying ArrayBuffer slab — callers may mutate or store the bytes.
167
+ return new Uint8Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength));
168
+ } catch {
169
+ return null;
170
+ }
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Single source of truth for the on-disk metadata field list. Used in both
176
+ * `set()` (whitelist before write — strips smuggled fields, including the
177
+ * `version` field on round-trip) and `get()` (drop the `version` field before
178
+ * returning to the caller). Centralizing the list means future §8 audits
179
+ * only need to inspect one place.
180
+ */
181
+ function pickMetadata(source: ContentMetadata): ContentMetadata {
182
+ return {
183
+ status: source.status,
184
+ contentType: source.contentType,
185
+ etag: source.etag,
186
+ lastModified: source.lastModified,
187
+ fetchedAt: source.fetchedAt,
188
+ rewrittenUrl: source.rewrittenUrl,
189
+ };
190
+ }
@@ -3,6 +3,14 @@ import { promises as fs } from 'node:fs';
3
3
 
4
4
  import { safePath } from '@vibe-agent-toolkit/utils';
5
5
 
6
+ /**
7
+ * Cache schema version. Incremented when CacheEntry shape changes; entries
8
+ * written by an older code path that read as a different version are treated
9
+ * as cache misses (rather than misparsed) — forward-compat for slice 3's
10
+ * content-cache additions and any future entry-shape evolution.
11
+ */
12
+ const CACHE_VERSION = 1;
13
+
6
14
  /**
7
15
  * Cache entry for external link validation results
8
16
  */
@@ -10,6 +18,12 @@ interface CacheEntry {
10
18
  statusCode: number;
11
19
  statusMessage: string;
12
20
  timestamp: number;
21
+ /**
22
+ * Schema version. Optional for backwards-compat: legacy entries without
23
+ * `version` are treated as a cache miss, forcing a refetch. Reading on
24
+ * version mismatch produces a miss rather than a parse error.
25
+ */
26
+ version?: number;
13
27
  }
14
28
 
15
29
  /**
@@ -61,7 +75,13 @@ export class ExternalLinkCache {
61
75
  }
62
76
 
63
77
  /**
64
- * Load cache from disk
78
+ * Load cache from disk. Fail-soft: any IO error (ENOENT, EACCES, EROFS,
79
+ * corrupted JSON, …) degrades to an empty cache instead of throwing.
80
+ *
81
+ * Why no error propagation: `vat resources validate` should keep running
82
+ * when the cache file isn't reachable (read-only filesystem, permission
83
+ * mismatch, full disk) — a missing cache costs an extra network round-trip,
84
+ * an exception costs the whole run. Per #125 review.
65
85
  */
66
86
  private async loadCache(): Promise<CacheData> {
67
87
  if (this.cache !== null) {
@@ -75,28 +95,35 @@ export class ExternalLinkCache {
75
95
  const data = await fs.readFile(this.cacheFile, 'utf-8');
76
96
  this.cache = JSON.parse(data) as CacheData;
77
97
  return this.cache;
78
- } catch (error) {
79
- // Handle missing file or corrupted JSON - start with empty cache
80
- if ((error as NodeJS.ErrnoException).code === 'ENOENT' || error instanceof SyntaxError) {
81
- this.cache = {};
82
- return this.cache;
83
- }
84
- throw error;
98
+ } catch {
99
+ // All IO and parse errors degrade to an empty cache. Subsequent
100
+ // reads see the same empty cache (this.cache is set), so we don't
101
+ // re-spam mkdir/read on every lookup within the same run.
102
+ this.cache = {};
103
+ return this.cache;
85
104
  }
86
105
  }
87
106
 
88
107
  /**
89
- * Save cache to disk
108
+ * Save cache to disk. Fail-soft: any IO error becomes a no-op instead of
109
+ * throwing. Same rationale as `loadCache` — a non-persisted entry costs an
110
+ * extra fetch on the next run, an exception costs the whole current run.
90
111
  */
91
112
  private async saveCache(): Promise<void> {
92
113
  if (this.cache === null) {
93
114
  return;
94
115
  }
95
116
 
96
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheDir is constructor parameter, controlled by caller
97
- await fs.mkdir(this.cacheDir, { recursive: true });
98
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheFile is derived from cacheDir
99
- await fs.writeFile(this.cacheFile, JSON.stringify(this.cache, null, 2), 'utf-8');
117
+ try {
118
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheDir is constructor parameter, controlled by caller
119
+ await fs.mkdir(this.cacheDir, { recursive: true });
120
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheFile is derived from cacheDir
121
+ await fs.writeFile(this.cacheFile, JSON.stringify(this.cache, null, 2), 'utf-8');
122
+ } catch {
123
+ // No-op on IO failure. The in-memory cache (`this.cache`) is still
124
+ // authoritative for the current run; only the disk persistence is
125
+ // lost.
126
+ }
100
127
  }
101
128
 
102
129
  /**
@@ -156,6 +183,15 @@ export class ExternalLinkCache {
156
183
  return null;
157
184
  }
158
185
 
186
+ // Forward-compat: an entry written under a different (or missing)
187
+ // schema version is treated as a miss. Forces a refetch rather than
188
+ // silently misparsing a slice-3+ shape with slice-2 reader code.
189
+ if (entry.version !== CACHE_VERSION) {
190
+ delete cache[key];
191
+ await this.saveCache();
192
+ return null;
193
+ }
194
+
159
195
  if (this.isExpired(entry)) {
160
196
  delete cache[key];
161
197
  await this.saveCache();
@@ -180,6 +216,7 @@ export class ExternalLinkCache {
180
216
  statusCode,
181
217
  statusMessage,
182
218
  timestamp: Date.now(),
219
+ version: CACHE_VERSION,
183
220
  };
184
221
 
185
222
  await this.saveCache();