configproof 0.3.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/adapters/dotenv.d.ts +3 -0
  4. package/dist/adapters/dotenv.js +277 -0
  5. package/dist/adapters/dotenv.js.map +1 -0
  6. package/dist/adapters/native-env.d.ts +7 -0
  7. package/dist/adapters/native-env.js +196 -0
  8. package/dist/adapters/native-env.js.map +1 -0
  9. package/dist/adapters/registry.d.ts +7 -0
  10. package/dist/adapters/registry.js +30 -0
  11. package/dist/adapters/registry.js.map +1 -0
  12. package/dist/agent/server.d.ts +15 -0
  13. package/dist/agent/server.js +254 -0
  14. package/dist/agent/server.js.map +1 -0
  15. package/dist/analysis/diagnose.d.ts +64 -0
  16. package/dist/analysis/diagnose.js +142 -0
  17. package/dist/analysis/diagnose.js.map +1 -0
  18. package/dist/analysis/history.d.ts +52 -0
  19. package/dist/analysis/history.js +119 -0
  20. package/dist/analysis/history.js.map +1 -0
  21. package/dist/analysis/policy.d.ts +161 -0
  22. package/dist/analysis/policy.js +192 -0
  23. package/dist/analysis/policy.js.map +1 -0
  24. package/dist/analysis/provenance.d.ts +45 -0
  25. package/dist/analysis/provenance.js +144 -0
  26. package/dist/analysis/provenance.js.map +1 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.js +286 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/core/analyze.d.ts +46 -0
  31. package/dist/core/analyze.js +168 -0
  32. package/dist/core/analyze.js.map +1 -0
  33. package/dist/core/collect.d.ts +5 -0
  34. package/dist/core/collect.js +147 -0
  35. package/dist/core/collect.js.map +1 -0
  36. package/dist/core/export.d.ts +53 -0
  37. package/dist/core/export.js +155 -0
  38. package/dist/core/export.js.map +1 -0
  39. package/dist/core/io.d.ts +13 -0
  40. package/dist/core/io.js +100 -0
  41. package/dist/core/io.js.map +1 -0
  42. package/dist/core/privacy.d.ts +25 -0
  43. package/dist/core/privacy.js +113 -0
  44. package/dist/core/privacy.js.map +1 -0
  45. package/dist/core/schema.d.ts +2149 -0
  46. package/dist/core/schema.js +181 -0
  47. package/dist/core/schema.js.map +1 -0
  48. package/dist/demo.d.ts +1 -0
  49. package/dist/demo.js +45 -0
  50. package/dist/demo.js.map +1 -0
  51. package/dist/index.d.ts +23 -0
  52. package/dist/index.js +63 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/launcher.d.ts +27 -0
  55. package/dist/launcher.js +122 -0
  56. package/dist/launcher.js.map +1 -0
  57. package/dist/report/html.d.ts +5 -0
  58. package/dist/report/html.js +109 -0
  59. package/dist/report/html.js.map +1 -0
  60. package/dist/runtime/api.d.ts +44 -0
  61. package/dist/runtime/api.js +29 -0
  62. package/dist/runtime/api.js.map +1 -0
  63. package/dist/runtime/callsite.d.ts +3 -0
  64. package/dist/runtime/callsite.js +61 -0
  65. package/dist/runtime/callsite.js.map +1 -0
  66. package/dist/runtime/children.d.ts +8 -0
  67. package/dist/runtime/children.js +69 -0
  68. package/dist/runtime/children.js.map +1 -0
  69. package/dist/runtime/environment.d.ts +3 -0
  70. package/dist/runtime/environment.js +53 -0
  71. package/dist/runtime/environment.js.map +1 -0
  72. package/dist/runtime/preload.d.ts +1 -0
  73. package/dist/runtime/preload.js +117 -0
  74. package/dist/runtime/preload.js.map +1 -0
  75. package/dist/runtime/recorder.d.ts +59 -0
  76. package/dist/runtime/recorder.js +254 -0
  77. package/dist/runtime/recorder.js.map +1 -0
  78. package/dist/runtime/workers.d.ts +12 -0
  79. package/dist/runtime/workers.js +127 -0
  80. package/dist/runtime/workers.js.map +1 -0
  81. package/docs/ARCHITECTURE.md +54 -0
  82. package/docs/COMPATIBILITY.md +24 -0
  83. package/docs/PRIVACY.md +17 -0
  84. package/docs/VALIDATION.md +42 -0
  85. package/fixtures/bypass/app.cjs +6 -0
  86. package/fixtures/bypass/early.cjs +2 -0
  87. package/fixtures/child-process/child.cjs +2 -0
  88. package/fixtures/child-process/parent.cjs +5 -0
  89. package/fixtures/custom-target/app.cjs +4 -0
  90. package/fixtures/custom-target/sample.env +1 -0
  91. package/fixtures/esm/app.mjs +5 -0
  92. package/fixtures/exit-code/app.cjs +4 -0
  93. package/fixtures/failure-boundary/app.cjs +7 -0
  94. package/fixtures/load-order/app.cjs +9 -0
  95. package/fixtures/load-order/first.env +1 -0
  96. package/fixtures/load-order/second.env +1 -0
  97. package/fixtures/manifest.json +16 -0
  98. package/fixtures/native-env/app.cjs +6 -0
  99. package/fixtures/native-env/failure.cjs +4 -0
  100. package/fixtures/native-env/sample.env +1 -0
  101. package/fixtures/native-env/startup.cjs +2 -0
  102. package/fixtures/runtime-mutation/app.cjs +12 -0
  103. package/fixtures/source-map/input.ts +5 -0
  104. package/fixtures/source-map/tsconfig.json +7 -0
  105. package/fixtures/stale-inheritance/app.cjs +4 -0
  106. package/fixtures/stale-inheritance/sample.env +1 -0
  107. package/fixtures/v03-manifest.json +32 -0
  108. package/fixtures/worker/parent.cjs +3 -0
  109. package/fixtures/worker/worker.cjs +2 -0
  110. package/fixtures/worker-modes/parent.cjs +17 -0
  111. package/fixtures/worker-modes/worker.cjs +4 -0
  112. package/package.json +64 -0
  113. package/policies/configtrace-policy.yaml +23 -0
  114. package/policies/issue-share.yaml +12 -0
  115. package/policies/minimal.yaml +8 -0
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PathScrubber = exports.WatchSet = void 0;
7
+ exports.createComparisonKey = createComparisonKey;
8
+ exports.writeComparisonKey = writeComparisonKey;
9
+ exports.readComparisonKey = readComparisonKey;
10
+ exports.fingerprint = fingerprint;
11
+ exports.sameValue = sameValue;
12
+ exports.globToRegex = globToRegex;
13
+ exports.parseWatch = parseWatch;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const node_fs_1 = __importDefault(require("node:fs"));
16
+ const node_path_1 = __importDefault(require("node:path"));
17
+ const node_url_1 = require("node:url");
18
+ const schema_1 = require("./schema");
19
+ const io_1 = require("./io");
20
+ function createComparisonKey() {
21
+ return { version: 1, domainId: (0, io_1.uniqueId)('d'), secret: (0, node_crypto_1.randomBytes)(32).toString('hex') };
22
+ }
23
+ function writeComparisonKey(file) {
24
+ const key = createComparisonKey();
25
+ (0, io_1.writeNew)(file, JSON.stringify(key, null, 2) + '\n');
26
+ return key;
27
+ }
28
+ function readComparisonKey(file) {
29
+ try {
30
+ const stat = node_fs_1.default.lstatSync(file);
31
+ if (!stat.isFile() || (process.platform !== 'win32' && (stat.mode & 0o077) !== 0)) {
32
+ throw new io_1.UserError('Comparison key must be a regular private file (chmod 600 on POSIX).', 65);
33
+ }
34
+ return schema_1.KeyFileSchema.parse(JSON.parse((0, io_1.readBounded)(file, 4096)));
35
+ }
36
+ catch (error) {
37
+ if (error instanceof io_1.UserError)
38
+ throw error;
39
+ throw new io_1.UserError('Invalid comparison key file.', 65);
40
+ }
41
+ }
42
+ /** Length framing prevents collisions across key/value boundaries. No raw-value cache. */
43
+ function fingerprint(key, name, value) {
44
+ if (value === undefined)
45
+ return { state: 'missing' };
46
+ const digest = (0, node_crypto_1.createHmac)('sha256', Buffer.from(key.secret, 'hex'))
47
+ .update('configtrace:value:v1\0').update(String(Buffer.byteLength(name))).update(':')
48
+ .update(name).update(':').update(value).digest('hex');
49
+ return { state: 'present', token: digest, empty: value.length === 0 };
50
+ }
51
+ function sameValue(a, b) {
52
+ return !!a && !!b && a.state === b.state &&
53
+ (a.state === 'missing' || (a.state === 'present' && b.state === 'present' && a.token === b.token));
54
+ }
55
+ function globToRegex(pattern, insensitive = false) {
56
+ const escaped = pattern.split('').map(c => c === '*' ? '.*' : c === '?' ? '.' : c.replace(/[\\^$+.[\]{}()|]/g, '\\$&')).join('');
57
+ return new RegExp(`^${escaped}$`, insensitive ? 'i' : '');
58
+ }
59
+ function parseWatch(raw) {
60
+ const patterns = [...new Set(raw.flatMap(x => x.split(',')).map(x => x.trim()).filter(Boolean))];
61
+ if (!patterns.length || patterns.length > 64 || patterns.some(p => !/^[A-Za-z_*?][A-Za-z0-9_.*?-]{0,127}$/.test(p))) {
62
+ throw new io_1.UserError('Supply 1–64 environment key patterns using letters, digits, _, ., -, * and ?.');
63
+ }
64
+ return patterns;
65
+ }
66
+ class WatchSet {
67
+ patterns;
68
+ insensitive;
69
+ regex;
70
+ constructor(patterns, insensitive) {
71
+ this.patterns = patterns;
72
+ this.insensitive = insensitive;
73
+ this.regex = patterns.map(p => globToRegex(p, insensitive));
74
+ }
75
+ canonical(key) { return this.insensitive ? key.toUpperCase() : key; }
76
+ matches(key) {
77
+ return typeof key === 'string' && key.length <= 128 && !key.toUpperCase().startsWith('__CONFIGTRACE_') && this.regex.some(r => r.test(key));
78
+ }
79
+ exact() { return this.patterns.filter(p => !/[*?]/.test(p)).map(k => this.canonical(k)); }
80
+ }
81
+ exports.WatchSet = WatchSet;
82
+ /** Metadata is minimized, not magically anonymized. Export can remove remaining project names. */
83
+ class PathScrubber {
84
+ root;
85
+ salt;
86
+ constructor(root, salt) {
87
+ this.root = root;
88
+ this.salt = salt;
89
+ }
90
+ scrub(input) {
91
+ let file = input;
92
+ try {
93
+ if (file.startsWith('file://'))
94
+ file = (0, node_url_1.fileURLToPath)(file);
95
+ }
96
+ catch {
97
+ return '<unresolved>';
98
+ }
99
+ file = file.split('?')[0].split('#')[0];
100
+ if (file.startsWith('node:') || file.startsWith('<'))
101
+ return file.slice(0, 256);
102
+ const absolute = node_path_1.default.resolve(this.root, file);
103
+ const relative = node_path_1.default.relative(this.root, absolute);
104
+ if (relative && !relative.startsWith(`..${node_path_1.default.sep}`) && relative !== '..' && !node_path_1.default.isAbsolute(relative)) {
105
+ return relative.split(node_path_1.default.sep).join('/').slice(0, 512);
106
+ }
107
+ if (!relative)
108
+ return '.';
109
+ return `<external:${(0, node_crypto_1.createHmac)('sha256', this.salt).update(absolute).digest('hex').slice(0, 12)}>`;
110
+ }
111
+ }
112
+ exports.PathScrubber = PathScrubber;
113
+ //# sourceMappingURL=privacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/core/privacy.ts"],"names":[],"mappings":"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"}