@intutic/shared-types 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/anomaly.d.ts +6 -10
  2. package/dist/anomaly.d.ts.map +1 -1
  3. package/dist/anomaly.js +0 -2
  4. package/dist/anomaly.js.map +1 -1
  5. package/dist/api-contracts.d.ts +1 -1
  6. package/dist/api-contracts.js +1 -1
  7. package/dist/attenuation.d.ts +1 -1
  8. package/dist/attenuation.js +1 -1
  9. package/dist/auth.d.ts +10 -9
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +3 -4
  12. package/dist/auth.js.map +1 -1
  13. package/dist/billing.d.ts +1 -1
  14. package/dist/billing.js +1 -1
  15. package/dist/destructiveSql.d.ts +48 -0
  16. package/dist/destructiveSql.d.ts.map +1 -0
  17. package/dist/destructiveSql.js +43 -0
  18. package/dist/destructiveSql.js.map +1 -0
  19. package/dist/devInventory.d.ts +120 -0
  20. package/dist/devInventory.d.ts.map +1 -0
  21. package/dist/devInventory.js +80 -0
  22. package/dist/devInventory.js.map +1 -0
  23. package/dist/enums.d.ts +18 -21
  24. package/dist/enums.d.ts.map +1 -1
  25. package/dist/enums.js +24 -28
  26. package/dist/enums.js.map +1 -1
  27. package/dist/errors.js +3 -3
  28. package/dist/errors.js.map +1 -1
  29. package/dist/finops.d.ts +14 -2
  30. package/dist/finops.d.ts.map +1 -1
  31. package/dist/finops.js +15 -1
  32. package/dist/finops.js.map +1 -1
  33. package/dist/gateDecisions.d.ts +18 -0
  34. package/dist/gateDecisions.d.ts.map +1 -0
  35. package/dist/gateDecisions.js +20 -0
  36. package/dist/gateDecisions.js.map +1 -0
  37. package/dist/gateIdentity.d.ts +23 -0
  38. package/dist/gateIdentity.d.ts.map +1 -0
  39. package/dist/gateIdentity.js +32 -0
  40. package/dist/gateIdentity.js.map +1 -0
  41. package/dist/gateKind.d.ts +172 -0
  42. package/dist/gateKind.d.ts.map +1 -0
  43. package/dist/gateKind.js +160 -0
  44. package/dist/gateKind.js.map +1 -0
  45. package/dist/gateLimits.d.ts +170 -0
  46. package/dist/gateLimits.d.ts.map +1 -0
  47. package/dist/gateLimits.js +96 -0
  48. package/dist/gateLimits.js.map +1 -0
  49. package/dist/gitRemote.d.ts +17 -0
  50. package/dist/gitRemote.d.ts.map +1 -0
  51. package/dist/gitRemote.js +71 -0
  52. package/dist/gitRemote.js.map +1 -0
  53. package/dist/governanceCoverage.d.ts +3 -3
  54. package/dist/governanceCoverage.js +3 -3
  55. package/dist/guardrailIr.d.ts +3 -3
  56. package/dist/guardrailIr.d.ts.map +1 -1
  57. package/dist/guardrailIr.js +3 -3
  58. package/dist/guardrailIr.js.map +1 -1
  59. package/dist/guardrailRender.d.ts +1 -1
  60. package/dist/guardrailRender.js +1 -1
  61. package/dist/harnessRules.d.ts +74 -0
  62. package/dist/harnessRules.d.ts.map +1 -0
  63. package/dist/harnessRules.js +142 -0
  64. package/dist/harnessRules.js.map +1 -0
  65. package/dist/holdMessages.d.ts +25 -0
  66. package/dist/holdMessages.d.ts.map +1 -0
  67. package/dist/holdMessages.js +34 -0
  68. package/dist/holdMessages.js.map +1 -0
  69. package/dist/identity.d.ts +1 -1
  70. package/dist/identity.js +2 -2
  71. package/dist/identity.js.map +1 -1
  72. package/dist/index.d.ts +36 -6
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +141 -10
  75. package/dist/index.js.map +1 -1
  76. package/dist/intelligence.d.ts +1 -2
  77. package/dist/intelligence.d.ts.map +1 -1
  78. package/dist/intelligence.js.map +1 -1
  79. package/dist/mcpBudgets.d.ts +191 -0
  80. package/dist/mcpBudgets.d.ts.map +1 -0
  81. package/dist/mcpBudgets.js +144 -0
  82. package/dist/mcpBudgets.js.map +1 -0
  83. package/dist/mcpRegistryRecord.d.ts +143 -0
  84. package/dist/mcpRegistryRecord.d.ts.map +1 -0
  85. package/dist/mcpRegistryRecord.js +229 -0
  86. package/dist/mcpRegistryRecord.js.map +1 -0
  87. package/dist/mcpToolRisk.d.ts +82 -0
  88. package/dist/mcpToolRisk.d.ts.map +1 -0
  89. package/dist/mcpToolRisk.js +334 -0
  90. package/dist/mcpToolRisk.js.map +1 -0
  91. package/dist/modelCatalog.d.ts +2 -2
  92. package/dist/modelCatalog.generated.js +1 -1
  93. package/dist/modelCatalog.generated.js.map +1 -1
  94. package/dist/modelCatalog.js +2 -2
  95. package/dist/notifications.d.ts +20 -130
  96. package/dist/notifications.d.ts.map +1 -1
  97. package/dist/notifications.js +241 -1
  98. package/dist/notifications.js.map +1 -1
  99. package/dist/phrases.d.ts +87 -0
  100. package/dist/phrases.d.ts.map +1 -0
  101. package/dist/phrases.js +241 -0
  102. package/dist/phrases.js.map +1 -0
  103. package/dist/piiDetectors.d.ts +97 -0
  104. package/dist/piiDetectors.d.ts.map +1 -0
  105. package/dist/piiDetectors.js +96 -0
  106. package/dist/piiDetectors.js.map +1 -0
  107. package/dist/piiDetectors.json +71 -0
  108. package/dist/policy.d.ts +1 -1
  109. package/dist/policy.js +1 -1
  110. package/dist/policyGuardrails.d.ts +127 -10
  111. package/dist/policyGuardrails.d.ts.map +1 -1
  112. package/dist/policyGuardrails.js +59 -6
  113. package/dist/policyGuardrails.js.map +1 -1
  114. package/dist/posturePresets.js +1 -1
  115. package/dist/posturePresets.js.map +1 -1
  116. package/dist/providerVerification.d.ts +2 -2
  117. package/dist/providerVerification.js +2 -2
  118. package/dist/providers.d.ts +4 -4
  119. package/dist/providers.d.ts.map +1 -1
  120. package/dist/providers.js +11 -6
  121. package/dist/providers.js.map +1 -1
  122. package/dist/regoBuiltins.d.ts +42 -0
  123. package/dist/regoBuiltins.d.ts.map +1 -0
  124. package/dist/regoBuiltins.js +732 -0
  125. package/dist/regoBuiltins.js.map +1 -0
  126. package/dist/regoRules.d.ts +105 -0
  127. package/dist/regoRules.d.ts.map +1 -0
  128. package/dist/regoRules.js +407 -0
  129. package/dist/regoRules.js.map +1 -0
  130. package/dist/ruleLoadFailures.d.ts +15 -0
  131. package/dist/ruleLoadFailures.d.ts.map +1 -0
  132. package/dist/ruleLoadFailures.js +26 -0
  133. package/dist/ruleLoadFailures.js.map +1 -0
  134. package/dist/scriptScan.d.ts +5 -5
  135. package/dist/scriptScan.js +3 -3
  136. package/dist/sequence.d.ts +52 -0
  137. package/dist/sequence.d.ts.map +1 -0
  138. package/dist/sequence.js +127 -0
  139. package/dist/sequence.js.map +1 -0
  140. package/dist/session.d.ts +1 -1
  141. package/dist/session.js +1 -1
  142. package/dist/skillScan.d.ts +3 -3
  143. package/dist/skillScan.d.ts.map +1 -1
  144. package/dist/skillScan.js +26 -4
  145. package/dist/skillScan.js.map +1 -1
  146. package/dist/sop.d.ts +24 -11
  147. package/dist/sop.d.ts.map +1 -1
  148. package/dist/sop.js +10 -9
  149. package/dist/sop.js.map +1 -1
  150. package/dist/sourceProviders.d.ts +1 -8
  151. package/dist/sourceProviders.d.ts.map +1 -1
  152. package/dist/sourceProviders.js +2 -9
  153. package/dist/sourceProviders.js.map +1 -1
  154. package/dist/ssoGroupClearance.d.ts +119 -0
  155. package/dist/ssoGroupClearance.d.ts.map +1 -0
  156. package/dist/ssoGroupClearance.js +196 -0
  157. package/dist/ssoGroupClearance.js.map +1 -0
  158. package/dist/sync.d.ts +42 -14
  159. package/dist/sync.d.ts.map +1 -1
  160. package/dist/sync.js +3 -3
  161. package/dist/sync.js.map +1 -1
  162. package/dist/taskManagement.d.ts +0 -2
  163. package/dist/taskManagement.d.ts.map +1 -1
  164. package/dist/taskManagement.js +0 -2
  165. package/dist/taskManagement.js.map +1 -1
  166. package/dist/toolPoison.d.ts +33 -0
  167. package/dist/toolPoison.d.ts.map +1 -0
  168. package/dist/toolPoison.js +85 -0
  169. package/dist/toolPoison.js.map +1 -0
  170. package/dist/usage.d.ts +186 -0
  171. package/dist/usage.d.ts.map +1 -1
  172. package/dist/wasmBinary.d.ts +25 -0
  173. package/dist/wasmBinary.d.ts.map +1 -0
  174. package/dist/wasmBinary.js +111 -0
  175. package/dist/wasmBinary.js.map +1 -0
  176. package/dist/wasmFuel.d.ts +52 -0
  177. package/dist/wasmFuel.d.ts.map +1 -0
  178. package/dist/wasmFuel.js +320 -0
  179. package/dist/wasmFuel.js.map +1 -0
  180. package/dist/wasmMemoryCap.d.ts +21 -0
  181. package/dist/wasmMemoryCap.d.ts.map +1 -0
  182. package/dist/wasmMemoryCap.js +58 -0
  183. package/dist/wasmMemoryCap.js.map +1 -0
  184. package/dist/workspaceSettings.d.ts +126 -17
  185. package/dist/workspaceSettings.d.ts.map +1 -1
  186. package/dist/workspaceSettings.js +21 -2
  187. package/dist/workspaceSettings.js.map +1 -1
  188. package/package.json +2 -2
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ /**
3
+ * Phrase matching for shell commands and SQL in linear time.
4
+ *
5
+ * Every command classifier asks the same question: does this text contain
6
+ * `git push`, `drop table`, `curl --data`, whatever separates the words? The
7
+ * separators that count are the ones the shell or the database reads as a
8
+ * word break:
9
+ *
10
+ * - whitespace, a two-character escaped `\n`, `\t` or `\r`, and a backslash
11
+ * before whitespace (a line continuation, or an escaped space);
12
+ * - a `/* … *\/` comment;
13
+ * - a `-- …` comment that runs to a newline (real or escaped);
14
+ * - a run of options starting with `--` (`git --no-pager push`,
15
+ * `kubectl --context prod apply`), which stops at `;`, `&`, `|` or a real
16
+ * newline — the end of the shell command it is in.
17
+ *
18
+ * The proxy's Rust classifier expresses this as a regex (`SQL_GAP` in
19
+ * `actions.rs`), which is safe there: Rust's engine is linear. JavaScript's
20
+ * and Python's backtrack, and that regex took seconds on a few hundred
21
+ * kilobytes of `git -- git -- …` — text an agent can be talked into producing.
22
+ * So here the text is cut into words in one pass, and a phrase is matched over
23
+ * the words right to left with one array per phrase word: O(length × words).
24
+ * No regex runs on the input.
25
+ *
26
+ * The two functions are self-contained on purpose — no imports, no module
27
+ * state — because the hook gates emit them as source (`phraseText.toString()`)
28
+ * and run them outside this package. `packages/gate-js/src/phrases.ts` is a
29
+ * byte-identical copy and `intutic_clawde/gate/phrases.py` a transliteration;
30
+ * all of them run `action_vectors.json` beside the proxy's `actions.rs`.
31
+ *
32
+ * @module
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.PHRASES_JS_SOURCE = void 0;
36
+ exports.phraseText = phraseText;
37
+ exports.hasPhrase = hasPhrase;
38
+ /**
39
+ * Cuts `input` into words in one pass. A `--` inside a word starts a new one
40
+ * (`drop--why` is `drop` and `--why`), glued rather than separated, so it can
41
+ * open a comment or an option run but cannot stand for a plain gap.
42
+ */
43
+ function phraseText(input) {
44
+ const s = String(input == null ? '' : input).toLowerCase();
45
+ const n = s.length;
46
+ const isSpace = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\v' || c === '\f' ||
47
+ c === '\u00a0' || c === '\u1680' || (c >= '\u2000' && c <= '\u200a') ||
48
+ c === '\u2028' || c === '\u2029' || c === '\u202f' || c === '\u205f' || c === '\u3000' || c === '\ufeff';
49
+ const t = { raw: s, joined: '', toks: [], sep: [], nl: [], eol: [], dash: [], bar: [], tail: false, memo: {}, next: null };
50
+ let start = -1;
51
+ let tokBar = false;
52
+ let pendSep = false;
53
+ let pendNl = false;
54
+ let pendEol = false;
55
+ // The next `*/` at or after the last search; -1 once there is none left.
56
+ let close = -2;
57
+ const end = (at) => {
58
+ if (start < 0)
59
+ return;
60
+ t.toks.push(s.slice(start, at));
61
+ t.sep.push(pendSep);
62
+ t.nl.push(pendNl);
63
+ t.eol.push(pendEol);
64
+ t.dash.push(s.charAt(start) === '-' && s.charAt(start + 1) === '-');
65
+ t.bar.push(tokBar);
66
+ start = -1;
67
+ tokBar = false;
68
+ pendSep = false;
69
+ pendNl = false;
70
+ pendEol = false;
71
+ };
72
+ const gap = (newline, eol) => {
73
+ end(i);
74
+ pendSep = true;
75
+ if (newline)
76
+ pendNl = true;
77
+ if (eol)
78
+ pendEol = true;
79
+ };
80
+ let i = 0;
81
+ while (i < n) {
82
+ const c = s.charAt(i);
83
+ const d = i + 1 < n ? s.charAt(i + 1) : '';
84
+ if (isSpace(c)) {
85
+ gap(c === '\n', c === '\n');
86
+ i += 1;
87
+ }
88
+ else if (c === '\\' && (d === 'n' || d === 't' || d === 'r')) {
89
+ gap(false, d === 'n');
90
+ i += 2;
91
+ }
92
+ else if (c === '\\' && d !== '' && isSpace(d)) {
93
+ gap(false, false);
94
+ i += 2;
95
+ }
96
+ else if (c === '/' && d === '*' && close !== -1 && (close >= i + 2 || (close = s.indexOf('*/', i + 2)) !== -1)) {
97
+ gap(false, false);
98
+ i = close + 2;
99
+ }
100
+ else {
101
+ if (c === '-' && d === '-' && start >= 0 && s.charAt(i - 1) !== '-')
102
+ end(i);
103
+ if (start < 0)
104
+ start = i;
105
+ if (c === ';' || c === '&' || c === '|')
106
+ tokBar = true;
107
+ i += 1;
108
+ }
109
+ }
110
+ end(n);
111
+ t.tail = pendSep;
112
+ t.joined = t.toks.join(' ');
113
+ return t;
114
+ }
115
+ /**
116
+ * Whether `t` contains `needle`, a phrase whose words are separated by single
117
+ * spaces. A one-word needle is a plain substring. In a longer one the first
118
+ * word may end a word of the text (`digit push` contains `git push`, as a
119
+ * substring would), the last may begin one, and the words between must be
120
+ * whole; a trailing space (`'update '`) asks for a separator after the last
121
+ * word. `bounded` additionally requires a non-word character (or the edge of
122
+ * the word) before the first word and after the last, where `.` also counts
123
+ * as part of a word (`table.log` is not `table`).
124
+ */
125
+ function hasPhrase(t, needle, bounded) {
126
+ const words = needle.toLowerCase().split(' ');
127
+ if (words.length === 1)
128
+ return t.raw.indexOf(words[0]) !== -1;
129
+ const trailingGap = words[words.length - 1] === '';
130
+ if (trailingGap)
131
+ words.pop();
132
+ for (const w of words)
133
+ if (w === '' || t.joined.indexOf(w) === -1)
134
+ return false;
135
+ const T = t.toks.length;
136
+ const k = words.length;
137
+ const isWord = (c) => (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c === '_';
138
+ // Whether word `i` of the phrase can be the word at `q`, by its position.
139
+ // Typed arrays throughout: every array here has one entry per word of the
140
+ // text, and a classifier asks dozens of phrases of the same text.
141
+ const matches = (i) => {
142
+ const w = words[i];
143
+ const first = i === 0;
144
+ const last = i === k - 1 && !trailingGap;
145
+ const key = (first ? 'f' : '') + (last ? 'l' : '') + (bounded ? 'b' : '') + ':' + w;
146
+ const hit = t.memo[key];
147
+ if (hit)
148
+ return hit;
149
+ const out = new Uint8Array(T);
150
+ for (let q = 0; q < T; q++) {
151
+ const tok = t.toks[q];
152
+ let ok;
153
+ if (first && last)
154
+ ok = tok.indexOf(w) !== -1;
155
+ else if (first)
156
+ ok = tok.length >= w.length && tok.lastIndexOf(w) === tok.length - w.length;
157
+ else if (last)
158
+ ok = tok.lastIndexOf(w, 0) === 0;
159
+ else
160
+ ok = tok === w;
161
+ if (ok && bounded && first)
162
+ ok = tok.length === w.length || !isWord(tok.charAt(tok.length - w.length - 1));
163
+ if (ok && bounded && last)
164
+ ok = tok.length === w.length || !(isWord(tok.charAt(w.length)) || tok.charAt(w.length) === '.');
165
+ out[q] = ok ? 1 : 0;
166
+ }
167
+ t.memo[key] = out;
168
+ return out;
169
+ };
170
+ // nextBar[x]: first word at or after x containing `;&|`; nextNl[x]: first
171
+ // word at or after x with a real newline before it; nextEol likewise for any
172
+ // newline. T when there is none. Once per text, not once per phrase.
173
+ if (t.next === null) {
174
+ const bar = new Int32Array(T + 1);
175
+ const nl = new Int32Array(T + 1);
176
+ const eol = new Int32Array(T + 1);
177
+ bar[T] = T;
178
+ nl[T] = T;
179
+ eol[T] = T;
180
+ for (let x = T - 1; x >= 0; x--) {
181
+ bar[x] = t.bar[x] ? x : bar[x + 1];
182
+ nl[x] = t.nl[x] ? x : nl[x + 1];
183
+ eol[x] = t.eol[x] ? x : eol[x + 1];
184
+ }
185
+ t.next = { bar, nl, eol };
186
+ }
187
+ const nextBar = t.next.bar;
188
+ const nextNl = t.next.nl;
189
+ const nextEol = t.next.eol;
190
+ // ok[q]: the rest of the phrase, from the current word on, matches with
191
+ // that word at q. Start with the last word and walk back.
192
+ let ok = new Uint8Array(T + 1);
193
+ const lastHits = matches(k - 1);
194
+ for (let q = 0; q < T; q++) {
195
+ let v = lastHits[q] === 1;
196
+ if (v && trailingGap) {
197
+ const r = q + 1;
198
+ v = r < T ? t.sep[r] || (t.dash[r] && !t.bar[r] && (r + 1 < T || t.tail)) : t.tail;
199
+ }
200
+ ok[q] = v ? 1 : 0;
201
+ }
202
+ for (let i = k - 2; i >= 0; i--) {
203
+ // nextOk[x]: first word at or after x where the rest matches after a separator.
204
+ const nextOk = new Int32Array(T + 2);
205
+ nextOk[T] = T;
206
+ nextOk[T + 1] = T;
207
+ for (let x = T - 1; x >= 0; x--)
208
+ nextOk[x] = ok[x] === 1 && t.sep[x] ? x : nextOk[x + 1];
209
+ // reach[r]: the gap that starts at word r leads into the rest of the phrase.
210
+ const reach = new Uint8Array(T + 1);
211
+ for (let r = T - 1; r >= 0; r--) {
212
+ let v = t.sep[r] && ok[r] === 1;
213
+ if (!v && t.dash[r]) {
214
+ // A `--` comment runs to the next newline; more gap may follow it.
215
+ const after = nextEol[r + 1];
216
+ if (after < T && reach[after] === 1)
217
+ v = true;
218
+ // An option run reaches any word before a `;&|` word or a real newline.
219
+ const limit = Math.min(nextBar[r], nextNl[r + 1], T - 1);
220
+ if (!v && nextOk[r + 1] <= limit)
221
+ v = true;
222
+ }
223
+ reach[r] = v ? 1 : 0;
224
+ }
225
+ const hits = matches(i);
226
+ const prev = new Uint8Array(T + 1);
227
+ for (let p = 0; p < T; p++)
228
+ prev[p] = hits[p] & reach[p + 1];
229
+ ok = prev;
230
+ }
231
+ for (let p = 0; p < T; p++)
232
+ if (ok[p] === 1)
233
+ return true;
234
+ return false;
235
+ }
236
+ /**
237
+ * Both functions as JavaScript source, for a hook gate to emit: the gates run
238
+ * this exact code, not a retyped copy.
239
+ */
240
+ exports.PHRASES_JS_SOURCE = `${phraseText.toString()}\n${hasPhrase.toString()}`;
241
+ //# sourceMappingURL=phrases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phrases.js","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * PII detector definitions, shared with the Rust proxy.
3
+ *
4
+ * `piiDetectors.json` is a byte-identical copy of
5
+ * `packages/proxy/src/dlp/pii_detectors.json`, which the Rust proxy embeds at
6
+ * compile time. The proxy's image is built from `packages/proxy` alone, so it
7
+ * cannot read this package, and this package ships to npm without the Rust
8
+ * tree — hence two copies, each tested against the other (`dlp/pii.rs` and
9
+ * the MCP proxy's `dlpPii.test.ts`). The validators the definition names are
10
+ * implemented in `packages/proxy/src/dlp/pii.rs` and
11
+ * `packages/mcp-proxy/src/dlpPii.ts`.
12
+ */
13
+ import { z } from 'zod';
14
+ /** What a detector does with a match, least to most strict. `off` detectors are not run. */
15
+ export declare const PII_ACTIONS: readonly ["off", "redact", "block"];
16
+ export type PiiAction = (typeof PII_ACTIONS)[number];
17
+ /** Every detector's id, in `piiDetectors.json`'s order (a test holds the two equal). */
18
+ export declare const PII_DETECTOR_IDS: readonly ["pii.card", "pii.iban", "pii.ssn", "pii.email", "pii.phone"];
19
+ export type PiiDetectorId = (typeof PII_DETECTOR_IDS)[number];
20
+ /**
21
+ * The workspace setting `piiDetectors`: an action for each detector the
22
+ * workspace governs centrally. Both proxies use it as the baseline for the
23
+ * workspace's traffic, and a machine's own config may only tighten it
24
+ * ({@link effectivePiiActions}). A detector left out keeps each machine's
25
+ * action. Unknown ids and actions are refused.
26
+ */
27
+ export declare const PiiDetectorSettingsSchema: z.ZodRecord<z.ZodEnum<["pii.card", "pii.iban", "pii.ssn", "pii.email", "pii.phone"]>, z.ZodEnum<["off", "redact", "block"]>>;
28
+ export type PiiDetectorSettings = Partial<Record<PiiDetectorId, PiiAction>>;
29
+ /**
30
+ * The `piiDetectors` field of a control-plane answer, as a proxy reads it.
31
+ * The LLM proxy gets it from `/api/v1/auth/key-context`, the MCP proxy from
32
+ * `/api/v1/sop/rules` or `/api/v1/policy/resolve`; all three send the same
33
+ * value. `unreadable` goes to the proxy's fail mode.
34
+ */
35
+ export type WorkspacePiiDetectors = {
36
+ kind: 'none';
37
+ } | {
38
+ kind: 'set';
39
+ actions: PiiDetectorSettings;
40
+ } | {
41
+ kind: 'unreadable';
42
+ reason: string;
43
+ };
44
+ /**
45
+ * Reads the field. Absent is a control plane older than the setting, and
46
+ * `{}` a workspace that sets none: both `none`. `null` is the control plane
47
+ * saying it could not read the stored setting. An id this build does not
48
+ * know is left out, since a newer control plane can name a detector an older
49
+ * proxy cannot run; an action that does not exist makes the whole field
50
+ * unreadable. The Rust proxy reads it the same way (`dlp/workspace.rs`), and
51
+ * `fixtures/pii-precedence-vectors.json` holds the two together.
52
+ */
53
+ export declare function parseWorkspacePiiDetectors(field: unknown): WorkspacePiiDetectors;
54
+ /**
55
+ * Every detector's action for a workspace's traffic on one machine.
56
+ *
57
+ * The workspace setting is the baseline for each detector it names, and the
58
+ * machine's own config (`local`, only the detectors it names) may tighten it
59
+ * (`off` → `redact` → `block`) but never loosen it, so a developer cannot
60
+ * switch off on their machine what the workspace turned on. A detector the
61
+ * workspace leaves out keeps the machine's action, else its default; with no
62
+ * workspace setting the machine's config applies alone. The Rust proxy's
63
+ * `effective_pii_actions` (`dlp.rs`) is the same rule, and both run
64
+ * `fixtures/pii-precedence-vectors.json`.
65
+ */
66
+ export declare function effectivePiiActions(local: PiiDetectorSettings, workspace: PiiDetectorSettings | null): Record<PiiDetectorId, PiiAction>;
67
+ export interface PiiDetectorDefinition {
68
+ /** Stable finding id, `pii.*`. */
69
+ id: string;
70
+ category: string;
71
+ description: string;
72
+ /** Rust regex ∩ JavaScript RegExp: ASCII classes, no `\b`, no lookaround. */
73
+ regex: string;
74
+ /** `numeric` adds the decimal/serial rule on top of the word boundary. */
75
+ boundary: 'word' | 'numeric';
76
+ validator: 'card_luhn' | 'iban_mod97' | 'ssn_ranges' | 'email_shape' | 'phone_digits';
77
+ default_action: PiiAction;
78
+ }
79
+ export interface PiiDefinition {
80
+ version: number;
81
+ detectors: PiiDetectorDefinition[];
82
+ /** Inclusive `[low, high]` IIN ranges, both bounds the same number of digits. */
83
+ card_brands: Array<{
84
+ brand: string;
85
+ prefixes: Array<[string, string]>;
86
+ lengths: number[];
87
+ }>;
88
+ /** IBAN length by ISO 3166 country code, from the SWIFT IBAN registry. */
89
+ iban_lengths: Record<string, number>;
90
+ }
91
+ /**
92
+ * JSON imports type their strings as `string`, not the unions above, hence
93
+ * the cast through `unknown`. The MCP proxy refuses to load an unknown
94
+ * validator name, and the conformance vectors pin the rest.
95
+ */
96
+ export declare const PII_DEFINITION: PiiDefinition;
97
+ //# sourceMappingURL=piiDetectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piiDetectors.d.ts","sourceRoot":"","sources":["../src/piiDetectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,4FAA4F;AAC5F,eAAO,MAAM,WAAW,qCAAsC,CAAA;AAC9D,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,wEAAyE,CAAA;AACtG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,8HAA0D,CAAA;AAChG,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAA;AAE3E;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAK1C;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAkBhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,mBAAmB,GAAG,IAAI,GACpC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAYlC;AAED,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAAA;IACrF,cAAc,EAAE,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,qBAAqB,EAAE,CAAA;IAClC,iFAAiF;IACjF,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC3F,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAA4B,aAAa,CAAA"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PII_DEFINITION = exports.PiiDetectorSettingsSchema = exports.PII_DETECTOR_IDS = exports.PII_ACTIONS = void 0;
7
+ exports.parseWorkspacePiiDetectors = parseWorkspacePiiDetectors;
8
+ exports.effectivePiiActions = effectivePiiActions;
9
+ /**
10
+ * PII detector definitions, shared with the Rust proxy.
11
+ *
12
+ * `piiDetectors.json` is a byte-identical copy of
13
+ * `packages/proxy/src/dlp/pii_detectors.json`, which the Rust proxy embeds at
14
+ * compile time. The proxy's image is built from `packages/proxy` alone, so it
15
+ * cannot read this package, and this package ships to npm without the Rust
16
+ * tree — hence two copies, each tested against the other (`dlp/pii.rs` and
17
+ * the MCP proxy's `dlpPii.test.ts`). The validators the definition names are
18
+ * implemented in `packages/proxy/src/dlp/pii.rs` and
19
+ * `packages/mcp-proxy/src/dlpPii.ts`.
20
+ */
21
+ const zod_1 = require("zod");
22
+ const piiDetectors_json_1 = __importDefault(require("./piiDetectors.json"));
23
+ /** What a detector does with a match, least to most strict. `off` detectors are not run. */
24
+ exports.PII_ACTIONS = ['off', 'redact', 'block'];
25
+ /** Every detector's id, in `piiDetectors.json`'s order (a test holds the two equal). */
26
+ exports.PII_DETECTOR_IDS = ['pii.card', 'pii.iban', 'pii.ssn', 'pii.email', 'pii.phone'];
27
+ /**
28
+ * The workspace setting `piiDetectors`: an action for each detector the
29
+ * workspace governs centrally. Both proxies use it as the baseline for the
30
+ * workspace's traffic, and a machine's own config may only tighten it
31
+ * ({@link effectivePiiActions}). A detector left out keeps each machine's
32
+ * action. Unknown ids and actions are refused.
33
+ */
34
+ exports.PiiDetectorSettingsSchema = zod_1.z.record(zod_1.z.enum(exports.PII_DETECTOR_IDS), zod_1.z.enum(exports.PII_ACTIONS));
35
+ const isPiiAction = (v) => exports.PII_ACTIONS.includes(v);
36
+ const isPiiDetectorId = (v) => exports.PII_DETECTOR_IDS.includes(v);
37
+ /**
38
+ * Reads the field. Absent is a control plane older than the setting, and
39
+ * `{}` a workspace that sets none: both `none`. `null` is the control plane
40
+ * saying it could not read the stored setting. An id this build does not
41
+ * know is left out, since a newer control plane can name a detector an older
42
+ * proxy cannot run; an action that does not exist makes the whole field
43
+ * unreadable. The Rust proxy reads it the same way (`dlp/workspace.rs`), and
44
+ * `fixtures/pii-precedence-vectors.json` holds the two together.
45
+ */
46
+ function parseWorkspacePiiDetectors(field) {
47
+ if (field === undefined)
48
+ return { kind: 'none' };
49
+ if (field === null)
50
+ return { kind: 'unreadable', reason: "the control plane could not read the workspace's PII detector actions" };
51
+ if (typeof field !== 'object' || Array.isArray(field)) {
52
+ return { kind: 'unreadable', reason: `the workspace's PII detector actions are not an object: ${JSON.stringify(field)}` };
53
+ }
54
+ const actions = {};
55
+ for (const [id, action] of Object.entries(field)) {
56
+ if (!isPiiDetectorId(id))
57
+ continue;
58
+ if (!isPiiAction(action)) {
59
+ return {
60
+ kind: 'unreadable',
61
+ reason: `the workspace's piiDetectors setting sets '${id}' to ${JSON.stringify(action)}; only 'off', 'redact' and 'block' exist`,
62
+ };
63
+ }
64
+ actions[id] = action;
65
+ }
66
+ return Object.keys(actions).length > 0 ? { kind: 'set', actions } : { kind: 'none' };
67
+ }
68
+ /**
69
+ * Every detector's action for a workspace's traffic on one machine.
70
+ *
71
+ * The workspace setting is the baseline for each detector it names, and the
72
+ * machine's own config (`local`, only the detectors it names) may tighten it
73
+ * (`off` → `redact` → `block`) but never loosen it, so a developer cannot
74
+ * switch off on their machine what the workspace turned on. A detector the
75
+ * workspace leaves out keeps the machine's action, else its default; with no
76
+ * workspace setting the machine's config applies alone. The Rust proxy's
77
+ * `effective_pii_actions` (`dlp.rs`) is the same rule, and both run
78
+ * `fixtures/pii-precedence-vectors.json`.
79
+ */
80
+ function effectivePiiActions(local, workspace) {
81
+ const rank = (a) => exports.PII_ACTIONS.indexOf(a);
82
+ const table = Object.fromEntries(exports.PII_DEFINITION.detectors.map((d) => [d.id, d.default_action]));
83
+ Object.assign(table, local);
84
+ for (const [id, baseline] of Object.entries(workspace ?? {})) {
85
+ const mine = local[id];
86
+ table[id] = mine !== undefined && rank(mine) > rank(baseline) ? mine : baseline;
87
+ }
88
+ return table;
89
+ }
90
+ /**
91
+ * JSON imports type their strings as `string`, not the unions above, hence
92
+ * the cast through `unknown`. The MCP proxy refuses to load an unknown
93
+ * validator name, and the conformance vectors pin the rest.
94
+ */
95
+ exports.PII_DEFINITION = piiDetectors_json_1.default;
96
+ //# sourceMappingURL=piiDetectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piiDetectors.js","sourceRoot":"","sources":["../src/piiDetectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ {
2
+ "$comment": "PII detectors for both DLP scanners. The Rust proxy embeds this file (packages/proxy/src/dlp/pii_detectors.json); the MCP proxy reads a byte-identical copy (packages/shared-types/src/piiDetectors.json). Edit one, copy it over the other: a test on each side fails while they differ. Regexes are the subset Rust regex and JavaScript RegExp agree on — ASCII classes, no \\b, no \\d, no lookaround — and each match is then checked by the named validator and boundary rule, implemented identically in packages/proxy/src/dlp/pii.rs and packages/mcp-proxy/src/dlpPii.ts. Conformance vectors: packages/shared-types/fixtures/pii-detector-vectors.json.",
3
+ "version": 1,
4
+ "detectors": [
5
+ {
6
+ "id": "pii.card",
7
+ "category": "pii",
8
+ "description": "Payment card number",
9
+ "regex": "[0-9]{4}[ -][0-9]{4}[ -][0-9]{4}[ -][0-9]{4}|[0-9]{4}[ -][0-9]{6}[ -][0-9]{4,5}|[0-9]{13,19}",
10
+ "boundary": "numeric",
11
+ "validator": "card_luhn",
12
+ "default_action": "redact"
13
+ },
14
+ {
15
+ "id": "pii.iban",
16
+ "category": "pii",
17
+ "description": "IBAN",
18
+ "regex": "[A-Z]{2}[0-9]{2}(?: ?[A-Z0-9]){11,30}",
19
+ "boundary": "word",
20
+ "validator": "iban_mod97",
21
+ "default_action": "redact"
22
+ },
23
+ {
24
+ "id": "pii.ssn",
25
+ "category": "pii",
26
+ "description": "US Social Security Number",
27
+ "regex": "[0-9]{3}-[0-9]{2}-[0-9]{4}",
28
+ "boundary": "numeric",
29
+ "validator": "ssn_ranges",
30
+ "default_action": "redact"
31
+ },
32
+ {
33
+ "id": "pii.email",
34
+ "category": "pii",
35
+ "description": "Email address",
36
+ "regex": "[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9-]{1,63}(?:\\.[A-Za-z0-9-]{1,63}){1,8}",
37
+ "boundary": "word",
38
+ "validator": "email_shape",
39
+ "default_action": "off"
40
+ },
41
+ {
42
+ "id": "pii.phone",
43
+ "category": "pii",
44
+ "description": "Phone number",
45
+ "regex": "\\+[1-9][0-9]{0,2}(?:[ .-]?\\([0-9]{1,4}\\)|[ .-]?[0-9]{1,4}){2,7}|(?:1[ .-])?(?:\\([2-9][0-9]{2}\\) ?|[2-9][0-9]{2}[ .-])[2-9][0-9]{2}[ .-][0-9]{4}",
46
+ "boundary": "numeric",
47
+ "validator": "phone_digits",
48
+ "default_action": "off"
49
+ }
50
+ ],
51
+ "card_brands": [
52
+ { "brand": "visa", "prefixes": [["4", "4"]], "lengths": [13, 16, 19] },
53
+ { "brand": "mastercard", "prefixes": [["51", "55"], ["2221", "2720"]], "lengths": [16] },
54
+ { "brand": "amex", "prefixes": [["34", "34"], ["37", "37"]], "lengths": [15] },
55
+ { "brand": "discover", "prefixes": [["6011", "6011"], ["644", "649"], ["65", "65"], ["622126", "622925"]], "lengths": [16, 17, 18, 19] },
56
+ { "brand": "jcb", "prefixes": [["3528", "3589"]], "lengths": [16, 17, 18, 19] },
57
+ { "brand": "diners", "prefixes": [["300", "305"], ["3095", "3095"], ["36", "36"], ["38", "39"]], "lengths": [14, 15, 16, 17, 18, 19] },
58
+ { "brand": "unionpay", "prefixes": [["62", "62"], ["81", "81"]], "lengths": [16, 17, 18, 19] }
59
+ ],
60
+ "iban_lengths": {
61
+ "AD": 24, "AE": 23, "AL": 28, "AT": 20, "AZ": 28, "BA": 20, "BE": 16, "BG": 22, "BH": 22, "BI": 27,
62
+ "BR": 29, "BY": 28, "CH": 21, "CR": 22, "CY": 28, "CZ": 24, "DE": 22, "DJ": 27, "DK": 18, "DO": 28,
63
+ "EE": 20, "EG": 29, "ES": 24, "FI": 18, "FK": 18, "FO": 18, "FR": 27, "GB": 22, "GE": 22, "GI": 23,
64
+ "GL": 18, "GR": 27, "GT": 28, "HN": 28, "HR": 21, "HU": 28, "IE": 22, "IL": 23, "IQ": 23, "IS": 26,
65
+ "IT": 27, "JO": 30, "KW": 30, "KZ": 20, "LB": 28, "LC": 32, "LI": 21, "LT": 20, "LU": 20, "LV": 21,
66
+ "LY": 25, "MC": 27, "MD": 24, "ME": 22, "MK": 19, "MN": 20, "MR": 27, "MT": 31, "MU": 30, "NI": 28,
67
+ "NL": 18, "NO": 15, "OM": 23, "PK": 24, "PL": 28, "PS": 29, "PT": 25, "QA": 29, "RO": 24, "RS": 22,
68
+ "RU": 33, "SA": 24, "SC": 31, "SD": 18, "SE": 24, "SI": 19, "SK": 24, "SM": 27, "SO": 23, "ST": 25,
69
+ "SV": 28, "TL": 23, "TN": 24, "TR": 26, "UA": 29, "VA": 22, "VG": 24, "XK": 20, "YE": 30
70
+ }
71
+ }
package/dist/policy.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * Delegation Capability Token (DCT) structures used by the Circuit
6
6
  * Breaker and PCAS subsystems.
7
7
  *
8
- * HLD §3.3 (PCAS), LLD 01-data-architecture §3.2
8
+ * HLD §3.3 (PCAS)
9
9
  *
10
10
  * @module
11
11
  */
package/dist/policy.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * Delegation Capability Token (DCT) structures used by the Circuit
7
7
  * Breaker and PCAS subsystems.
8
8
  *
9
- * HLD §3.3 (PCAS), LLD 01-data-architecture §3.2
9
+ * HLD §3.3 (PCAS)
10
10
  *
11
11
  * @module
12
12
  */