rehydra 0.4.3 → 0.5.2

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/cli/bin.d.ts +3 -0
  2. package/dist/cli/bin.d.ts.map +1 -0
  3. package/dist/cli/bin.js +24 -0
  4. package/dist/cli/bin.js.map +1 -0
  5. package/dist/cli/commands/anonymize.d.ts +3 -0
  6. package/dist/cli/commands/anonymize.d.ts.map +1 -0
  7. package/dist/cli/commands/anonymize.js +264 -0
  8. package/dist/cli/commands/anonymize.js.map +1 -0
  9. package/dist/cli/commands/inspect.d.ts +3 -0
  10. package/dist/cli/commands/inspect.d.ts.map +1 -0
  11. package/dist/cli/commands/inspect.js +73 -0
  12. package/dist/cli/commands/inspect.js.map +1 -0
  13. package/dist/cli/commands/rehydrate.d.ts +3 -0
  14. package/dist/cli/commands/rehydrate.d.ts.map +1 -0
  15. package/dist/cli/commands/rehydrate.js +30 -0
  16. package/dist/cli/commands/rehydrate.js.map +1 -0
  17. package/dist/cli/commands/setup-ner.d.ts +3 -0
  18. package/dist/cli/commands/setup-ner.d.ts.map +1 -0
  19. package/dist/cli/commands/setup-ner.js +41 -0
  20. package/dist/cli/commands/setup-ner.js.map +1 -0
  21. package/dist/cli/main.d.ts +14 -0
  22. package/dist/cli/main.d.ts.map +1 -0
  23. package/dist/cli/main.js +135 -0
  24. package/dist/cli/main.js.map +1 -0
  25. package/dist/cli/utils/color.d.ts +12 -0
  26. package/dist/cli/utils/color.d.ts.map +1 -0
  27. package/dist/cli/utils/color.js +46 -0
  28. package/dist/cli/utils/color.js.map +1 -0
  29. package/dist/cli/utils/errors.d.ts +8 -0
  30. package/dist/cli/utils/errors.d.ts.map +1 -0
  31. package/dist/cli/utils/errors.js +12 -0
  32. package/dist/cli/utils/errors.js.map +1 -0
  33. package/dist/cli/utils/format.d.ts +14 -0
  34. package/dist/cli/utils/format.d.ts.map +1 -0
  35. package/dist/cli/utils/format.js +63 -0
  36. package/dist/cli/utils/format.js.map +1 -0
  37. package/dist/cli/utils/io.d.ts +19 -0
  38. package/dist/cli/utils/io.d.ts.map +1 -0
  39. package/dist/cli/utils/io.js +53 -0
  40. package/dist/cli/utils/io.js.map +1 -0
  41. package/dist/cli/utils/pii-map-file.d.ts +14 -0
  42. package/dist/cli/utils/pii-map-file.d.ts.map +1 -0
  43. package/dist/cli/utils/pii-map-file.js +32 -0
  44. package/dist/cli/utils/pii-map-file.js.map +1 -0
  45. package/dist/cli/utils/progress.d.ts +4 -0
  46. package/dist/cli/utils/progress.d.ts.map +1 -0
  47. package/dist/cli/utils/progress.js +21 -0
  48. package/dist/cli/utils/progress.js.map +1 -0
  49. package/dist/core/anonymizer.d.ts +14 -0
  50. package/dist/core/anonymizer.d.ts.map +1 -1
  51. package/dist/core/anonymizer.js +4 -0
  52. package/dist/core/anonymizer.js.map +1 -1
  53. package/dist/ner/ner-model.d.ts +18 -0
  54. package/dist/ner/ner-model.d.ts.map +1 -1
  55. package/dist/ner/ner-model.js +46 -8
  56. package/dist/ner/ner-model.js.map +1 -1
  57. package/package.json +7 -1
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ // Node 18 does not expose globalThis.crypto by default
3
+ import { webcrypto } from "node:crypto";
4
+ if (globalThis.crypto === undefined) {
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
6
+ globalThis.crypto = webcrypto;
7
+ }
8
+ import { run } from "./main.js";
9
+ import { CLIError } from "./utils/errors.js";
10
+ try {
11
+ const exitCode = await run();
12
+ process.exitCode = exitCode;
13
+ }
14
+ catch (err) {
15
+ if (err instanceof CLIError) {
16
+ process.stderr.write(`Error: ${err.message}\n`);
17
+ process.exitCode = err.exitCode;
18
+ }
19
+ else {
20
+ process.stderr.write(`Unexpected error: ${err instanceof Error ? err.message : String(err)}\n`);
21
+ process.exitCode = 1;
22
+ }
23
+ }
24
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AAEA,uDAAuD;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;IACpC,uGAAuG;IACvG,UAAU,CAAC,MAAM,GAAG,SAAgB,CAAC;AACvC,CAAC;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;IAC7B,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1E,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedOptions } from "../main.js";
2
+ export declare function anonymizeCommand(filePath: string | undefined, options: ParsedOptions): Promise<number>;
3
+ //# sourceMappingURL=anonymize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anonymize.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/anonymize.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyFhD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAcjB"}
@@ -0,0 +1,264 @@
1
+ import { pipeline } from "node:stream/promises";
2
+ import { createAnonymizer, PIIType, mergePolicy, generateKey, uint8ArrayToBase64, ConfigKeyProvider, } from "../../index.js";
3
+ import { createAnonymizerStream, } from "../../streaming/index.js";
4
+ import { CLIError } from "../utils/errors.js";
5
+ import { readInput, writeOutput, getInputStream, getOutputStream } from "../utils/io.js";
6
+ import { formatText, formatJson, formatNdjson, formatStats } from "../utils/format.js";
7
+ import { savePIIMapFile } from "../utils/pii-map-file.js";
8
+ function parseTypes(typesStr) {
9
+ const allValues = new Set(Object.values(PIIType));
10
+ const types = new Set();
11
+ for (const raw of typesStr.split(",")) {
12
+ const t = raw.trim().toUpperCase();
13
+ if (t === "")
14
+ continue;
15
+ if (!allValues.has(t)) {
16
+ throw new CLIError(`Unknown PII type: ${raw.trim()}\nValid types: ${[...allValues].join(", ")}`);
17
+ }
18
+ types.add(t);
19
+ }
20
+ if (types.size === 0) {
21
+ throw new CLIError("--types must specify at least one PII type");
22
+ }
23
+ return types;
24
+ }
25
+ function validateNerMode(mode) {
26
+ const valid = ["disabled", "quantized", "standard"];
27
+ if (!valid.includes(mode)) {
28
+ throw new CLIError(`Invalid NER mode: ${mode}\nValid modes: ${valid.join(", ")}`);
29
+ }
30
+ return mode;
31
+ }
32
+ function validateMode(mode) {
33
+ if (mode !== "anonymize" && mode !== "pseudonymize") {
34
+ throw new CLIError(`Invalid mode: ${mode}\nValid modes: anonymize, pseudonymize`);
35
+ }
36
+ return mode;
37
+ }
38
+ function validateFormat(format) {
39
+ if (format !== "text" && format !== "json" && format !== "ndjson") {
40
+ throw new CLIError(`Invalid format: ${format}\nValid formats: text, json, ndjson`);
41
+ }
42
+ return format;
43
+ }
44
+ function setupKeyProvider(options) {
45
+ const envKey = process.env["REHYDRA_KEY"];
46
+ const flagKey = options.key;
47
+ const externalKey = flagKey ?? envKey;
48
+ if (externalKey !== undefined) {
49
+ return { keyProvider: new ConfigKeyProvider(externalKey), keyBase64: undefined };
50
+ }
51
+ const keyBytes = generateKey();
52
+ const keyBase64 = uint8ArrayToBase64(keyBytes);
53
+ return { keyProvider: new ConfigKeyProvider(keyBase64), keyBase64 };
54
+ }
55
+ function buildNerConfig(nerMode, quiet) {
56
+ if (nerMode === "disabled")
57
+ return undefined;
58
+ return {
59
+ mode: nerMode,
60
+ autoDownload: true,
61
+ onStatus: quiet
62
+ ? undefined
63
+ : (status) => {
64
+ process.stderr.write(`${status}\n`);
65
+ },
66
+ };
67
+ }
68
+ export async function anonymizeCommand(filePath, options) {
69
+ const nerMode = validateNerMode(options.ner);
70
+ const anonMode = validateMode(options.mode);
71
+ const format = validateFormat(options.format);
72
+ const { keyProvider, keyBase64 } = setupKeyProvider(options);
73
+ const policy = options.types !== undefined
74
+ ? mergePolicy({ enabledTypes: parseTypes(options.types) })
75
+ : undefined;
76
+ // Use streaming for file inputs, batch for stdin
77
+ if (filePath !== undefined) {
78
+ return anonymizeFile(filePath, options, nerMode, anonMode, format, keyProvider, keyBase64, policy);
79
+ }
80
+ return anonymizeBatch(options, nerMode, anonMode, format, keyProvider, keyBase64, policy);
81
+ }
82
+ /**
83
+ * Batch anonymization for stdin input.
84
+ */
85
+ async function anonymizeBatch(options, nerMode, anonMode, format, keyProvider, keyBase64, policy) {
86
+ const input = await readInput();
87
+ const config = {
88
+ mode: anonMode,
89
+ keyProvider,
90
+ };
91
+ const nerConfig = buildNerConfig(nerMode, options.quiet);
92
+ if (nerConfig !== undefined) {
93
+ config.ner = nerConfig;
94
+ }
95
+ const anonymizer = createAnonymizer(config);
96
+ await anonymizer.initialize();
97
+ try {
98
+ const result = await anonymizer.anonymize(input, options.locale, policy !== undefined ? policy : undefined);
99
+ // Save PII map file in pseudonymize mode
100
+ if (anonMode === "pseudonymize" && result.piiMap !== undefined) {
101
+ const piiMapFile = {
102
+ version: 1,
103
+ createdAt: new Date().toISOString(),
104
+ ...(keyBase64 !== undefined ? { key: keyBase64 } : {}),
105
+ piiMap: result.piiMap,
106
+ stats: {
107
+ totalEntities: result.stats.totalEntities,
108
+ countsByType: result.stats.countsByType,
109
+ },
110
+ };
111
+ await savePIIMapFile(options["pii-map"], piiMapFile);
112
+ if (!options.quiet) {
113
+ process.stderr.write(`PII map saved to ${options["pii-map"]}\n`);
114
+ }
115
+ }
116
+ // Format output
117
+ let output;
118
+ switch (format) {
119
+ case "text":
120
+ output = formatText(result);
121
+ break;
122
+ case "json":
123
+ output = formatJson(result);
124
+ break;
125
+ case "ndjson":
126
+ output = formatNdjson(result);
127
+ break;
128
+ }
129
+ // Ensure trailing newline
130
+ if (!output.endsWith("\n")) {
131
+ output += "\n";
132
+ }
133
+ await writeOutput(output, options.output);
134
+ // Print stats to stderr if verbose
135
+ if (options.verbose) {
136
+ process.stderr.write(formatStats(result.stats) + "\n");
137
+ }
138
+ return result.stats.totalEntities > 0 ? 0 : 2;
139
+ }
140
+ finally {
141
+ await anonymizer.dispose();
142
+ }
143
+ }
144
+ /**
145
+ * Streaming anonymization for file inputs.
146
+ */
147
+ async function anonymizeFile(filePath, options, nerMode, anonMode, format, keyProvider, keyBase64, policy) {
148
+ const countsByType = {};
149
+ const allEntities = [];
150
+ const textChunks = [];
151
+ let finishData;
152
+ const anonymizerConfig = {
153
+ mode: anonMode,
154
+ keyProvider,
155
+ };
156
+ const nerConfig = buildNerConfig(nerMode, options.quiet);
157
+ if (nerConfig !== undefined) {
158
+ anonymizerConfig.ner = nerConfig;
159
+ }
160
+ const streamConfig = {
161
+ anonymizer: anonymizerConfig,
162
+ policy: policy ?? undefined,
163
+ locale: options.locale,
164
+ keyProvider,
165
+ onChunk: (event) => {
166
+ for (const entity of event.entities) {
167
+ countsByType[entity.type] = (countsByType[entity.type] ?? 0) + 1;
168
+ allEntities.push({
169
+ type: entity.type,
170
+ id: entity.id,
171
+ confidence: entity.confidence,
172
+ source: entity.source,
173
+ ...(entity.semantic !== undefined ? { semantic: entity.semantic } : {}),
174
+ });
175
+ }
176
+ },
177
+ onFinish: (event) => {
178
+ finishData = event;
179
+ },
180
+ };
181
+ const anonymizerStream = await createAnonymizerStream(streamConfig);
182
+ const inputStream = getInputStream(filePath);
183
+ const outputStream = getOutputStream(options.output);
184
+ if (format === "text") {
185
+ // Direct pipe: input → anonymizer → output
186
+ await pipeline(inputStream, anonymizerStream, outputStream);
187
+ // Add trailing newline if writing to file
188
+ if (options.output !== undefined) {
189
+ outputStream.write("\n");
190
+ }
191
+ }
192
+ else {
193
+ // For json/ndjson: collect output text, format at end
194
+ anonymizerStream.on("data", (chunk) => {
195
+ textChunks.push(typeof chunk === "string" ? chunk : chunk.toString());
196
+ });
197
+ inputStream.pipe(anonymizerStream);
198
+ await new Promise((resolve, reject) => {
199
+ anonymizerStream.on("end", resolve);
200
+ anonymizerStream.on("error", reject);
201
+ inputStream.on("error", reject);
202
+ });
203
+ let output;
204
+ if (format === "json") {
205
+ output = JSON.stringify({
206
+ anonymizedText: textChunks.join(""),
207
+ entities: allEntities,
208
+ stats: {
209
+ totalEntities: finishData?.totalEntities ?? 0,
210
+ countsByType,
211
+ processingTimeMs: finishData?.totalProcessingTimeMs ?? 0,
212
+ },
213
+ }, null, 2);
214
+ }
215
+ else {
216
+ // ndjson: entity lines + summary
217
+ const lines = allEntities.map((e) => JSON.stringify(e));
218
+ lines.push(JSON.stringify({
219
+ _type: "summary",
220
+ anonymizedText: textChunks.join(""),
221
+ totalEntities: finishData?.totalEntities ?? 0,
222
+ processingTimeMs: finishData?.totalProcessingTimeMs ?? 0,
223
+ }));
224
+ output = lines.join("\n");
225
+ }
226
+ if (!output.endsWith("\n")) {
227
+ output += "\n";
228
+ }
229
+ await writeOutput(output, options.output);
230
+ }
231
+ // Close file output stream if writing to file (pipeline already handles this for text format)
232
+ if (format !== "text" && options.output !== undefined && outputStream !== process.stdout) {
233
+ await new Promise((resolve) => outputStream.end(resolve));
234
+ }
235
+ // Save PII map
236
+ if (anonMode === "pseudonymize" && finishData?.piiMap !== undefined) {
237
+ const piiMapFile = {
238
+ version: 1,
239
+ createdAt: new Date().toISOString(),
240
+ ...(keyBase64 !== undefined ? { key: keyBase64 } : {}),
241
+ piiMap: finishData.piiMap,
242
+ stats: {
243
+ totalEntities: finishData.totalEntities,
244
+ countsByType,
245
+ },
246
+ };
247
+ await savePIIMapFile(options["pii-map"], piiMapFile);
248
+ if (!options.quiet) {
249
+ process.stderr.write(`PII map saved to ${options["pii-map"]}\n`);
250
+ }
251
+ }
252
+ // Print stats to stderr if verbose
253
+ if (options.verbose && finishData !== undefined) {
254
+ process.stderr.write(formatStats({
255
+ totalEntities: finishData.totalEntities,
256
+ countsByType: countsByType,
257
+ processingTimeMs: finishData.totalProcessingTimeMs,
258
+ modelVersion: "",
259
+ policyVersion: "",
260
+ }) + "\n");
261
+ }
262
+ return (finishData?.totalEntities ?? 0) > 0 ? 0 : 2;
263
+ }
264
+ //# sourceMappingURL=anonymize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anonymize.js","sourceRoot":"","sources":["../../../src/cli/commands/anonymize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedOptions } from "../main.js";
2
+ export declare function inspectCommand(filePath: string | undefined, options: ParsedOptions): Promise<number>;
3
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/inspect.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8BhD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAmDjB"}
@@ -0,0 +1,73 @@
1
+ import { createAnonymizer, PIIType, mergePolicy, InMemoryKeyProvider, } from "../../index.js";
2
+ import { CLIError } from "../utils/errors.js";
3
+ import { readInput, writeOutput } from "../utils/io.js";
4
+ import { formatInspect, formatStats } from "../utils/format.js";
5
+ function parseTypes(typesStr) {
6
+ const allValues = new Set(Object.values(PIIType));
7
+ const types = new Set();
8
+ for (const raw of typesStr.split(",")) {
9
+ const t = raw.trim().toUpperCase();
10
+ if (t === "")
11
+ continue;
12
+ if (!allValues.has(t)) {
13
+ throw new CLIError(`Unknown PII type: ${raw.trim()}`);
14
+ }
15
+ types.add(t);
16
+ }
17
+ if (types.size === 0) {
18
+ throw new CLIError("--types must specify at least one PII type");
19
+ }
20
+ return types;
21
+ }
22
+ function validateNerMode(mode) {
23
+ const valid = ["disabled", "quantized", "standard"];
24
+ if (!valid.includes(mode)) {
25
+ throw new CLIError(`Invalid NER mode: ${mode}`);
26
+ }
27
+ return mode;
28
+ }
29
+ export async function inspectCommand(filePath, options) {
30
+ const nerMode = validateNerMode(options.ner);
31
+ const input = await readInput(filePath);
32
+ const config = {
33
+ mode: "pseudonymize",
34
+ keyProvider: new InMemoryKeyProvider(),
35
+ };
36
+ if (nerMode !== "disabled") {
37
+ config.ner = {
38
+ mode: nerMode,
39
+ autoDownload: true,
40
+ onStatus: options.quiet
41
+ ? undefined
42
+ : (status) => {
43
+ process.stderr.write(`${status}\n`);
44
+ },
45
+ };
46
+ }
47
+ const policy = options.types !== undefined
48
+ ? mergePolicy({ enabledTypes: parseTypes(options.types) })
49
+ : undefined;
50
+ const anonymizer = createAnonymizer(config);
51
+ await anonymizer.initialize();
52
+ try {
53
+ const result = await anonymizer.anonymize(input, options.locale, policy !== undefined ? policy : undefined);
54
+ // Build inspect entities using offsets from original text
55
+ const inspectEntities = result.entities.map((e) => ({
56
+ type: e.type,
57
+ original: input.slice(e.start, e.end),
58
+ start: e.start,
59
+ end: e.end,
60
+ }));
61
+ const inspectOutput = formatInspect(input, inspectEntities);
62
+ await writeOutput(inspectOutput + "\n", options.output);
63
+ // Always print stats to stderr
64
+ if (!options.quiet) {
65
+ process.stderr.write(formatStats(result.stats) + "\n");
66
+ }
67
+ return result.stats.totalEntities > 0 ? 0 : 2;
68
+ }
69
+ finally {
70
+ await anonymizer.dispose();
71
+ }
72
+ }
73
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/cli/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedOptions } from "../main.js";
2
+ export declare function rehydrateCommand(filePath: string | undefined, options: ParsedOptions): Promise<number>;
3
+ //# sourceMappingURL=rehydrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rehydrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rehydrate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
@@ -0,0 +1,30 @@
1
+ import { decryptPIIMap, base64ToUint8Array, rehydrate, } from "../../index.js";
2
+ import { CLIError } from "../utils/errors.js";
3
+ import { readInput, writeOutput } from "../utils/io.js";
4
+ import { loadPIIMapFile } from "../utils/pii-map-file.js";
5
+ export async function rehydrateCommand(filePath, options) {
6
+ const input = await readInput(filePath);
7
+ const piiMapFile = await loadPIIMapFile(options["pii-map"]);
8
+ // Determine encryption key
9
+ const envKey = process.env["REHYDRA_KEY"];
10
+ const flagKey = options.key;
11
+ const externalKey = flagKey ?? envKey;
12
+ const keyBase64 = externalKey ?? piiMapFile.key;
13
+ if (keyBase64 === undefined) {
14
+ throw new CLIError("No encryption key found. Provide --key, set REHYDRA_KEY, or use a PII map file that contains the key.");
15
+ }
16
+ const keyBytes = base64ToUint8Array(keyBase64);
17
+ let rawPiiMap;
18
+ try {
19
+ rawPiiMap = await decryptPIIMap(piiMapFile.piiMap, keyBytes);
20
+ }
21
+ catch {
22
+ throw new CLIError("Failed to decrypt PII map. Check that the encryption key is correct.");
23
+ }
24
+ const output = rehydrate(input, rawPiiMap);
25
+ // Ensure trailing newline
26
+ const finalOutput = output.endsWith("\n") ? output : output + "\n";
27
+ await writeOutput(finalOutput, options.output);
28
+ return 0;
29
+ }
30
+ //# sourceMappingURL=rehydrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rehydrate.js","sourceRoot":"","sources":["../../../src/cli/commands/rehydrate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA4B,EAC5B,OAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAE5D,2BAA2B;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAC5B,MAAM,WAAW,GAAG,OAAO,IAAI,MAAM,CAAC;IACtC,MAAM,SAAS,GAAG,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC;IAEhD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,uGAAuG,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,SAAoB,CAAC;IACzB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAE3C,0BAA0B;IAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;IACnE,MAAM,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedOptions } from "../main.js";
2
+ export declare function setupNerCommand(options: ParsedOptions): Promise<number>;
3
+ //# sourceMappingURL=setup-ner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-ner.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup-ner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
@@ -0,0 +1,41 @@
1
+ import { isModelDownloaded, downloadModel, } from "../../index.js";
2
+ import { CLIError } from "../utils/errors.js";
3
+ import { green, bold } from "../utils/color.js";
4
+ import { formatProgress, writeProgress, clearProgress } from "../utils/progress.js";
5
+ export async function setupNerCommand(options) {
6
+ const mode = options.ner === "standard" ? "standard" : "quantized";
7
+ const alreadyDownloaded = await isModelDownloaded(mode);
8
+ if (alreadyDownloaded) {
9
+ if (!options.quiet) {
10
+ process.stderr.write(green(`NER model (${mode}) is already downloaded.\n`));
11
+ }
12
+ return 0;
13
+ }
14
+ if (!options.quiet) {
15
+ process.stderr.write(bold(`Downloading NER model (${mode})...\n`));
16
+ }
17
+ const onProgress = (progress) => {
18
+ if (!options.quiet) {
19
+ writeProgress(formatProgress(progress.file, progress.percent));
20
+ }
21
+ };
22
+ const onStatus = options.quiet
23
+ ? undefined
24
+ : (status) => {
25
+ clearProgress();
26
+ process.stderr.write(`${status}\n`);
27
+ };
28
+ try {
29
+ await downloadModel(mode, onProgress, onStatus);
30
+ }
31
+ catch (err) {
32
+ clearProgress();
33
+ throw new CLIError(`Failed to download NER model: ${err instanceof Error ? err.message : String(err)}`);
34
+ }
35
+ clearProgress();
36
+ if (!options.quiet) {
37
+ process.stderr.write(green(`\nNER model (${mode}) downloaded successfully.\n`));
38
+ }
39
+ return 0;
40
+ }
41
+ //# sourceMappingURL=setup-ner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-ner.js","sourceRoot":"","sources":["../../../src/cli/commands/setup-ner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,GAEd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAEnE,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,iBAAiB,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,cAAc,IAAI,4BAA4B,CAAC,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,0BAA0B,IAAI,QAAQ,CAAC,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAA6B,CAAC,QAAQ,EAAE,EAAE;QACxD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,MAAc,EAAQ,EAAE;YACvB,aAAa,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;IAEN,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAChB,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;IAED,aAAa,EAAE,CAAC;IAChB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,8BAA8B,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface ParsedOptions {
2
+ output?: string;
3
+ format: string;
4
+ ner: string;
5
+ "pii-map": string;
6
+ key?: string;
7
+ types?: string;
8
+ mode: string;
9
+ locale?: string;
10
+ verbose: boolean;
11
+ quiet: boolean;
12
+ }
13
+ export declare function run(argv?: string[]): Promise<number>;
14
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAmDD,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAmFjF"}