pseudonym-mcp 0.4.1 → 0.5.1
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.
- package/README.md +22 -10
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/manager.d.ts +2 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +3 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/core/engine.d.ts +7 -1
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +74 -10
- package/dist/core/engine.js.map +1 -1
- package/dist/core/ollama-client.d.ts +1 -1
- package/dist/core/ollama-client.d.ts.map +1 -1
- package/dist/core/ollama-client.js +8 -3
- package/dist/core/ollama-client.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +6 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/patterns/locale/pl/nip.js +4 -4
- package/dist/patterns/locale/pl/nip.js.map +1 -1
- package/dist/patterns/locale/pl/phone.js +2 -2
- package/dist/patterns/locale/pl/phone.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -262,7 +262,8 @@ Restart your client. The `mask_text` and `unmask_text` tools appear automaticall
|
|
|
262
262
|
```json
|
|
263
263
|
{
|
|
264
264
|
"text": "John Smith (SSN: 123-45-6789) works at Acme Corp.",
|
|
265
|
-
"session_id": "optional — omit to create a new session"
|
|
265
|
+
"session_id": "optional — omit to create a new session",
|
|
266
|
+
"custom_literals": ["John Smith", "Acme Corp"]
|
|
266
267
|
}
|
|
267
268
|
```
|
|
268
269
|
|
|
@@ -296,7 +297,8 @@ Restart your client. The `mask_text` and `unmask_text` tools appear automaticall
|
|
|
296
297
|
"ollamaModel": "llama3",
|
|
297
298
|
"ollamaBaseUrl": "http://localhost:11434",
|
|
298
299
|
"autoUnmask": false,
|
|
299
|
-
"strictValidation": true
|
|
300
|
+
"strictValidation": true,
|
|
301
|
+
"customLiterals": ["Jan Kowalski", "78091512345", "+48 123 456 789"]
|
|
300
302
|
}
|
|
301
303
|
```
|
|
302
304
|
|
|
@@ -308,6 +310,7 @@ Restart your client. The `mask_text` and `unmask_text` tools appear automaticall
|
|
|
308
310
|
| `ollamaBaseUrl` | URL | `http://localhost:11434` | Ollama API endpoint |
|
|
309
311
|
| `autoUnmask` | `true` \| `false` | `false` | Auto-restore tokens in LLM responses |
|
|
310
312
|
| `strictValidation` | `true` \| `false` | `true` | Enable checksum / format validation (SSN area check, Luhn for cards, PESEL checksum) |
|
|
313
|
+
| `customLiterals` | `string[]` | `[]` | Specific strings always redacted regardless of engine (names, IDs, phone numbers) |
|
|
311
314
|
|
|
312
315
|
### CLI flags
|
|
313
316
|
|
|
@@ -317,14 +320,15 @@ All config keys can be overridden at startup (highest priority):
|
|
|
317
320
|
pseudonym-mcp --lang en --engines regex --ollama-model llama3 --auto-unmask
|
|
318
321
|
```
|
|
319
322
|
|
|
320
|
-
| Flag | Description
|
|
321
|
-
| ------------------- |
|
|
322
|
-
| `--lang` | Language for regex rules: `en` or `pl` (default: `en`)
|
|
323
|
-
| `--engines` | `regex`, `llm`, or `hybrid` (default: `hybrid`)
|
|
324
|
-
| `--ollama-model` | Ollama model to use for NER
|
|
325
|
-
| `--ollama-base-url` | Ollama base URL
|
|
326
|
-
| `--config` | Path to a custom JSON config file
|
|
327
|
-
| `--auto-unmask` | Enable automatic response de-tokenization
|
|
323
|
+
| Flag | Description |
|
|
324
|
+
| ------------------- | --------------------------------------------------------------------------- |
|
|
325
|
+
| `--lang` | Language for regex rules: `en` or `pl` (default: `en`) |
|
|
326
|
+
| `--engines` | `regex`, `llm`, or `hybrid` (default: `hybrid`) |
|
|
327
|
+
| `--ollama-model` | Ollama model to use for NER |
|
|
328
|
+
| `--ollama-base-url` | Ollama base URL |
|
|
329
|
+
| `--config` | Path to a custom JSON config file |
|
|
330
|
+
| `--auto-unmask` | Enable automatic response de-tokenization |
|
|
331
|
+
| `--custom-literals` | Comma-separated strings to always redact, e.g. `"Jan Kowalski,78091512345"` |
|
|
328
332
|
|
|
329
333
|
### Claude Code
|
|
330
334
|
|
|
@@ -364,6 +368,14 @@ Add to `~/.cursor/mcp.json`:
|
|
|
364
368
|
|
|
365
369
|
## Supported PII types
|
|
366
370
|
|
|
371
|
+
### Custom literals
|
|
372
|
+
|
|
373
|
+
| Tag | Detection | Match |
|
|
374
|
+
| -------- | ---------------------------------------------------------------------------------------------- | ------------ |
|
|
375
|
+
| `CUSTOM` | Exact match (case-insensitive) against `customLiterals` config or `custom_literals` tool param | Exact string |
|
|
376
|
+
|
|
377
|
+
Custom literals are applied after the regex phase and before LLM NER, regardless of engine mode. Longest literals are matched first to prevent partial substitution.
|
|
378
|
+
|
|
367
379
|
### Global (all languages)
|
|
368
380
|
|
|
369
381
|
| Tag | Pattern | Validation |
|
package/dist/cli.js
CHANGED
|
@@ -15,6 +15,7 @@ program
|
|
|
15
15
|
.option('--ollama-base-url <url>', 'Ollama base URL', 'http://localhost:11434')
|
|
16
16
|
.option('--config <path>', 'Path to a JSON config file (default: ./mcp-config.json)')
|
|
17
17
|
.option('--auto-unmask', 'Automatically unmask tokens in LLM responses', false)
|
|
18
|
+
.option('--custom-literals <items>', 'Comma-separated strings to always redact')
|
|
18
19
|
.action(async (opts) => {
|
|
19
20
|
const engines = VALID_ENGINES.includes(opts.engines)
|
|
20
21
|
? opts.engines
|
|
@@ -26,6 +27,12 @@ program
|
|
|
26
27
|
ollamaBaseUrl: opts.ollamaBaseUrl,
|
|
27
28
|
config: opts.config,
|
|
28
29
|
autoUnmask: opts.autoUnmask,
|
|
30
|
+
customLiterals: opts.customLiterals
|
|
31
|
+
? opts.customLiterals
|
|
32
|
+
.split(',')
|
|
33
|
+
.map((s) => s.trim())
|
|
34
|
+
.filter(Boolean)
|
|
35
|
+
: undefined,
|
|
29
36
|
});
|
|
30
37
|
const cfg = ConfigManager.getInstance().get();
|
|
31
38
|
if (cfg.engines === 'hybrid' || cfg.engines === 'llm') {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,MAAM,aAAa,GAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,oFAAoF,CAAC;KACjG,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,mCAAmC,EAAE,IAAI,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,QAAQ,CAAC;KAChF,MAAM,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,QAAQ,CAAC;KACtE,MAAM,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,wBAAwB,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,8CAA8C,EAAE,KAAK,CAAC;KAC9E,MAAM,CACL,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,MAAM,aAAa,GAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,oFAAoF,CAAC;KACjG,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,mCAAmC,EAAE,IAAI,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,QAAQ,CAAC;KAChF,MAAM,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,QAAQ,CAAC;KACtE,MAAM,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,wBAAwB,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,8CAA8C,EAAE,KAAK,CAAC;KAC9E,MAAM,CAAC,2BAA2B,EAAE,0CAA0C,CAAC;KAC/E,MAAM,CACL,KAAK,EAAE,IAQN,EAAE,EAAE;IACH,MAAM,OAAO,GAAe,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAqB,CAAC;QAC5E,CAAC,CAAE,IAAI,CAAC,OAAsB;QAC9B,CAAC,CAAC,QAAQ,CAAA;IAEZ,aAAa,CAAC,IAAI,CAAC;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACjC,CAAC,CAAC,IAAI,CAAC,cAAc;iBAChB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,SAAS;KACd,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAA;IAE7C,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACtD,MAAM,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC,CACF,CAAA;AAEH,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/config/manager.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface Config {
|
|
|
6
6
|
ollamaBaseUrl: string;
|
|
7
7
|
autoUnmask: boolean;
|
|
8
8
|
strictValidation: boolean;
|
|
9
|
+
customLiterals: string[];
|
|
9
10
|
}
|
|
10
11
|
export interface CliArgs {
|
|
11
12
|
lang?: string;
|
|
@@ -15,6 +16,7 @@ export interface CliArgs {
|
|
|
15
16
|
config?: string;
|
|
16
17
|
autoUnmask?: boolean;
|
|
17
18
|
strictValidation?: boolean;
|
|
19
|
+
customLiterals?: string[];
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Singleton configuration manager.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAA;AAEnD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,UAAU,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAA;AAEnD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,UAAU,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAYD;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAE/B,OAAO;IA+BP,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa;IAK7C,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,kDAAkD;IAClD,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,uEAAuE;IACvE,GAAG,IAAI,MAAM;CAGd"}
|
package/dist/config/manager.js
CHANGED
|
@@ -7,6 +7,7 @@ const DEFAULTS = {
|
|
|
7
7
|
ollamaBaseUrl: 'http://localhost:11434',
|
|
8
8
|
autoUnmask: false,
|
|
9
9
|
strictValidation: true,
|
|
10
|
+
customLiterals: [],
|
|
10
11
|
};
|
|
11
12
|
/**
|
|
12
13
|
* Singleton configuration manager.
|
|
@@ -51,6 +52,8 @@ export class ConfigManager {
|
|
|
51
52
|
cfg.autoUnmask = cliArgs.autoUnmask;
|
|
52
53
|
if (cliArgs.strictValidation !== undefined)
|
|
53
54
|
cfg.strictValidation = cliArgs.strictValidation;
|
|
55
|
+
if (cliArgs.customLiterals !== undefined)
|
|
56
|
+
cfg.customLiterals = cliArgs.customLiterals;
|
|
54
57
|
this.config = cfg;
|
|
55
58
|
}
|
|
56
59
|
static init(cliArgs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyBnC,MAAM,QAAQ,GAAW;IACvB,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,QAAQ;IACrB,aAAa,EAAE,wBAAwB;IACvC,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,EAAE;CACnB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAA;IACnC,MAAM,CAAQ;IAE/B,YAAoB,UAAmB,EAAE;QACvC,oBAAoB;QACpB,IAAI,GAAG,GAAW,EAAE,GAAG,QAAQ,EAAE,CAAA;QAEjC,4BAA4B;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;YAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAA;QAE7C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAA;gBAC/C,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACvD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAChE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QAC5E,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YAAE,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;QAClF,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;QACzE,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS;YAAE,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAC3F,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;QAErF,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAiB;QAC3B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,aAAa,CAAC,QAAQ,CAAA;IAC/B,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAA;IAC/B,CAAC;IAED,kDAAkD;IAClD,MAAM,CAAC,KAAK;QACV,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAA;IAC/B,CAAC;IAED,uEAAuE;IACvE,GAAG;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAC3B,CAAC"}
|
package/dist/core/engine.d.ts
CHANGED
|
@@ -20,8 +20,14 @@ export declare class Engine {
|
|
|
20
20
|
* Phase 2 (llm | hybrid): Call Ollama NER to detect PERSON / ORG names.
|
|
21
21
|
* If Ollama is unavailable, this phase is silently skipped.
|
|
22
22
|
*/
|
|
23
|
-
process(text: string): Promise<string>;
|
|
23
|
+
process(text: string, extraLiterals?: string[]): Promise<string>;
|
|
24
|
+
private applyCustomLiterals;
|
|
24
25
|
private applyRegexRules;
|
|
26
|
+
/**
|
|
27
|
+
* Split text into sentence-boundary chunks with 1-sentence overlap.
|
|
28
|
+
* Visible for testing.
|
|
29
|
+
*/
|
|
30
|
+
static splitIntoChunks(text: string, maxLen?: number): string[];
|
|
25
31
|
private applyLlmNer;
|
|
26
32
|
/**
|
|
27
33
|
* Restore all [TAG:N] tokens in text to their original values.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAWpE;;;;;;GAMG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,KAAK,CAAC,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAE,YAAY,GAAG,IAAI;IAe5E,QAAQ,IAAI,YAAY;IAIxB;;;;;;;OAOG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAWpE;;;;;;GAMG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,KAAK,CAAC,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAE,YAAY,GAAG,IAAI;IAe5E,QAAQ,IAAI,YAAY;IAIxB;;;;;;;OAOG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtE,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,eAAe;IAmBvB;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAY,GAAG,MAAM,EAAE;YAmCtD,WAAW;IAkDzB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAK7B"}
|
package/dist/core/engine.js
CHANGED
|
@@ -42,18 +42,32 @@ export class Engine {
|
|
|
42
42
|
* Phase 2 (llm | hybrid): Call Ollama NER to detect PERSON / ORG names.
|
|
43
43
|
* If Ollama is unavailable, this phase is silently skipped.
|
|
44
44
|
*/
|
|
45
|
-
async process(text) {
|
|
45
|
+
async process(text, extraLiterals) {
|
|
46
46
|
const cfg = ConfigManager.getInstance().get();
|
|
47
47
|
const rules = LANGUAGE_MAP[cfg.lang] ?? EnglishRules;
|
|
48
48
|
let result = text;
|
|
49
49
|
if (cfg.engines === 'regex' || cfg.engines === 'hybrid') {
|
|
50
50
|
result = this.applyRegexRules(result, rules, cfg.strictValidation);
|
|
51
51
|
}
|
|
52
|
+
const allLiterals = [...(cfg.customLiterals ?? []), ...(extraLiterals ?? [])];
|
|
53
|
+
if (allLiterals.length > 0) {
|
|
54
|
+
result = this.applyCustomLiterals(result, allLiterals);
|
|
55
|
+
}
|
|
52
56
|
if ((cfg.engines === 'llm' || cfg.engines === 'hybrid') && this.ollamaClient !== null) {
|
|
53
57
|
result = await this.applyLlmNer(result);
|
|
54
58
|
}
|
|
55
59
|
return result;
|
|
56
60
|
}
|
|
61
|
+
applyCustomLiterals(text, literals) {
|
|
62
|
+
let result = text;
|
|
63
|
+
const sorted = [...literals].filter(Boolean).sort((a, b) => b.length - a.length);
|
|
64
|
+
for (const literal of sorted) {
|
|
65
|
+
const escaped = literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
66
|
+
const re = new RegExp(escaped, 'gi');
|
|
67
|
+
result = result.replace(re, (match) => this.store.add('CUSTOM', match));
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
57
71
|
applyRegexRules(text, rules, strictValidation) {
|
|
58
72
|
let result = text;
|
|
59
73
|
for (const patternDef of rules.patterns) {
|
|
@@ -70,21 +84,71 @@ export class Engine {
|
|
|
70
84
|
}
|
|
71
85
|
return result;
|
|
72
86
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Split text into sentence-boundary chunks with 1-sentence overlap.
|
|
89
|
+
* Visible for testing.
|
|
90
|
+
*/
|
|
91
|
+
static splitIntoChunks(text, maxLen = 800) {
|
|
92
|
+
// Split into sentences at . ! ? followed by whitespace
|
|
93
|
+
const sentences = [];
|
|
94
|
+
let lastIdx = 0;
|
|
95
|
+
const re = /[.!?][\s]+/g;
|
|
96
|
+
let match;
|
|
97
|
+
while ((match = re.exec(text)) !== null) {
|
|
98
|
+
const end = match.index + match[0].length;
|
|
99
|
+
sentences.push(text.slice(lastIdx, end));
|
|
100
|
+
lastIdx = end;
|
|
77
101
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
102
|
+
if (lastIdx < text.length) {
|
|
103
|
+
sentences.push(text.slice(lastIdx));
|
|
104
|
+
}
|
|
105
|
+
if (sentences.length === 0)
|
|
106
|
+
return [text];
|
|
107
|
+
// Build chunks with 1-sentence overlap
|
|
108
|
+
const chunks = [];
|
|
109
|
+
let current = '';
|
|
110
|
+
let lastSentence = '';
|
|
111
|
+
for (const sentence of sentences) {
|
|
112
|
+
if (current.length + sentence.length > maxLen && current.length > 0) {
|
|
113
|
+
chunks.push(current);
|
|
114
|
+
current = lastSentence; // overlap: start with last sentence of previous chunk
|
|
115
|
+
}
|
|
116
|
+
current += sentence;
|
|
117
|
+
lastSentence = sentence;
|
|
118
|
+
}
|
|
119
|
+
if (current)
|
|
120
|
+
chunks.push(current);
|
|
121
|
+
return chunks;
|
|
122
|
+
}
|
|
123
|
+
async applyLlmNer(text) {
|
|
124
|
+
const chunks = Engine.splitIntoChunks(text);
|
|
125
|
+
// Collect all entities across chunks, passing known entities as context
|
|
126
|
+
const allEntities = [];
|
|
127
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
128
|
+
let chunkEntities;
|
|
129
|
+
try {
|
|
130
|
+
chunkEntities = await this.ollamaClient.extractEntities(chunks[i], allEntities.length > 0 ? allEntities : undefined);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
process.stderr.write(`[pseudonym-mcp] Ollama NER failed on chunk ${i + 1}/${chunks.length} (skipping): ${String(err)}\n`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// Deduplicate: add only entities not already known
|
|
137
|
+
for (const entity of chunkEntities) {
|
|
138
|
+
const val = entity.value.trim();
|
|
139
|
+
if (!val)
|
|
140
|
+
continue;
|
|
141
|
+
if (!allEntities.some((e) => e.value === val && e.type === entity.type)) {
|
|
142
|
+
allEntities.push(entity);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
81
145
|
}
|
|
82
|
-
if (
|
|
146
|
+
if (allEntities.length === 0)
|
|
83
147
|
return text;
|
|
84
148
|
let result = text;
|
|
85
149
|
// Sort longest-first to prevent partial matches
|
|
86
150
|
// e.g. "Auto-Lux International" must be replaced before "Auto-Lux"
|
|
87
|
-
const sorted = [...
|
|
151
|
+
const sorted = [...allEntities].sort((a, b) => b.value.length - a.value.length);
|
|
88
152
|
for (const entity of sorted) {
|
|
89
153
|
const val = entity.value.trim();
|
|
90
154
|
if (!val)
|
package/dist/core/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,MAAM,YAAY,GAAkC;IAClD,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,WAAW;CAChB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,OAAO,MAAM;IACA,KAAK,CAAc;IACnB,YAAY,CAAqB;IAElD,YAAY,KAAoB,EAAE,oBAA0C;QAC1E,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,YAAY,EAAE,CAAA;QAExC,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACvC,oDAAoD;YACpD,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAA;YAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,CAAA;YAClE,IAAI,CAAC,YAAY,GAAG,QAAQ;gBAC1B,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC1E,CAAC,CAAC,IAAI,CAAA;QACV,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,6 @@ export declare class OllamaClient {
|
|
|
16
16
|
private readonly model;
|
|
17
17
|
private readonly timeoutMs;
|
|
18
18
|
constructor(opts: OllamaClientOptions);
|
|
19
|
-
extractEntities(text: string): Promise<OllamaEntity[]>;
|
|
19
|
+
extractEntities(text: string, knownEntities?: OllamaEntity[]): Promise<OllamaEntity[]>;
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=ollama-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-client.d.ts","sourceRoot":"","sources":["../../src/core/ollama-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAQD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,EAAE,mBAAmB;IAM/B,eAAe,
|
|
1
|
+
{"version":3,"file":"ollama-client.d.ts","sourceRoot":"","sources":["../../src/core/ollama-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAQD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,EAAE,mBAAmB;IAM/B,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC;CA2D3B"}
|
|
@@ -14,11 +14,16 @@ export class OllamaClient {
|
|
|
14
14
|
constructor(opts) {
|
|
15
15
|
this.baseUrl = opts.baseUrl;
|
|
16
16
|
this.model = opts.model;
|
|
17
|
-
this.timeoutMs = opts.timeoutMs ??
|
|
17
|
+
this.timeoutMs = opts.timeoutMs ?? 15_000;
|
|
18
18
|
}
|
|
19
|
-
async extractEntities(text) {
|
|
19
|
+
async extractEntities(text, knownEntities) {
|
|
20
20
|
const controller = new AbortController();
|
|
21
21
|
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
22
|
+
let systemContent = SYSTEM_PROMPT;
|
|
23
|
+
if (knownEntities && knownEntities.length > 0) {
|
|
24
|
+
const list = knownEntities.map((e) => `"${e.value}" = ${e.type}`).join('; ');
|
|
25
|
+
systemContent += `\nPreviously identified entities (reuse these exact values if they appear again): ${list}`;
|
|
26
|
+
}
|
|
22
27
|
let res;
|
|
23
28
|
try {
|
|
24
29
|
res = await fetch(`${this.baseUrl}/api/chat`, {
|
|
@@ -29,7 +34,7 @@ export class OllamaClient {
|
|
|
29
34
|
model: this.model,
|
|
30
35
|
stream: false,
|
|
31
36
|
messages: [
|
|
32
|
-
{ role: 'system', content:
|
|
37
|
+
{ role: 'system', content: systemContent },
|
|
33
38
|
{ role: 'user', content: text },
|
|
34
39
|
],
|
|
35
40
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/core/ollama-client.ts"],"names":[],"mappings":"AAWA,MAAM,aAAa,GAAG;;;;oFAI8D,CAAA;AAEpF;;;GAGG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,CAAQ;IACf,KAAK,CAAQ;IACb,SAAS,CAAQ;IAElC,YAAY,IAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"ollama-client.js","sourceRoot":"","sources":["../../src/core/ollama-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAoBnE,wBAAgB,eAAe,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAoBnE,wBAAgB,eAAe,IAAI,SAAS,CAkJ3C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -33,12 +33,16 @@ the original values later using unmask_text.`, {
|
|
|
33
33
|
.string()
|
|
34
34
|
.optional()
|
|
35
35
|
.describe('Optional: reuse an existing session to preserve token numbering across multiple calls'),
|
|
36
|
-
|
|
36
|
+
custom_literals: z
|
|
37
|
+
.array(z.string())
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Specific strings to always redact (names, IDs, phone numbers)'),
|
|
40
|
+
}, async ({ text, session_id, custom_literals }) => {
|
|
37
41
|
const sid = session_id ?? crypto.randomUUID();
|
|
38
42
|
const engine = getOrCreateEngine(sid);
|
|
39
43
|
let maskedText;
|
|
40
44
|
try {
|
|
41
|
-
maskedText = await engine.process(text);
|
|
45
|
+
maskedText = await engine.process(text, custom_literals);
|
|
42
46
|
}
|
|
43
47
|
catch (err) {
|
|
44
48
|
return {
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAE9E,iFAAiF;AACjF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE1C,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;QAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX;;;;;;;6CAOyC,EACzC;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACrD,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,uFAAuF,CACxF;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Check digit = weighted_sum % 11; valid if result equals last digit (and != 10)
|
|
5
5
|
*/
|
|
6
6
|
function nipChecksum(raw) {
|
|
7
|
-
const digits = raw.replace(/
|
|
8
|
-
if (
|
|
7
|
+
const digits = raw.replace(/\D/g, '');
|
|
8
|
+
if (digits.length !== 10)
|
|
9
9
|
return false;
|
|
10
10
|
const weights = [6, 5, 7, 2, 3, 4, 5, 6, 7];
|
|
11
11
|
const d = digits.split('').map(Number);
|
|
@@ -16,8 +16,8 @@ function nipChecksum(raw) {
|
|
|
16
16
|
export const nipRule = {
|
|
17
17
|
id: 'pl.nip',
|
|
18
18
|
entityType: 'NIP',
|
|
19
|
-
// 10 digits in XXX-XXX-XX-XX format (hyphens required)
|
|
20
|
-
pattern:
|
|
19
|
+
// Optional "NIP" label + 10 digits in XXX-XXX-XX-XX format (hyphens required)
|
|
20
|
+
pattern: /(?:NIP[\s:]+)?\b\d{3}-\d{3}-\d{2}-\d{2}\b/g,
|
|
21
21
|
locales: ['pl'],
|
|
22
22
|
engines: ['strict', 'paranoid'],
|
|
23
23
|
description: 'Polish tax identification number (NIP) — 10 digits with checksum',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nip.js","sourceRoot":"","sources":["../../../../src/patterns/locale/pl/nip.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"nip.js","sourceRoot":"","sources":["../../../../src/patterns/locale/pl/nip.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAG,GAAG,GAAG,EAAE,CAAA;IACtB,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAgB;IAClC,EAAE,EAAE,QAAQ;IACZ,UAAU,EAAE,KAAK;IACjB,8EAA8E;IAC9E,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC/B,WAAW,EAAE,kEAAkE;IAC/E,QAAQ,EAAE,WAAW;CACtB,CAAA"}
|
|
@@ -2,11 +2,11 @@ export const plPhoneRule = {
|
|
|
2
2
|
id: 'pl.phone',
|
|
3
3
|
entityType: 'PHONE',
|
|
4
4
|
// Four alternatives:
|
|
5
|
-
// 1. International prefix: +48 or 0048, then 9 digits
|
|
5
|
+
// 1. International prefix: +48 or 0048, then exactly 9 digits in any grouping
|
|
6
6
|
// 2. 9-digit mobile starting with 4–8 (Polish numbering plan)
|
|
7
7
|
// 3. Landline with area code in parens: (XX) XXX-XX-XX
|
|
8
8
|
// 4. Landline without prefix: 2-digit area code + 7 digits (XX XXX XX XX or XX XXXXXXX)
|
|
9
|
-
pattern: /(?:\+48|0048)[\s\-]
|
|
9
|
+
pattern: /(?:\+48|0048)[\s\-]?(?:\d[\s\-]?){8}\d(?!\d)|\b[4-8]\d{2}[\s\-]?\d{3}[\s\-]?\d{3}\b|\(\d{2}\)[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}|\b[1-9]\d[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b/g,
|
|
10
10
|
locales: ['pl'],
|
|
11
11
|
engines: ['balanced', 'strict', 'paranoid'],
|
|
12
12
|
description: 'Polish phone number (+48 / 0048 prefix, 9-digit mobile, landline)',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../../../src/patterns/locale/pl/phone.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,EAAE,EAAE,UAAU;IACd,UAAU,EAAE,OAAO;IACnB,qBAAqB;IACrB,
|
|
1
|
+
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../../../src/patterns/locale/pl/phone.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,EAAE,EAAE,UAAU;IACd,UAAU,EAAE,OAAO;IACnB,qBAAqB;IACrB,8EAA8E;IAC9E,8DAA8D;IAC9D,uDAAuD;IACvD,wFAAwF;IACxF,OAAO,EACL,oLAAoL;IACtL,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC3C,WAAW,EAAE,mEAAmE;CACjF,CAAA"}
|
package/package.json
CHANGED