claude-code-infinite 1.0.35 → 1.0.36

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 (59) hide show
  1. package/README.md +14 -9
  2. package/dist/body-shape.d.ts +49 -0
  3. package/dist/body-shape.d.ts.map +1 -0
  4. package/dist/body-shape.js +232 -0
  5. package/dist/body-shape.js.map +1 -0
  6. package/dist/cli-main.js +14 -3
  7. package/dist/cli-main.js.map +1 -1
  8. package/dist/count-tokens.d.ts +15 -2
  9. package/dist/count-tokens.d.ts.map +1 -1
  10. package/dist/count-tokens.js +13 -4
  11. package/dist/count-tokens.js.map +1 -1
  12. package/dist/financial-redaction.d.ts +12 -0
  13. package/dist/financial-redaction.d.ts.map +1 -0
  14. package/dist/financial-redaction.js +509 -0
  15. package/dist/financial-redaction.js.map +1 -0
  16. package/dist/hooks.d.ts +2 -0
  17. package/dist/hooks.d.ts.map +1 -1
  18. package/dist/hooks.js +4 -0
  19. package/dist/hooks.js.map +1 -1
  20. package/dist/image-tokens.d.ts +6 -1
  21. package/dist/image-tokens.d.ts.map +1 -1
  22. package/dist/image-tokens.js +75 -14
  23. package/dist/image-tokens.js.map +1 -1
  24. package/dist/lane-activity.d.ts +42 -0
  25. package/dist/lane-activity.d.ts.map +1 -0
  26. package/dist/lane-activity.js +79 -0
  27. package/dist/lane-activity.js.map +1 -0
  28. package/dist/proxy.d.ts +5 -0
  29. package/dist/proxy.d.ts.map +1 -1
  30. package/dist/proxy.js +67 -6
  31. package/dist/proxy.js.map +1 -1
  32. package/dist/refusal-reason.d.ts +3 -2
  33. package/dist/refusal-reason.d.ts.map +1 -1
  34. package/dist/refusal-reason.js +4 -3
  35. package/dist/refusal-reason.js.map +1 -1
  36. package/dist/reqlog.d.ts +6 -2
  37. package/dist/reqlog.d.ts.map +1 -1
  38. package/dist/reqlog.js +1 -1
  39. package/dist/reqlog.js.map +1 -1
  40. package/dist/request-sizing.d.ts +38 -2
  41. package/dist/request-sizing.d.ts.map +1 -1
  42. package/dist/request-sizing.js +72 -6
  43. package/dist/request-sizing.js.map +1 -1
  44. package/dist/secret-redaction.d.ts +25 -0
  45. package/dist/secret-redaction.d.ts.map +1 -0
  46. package/dist/secret-redaction.js +492 -0
  47. package/dist/secret-redaction.js.map +1 -0
  48. package/dist/statusline-auto.d.ts +15 -0
  49. package/dist/statusline-auto.d.ts.map +1 -0
  50. package/dist/statusline-auto.js +125 -0
  51. package/dist/statusline-auto.js.map +1 -0
  52. package/dist/statusline.d.ts.map +1 -1
  53. package/dist/statusline.js +3 -2
  54. package/dist/statusline.js.map +1 -1
  55. package/dist/utf8-bytes.d.ts +10 -0
  56. package/dist/utf8-bytes.d.ts.map +1 -0
  57. package/dist/utf8-bytes.js +107 -0
  58. package/dist/utf8-bytes.js.map +1 -0
  59. package/package.json +1 -1
@@ -93,19 +93,28 @@ export function plausibleSample(sample) {
93
93
  * Whether to count a request of `bytes` before deciding on it: with no usable
94
94
  * sample once its estimate is a real share of the budget, and with one only
95
95
  * after a jump of new content brings it near the budget. Small growth on a
96
- * calibrated sample is estimated well and is not counted.
96
+ * calibrated sample is estimated well and is not counted. `images` are the
97
+ * body's inline images: added images jump by their visual tokens, not by their
98
+ * base64 read as text (a 470 KB contact sheet is ~3.5k tokens, not ~117k).
97
99
  */
98
- export function shouldCountTokens(sample, bytes, estimateTokens, budgetTokens) {
100
+ export function shouldCountTokens(sample, bytes, estimateTokens, budgetTokens, images) {
99
101
  if (!(budgetTokens > 0))
100
102
  return false;
101
103
  if (!plausibleSample(sample))
102
104
  return estimateTokens >= UNCALIBRATED_COUNT_SHARE * budgetTokens;
103
105
  if (bytes <= sample.forwardedBytes)
104
106
  return false;
105
- const addedTokens = approxTokensFromBytes(bytes - sample.forwardedBytes);
106
- return addedTokens >= JUMP_BUDGET_SHARE * budgetTokens &&
107
+ return addedTokens(sample, bytes, images) >= JUMP_BUDGET_SHARE * budgetTokens &&
107
108
  estimateTokens >= NEAR_BUDGET_SHARE * budgetTokens;
108
109
  }
110
+ /** New content since `sample`: text at bytes/4, images at their visual tokens. */
111
+ function addedTokens(sample, bytes, images) {
112
+ if (!images || sample.imageBytes === undefined || sample.imageTokens === undefined) {
113
+ return approxTokensFromBytes(bytes - sample.forwardedBytes);
114
+ }
115
+ const text = Math.max(0, (bytes - images.imageBytes) - (sample.forwardedBytes - sample.imageBytes));
116
+ return approxTokensFromBytes(text) + Math.max(0, images.imageTokens - sample.imageTokens);
117
+ }
109
118
  /** Shared per proxy; only hashes of account/upstream identity are stored. */
110
119
  export class CountTokensCooldowns {
111
120
  capacity;
@@ -1 +1 @@
1
- {"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../src/count-tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../src/count-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const CARD = "card_number";
2
+ export declare const ROUTING = "bank_routing";
3
+ export declare const IBAN = "iban";
4
+ export declare const ACCOUNT = "bank_account";
5
+ export declare const SSN = "ssn";
6
+ export declare const FINANCIAL_KINDS: string[];
7
+ export type Span = [start: number, end: number, kind: string];
8
+ /** Non-overlapping [start, end, kind] spans of financial details in a byte string. */
9
+ export declare function financialSpans(data: string): Span[];
10
+ /** financialSpans of a field value whose key ("routing_number"...) is context. */
11
+ export declare function spansWithContext(data: string, context: string): Span[];
12
+ //# sourceMappingURL=financial-redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-redaction.d.ts","sourceRoot":"","sources":["../src/financial-redaction.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAClC,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,IAAI,SAAS,CAAC;AAC3B,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,GAAG,QAAQ,CAAC;AACzB,eAAO,MAAM,eAAe,UAAsC,CAAC;AAEnE,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAsG9D,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CASnD;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAKtE"}
@@ -0,0 +1,509 @@
1
+ // Financial-detail rules: cards, bank details, IBANs, SSNs (twin of polychat's
2
+ // polychat/financial_redaction.py). Change both together: the shared golden vectors
3
+ // (test/fixtures/secret_redaction_vectors.json, "financial_vectors") must match byte for byte.
4
+ //
5
+ // Everything here works on a "byte string": the text's UTF-8 bytes, one char per byte
6
+ // (see utf8-bytes.ts), so offsets, the 40-byte context windows and the 200-byte line reach are
7
+ // the same as in Python. Each rule has to prove itself; a long number alone is never enough:
8
+ //
9
+ // - card_number: 13-19 digits (one consistent space or dash between groups), a known IIN
10
+ // prefix with that brand's length, and a valid Luhn check digit. Public test cards and
11
+ // numbers of 3 or fewer distinct digits are kept.
12
+ // - bank_routing: 9 digits, ABA checksum, a Federal Reserve prefix and a context word
13
+ // ("routing", "ABA", "RTN", "transit") within 40 bytes.
14
+ // - iban: country code, that country's length, mod-97 = 1.
15
+ // - bank_account: 6-17 digits after an account label, or another standalone such number on
16
+ // the line of a detected routing number.
17
+ // - ssn: NNN-NN-NNNN outside never-issued ranges; dashless/spaced only with SSN context.
18
+ //
19
+ // A number never counts inside a longer token (next to a letter, digit or "_", or joined to
20
+ // one by ".-/:+@"). Every pattern is bounded. A non-ASCII neighbour is a letter by the running
21
+ // Node's Unicode tables (Python 3.12 uses Unicode 15.0): only characters assigned after 15.0
22
+ // (e.g. CJK Extension I) can make the two disagree.
23
+ import { asciiLower, decodeIgnore } from "./utf8-bytes.js";
24
+ export const CARD = "card_number";
25
+ export const ROUTING = "bank_routing";
26
+ export const IBAN = "iban";
27
+ export const ACCOUNT = "bank_account";
28
+ export const SSN = "ssn";
29
+ export const FINANCIAL_KINDS = [CARD, ROUTING, IBAN, ACCOUNT, SSN];
30
+ const CONTEXT_WINDOW = 40; // bytes either side searched for a routing/SSN context word
31
+ const MAX_WORD = 24; // longer than any context word plus its lookahead byte
32
+ const KEY_MAX = 32; // a longer field key is reduced to its context words
33
+ const LINE_REACH = 200; // bytes either side of a routing number searched for its line
34
+ const ACCOUNT_NEGATIVE_REACH = 24; // bytes before "account" searched for a non-bank qualifier
35
+ const ALNUM = /^[A-Za-z0-9_]$/;
36
+ const UNICODE_ALNUM = /^[\p{L}\p{N}]$/u;
37
+ const JOINERS = ".-/:+@";
38
+ const JSON_ESCAPES = "nrt";
39
+ const DIGIT_RUN = /(?<![0-9])[0-9]{6,19}(?![0-9])/g;
40
+ // 4-4-4-4 (16), 4-4-4-4-3 (19), Amex 4-6-5 (15), Diners 4-6-4 (14); one separator.
41
+ const CARD_GROUPED = /(?<![0-9])[0-9]{4}([ -])(?:[0-9]{4}\1[0-9]{4}\1[0-9]{4}(\1[0-9]{3})?|[0-9]{6}\1[0-9]{4,5})(?![0-9])/dg;
42
+ const SSN_DASHED = /(?<![0-9])[0-9]{3}-[0-9]{2}-[0-9]{4}(?![0-9])/g;
43
+ const SSN_SPACED = /(?<![0-9])[0-9]{3} [0-9]{2} [0-9]{4}(?![0-9])/g;
44
+ const IBAN_CANDIDATE = /(?<![A-Za-z0-9_])[A-Z]{2}[0-9]{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,3})?(?![A-Za-z0-9_])/g;
45
+ // A word starts after a non-letter, or after a JSON escape (\n, \t, \r) read as raw text.
46
+ const WORD_START = String.raw `(?:(?<![a-z])|(?<=\\[nrt]))`;
47
+ const ROUTING_CONTEXT = new RegExp(WORD_START + "(?:routing|transit|aba|rtn)(?:numbers?|num|nbr|no)?(?![a-z])", "g");
48
+ const SSN_CONTEXT = new RegExp(WORD_START + String.raw `(?:ssn|social[ _\-]?security|soc[ .]?sec)(?![a-z])`, "g");
49
+ const ACCOUNT_WORD = new RegExp(WORD_START + "(?:account|acct|a/c)", "g");
50
+ const KEY_ACCOUNT_LABEL = new RegExp(WORD_START + String.raw `(?:account|acct|a/c)[ _\-]?(?:numbers?|num|nbr|no|#)(?![a-z])`);
51
+ // What may sit between an account word and its number ("account" needs a label or ":#=").
52
+ const ACCOUNT_TAIL = new RegExp(String.raw `(?<label>[ _\-]?(?:numbers?|num|nbr|no\.?|#))?["']?[ \t]{0,3}`
53
+ + String.raw `(?<sep>[:#=]|is(?= )|-(?= ))?[ \t]{0,3}["']?[ \t]{0,2}`, "y");
54
+ const ACCOUNT_PLAIN = /[0-9]{6,17}(?![0-9])/y;
55
+ const ACCOUNT_GROUPED = /[0-9]{2,6}([ -])[0-9]{2,6}(?:\1[0-9]{2,6}){0,3}(?![0-9])/y;
56
+ // 2026-10-27, 27-10-2026, 2026 10 27: a date after "account:".
57
+ const DATE = /^(?:(?:19|20)[0-9]{2}([ -])[01][0-9]\1[0-3][0-9]|[0-3][0-9]([ -])[01][0-9]\2(?:19|20)[0-9]{2})$/;
58
+ const ACCOUNT_NEGATIVE = /(?<![a-z])(?:aws|gcp|google|azure|service|stripe)(?![a-z])/g;
59
+ const LINE_END = /\n|\\n/;
60
+ const CARD_FIRST_DIGITS = "23456"; // every brand below starts with one of these
61
+ // A financial label glued to a colon before a number. (?=\n?$) is Python's "$".
62
+ const COLON_LABEL = /(?<![a-z])(?:routing|transit|aba|rtn|ssn|security|account|acct|a\/c|iban|card|pan|number|num|nbr|no)(?=\n?$)/;
63
+ const LINE_NUMBER = /(?<![0-9])[0-9]{2,17}/g;
64
+ const TWO_DIGITS = /[0-9]{2}/;
65
+ const MARKER_LOW = "[redacted:";
66
+ const MARKER_RE = /\[redacted:[a-z_]{1,40}\]/g;
67
+ // [brand, prefixes as [low, high] over the first String(low).length digits, lengths].
68
+ const BRANDS = [
69
+ ["visa", [[4, 4]], new Set([13, 16, 19])],
70
+ ["mastercard", [[51, 55], [2221, 2720]], new Set([16])],
71
+ ["amex", [[34, 34], [37, 37]], new Set([15])],
72
+ ["discover", [[6011, 6011], [65, 65], [644, 649]], new Set([16, 17, 18, 19])],
73
+ ["jcb", [[3528, 3589]], new Set([16, 17, 18, 19])],
74
+ ["diners", [[300, 305], [3095, 3095], [36, 36], [38, 39]], new Set([14, 15, 16, 17, 18, 19])],
75
+ ];
76
+ // Public test numbers from Stripe, Braintree, Adyen and card-network docs: kept as written.
77
+ const TEST_CARDS = new Set([
78
+ "4242424242424242", "4000056655665556", "5555555555554444", "2223003122003222",
79
+ "5200828282828210", "5105105105105100", "378282246310005", "371449635398431",
80
+ "6011111111111117", "6011000990139424", "6011981111111113", "3056930009020004",
81
+ "36227206271667", "6555900000604105", "3566002020360505", "6200000000000005",
82
+ "4000002500003155", "4000002760003184", "4000003800000446", "4000000000003220",
83
+ "4000000000009995", "4000000000000002", "4000000000000069", "4000000000000127",
84
+ "4000000000000119", "4000000000000077", "4000000000000341", "4100000000000019",
85
+ "4000000000000101", "4111111111111111", "4005519200000004", "4009348888881881",
86
+ "4012000033330026", "4012000077777777", "4012888888881881", "4217651111111119",
87
+ "4500600000000061", "3530111333300000", "30569309025904", "38520000023237",
88
+ "2223000048400011", "4111111145551142", "4988438843884305", "5101180000000007",
89
+ "2222400070000005", "5555444433331111", "370000000000002", "6011601160116611",
90
+ "3600666633336666", "3569990010095841", "4400000000000008", "5500000000000004",
91
+ "4166676667666746", "4646464646464644", "5577000055770004", "4000020000000000",
92
+ "5454545454545454", "4222222222222", "4012888888881", "378734493671000",
93
+ "6011000400000000", "3566111111111113", "5425233430109903", "2222420000001113",
94
+ "4263982640269299", "4917484589897107", "5185540810000019", "4035501000000008",
95
+ ]);
96
+ // Public example IBANs (ECBS, Wikipedia, provider docs) and Stripe's test bank details.
97
+ const TEST_IBANS = new Set([
98
+ "DE89370400440532013000", "GB82WEST12345698765432", "GB29NWBK60161331926819",
99
+ "FR1420041010050500013M02606", "NL91ABNA0417164300", "ES9121000418450200051332",
100
+ "IT60X0542811101000000123456", "BE68539007547034", "CH9300762011623852957",
101
+ "AT611904300234573201", "DE89370400440532013001",
102
+ ]);
103
+ const TEST_ROUTING = new Set(["110000000"]);
104
+ const TEST_ACCOUNTS = new Set(["000123456789", "000111111116", "000222222227", "000333333335",
105
+ "000444444440", "000111111113", "1234567890", "123456789"]);
106
+ const EXAMPLE_SSNS = new Set(["123456789", "078051120", "219099999"]);
107
+ const IBAN_LENGTHS = {
108
+ AD: 24, AE: 23, AL: 28, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22,
109
+ BR: 29, BY: 28, CH: 21, CR: 22, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28,
110
+ EE: 20, EG: 29, ES: 24, FI: 18, FO: 18, FR: 27, GB: 22, GE: 22, GI: 23,
111
+ GL: 18, GR: 27, GT: 28, HR: 21, HU: 28, IE: 22, IL: 23, IQ: 23, IS: 26,
112
+ IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LC: 32, LI: 21, LT: 20, LU: 20,
113
+ LV: 21, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30, NL: 18,
114
+ NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29, RO: 24, RS: 22, SA: 24,
115
+ SC: 31, SE: 24, SI: 19, SK: 24, SM: 27, ST: 25, SV: 28, TL: 23, TN: 24,
116
+ TR: 26, UA: 29, VA: 22, VG: 24, XK: 20,
117
+ };
118
+ const ROUTING_PREFIXES = new Set([
119
+ ...range(0, 13), ...range(21, 33), ...range(61, 73), 80,
120
+ ]);
121
+ /** Non-overlapping [start, end, kind] spans of financial details in a byte string. */
122
+ export function financialSpans(data) {
123
+ if (!TWO_DIGITS.test(data))
124
+ return [];
125
+ const low = blankMarkers(asciiLower(data));
126
+ const routing = nineDigitSpans(data, low); // before accounts: a proven routing number wins
127
+ // concat, not push(...spread): a multi-MB text can hold more spans than call arguments.
128
+ const lines = routingLineSpans(data, routing.filter((s) => s[2] === ROUTING));
129
+ const spans = cardSpans(data).concat(ibanSpans(data), ssnDashedSpans(data), routing, accountContextSpans(data, low), lines);
130
+ return nonOverlapping(spans);
131
+ }
132
+ /** financialSpans of a field value whose key ("routing_number"...) is context. */
133
+ export function spansWithContext(data, context) {
134
+ if (!context)
135
+ return financialSpans(data);
136
+ const [joined, offset] = withContext(data, context);
137
+ return financialSpans(joined).filter((s) => s[0] >= offset)
138
+ .map(([s, e, k]) => [s - offset, e - offset, k]);
139
+ }
140
+ // --------------------------------------------------------------------------- rules
141
+ function cardSpans(data) {
142
+ const spans = [];
143
+ for (const m of data.matchAll(DIGIT_RUN)) {
144
+ const end = m.index + m[0].length;
145
+ if (standalone(data, m.index, end) && isCard(m[0]))
146
+ spans.push([m.index, end, CARD]);
147
+ }
148
+ let pos = 0; // a rejected grouped candidate is searched again from inside ("2026 4532 ...")
149
+ let m;
150
+ while ((m = searchFrom(CARD_GROUPED, data, pos)) !== null) {
151
+ const end = groupedCardEnd(data, m);
152
+ if (end !== null)
153
+ spans.push([m.index, end, CARD]);
154
+ pos = end ?? m.index + 5; // the next group
155
+ }
156
+ return spans;
157
+ }
158
+ /** Where a grouped card ends: all of it, else without its 3-digit tail, or null. */
159
+ function groupedCardEnd(data, m) {
160
+ if (!CARD_FIRST_DIGITS.includes(data[m.index]))
161
+ return null;
162
+ const ends = [m.index + m[0].length];
163
+ if (m[2] !== undefined)
164
+ ends.push(m.indices[2][0]);
165
+ for (const end of ends) {
166
+ if (standalone(data, m.index, end) && isCard(digits(data.slice(m.index, end))))
167
+ return end;
168
+ }
169
+ return null;
170
+ }
171
+ /** IBANs; after a rejected candidate the search resumes inside it. */
172
+ function ibanSpans(data) {
173
+ const spans = [];
174
+ let pos = 0;
175
+ let m;
176
+ while ((m = searchFrom(IBAN_CANDIDATE, data, pos)) !== null) {
177
+ const end = ibanEnd(data, m);
178
+ if (end !== null)
179
+ spans.push([m.index, end, IBAN]);
180
+ pos = end ?? m.index + 1;
181
+ }
182
+ return spans;
183
+ }
184
+ /** The end of the IBAN at m: its country's length of alnum chars from the start, or null. */
185
+ function ibanEnd(data, m) {
186
+ const want = IBAN_LENGTHS[m[0].slice(0, 2)];
187
+ if (want === undefined)
188
+ return null;
189
+ const stop = m.index + m[0].length;
190
+ let end = m.index;
191
+ let seen = 0;
192
+ while (end < stop && seen < want) {
193
+ if (data[end] !== " ")
194
+ seen += 1;
195
+ end += 1;
196
+ }
197
+ if (seen !== want || !standalone(data, m.index, end))
198
+ return null;
199
+ return isIban(data.slice(m.index, end).replaceAll(" ", "")) ? end : null;
200
+ }
201
+ function ssnDashedSpans(data) {
202
+ const spans = [];
203
+ for (const m of data.matchAll(SSN_DASHED)) {
204
+ const end = m.index + m[0].length;
205
+ if (standalone(data, m.index, end) && isSsn(digits(m[0])))
206
+ spans.push([m.index, end, SSN]);
207
+ }
208
+ return spans;
209
+ }
210
+ /** Contiguous or spaced 9-digit numbers proven by context: routing first, then SSN. */
211
+ function nineDigitSpans(data, low) {
212
+ const spans = [];
213
+ for (const m of data.matchAll(DIGIT_RUN)) {
214
+ const end = m.index + m[0].length;
215
+ if (m[0].length !== 9 || !standalone(data, m.index, end))
216
+ continue;
217
+ const kind = nineDigitKind(low, m.index, end, m[0]);
218
+ if (kind)
219
+ spans.push([m.index, end, kind]);
220
+ }
221
+ for (const m of data.matchAll(SSN_SPACED)) {
222
+ const end = m.index + m[0].length;
223
+ if (standalone(data, m.index, end) && isSsn(digits(m[0]))
224
+ && near(SSN_CONTEXT, low, m.index, end))
225
+ spans.push([m.index, end, SSN]);
226
+ }
227
+ return spans;
228
+ }
229
+ function nineDigitKind(low, start, end, value) {
230
+ if (isRouting(value) && near(ROUTING_CONTEXT, low, start, end))
231
+ return ROUTING;
232
+ if (isSsn(value) && near(SSN_CONTEXT, low, start, end))
233
+ return SSN;
234
+ return null;
235
+ }
236
+ function accountContextSpans(data, low) {
237
+ const spans = [];
238
+ for (const word of low.matchAll(ACCOUNT_WORD)) {
239
+ const span = accountAfter(data, low, word.index, word[0]);
240
+ if (span !== null)
241
+ spans.push(span);
242
+ }
243
+ return spans;
244
+ }
245
+ function accountAfter(data, low, wordStart, word) {
246
+ ACCOUNT_TAIL.lastIndex = wordStart + word.length;
247
+ const tail = ACCOUNT_TAIL.exec(low); // every part is optional: always matches
248
+ const tailEnd = tail.index + tail[0].length;
249
+ const sep = tail.groups.sep;
250
+ if (word === "account" && !tail.groups.label && !(sep === ":" || sep === "#" || sep === "=")) {
251
+ return null;
252
+ }
253
+ if (searchWithin(ACCOUNT_NEGATIVE, low, Math.max(0, wordStart - ACCOUNT_NEGATIVE_REACH), wordStart, 1) !== null)
254
+ return null;
255
+ if (tailEnd > 0 && wordBefore(data, tailEnd))
256
+ return null; // acct3829105567: one identifier
257
+ const end = accountValueEnd(data, tailEnd);
258
+ if (end === null || TEST_ACCOUNTS.has(digits(data.slice(tailEnd, end)))
259
+ || DATE.test(data.slice(tailEnd, end)))
260
+ return null;
261
+ return [tailEnd, end, ACCOUNT];
262
+ }
263
+ /** End of the 6-17 digit account number at start: the most separated groups (2-5) that end
264
+ * the number cleanly, else plain. */
265
+ function accountValueEnd(data, start) {
266
+ ACCOUNT_GROUPED.lastIndex = start;
267
+ const grouped = ACCOUNT_GROUPED.exec(data);
268
+ if (grouped !== null) {
269
+ const groupedEnd = start + grouped[0].length;
270
+ const sep = grouped[1];
271
+ const ends = [];
272
+ for (let i = start; i < groupedEnd; i += 1)
273
+ if (data[i] === sep)
274
+ ends.push(i);
275
+ const candidates = [...ends.slice(1), groupedEnd].reverse();
276
+ for (const end of candidates) {
277
+ const n = digits(data.slice(start, end)).length;
278
+ if (n >= 6 && n <= 17 && rightOk(data, end))
279
+ return end;
280
+ }
281
+ }
282
+ ACCOUNT_PLAIN.lastIndex = start;
283
+ const plain = ACCOUNT_PLAIN.exec(data);
284
+ if (plain !== null && rightOk(data, start + plain[0].length))
285
+ return start + plain[0].length;
286
+ return null;
287
+ }
288
+ /** Other standalone 6-17 digit numbers on the line (record) of a routing number. */
289
+ function routingLineSpans(data, routing) {
290
+ const own = new Set(routing.map((s) => s[0]));
291
+ const spans = [];
292
+ for (const [lo, hi] of merged(routing.map(([s, e]) => lineBounds(data, s, e)))) {
293
+ const base = Math.max(0, lo - 1); // the lookbehind sees the byte before the line
294
+ const window = data.slice(base, hi);
295
+ let pos = lo;
296
+ let m;
297
+ while ((m = searchFrom(LINE_NUMBER, window, pos - base)) !== null) {
298
+ const start = base + m.index;
299
+ const end = own.has(start) ? null : lineAccountEnd(data, start, hi);
300
+ if (end !== null)
301
+ spans.push([start, end, ACCOUNT]);
302
+ pos = end ?? start + m[0].length;
303
+ }
304
+ }
305
+ return spans;
306
+ }
307
+ function lineAccountEnd(data, start, hi) {
308
+ if (!leftOk(data, start))
309
+ return null;
310
+ const end = accountValueEnd(data, start);
311
+ if (end === null || end > hi || DATE.test(data.slice(start, end))
312
+ || TEST_ACCOUNTS.has(digits(data.slice(start, end))))
313
+ return null;
314
+ return end;
315
+ }
316
+ function merged(windows) {
317
+ const out = [];
318
+ for (const [lo, hi] of [...windows].sort((a, b) => a[0] - b[0] || a[1] - b[1])) {
319
+ const last = out[out.length - 1];
320
+ if (last && lo <= last[1])
321
+ last[1] = Math.max(last[1], hi);
322
+ else
323
+ out.push([lo, hi]);
324
+ }
325
+ return out;
326
+ }
327
+ function lineBounds(data, start, end) {
328
+ const lo = Math.max(0, start - LINE_REACH);
329
+ const hi = Math.min(data.length, end + LINE_REACH);
330
+ const newline = rfind(data, "\n", lo, start);
331
+ const escaped = rfind(data, "\\n", lo, start);
332
+ const begin = Math.max(newline >= 0 ? newline + 1 : lo, escaped >= 0 ? escaped + 2 : lo);
333
+ const after = LINE_END.exec(data.slice(end, hi));
334
+ return [begin, after ? end + after.index : hi];
335
+ }
336
+ // --------------------------------------------------------------------------- checks
337
+ function isCard(value) {
338
+ if (TEST_CARDS.has(value) || new Set(value).size <= 3)
339
+ return false;
340
+ return cardBrand(value) !== null && luhnOk(value);
341
+ }
342
+ function cardBrand(value) {
343
+ for (const [brand, ranges, lengths] of BRANDS) {
344
+ if (!lengths.has(value.length))
345
+ continue;
346
+ if (ranges.some(([lo, hi]) => {
347
+ const head = Number(value.slice(0, String(lo).length));
348
+ return lo <= head && head <= hi;
349
+ }))
350
+ return brand;
351
+ }
352
+ return null;
353
+ }
354
+ function luhnOk(value) {
355
+ let total = 0;
356
+ for (let i = 0; i < value.length; i += 1) {
357
+ let d = value.charCodeAt(value.length - 1 - i) - 48;
358
+ if (i % 2)
359
+ d = d > 4 ? d * 2 - 9 : d * 2;
360
+ total += d;
361
+ }
362
+ return total % 10 === 0;
363
+ }
364
+ function isRouting(value) {
365
+ if (value.length !== 9 || TEST_ROUTING.has(value)
366
+ || !ROUTING_PREFIXES.has(Number(value.slice(0, 2))))
367
+ return false;
368
+ const d = [...value].map((c) => c.charCodeAt(0) - 48);
369
+ const total = 3 * (d[0] + d[3] + d[6]) + 7 * (d[1] + d[4] + d[7]) + (d[2] + d[5] + d[8]);
370
+ return total % 10 === 0 && new Set(value).size > 2;
371
+ }
372
+ function isIban(value) {
373
+ if (IBAN_LENGTHS[value.slice(0, 2)] !== value.length || TEST_IBANS.has(value))
374
+ return false;
375
+ const moved = value.slice(4) + value.slice(0, 4);
376
+ let rest = 0;
377
+ for (const c of moved) {
378
+ for (const d of String(parseInt(c, 36)))
379
+ rest = (rest * 10 + d.charCodeAt(0) - 48) % 97;
380
+ }
381
+ return rest === 1;
382
+ }
383
+ function isSsn(value) {
384
+ if (value.length !== 9 || EXAMPLE_SSNS.has(value))
385
+ return false;
386
+ const area = value.slice(0, 3);
387
+ return area !== "000" && area !== "666" && area[0] !== "9" && value.slice(3, 5) !== "00"
388
+ && value.slice(5) !== "0000";
389
+ }
390
+ /** Not part of a longer token on either side. */
391
+ function standalone(data, start, end) {
392
+ return leftOk(data, start) && rightOk(data, end);
393
+ }
394
+ function leftOk(data, start) {
395
+ if (start === 0)
396
+ return true;
397
+ const prev = data[start - 1];
398
+ if (JSON_ESCAPES.includes(prev) && start >= 2 && data[start - 2] === "\\")
399
+ return true;
400
+ if (wordBefore(data, start))
401
+ return false;
402
+ if (prev === ":"
403
+ && COLON_LABEL.test(asciiLower(data.slice(Math.max(0, start - 21), start - 1)))) {
404
+ return true; // routing:021000021, SSN:536-22-8714 (a label, not file:line)
405
+ }
406
+ return !(JOINERS.includes(prev) && start >= 2
407
+ && (data[start - 2] === "]" || wordBefore(data, start - 1)));
408
+ }
409
+ function rightOk(data, end) {
410
+ if (end >= data.length)
411
+ return true;
412
+ const next = data[end];
413
+ if (wordAfter(data, end))
414
+ return false;
415
+ return !(JOINERS.includes(next) && end + 1 < data.length
416
+ && (data[end + 1] === "]" || wordAfter(data, end + 1)));
417
+ }
418
+ /** The character ending at pos is a letter, digit or "_" (non-ASCII decoded). */
419
+ function wordBefore(data, pos) {
420
+ if (data.charCodeAt(pos - 1) < 0x80)
421
+ return ALNUM.test(data[pos - 1]);
422
+ let start = pos - 1;
423
+ while (start > 0 && pos - start < 4 && isContinuation(data.charCodeAt(start)))
424
+ start -= 1;
425
+ const chars = decodeIgnore(data.slice(start, pos));
426
+ return chars.length > 0 && UNICODE_ALNUM.test(chars[chars.length - 1]);
427
+ }
428
+ /** The character starting at pos is a letter, digit or "_" (non-ASCII decoded). */
429
+ function wordAfter(data, pos) {
430
+ if (data.charCodeAt(pos) < 0x80)
431
+ return ALNUM.test(data[pos]);
432
+ const chars = decodeIgnore(data.slice(pos, pos + 4));
433
+ return chars.length > 0 && UNICODE_ALNUM.test(chars[0]);
434
+ }
435
+ function isContinuation(byte) {
436
+ return byte >= 0x80 && byte < 0xc0;
437
+ }
438
+ /** A context word starting within CONTEXT_WINDOW bytes; the search runs past the window so
439
+ * a word cut at its edge ("abandon" as "aba") is read whole. */
440
+ function near(pattern, low, start, end) {
441
+ const lo = Math.max(0, start - CONTEXT_WINDOW);
442
+ const hi = Math.min(low.length, end + CONTEXT_WINDOW);
443
+ const m = searchWithin(pattern, low, lo, Math.min(low.length, hi + MAX_WORD), 2);
444
+ return m !== null && m < hi;
445
+ }
446
+ /** data after its field key as "key: "; a key over KEY_MAX bytes is reduced to the words
447
+ * the rules read (context, labels, non-bank qualifiers), in order. */
448
+ function withContext(data, context) {
449
+ let key = context;
450
+ if (key.length > KEY_MAX)
451
+ key = keyContext(asciiLower(key));
452
+ const prefix = key + ": ";
453
+ return [prefix + data, prefix.length];
454
+ }
455
+ /** low with each redaction marker blanked (same length), so a marker's words are never
456
+ * context for a number next to it. */
457
+ function blankMarkers(low) {
458
+ if (!low.includes(MARKER_LOW))
459
+ return low;
460
+ return low.replace(MARKER_RE, (m) => " ".repeat(m.length));
461
+ }
462
+ /** What a long lowercased key proves: routing/SSN context words, and an account label only
463
+ * when the key holds one, with no non-bank qualifier. */
464
+ function keyContext(low) {
465
+ const words = [];
466
+ if (searchFrom(ROUTING_CONTEXT, low, 0))
467
+ words.push("routing");
468
+ if (searchFrom(SSN_CONTEXT, low, 0))
469
+ words.push("ssn");
470
+ if (KEY_ACCOUNT_LABEL.test(low) && searchFrom(ACCOUNT_NEGATIVE, low, 0) === null) {
471
+ words.push("account number");
472
+ }
473
+ return words.join(" ");
474
+ }
475
+ // --------------------------------------------------------------------------- helpers
476
+ function digits(value) {
477
+ return value.replace(/[^0-9]/g, "");
478
+ }
479
+ function nonOverlapping(spans) {
480
+ const kept = [];
481
+ for (const span of [...spans].sort((a, b) => a[0] - b[0] || b[1] - a[1])) {
482
+ if (kept.length === 0 || span[0] >= kept[kept.length - 1][1])
483
+ kept.push(span);
484
+ }
485
+ return kept;
486
+ }
487
+ /** pattern (global) searched from pos, as Python's pattern.search(text, pos). */
488
+ function searchFrom(pattern, text, pos) {
489
+ pattern.lastIndex = pos;
490
+ return pattern.exec(text);
491
+ }
492
+ /** Start of pattern's first match in text[lo:hi) as Python's search(text, lo, hi): the
493
+ * text ends at hi, and lookbehinds see up to `behind` bytes before lo. */
494
+ function searchWithin(pattern, text, lo, hi, behind) {
495
+ const base = Math.max(0, lo - behind);
496
+ const m = searchFrom(pattern, text.slice(base, hi), lo - base);
497
+ return m === null ? null : base + m.index;
498
+ }
499
+ /** Python's str.rfind(sub, lo, hi): the last start i with text[i:i+len(sub)] in [lo, hi). */
500
+ function rfind(text, sub, lo, hi) {
501
+ if (hi - sub.length < lo)
502
+ return -1;
503
+ const i = text.slice(lo, hi).lastIndexOf(sub); // a slice: never scans before lo
504
+ return i === -1 ? -1 : lo + i;
505
+ }
506
+ function range(lo, hi) {
507
+ return Array.from({ length: hi - lo }, (_, i) => lo + i);
508
+ }
509
+ //# sourceMappingURL=financial-redaction.js.map