@treza/cli 1.1.0 → 1.2.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 (51) hide show
  1. package/README.md +19 -0
  2. package/dist/commands/kyc.js +39 -0
  3. package/dist/commands/kyc.js.map +1 -1
  4. package/dist/commands/pii.d.ts +3 -0
  5. package/dist/commands/pii.d.ts.map +1 -0
  6. package/dist/commands/pii.js +172 -0
  7. package/dist/commands/pii.js.map +1 -0
  8. package/dist/commands/redact/index.d.ts +3 -0
  9. package/dist/commands/redact/index.d.ts.map +1 -0
  10. package/dist/commands/redact/index.js +10 -0
  11. package/dist/commands/redact/index.js.map +1 -0
  12. package/dist/commands/redact/log.d.ts +3 -0
  13. package/dist/commands/redact/log.d.ts.map +1 -0
  14. package/dist/commands/redact/log.js +48 -0
  15. package/dist/commands/redact/log.js.map +1 -0
  16. package/dist/commands/redact/proxy.d.ts +3 -0
  17. package/dist/commands/redact/proxy.d.ts.map +1 -0
  18. package/dist/commands/redact/proxy.js +269 -0
  19. package/dist/commands/redact/proxy.js.map +1 -0
  20. package/dist/commands/redact/run.d.ts +3 -0
  21. package/dist/commands/redact/run.d.ts.map +1 -0
  22. package/dist/commands/redact/run.js +115 -0
  23. package/dist/commands/redact/run.js.map +1 -0
  24. package/dist/commands/redact/trial.d.ts +3 -0
  25. package/dist/commands/redact/trial.d.ts.map +1 -0
  26. package/dist/commands/redact/trial.js +33 -0
  27. package/dist/commands/redact/trial.js.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/utils/api.d.ts +36 -0
  31. package/dist/utils/api.d.ts.map +1 -1
  32. package/dist/utils/api.js +41 -0
  33. package/dist/utils/api.js.map +1 -1
  34. package/dist/utils/config.d.ts +6 -0
  35. package/dist/utils/config.d.ts.map +1 -1
  36. package/dist/utils/config.js +15 -0
  37. package/dist/utils/config.js.map +1 -1
  38. package/dist/utils/redact-api.d.ts +124 -0
  39. package/dist/utils/redact-api.d.ts.map +1 -0
  40. package/dist/utils/redact-api.js +231 -0
  41. package/dist/utils/redact-api.js.map +1 -0
  42. package/dist/utils/redact-config.d.ts +22 -0
  43. package/dist/utils/redact-config.d.ts.map +1 -0
  44. package/dist/utils/redact-config.js +27 -0
  45. package/dist/utils/redact-config.js.map +1 -0
  46. package/dist/utils/redact-local.d.ts +3 -0
  47. package/dist/utils/redact-local.d.ts.map +1 -0
  48. package/dist/utils/redact-local.js +160 -0
  49. package/dist/utils/redact-local.js.map +1 -0
  50. package/dist/utils/redact-manifest.json +44 -0
  51. package/package.json +3 -2
@@ -0,0 +1,160 @@
1
+ /**
2
+ * In-process redaction for `--local` mode.
3
+ *
4
+ * Pipeline:
5
+ * 1. Deterministic regex/checksum recognizers (SSN, CC w/ Luhn, MRN, DOB cues)
6
+ * — these match the in-enclave recognizers exactly via `redact-manifest.json`.
7
+ * 2. Lightweight regex-based NER fallback for emails, phones, URLs, and dates.
8
+ *
9
+ * Names and free-form addresses require the Privacy Filter token-classifier;
10
+ * that swap is gated on shipping an ONNX export through `@huggingface/transformers`.
11
+ * When wired in, replace `fallbackNer` with the transformers.js pipeline; the rest
12
+ * of this module (merge, placeholder assignment, manifest) stays the same.
13
+ */
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+ import { fileURLToPath } from 'url';
17
+ const MANIFEST_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), 'redact-manifest.json');
18
+ let cachedManifest = null;
19
+ function loadManifest() {
20
+ if (cachedManifest)
21
+ return cachedManifest;
22
+ const raw = fs.readFileSync(MANIFEST_PATH, 'utf8');
23
+ cachedManifest = JSON.parse(raw);
24
+ return cachedManifest;
25
+ }
26
+ function luhnValid(digits) {
27
+ const trimmed = digits.replace(/[\s-]/g, '');
28
+ if (trimmed.length < 13 || trimmed.length > 19 || !/^\d+$/.test(trimmed))
29
+ return false;
30
+ let sum = 0;
31
+ let alt = false;
32
+ for (let i = trimmed.length - 1; i >= 0; i--) {
33
+ let d = trimmed.charCodeAt(i) - 48;
34
+ if (alt) {
35
+ d *= 2;
36
+ if (d > 9)
37
+ d -= 9;
38
+ }
39
+ sum += d;
40
+ alt = !alt;
41
+ }
42
+ return sum % 10 === 0;
43
+ }
44
+ function ssnValid(match) {
45
+ const [, a, b, c] = match;
46
+ if (a === '000' || a === '666' || a.startsWith('9'))
47
+ return false;
48
+ if (b === '00')
49
+ return false;
50
+ if (c === '0000')
51
+ return false;
52
+ return true;
53
+ }
54
+ function runRegexRecognizers(text, manifest) {
55
+ const spans = [];
56
+ for (const rec of manifest.regexRecognizers) {
57
+ const re = new RegExp(rec.pattern, 'g');
58
+ let match;
59
+ while ((match = re.exec(text)) !== null) {
60
+ if (rec.validator === 'ssn_format' && !ssnValid(match))
61
+ continue;
62
+ if (rec.validator === 'luhn' && !luhnValid(match[0]))
63
+ continue;
64
+ const captureIdx = rec.captureGroup ?? 0;
65
+ const captured = match[captureIdx] ?? match[0];
66
+ const offset = match[0].indexOf(captured);
67
+ const start = match.index + (offset >= 0 ? offset : 0);
68
+ const end = start + captured.length;
69
+ spans.push({ type: rec.type, start, end, original: captured });
70
+ }
71
+ }
72
+ return spans;
73
+ }
74
+ function isDobContext(text, start, manifest) {
75
+ const window = manifest.dobCueWindowChars;
76
+ const before = text.slice(Math.max(0, start - window), start).toLowerCase();
77
+ for (const cue of manifest.dobCueWords) {
78
+ if (before.includes(cue.toLowerCase()))
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * Best-effort NER fallback for the MVP local mode. Detects emails, phones,
85
+ * URLs, and simple dates with deterministic patterns. This is a stand-in
86
+ * until the Privacy Filter ONNX export is wired in (handled in a later
87
+ * task; the harness here makes that swap a one-line change).
88
+ */
89
+ function fallbackNer(text) {
90
+ const found = [];
91
+ const patterns = [
92
+ ['private_email', /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi],
93
+ ['private_phone', /\b(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g],
94
+ ['private_url', /\bhttps?:\/\/[^\s)]+/g],
95
+ [
96
+ 'private_date',
97
+ /\b(?:\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}|\d{4}-\d{2}-\d{2}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+\d{1,2},?\s+\d{4})\b/g,
98
+ ],
99
+ ];
100
+ for (const [type, re] of patterns) {
101
+ let m;
102
+ while ((m = re.exec(text)) !== null) {
103
+ found.push({ type, start: m.index, end: m.index + m[0].length });
104
+ }
105
+ }
106
+ return found;
107
+ }
108
+ function mergeSpans(regex, ner) {
109
+ const out = [...regex];
110
+ for (const n of ner) {
111
+ const overlaps = regex.some((r) => !(n.end <= r.start || n.start >= r.end));
112
+ if (!overlaps) {
113
+ out.push({ type: n.type, start: n.start, end: n.end, original: '' });
114
+ }
115
+ }
116
+ out.sort((a, b) => a.start - b.start);
117
+ return out;
118
+ }
119
+ function assignPlaceholders(spans, text, manifest) {
120
+ const counters = {};
121
+ const entities = [];
122
+ let cursor = 0;
123
+ let redacted = '';
124
+ for (const span of spans) {
125
+ let label = span.type;
126
+ if (label === 'private_date' && isDobContext(text, span.start, manifest)) {
127
+ label = 'DOB';
128
+ }
129
+ const placeholderBase = manifest.placeholderMap[label] || label.toUpperCase();
130
+ counters[placeholderBase] = (counters[placeholderBase] || 0) + 1;
131
+ const placeholder = `[${placeholderBase}_${counters[placeholderBase]}]`;
132
+ redacted += text.slice(cursor, span.start);
133
+ const placeholderStart = redacted.length;
134
+ redacted += placeholder;
135
+ cursor = span.end;
136
+ entities.push({
137
+ type: placeholderBase,
138
+ placeholder,
139
+ start: placeholderStart,
140
+ end: placeholderStart + placeholder.length,
141
+ });
142
+ }
143
+ redacted += text.slice(cursor);
144
+ return { redacted, entities };
145
+ }
146
+ export async function redactTextLocal(text) {
147
+ const manifest = loadManifest();
148
+ const regexSpans = runRegexRecognizers(text, manifest);
149
+ const ner = fallbackNer(text);
150
+ const merged = mergeSpans(regexSpans, ner);
151
+ const { redacted, entities } = assignPlaceholders(merged, text, manifest);
152
+ return {
153
+ redacted,
154
+ entities,
155
+ requestId: `local-${Date.now().toString(36)}`,
156
+ modelVersion: 'local-fallback-ner-0.1',
157
+ recognizerVersion: manifest.recognizerVersion,
158
+ };
159
+ }
160
+ //# sourceMappingURL=redact-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-local.js","sourceRoot":"","sources":["../../src/utils/redact-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ {
2
+ "recognizerVersion": "0.1.0",
3
+ "placeholderMap": {
4
+ "private_person": "NAME",
5
+ "private_address": "ADDRESS",
6
+ "private_email": "EMAIL",
7
+ "private_phone": "PHONE",
8
+ "private_url": "URL",
9
+ "private_date": "DATE",
10
+ "account_number": "ACCOUNT",
11
+ "secret": "SECRET",
12
+ "SSN": "SSN",
13
+ "CREDIT_CARD": "CC",
14
+ "MRN": "MRN",
15
+ "DOB": "DOB"
16
+ },
17
+ "regexRecognizers": [
18
+ {
19
+ "type": "SSN",
20
+ "pattern": "\\b(?!000|666|9\\d{2})(\\d{3})-(?!00)(\\d{2})-(?!0000)(\\d{4})\\b",
21
+ "validator": "ssn_format"
22
+ },
23
+ {
24
+ "type": "CREDIT_CARD",
25
+ "pattern": "\\b(?:\\d[ -]?){13,19}\\b",
26
+ "validator": "luhn"
27
+ },
28
+ {
29
+ "type": "MRN",
30
+ "pattern": "\\b(?:MRN|Medical Record(?: Number)?)[:#\\s]*([A-Z0-9-]{4,12})\\b",
31
+ "validator": "none",
32
+ "captureGroup": 1
33
+ }
34
+ ],
35
+ "dobCueWords": [
36
+ "dob",
37
+ "born",
38
+ "date of birth",
39
+ "patient",
40
+ "mrn",
41
+ "medical record"
42
+ ],
43
+ "dobCueWindowChars": 64
44
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treza/cli",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Command-line interface for the Treza platform - manage enclaves, KYC proofs, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,7 +8,8 @@
8
8
  "treza": "./dist/index.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc",
11
+ "build": "tsc && npm run build:assets",
12
+ "build:assets": "node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/utils',{recursive:true});fs.copyFileSync('src/utils/redact-manifest.json','dist/utils/redact-manifest.json');\"",
12
13
  "dev": "tsc -w",
13
14
  "start": "node dist/index.js",
14
15
  "lint": "eslint src --ext .ts",