@shadowcoderr/context-graph 0.3.2 → 0.3.4

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 (43) hide show
  1. package/README.md +448 -88
  2. package/dist/analyzers/a11y-extractor.d.ts +19 -5
  3. package/dist/analyzers/a11y-extractor.d.ts.map +1 -1
  4. package/dist/analyzers/a11y-extractor.js +274 -104
  5. package/dist/analyzers/a11y-extractor.js.map +1 -1
  6. package/dist/analyzers/network-logger.d.ts +20 -2
  7. package/dist/analyzers/network-logger.d.ts.map +1 -1
  8. package/dist/analyzers/network-logger.js +122 -42
  9. package/dist/analyzers/network-logger.js.map +1 -1
  10. package/dist/analyzers/network-patterns.d.ts +73 -0
  11. package/dist/analyzers/network-patterns.d.ts.map +1 -0
  12. package/dist/analyzers/network-patterns.js +316 -0
  13. package/dist/analyzers/network-patterns.js.map +1 -0
  14. package/dist/analyzers/screenshot-capturer.d.ts +73 -0
  15. package/dist/analyzers/screenshot-capturer.d.ts.map +1 -0
  16. package/dist/analyzers/screenshot-capturer.js +190 -0
  17. package/dist/analyzers/screenshot-capturer.js.map +1 -0
  18. package/dist/cli/index.js +17 -7
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/core/capture-engine.d.ts +30 -25
  21. package/dist/core/capture-engine.d.ts.map +1 -1
  22. package/dist/core/capture-engine.js +290 -276
  23. package/dist/core/capture-engine.js.map +1 -1
  24. package/dist/exporters/ai-context-bundler.d.ts +88 -0
  25. package/dist/exporters/ai-context-bundler.d.ts.map +1 -0
  26. package/dist/exporters/ai-context-bundler.js +380 -0
  27. package/dist/exporters/ai-context-bundler.js.map +1 -0
  28. package/dist/security/redactor.d.ts +16 -0
  29. package/dist/security/redactor.d.ts.map +1 -1
  30. package/dist/security/redactor.js +127 -57
  31. package/dist/security/redactor.js.map +1 -1
  32. package/dist/storage/engine.d.ts +24 -21
  33. package/dist/storage/engine.d.ts.map +1 -1
  34. package/dist/storage/engine.js +210 -176
  35. package/dist/storage/engine.js.map +1 -1
  36. package/dist/storage/manifest.d.ts.map +1 -1
  37. package/dist/storage/manifest.js +4 -3
  38. package/dist/storage/manifest.js.map +1 -1
  39. package/dist/utils/version.d.ts +5 -0
  40. package/dist/utils/version.d.ts.map +1 -0
  41. package/dist/utils/version.js +53 -0
  42. package/dist/utils/version.js.map +1 -0
  43. package/package.json +3 -3
@@ -2,43 +2,95 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SecurityRedactor = void 0;
4
4
  const patterns_1 = require("./patterns");
5
+ /**
6
+ * Sensitive URL query parameter names. Values for these parameters are
7
+ * replaced with [REDACTED] in all captured URLs so that tokens, API keys,
8
+ * and session identifiers never reach the filesystem.
9
+ */
10
+ const SENSITIVE_QUERY_PARAMS = [
11
+ 'token', 'access_token', 'refresh_token', 'id_token',
12
+ 'api_key', 'apikey', 'api-key',
13
+ 'auth', 'authorization',
14
+ 'key', 'secret', 'password', 'pwd', 'pass',
15
+ 'session', 'sessionid', 'session_id',
16
+ 'sig', 'signature',
17
+ 'code', // OAuth authorization code
18
+ 'state', // OAuth state — may embed tokens
19
+ 'client_secret',
20
+ 'private_key',
21
+ 'bearer',
22
+ ];
5
23
  class SecurityRedactor {
6
24
  rules;
7
25
  redactedHeaders;
8
- sensitiveKeys = ['password', 'secret', 'token', 'apiKey', 'api_key', 'authorization', 'cookie', 'set-cookie'];
26
+ sensitiveKeys = [
27
+ 'password', 'secret', 'token', 'apiKey', 'api_key',
28
+ 'authorization', 'cookie', 'set-cookie', 'privateKey', 'private_key',
29
+ ];
9
30
  auditLog = [];
10
31
  constructor(customRules = []) {
11
32
  this.rules = [...patterns_1.BUILTIN_REDACTION_RULES, ...customRules];
12
33
  this.redactedHeaders = patterns_1.REDACTED_HEADERS;
13
34
  }
35
+ // ── URL sanitisation ────────────────────────────────────────────────────────
36
+ /**
37
+ * Sanitize a URL by replacing the values of sensitive query parameters with
38
+ * [REDACTED]. Returns the original URL string unchanged if parsing fails.
39
+ *
40
+ * Examples:
41
+ * https://api.example.com/users?api_key=sk_live_123 → …?api_key=[REDACTED]
42
+ * https://example.com/callback?code=abc&state=xyz → …?code=[REDACTED]&state=[REDACTED]
43
+ */
44
+ sanitizeUrl(url) {
45
+ if (!url)
46
+ return url;
47
+ try {
48
+ const parsed = new URL(url);
49
+ let changed = false;
50
+ for (const param of SENSITIVE_QUERY_PARAMS) {
51
+ if (parsed.searchParams.has(param)) {
52
+ parsed.searchParams.set(param, '[REDACTED]');
53
+ changed = true;
54
+ }
55
+ }
56
+ // Also redact any param whose name contains sensitive substrings
57
+ const extraSensitive = ['token', 'key', 'secret', 'password', 'auth'];
58
+ for (const [key] of Array.from(parsed.searchParams.entries())) {
59
+ const lower = key.toLowerCase();
60
+ if (extraSensitive.some(s => lower.includes(s))) {
61
+ parsed.searchParams.set(key, '[REDACTED]');
62
+ changed = true;
63
+ }
64
+ }
65
+ return changed ? parsed.toString() : url;
66
+ }
67
+ catch {
68
+ return url;
69
+ }
70
+ }
71
+ // ── Main redaction pipeline ─────────────────────────────────────────────────
14
72
  async redact(data, context, url) {
15
73
  const originalSize = JSON.stringify(data).length;
16
- let redactedData = data; // Note: we mutate in place if it's an object
17
74
  const redactions = [];
18
- // Redact headers if present
19
- if (redactedData.headers) {
20
- redactedData.headers = this.redactHeaders(redactedData.headers);
75
+ // 1. Redact sensitive headers (authorization, cookie, etc.)
76
+ if (data && typeof data === 'object' && data.headers) {
77
+ data.headers = this.redactHeaders(data.headers);
21
78
  }
22
- // Apply key-based redaction
23
- this.redactSensitiveKeys(redactedData, redactions);
24
- // Apply all pattern-based redaction rules
79
+ // 2. Key-based redaction (deep object traversal)
80
+ this.redactSensitiveKeys(data, redactions);
81
+ // 3. Pattern-based redaction (regex across all string values)
25
82
  for (const rule of this.rules) {
26
- const result = this.applyRule(redactedData, rule);
83
+ const result = this.applyRule(data, rule);
27
84
  if (result.count > 0) {
28
- redactions.push({
29
- rule: rule.name,
30
- count: result.count,
31
- locations: result.locations,
32
- });
85
+ redactions.push({ rule: rule.name, count: result.count, locations: result.locations });
33
86
  }
34
87
  }
35
- const redactedSize = JSON.stringify(redactedData).length;
36
- // Log to audit
88
+ const redactedSize = JSON.stringify(data).length;
37
89
  if (redactions.length > 0) {
38
90
  this.auditLog.push({
39
91
  timestamp: new Date().toISOString(),
40
92
  context,
41
- url: url || '',
93
+ url: url ? this.sanitizeUrl(url) : '',
42
94
  redactions: redactions.map(r => ({
43
95
  rule: r.rule,
44
96
  count: r.count,
@@ -46,36 +98,44 @@ class SecurityRedactor {
46
98
  })),
47
99
  });
48
100
  }
49
- return {
50
- originalSize,
51
- redactedSize,
52
- redactions,
53
- success: true,
54
- };
101
+ return { originalSize, redactedSize, redactions, success: true };
55
102
  }
103
+ /**
104
+ * Redact a plain string in-place and return the sanitised version.
105
+ * Useful for response bodies before they are stored.
106
+ */
107
+ async redactString(value, _context, _url) {
108
+ if (!value)
109
+ return value;
110
+ let result = value;
111
+ for (const rule of this.rules) {
112
+ result = result.replace(rule.pattern, rule.replacement);
113
+ }
114
+ return result;
115
+ }
116
+ // ── Private helpers ─────────────────────────────────────────────────────────
56
117
  redactSensitiveKeys(data, redactions) {
57
118
  const traverse = (obj, path = '') => {
58
- if (typeof obj === 'object' && obj !== null) {
59
- for (const key in obj) {
60
- const lowerKey = key.toLowerCase();
61
- const currentPath = path ? `${path}.${key}` : key;
62
- if (this.sensitiveKeys.some(sk => lowerKey.includes(sk))) {
63
- const ruleName = `sensitive_key:${key}`;
64
- obj[key] = '[REDACTED:SENSITIVE_KEY]';
65
- // Track this redaction
66
- let existingRedaction = redactions.find(r => r.rule === ruleName);
67
- if (existingRedaction) {
68
- existingRedaction.count++;
69
- existingRedaction.locations.push(currentPath);
70
- }
71
- else {
72
- redactions.push({ rule: ruleName, count: 1, locations: [currentPath] });
73
- }
119
+ if (typeof obj !== 'object' || obj === null)
120
+ return;
121
+ for (const key in obj) {
122
+ const lowerKey = key.toLowerCase();
123
+ const currentPath = path ? `${path}.${key}` : key;
124
+ if (this.sensitiveKeys.some(sk => lowerKey.includes(sk))) {
125
+ const ruleName = `sensitive_key:${key}`;
126
+ obj[key] = '[REDACTED:SENSITIVE_KEY]';
127
+ const existing = redactions.find(r => r.rule === ruleName);
128
+ if (existing) {
129
+ existing.count++;
130
+ existing.locations.push(currentPath);
74
131
  }
75
132
  else {
76
- traverse(obj[key], currentPath);
133
+ redactions.push({ rule: ruleName, count: 1, locations: [currentPath] });
77
134
  }
78
135
  }
136
+ else {
137
+ traverse(obj[key], currentPath);
138
+ }
79
139
  }
80
140
  };
81
141
  traverse(data);
@@ -83,9 +143,8 @@ class SecurityRedactor {
83
143
  redactHeaders(headers) {
84
144
  const redacted = { ...headers };
85
145
  for (const header of this.redactedHeaders) {
86
- const lowerHeader = header.toLowerCase();
87
- // Find the key in headers regardless of case
88
- const actualKey = Object.keys(redacted).find(k => k.toLowerCase() === lowerHeader);
146
+ const lower = header.toLowerCase();
147
+ const actualKey = Object.keys(redacted).find(k => k.toLowerCase() === lower);
89
148
  if (actualKey) {
90
149
  redacted[actualKey] = '[REDACTED]';
91
150
  }
@@ -96,33 +155,44 @@ class SecurityRedactor {
96
155
  let count = 0;
97
156
  const locations = [];
98
157
  const traverse = (obj, path = '') => {
99
- if (typeof obj === 'object' && obj !== null) {
100
- for (const key in obj) {
101
- const val = obj[key];
102
- if (typeof val === 'string') {
103
- const matches = val.match(rule.pattern);
104
- if (matches) {
105
- count += matches.length;
106
- locations.push(path ? `${path}.${key}` : key);
107
- // Replace in place - this now correctly mutates the object property
108
- obj[key] = val.replace(rule.pattern, rule.replacement);
109
- }
110
- }
111
- else {
112
- traverse(val, path ? `${path}.${key}` : key);
158
+ if (typeof obj !== 'object' || obj === null)
159
+ return;
160
+ for (const key in obj) {
161
+ const val = obj[key];
162
+ if (typeof val === 'string') {
163
+ // Reset lastIndex for global regexes to avoid stateful match issues
164
+ rule.pattern.lastIndex = 0;
165
+ const matches = val.match(rule.pattern);
166
+ if (matches) {
167
+ count += matches.length;
168
+ locations.push(path ? `${path}.${key}` : key);
169
+ rule.pattern.lastIndex = 0;
170
+ obj[key] = val.replace(rule.pattern, rule.replacement);
171
+ // Reset again after replace
172
+ rule.pattern.lastIndex = 0;
113
173
  }
114
174
  }
175
+ else {
176
+ traverse(val, path ? `${path}.${key}` : key);
177
+ }
115
178
  }
116
179
  };
117
180
  traverse(data);
118
181
  return { count, locations };
119
182
  }
183
+ // ── Audit log ───────────────────────────────────────────────────────────────
120
184
  getAuditLog() {
121
185
  return [...this.auditLog];
122
186
  }
123
187
  clearAuditLog() {
124
188
  this.auditLog = [];
125
189
  }
190
+ /** Returns the number of distinct redaction events across all contexts */
191
+ getTotalRedactionCount() {
192
+ return this.auditLog.reduce((sum, entry) => {
193
+ return sum + entry.redactions.reduce((s, r) => s + r.count, 0);
194
+ }, 0);
195
+ }
126
196
  }
127
197
  exports.SecurityRedactor = SecurityRedactor;
128
198
  //# sourceMappingURL=redactor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
- import { PageSnapshot } from '../types/capture';
1
+ import { PageSnapshot, PageMetadata } from '../types/capture';
2
2
  import { ManifestEntry } from '../types/storage';
3
+ export interface UpdateManifestExtras {
4
+ networkRequests?: number;
5
+ screenshots?: number;
6
+ }
3
7
  export declare class StorageEngine {
4
8
  private outputDir;
5
9
  private prettyJson;
@@ -7,39 +11,38 @@ export declare class StorageEngine {
7
11
  private contentHashHistory;
8
12
  private forceCapture;
9
13
  constructor(outputDir: string, prettyJson?: boolean, forceCapture?: boolean);
10
- /**
11
- * Set force capture mode - always write artifacts even if content hash unchanged
12
- */
13
14
  setForceCapture(force: boolean): void;
14
- /**
15
- * Check if content has changed since last capture
16
- */
17
15
  hasContentChanged(pageName: string, contentHash: string): boolean;
18
- /**
19
- * Record content hash for a page
20
- */
21
16
  recordContentHash(pageName: string, contentHash: string): void;
22
17
  initialize(): Promise<void>;
18
+ /**
19
+ * Resolve the on-disk directory for a given page's metadata.
20
+ * Mirrors the same logic used inside savePageSnapshot so callers can
21
+ * compute the directory without needing to save first.
22
+ */
23
+ resolvePageDir(metadata: Pick<PageMetadata, 'domain' | 'pageName'>): string;
23
24
  getUniqueScriptPath(url: string): Promise<string>;
24
25
  mergeRecordedScript(url: string, recordedScriptPath: string): Promise<string>;
25
26
  private mergePlaywrightSpec;
26
27
  savePageSnapshot(snapshot: PageSnapshot): Promise<void>;
27
- /**
28
- * Save the components registry and update manifest reference
29
- */
28
+ private saveFrames;
30
29
  saveComponentsRegistry(registry: any, domainName: string): Promise<void>;
31
- /**
32
- * Update manifest with components registry reference
33
- */
34
30
  updateManifestWithComponents(domainName: string, totalComponents: number): Promise<void>;
35
- updateGlobalManifest(entry: ManifestEntry): Promise<void>;
31
+ updateGlobalManifest(entry: ManifestEntry, extras?: UpdateManifestExtras): Promise<void>;
32
+ saveUserInteractions(url: string, interactions: any[]): Promise<void>;
33
+ private extractDomainName;
36
34
  private writeJson;
37
35
  /**
38
- * Beautify HTML by adding proper indentation and line breaks
39
- * This makes the DOM more readable for RAG/context analysis
40
- * Properly handles self-closing tags and preserves HTML structure
36
+ * Recursively walk a directory and sum all file sizes in bytes.
37
+ * Returns 0 if the directory does not exist.
38
+ */
39
+ private computeDirectorySizeBytes;
40
+ private formatBytes;
41
+ /**
42
+ * Beautify HTML by adding proper indentation and line breaks.
43
+ * Self-closing / void elements are handled correctly so the indent
44
+ * level is never corrupted by unclosed tags.
41
45
  */
42
- saveUserInteractions(url: string, interactions: any[]): Promise<void>;
43
46
  private beautifyHTML;
44
47
  }
45
48
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/storage/engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAkB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjE,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,YAAY,CAAkB;gBAE1B,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,EAAE,YAAY,GAAE,OAAe;IAOxF;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIrC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAMjE;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAQxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBjD,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BnF,OAAO,CAAC,mBAAmB;IA+ErB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4G7D;;OAEG;IACG,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9E;;OAEG;IACG,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxF,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAgDjD,SAAS;IAOvB;;;;OAIG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C3E,OAAO,CAAC,YAAY;CA0ErB"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/storage/engine.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAkB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,YAAY,CAAkB;gBAE1B,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,EAAE,YAAY,GAAE,OAAe;IASxF,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAMrC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAMjE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IASxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,MAAM;IAQrE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBjD,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BnF,OAAO,CAAC,mBAAmB;IAkErB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAkG/C,UAAU;IAgClB,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxF,oBAAoB,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,GAAE,oBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC;IA+DV,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B3E,OAAO,CAAC,iBAAiB;YAOX,SAAS;IAOvB;;;OAGG;YACW,yBAAyB;IAuBvC,OAAO,CAAC,WAAW;IAOnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CA6DrB"}