@nodatachat/mcp 1.6.43 → 1.6.44
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/dist/gate.js +1 -1
- package/dist/index.js +3 -3
- package/dist/scan-worker.js +1 -1
- package/dist/status.js +1 -1
- package/package.json +1 -1
package/dist/gate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @nodatachat/mcp 1.6.
|
|
1
|
+
/*! @nodatachat/mcp 1.6.44 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
|
|
2
2
|
import{appendFileSync as mc,copyFileSync as rh,existsSync as In,mkdirSync as vs,readdirSync as gc,readFileSync as Tn,statSync as xt,writeFileSync as yc}from"node:fs";import{homedir as Y}from"node:os";import{basename as wt,extname as Ss,isAbsolute as ne,join as xe,relative as Es,resolve as D}from"node:path";import{TextDecoder as $r}from"node:util";var H={text:[],header:[],secrets:[],table:null,amounts:null,severity:null};function $t(e){e.table&&(H.table=e.table),e.severity&&(H.severity=e.severity),e.amounts&&(H.amounts=e.amounts);for(let t of e.text??[])H.text.some(r=>r.kind===t.kind)||H.text.push(t);e.header&&!H.header.includes(e.header)&&H.header.push(e.header);for(let t of e.secrets??[])H.secrets.some(r=>r.id===t.id)||H.secrets.push(t)}function Rt(){return H.amounts?.()===!0}function De(){return H.text}function jn(){return H.header}function Se(){return H.table}function Hn(){return H.secrets}var Fe=[{id:"aws-access-key",name:"AWS Access Key",pattern:/(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)/,severity:"critical"},{id:"aws-secret-key",name:"AWS Secret Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key)\s*[=:]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/,severity:"critical"},{id:"gcp-api-key",name:"GCP API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"critical"},{id:"gcp-service-account",name:"GCP Service Account",pattern:/"type"\s*:\s*"service_account"/,severity:"critical"},{id:"github-token",name:"GitHub Token",pattern:/gh[pousr]_[0-9a-zA-Z]{36,}/,severity:"critical"},{id:"github-fine-grained",name:"GitHub Fine-Grained Token",pattern:/github_pat_[0-9a-zA-Z_]{22,}/,severity:"critical"},{id:"gitlab-token",name:"GitLab Token",pattern:/glpat-[0-9a-zA-Z_-]{20,}/,severity:"critical"},{id:"stripe-secret",name:"Stripe Secret Key",pattern:/sk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"stripe-restricted",name:"Stripe Restricted Key",pattern:/rk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"slack-token",name:"Slack Token",pattern:/xox[baprs]-[0-9a-zA-Z-]{10,}/,severity:"high"},{id:"slack-webhook",name:"Slack Webhook",pattern:/hooks\.slack\.com\/services\/T[0-9A-Z]{8,}\/B[0-9A-Z]{8,}\/[0-9a-zA-Z]{24}/,severity:"high"},{id:"twilio-api-key",name:"Twilio API Key",pattern:/SK[0-9a-fA-F]{32}/,severity:"high"},{id:"sendgrid-api-key",name:"SendGrid API Key",pattern:/SG\.[0-9a-zA-Z_-]{22}\.[0-9a-zA-Z_-]{43}/,severity:"critical"},{id:"postgres-uri",name:"PostgreSQL Connection String",pattern:/postgres(?:ql)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"mongodb-uri",name:"MongoDB Connection String",pattern:/mongodb(?:\+srv)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"redis-uri",name:"Redis Connection String",pattern:/redis(?:s)?:\/\/[^\s'"]{10,}/,severity:"high"},{id:"openai-key",name:"OpenAI API Key",pattern:/sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}/,severity:"critical"},{id:"openai-project-key",name:"OpenAI API Key",pattern:/sk-(?:proj|svcacct|admin)-[0-9A-Za-z_-]{40,}/,severity:"critical"},{id:"anthropic-key",name:"Anthropic API Key",pattern:/sk-ant-[0-9a-zA-Z_-]{40,}/,severity:"critical"},{id:"firebase-key",name:"Firebase API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"high"},{id:"supabase-key",name:"Supabase Service Key",pattern:/eyJ[0-9a-zA-Z_-]{100,}/,severity:"critical"},{id:"supabase-access-token",name:"Supabase Access Token",pattern:/\bsbp_[0-9a-f]{40}\b/,severity:"critical"},{id:"supabase-secret-key",name:"Supabase Secret Key",pattern:/\bsb_secret_[0-9A-Za-z_-]{20,}/,severity:"critical"},{id:"private-key",name:"Private Key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,severity:"critical"},{id:"jwt-secret",name:"JWT/Generic Secret",pattern:/(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"password-in-code",name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"bearer-token",name:"Bearer Token in Code",pattern:/['"]Bearer\s+[0-9a-zA-Z._-]{20,}['"]/,severity:"high"}];function Ee(){let e=Hn().filter(t=>!Fe.some(r=>r.id===t.id));return[...Fe,...e]}var to=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Salary / income"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication|prescription)$/i,type:"medical",label:"Medical"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Policy"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation"}],no=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם הלקוח|שם בן זוג|שם המבוטח|שם המוטב|שם הילד|שם הקטין)$/i,type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מס' זהות|teudat_zehut|tz|israeli_id|il_id)$/i,type:"id",label:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה)$/i,type:"id",label:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|אימייל|כתובת מייל)$/i,type:"email",label:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|טלפון נייד)$/i,type:"phone",label:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|רחוב|מס בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|מען)$/i,type:"address",label:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|ת לידה|תאריך הולדת|יום הולדת|גיל)$/i,type:"dob",label:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|מספר חשבון|מס חשבון|סניף|iban|iban_il)$/i,type:"financial",label:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|מספר אשראי|cvv|אשראי)$/i,type:"financial",label:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|מצב רפואי|חיסון|רגישות|אלרגיה|סוג דם)$/i,type:"medical",label:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מס פוליסה|פוליסה|מספר חבר|מספר ביטוח)$/i,type:"id",label:"\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4/\u05D7\u05D1\u05E8\u05D5\u05EA"},{pattern:/^(?:שם הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|תעודת לידה)$/i,type:"minor_data",label:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|השקפה פוליטית|מצב משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מס רכב|לוחית רישוי|מספר רישוי)$/i,type:"tracking",label:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}],ro=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|enabled|active|public|version|metadata|config|settings|data|content|note|comment|label|color|icon)$/i,so=/^שם[ _](?:ה)?(?:קובץ|מוצר|פריט|חברה|ארגון|עסק|פרויקט|גיליון|טבלה|שדה|קטגוריה|סניף|בנק|עיר|רחוב|ישוב|יישוב|מסמך|תוכנית|חבילה|קורס|מחלקה|אתר|דומיין|מותג|ספק|שירות|תפקיד)$|^(file|product|item|company|org|organization|project|sheet|table|field|category|branch|bank|city|street|document|plan|course|department|site|domain|brand|vendor|service|role)[ _-]?name$/i;function Ae(e){if(!e)return null;let t=e.trim();if(ro.test(t)||/^name$/i.test(t)||/^\[[A-Z_]+(?:-\d+)?\]$/.test(t))return null;let r=t.replace(/[\s-]+/g,"_");for(let n of[...no,...to])if(n.pattern.test(t)||n.pattern.test(r))return{type:n.type,label:n.label};if(so.test(t))return null;if(/^שם[ _][\u0590-\u05FF"'׳ ]{2,20}$/.test(t))return{type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"};if(/^(customer|client|employee|inspector|supervisor|contact|person|patient|user|owner|manager|agent|member|driver|tenant|student|parent|beneficiary|insured)_?(full_?)?name$/i.test(r))return{type:"name",label:"Person name"};for(let n of jn()){let s=n(t);if(s)return{type:s.type,label:s.label}}return null}function Un(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let r=t.padStart(9,"0"),n=0;for(let s=0;s<9;s++){let o=parseInt(r[s]??"0",10)*(s%2+1);o>9&&(o-=9),n+=o}return n%10===0&&parseInt(r,10)>0}function oo(e){let t=String(e??"").replace(/\D/g,"");if(t.length<12||t.length>19)return!1;let r=0,n=!1;for(let s=t.length-1;s>=0;s-=1){let o=parseInt(t[s]??"0",10);n&&(o*=2,o>9&&(o-=9)),r+=o,n=!n}return r%10===0}function Bn(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let r=t.slice(4)+t.slice(0,4),n=0;for(let s of r){let o=s>="A"&&s<="Z"?String(s.charCodeAt(0)-55):s;for(let i of o)n=(n*10+Number(i))%97}return n===1}var It="(?<!\\d)(?<!\\d[.,])",Tt="(?!\\d)(?![.,]\\d)",Ct=[{subkind:"israeli_id",severity:"high",pattern:new RegExp(`${It}(?:\\d{8}-\\d|\\d{9})${Tt}`,"g"),validate:Un,hint:"Israeli national ID (check digit verified) in plaintext. Encrypt the column or mask it at rest."},{subkind:"credit_card",severity:"critical",pattern:new RegExp(`${It}[2-6][ -]?(?:\\d[ -]?){11,17}\\d${Tt}`,"g"),validate:oo,hint:"Payment card number (Luhn verified) in plaintext. This is PCI scope."},{subkind:"iban",severity:"high",pattern:/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g,validate:Bn,hint:"Bank account in IBAN form (mod-97 verified) in plaintext."},{subkind:"israeli_phone",severity:"medium",pattern:new RegExp(`${It}(?:\\+972[- ]?|0)(?:[57]\\d|[2-489])[- ]?\\d{3}[- ]?\\d{4}${Tt}`,"g"),validate:e=>{let t=e.replace(/\D/g,"").replace(/^972/,"0");return/^0[57]\d{8}$/.test(t)?!0:/^0[2-489]\d{7}$/.test(t)&&(/[- ]/.test(e)||e.startsWith("+972"))},hint:"Israeli phone number in plaintext."}];function Me(e,t){let r=[],n="",s=!1;for(let o=0;o<e.length;o++){let i=e[o];s?i==='"'&&e[o+1]==='"'?(n+='"',o++):i==='"'?s=!1:n+=i:i==='"'?s=!0:i===t?(r.push(n),n=""):n+=i}return r.push(n),r}import{inflateRawSync as ti}from"node:zlib";import{inflateSync as zn}from"node:zlib";var je=new Set([".pdf"]),Wn=8*1024*1024;function Kn(e){let t=e.toString("latin1"),r=new Map,n=/(\d+)\s+(\d+)\s+obj\b/g,s;for(;(s=n.exec(t))!==null;){let o=Number(s[1]),i=n.lastIndex,a=t.indexOf("endobj",i);if(a<0)continue;let c=t.indexOf("stream",i),l,f=null;if(c>=0&&c<a){l=t.slice(i,c);let d=c+6;t[d]==="\r"&&(d+=1),t[d]===`
|
|
3
3
|
`&&(d+=1);let h=t.indexOf("endstream",d);h>d&&(f=e.subarray(d,h))}else l=t.slice(i,a);r.set(o,{num:o,dict:l,stream:f})}for(let o of[...r.values()]){if(!o.stream||!/\/Type\s*\/ObjStm\b/.test(o.dict))continue;let i=He(o),a=Number(/\/N\s+(\d+)/.exec(o.dict)?.[1]??0),c=Number(/\/First\s+(\d+)/.exec(o.dict)?.[1]??-1);if(i===null||!a||c<0)continue;let l=i.slice(0,c).trim().split(/\s+/).map(Number);for(let f=0;f<a;f+=1){let d=l[2*f],h=l[2*f+1];if(d===void 0||h===void 0||Number.isNaN(d)||Number.isNaN(h))break;let p=f+1<a?l[2*(f+1)+1]:void 0,g=i.slice(c+h,p!==void 0?c+p:void 0);r.has(d)||r.set(d,{num:d,dict:g,stream:null})}}return r}function Pt(e){let t=[...e.replace(/\s+/g,"")];if(t.length<40)return!1;let r=0,n=0;for(let s of t){let o=s.codePointAt(0)??0;o<32||o>=127&&o<=191||o===65533||o>=57344&&o<=63743?r+=1:/[\p{L}\p{N}]/u.test(s)&&(n+=1)}return r/t.length>.2||n/t.length<.25}function io(e){let t=e.toString("latin1").replace(/\s/g,"");t.startsWith("<~")&&(t=t.slice(2));let r=t.indexOf("~>");r>=0&&(t=t.slice(0,r));let n=[],s=0,o=0;for(let i of t){if(i==="z"&&o===0){n.push(0,0,0,0);continue}let a=i.charCodeAt(0)-33;if(a<0||a>84)return null;s=s*85+a,o+=1,o===5&&(n.push(s>>>24&255,s>>>16&255,s>>>8&255,s&255),s=0,o=0)}if(o>0){for(let a=o;a<5;a+=1)s=s*85+84;let i=[s>>>24&255,s>>>16&255,s>>>8&255,s&255];for(let a=0;a<o-1;a+=1)n.push(i[a]??0)}return Buffer.from(n)}function ao(e){let t=e.toString("latin1").replace(/\s/g,"").split(">")[0]??"",r=t.length%2?t+"0":t;return/^[0-9A-Fa-f]*$/.test(r)?Buffer.from(r,"hex"):null}function co(e){let t=/\/Filter\s*(\[[^\]]*\]|\/\w+)/.exec(e);return!t||!t[1]?[]:[...t[1].matchAll(/\/(\w+)/g)].map(r=>r[1]??"")}function He(e,t){if(!e.stream)return null;let r=e.stream;for(let n of co(e.dict)){let s=null;if(n==="FlateDecode")try{s=t!==void 0?zn(r,{maxOutputLength:Math.max(1,t)}):zn(r)}catch{return null}else if(n==="ASCII85Decode")s=io(r);else if(n==="ASCIIHexDecode")s=ao(r);else return null;if(s===null)return null;r=s}return r.toString("latin1")}function lo(e){let t=new Map,r=1,n=/begincodespacerange([\s\S]*?)endcodespacerange/.exec(e);if(n&&n[1]){let c=/<([0-9A-Fa-f]+)>/.exec(n[1]);c&&c[1]&&c[1].length>=4&&(r=2)}let s=c=>{let l="";for(let f=0;f+3<c.length+1;f+=4){let d=parseInt(c.slice(f,f+4),16);Number.isFinite(d)&&d>0&&(l+=String.fromCharCode(d))}return l},o=/beginbfchar([\s\S]*?)endbfchar/g,i;for(;(i=o.exec(e))!==null;){let c=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,l;for(;(l=c.exec(i[1]??""))!==null;)t.set(parseInt(l[1]??"0",16),s(l[2]??""))}let a=/beginbfrange([\s\S]*?)endbfrange/g;for(;(i=a.exec(e))!==null;){let c=i[1]??"",l=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,f;for(;(f=l.exec(c))!==null;){let d=parseInt(f[1]??"0",16),h=parseInt(f[2]??"0",16),p=parseInt((f[3]??"0").slice(0,4)||"0",16);if(!(h-d>65535))for(let g=d;g<=h;g+=1)t.set(g,String.fromCharCode(p+(g-d)))}}return{map:t,bytes:r}}function uo(e){let t=new Map,r=[],n=[];for(let o of e.values()){for(let i of o.dict.matchAll(/\/Font\s*<<([\s\S]*?)>>/g))i[1]&&n.push(i[1]);for(let i of o.dict.matchAll(/\/Font\s+(\d+)\s+\d+\s+R/g)){let a=e.get(Number(i[1]));a&&n.push(a.dict)}}let s=new Set;for(let o of n){let i=/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g,a;for(;(a=i.exec(o))!==null;){let c=`${a[1]}#${a[2]}`;s.has(c)||(s.add(c),r.push([a[1]??"",Number(a[2])]))}}for(let[o,i]of r){let a=e.get(i);if(!a)continue;let c=null,l=/\/ToUnicode\s+(\d+)\s+\d+\s+R/.exec(a.dict);if(l){let d=e.get(Number(l[1])),h=d?He(d):null;h&&(c=lo(h))}if(c||(c=ho(a.dict,e)),!c)continue;let f=t.get(o)??[];f.push(c),t.set(o,f)}return t}var fo=["alef","bet","gimel","dalet","he","vav","zayin","het","tet","yod","finalkaf","kaf","lamed","finalmem","mem","finalnun","nun","samekh","ayin","finalpe","pe","finaltsadi","tsadi","qof","resh","shin","tav"];function po(e){let t=/^uni([0-9A-Fa-f]{4})$/.exec(e)??/^u([0-9A-Fa-f]{4,6})$/.exec(e);if(t)return String.fromCodePoint(parseInt(t[1],16));let r=/^afii(\d{5})$/.exec(e);if(r){let o=Number(r[1]);if(o>=57664&&o<=57690)return String.fromCharCode(1488+(o-57664))}let n=fo.indexOf(e.replace(/hebrew$/,""));return n>=0?String.fromCharCode(1488+n):e==="space"?" ":/^[A-Za-z]$/.test(e)?e:{zero:"0",one:"1",two:"2",three:"3",four:"4",five:"5",six:"6",seven:"7",eight:"8",nine:"9",period:".",comma:",",hyphen:"-",colon:":",slash:"/",at:"@"}[e]??null}function ho(e,t){let r=e,n=/\/Encoding\s+(\d+)\s+\d+\s+R/.exec(e);n&&(r=t.get(Number(n[1]))?.dict??"");let s=/\/Differences\s*\[([^\]]*)\]/.exec(r);if(!s?.[1])return null;let o=new Map,i=0;for(let a of s[1].match(/\d+|\/[^\s/[\]]+/g)??[]){if(/^\d+$/.test(a)){i=Number(a);continue}let c=po(a.slice(1));c!==null&&o.set(i,c),i+=1}return o.size?{map:o,bytes:1}:null}function Zn(e){let t=[];for(let r=0;r<e.length;r+=1){let n=e[r];if(n!=="\\"){t.push(n.charCodeAt(0)&255);continue}let s=e[r+1];if(s===void 0)break;if(s>="0"&&s<="7"){let i="",a=r+1;for(;a<e.length&&i.length<3&&e[a]>="0"&&e[a]<="7";)i+=e[a],a+=1;t.push(parseInt(i,8)&255),r=a-1;continue}let o={n:10,r:13,t:9,b:8,f:12};t.push(o[s]??s.charCodeAt(0)&255),r+=1}return t}function Yn(e){if(e.length<2||e[0]!==254||e[1]!==255)return null;let t="";for(let r=2;r+1<e.length;r+=2)t+=String.fromCharCode((e[r]??0)<<8|(e[r+1]??0));return t}function Vn(e,t){let r=Yn(e);if(r!==null)return r;if(!t)return e.map(s=>String.fromCharCode(s)).join("");let n="";if(t.bytes===2)for(let s=0;s+1<e.length;s+=2){let o=(e[s]??0)<<8|(e[s+1]??0);n+=t.map.get(o)??""}else for(let s of e)n+=t.map.get(s)??String.fromCharCode(s);return n}function mo(e){let t=0;for(let r of e){let n=r.codePointAt(0)??0;/[\p{L}\p{N}]/u.test(r)?t+=1:(n<32||n>=127&&n<=191||n===65533)&&(t-=2)}return t}function Gn(e,t){if(!t||t.length<=1)return Vn(e,t?.[0]);let r="",n=-1/0;for(let s of t){let o=Vn(e,s),i=mo(o);i>n&&(r=o,n=i)}return r}function go(e,t){let r="",n="",s,o=!1,i="",a=0,c=null,l=()=>{n.trim()&&(r+=n+`
|
|
4
4
|
`),n="",a=0},f=()=>{n&&!n.endsWith(" ")&&a>1&&(n+=" ")},d=/\/([^\s/<>[\]()]+)\s+-?[\d.]+\s+Tf|(-?[\d.]+)\s+(-?[\d.]+)\s+T[dD]\b|(?:-?[\d.]+\s+){5}(-?[\d.]+)\s+Tm\b|T\*|\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>|\[|\]|-?\d+(?:\.\d+)?|TJ|Tj|'|"/g,h;for(;(h=d.exec(e))!==null;){let p=h[0];if(h[1]!==void 0&&p.endsWith("Tf")){s=t.get(h[1]);continue}if(h[2]!==void 0){Math.abs(Number(h[3]))>.01?l():Number(h[2])!==0&&f();continue}if(h[4]!==void 0){let g=Number(h[4]);c!==null&&Math.abs(g-c)>.01?l():c!==null&&f(),c=g;continue}if(p==="T*"){l();continue}if(p==="["){o=!0;continue}if(p==="]"){o=!1;continue}if(p==="TJ"||p==="Tj"||p==="'"||p==='"'){(p==="'"||p==='"')&&l(),i&&(n+=i,a=i.trim().length,i="");continue}if(p.startsWith("("))i+=Gn(Zn(p.slice(1,-1)),s);else if(p.startsWith("<")){let g=p.slice(1,-1).replace(/\s+/g,""),u=[];for(let y=0;y+1<g.length;y+=2)u.push(parseInt(g.slice(y,y+2),16));i+=Gn(u,s)}else o&&Number(p)<-200&&i&&!i.endsWith(" ")&&(i+=" ")}return i&&(n+=i),l(),r}function yo(e,t){let r=e.toString("latin1"),n=/\/Info\s+(\d+)\s+\d+\s+R/.exec(r),s=n?t.get(Number(n[1]))?.dict:void 0;if(!s)return"";let o=[],i=/\/(Author|Title|Subject|Keywords|Creator|Producer)\s*(\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>)/g,a;for(;(a=i.exec(s))!==null;){let c=a[2]??"";if(c.startsWith("(")){let l=Zn(c.slice(1,-1));o.push(Yn(l)??l.map(f=>String.fromCharCode(f)).join(""))}else{let l=c.slice(1,-1).replace(/\s+/g,""),f="";if(l.toUpperCase().startsWith("FEFF"))for(let d=4;d+3<l.length+1;d+=4)f+=String.fromCharCode(parseInt(l.slice(d,d+4),16));else for(let d=0;d+1<l.length;d+=2)f+=String.fromCharCode(parseInt(l.slice(d,d+2),16));o.push(f)}}return o.join(`
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/*! @nodatachat/mcp 1.6.
|
|
2
|
+
/*! @nodatachat/mcp 1.6.44 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
|
|
3
3
|
import{createRequire as __ndReq}from"node:module";const[__ndMaj,__ndMin]=process.versions.node.split(".").map(Number);if(!((__ndMaj===20&&__ndMin>=19)||(__ndMaj===22&&__ndMin>=12)||__ndMaj>=23)){process.stderr.write("NoData needs Node.js 20.19+, 22.12+ or 23+; this computer has "+process.version+".\nInstall the current LTS from https://nodejs.org (or: nvm install --lts), then run the same command again.\n");process.exit(1)}const require=__ndReq(import.meta.url);
|
|
4
4
|
var uP=Object.create;var lp=Object.defineProperty;var pP=Object.getOwnPropertyDescriptor;var fP=Object.getOwnPropertyNames;var hP=Object.getPrototypeOf,gP=Object.prototype.hasOwnProperty;var oe=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var H=(e,t)=>()=>(e&&(t=e(e=0)),t);var ge=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),$c=(e,t)=>{for(var n in t)lp(e,n,{get:t[n],enumerable:!0})},mP=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of fP(t))!gP.call(e,o)&&o!==n&&lp(e,o,{get:()=>t[o],enumerable:!(r=pP(t,o))||r.enumerable});return e};var Ce=(e,t,n)=>(n=e!=null?uP(hP(e)):{},mP(t||!e||!e.__esModule?lp(n,"default",{value:e,enumerable:!0}):n,e));function dp(e){e.table&&(ct.table=e.table),e.severity&&(ct.severity=e.severity),e.amounts&&(ct.amounts=e.amounts);for(let t of e.text??[])ct.text.some(n=>n.kind===t.kind)||ct.text.push(t);e.header&&!ct.header.includes(e.header)&&ct.header.push(e.header);for(let t of e.secrets??[])ct.secrets.some(n=>n.id===t.id)||ct.secrets.push(t)}function Ec(e){return ct.severity?.(e)}function up(){return ct.amounts?.()===!0}function Vo(){return ct.text}function S_(){return ct.header}function qo(){return ct.table}function x_(){return ct.secrets}var ct,cr=H(()=>{"use strict";ct={text:[],header:[],secrets:[],table:null,amounts:null,severity:null}});function Tt(){let e=x_().filter(t=>!Ac.some(n=>n.id===t.id));return[...Ac,...e]}function _P(e,t){let n=i=>i.replace(/^[^0-9]*/,"").split(".").map(s=>parseInt(s,10)||0),r=n(e),o=n(t);for(let i=0;i<3;i++){if((r[i]||0)<(o[i]||0))return!0;if((r[i]||0)>(o[i]||0))return!1}return!1}function A_(e){let t=[],n;try{n=JSON.parse(e)}catch{return t}let r={...n.dependencies??{},...n.devDependencies??{}};for(let[o,i]of Object.entries(r)){let s=(i||"").replace(/^[\^~>=<\s]+/,""),a=yP.find(c=>c.name===o&&_P(s,c.below));a&&t.push({name:o,version:s,vuln:a})}return t}function Hn(e){if(!e)return null;let t=e.trim();if(vP.test(t)||/^name$/i.test(t)||/^\[[A-Z_]+(?:-\d+)?\]$/.test(t))return null;let n=t.replace(/[\s-]+/g,"_");for(let r of[...wP,...bP])if(r.pattern.test(t)||r.pattern.test(n))return{type:r.type,label:r.label};if(kP.test(t))return null;if(/^שם[ _][\u0590-\u05FF"'׳ ]{2,20}$/.test(t))return{type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"};if(/^(customer|client|employee|inspector|supervisor|contact|person|patient|user|owner|manager|agent|member|driver|tenant|student|parent|beneficiary|insured)_?(full_?)?name$/i.test(n))return{type:"name",label:"Person name"};for(let r of S_()){let o=r(t);if(o)return{type:o.type,label:o.label}}return null}function Pc(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let o=0;o<9;o++){let i=parseInt(n[o]??"0",10)*(o%2+1);i>9&&(i-=9),r+=i}return r%10===0&&parseInt(n,10)>0}function SP(e){let t=String(e??"").replace(/\D/g,"");if(t.length<12||t.length>19)return!1;let n=0,r=!1;for(let o=t.length-1;o>=0;o-=1){let i=parseInt(t[o]??"0",10);r&&(i*=2,i>9&&(i-=9)),n+=i,r=!r}return n%10===0}function Rc(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let o of n){let i=o>="A"&&o<="Z"?String(o.charCodeAt(0)-55):o;for(let s of i)r=(r*10+Number(s))%97}return r===1}function T_(e){if(e.length!==14&&e.length!==17)return!1;let t=+e.slice(0,4),n=+e.slice(4,6),r=+e.slice(6,8),o=+e.slice(8,10),i=+e.slice(10,12),s=+e.slice(12,14);return t>=1970&&t<=2099&&n>=1&&n<=12&&r>=1&&r<=31&&o<24&&i<60&&s<60}function P_(e){let t=Number(e);return!Number.isSafeInteger(t)||t<1024?!1:Number.isInteger(Math.log2(t))||t%1048576===0}function As(e){return xP.has(e.replace(/\D/g,""))}function Nc(e){let t=e.replace(/\D/g,"");return T_(t)||P_(t)}function Yr(e,t){let n=[];for(let r of Ps){r.pattern.lastIndex=0;let o=new Set,i,s=0;for(;(i=r.pattern.exec(e))!==null&&(s+=1,!(s>2e5));){let a=i[0];if(!(r.subkind!=="iban"&&r.subkind!=="israeli_phone"&&Nc(a))&&(r.validate(a)&&o.add(a.replace(/[\s-]/g,"")),o.size>=1e5))break}if(o.size>0){if(t)for(let c of o)As(c)||t(r.subkind,c);let a=[...o].filter(c=>!As(c)).length;n.push({subkind:r.subkind,severity:a===0?"low":r.severity,hint:a===0?`${r.hint} All ${o.size} are published test numbers.`:r.hint,count:o.size,real:a})}}for(let r of Vo()){let o=new Set;for(let i of r.find(e))o.add(e.slice(i.start,i.end).trim());o.size>0&&n.push({subkind:r.kind,severity:r.severity,hint:r.hint,count:o.size})}return n}function Jr(e,t){let n=[],r="",o=!1;for(let i=0;i<e.length;i++){let s=e[i];o?s==='"'&&e[i+1]==='"'?(r+='"',i++):s==='"'?o=!1:r+=s:s==='"'?o=!0:s===t?(n.push(r),r=""):r+=s}return n.push(r),n}var Ac,$_,E_,hp,yP,bP,wP,vP,kP,Tc,gp,Ts,pp,fp,Ps,xP,lr=H(()=>{"use strict";cr();Ac=[{id:"aws-access-key",name:"AWS Access Key",pattern:/(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)/,severity:"critical"},{id:"aws-secret-key",name:"AWS Secret Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key)\s*[=:]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/,severity:"critical"},{id:"gcp-api-key",name:"GCP API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"critical"},{id:"gcp-service-account",name:"GCP Service Account",pattern:/"type"\s*:\s*"service_account"/,severity:"critical"},{id:"github-token",name:"GitHub Token",pattern:/gh[pousr]_[0-9a-zA-Z]{36,}/,severity:"critical"},{id:"github-fine-grained",name:"GitHub Fine-Grained Token",pattern:/github_pat_[0-9a-zA-Z_]{22,}/,severity:"critical"},{id:"gitlab-token",name:"GitLab Token",pattern:/glpat-[0-9a-zA-Z_-]{20,}/,severity:"critical"},{id:"stripe-secret",name:"Stripe Secret Key",pattern:/sk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"stripe-restricted",name:"Stripe Restricted Key",pattern:/rk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"slack-token",name:"Slack Token",pattern:/xox[baprs]-[0-9a-zA-Z-]{10,}/,severity:"high"},{id:"slack-webhook",name:"Slack Webhook",pattern:/hooks\.slack\.com\/services\/T[0-9A-Z]{8,}\/B[0-9A-Z]{8,}\/[0-9a-zA-Z]{24}/,severity:"high"},{id:"twilio-api-key",name:"Twilio API Key",pattern:/SK[0-9a-fA-F]{32}/,severity:"high"},{id:"sendgrid-api-key",name:"SendGrid API Key",pattern:/SG\.[0-9a-zA-Z_-]{22}\.[0-9a-zA-Z_-]{43}/,severity:"critical"},{id:"postgres-uri",name:"PostgreSQL Connection String",pattern:/postgres(?:ql)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"mongodb-uri",name:"MongoDB Connection String",pattern:/mongodb(?:\+srv)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"redis-uri",name:"Redis Connection String",pattern:/redis(?:s)?:\/\/[^\s'"]{10,}/,severity:"high"},{id:"openai-key",name:"OpenAI API Key",pattern:/sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}/,severity:"critical"},{id:"openai-project-key",name:"OpenAI API Key",pattern:/sk-(?:proj|svcacct|admin)-[0-9A-Za-z_-]{40,}/,severity:"critical"},{id:"anthropic-key",name:"Anthropic API Key",pattern:/sk-ant-[0-9a-zA-Z_-]{40,}/,severity:"critical"},{id:"firebase-key",name:"Firebase API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"high"},{id:"supabase-key",name:"Supabase Service Key",pattern:/eyJ[0-9a-zA-Z_-]{100,}/,severity:"critical"},{id:"supabase-access-token",name:"Supabase Access Token",pattern:/\bsbp_[0-9a-f]{40}\b/,severity:"critical"},{id:"supabase-secret-key",name:"Supabase Secret Key",pattern:/\bsb_secret_[0-9A-Za-z_-]{20,}/,severity:"critical"},{id:"private-key",name:"Private Key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,severity:"critical"},{id:"jwt-secret",name:"JWT/Generic Secret",pattern:/(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"password-in-code",name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"bearer-token",name:"Bearer Token in Code",pattern:/['"]Bearer\s+[0-9a-zA-Z._-]{20,}['"]/,severity:"high"}];$_=/node_modules\/|\.next\/|\.test\.|\.spec\.|__tests__\/|\.nodata-proof\.json$|\.git\//,E_=/(^|\/)\.env(\.[\w-]+)*\.(example|sample|template|dist)$|\.(example|sample|template)$|(^|\/)[^/]*\.(example|sample)\.[a-z0-9]+$/i,hp=/(^|\/)(__tests__|__mocks__|tests?|spec|fixtures?|mocks?|samples?|examples?|demo|testdata)(\/|$)|\.(test|spec)\.[a-z0-9]+$|\.min\.(m?js|css)$|(^|\/)[^/]*\.worker\.min\.m?js$/i,yP=[{name:"lodash",below:"4.17.21",severity:"critical",cve:"CVE-2021-23337",desc:"Command injection via template"},{name:"minimist",below:"1.2.6",severity:"critical",cve:"CVE-2021-44906",desc:"Prototype pollution"},{name:"json5",below:"2.2.2",severity:"high",cve:"CVE-2022-46175",desc:"Prototype pollution"},{name:"express",below:"4.19.2",severity:"high",cve:"CVE-2024-29041",desc:"Open redirect"},{name:"path-to-regexp",below:"6.3.0",severity:"high",cve:"CVE-2024-45296",desc:"ReDoS"},{name:"sanitize-html",below:"2.12.1",severity:"high",cve:"CVE-2024-21501",desc:"XSS bypass"},{name:"dompurify",below:"3.0.9",severity:"high",cve:"CVE-2024-45801",desc:"mXSS"},{name:"jsonwebtoken",below:"9.0.0",severity:"critical",cve:"CVE-2022-23529",desc:"Key confusion attack"},{name:"jose",below:"4.15.5",severity:"high",cve:"CVE-2024-28176",desc:"DoS via JWE"},{name:"axios",below:"1.6.0",severity:"high",cve:"CVE-2023-45857",desc:"CSRF cookie leak"},{name:"node-fetch",below:"2.6.7",severity:"high",cve:"CVE-2022-0235",desc:"Header leak on redirect"},{name:"serialize-javascript",below:"6.0.2",severity:"critical",cve:"CVE-2024-11831",desc:"XSS via serialization"},{name:"xml2js",below:"0.6.0",severity:"high",cve:"CVE-2023-0842",desc:"Prototype pollution"},{name:"next",below:"14.1.1",severity:"high",cve:"CVE-2024-34350",desc:"SSRF via headers"},{name:"sharp",below:"0.32.6",severity:"high",cve:"CVE-2023-4863",desc:"libwebp heap overflow"},{name:"multer",below:"1.4.5",severity:"high",cve:"CVE-2022-24434",desc:"Prototype pollution"},{name:"tough-cookie",below:"4.1.3",severity:"medium",cve:"CVE-2023-26136",desc:"Prototype pollution"},{name:"semver",below:"7.5.4",severity:"medium",cve:"CVE-2022-25883",desc:"ReDoS"},{name:"ip",below:"2.0.1",severity:"critical",cve:"CVE-2024-29415",desc:"SSRF bypass via octal IP"},{name:"tar",below:"6.2.1",severity:"high",cve:"CVE-2024-28863",desc:"DoS via path traversal"}];bP=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Salary / income"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication|prescription)$/i,type:"medical",label:"Medical"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Policy"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation"}],wP=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם הלקוח|שם בן זוג|שם המבוטח|שם המוטב|שם הילד|שם הקטין)$/i,type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מס' זהות|teudat_zehut|tz|israeli_id|il_id)$/i,type:"id",label:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה)$/i,type:"id",label:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|אימייל|כתובת מייל)$/i,type:"email",label:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|טלפון נייד)$/i,type:"phone",label:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|רחוב|מס בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|מען)$/i,type:"address",label:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|ת לידה|תאריך הולדת|יום הולדת|גיל)$/i,type:"dob",label:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|מספר חשבון|מס חשבון|סניף|iban|iban_il)$/i,type:"financial",label:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|מספר אשראי|cvv|אשראי)$/i,type:"financial",label:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|מצב רפואי|חיסון|רגישות|אלרגיה|סוג דם)$/i,type:"medical",label:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מס פוליסה|פוליסה|מספר חבר|מספר ביטוח)$/i,type:"id",label:"\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4/\u05D7\u05D1\u05E8\u05D5\u05EA"},{pattern:/^(?:שם הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|תעודת לידה)$/i,type:"minor_data",label:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|השקפה פוליטית|מצב משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מס רכב|לוחית רישוי|מספר רישוי)$/i,type:"tracking",label:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}],vP=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|enabled|active|public|version|metadata|config|settings|data|content|note|comment|label|color|icon)$/i,kP=/^שם[ _](?:ה)?(?:קובץ|מוצר|פריט|חברה|ארגון|עסק|פרויקט|גיליון|טבלה|שדה|קטגוריה|סניף|בנק|עיר|רחוב|ישוב|יישוב|מסמך|תוכנית|חבילה|קורס|מחלקה|אתר|דומיין|מותג|ספק|שירות|תפקיד)$|^(file|product|item|company|org|organization|project|sheet|table|field|category|branch|bank|city|street|document|plan|course|department|site|domain|brand|vendor|service|role)[ _-]?name$/i;Tc={id:"critical",financial:"critical",medical:"critical",biometric:"critical",minor_data:"critical",sensitive_personal:"critical",email:"high",phone:"high",name:"high",address:"high",dob:"high",tracking:"medium",location:"high",auth:"critical",employment:"medium",education:"medium",behavior:"high"};gp=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g,Ts=/\bIL\d{2}\s?(?:\d{4}\s?){4}\d{3}\b/g;pp="(?<!\\d)(?<!\\d[.,])",fp="(?!\\d)(?![.,]\\d)",Ps=[{subkind:"israeli_id",severity:"high",pattern:new RegExp(`${pp}(?:\\d{8}-\\d|\\d{9})${fp}`,"g"),validate:Pc,hint:"Israeli national ID (check digit verified) in plaintext. Encrypt the column or mask it at rest."},{subkind:"credit_card",severity:"critical",pattern:new RegExp(`${pp}[2-6][ -]?(?:\\d[ -]?){11,17}\\d${fp}`,"g"),validate:SP,hint:"Payment card number (Luhn verified) in plaintext. This is PCI scope."},{subkind:"iban",severity:"high",pattern:/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g,validate:Rc,hint:"Bank account in IBAN form (mod-97 verified) in plaintext."},{subkind:"israeli_phone",severity:"medium",pattern:new RegExp(`${pp}(?:\\+972[- ]?|0)(?:[57]\\d|[2-489])[- ]?\\d{3}[- ]?\\d{4}${fp}`,"g"),validate:e=>{let t=e.replace(/\D/g,"").replace(/^972/,"0");return/^0[57]\d{8}$/.test(t)?!0:/^0[2-489]\d{7}$/.test(t)&&(/[- ]/.test(e)||e.startsWith("+972"))},hint:"Israeli phone number in plaintext."}];xP=new Set(["000000018","123456782","111111118","222222226","333333334","999999998","4111111111111111","4242424242424242","4000056655665556","5555555555554444","5105105105105100","2223003122003222","378282246310005","371449635398431","6011111111111117","3056930009020004","4012888888881881","4000000000000002"])});import{inflateSync as R_}from"node:zlib";function Oc(e){let t=e.toString("latin1"),n=new Map,r=/(\d+)\s+(\d+)\s+obj\b/g,o;for(;(o=r.exec(t))!==null;){let i=Number(o[1]),s=r.lastIndex,a=t.indexOf("endobj",s);if(a<0)continue;let c=t.indexOf("stream",s),l,d=null;if(c>=0&&c<a){l=t.slice(s,c);let u=c+6;t[u]==="\r"&&(u+=1),t[u]===`
|
|
5
5
|
`&&(u+=1);let p=t.indexOf("endstream",u);p>u&&(d=e.subarray(u,p))}else l=t.slice(s,a);n.set(i,{num:i,dict:l,stream:d})}for(let i of[...n.values()]){if(!i.stream||!/\/Type\s*\/ObjStm\b/.test(i.dict))continue;let s=Ns(i),a=Number(/\/N\s+(\d+)/.exec(i.dict)?.[1]??0),c=Number(/\/First\s+(\d+)/.exec(i.dict)?.[1]??-1);if(s===null||!a||c<0)continue;let l=s.slice(0,c).trim().split(/\s+/).map(Number);for(let d=0;d<a;d+=1){let u=l[2*d],p=l[2*d+1];if(u===void 0||p===void 0||Number.isNaN(u)||Number.isNaN(p))break;let f=d+1<a?l[2*(d+1)+1]:void 0,h=s.slice(c+p,f!==void 0?c+f:void 0);n.has(u)||n.set(u,{num:u,dict:h,stream:null})}}return n}function mp(e){let t=[...e.replace(/\s+/g,"")];if(t.length<40)return!1;let n=0,r=0;for(let o of t){let i=o.codePointAt(0)??0;i<32||i>=127&&i<=191||i===65533||i>=57344&&i<=63743?n+=1:/[\p{L}\p{N}]/u.test(o)&&(r+=1)}return n/t.length>.2||r/t.length<.25}function $P(e){let t=e.toString("latin1").replace(/\s/g,"");t.startsWith("<~")&&(t=t.slice(2));let n=t.indexOf("~>");n>=0&&(t=t.slice(0,n));let r=[],o=0,i=0;for(let s of t){if(s==="z"&&i===0){r.push(0,0,0,0);continue}let a=s.charCodeAt(0)-33;if(a<0||a>84)return null;o=o*85+a,i+=1,i===5&&(r.push(o>>>24&255,o>>>16&255,o>>>8&255,o&255),o=0,i=0)}if(i>0){for(let a=i;a<5;a+=1)o=o*85+84;let s=[o>>>24&255,o>>>16&255,o>>>8&255,o&255];for(let a=0;a<i-1;a+=1)r.push(s[a]??0)}return Buffer.from(r)}function EP(e){let t=e.toString("latin1").replace(/\s/g,"").split(">")[0]??"",n=t.length%2?t+"0":t;return/^[0-9A-Fa-f]*$/.test(n)?Buffer.from(n,"hex"):null}function AP(e){let t=/\/Filter\s*(\[[^\]]*\]|\/\w+)/.exec(e);return!t||!t[1]?[]:[...t[1].matchAll(/\/(\w+)/g)].map(n=>n[1]??"")}function Ns(e,t){if(!e.stream)return null;let n=e.stream;for(let r of AP(e.dict)){let o=null;if(r==="FlateDecode")try{o=t!==void 0?R_(n,{maxOutputLength:Math.max(1,t)}):R_(n)}catch{return null}else if(r==="ASCII85Decode")o=$P(n);else if(r==="ASCIIHexDecode")o=EP(n);else return null;if(o===null)return null;n=o}return n.toString("latin1")}function TP(e){let t=new Map,n=1,r=/begincodespacerange([\s\S]*?)endcodespacerange/.exec(e);if(r&&r[1]){let c=/<([0-9A-Fa-f]+)>/.exec(r[1]);c&&c[1]&&c[1].length>=4&&(n=2)}let o=c=>{let l="";for(let d=0;d+3<c.length+1;d+=4){let u=parseInt(c.slice(d,d+4),16);Number.isFinite(u)&&u>0&&(l+=String.fromCharCode(u))}return l},i=/beginbfchar([\s\S]*?)endbfchar/g,s;for(;(s=i.exec(e))!==null;){let c=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,l;for(;(l=c.exec(s[1]??""))!==null;)t.set(parseInt(l[1]??"0",16),o(l[2]??""))}let a=/beginbfrange([\s\S]*?)endbfrange/g;for(;(s=a.exec(e))!==null;){let c=s[1]??"",l=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,d;for(;(d=l.exec(c))!==null;){let u=parseInt(d[1]??"0",16),p=parseInt(d[2]??"0",16),f=parseInt((d[3]??"0").slice(0,4)||"0",16);if(!(p-u>65535))for(let h=u;h<=p;h+=1)t.set(h,String.fromCharCode(f+(h-u)))}}return{map:t,bytes:n}}function PP(e){let t=new Map,n=[],r=[];for(let i of e.values()){for(let s of i.dict.matchAll(/\/Font\s*<<([\s\S]*?)>>/g))s[1]&&r.push(s[1]);for(let s of i.dict.matchAll(/\/Font\s+(\d+)\s+\d+\s+R/g)){let a=e.get(Number(s[1]));a&&r.push(a.dict)}}let o=new Set;for(let i of r){let s=/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g,a;for(;(a=s.exec(i))!==null;){let c=`${a[1]}#${a[2]}`;o.has(c)||(o.add(c),n.push([a[1]??"",Number(a[2])]))}}for(let[i,s]of n){let a=e.get(s);if(!a)continue;let c=null,l=/\/ToUnicode\s+(\d+)\s+\d+\s+R/.exec(a.dict);if(l){let u=e.get(Number(l[1])),p=u?Ns(u):null;p&&(c=TP(p))}if(c||(c=OP(a.dict,e)),!c)continue;let d=t.get(i)??[];d.push(c),t.set(i,d)}return t}function NP(e){let t=/^uni([0-9A-Fa-f]{4})$/.exec(e)??/^u([0-9A-Fa-f]{4,6})$/.exec(e);if(t)return String.fromCodePoint(parseInt(t[1],16));let n=/^afii(\d{5})$/.exec(e);if(n){let i=Number(n[1]);if(i>=57664&&i<=57690)return String.fromCharCode(1488+(i-57664))}let r=RP.indexOf(e.replace(/hebrew$/,""));return r>=0?String.fromCharCode(1488+r):e==="space"?" ":/^[A-Za-z]$/.test(e)?e:{zero:"0",one:"1",two:"2",three:"3",four:"4",five:"5",six:"6",seven:"7",eight:"8",nine:"9",period:".",comma:",",hyphen:"-",colon:":",slash:"/",at:"@"}[e]??null}function OP(e,t){let n=e,r=/\/Encoding\s+(\d+)\s+\d+\s+R/.exec(e);r&&(n=t.get(Number(r[1]))?.dict??"");let o=/\/Differences\s*\[([^\]]*)\]/.exec(n);if(!o?.[1])return null;let i=new Map,s=0;for(let a of o[1].match(/\d+|\/[^\s/[\]]+/g)??[]){if(/^\d+$/.test(a)){s=Number(a);continue}let c=NP(a.slice(1));c!==null&&i.set(s,c),s+=1}return i.size?{map:i,bytes:1}:null}function L_(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r!=="\\"){t.push(r.charCodeAt(0)&255);continue}let o=e[n+1];if(o===void 0)break;if(o>="0"&&o<="7"){let s="",a=n+1;for(;a<e.length&&s.length<3&&e[a]>="0"&&e[a]<="7";)s+=e[a],a+=1;t.push(parseInt(s,8)&255),n=a-1;continue}let i={n:10,r:13,t:9,b:8,f:12};t.push(i[o]??o.charCodeAt(0)&255),n+=1}return t}function F_(e){if(e.length<2||e[0]!==254||e[1]!==255)return null;let t="";for(let n=2;n+1<e.length;n+=2)t+=String.fromCharCode((e[n]??0)<<8|(e[n+1]??0));return t}function O_(e,t){let n=F_(e);if(n!==null)return n;if(!t)return e.map(o=>String.fromCharCode(o)).join("");let r="";if(t.bytes===2)for(let o=0;o+1<e.length;o+=2){let i=(e[o]??0)<<8|(e[o+1]??0);r+=t.map.get(i)??""}else for(let o of e)r+=t.map.get(o)??String.fromCharCode(o);return r}function CP(e){let t=0;for(let n of e){let r=n.codePointAt(0)??0;/[\p{L}\p{N}]/u.test(n)?t+=1:(r<32||r>=127&&r<=191||r===65533)&&(t-=2)}return t}function C_(e,t){if(!t||t.length<=1)return O_(e,t?.[0]);let n="",r=-1/0;for(let o of t){let i=O_(e,o),s=CP(i);s>r&&(n=i,r=s)}return n}function IP(e,t){let n="",r="",o,i=!1,s="",a=0,c=null,l=()=>{r.trim()&&(n+=r+`
|
|
@@ -141,7 +141,7 @@ The data tools are on.`}]}})}function Nv(e){let t=e,n=t.registerTool.bind(e);t.r
|
|
|
141
141
|
`,{mode:384})}function wo(){let e=_i();return e?en(Ai(e)):null}function sI(e,t){let n=Date.now(),r=en(sk(e))??{};r[t]=n;let o=Object.fromEntries(Object.entries(r).filter(([,i])=>n-i<oI));return bo(sk(e),o),Object.keys(o).sort()}function Ti(){let t=(en(vn(dk(),".claude","settings.json"))?.hooks?.PreToolUse??[]).flatMap(n=>n.hooks??[]).find(n=>n.command.includes("gate.mjs"))?.command;return t?t.includes("--block")?"block":"ask":null}function fk(){return en(vn(uk(),"consent.json"))?.terms_version??null}function Pi(){let e=bi().map(r=>en(r.file)).filter(r=>!!r);if(!e.length)return null;let t={require_gate:null,require_min_version:null,require_expose:null,received_at:e[0].received_at},n=[];for(let r of e)r.require_gate&&(!t.require_gate||ak[r.require_gate]>ak[t.require_gate])&&(t.require_gate=r.require_gate),r.require_min_version&&(!t.require_min_version||aI(r.require_min_version,t.require_min_version))&&(t.require_min_version=r.require_min_version),r.require_expose&&(!t.require_expose||ck[r.require_expose]>ck[t.require_expose])&&(t.require_expose=r.require_expose),r.require_autopilot==="off"&&(t.require_autopilot="off"),n.push(...r.folder_rules??[]),r.received_at>t.received_at&&(t.received_at=r.received_at);return n.length?{...t,folder_rules:n}:t}function cI(e,t=new Date){if(!e||typeof e!="object")return null;let n=e,r=n.require_gate==="ask"||n.require_gate==="block"?n.require_gate:null,o=typeof n.require_min_version=="string"&&/^\d+\.\d+\.\d+$/.test(n.require_min_version)?n.require_min_version:null,i=n.require_expose==="none"||n.require_expose==="clean"?n.require_expose:null,s=n.require_autopilot==="off",a=Gv(n.folder_rules);return r||o||i||s||a.length?{require_gate:r,require_min_version:o,require_expose:i,...s?{require_autopilot:"off"}:{},...a.length?{folder_rules:a}:{},received_at:t.toISOString()}:null}function hk(e){vh=e}async function lI(e,t){let n=cI(t),r=en(Ml(e));if(!n){r&&bo(Ml(e),null);return}bo(Ml(e),n);let o=Pi()?.require_gate??n.require_gate;if(o&&Ti()!==o&&vh)try{await vh(o)}catch{}}async function kh(e){let t=_i(),n=t?en(Ai(t)):null;if(!t||!n)return null;let r=en(Ml(t)),o=sI(t,e.agent()),i=new da(n.api_base);try{let s=await i.heartbeat({deployment_id:n.deployment_id,agent_version:`mcp-${e.version}`,applied_config:{scan_interval_minutes:ya?.scan_interval_minutes??1440,release_channel:ya?.release_channel??"stable",enabled_apps:ya?.enabled_apps??null,scan_scope:{surface:"mcp",host:Qt(),agents:o,gate:Ti(),terms_version:fk(),current_terms:Dt,mandate_gate:r?.require_gate??null,mandate_min_version:r?.require_min_version??null,mandate_expose:r?.require_expose??null,mandate_folder_rules:r?.folder_rules?.length??0,mandate_autopilot:r?.require_autopilot??null,coverage:rk(),exposed_folders:uI()}}},Gf(pk(t))),a=hv(s,n.deployment_id,Date.now(),new kl(vn(t,"command-nonces")));a.ok&&(ya=s.desired_config??ya,s.desired_config&&await lI(t,s.desired_config.scan_scope));let c={...n,last_heartbeat_ok_at:new Date().toISOString(),last_error:a.ok?null:`command refused (${a.reason}); the organisation's settings were not applied`,revoked:!!s.revoked};return bo(Ai(t),c),c}catch(s){let a={...n,last_error:s instanceof Error?s.message.slice(0,200):String(s)};return bo(Ai(t),a),a}}async function gk(e){if(!e.org)return{ok:!1,error:"no enrolled device identity"};let t=_i(e.org.id);if(!t)return{ok:!1,error:`no folder for organisation ${e.org.id}`};try{let n=await e.org.token();if(!n)return{ok:!1,error:"no usable org credential"};let r=await fetch(`${e.org.baseUrl}/api/v1/tenants/${encodeURIComponent(e.org.id)}/capsule/install-token`,{method:"POST",headers:{authorization:`Bearer ${n}`}}),o=await r.json().catch(()=>({}));if(!r.ok||!o.install_token)return{ok:!1,error:`HTTP ${r.status}: ${o.error??"no install token"}`};let i=Gf(pk(t)),a=await new da(e.org.baseUrl).enroll({install_token:o.install_token,pubkey_pem:i.publicKeyPem,agent_version:`mcp-${e.version}`,agent_kind:"npm_cli"});bo(Ai(t),{deployment_id:a.deployment_id,org_id:e.org.id,api_base:e.org.baseUrl,enrolled_at:new Date().toISOString()});let c=await kh(e);Sh(e);let l=await e.ack(`node ${a.deployment_id} on ${Qt()}`);return{ok:!0,deployment_id:a.deployment_id,beat:c,recorded:l}}catch(n){return{ok:!1,error:n.message.slice(0,200)}}}function mk(){let e=_i();return e?en(wh(e))?.last_error??null:null}async function yk(e){if(!e.org)return;let t=_i(e.org.id);if(!t||en(Ai(t))||/^(1|true|yes)$/i.test(process.env.NODATA_NO_NODE??""))return;let n=en(wh(t));if(n?.last_try_at&&Date.now()-Date.parse(n.last_try_at)<iI)return;let r=await gk(e);bo(wh(t),{last_try_at:new Date().toISOString(),last_error:r.ok?null:r.error})}function Sh(e){if(!wo())return;let t=()=>{kh(e)};setTimeout(t,3e3).unref(),setInterval(t,rI).unref()}function dI(e){if(!e)return"never";let t=Math.round((Date.now()-Date.parse(e))/6e4);return t<1?"just now":t<60?`${t} min ago`:`${Math.round(t/60)} h ago`}function _k(e,t){e.registerTool("nodata_node",{description:`Register THIS MACHINE as a Capsule node of the organisation \u2014 so "this machine is guarded" is something the organisation can verify, not only the user. One node per machine; every agent here (Claude Code, Cursor \u2026) is a workload on it; billing stays per decision, a node is not a billing unit. Uses the Capsule agent's own enrolment and signed heartbeat. The heartbeat reports only: a machine id (a salted hash, never the host name), the agents' names, whether the read gate is on, and the accepted terms version \u2014 never content. ASKS FIRST: without confirm:true it shows the status, or what registering would send. Call with confirm:true only after the user approves.`,inputSchema:{confirm:Z2.boolean().optional().describe("true = register this machine. Omit to see status / preview.")}},async({confirm:n})=>{let r=wo();if(r){let c=await kh(t);return{content:[{type:"text",text:[`CAPSULE NODE ${r.deployment_id} \u2014 org ${r.org_id} \xB7 ${t.who()}`,` last verified heartbeat: ${dI(c?.last_heartbeat_ok_at)}${c?.last_error?` (last error: ${c.last_error})`:""}`,c?.revoked?" \u26A0 The organisation has paused this node.":"",` reported: machine id ${Qt()} (not the name ${ik()}), agents, read gate ${Ti()??"off"}, terms ${fk()??"not accepted"} \u2014 no content.`].filter(Boolean).join(`
|
|
142
142
|
`)}]}}if(!t.org)return{content:[{type:"text",text:"This machine has no enrolled device identity, so it cannot register as a node. Connect first with nodata_connect (it enrolls the device), restart, then run nodata_node again."}],isError:!0};if(!n)return{content:[{type:"text",text:[`PREVIEW \u2014 nothing registered yet. ${t.who()}`,`Register this machine (${ik()}, sent as ${Qt()}) as a Capsule node of org ${t.org.id}:`," \xB7 a signing key is created in ~/.nodata/capsule-key (it never leaves this machine);"," \xB7 while an agent runs here, a signed heartbeat every 5 minutes reports: the machine id (not its name), the agents' names, read gate on/off, accepted terms version;"," \xB7 never file names, paths, findings or content;"," \xB7 the organisation sees the machine in its fleet, and can pause it.","A node is not a billing unit \u2014 billing stays per decision.","","Ask the user to approve, then call nodata_node again with confirm: true."].join(`
|
|
143
143
|
`)}]};let o=await gk(t);if(!o.ok)return{content:[{type:"text",text:`Could not register this machine: ${o.error}. If it says no credential, run nodata_connect.`}],isError:!0};let{deployment_id:i,beat:s,recorded:a}=o;return{content:[{type:"text",text:[`REGISTERED \u2014 this machine is Capsule node ${i} of org ${t.org.id}. ${t.who()}`,` first heartbeat: ${s?.last_heartbeat_ok_at?"verified":`failed (${s?.last_error??"unknown"})`}`," the status line now shows when NoData last verified this node.",`Approval kept in ~/.nodata/acks.jsonl${qn(a)}.`].join(`
|
|
144
|
-
`)}]}})}function uI(){try{let e=JSON.parse(lk(vn(uk(),"exposures.json"),"utf8"));return Array.isArray(e)?e.filter(t=>Date.parse(String(t.expires_at))>Date.now()).length:0}catch{return 0}}var rI,oI,uk,Ai,wh,iI,sk,pk,ya,Ml,ak,ck,aI,vh,Bl=H(()=>{"use strict";bt();cv();Vf();gv();yv();qf();go();nh();Yn();Fl();rI=300*1e3,oI=1440*60*1e3,uk=()=>vn(dk(),".nodata"),Ai=e=>vn(e,"capsule.json"),wh=e=>vn(e,"capsule-auto.json"),iI=360*60*1e3,sk=e=>vn(e,"capsule-agents.json"),pk=e=>vn(e,"capsule-key");ya=null,Ml=e=>vn(e,"org-mandate.json"),ak={ask:1,block:2},ck={clean:1,none:2},aI=(e,t)=>{let[n,r]=[e.split(".").map(Number),t.split(".").map(Number)];for(let o=0;o<3;o++)if(n[o]!==r[o])return n[o]>r[o];return!1};vh=null});import{spawnSync as pI}from"node:child_process";import{existsSync as vk,readFileSync as fI}from"node:fs";import{homedir as Eh}from"node:os";import{join as Hl}from"node:path";function bk(e,t){let n=e.split(/[.-]/).map(o=>Number(o)||0),r=t.split(/[.-]/).map(o=>Number(o)||0);for(let o=0;o<3;o++)if((n[o]??0)!==(r[o]??0))return(n[o]??0)>(r[o]??0);return!1}async function mI(e){if(/^(1|true|yes)$/i.test(process.env.NODATA_NO_UPDATE_CHECK??""))return null;try{let t=await e(gI,{signal:AbortSignal.timeout(xh)});if(!t.ok)return null;let n=(await t.json()).version;return typeof n=="string"?n:null}catch{return null}}function wk(e){return e==="flag"?"flag-key":e==="env"?"env-key":"stored-key"}function _a(e){let t=e.match(/\b(org_has_no_active_key|no_valid_challenge|attestation_failed|attestation rejected: [a-z_]+|api_key_[a-z_]+|invalid_api_key|missing_bearer_token|not_enrolled|unknown_or_inactive_device|challenge_issue_failed|service_unavailable|too many|device_[a-z_]+|HTTP \d{3})\b/);return t?t[1]:null}async function yI(e,t){if(e.mode==="setup"&&vk(Hl(Eh(),".nodata","credentials.json")))return{conn:"restart",refused:null,said:null};if(e.mode==="setup"||!e.token)return{conn:"not-connected",refused:null,said:null};let n=null,r="";try{n=await e.token()}catch(o){n=null,r=o instanceof Error?o.message:String(o)}try{if(!n)return await t(e.baseUrl,{method:"HEAD",signal:AbortSignal.timeout(xh)}),/org_has_no_active_key/.test(r)?{conn:"reconnect",refused:"org-has-no-key",said:_a(r)}:e.isDevice?hI.test(r)?{conn:"reconnect",refused:"device-refused",said:_a(r)}:{conn:"unstable",refused:null,said:_a(r)}:{conn:"reconnect",refused:wk(e.source),said:_a(r)};let o=await t(`${e.baseUrl}/api/v1/recovery/pubkey`,{headers:{authorization:`Bearer ${n}`},signal:AbortSignal.timeout(xh)});if(o.status!==401){let s=null;try{let a=await o.json();s=typeof a.exists=="boolean"?a.exists:null}catch{s=null}return{conn:"connected",refused:null,said:null,orgKey:o.ok?s:null}}let i=null;try{i=_a(String((await o.json()).error??""))}catch{i=null}return{conn:"reconnect",refused:e.isDevice?"device-refused":wk(e.source),said:i}}catch{return{conn:"offline",refused:null,said:null}}}function $h(e=Hl(Eh(),".claude.json")){try{let t=JSON.parse(fI(e,"utf8")),n=t.mcpServers?.nodata,o=(n?.args??[]).join(" ").match(/@nodatachat\/mcp@(\d+\.\d+\.\d+)/),s=[n,...Object.values(t.projects??{}).map(a=>a?.mcpServers?.nodata)].filter(Boolean).some(a=>(a.args??[]).some(c=>c==="--api-key"||c==="--grant-token")||Object.keys(a.env??{}).some(c=>c==="NODATA_API_KEY"||c==="NODATA_GRANT_TOKEN"));return{user:!!n,localOnly:!n&&Object.values(t.projects??{}).some(a=>!!a?.mcpServers?.nodata),pinned:o?o[1]:null,keyInSettings:s}}catch{return{user:!1,localOnly:!1,pinned:null,keyInSettings:!1}}}function Ul(){let e=!!(process.env.NODATA_API_KEY||process.env.NODATA_GRANT_TOKEN),t=$h().keyInSettings||process.argv.some(r=>r==="--api-key"||r==="--grant-token");return!e&&!t?null:`NOTE \u2014 a key in ${[t?"Claude Code's NoData settings (--api-key)":"",e?"the NODATA_API_KEY environment variable":""].filter(Boolean).join(" and ")} comes before this approved computer, so NoData keeps using that key. Remove it (`+[t?`claude mcp remove nodata -s user; claude mcp add -s user nodata -- ${process.platform==="win32"?"cmd /c ":""}npx -y @nodatachat/mcp@latest`:"",e?process.platform==="win32"?"reg delete HKCU\\Environment /v NODATA_API_KEY /f \u2014 a deletion, ask the user first":"remove the export NODATA_API_KEY line from the shell profile":""].filter(Boolean).join("; ")+"), then restart Claude Code."}function _I(){let e=process.platform==="win32";if(pI(e?"where":"which",["claude"],{stdio:"ignore",windowsHide:!0}).status===0)return null;let n=Hl(Eh(),".local","bin");return vk(Hl(n,e?"claude.exe":"claude"))?n:null}function Ah(e){if(process.platform==="win32"){let t=[];return e.poppler&&t.push("winget install --silent --accept-package-agreements --accept-source-agreements oschwartz10612.Poppler"),e.tesseract&&t.push("winget install --silent --accept-package-agreements --accept-source-agreements UB-Mannheim.TesseractOCR"),e.heb&&t.push(`Start-Process powershell -Verb RunAs -ArgumentList '-Command Invoke-WebRequest https://github.com/tesseract-ocr/tessdata_fast/raw/main/heb.traineddata -OutFile "C:\\Program Files\\Tesseract-OCR\\tessdata\\heb.traineddata"'`),t.join("; ")}return process.platform==="darwin"?"brew install poppler tesseract tesseract-lang":"sudo apt-get install -y poppler-utils tesseract-ocr tesseract-ocr-heb"}async function ba(e){let t=e.fetchImpl??fetch,[n,r]=await Promise.all([mI(t),e.mode==="agent"?Promise.resolve({conn:"connected",refused:null,said:null,orgKey:null}):yI(e,t)]),o=r.conn,i=r.refused,s=n!==null&&bk(n,e.version),a=[],c=[];a.push(`version ${e.version}`+(s?` \u2014 ${n} is available`:n?n===e.version?" (the latest)":` (newer than the published ${n})`:" (could not check for a newer one)"));let l={connected:`connected to the organisation${e.org?` ${e.org}`:""} \u2014 all tools on`,"not-connected":"not connected to an organisation \u2014 the tools on this computer work (scan, lock, clean copy, plan, secrets); agents, sending, archive and proofs need a connection",reconnect:"the saved organisation credential was refused (revoked, rotated, or this device was removed)",restart:"connected to the organisation on this computer \u2014 this session started before that, so the organisation tools load after /mcp",offline:"NoData could not be reached right now \u2014 the tools on this computer work; organisation tools will once online",unstable:"NoData answered with a temporary error \u2014 NoData retries by itself; nothing to do, and do not reconnect"},d={"org-has-no-key":"this computer is approved, but its organisation has no active key to sign it in with (the last one was revoked or rotated away)","device-refused":l.reconnect,"flag-key":"the key written in Claude Code's NoData settings (--api-key) was refused \u2014 and a key there comes before anything approved on this computer","env-key":"the key in the NODATA_API_KEY environment variable was refused \u2014 and it comes before anything approved on this computer","stored-key":l.reconnect};if(a.push((o==="reconnect"&&i?d[i]:l[o])+((o==="reconnect"||o==="unstable")&&r.said?` (NoData said: ${r.said})`:"")),(e.source==="flag"||e.source==="env")&&e.storedDevice&&a.push(`a computer approved in the browser is saved here but not used: the key from ${e.source==="flag"?"Claude Code's settings":"the environment variable"} comes first`),e.mode!=="agent"){let u=vi(),p=Ti();a.push(`terms ${u?"accepted":"NOT accepted"} \xB7 read gate ${p??"OFF"} \xB7 language ${jt()}${wi()?"":" (not chosen)"} \xB7 node ${wo()?"registered":"not registered"}`),u||c.push("accept the terms: nodata_terms shows them; call it again with confirm:true only after the user says yes \u2014 the data tools wait for it"),wi()||c.push("choose a language: ask \u05E2\u05D1\u05E8\u05D9\u05EA or English, then nodata_terms with `language`")}if(o==="not-connected"&&c.push("connect to an organisation: nodata_connect (no arguments) opens a page in the browser \u2014 the user signs in or creates a free account and clicks Approve; nothing to copy, and never ask for a key in the chat; then /mcp"),o==="reconnect"){let u=process.platform==="win32",p={"org-has-no-key":"the organisation needs an active key again: its admin opens the console \u2192 API keys and creates one (it is not copied anywhere \u2014 this computer only signs in under it); then /mcp. Do NOT call nodata_connect: this computer is already approved, and a new approval would not help","device-refused":"connect again: nodata_connect (no arguments) \u2014 the user approves this computer in the browser; then /mcp","flag-key":`RUN: remove the refused key from Claude Code's settings \u2014 claude mcp remove nodata -s user; claude mcp add -s user nodata -- ${u?"cmd /c ":""}npx -y @nodatachat/mcp@latest \u2014 then the user restarts Claude Code${e.storedDevice?" (this computer's approval is saved and takes over)":" and connects with nodata_connect"}`,"env-key":`remove the refused key from the environment \u2014 ${u?"RUN: reg delete HKCU\\Environment /v NODATA_API_KEY /f (a deletion: ask the user first)":"the user removes the export NODATA_API_KEY line from the shell profile"} \u2014 then the user closes the terminal and Claude Code and opens them again${e.storedDevice?" (this computer's approval is saved and takes over)":" and connects with nodata_connect"}`,"stored-key":"connect again: nodata_connect (no arguments) \u2014 the user approves this computer in the browser; then /mcp"};c.push(p[i??"device-refused"])}if(o==="restart"&&c.push("load the organisation tools: the user types /mcp"),o==="connected"&&r.orgKey===!1&&(a.push("the organisation has not set up its 12 words yet \u2014 until it does, nothing on this computer can be locked or sent (THE RECOVERY LAW)"),c.push(`set up the organisation's 12 words: the user opens ${e.baseUrl}/recovery-setup${e.org?`?t=${encodeURIComponent(e.org)}`:""} in the browser where they approved this computer, and follows it (a recovery file + a password; the words never leave their browser). Never ask for the words in the chat. Then nodata_get_started again`)),o==="connected"&&e.mode==="admin"&&!wo()){let u=mk();u&&c.push(`this computer did not join the organisation's fleet (${u}) \u2014 NoData retries by itself; to retry now, nodata_node with confirm:true after the user says OK`)}if(e.mode!=="agent"){let u=Pi();u?.require_gate&&a.push(`your organisation requires the read gate in ${u.require_gate} mode \u2014 NoData keeps it that way on this computer`),Ti()?zn().rules.length||c.push(`protect this computer's logins and the project's sensitive files in one step: call nodata_rules {action:"set", set:"developer"} to show the user the rules (SSH, GitHub and cloud logins never read by an agent; writes to CI and migrations asked first, with what the change does), and add them with confirm:true only if the user agrees`):c.push(u?.require_gate?`the read gate is required by your organisation (${u.require_gate}) and is off \u2014 NoData turns it on at the next check-in; to do it now, RUN: npx -y @nodatachat/mcp@latest install-gate${u.require_gate==="block"?" --block":""}`:"RUN: turn on the read gate \u2014 npx -y @nodatachat/mcp@latest install-gate \u2014 then the user restarts Claude Code"),u?.require_min_version&&bk(u.require_min_version,e.version)&&c.push(`your organisation requires NoData ${u.require_min_version} or newer (this is ${e.version}): the user closes and reopens Claude Code \u2014 with @latest the newest version loads by itself`);let p=$h();p.localOnly&&c.push("RUN: make NoData load in every folder, not only this one \u2014 claude mcp remove nodata -s local; claude mcp add -s user nodata -- "+(process.platform==="win32"?"cmd /c ":"")+"npx -y @nodatachat/mcp@latest"),p.pinned&&a.push(`installed pinned to ${p.pinned}`);let f=_I();f&&c.push(process.platform==="win32"?`RUN: put the claude command on PATH (it is installed in ${f} but a terminal cannot find it) \u2014 [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path","User") + ";${f}", "User")`:`RUN: put the claude command on PATH \u2014 echo 'export PATH="${f}:$PATH"' >> ~/.profile`)}if(s&&c.push(`update to ${n}: the user closes and reopens Claude Code (or types /mcp)`+($h().pinned?" \u2014 the install is pinned to one version, so first RUN: re-add it with @latest (see above)":" \u2014 with @latest the newest version loads by itself")),e.mode!=="agent"){let u=Ve(),p={poppler:!u.pdftotext||!u.pdftoppm,tesseract:!u.tesseract,heb:!!u.tesseract&&!u.ocrLangs.includes("heb")};if(a.push(`PDF readers: ${Os()}`),(p.poppler||p.tesseract||p.heb)&&c.push(`RUN: install the PDF readers (free, they run only on this computer; they read scanned and hard PDFs) \u2014 ${Ah(p)}`),yr())c.push(`back up the device key \u2014 ask which USB drive, then RUN: npx -y @nodatachat/mcp@latest key-backup <drive> (${_r()})`);else if(gi()==="ok"){let h=Zs(),g=!h||Date.now()-Date.parse(h)>2160*60*60*1e3;a.push(`device key backup: ${h?`recovery proven ${h.slice(0,10)}`:"confirmed, recovery not proven"}`),g&&c.push("prove the device key backup still restores \u2014 ask the user to plug in the backup drive, then RUN: npx -y @nodatachat/mcp@latest key-backup --verify <drive>")}let f=Kw();f.purged&&a.push(`quarantine: ${f.purged} copy(ies) past their grace period removed (a verified way back remains)`);for(let h of f.held.slice(0,5))c.push(`quarantine keeps a sealed copy of ${h.original} past its grace period: ${h.reason}`);try{let h=Ll({walk:!1});if(h.length){let g=h.filter(y=>y.status==="covered"&&!y.new_kinds).length;a.push(`coverage: ${g} of ${h.length} folder(s) on an approved policy (autopilot)`),g<h.length&&c.push(`not everything is covered (${h.length-g} folder(s): a new project, no policy, or a kind the policy never saw) \u2014 nodata_choose coverage:true shows each with its next step`)}}catch{}}return{version:e.version,latest:n,updateAvailable:s,mode:e.mode,connection:o,refused:i,said:r.said,org:e.org,lines:a,todo:c}}function Ri(e,t){let n=e??{};if(n.error!=="recovery_law_12_words_required"&&n.reason!=="recovery_law_12_words_required")return"";let r=typeof n.setup_url=="string"&&n.setup_url.startsWith("/recovery-setup")?n.setup_url:"/recovery-setup";return`NEXT: the organisation has not set up its 12 words, and nothing is sealed until it does (every locked file must be recoverable by the organisation, not by NoData). The user opens ${t}${r} in the browser where they approved this computer and follows it; the words never leave their browser, never ask for them in the chat. Then try again.`}function Th(e){return["NODATA ON THIS MACHINE",...e.lines.map(t=>` \xB7 ${t}`),e.todo.length?"TO DO \u2014 get these done for the user, ONE at a time, in this order. A RUN: step you run yourself in the terminal (your shell tool) after the user says OK \u2014 never ask them to type it. A tool step you do with that tool. After each, call nodata_get_started again to re-check:":"Everything is on.",...e.todo.map((t,n)=>` ${n+1}. ${t}`)].join(`
|
|
144
|
+
`)}]}})}function uI(){try{let e=JSON.parse(lk(vn(uk(),"exposures.json"),"utf8"));return Array.isArray(e)?e.filter(t=>Date.parse(String(t.expires_at))>Date.now()).length:0}catch{return 0}}var rI,oI,uk,Ai,wh,iI,sk,pk,ya,Ml,ak,ck,aI,vh,Bl=H(()=>{"use strict";bt();cv();Vf();gv();yv();qf();go();nh();Yn();Fl();rI=300*1e3,oI=1440*60*1e3,uk=()=>vn(dk(),".nodata"),Ai=e=>vn(e,"capsule.json"),wh=e=>vn(e,"capsule-auto.json"),iI=360*60*1e3,sk=e=>vn(e,"capsule-agents.json"),pk=e=>vn(e,"capsule-key");ya=null,Ml=e=>vn(e,"org-mandate.json"),ak={ask:1,block:2},ck={clean:1,none:2},aI=(e,t)=>{let[n,r]=[e.split(".").map(Number),t.split(".").map(Number)];for(let o=0;o<3;o++)if(n[o]!==r[o])return n[o]>r[o];return!1};vh=null});import{spawnSync as pI}from"node:child_process";import{existsSync as vk,readFileSync as fI}from"node:fs";import{homedir as Eh}from"node:os";import{join as Hl}from"node:path";function bk(e,t){let n=e.split(/[.-]/).map(o=>Number(o)||0),r=t.split(/[.-]/).map(o=>Number(o)||0);for(let o=0;o<3;o++)if((n[o]??0)!==(r[o]??0))return(n[o]??0)>(r[o]??0);return!1}async function mI(e){if(/^(1|true|yes)$/i.test(process.env.NODATA_NO_UPDATE_CHECK??""))return null;try{let t=await e(gI,{signal:AbortSignal.timeout(xh)});if(!t.ok)return null;let n=(await t.json()).version;return typeof n=="string"?n:null}catch{return null}}function wk(e){return e==="flag"?"flag-key":e==="env"?"env-key":"stored-key"}function _a(e){let t=e.match(/\b(org_has_no_active_key|no_valid_challenge|attestation_failed|attestation rejected: [a-z_]+|api_key_[a-z_]+|invalid_api_key|missing_bearer_token|not_enrolled|unknown_or_inactive_device|challenge_issue_failed|service_unavailable|too many|device_[a-z_]+|HTTP \d{3})\b/);return t?t[1]:null}async function yI(e,t){if(e.mode==="setup"&&vk(Hl(Eh(),".nodata","credentials.json")))return{conn:"restart",refused:null,said:null};if(e.mode==="setup"||!e.token)return{conn:"not-connected",refused:null,said:null};let n=null,r="";try{n=await e.token()}catch(o){n=null,r=o instanceof Error?o.message:String(o)}try{if(!n)return await t(e.baseUrl,{method:"HEAD",signal:AbortSignal.timeout(xh)}),/org_has_no_active_key/.test(r)?{conn:"reconnect",refused:"org-has-no-key",said:_a(r)}:e.isDevice?hI.test(r)?{conn:"reconnect",refused:"device-refused",said:_a(r)}:{conn:"unstable",refused:null,said:_a(r)}:{conn:"reconnect",refused:wk(e.source),said:_a(r)};let o=await t(`${e.baseUrl}/api/v1/recovery/pubkey`,{headers:{authorization:`Bearer ${n}`},signal:AbortSignal.timeout(xh)});if(o.status!==401){let s=null;try{let a=await o.json();s=typeof a.exists=="boolean"?a.exists:null}catch{s=null}return{conn:"connected",refused:null,said:null,orgKey:o.ok?s:null}}let i=null;try{i=_a(String((await o.json()).error??""))}catch{i=null}return{conn:"reconnect",refused:e.isDevice?"device-refused":wk(e.source),said:i}}catch{return{conn:"offline",refused:null,said:null}}}function $h(e=Hl(Eh(),".claude.json")){try{let t=JSON.parse(fI(e,"utf8")),n=t.mcpServers?.nodata,o=(n?.args??[]).join(" ").match(/@nodatachat\/mcp@(\d+\.\d+\.\d+)/),s=[n,...Object.values(t.projects??{}).map(a=>a?.mcpServers?.nodata)].filter(Boolean).some(a=>(a.args??[]).some(c=>c==="--api-key"||c==="--grant-token")||Object.keys(a.env??{}).some(c=>c==="NODATA_API_KEY"||c==="NODATA_GRANT_TOKEN"));return{user:!!n,localOnly:!n&&Object.values(t.projects??{}).some(a=>!!a?.mcpServers?.nodata),pinned:o?o[1]:null,keyInSettings:s}}catch{return{user:!1,localOnly:!1,pinned:null,keyInSettings:!1}}}function Ul(){let e=!!(process.env.NODATA_API_KEY||process.env.NODATA_GRANT_TOKEN),t=$h().keyInSettings||process.argv.some(r=>r==="--api-key"||r==="--grant-token");return!e&&!t?null:`NOTE \u2014 a key in ${[t?"Claude Code's NoData settings (--api-key)":"",e?"the NODATA_API_KEY environment variable":""].filter(Boolean).join(" and ")} comes before this approved computer, so NoData keeps using that key. Remove it (`+[t?`claude mcp remove nodata -s user; claude mcp add -s user nodata -- ${process.platform==="win32"?"cmd /c ":""}npx -y @nodatachat/mcp@latest`:"",e?process.platform==="win32"?"reg delete HKCU\\Environment /v NODATA_API_KEY /f \u2014 a deletion, ask the user first":"remove the export NODATA_API_KEY line from the shell profile":""].filter(Boolean).join("; ")+"), then restart Claude Code."}function _I(){let e=process.platform==="win32";if(pI(e?"where":"which",["claude"],{stdio:"ignore",windowsHide:!0}).status===0)return null;let n=Hl(Eh(),".local","bin");return vk(Hl(n,e?"claude.exe":"claude"))?n:null}function Ah(e){if(process.platform==="win32"){let t=[];return e.poppler&&t.push("winget install --silent --accept-package-agreements --accept-source-agreements oschwartz10612.Poppler"),e.tesseract&&t.push("winget install --silent --accept-package-agreements --accept-source-agreements UB-Mannheim.TesseractOCR"),e.heb&&t.push(`Start-Process powershell -Verb RunAs -ArgumentList '-Command Invoke-WebRequest https://github.com/tesseract-ocr/tessdata_fast/raw/main/heb.traineddata -OutFile "C:\\Program Files\\Tesseract-OCR\\tessdata\\heb.traineddata"'`),t.join("; ")}return process.platform==="darwin"?"brew install poppler tesseract tesseract-lang":"sudo apt-get install -y poppler-utils tesseract-ocr tesseract-ocr-heb"}async function ba(e){let t=e.fetchImpl??fetch,[n,r]=await Promise.all([mI(t),e.mode==="agent"?Promise.resolve({conn:"connected",refused:null,said:null,orgKey:null}):yI(e,t)]),o=r.conn,i=r.refused,s=n!==null&&bk(n,e.version),a=[],c=[];a.push(`version ${e.version}`+(s?` \u2014 ${n} is available`:n?n===e.version?" (the latest)":` (newer than the published ${n})`:" (could not check for a newer one)"));let l={connected:`connected to the organisation${e.org?` ${e.org}`:""} \u2014 all tools on`,"not-connected":"not connected to an organisation \u2014 the tools on this computer work (scan, lock, clean copy, plan, secrets); agents, sending, archive and proofs need a connection",reconnect:"the saved organisation credential was refused (revoked, rotated, or this device was removed)",restart:"connected to the organisation on this computer \u2014 this session started before that, so the organisation tools load after /mcp",offline:"NoData could not be reached right now \u2014 the tools on this computer work; organisation tools will once online",unstable:"NoData answered with a temporary error \u2014 NoData retries by itself; nothing to do, and do not reconnect"},d={"org-has-no-key":"this computer is approved, but its organisation has no active key to sign it in with (the last one was revoked or rotated away)","device-refused":l.reconnect,"flag-key":"the key written in Claude Code's NoData settings (--api-key) was refused \u2014 and a key there comes before anything approved on this computer","env-key":"the key in the NODATA_API_KEY environment variable was refused \u2014 and it comes before anything approved on this computer","stored-key":l.reconnect};if(a.push((o==="reconnect"&&i?d[i]:l[o])+((o==="reconnect"||o==="unstable")&&r.said?` (NoData said: ${r.said})`:"")),(e.source==="flag"||e.source==="env")&&e.storedDevice&&a.push(`a computer approved in the browser is saved here but not used: the key from ${e.source==="flag"?"Claude Code's settings":"the environment variable"} comes first`),e.mode!=="agent"){let u=vi(),p=Ti();a.push(`terms ${u?"accepted":"NOT accepted"} \xB7 read gate ${p??"OFF"} \xB7 language ${jt()}${wi()?"":" (not chosen)"} \xB7 node ${wo()?"registered":"not registered"}`),u||c.push("accept the terms: nodata_terms shows them; call it again with confirm:true only after the user says yes \u2014 the data tools wait for it"),wi()||c.push("choose a language: ask \u05E2\u05D1\u05E8\u05D9\u05EA or English, then nodata_terms with `language`")}if(o==="not-connected"&&c.push("connect to an organisation: nodata_connect (no arguments) opens a page in the browser \u2014 the user signs in or creates a free account and clicks Approve; nothing to copy, and never ask for a key in the chat; then /mcp"),o==="reconnect"){let u=process.platform==="win32",p={"org-has-no-key":"the organisation needs an active key again: its admin opens the console \u2192 API keys and creates one (it is not copied anywhere \u2014 this computer only signs in under it); then /mcp. Do NOT call nodata_connect: this computer is already approved, and a new approval would not help","device-refused":"connect again: nodata_connect (no arguments) \u2014 the user approves this computer in the browser; then /mcp","flag-key":`RUN: remove the refused key from Claude Code's settings \u2014 claude mcp remove nodata -s user; claude mcp add -s user nodata -- ${u?"cmd /c ":""}npx -y @nodatachat/mcp@latest \u2014 then the user restarts Claude Code${e.storedDevice?" (this computer's approval is saved and takes over)":" and connects with nodata_connect"}`,"env-key":`remove the refused key from the environment \u2014 ${u?"RUN: reg delete HKCU\\Environment /v NODATA_API_KEY /f (a deletion: ask the user first)":"the user removes the export NODATA_API_KEY line from the shell profile"} \u2014 then the user closes the terminal and Claude Code and opens them again${e.storedDevice?" (this computer's approval is saved and takes over)":" and connects with nodata_connect"}`,"stored-key":"connect again: nodata_connect (no arguments) \u2014 the user approves this computer in the browser; then /mcp"};c.push(p[i??"device-refused"])}if(o==="restart"&&c.push("load the organisation tools: the user types /mcp"),o==="connected"&&r.orgKey===!1&&(a.push("the organisation has not set up its 12 words yet \u2014 until it does, nothing on this computer can be locked or sent (THE RECOVERY LAW); scanning a folder and choosing what may cross encrypt nothing, so they work now"),c.push("start now, nothing to set up: nodata_scan_folder on a folder the user names, then nodata_choose (the user approves the choice in the browser; it is signed on the organisation's chain)"),c.push(`before the first lock or send, set up the organisation's 12 words (say why: there is no encryption without a way to recover; the words let the organisation open its own files if a password is lost or a person leaves, and NoData never holds them): the user opens ${e.baseUrl}/recovery-setup${e.org?`?t=${encodeURIComponent(e.org)}`:""} in the browser where they approved this computer, and follows it (a recovery file + a password; the words never leave their browser). Never ask for the words in the chat. Then nodata_get_started again`)),o==="connected"&&e.mode==="admin"&&!wo()){let u=mk();u&&c.push(`this computer did not join the organisation's fleet (${u}) \u2014 NoData retries by itself; to retry now, nodata_node with confirm:true after the user says OK`)}if(e.mode!=="agent"){let u=Pi();u?.require_gate&&a.push(`your organisation requires the read gate in ${u.require_gate} mode \u2014 NoData keeps it that way on this computer`),Ti()?zn().rules.length||c.push(`protect this computer's logins and the project's sensitive files in one step: call nodata_rules {action:"set", set:"developer"} to show the user the rules (SSH, GitHub and cloud logins never read by an agent; writes to CI and migrations asked first, with what the change does), and add them with confirm:true only if the user agrees`):c.push(u?.require_gate?`the read gate is required by your organisation (${u.require_gate}) and is off \u2014 NoData turns it on at the next check-in; to do it now, RUN: npx -y @nodatachat/mcp@latest install-gate${u.require_gate==="block"?" --block":""}`:"RUN: turn on the read gate \u2014 npx -y @nodatachat/mcp@latest install-gate \u2014 then the user restarts Claude Code"),u?.require_min_version&&bk(u.require_min_version,e.version)&&c.push(`your organisation requires NoData ${u.require_min_version} or newer (this is ${e.version}): the user closes and reopens Claude Code \u2014 with @latest the newest version loads by itself`);let p=$h();p.localOnly&&c.push("RUN: make NoData load in every folder, not only this one \u2014 claude mcp remove nodata -s local; claude mcp add -s user nodata -- "+(process.platform==="win32"?"cmd /c ":"")+"npx -y @nodatachat/mcp@latest"),p.pinned&&a.push(`installed pinned to ${p.pinned}`);let f=_I();f&&c.push(process.platform==="win32"?`RUN: put the claude command on PATH (it is installed in ${f} but a terminal cannot find it) \u2014 [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path","User") + ";${f}", "User")`:`RUN: put the claude command on PATH \u2014 echo 'export PATH="${f}:$PATH"' >> ~/.profile`)}if(s&&c.push(`update to ${n}: the user closes and reopens Claude Code (or types /mcp)`+($h().pinned?" \u2014 the install is pinned to one version, so first RUN: re-add it with @latest (see above)":" \u2014 with @latest the newest version loads by itself")),e.mode!=="agent"){let u=Ve(),p={poppler:!u.pdftotext||!u.pdftoppm,tesseract:!u.tesseract,heb:!!u.tesseract&&!u.ocrLangs.includes("heb")};if(a.push(`PDF readers: ${Os()}`),(p.poppler||p.tesseract||p.heb)&&c.push(`RUN: install the PDF readers (free, they run only on this computer; they read scanned and hard PDFs) \u2014 ${Ah(p)}`),yr())c.push(`back up the device key \u2014 ask which USB drive, then RUN: npx -y @nodatachat/mcp@latest key-backup <drive> (${_r()})`);else if(gi()==="ok"){let h=Zs(),g=!h||Date.now()-Date.parse(h)>2160*60*60*1e3;a.push(`device key backup: ${h?`recovery proven ${h.slice(0,10)}`:"confirmed, recovery not proven"}`),g&&c.push("prove the device key backup still restores \u2014 ask the user to plug in the backup drive, then RUN: npx -y @nodatachat/mcp@latest key-backup --verify <drive>")}let f=Kw();f.purged&&a.push(`quarantine: ${f.purged} copy(ies) past their grace period removed (a verified way back remains)`);for(let h of f.held.slice(0,5))c.push(`quarantine keeps a sealed copy of ${h.original} past its grace period: ${h.reason}`);try{let h=Ll({walk:!1});if(h.length){let g=h.filter(y=>y.status==="covered"&&!y.new_kinds).length;a.push(`coverage: ${g} of ${h.length} folder(s) on an approved policy (autopilot)`),g<h.length&&c.push(`not everything is covered (${h.length-g} folder(s): a new project, no policy, or a kind the policy never saw) \u2014 nodata_choose coverage:true shows each with its next step`)}}catch{}}return{version:e.version,latest:n,updateAvailable:s,mode:e.mode,connection:o,refused:i,said:r.said,org:e.org,lines:a,todo:c}}function Ri(e,t){let n=e??{};if(n.error!=="recovery_law_12_words_required"&&n.reason!=="recovery_law_12_words_required")return"";let r=typeof n.setup_url=="string"&&n.setup_url.startsWith("/recovery-setup")?n.setup_url:"/recovery-setup";return`NEXT: the organisation has not set up its 12 words, and nothing is sealed until it does (every locked file must be recoverable by the organisation, not by NoData). The user opens ${t}${r} in the browser where they approved this computer and follows it; the words never leave their browser, never ask for them in the chat. Then try again.`}function Th(e){return["NODATA ON THIS MACHINE",...e.lines.map(t=>` \xB7 ${t}`),e.todo.length?"TO DO \u2014 get these done for the user, ONE at a time, in this order. A RUN: step you run yourself in the terminal (your shell tool) after the user says OK \u2014 never ask them to type it. A tool step you do with that tool. After each, call nodata_get_started again to re-check:":"Everything is on.",...e.todo.map((t,n)=>` ${n+1}. ${t}`)].join(`
|
|
145
145
|
`)}function kk(){let e=Ve(),t={poppler:!e.pdftotext||!e.pdftoppm,tesseract:!e.tesseract,heb:!!e.tesseract&&!e.ocrLangs.includes("heb")};return t.poppler||t.tesseract||t.heb?t:null}var hI,xh,gI,wa=H(()=>{"use strict";qe();mi();gl();Bl();wr();go();Yn();Fl();hI=/unknown_or_inactive_device|attestation_failed|attestation rejected/,xh=2500,gI="https://registry.npmjs.org/@nodatachat/mcp/latest"});function $e(e){return/\.ndc$/i.test(e)||/\.clean\.[A-Za-z0-9]+$/.test(e)||kn(e)}function kn(e){return/(^|[\\/])\.nodata[\\/]/.test(e)}var Sn=H(()=>{"use strict"});function vo(e){return e.normalize("NFC").replace(bI,"").toLowerCase()}function kI(e){switch(e){case 4:return"restricted";case 3:return"confidential";default:return"internal"}}function SI(e){switch(e){case"restricted":return 4;case"confidential":return 3;case"internal":return 2;case"public":return 1}}function xn(e){let t=[];if(e==null)return{lexicon:null,clean:null,errors:t};if(typeof e!="object"||Array.isArray(e))return{lexicon:null,clean:null,errors:["lexicon must be an object"]};let r=e.terms;if(!Array.isArray(r))return{lexicon:null,clean:null,errors:["terms must be an array"]};r.length>tn.MAX_TERMS&&t.push(`too many terms (max ${tn.MAX_TERMS})`);let o=[],i=[],s=new Set;for(let a=0;a<r.length&&o.length<tn.MAX_TERMS;a++){let c=r[a];if(typeof c!="object"||c===null){t.push(`term[${a}]: not an object`);continue}let l=c,d=typeof l.id=="string"?l.id.trim():"";if(!d||d.length>tn.MAX_ID_LEN||!vI.test(d)){t.push(`term[${a}]: invalid id`);continue}if(s.has(d.toLowerCase())){t.push(`term[${a}]: duplicate id "${d}"`);continue}let u=typeof l.match=="string"?l.match.trim():"";if(u.length<tn.MIN_TERM_LEN||u.length>tn.MAX_TERM_LEN){t.push(`term[${a}]: match length out of range`);continue}let p=vo(u);if(!p){t.push(`term[${a}]: match empty after normalize`);continue}let f=typeof l.label=="string"?l.label.trim():"";if(!f||f.length>tn.MAX_LABEL_LEN){t.push(`term[${a}]: invalid label`);continue}let h;if(l.flag!==void 0&&l.flag!==null){if(typeof l.flag!="string"||l.flag.length>tn.MAX_FLAG_LEN){t.push(`term[${a}]: invalid flag`);continue}h=l.flag.trim()||void 0}let g,y,_={id:d,match:u,label:f};if(l.tier!==void 0&&l.tier!==null){let w=Number(l.tier);if(![1,2,3,4].includes(w)){t.push(`term[${a}]: tier must be 1-4`);continue}g=w,y=kI(g),_.tier=g}else if(typeof l.access_class=="string"&&wI.includes(l.access_class))y=l.access_class,g=SI(y),_.access_class=y;else{t.push(`term[${a}]: needs tier (1-4) or access_class`);continue}h&&(_.flag=h),s.add(d.toLowerCase()),o.push({id:d,needle:p,label:f,tier:g,access_class:y,flag:h}),i.push(_)}return o.length===0?{lexicon:null,clean:null,errors:t.length?t:["no valid terms"]}:{lexicon:{version:1,terms:o},clean:{version:1,terms:i},errors:t}}function xI(e,t){if(!t)return 0;let n=0,r=e.indexOf(t);for(;r!==-1&&(n++,!(n>=1e5));)r=e.indexOf(t,r+t.length);return n}function Sk(e,t){if(!e||e.terms.length===0||!t)return[];let n=vo(t);if(!n)return[];let r=[];for(let o of e.terms){let i=xI(n,o.needle);i>0&&r.push({term_id:o.id,label:o.label,tier:o.tier,access_class:o.access_class,...o.flag?{flag:o.flag}:{},hit_count:i})}return r}var bI,tn,wI,vI,va=H(()=>{"use strict";bI=/[֑-ׇ]/g;tn={MAX_TERMS:200,MIN_TERM_LEN:1,MAX_TERM_LEN:64,MAX_ID_LEN:64,MAX_LABEL_LEN:120,MAX_FLAG_LEN:64},wI=["public","internal","confidential","restricted"],vI=/^[a-z0-9][a-z0-9_-]{0,63}$/i});import{existsSync as $k,mkdirSync as $I,readFileSync as EI,writeFileSync as AI}from"node:fs";import{homedir as Rh}from"node:os";import{join as Nh}from"node:path";function Pk(e){ka=e}function Rk(e){try{return $k(e)?JSON.parse(EI(e,"utf8")):null}catch{return null}}function Nk(e,t){$I(Nh(Rh(),".nodata"),{recursive:!0}),AI(e,JSON.stringify(t,null,2)+`
|
|
146
146
|
`,{mode:384})}function Ni(){let e=Rk(Ek());if(!e)return{lexicon:null,at:null,tampered:!1};let t={fetched_at:e.fetched_at,lexicon:e.lexicon??null};return ha(Ak,t,e.mac)?{lexicon:e.lexicon?xn(e.lexicon).clean:null,at:e.fetched_at,tampered:!1}:{lexicon:null,at:null,tampered:!0}}function TI(e,t=new Date){let n={fetched_at:t.toISOString(),lexicon:e};Nk(Ek(),{v:1,...n,mac:Si(Ak,n)})}function Kl(){let e=Rk(Ph());if(!e)return{terms:[],tampered:$k(Ph())};let t=Array.isArray(e.terms)?e.terms:[];return ha(Tk,t,e.mac)?{terms:t,tampered:!1}:{terms:[],tampered:!0}}function Oh(e){Nk(Ph(),{v:1,terms:e,mac:Si(Tk,e)})}async function PI(e=ka){if(!e){let o=Ni();return{from:"none",use:!1,...o.lexicon||o.tampered?{note:`this computer holds no organisation credential now, so the organisation's terms${o.at?` cached ${o.at}`:""} are not used (nodata_connect to use them again)`}:{}}}let t;try{t=await Promise.race([e(),new Promise((o,i)=>setTimeout(()=>i(new Error(`no answer in ${xk/1e3}s`)),xk).unref?.())])}catch(o){t={ok:!1,status:0,body:{error:o instanceof Error?o.message:String(o)}}}let n=t.body??{};if(t.ok&&"lexicon"in n)return TI(n.lexicon==null?null:xn(n.lexicon).clean),{from:"fetched",use:!0};let r=typeof n.error=="string"?n.error:`HTTP ${t.status}`;return{from:Ni().lexicon?"cached":"none",use:!0,note:`the organisation's terms were not fetched (${r})`}}async function Ch(e=ka){let t=await PI(e),n=t.use?Ni():{lexicon:null,at:null,tampered:!1},r=Kl(),o=[];t.note&&o.push(t.note+(n.lexicon?`; using the copy from ${n.at}`:"")),n.tampered&&o.push("the cached organisation terms were changed outside NoData and are not used"),r.tampered&&o.push("your terms file was changed outside nodata_scan_terms and is not used; save the terms again through it");let i=n.lexicon?.terms??[],s=xn({version:1,terms:[...i,...r.terms].slice(0,tn.MAX_TERMS)}),a=new Set(i.map(l=>l.id.toLowerCase())),c=s.lexicon;return{lexicon:c,orgTerms:c?c.terms.filter(l=>a.has(l.id.toLowerCase())).length:0,localTerms:c?c.terms.filter(l=>!a.has(l.id.toLowerCase())).length:0,from:n.lexicon?t.from:"none",at:n.at,notes:o}}function Ok(){let e=ka?Ni():{lexicon:null},t=Kl();return xn({version:1,terms:[...e.lexicon?.terms??[],...t.terms].slice(0,tn.MAX_TERMS)}).lexicon?.terms.map(r=>r.needle)??[]}function Ih(e){return t=>Sk(e,t).map(n=>({term_id:n.term_id,label:n.label,tier:n.tier,hit_count:n.hit_count}))}function Dh(e){let t=[];e.orgTerms&&t.push(`${e.orgTerms} of your organisation's (${e.from==="fetched"?"fetched now":`cached ${e.at??""}`.trim()})`),e.localTerms&&t.push(`${e.localTerms} of your own (nodata_scan_terms)`);let n=t.length?`TERMS ${t.join(" + ")}: each counted per file with its label and tier, never the text around it`:'NOT CHECKED: your own sensitive words (fund or deal names, codenames, holdings, "board decision"). This scan knows personal identifiers and secrets only. If the user names one, nodata_scan_terms action:"search" query:"<word>" path:"<folder>" says whether it is covered and how many files hold it.',r=fo()?"AMOUNTS treated as sensitive on this computer (reported, and replaced with [AMOUNT] in a clean copy).":'AMOUNTS kept as they are: a money amount is not reported, and a clean copy keeps it. If the amounts are the secret, nodata_scan_terms action:"amounts" on:true.';return[n,r,...e.notes.map(o=>` \u26A0 ${o}`)].filter(Boolean).join(`
|
|
147
147
|
`)}async function Sa(e=ka){let t=await Ch(e);return{...t.lexicon?{lexicon:Ih(t.lexicon)}:{},line:Dh(t)}}var Ek,Ph,Ak,Tk,xk,ka,Oi=H(()=>{"use strict";va();Yn();wr();Ek=()=>Nh(Rh(),".nodata","scan-lexicon.json"),Ph=()=>Nh(Rh(),".nodata","scan-terms.json"),Ak="scan-lexicon:org",Tk="scan-lexicon:local",xk=5e3,ka=null});import{existsSync as RI}from"node:fs";import{fileURLToPath as NI}from"node:url";function Ck(e=import.meta.url){for(let t of["./scan-worker.js","../dist/scan-worker.js"])try{let n=NI(new URL(t,e));if(RI(n))return n}catch{}return null}var Ik=H(()=>{"use strict";qe()});function xa(e){return e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim()}function jk(){return jh.map(e=>{let t=[...e.en,...e.he??[],...e.ar??[],...e.ru??[]].map(xa).filter(Boolean);return{type:e.type,tokens:t.filter(n=>!n.includes(" ")),phrases:t.filter(n=>n.includes(" "))}})}var Ne,OI,jh,Dk,Lh=H(()=>{"use strict";Ne=["GDPR","CPRA","PPL"],OI=["GDPR-9","CPRA","PPL"],jh=[{id:"person_name",type:"name",sensitivity:"high",regulations:[...Ne],en:["firstname","lastname","fname","lname","middle name","maiden name","birth name","preferred name","display name","nickname","surname","given name","full name"],he:["\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0","\u05DB\u05D9\u05E0\u05D5\u05D9","\u05E9\u05DD \u05E0\u05E2\u05D5\u05E8\u05D9\u05DD"],ar:["\u0627\u0644\u0627\u0633\u0645","\u0627\u0633\u0645 \u0627\u0644\u0639\u0627\u0626\u0644\u0629","\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0643\u0627\u0645\u0644"],ru:["\u0438\u043C\u044F","\u0444\u0430\u043C\u0438\u043B\u0438\u044F","\u043E\u0442\u0447\u0435\u0441\u0442\u0432\u043E","\u0444\u0438\u043E"]},{id:"birth_place",type:"location",sensitivity:"medium",regulations:[...Ne],en:["birth place","birthplace","place of birth"],he:["\u05DE\u05E7\u05D5\u05DD \u05DC\u05D9\u05D3\u05D4","\u05D0\u05E8\u05E5 \u05DC\u05D9\u05D3\u05D4"],ar:["\u0645\u0643\u0627\u0646 \u0627\u0644\u0645\u064A\u0644\u0627\u062F"],ru:["\u043C\u0435\u0441\u0442\u043E \u0440\u043E\u0436\u0434\u0435\u043D\u0438\u044F"]},{id:"citizenship",type:"sensitive_personal",sensitivity:"high",regulations:[...Ne],en:["citizenship","nationality"],he:["\u05D0\u05D6\u05E8\u05D7\u05D5\u05EA","\u05DC\u05D0\u05D5\u05DD"],ar:["\u0627\u0644\u062C\u0646\u0633\u064A\u0629"],ru:["\u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u0442\u0432\u043E"]},{id:"marital_status",type:"sensitive_personal",sensitivity:"high",regulations:[...Ne],en:["marital status"],he:["\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9"],ar:["\u0627\u0644\u062D\u0627\u0644\u0629 \u0627\u0644\u0627\u062C\u062A\u0645\u0627\u0639\u064A\u0629"],ru:["\u0441\u0435\u043C\u0435\u0439\u043D\u043E\u0435 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435"]},{id:"government_id",type:"id",sensitivity:"critical",regulations:[...Ne],en:["ssn","national id","passport","driver license","drivers license","tax id","social security","national insurance","military id","voter id","resident id","residence permit","visa number"],he:["\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7 \u05DC\u05D0\u05D5\u05DE\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D0\u05D9\u05E9\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D5\u05D9\u05D6\u05D4","\u05EA\u05E2\u05D5\u05D3\u05EA \u05EA\u05D5\u05E9\u05D1","\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05E1\u05E7"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0647\u0648\u064A\u0629","\u062C\u0648\u0627\u0632 \u0627\u0644\u0633\u0641\u0631","\u0631\u062E\u0635\u0629 \u0627\u0644\u0642\u064A\u0627\u062F\u0629"],ru:["\u043F\u0430\u0441\u043F\u043E\u0440\u0442","\u0441\u043D\u0438\u043B\u0441","\u0438\u043D\u043D","\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0443\u0434\u043E\u0441\u0442\u043E\u0432\u0435\u0440\u0435\u043D\u0438\u0435"]},{id:"institution_person_id",type:"tracking",sensitivity:"medium",regulations:[...Ne],en:["employee id","employee number","employee no","student id","student number","user id","userid","customer id","customer number","customer no","client id","member id","subscriber id","participant id","profile id","person id","person uuid","lead id","crm contact","account id"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05D1\u05D3","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D8\u05D5\u05D3\u05E0\u05D8","\u05DE\u05E1\u05E4\u05E8 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05D6\u05D4\u05D4 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E0\u05D5\u05D9","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05E9\u05EA\u05DE\u05E9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0648\u0638\u0641","\u0631\u0642\u0645 \u0627\u0644\u0639\u0645\u064A\u0644"],ru:["\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440","\u043D\u043E\u043C\u0435\u0440 \u043A\u043B\u0438\u0435\u043D\u0442\u0430"]},{id:"patient_id",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["patient id","patient number","mrn","medical record number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D8\u05D5\u05E4\u05DC","\u05DE\u05E1\u05E4\u05E8 \u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0631\u064A\u0636"],ru:["\u043D\u043E\u043C\u0435\u0440 \u043F\u0430\u0446\u0438\u0435\u043D\u0442\u0430"]},{id:"email",type:"email",sensitivity:"high",regulations:[...Ne],en:["emailaddress","e mail","recovery email","contact email"],he:["\u05D3\u05D5\u05D0\u05DC","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"],ar:["\u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0644\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A"],ru:["\u043F\u043E\u0447\u0442\u0430","\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430\u044F \u043F\u043E\u0447\u0442\u0430","email"]},{id:"phone",type:"phone",sensitivity:"high",regulations:[...Ne],en:["cellphone","contact number","work phone","home phone","whatsapp","recovery phone","telephone"],he:["\u05D8\u05DC\u05E4\u05D5\u05DF \u05D1\u05D9\u05EA","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D5\u05D5\u05D8\u05E1\u05D0\u05E4","\u05DE\u05E1\u05E4\u05E8 \u05E0\u05D9\u05D9\u05D3"],ar:["\u0647\u0627\u062A\u0641","\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062A\u0641","\u062C\u0648\u0627\u0644"],ru:["\u0442\u0435\u043B\u0435\u0444\u043E\u043D","\u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0439"]},{id:"social_handle",type:"tracking",sensitivity:"medium",regulations:[...Ne],en:["telegram","linkedin","facebook","twitter","instagram","tiktok","social profile"],he:["\u05D8\u05DC\u05D2\u05E8\u05DD","\u05DC\u05D9\u05E0\u05E7\u05D3\u05D0\u05D9\u05DF","\u05E4\u05D9\u05D9\u05E1\u05D1\u05D5\u05E7","\u05D0\u05D9\u05E0\u05E1\u05D8\u05D2\u05E8\u05DD"]},{id:"address",type:"address",sensitivity:"high",regulations:[...Ne],en:["house number","apartment","apt","billing address","shipping address","postal code","zip code","postcode","street"],he:["\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05EA","\u05D3\u05D9\u05E8\u05D4","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05DE\u05E9\u05DC\u05D5\u05D7","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05D7\u05D9\u05D5\u05D1","\u05EA.\u05D3","\u05EA\u05D0 \u05D3\u05D5\u05D0\u05E8"],ar:["\u0627\u0644\u0639\u0646\u0648\u0627\u0646","\u0627\u0644\u0634\u0627\u0631\u0639","\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A"],ru:["\u0430\u0434\u0440\u0435\u0441","\u0443\u043B\u0438\u0446\u0430","\u0438\u043D\u0434\u0435\u043A\u0441","\u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430"]},{id:"geo",type:"location",sensitivity:"high",regulations:[...Ne],en:["geo location","geolocation","latitude","longitude","coordinates","home location","current location"],he:["\u05DE\u05D9\u05E7\u05D5\u05DD","\u05E7\u05D5\u05D0\u05D5\u05E8\u05D3\u05D9\u05E0\u05D8\u05D5\u05EA"],ar:["\u0627\u0644\u0645\u0648\u0642\u0639"],ru:["\u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442\u044B"]},{id:"bank_card",type:"financial",sensitivity:"critical",regulations:[...Ne],en:["bank account","iban","swift","bic","routing number","credit card","creditcard","card number","cvv","card expiry","cc exp","paypal","wallet address","crypto wallet","bitcoin address"],he:["\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05D0\u05E8\u05E0\u05E7 \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5","\u05D0\u05E8\u05E0\u05E7 \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9"],ar:["\u062D\u0633\u0627\u0628 \u0628\u0646\u0643\u064A","\u0631\u0642\u0645 \u0627\u0644\u062D\u0633\u0627\u0628","\u0628\u0637\u0627\u0642\u0629 \u0627\u0626\u062A\u0645\u0627\u0646"],ru:["\u0440\u0430\u0441\u0447\u0435\u0442\u043D\u044B\u0439 \u0441\u0447\u0435\u0442","\u043D\u043E\u043C\u0435\u0440 \u0441\u0447\u0435\u0442\u0430","\u043D\u043E\u043C\u0435\u0440 \u043A\u0430\u0440\u0442\u044B","\u043A\u0440\u0435\u0434\u0438\u0442\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430"]},{id:"income_tax",type:"financial",sensitivity:"high",regulations:[...Ne],en:["salary","income","wage","tax record","tax return","payment history","credit score","net worth","salary grade"],he:["\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4","\u05EA\u05DC\u05D5\u05E9 \u05E9\u05DB\u05E8","\u05D3\u05D5\u05D7 \u05DE\u05E1","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD","\u05D3\u05D9\u05E8\u05D5\u05D2 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05D5\u05D5\u05D9 \u05E0\u05E7\u05D9","\u05D3\u05E8\u05D2\u05EA \u05E9\u05DB\u05E8"],ar:["\u0627\u0644\u0631\u0627\u062A\u0628","\u0627\u0644\u062F\u062E\u0644"],ru:["\u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430","\u0434\u043E\u0445\u043E\u0434"]},{id:"assets",type:"financial",sensitivity:"high",regulations:[...Ne],en:["property id","land record","ownership record","title deed","holdings"],he:["\u05D2\u05D5\u05E9 \u05D7\u05DC\u05E7\u05D4","\u05E0\u05E1\u05D7 \u05D8\u05D0\u05D1\u05D5","\u05E8\u05D9\u05E9\u05D5\u05DD \u05DE\u05E7\u05E8\u05E7\u05E2\u05D9\u05DF","\u05D1\u05E2\u05DC\u05D5\u05EA","\u05D0\u05D7\u05D6\u05E7\u05D5\u05EA"],ru:["\u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0441\u0442\u044C","\u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u044C"]},{id:"vehicle",type:"tracking",sensitivity:"medium",regulations:[...Ne],en:["vin","vehicle id","license plate","registration number","plate number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E9\u05DC\u05D3\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1","\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9"],ru:["\u043D\u043E\u043C\u0435\u0440 \u0430\u0432\u0442\u043E\u043C\u043E\u0431\u0438\u043B\u044F","vin"]},{id:"health",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["medical record","health condition","health data","lab result","lab results","vaccination","mental health","hospitalization","hospitalisation","disability","insurance number","diagnosis","allergy","prescription","medication","blood type"],he:["\u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05DE\u05E2\u05D1\u05D3\u05D4","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4","\u05D7\u05D9\u05E1\u05D5\u05E0\u05D9\u05DD","\u05D1\u05E8\u05D9\u05D0\u05D5\u05EA \u05E0\u05E4\u05E9","\u05D0\u05E9\u05E4\u05D5\u05D6","\u05E0\u05DB\u05D5\u05EA","\u05DE\u05E6\u05D1 \u05D1\u05E8\u05D9\u05D0\u05D5\u05EA\u05D9"],ar:["\u0627\u0644\u062A\u0634\u062E\u064A\u0635","\u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u0637\u0628\u064A","\u0627\u0644\u0623\u062F\u0648\u064A\u0629"],ru:["\u0434\u0438\u0430\u0433\u043D\u043E\u0437","\u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0430\u044F \u043A\u0430\u0440\u0442\u0430","\u0430\u043D\u0430\u043B\u0438\u0437\u044B"]},{id:"biometric",type:"biometric",sensitivity:"critical",regulations:["GDPR-9","CPRA","PPL"],en:["face embedding","face scan","iris scan","retina scan","voice print","voiceprint","voice signature","hand geometry","biometric template","biometric data","dna","genetic data","genome"],he:["\u05D8\u05D1\u05D9\u05E2\u05EA \u05E7\u05D5\u05DC","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E4\u05E0\u05D9\u05DD","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E7\u05E9\u05EA\u05D9\u05EA","\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D2\u05E0\u05D8\u05D9\u05D9\u05DD",'\u05D3\u05E0"\u05D0'],ar:["\u0628\u0635\u0645\u0629"],ru:["\u0431\u0438\u043E\u043C\u0435\u0442\u0440\u0438\u044F","\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A"]},{id:"employment",type:"employment",sensitivity:"medium",regulations:[...Ne],en:["employer","job title","employment status","hire date","start date of employment","termination date","performance review","disciplinary"],he:["\u05DE\u05E2\u05E1\u05D9\u05E7","\u05DE\u05E7\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05E4\u05E7\u05D9\u05D3 \u05D4\u05E2\u05D5\u05D1\u05D3","\u05EA\u05D0\u05E8\u05D9\u05DA \u05EA\u05D7\u05D9\u05DC\u05EA \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05D0\u05E8\u05D9\u05DA \u05E1\u05D9\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D4\u05E2\u05E8\u05DB\u05EA \u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD","\u05E9\u05D9\u05DE\u05D5\u05E2"],ar:["\u062C\u0647\u0629 \u0627\u0644\u0639\u0645\u0644","\u0627\u0644\u0645\u0633\u0645\u0649 \u0627\u0644\u0648\u0638\u064A\u0641\u064A"],ru:["\u0440\u0430\u0431\u043E\u0442\u043E\u0434\u0430\u0442\u0435\u043B\u044C","\u0434\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u044C"]},{id:"manager",type:"name",sensitivity:"medium",regulations:[...Ne],en:["manager","supervisor"],he:["\u05DE\u05E0\u05D4\u05DC \u05D9\u05E9\u05D9\u05E8"]},{id:"education",type:"education",sensitivity:"medium",regulations:[...Ne],en:["school","university","college","degree","transcript","education history","gpa"],he:["\u05D1\u05D9\u05EA \u05E1\u05E4\u05E8","\u05D0\u05D5\u05E0\u05D9\u05D1\u05E8\u05E1\u05D9\u05D8\u05D4","\u05DE\u05DB\u05DC\u05DC\u05D4","\u05D2\u05D9\u05DC\u05D9\u05D5\u05DF \u05E6\u05D9\u05D5\u05E0\u05D9\u05DD","\u05D4\u05E9\u05DB\u05DC\u05D4","\u05EA\u05D5\u05D0\u05E8 \u05D0\u05E7\u05D3\u05DE\u05D9"],ar:["\u0627\u0644\u062C\u0627\u0645\u0639\u0629","\u0627\u0644\u0645\u062F\u0631\u0633\u0629"],ru:["\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435","\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442"]},{id:"device_online",type:"tracking",sensitivity:"medium",regulations:[...Ne],en:["ip","ipaddress","ip address","mac address","device id","deviceid","advertising id","idfa","gaid","android id","apple id","cookie id","cookieid","browser fingerprint","user agent","imei"],he:["\u05DB\u05EA\u05D5\u05D1\u05EA ip","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"],ru:["ip \u0430\u0434\u0440\u0435\u0441"]},{id:"account",type:"tracking",sensitivity:"medium",regulations:[...Ne],en:["username","user name","login","screen name"],he:["\u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9"],ru:["\u043B\u043E\u0433\u0438\u043D"]},{id:"credential",type:"auth",sensitivity:"critical",regulations:[...Ne],en:["password","password hash","mfa secret","otp secret","security question","security answer","session id","session token","api key"],he:["\u05E1\u05D9\u05E1\u05DE\u05D4","\u05E1\u05D9\u05E1\u05DE\u05D0","\u05E9\u05D0\u05DC\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4"],ar:["\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631"],ru:["\u043F\u0430\u0440\u043E\u043B\u044C"]},{id:"behavior",type:"behavior",sensitivity:"high",regulations:[...Ne],en:["purchase history","search history","browsing history","clickstream","usage pattern","behavior profile","behaviour profile"],he:["\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05E8\u05DB\u05D9\u05E9\u05D5\u05EA","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D2\u05DC\u05D9\u05E9\u05D4","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA"]},{id:"special_category",type:"sensitive_personal",sensitivity:"critical",regulations:[...OI],en:["race","ethnicity","religion","political opinion","political party","union membership","trade union","sexual orientation","gender identity","criminal record"],he:["\u05D2\u05D6\u05E2","\u05D3\u05EA","\u05D4\u05E9\u05E7\u05E4\u05D4 \u05E4\u05D5\u05DC\u05D9\u05D8\u05D9\u05EA","\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05D9\u05D2\u05D5\u05D3","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA","\u05D6\u05D4\u05D5\u05EA \u05DE\u05D2\u05D3\u05E8\u05D9\u05EA","\u05E8\u05D9\u05E9\u05D5\u05DD \u05E4\u05DC\u05D9\u05DC\u05D9"],ar:["\u0627\u0644\u062F\u064A\u0627\u0646\u0629","\u0627\u0644\u0639\u0631\u0642"],ru:["\u0440\u0435\u043B\u0438\u0433\u0438\u044F","\u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C"]},{id:"family_names",type:"name",sensitivity:"high",regulations:[...Ne],en:["mother name","father name","spouse","partner name","emergency contact","next of kin","family member","guardian","beneficiary"],he:["\u05E9\u05DD \u05D4\u05D0\u05DD","\u05E9\u05DD \u05D4\u05D0\u05D1","\u05D1\u05DF \u05D6\u05D5\u05D2","\u05D1\u05EA \u05D6\u05D5\u05D2","\u05D0\u05D9\u05E9 \u05E7\u05E9\u05E8 \u05DC\u05D7\u05D9\u05E8\u05D5\u05DD","\u05E7\u05E8\u05D5\u05D1 \u05DE\u05E9\u05E4\u05D7\u05D4","\u05D0\u05E4\u05D5\u05D8\u05E8\u05D5\u05E4\u05D5\u05E1","\u05DE\u05D5\u05D8\u05D1"],ar:["\u0627\u0633\u0645 \u0627\u0644\u0623\u0645","\u0627\u0633\u0645 \u0627\u0644\u0623\u0628","\u0627\u0644\u0632\u0648\u062C"],ru:["\u0441\u0443\u043F\u0440\u0443\u0433","\u043E\u043F\u0435\u043A\u0443\u043D"]},{id:"children",type:"minor_data",sensitivity:"critical",regulations:[...Ne],en:["children","child name","dependents","dependants"],he:["\u05D9\u05DC\u05D3\u05D9\u05DD","\u05E9\u05DE\u05D5\u05EA \u05D4\u05D9\u05DC\u05D3\u05D9\u05DD"],ar:["\u0627\u0644\u0623\u0637\u0641\u0627\u0644"],ru:["\u0434\u0435\u0442\u0438"]}],Dk=["name","id","initials","title","gender","sex","country","state","province","company","department","grade","major","preferences","interests","expiry_date","hostname","tenant_id","external_id","account","location"]});function $a(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let o=0;o<9;o++){let i=parseInt(n[o]??"0",10)*(o%2+1);i>9&&(i-=9),r+=i}return r%10===0&&parseInt(n,10)>0}function Lk(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let o of n){let i=o>="A"&&o<="Z"?String(o.charCodeAt(0)-55):o;for(let s of i)r=(r*10+Number(s))%97}return r===1}function Fk(e){let t=String(e??"").replace(/\D/g,"");if(t.length<13||t.length>19||!/^[2-6]/.test(t))return!1;let n=0,r=!1;for(let o=t.length-1;o>=0;o--){let i=t.charCodeAt(o)-48;if(i<0||i>9)return!1;r&&(i*=2,i>9&&(i-=9)),n+=i,r=!r}return n%10===0}function Mk(e){if(!e)return null;let t=e.trim();for(let n of CI)if(n.pattern.test(t))return{type:n.type,label:n.label,labelHe:n.labelHe};return null}function Vl(e){if(!e||/^\[[A-Z_]+(?:-\d+)?\]$/.test(e.trim()))return null;let t=e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim();if(!t)return null;let n=new Set(t.match(/[\p{L}\p{N}]+/gu)??[]);for(let r of II)if(r.phrases?.some(i=>t.includes(i))||r.tokens?.some(i=>n.has(i)))return{type:r.type,label:r.type,labelHe:nn(r.type)};return null}function nn(e){return{id:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA",agent_id:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF",employment:"\u05E4\u05E8\u05D8\u05D9 \u05EA\u05E2\u05E1\u05D5\u05E7\u05D4",education:"\u05D4\u05E9\u05DB\u05DC\u05D4",behavior:"\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA",policy:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4",name:"\u05E9\u05DD \u05D0\u05D3\u05DD",email:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9",phone:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF",address:"\u05DB\u05EA\u05D5\u05D1\u05EA",dob:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4",financial:"\u05E4\u05E8\u05D8\u05D9\u05DD \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9\u05D9\u05DD",medical:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9",minor_data:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF",sensitive_personal:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9",biometric:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9",auth:"\u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA/\u05E1\u05D5\u05D3\u05D5\u05EA",tracking:"\u05DE\u05D6\u05D4\u05D9 \u05DE\u05E2\u05E7\u05D1",location:"\u05DE\u05D9\u05E7\u05D5\u05DD"}[e]??"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9"}function Bk(e){let t=0,n=0,r=0,o=0,i=0;for(let a of e)typeof a=="string"&&(DI.test(a.trim())&&$a(a)&&t++,Wl.lastIndex=0,Wl.test(a)&&n++,Gl.lastIndex=0,Gl.test(a)&&r++,Fh.lastIndex=0,[...a.matchAll(Fh)].some(c=>Lk(c[0]))&&o++,Fk(a)&&i++);let s=e.length||1;return t/s>=.3?{type:"id",label:"Israeli ID (sniffed)",matchedSample:t}:o/s>=.3?{type:"financial",label:"IBAN-IL (sniffed)",matchedSample:o}:n/s>=.3?{type:"phone",label:"IL phone (sniffed)",matchedSample:n}:r/s>=.3?{type:"email",label:"Email (sniffed)",matchedSample:r}:i/s>=.3?{type:"financial",label:"Credit card (sniffed)",matchedSample:i}:null}var CI,Wl,Gl,Fh,II,DI,ko=H(()=>{"use strict";Lh();CI=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם_אדם|שם הלקוח|שם_הלקוח|שם בן זוג|שם בן_זוג|שם המבוטח|שם_המבוטח|שם המוטב|שם_המוטב|שם מבוטח|שם_מבוטח|שם מוטב|שם_מוטב|שם הילד|שם_הילד|שם הקטין|שם_הקטין|firstname_he|lastname_he|shem|shem_mishpacha|shem_prati)$/i,type:"name",label:"Person name (Hebrew)",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מספר_זהות|מס' זהות|מס_זהות|מס' ת"ז|teudat_zehut|tz|t_z|israeli_id|il_id)$/i,type:"id",label:"Israeli ID",labelHe:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|מס דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה|מס רישיון|דרכון_מספר)$/i,type:"id",label:"Passport / DL (Hebrew)",labelHe:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|דואר_אלקטרוני|אימייל|כתובת מייל|כתובת_מייל|כתובת דואר|כתובת_דואר)$/i,type:"email",label:"Email (Hebrew)",labelHe:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|מספר_טלפון|טלפון נייד|טלפון_נייד|מס נייד|מס_נייד|מס' טל)$/i,type:"phone",label:"Phone (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|כתובת_מגורים|רחוב|מס בית|מספר בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|כתובת_מלאה|מען)$/i,type:"address",label:"Address (Hebrew)",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|תאריך_לידה|ת לידה|תאריך הולדת|תאריך_הולדת|יום הולדת|יום_הולדת|גיל)$/i,type:"dob",label:"Date of birth (Hebrew)",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|חשבון_בנק|מספר חשבון|מספר_חשבון|מס חשבון|מס' חשבון|בנק|סניף|מס סניף|iban|iban_il)$/i,type:"financial",label:"Bank account (Hebrew)",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|כרטיס_אשראי|מספר אשראי|מס אשראי|מס' אשראי|cvv|אשראי|מס כרטיס|מס_כרטיס)$/i,type:"financial",label:"Credit card (Hebrew)",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר_ברוטו|שכר נטו|שכר_נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"Salary / income (Hebrew)",labelHe:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|בדיקה_רפואית|מצב רפואי|מצב_רפואי|חיסון|תוצאת בדיקה|תוצאת_בדיקה|רופא|רגישות|אלרגיה|סוג דם|סוג_דם)$/i,type:"medical",label:"Medical (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מספר_פוליסה|מס פוליסה|מס' פוליסה|פוליסה|מספר חבר|מספר_חבר|מס חבר|מספר ביטוח|מספר_ביטוח|policy_?number|policy_?no|policy_?id)$/i,type:"policy",label:"Insurance policy number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"},{pattern:/^(?:מספר סוכן|מספר_סוכן|מס סוכן|מס' סוכן|מס_סוכן|קוד סוכן|קוד_סוכן|מספר משווק|מספר_משווק|מספר יצרן|סוכן ביטוח|agent_?number|agent_?no|agent_?id|agent_?code|broker_?id|broker_?number)$/i,type:"agent_id",label:"Insurance agent / broker number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"},{pattern:/^(?:שם הילד|שם_הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|מספר_ילדים|תעודת לידה|ת לידה ילד)$/i,type:"minor_data",label:"Minor data (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|נטייה_מינית|השקפה פוליטית|השקפה_פוליטית|מצב משפחתי|מצב_משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"Sensitive personal (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מספר_רכב|מס רכב|מס' רכב|לוחית רישוי|לוחית_רישוי|מספר רישוי|מספר_רישוי)$/i,type:"tracking",label:"Vehicle ID (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}];Wl=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g,Gl=/(?<!:\/\/[^\s/@]*)[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi,Fh=/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g;II=[{type:"biometric",tokens:["biometric","fingerprint","\u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"],phrases:["face id","\u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2"]},{type:"medical",tokens:["diagnosis","medical","disease","medication","prescription","allergy","vaccine","\u05D0\u05D1\u05D7\u05D5\u05DF","\u05D0\u05D1\u05D7\u05E0\u05D4","\u05DE\u05D7\u05DC\u05D4","\u05EA\u05E8\u05D5\u05E4\u05D4","\u05DE\u05E8\u05E9\u05DD","\u05D7\u05D9\u05E1\u05D5\u05DF","\u05D0\u05DC\u05E8\u05D2\u05D9\u05D4"],phrases:["medical record","blood type","\u05DE\u05E6\u05D1 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05E1\u05D5\u05D2 \u05D3\u05DD"]},{type:"sensitive_personal",tokens:["religion","ethnicity","nationality","\u05D3\u05EA","\u05DC\u05D0\u05D5\u05DD","\u05E2\u05D3\u05D4","\u05DE\u05D5\u05E6\u05D0"],phrases:["sexual orientation","marital status","\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA"]},{type:"minor_data",tokens:["minor","\u05E7\u05D8\u05D9\u05DF"],phrases:["child name","\u05E9\u05DD \u05D4\u05D9\u05DC\u05D3","\u05E9\u05DD \u05D4\u05E7\u05D8\u05D9\u05DF"]},{type:"id",tokens:["ssn","passport","\u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF"],phrases:["national id","id number","identity number","social security","driver license","driving license","drivers license","passport number","tax id","\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05DE\u05E1\u05E4\u05E8 \u05D6\u05D4\u05D5\u05EA","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"]},{type:"financial",tokens:["iban","swift","bic","salary","income","wage","\u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4"],phrases:["bank account","account number","credit card","card number","routing number","sort code","\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"]},{type:"policy",tokens:["policy","\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"],phrases:["policy number","member number","\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"]},{type:"agent_id",tokens:["\u05DE\u05E9\u05D5\u05D5\u05E7"],phrases:["agent number","agent code","broker id","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"]},{type:"dob",tokens:["dob","birthdate","birthday","\u05DC\u05D9\u05D3\u05D4","\u05D4\u05D5\u05DC\u05D3\u05EA","\u05D2\u05D9\u05DC"],phrases:["date of birth","birth date","\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"]},{type:"phone",tokens:["phone","tel","mobile","cell","fax","\u05D8\u05DC\u05E4\u05D5\u05DF","\u05E0\u05D9\u05D9\u05D3","\u05E4\u05DC\u05D0\u05E4\u05D5\u05DF","\u05E1\u05DC\u05D5\u05DC\u05E8\u05D9"],phrases:["phone number","mobile number","cell phone","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E0\u05D9\u05D9\u05D3"]},{type:"email",tokens:["email","mail","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC","\u05DE\u05D9\u05D9\u05DC","\u05D3\u05D5\u05D0\u05DC"],phrases:["email address","e mail","\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D9\u05D9\u05DC"]},{type:"address",tokens:["address","street","city","zipcode","zip","postcode","\u05DB\u05EA\u05D5\u05D1\u05EA","\u05E8\u05D7\u05D5\u05D1","\u05E2\u05D9\u05E8","\u05D9\u05E9\u05D5\u05D1","\u05D9\u05D9\u05E9\u05D5\u05D1","\u05DE\u05D9\u05E7\u05D5\u05D3","\u05DE\u05E2\u05DF"],phrases:["home address","postal code","street address","zip code","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D2\u05D5\u05E8\u05D9\u05DD"]},{type:"location",tokens:["gps","latitude","longitude","geolocation","\u05DE\u05D9\u05E7\u05D5\u05DD"],phrases:["gps coordinates"]},{type:"tracking",tokens:["plate","vehicle","\u05E8\u05DB\u05D1","\u05E8\u05D9\u05E9\u05D5\u05D9"],phrases:["license plate","vehicle number","plate number","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"]},...jk(),{type:"name",tokens:["name","\u05E9\u05DD"],phrases:["first name","last name","full name","family name","given name","surname","\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0"]}];DI=/^(?:\d{5,9}|\d{8}-\d)$/});var Ci,ql=H(()=>{Ci={_comment:"CANONICAL secret ruleset \u2014 the SINGLE SOURCE OF TRUTH for hardcoded-secret detection, loaded by BOTH the web scanner (lib/soc/exposure-map.ts) and the installed Capsule agent (apps/desktop/src-tauri/src/scanner.rs, via include_str!). Patterns are written in the regex subset both JavaScript and the Rust `regex` crate accept (no lookaround, no backreferences). A connection string counts only WITH credentials (user:pass@). Edit here once and both engines stay aligned.",rules:[{id:"aws-access-key",subkind:"aws_access_key",name:"AWS Access Key",severity:"critical",pattern:"(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)",hint:"AWS access key id detected. Rotate via IAM and move to an environment variable."},{id:"aws-secret-key",subkind:"aws_secret_key",name:"AWS Secret Key",severity:"critical",pattern:`(?:aws_secret_access_key|aws_secret_key|secret_access_key)\\s*[=:]\\s*['"]?[A-Za-z0-9/+=]{40}['"]?`,hint:"AWS secret access key detected. Rotate immediately."},{id:"gcp-api-key",subkind:"gcp_api_key",name:"GCP API Key",severity:"critical",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Google API key detected. Restrict or rotate it in the Google Cloud console."},{id:"gcp-service-account",subkind:"gcp_service_account",name:"GCP Service Account",severity:"critical",pattern:'"type"\\s*:\\s*"service_account"',hint:"GCP service-account JSON detected. Move it out of the repo and rotate the key."},{id:"github-token",subkind:"github_token",name:"GitHub Token",severity:"critical",pattern:"gh[pousr]_[0-9a-zA-Z]{36,}",hint:"GitHub token detected. Revoke at https://github.com/settings/tokens."},{id:"github-fine-grained",subkind:"github_fine_grained_token",name:"GitHub Fine-Grained Token",severity:"critical",pattern:"github_pat_[0-9a-zA-Z_]{22,}",hint:"GitHub fine-grained token detected. Revoke it in GitHub settings."},{id:"gitlab-token",subkind:"gitlab_token",name:"GitLab Token",severity:"critical",pattern:"glpat-[0-9a-zA-Z_-]{20,}",hint:"GitLab token detected. Revoke it in GitLab access tokens."},{id:"stripe-secret",subkind:"stripe_key",name:"Stripe Secret Key",severity:"critical",pattern:"sk_live_[0-9a-zA-Z]{24,}",hint:"Stripe live secret key detected. Roll it in the Stripe dashboard."},{id:"stripe-restricted",subkind:"stripe_restricted_key",name:"Stripe Restricted Key",severity:"critical",pattern:"rk_live_[0-9a-zA-Z]{24,}",hint:"Stripe restricted key detected. Roll it in the Stripe dashboard."},{id:"slack-token",subkind:"slack_token",name:"Slack Token",severity:"high",pattern:"xox[baprs]-[0-9a-zA-Z-]{10,}",hint:"Slack token detected. Revoke it in the Slack app settings."},{id:"slack-webhook",subkind:"slack_webhook",name:"Slack Webhook",severity:"high",pattern:"hooks\\.slack\\.com/services/T[0-9A-Z]{8,}/B[0-9A-Z]{8,}/[0-9a-zA-Z]{24}",hint:"Slack incoming-webhook URL detected. Regenerate it."},{id:"twilio-api-key",subkind:"twilio_api_key",name:"Twilio API Key",severity:"high",pattern:"SK[0-9a-fA-F]{32}",hint:"Twilio API key detected. Rotate it in the Twilio console."},{id:"sendgrid-api-key",subkind:"sendgrid_api_key",name:"SendGrid API Key",severity:"critical",pattern:"SG\\.[0-9a-zA-Z_-]{22}\\.[0-9a-zA-Z_-]{43}",hint:"SendGrid API key detected. Rotate it in the SendGrid console."},{id:"postgres-uri",subkind:"postgres_uri",name:"PostgreSQL Connection String",severity:"critical",pattern:`postgres(?:ql)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"PostgreSQL connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"mongodb-uri",subkind:"mongodb_uri",name:"MongoDB Connection String",severity:"critical",pattern:`mongodb(?:\\+srv)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"MongoDB connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"redis-uri",subkind:"redis_uri",name:"Redis Connection String",severity:"high",pattern:`redis(?:s)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"Redis connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"openai-key",subkind:"openai_key",name:"OpenAI API Key",severity:"critical",pattern:"sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}",hint:"OpenAI API key detected. Rotate at https://platform.openai.com/api-keys."},{id:"anthropic-key",subkind:"anthropic_key",name:"Anthropic API Key",severity:"critical",pattern:"sk-ant-[0-9a-zA-Z_-]{40,}",hint:"Anthropic API key detected. Rotate at https://console.anthropic.com/."},{id:"firebase-key",subkind:"firebase_key",name:"Firebase API Key",severity:"high",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Firebase API key detected. Restrict it in the Firebase console."},{id:"supabase-key",subkind:"supabase_key",name:"Supabase Service Key",severity:"critical",pattern:"eyJ[0-9a-zA-Z_-]{100,}",hint:"Long JWT (possible Supabase service key) detected. Rotate it and keep it server-side only."},{id:"private-key",subkind:"private_key",name:"Private Key",severity:"critical",pattern:"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----",hint:"Private key material in plaintext. Rotate immediately and move to a key manager (KMS/Vault).",skipPlaceholder:!0},{id:"jwt-secret",subkind:"jwt_secret",name:"JWT/Generic Secret",severity:"high",pattern:`(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded signing/API secret detected. Move it to an environment variable and rotate it."},{id:"password-in-code",subkind:"password_in_code",name:"Password in Code",severity:"high",pattern:`(?:password|passwd|pwd)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded password detected. Move it to a secret manager and rotate it."},{id:"bearer-token",subkind:"bearer_token",name:"Bearer Token in Code",severity:"high",pattern:`['"]Bearer\\s+[0-9a-zA-Z._-]{20,}['"]`,hint:"Hardcoded bearer token detected. Move it to a secret manager and rotate it."},{id:"hex-secret-32",subkind:"hex_secret",name:"Hardcoded 32+ Hex Secret",severity:"medium",pattern:`['"][0-9a-f]{32,}['"]`,hint:"Long hex string that looks like a secret/hash. Confirm it is not a live credential."},{id:"base64-secret",subkind:"base64_secret",name:"Hardcoded Base64 Secret (long)",severity:"medium",pattern:`['"][A-Za-z0-9+/]{64,}={0,2}['"]`,hint:"Long base64 blob that looks like an embedded secret. Confirm it is not a live credential."}]}});var Hk=H(()=>{"use strict"});function Uk(e,t){if(MI.test(e)||/^name$/i.test(e)||t&&BI.test(t)||HI.test(e))return null;for(let r of FI)if(r.pattern.test(e))return r.type;let n=Mk(e);return n?n.type:null}var FI,MI,BI,HI,zG,YG,JG,Kk=H(()=>{"use strict";ko();ql();Hk();FI=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D6\u05D4\u05D4"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Financial data",labelHe:"\u05E0\u05EA\u05D5\u05DF \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(ip_?address)$/i,type:"tracking",label:"IP address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA IP"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D3\u05E8\u05DB\u05D5\u05DF"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license",labelHe:"\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"},{pattern:/^(iban|swift_?code|bic)$/i,type:"financial",label:"Banking code",labelHe:"\u05E7\u05D5\u05D3 \u05D1\u05E0\u05E7\u05D0\u05D9"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E1"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Member ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7/\u05D7\u05D1\u05E8"},{pattern:/^(blood_?type|allergy|allergies|prescription)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation",labelHe:"\u05DE\u05D9\u05E7\u05D5\u05DD \u05D2\u05D9\u05D0\u05D5\u05D2\u05E8\u05E4\u05D9"},{pattern:/^(mac_?address|device_?fingerprint|imei|serial_?number)$/i,type:"tracking",label:"Device identifier",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"},{pattern:/^(ethnicity|race|religion|political_?affiliation|sexual_?orientation)$/i,type:"sensitive_personal",label:"Sensitive personal",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(minor|child_?name|child_?age|dependent)$/i,type:"minor_data",label:"Minor data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05E0\u05D9\u05DD"},{pattern:/^(signature|digital_?signature)$/i,type:"id",label:"Signature",labelHe:"\u05D7\u05EA\u05D9\u05DE\u05D4"},{pattern:/^(vehicle_?number|license_?plate|plate_?number)$/i,type:"tracking",label:"Vehicle ID",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05E8\u05DB\u05D1"}],MI=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|sort_?order|position|enabled|active|public|version|metadata|config|settings|options|data|content|body|raw|json|text|note|comment|label|color|icon|image|avatar|logo|thumbnail|preview|template|schema|format|mode|level|priority|severity|source|target|parent|child|owner|creator|modifier|assignee|project|workspace|organization|team|group|channel|thread|room|session|device|platform|browser|locale|timezone|currency|country|region|city|zip|postal|state|province|name|display_?name|user_?agent|password_?hash|secret|token|private_?key|auth_?token|constraint|index|sequence|trigger|function|procedure|database|namespace|migration|revision)$/i,BI=/^(beacon_?registr|device_?config|hardware|sensor|firmware|telemetry|metric|analytic|log_?event|audit_?log|system_?config|cache|queue|job|migration|schema_?version|spatial_?ref)/i,HI=/^(minor|major|uuid|rssi|tx_?power|beacon_?id|device_?type|firmware_?version|batch_?id|zone_?id)$/i;zG=Ci.rules.map(e=>({id:e.id,name:e.name,pattern:new RegExp(e.pattern),severity:e.severity})),YG=512*1024,JG=50*1024*1024});function KI(e){if(e.length!==9)return!1;let t=e.split("").map(Number),n=0;for(let r=0;r<9;r++){let o=t[r]*(r%2===0?1:2);o>9&&(o-=9),n+=o}return n%10===0}var UI,Ii,Mh=H(()=>{"use strict";UI=[{type:"id_number",patterns:[/\b\d{9}\b/g,/ת\.?ז\.?\s*:?\s*(\d{9})/g,/זהות\s*:?\s*(\d{9})/g],confidence:.9,replacement:()=>"[\u05EA.\u05D6. \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"phone",patterns:[/\b0[2-9]\d[\s\-]?\d{7}\b/g,/\b05[0-9][\s\-]?\d{7}\b/g,/\+972[\s\-]?[2-9]\d[\s\-]?\d{7}\b/g],confidence:.95,replacement:()=>"[\u05D8\u05DC\u05E4\u05D5\u05DF \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"email",patterns:[/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g],confidence:.99,replacement:e=>{let[,t]=e.split("@");return`[\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC: ***@${t}]`}},{type:"full_name",patterns:[/(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק)[:\s]+([א-ת][א-ת"'\-\s]{2,30}?)(?=[,\n\d]|ת\.ז)/g,/(?:עו"ד|ד"ר|פרופ'|מר|גברת)\s+([א-ת][א-ת"'\-\s]{2,25}?)(?=[,\n])/g],confidence:.75,replacement:()=>"[\u05E9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"bank_account",patterns:[/\b\d{2}[\-]\d{5,9}[\-]\d{2,3}\b/g,/(?:חשבון|ח-ן)\s*:?\s*(\d[\d\-]{8,15})/g],confidence:.88,replacement:()=>"[\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"medical",patterns:[/(?<![א-ת])[בהוכלמש]{0,2}(?:סוכרת|יתר לחץ דם|אסתמה|דיכאון|חרדה|סרטן|אי ספיקת לב|אפילפסיה)(?![א-ת])/g,/\b(?:Metformin|Lisinopril|Atorvastatin|Amlodipine|Sertraline|Fluoxetine|Omeprazole|Warfarin|Aspirin|Insulin)\b/gi,/\bHbA1c\s*:?\s*[\d.]+%?/g,/\bBMI\s*:?\s*[\d.]+/g,/(?<![א-ת])[בהוכלמש]{0,2}אבחנ[הות]\s*:?\s*[^,\n.]{2,40}/g,/\b(?:Diagnosis|diagnosed\s+with)\s*:?\s*[^,\n.]{2,40}/gi,/\b(?:(?:type\s*[12]\s+)?diabetes(?:\s+mellitus)?|hypertension|asthma|epilepsy|schizophrenia|bipolar\s+disorder|HIV|hepatitis(?:\s+[A-C]\b)?|heart\s+failure|COPD|multiple\s+sclerosis|Crohn'?s\s+disease)\b/gi,/(?<![א-ת])[בהוכלמש]{0,2}(?:אינסולין|מטפורמין|אספירין|קומדין|אומפרדקס|פרוזק|ציפרלקס|אטורבסטטין|אמלודיפין)(?![א-ת])/g],confidence:.85,replacement:()=>"[\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"financial_amount",patterns:[/[\d,]+(?:\.\d{2})?\s*(?:₪|ש"ח|NIS|שקל(?:ים)?)/g,/(?:₪|NIS)\s*[\d,]+(?:\.\d{2})?/g],confidence:.92,replacement:()=>"[\u05E1\u05DB\u05D5\u05DD \u05DB\u05E1\u05E4\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"birth_date",patterns:[/(?:תאריך לידה|נולד|נולדה|ד\.ל\.)\s*:?\s*\d{1,2}[\/\.\-]\d{1,2}[\/\.\-]\d{2,4}/g,/(?<![א-ת])[בהוכלמש]{0,2}גיל\s*:?\s*\d{1,3}\b/g],confidence:.88,replacement:()=>"[\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"address",patterns:[/רחוב\s+[א-ת][א-ת\s"'\-]{2,30}\s+\d{1,5}/g,/(?:רח'|רח\.)\s+[א-ת][א-ת\s"'\-]{2,30}\d{1,5}/g],confidence:.72,replacement:()=>"[\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"},{type:"license_plate",patterns:[/\b\d{2,3}[\-]\d{2,3}[\-]\d{2,3}\b/g],confidence:.8,replacement:()=>"[\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"}];Ii=class{constructor(t){this.enabledTypes=new Set(t)}detect(t){let n=[],r=new Set;for(let i of UI)if(this.enabledTypes.has(i.type))for(let s of i.patterns){let a=new RegExp(s.source,s.flags),c;for(;(c=a.exec(t))!==null;){let l=c[0],d=`${i.type}:${c.index}`;if(!r.has(d)){if(r.add(d),i.type==="id_number"){let u=l.replace(/\D/g,"");if(/^\d{9}$/.test(l)&&u.length===9&&!KI(u))continue}n.push({type:i.type,value:l,startIndex:c.index,endIndex:c.index+l.length,confidence:i.confidence,replacement:i.replacement(l,i.type)})}}}n.sort((i,s)=>i.startIndex-s.startIndex||s.confidence-i.confidence);let o=[];for(let i of n)o.some(a=>i.startIndex<a.endIndex&&i.endIndex>a.startIndex)||o.push(i);return o}}});function VI(e,t,n,r){if(r==="address")return{start:t,end:n};let o=GI.exec(e.slice(t,n));return o&&t+o[0].length<n?{start:t+o[0].length,end:n}:{start:t,end:n}}function rn(e,t,n=()=>!0){let r=[],o=new RegExp(e.source,e.flags.includes("g")?e.flags:e.flags+"g");for(let i of t.matchAll(o)){let s=i[1];if(!s||!n(s))continue;let a=(i.index??0)+i[0].indexOf(s);r.push({start:a,end:a+s.length})}return r}function lD(e){let t=new Map;for(let n of e){let r=t.get(n.kind);t.set(n.kind,r?{...r,find:o=>[...r.find(o),...n.find(o)]}:n)}return[...t.values()]}function Vk(){let e=WI.map(({type:t,kind:n,severity:r,hint:o})=>{let i=new Ii([t]);return{kind:n,severity:r,hint:o,find:s=>i.detect(s).map(a=>VI(s,a.startIndex,a.endIndex,n))}});return lD([...e,...cD])}var WI,GI,Wk,Bh,qI,zI,YI,JI,XI,ZI,QI,eD,tD,nD,rD,Gk,oD,iD,sD,aD,cD,Hh=H(()=>{"use strict";Mh();ko();WI=[{type:"full_name",kind:"name",severity:"medium",hint:`A person's name in free text (after a role word such as \u05DC\u05E7\u05D5\u05D7 / \u05DE\u05E8 / \u05E2\u05D5"\u05D3, or Client: / Mr.).`},{type:"bank_account",kind:"bank_account",severity:"high",hint:"An Israeli bank account number (branch-account-check form) in plaintext."},{type:"medical",kind:"medical",severity:"high",hint:"Medical information (diagnosis, medication, lab value) in plaintext."},{type:"birth_date",kind:"dob",severity:"medium",hint:"A date of birth in plaintext."},{type:"address",kind:"address",severity:"medium",hint:"A street address in plaintext."},{type:"license_plate",kind:"plate",severity:"low",hint:"A vehicle licence plate in plaintext."}],GI=/^(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק|עו"ד|ד"ר|פרופ'|מר|גברת|חשבון|ח-ן|[בהוכלמש]{0,2}אבחנ[הות]|תאריך לידה|נולד|נולדה|ד\.ל\.|[בהוכלמש]{0,2}גיל|[Dd]iagnosis|[Dd]iagnosed\s+with)\s*:?\s*/;Wk=String.raw`[A-Z][a-z']+(?:-[A-Z]?[a-z']+)*`,Bh=String.raw`${Wk}(?:[ \t]+${Wk}){0,2}`,qI=new RegExp(String.raw`\b(?:Mr|Mrs|Ms|Miss|Dr|Prof)\.?[ \t]+(${Bh})`),zI=new RegExp(String.raw`\b(?:Client|Customer|Patient|Name|Full name|Beneficiary|Insured|Applicant|Tenant|Employee|Holder|Investor)[ \t]*:[ \t]*(${Bh})`),YI=new RegExp(String.raw`\b(${Bh})(?=,[ \t]*\d{1,3}[ \t]*,|[ \t]*\(\d{1,3}\))`,"g"),JI=/^(?:Figure|Fig|Table|Step|Section|Chapter|Page|Shot|Scene|Part|Item|Note|Appendix|Version|Level|Phase|Round|Room|Floor|Line|Act|Episode|Season|Slide|Clip|Take)$/,XI=/\b(\d{1,5}[ \t]+(?:[A-Z][A-Za-z'-]*[ \t]+){1,3}(?:Street|St|Road|Rd|Avenue|Ave|Boulevard|Blvd|Lane|Ln|Drive|Way|Court|Ct|Place|Pl)\b\.?)/,ZI=/\b(?:policy|claim|account|member|customer|client|contract|case|reference|ref|company|registration)[ \t]+(?:number|no\.?|num\.?|#)[ \t]*:?[ \t]*([A-Z]{0,4}-?\d[\d-]{3,}\d[A-Z]?)\b/i,QI=String.raw`\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{2,4}|\d{4}[\/\-.]\d{1,2}[\/\-.]\d{1,2}|\d{1,2}\s+[A-Z][a-z]{2,8}\s+\d{4}|[A-Z][a-z]{2,8}\s+\d{1,2},?\s+\d{4}`,eD=new RegExp(String.raw`\b(?:date\s+of\s+birth|birth\s*date|d\.?o\.?b\.?|born(?:\s+on)?)\s*[:\-]?\s*(${QI})`,"i"),tD=/\b((?!000|666|9\d\d)\d{3}-(?!00)\d{2}-(?!0000)\d{4})\b/,nD=/\b((?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\s?\d{2}\s?\d{2}\s?\d{2}\s?[A-D])\b/,rD=/(?<![\w+])(\+(?!972)[1-9][\d\s().-]{7,20}\d)/,Gk=e=>e.replace(/\D/g,"").length,oD=String.raw`(?:(?<![א-ת])ת["'׳״]?\.?ז\.?|תעודת[\s_]?זהות|מספר[\s_]?זהות|מס['׳]?[\s_]?זהות|\bID[ \t]*(?:No\.?|Number|#)|\bnational[ \t]+ID|\bidentity[ \t]+(?:No\.?|number)|\bteudat[\s_]?zehut)`,iD=new RegExp(String.raw`${oD}[ \t]*[:#.\-]?[ \t]*(\d[\d \t-]{6,10}\d)(?![\d-])`,"i"),sD=e=>{let t=e.replace(/\D/g,"");return t.length!==8&&t.length!==9||/^\d{9}$/.test(e)||/^\d{8}-\d$/.test(e)?!1:$a(t)},aD=/(?:(?<![א-ת])דרכון|\bpassport(?:[ \t]*(?:No\.?|Number|#))?)[ \t]*[:#.\-]?[ \t]*([A-Z]{0,2}\d{6,9})(?![\dA-Z])/i,cD=[{kind:"name",severity:"medium",hint:"A person's name in free text (after Mr. / Dr. / Client: \u2026, or with an age beside it).",find:e=>[...rn(qI,e),...rn(zI,e),...rn(YI,e,t=>!t.split(/[ \t]/).some(n=>JI.test(n)))]},{kind:"address",severity:"medium",hint:"A street address in plaintext.",find:e=>rn(XI,e)},{kind:"reference",severity:"medium",hint:"A policy, claim, account or company number in plaintext.",find:e=>rn(ZI,e)},{kind:"dob",severity:"medium",hint:"A date of birth in plaintext.",find:e=>rn(eD,e)},{kind:"national_id",severity:"high",hint:"A national ID number (an Israeli ID after its word, US SSN, UK NINO) in plaintext.",find:e=>[...rn(tD,e),...rn(nD,e),...rn(iD,e,sD)]},{kind:"passport",severity:"high",hint:"A passport number, after the word that announces it, in plaintext.",find:e=>rn(aD,e)},{kind:"phone",severity:"high",hint:"A phone number in international form in plaintext.",find:e=>rn(rD,e,t=>Gk(t)>=8&&Gk(t)<=15)}]});function Ea(e){return zk[e]}function uD(e){return zk[e]??"low"}function Yk(e,t){let n=[];for(let r of t){let o=r.rows.length;for(let i=0;i<r.headers.length;i++){let s=r.headers[i]??"",a=s?Uk(s.trim().replace(/["'`׳״:]/g,"").replace(/\s+/g,"_"),r.name)??Vl(s)?.type??null:null,c=[];for(let d of r.rows){let u=d[i];typeof u=="string"&&u.length>0&&c.push(u)}let l=c.length>0?Bk(c):null;l?n.push(qk(e,r.name,s,l.type,l.label,"value",l.matchedSample,o)):a&&n.push(qk(e,r.name,s,a,nn(a),"header",0,o))}}return n}function qk(e,t,n,r,o,i,s,a){return{file:e,location:t,column:n,type:r,label:o,category:nn(r),severity:uD(r),matchKind:i,hits:s,sampleSize:a}}var dD,lV,zk,zl=H(()=>{"use strict";ko();Kk();Hh();ql();dD=new Set(["hex-secret-32","base64-secret"]),lV=Ci.rules.filter(e=>!dD.has(e.id)).map(e=>new RegExp(e.pattern,"g")),zk={id:"critical",agent_id:"high",policy:"high",financial:"critical",medical:"critical",sensitive_personal:"critical",minor_data:"critical",biometric:"critical",auth:"critical",name:"high",email:"high",phone:"high",address:"high",dob:"high",location:"high",tracking:"medium",employment:"high",education:"medium",behavior:"high"}});function Jk(e){let t=e.split(":")[0].trim().toLowerCase().replace(/_in_name$/,"");return pD[t]??t}var pD,Uh=H(()=>{"use strict";zl();pD={israeli_id:"id",israeli_id_value:"id",ssn:"id",passport:"id",passport_keyword:"id",id_number:"id",credit_card:"financial",iban:"financial",israeli_iban:"financial",israeli_iban_value:"financial",bank_account:"financial",israeli_phone:"phone",israeli_phone_value:"phone",mobile:"phone",email_address:"email"}});function Xk(e,t,n=2,r=[]){let o=[];for(let i of e){let s=i.path.split("/").length;if(s>n)continue;let a=t.filter(p=>i.kind==="file"?p.file===i.path:p.file.startsWith(`${i.path}/`)),c=null,l=new Map;for(let p of a)(!c||kr[p.severity]>kr[c])&&(c=p.severity),l.set(p.category,(l.get(p.category)??0)+1);let d=[...l.entries()].sort((p,f)=>f[1]-p[1]).map(([p])=>p),u=r.some(p=>i.kind==="file"?p===i.path:p.startsWith(`${i.path}/`));o.push({path:i.path,kind:i.kind,depth:s,severity:c,categories:d,...u?{unread:u}:{}})}return o.sort((i,s)=>i.path.localeCompare(s.path))}function Zk(e){let t=new Map;for(let n of e){let r=t.get(n.category);r?(kr[n.severity]>kr[r.severity]&&(r.severity=n.severity),r.files.add(n.file)):t.set(n.category,{severity:n.severity,files:new Set([n.file])})}return[...t.entries()].map(([n,r])=>({category:n,severity:r.severity,files:r.files.size})).sort((n,r)=>kr[r.severity]-kr[n.severity]||r.files-n.files||n.category.localeCompare(r.category))}function Qk(e){return new Set(e.filter(t=>kr[t.severity]>=kr.high).map(t=>t.category))}function e0(e,t){return Object.fromEntries(e.map(n=>n.unread?[n.path,"closed"]:n.categories.some(r=>t.has(r))?[n.path,n.severity==="critical"?"closed":"clean"]:[n.path,"folder"]))}function t0(e){let t=Object.keys(e).sort(),n=[];for(let r of t){let o=e[r];if(o==="folder")continue;let i=n.filter(s=>r.startsWith(`${s.path}/`)).pop();i&&(i.effect==="deny"||i.effect===(o==="closed"?"deny":"clean_copy"))||n.push({path:r,effect:o==="closed"?"deny":"clean_copy"})}return n}function n0(e){return JSON.stringify({surface:"ai.folder.policy",ceiling:e.ceiling,allowed:e.allowed.map(t=>`${t.category}:${t.count}`).sort(),blocked:e.blocked.map(t=>`${t.category}:${t.count}`).sort()})}var kr,r0=H(()=>{"use strict";Uh();kr={critical:4,high:3,medium:2,low:1}});var o0,i0=H(()=>{"use strict";o0={he:"\u05D4\u05DE\u05E2\u05E8\u05DB\u05EA \u05DE\u05E6\u05D0\u05D4 \u05DE\u05D9\u05D3\u05E2 \u05E8\u05D2\u05D9\u05E9, \u05D0\u05D5 \u05DE\u05D9\u05D3\u05E2 \u05E9\u05E2\u05E9\u05D5\u05D9 \u05DC\u05D4\u05EA\u05E4\u05E8\u05E9 \u05DB\u05E8\u05D2\u05D9\u05E9. \u05DB\u05D3\u05D0\u05D9 \u05DC\u05E2\u05D1\u05D5\u05E8 \u05E2\u05DC\u05D9\u05D5 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DE\u05D7\u05DC\u05D9\u05D8\u05D9\u05DD. \u05D4\u05E1\u05D5\u05E8\u05E7 \u05DE\u05DB\u05D5\u05D5\u05DF \u05DC\u05E1\u05DE\u05DF \u05D5\u05DC\u05D0 \u05DC\u05E4\u05E1\u05E4\u05E1, \u05D5\u05DC\u05DB\u05DF \u05D7\u05DC\u05E7 \u05DE\u05D4\u05E1\u05D9\u05DE\u05D5\u05E0\u05D9\u05DD \u05E2\u05E9\u05D5\u05D9\u05D9\u05DD \u05DC\u05D4\u05D9\u05D5\u05EA \u05D6\u05D4\u05D9\u05E8\u05D9\u05DD \u05DE\u05D3\u05D9.",en:"The system found sensitive information, or information that may read as sensitive. Please look it over before you decide. The scanner is tuned to flag rather than miss, so some marks may be over-cautious."}});function xo(e){if(e.error)return{grade:"FAILED",reasons:[`the scan did not run: ${e.error}`]};if(e.files_walked>0&&e.files_inspected===0)return{grade:"FAILED",reasons:[`${e.files_walked} files walked, none read`]};let t=e.coverage,n=[],r=Ct(t)-(t?.not_read??[]).filter(o=>o.cls!=="no_text"&&$e(o.path)).length;return r&&n.push(`${r} file(s) not read`),t?.hit_file_cap?n.push(`stopped after ${t.max_files} files`):t?.not_reached?.length&&n.push(`not reached: ${t.not_reached.slice(0,5).join(", ")}${t.not_reached.length>5?` +${t.not_reached.length-5}`:""}`),t?.hit_time_cap&&n.push(`time limit: ${t.time_skipped??"some"} file(s) not reached`),t?.hit_depth_cap&&n.push(`folders deeper than ${t.max_depth} levels not walked`),t?.ocr_skipped&&n.push(`${t.ocr_skipped} picture(s) / scanned page(s) not read by OCR in time`),t?.files_too_large&&n.push(`${t.files_too_large} file(s) too large to read`),t?.files_sampled_only&&n.push(`${t.files_sampled_only} long text file(s): only the first ${Math.round((t.sample_bytes??0)/1024)} KB checked`),t?.documents_truncated&&n.push(`${t.documents_truncated} document(s) longer than the reader's limit`),t?.uncertain_files?.length&&n.push(`${t.uncertain_files.length} PDF(s) where the two readers disagreed`),t?.ocr_files?.length&&n.push(`${t.ocr_files.length} file(s) read by OCR: a digit can be misread`),{grade:n.length?"PARTIAL":"COMPLETE",reasons:n}}function $n(e){let t=[...new Set(e.findings.filter(i=>!So(i)&&!Kh(i)).map(i=>i.relative_path))].filter(i=>!$e(i)).sort(),n=new Set(t),r=new Set,o=i=>{!n.has(i)&&!$e(i)&&r.add(i)};for(let i of e.coverage?.unreadable_files??[])o(i);for(let i of e.coverage?.not_read??[])hD.has(i.cls)&&o(i.path);return{withFindings:t,unread:[...r].sort()}}function En(e){let t=xo(e),n=$n(e);return{verdict:t.grade==="FAILED"?"UNKNOWN":n.withFindings.length||n.unread.length?"NOT_READY":t.grade==="PARTIAL"?"NOT_PROVEN":"READY",quality:t,exposed:n}}function Yl(e,t,n){let{verdict:r,quality:o,exposed:i}=En(e),s=c=>JSON.stringify(c),a=n?`none. The person chose in the dialog and it was done: ${n}`:r==="UNKNOWN"?`fix what stopped the scan (above), then nodata_scan_folder path: ${s(t)} again.`:r==="NOT_READY"||r==="NOT_PROVEN"?`nodata_clean_folder path: ${s(t)}, now and without asking: it builds a verified clean folder NEXT to this one and changes nothing in it. That folder is what the user gives the model.`:'none. For an agent on another computer still use nodata_expose (view "clean"): every file it asks for is checked again as it leaves.';return["","IRON CHAIN: computed from this scan, not an opinion. Relay it as it is.",` 1 SCAN done \xB7 ${e.files_walked} files walked, ${e.files_inspected} read`,` 2 QUALITY ${o.grade}${o.reasons.length?`: ${o.reasons.join("; ")}`:""}`,` 3 FOUND ${i.withFindings.length} file(s) with findings \xB7 ${i.unread.length} file(s) not read (unchecked = sensitive)`,` 4 DELIVER ${r==="NOT_READY"||r==="NOT_PROVEN"?"a clean folder next to this one (nodata_clean_folder), nothing here changed":"not needed"}`,...i.withFindings.length?[` NOTE ${o0.en}`]:[],` VERDICT ${gD[r]}`,` NEXT (mandatory, before anything else): ${a}`,...!n&&(r==="NOT_READY"||r==="NOT_PROVEN")?[" YOUR REPLY: one line of what was found, then run nodata_clean_folder and lead with the folder it delivers. Offer no other route: no git clone, no copy of your own, no editing or deleting files, no script, no listing of the folder. Locking and deleting originals (nodata_plan) is going further, only if the user asks."]:[],' AN AGENT GETS DATA ONLY THROUGH NODATA: on another computer \u2192 nodata_expose (view "clean"); from a database \u2192 nodata_register_table + nodata_grant (allowed columns only); here \u2192 the clean copies (nodata_redact / nodata_plan). Never the folder itself while the verdict is not READY.'].join(`
|
|
@@ -442,7 +442,7 @@ Finish it once in the console (Recovery setup), then wrap again. NoData never se
|
|
|
442
442
|
`,{mode:384})}catch{}return l_("sha256").update(n).digest("hex").slice(0,16)}function _1(e){let t=j3(e),n=L3(t.map(r=>r.id));return["ANSWER FROM THE NODATA ANSWER BANK \u2014 relay this in the user's language, and nothing beyond it:","",...t.map(r=>`\u2022 ${r.answer}`),"",`Source: NoData answer bank ${y1} \xB7 entries: ${t.map(r=>r.id).join(", ")} \xB7 recorded ${n} in ~/.nodata/answers.log`].join(`
|
|
443
443
|
`)}wa();import{existsSync as S1,mkdirSync as F3,readFileSync as M3,writeFileSync as B3}from"node:fs";import{homedir as f_}from"node:os";import{join as h_}from"node:path";var H3=60*6e4;function U3(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}var u_=()=>h_(f_(),".nodata","connection.json"),K3=()=>h_(f_(),".nodata","pending-link.json"),p_=6e4,b1=15*p_,w1=[3e4,2*p_,5*p_];function v1(e,t){switch(e.connection){case"connected":return{state:"connected"};case"unstable":case"offline":return{state:"reconnecting"};case"restart":return{state:"restart",step:"/mcp"};case"not-connected":return t?{state:"waiting"}:{state:"local"};case"reconnect":return t?{state:"waiting"}:{state:"needs-you",step:e.refused==="org-has-no-key"?"console \u2192 API keys":e.refused==="flag-key"||e.refused==="env-key"?"remove the old key":"nodata_connect"}}}function np(e,t=new Date){try{F3(h_(f_(),".nodata"),{recursive:!0});let n=t.toISOString(),r={};for(let[o,i]of Object.entries(W3()?.versions??{}))t.getTime()-Date.parse(i.at)<H3&&U3(Number(o))&&(r[o]=i);e.version&&(r[String(process.pid)]={version:e.version,at:n}),B3(u_(),JSON.stringify({...e,...Object.keys(r).length?{versions:r}:{},at:n}),{mode:384})}catch{}}function W3(){try{return S1(u_())?JSON.parse(M3(u_(),"utf8")):null}catch{return null}}var k1=()=>S1(K3());function G3(e,t){return e==="reconnecting"?w1[Math.min(t,w1.length-1)]??b1:e==="waiting"?3e4:b1}function x1(e,t,n,r){let o=0,i=n?{version:n}:{},s=v1(t,k1());np({...s,...i});let a=null,c=()=>{a=setTimeout(l,G3(s.state,o)),a.unref?.()},l=async()=>{try{let d=v1(await e(),k1());o=d.state==="reconnecting"?o+1:0,(d.state!==s.state||d.step!==s.step)&&r?.(d),s=d,np({...d,...i})}catch{o+=1}c()};return c(),()=>{a&&clearTimeout(a)}}bt();import{homedir as oP,hostname as wU,userInfo as vU}from"node:os";import{join as z1,resolve as ip}from"node:path";import{existsSync as y_,readFileSync as v_,writeFileSync as kU,mkdirSync as SU}from"node:fs";import{spawn as sp,spawnSync as ap}from"node:child_process";import{generateKeyPairSync as xU,createPrivateKey as $U,sign as EU,randomBytes as AU}from"node:crypto";async function $1(e=process.env){if(!(e.HTTPS_PROXY||e.https_proxy||e.HTTP_PROXY||e.http_proxy)||/^(1|true)$/i.test(e.NODE_USE_ENV_PROXY??""))return!1;try{let{EnvHttpProxyAgent:t,setGlobalDispatcher:n}=await import("undici");return n(new t),!0}catch{return!1}}import{readFileSync as V3}from"node:fs";function $s(e=process.env,t=process.platform,n=A1()){return!(t==="linux"&&!n&&!e.DISPLAY&&!e.WAYLAND_DISPLAY)}function E1(e=process.env,t=process.platform,n=A1()){return e.VITEST||/^(1|true|yes)$/i.test(e.NODATA_NO_BROWSER??"")?!1:$s(e,t,n)}function A1(){try{return process.platform==="linux"&&/microsoft/i.test(V3("/proc/version","utf8"))}catch{return!1}}import{createHmac as tU}from"node:crypto";import{existsSync as nU,mkdirSync as rU,readFileSync as oU,writeFileSync as I1}from"node:fs";import{homedir as D1}from"node:os";import{join as j1}from"node:path";import{x25519 as iU}from"@noble/curves/ed25519.js";import{CipherSuite as q3,HkdfSha256 as z3}from"@hpke/core";import{DhkemX25519HkdfSha256 as Y3}from"@hpke/dhkem-x25519";import{Chacha20Poly1305 as J3}from"@hpke/chacha20poly1305";function T1(e){return["ndc.dal.column.agent.v1",e.tenantId,e.table,e.column,String(e.keyVersion),e.agentHandle,e.recipientKid].join("|")}function P1(e){return["ndc.dal.cell.v1",e.tenantId,e.table,e.column,String(e.keyVersion)].join("|")}var R1=new q3({kem:new Y3,kdf:new z3,aead:new J3}),O1=new TextEncoder,X3=new TextDecoder,zr=e=>{let t=new Uint8Array(e.length);return t.set(e),t.buffer},op=e=>Uint8Array.from(atob(e),t=>t.charCodeAt(0)),Z3=e=>btoa(String.fromCharCode(...e));async function Q3(e,t,n,r,o){if(e.recipient_x25519_b64!==Z3(t.pubkey))throw new Error("column_key_not_for_this_agent");let i=op(e.sealed_b64);if(i.length<6||i[0]!==1||i[1]!==1)throw new Error("unsupported_seal");let s=i[2]<<8|i[3],a=i[4]<<8|i[5];if(i.length!==6+s+a)throw new Error("sealed_length_mismatch");let c=O1.encode(T1({tenantId:n,table:r,column:o,keyVersion:e.key_version,agentHandle:t.handle,recipientKid:e.recipient_kid})),l=await R1.createRecipientContext({recipientKey:await R1.kem.deserializePrivateKey(zr(t.secret)),enc:zr(i.slice(6,6+s)),info:zr(c)});return new Uint8Array(await l.open(zr(i.slice(6+s))))}async function eU(e,t,n,r,o){let i=await crypto.subtle.importKey("raw",zr(e),{name:"AES-GCM"},!1,["decrypt"]),s=op(t.ct),a=op(t.tag),c=new Uint8Array(s.length+a.length);c.set(s),c.set(a,s.length);let l=await crypto.subtle.decrypt({name:"AES-GCM",iv:zr(op(t.iv)),additionalData:zr(O1.encode(P1({tenantId:n,table:r,column:o,keyVersion:t.kv}))),tagLength:128},i,zr(c));return X3.decode(l)}async function N1(e,t,n,r){let o=new Map;return async(i,s)=>{let a=(e[i]??[]).find(l=>l.key_version===s.kv);if(!a)return null;let c=`${i}:${s.kv}`;return o.has(c)||o.set(c,Q3(a,t,n,r,i)),eU(await o.get(c),s,n,r,i)}}var rp=e=>!!e&&typeof e=="object"&&!Array.isArray(e);async function C1(e,t,n,r){if(!rp(n))return n;if(e==="retrieve"){let a=n.sealed;if(!rp(a)||typeof a.tenant_id!="string"||!Array.isArray(a.rows))return n;let c=await N1(a.column_keys??{},r,a.tenant_id,t),l=[],d=0;for(let u of a.rows){let p={};for(let[f,h]of Object.entries(u.cells??{}))try{let g=await c(f,h);g!==null?p[f]=g:d+=1}catch{d+=1}l.push({ref:u.ref,values:p})}return{...n,sealed:void 0,opened:{custody:"agent_sealed",opened_here:!0,rows:l,failed:d}}}if(typeof n.tenant_id!="string"||!Array.isArray(n.rows)||!rp(n.column_keys))return n;let o=await N1(n.column_keys,r,n.tenant_id,t),i=0,s=[];for(let a of n.rows){let{_sealed:c,...l}=a,d={...l};if(rp(c))for(let[u,p]of Object.entries(c))try{let f=await o(u,p);f!==null?d[u]=f:i+=1}catch{i+=1}s.push(d)}return{...n,rows:s,column_keys:void 0,opened:{custody:"agent_sealed",opened_here:!0,failed:i}}}var sU=/^[a-z0-9][a-z0-9._-]{0,63}$/i,L1=e=>j1(D1(),".nodata","agent-keys",`${e}.json`);function F1(e){if(!sU.test(e))throw new Error("invalid agent handle");let t=L1(e);if(nU(t)){let o=JSON.parse(oU(t,"utf8"));if(o.handle===e&&/^[0-9a-f]{64}$/.test(o.secret_hex)&&/^[0-9a-f]{64}$/.test(o.pub_hex))return o}let n=Kd(),r={handle:e,secret_hex:cs(n),pub_hex:cs(Xa(n)),kid:null};return rU(j1(D1(),".nodata","agent-keys"),{recursive:!0}),I1(t,JSON.stringify(r,null,2)+`
|
|
444
444
|
`,{mode:384}),r}function aU(e,t,n){let r=iU.getSharedSecret(cn(e),cn(t.server_pubkey_hex));return tU("sha256",Buffer.from(r)).update(`nd-fabric-pop-v1|${t.nonce}|${n}|${t.agent_id}`).digest("hex")}async function M1(e,t){try{let n=F1(e),r=`/api/agents/${encodeURIComponent(e)}/fabric/enroll`,o=await t(r,{ecdh_pubkey_hex:n.pub_hex});if(o.status===428){let s=o.body?.challenge;if(!s)return{error:"no challenge"};o=await t(r,{ecdh_pubkey_hex:n.pub_hex,pop:{challenge:s,proof_hex:aU(n.secret_hex,s,n.pub_hex)}})}if(!o.ok)return{error:`enroll HTTP ${o.status}`};let i=String(o.body?.kid??"");return i&&i!==n.kid&&I1(L1(e),JSON.stringify({...n,kid:i},null,2)+`
|
|
445
|
-
`,{mode:384}),{kid:i}}catch(n){return{error:n instanceof Error?n.message:"enroll failed"}}}function B1(e){return async(t,n,r)=>{let o=F1(e);return C1(t,n,r,{handle:e,secret:cn(o.secret_hex),pubkey:cn(o.pub_hex)})}}var ar="1.6.
|
|
445
|
+
`,{mode:384}),{kid:i}}catch(n){return{error:n instanceof Error?n.message:"enroll failed"}}}function B1(e){return async(t,n,r)=>{let o=F1(e);return C1(t,n,r,{handle:e,secret:cn(o.secret_hex),pubkey:cn(o.pub_hex)})}}var ar="1.6.44";function Sc(e=process.cwd()){try{let t=xt(e),n=t?Cf(t):null;if(!n||!y_(n))return null;let r=JSON.parse(v_(n,"utf8"));if(!r)return null;let o=r.device&&typeof r.device.private_key_pkcs8_b64=="string",i=typeof r.api_key=="string"&&r.api_key;return o||i?r:null}catch{return null}}function __(e,t=process.cwd()){let n=yl(e);if(!n)throw new Error("nothing to save: no organisation in the credential");Xw(n,e),t&&Zw(t,n)}var TU=`nodata-mcp v${ar} \u2014 NoData MCP server
|
|
446
446
|
|
|
447
447
|
ADMIN mode: nodata-mcp --api-key sk_live_...
|
|
448
448
|
AGENT mode: nodata-mcp --grant-token ndca-...
|
package/dist/scan-worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @nodatachat/mcp 1.6.
|
|
1
|
+
/*! @nodatachat/mcp 1.6.44 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
|
|
2
2
|
import{createRequire as __ndReq}from"node:module";const require=__ndReq(import.meta.url);
|
|
3
3
|
import{parentPort as At}from"node:worker_threads";import{createHash as Js}from"node:crypto";import{closeSync as Ys,existsSync as qs,openSync as Qs,readSync as eo,readdirSync as mr,readFileSync as to,statSync as xt}from"node:fs";import{homedir as no}from"node:os";import{basename as gr,join as Ge}from"node:path";import{TextDecoder as Sr}from"node:util";var Q={text:[],header:[],secrets:[],table:null,amounts:null,severity:null};function Tt(e){e.table&&(Q.table=e.table),e.severity&&(Q.severity=e.severity),e.amounts&&(Q.amounts=e.amounts);for(let t of e.text??[])Q.text.some(n=>n.kind===t.kind)||Q.text.push(t);e.header&&!Q.header.includes(e.header)&&Q.header.push(e.header);for(let t of e.secrets??[])Q.secrets.some(n=>n.id===t.id)||Q.secrets.push(t)}function Ye(e){return Q.severity?.(e)}function qe(){return Q.text}function yn(){return Q.header}function Ce(){return Q.table}function bn(){return Q.secrets}var _n=[{id:"aws-access-key",name:"AWS Access Key",pattern:/(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)/,severity:"critical"},{id:"aws-secret-key",name:"AWS Secret Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key)\s*[=:]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/,severity:"critical"},{id:"gcp-api-key",name:"GCP API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"critical"},{id:"gcp-service-account",name:"GCP Service Account",pattern:/"type"\s*:\s*"service_account"/,severity:"critical"},{id:"github-token",name:"GitHub Token",pattern:/gh[pousr]_[0-9a-zA-Z]{36,}/,severity:"critical"},{id:"github-fine-grained",name:"GitHub Fine-Grained Token",pattern:/github_pat_[0-9a-zA-Z_]{22,}/,severity:"critical"},{id:"gitlab-token",name:"GitLab Token",pattern:/glpat-[0-9a-zA-Z_-]{20,}/,severity:"critical"},{id:"stripe-secret",name:"Stripe Secret Key",pattern:/sk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"stripe-restricted",name:"Stripe Restricted Key",pattern:/rk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"slack-token",name:"Slack Token",pattern:/xox[baprs]-[0-9a-zA-Z-]{10,}/,severity:"high"},{id:"slack-webhook",name:"Slack Webhook",pattern:/hooks\.slack\.com\/services\/T[0-9A-Z]{8,}\/B[0-9A-Z]{8,}\/[0-9a-zA-Z]{24}/,severity:"high"},{id:"twilio-api-key",name:"Twilio API Key",pattern:/SK[0-9a-fA-F]{32}/,severity:"high"},{id:"sendgrid-api-key",name:"SendGrid API Key",pattern:/SG\.[0-9a-zA-Z_-]{22}\.[0-9a-zA-Z_-]{43}/,severity:"critical"},{id:"postgres-uri",name:"PostgreSQL Connection String",pattern:/postgres(?:ql)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"mongodb-uri",name:"MongoDB Connection String",pattern:/mongodb(?:\+srv)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"redis-uri",name:"Redis Connection String",pattern:/redis(?:s)?:\/\/[^\s'"]{10,}/,severity:"high"},{id:"openai-key",name:"OpenAI API Key",pattern:/sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}/,severity:"critical"},{id:"openai-project-key",name:"OpenAI API Key",pattern:/sk-(?:proj|svcacct|admin)-[0-9A-Za-z_-]{40,}/,severity:"critical"},{id:"anthropic-key",name:"Anthropic API Key",pattern:/sk-ant-[0-9a-zA-Z_-]{40,}/,severity:"critical"},{id:"firebase-key",name:"Firebase API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"high"},{id:"supabase-key",name:"Supabase Service Key",pattern:/eyJ[0-9a-zA-Z_-]{100,}/,severity:"critical"},{id:"supabase-access-token",name:"Supabase Access Token",pattern:/\bsbp_[0-9a-f]{40}\b/,severity:"critical"},{id:"supabase-secret-key",name:"Supabase Secret Key",pattern:/\bsb_secret_[0-9A-Za-z_-]{20,}/,severity:"critical"},{id:"private-key",name:"Private Key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,severity:"critical"},{id:"jwt-secret",name:"JWT/Generic Secret",pattern:/(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"password-in-code",name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"bearer-token",name:"Bearer Token in Code",pattern:/['"]Bearer\s+[0-9a-zA-Z._-]{20,}['"]/,severity:"high"}];function Lt(){let e=bn().filter(t=>!_n.some(n=>n.id===t.id));return[..._n,...e]}var xn=/node_modules\/|\.next\/|\.test\.|\.spec\.|__tests__\/|\.nodata-proof\.json$|\.git\//,wn=/(^|\/)\.env(\.[\w-]+)*\.(example|sample|template|dist)$|\.(example|sample|template)$|(^|\/)[^/]*\.(example|sample)\.[a-z0-9]+$/i,Ct=/(^|\/)(__tests__|__mocks__|tests?|spec|fixtures?|mocks?|samples?|examples?|demo|testdata)(\/|$)|\.(test|spec)\.[a-z0-9]+$|\.min\.(m?js|css)$|(^|\/)[^/]*\.worker\.min\.m?js$/i,Kr=[{name:"lodash",below:"4.17.21",severity:"critical",cve:"CVE-2021-23337",desc:"Command injection via template"},{name:"minimist",below:"1.2.6",severity:"critical",cve:"CVE-2021-44906",desc:"Prototype pollution"},{name:"json5",below:"2.2.2",severity:"high",cve:"CVE-2022-46175",desc:"Prototype pollution"},{name:"express",below:"4.19.2",severity:"high",cve:"CVE-2024-29041",desc:"Open redirect"},{name:"path-to-regexp",below:"6.3.0",severity:"high",cve:"CVE-2024-45296",desc:"ReDoS"},{name:"sanitize-html",below:"2.12.1",severity:"high",cve:"CVE-2024-21501",desc:"XSS bypass"},{name:"dompurify",below:"3.0.9",severity:"high",cve:"CVE-2024-45801",desc:"mXSS"},{name:"jsonwebtoken",below:"9.0.0",severity:"critical",cve:"CVE-2022-23529",desc:"Key confusion attack"},{name:"jose",below:"4.15.5",severity:"high",cve:"CVE-2024-28176",desc:"DoS via JWE"},{name:"axios",below:"1.6.0",severity:"high",cve:"CVE-2023-45857",desc:"CSRF cookie leak"},{name:"node-fetch",below:"2.6.7",severity:"high",cve:"CVE-2022-0235",desc:"Header leak on redirect"},{name:"serialize-javascript",below:"6.0.2",severity:"critical",cve:"CVE-2024-11831",desc:"XSS via serialization"},{name:"xml2js",below:"0.6.0",severity:"high",cve:"CVE-2023-0842",desc:"Prototype pollution"},{name:"next",below:"14.1.1",severity:"high",cve:"CVE-2024-34350",desc:"SSRF via headers"},{name:"sharp",below:"0.32.6",severity:"high",cve:"CVE-2023-4863",desc:"libwebp heap overflow"},{name:"multer",below:"1.4.5",severity:"high",cve:"CVE-2022-24434",desc:"Prototype pollution"},{name:"tough-cookie",below:"4.1.3",severity:"medium",cve:"CVE-2023-26136",desc:"Prototype pollution"},{name:"semver",below:"7.5.4",severity:"medium",cve:"CVE-2022-25883",desc:"ReDoS"},{name:"ip",below:"2.0.1",severity:"critical",cve:"CVE-2024-29415",desc:"SSRF bypass via octal IP"},{name:"tar",below:"6.2.1",severity:"high",cve:"CVE-2024-28863",desc:"DoS via path traversal"}];function Jr(e,t){let n=s=>s.replace(/^[^0-9]*/,"").split(".").map(o=>parseInt(o,10)||0),r=n(e),i=n(t);for(let s=0;s<3;s++){if((r[s]||0)<(i[s]||0))return!0;if((r[s]||0)>(i[s]||0))return!1}return!1}function vn(e){let t=[],n;try{n=JSON.parse(e)}catch{return t}let r={...n.dependencies??{},...n.devDependencies??{}};for(let[i,s]of Object.entries(r)){let o=(s||"").replace(/^[\^~>=<\s]+/,""),a=Kr.find(c=>c.name===i&&Jr(o,c.below));a&&t.push({name:i,version:o,vuln:a})}return t}var Yr=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Salary / income"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication|prescription)$/i,type:"medical",label:"Medical"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Policy"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation"}],qr=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם הלקוח|שם בן זוג|שם המבוטח|שם המוטב|שם הילד|שם הקטין)$/i,type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מס' זהות|teudat_zehut|tz|israeli_id|il_id)$/i,type:"id",label:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה)$/i,type:"id",label:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|אימייל|כתובת מייל)$/i,type:"email",label:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|טלפון נייד)$/i,type:"phone",label:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|רחוב|מס בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|מען)$/i,type:"address",label:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|ת לידה|תאריך הולדת|יום הולדת|גיל)$/i,type:"dob",label:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|מספר חשבון|מס חשבון|סניף|iban|iban_il)$/i,type:"financial",label:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|מספר אשראי|cvv|אשראי)$/i,type:"financial",label:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|מצב רפואי|חיסון|רגישות|אלרגיה|סוג דם)$/i,type:"medical",label:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מס פוליסה|פוליסה|מספר חבר|מספר ביטוח)$/i,type:"id",label:"\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4/\u05D7\u05D1\u05E8\u05D5\u05EA"},{pattern:/^(?:שם הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|תעודת לידה)$/i,type:"minor_data",label:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|השקפה פוליטית|מצב משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מס רכב|לוחית רישוי|מספר רישוי)$/i,type:"tracking",label:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}],Qr=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|enabled|active|public|version|metadata|config|settings|data|content|note|comment|label|color|icon)$/i,ei=/^שם[ _](?:ה)?(?:קובץ|מוצר|פריט|חברה|ארגון|עסק|פרויקט|גיליון|טבלה|שדה|קטגוריה|סניף|בנק|עיר|רחוב|ישוב|יישוב|מסמך|תוכנית|חבילה|קורס|מחלקה|אתר|דומיין|מותג|ספק|שירות|תפקיד)$|^(file|product|item|company|org|organization|project|sheet|table|field|category|branch|bank|city|street|document|plan|course|department|site|domain|brand|vendor|service|role)[ _-]?name$/i;function _e(e){if(!e)return null;let t=e.trim();if(Qr.test(t)||/^name$/i.test(t)||/^\[[A-Z_]+(?:-\d+)?\]$/.test(t))return null;let n=t.replace(/[\s-]+/g,"_");for(let r of[...qr,...Yr])if(r.pattern.test(t)||r.pattern.test(n))return{type:r.type,label:r.label};if(ei.test(t))return null;if(/^שם[ _][\u0590-\u05FF"'׳ ]{2,20}$/.test(t))return{type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"};if(/^(customer|client|employee|inspector|supervisor|contact|person|patient|user|owner|manager|agent|member|driver|tenant|student|parent|beneficiary|insured)_?(full_?)?name$/i.test(n))return{type:"name",label:"Person name"};for(let r of yn()){let i=r(t);if(i)return{type:i.type,label:i.label}}return null}var Qe={id:"critical",financial:"critical",medical:"critical",biometric:"critical",minor_data:"critical",sensitive_personal:"critical",email:"high",phone:"high",name:"high",address:"high",dob:"high",tracking:"medium",location:"high",auth:"critical",employment:"medium",education:"medium",behavior:"high"};function et(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let i=0;i<9;i++){let s=parseInt(n[i]??"0",10)*(i%2+1);s>9&&(s-=9),r+=s}return r%10===0&&parseInt(n,10)>0}var Pt=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g;var Oe=/\bIL\d{2}\s?(?:\d{4}\s?){4}\d{3}\b/g;function ti(e){let t=String(e??"").replace(/\D/g,"");if(t.length<12||t.length>19)return!1;let n=0,r=!1;for(let i=t.length-1;i>=0;i-=1){let s=parseInt(t[i]??"0",10);r&&(s*=2,s>9&&(s-=9)),n+=s,r=!r}return n%10===0}function tt(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let i of n){let s=i>="A"&&i<="Z"?String(i.charCodeAt(0)-55):i;for(let o of s)r=(r*10+Number(o))%97}return r===1}var $t="(?<!\\d)(?<!\\d[.,])",Rt="(?!\\d)(?![.,]\\d)",De=[{subkind:"israeli_id",severity:"high",pattern:new RegExp(`${$t}(?:\\d{8}-\\d|\\d{9})${Rt}`,"g"),validate:et,hint:"Israeli national ID (check digit verified) in plaintext. Encrypt the column or mask it at rest."},{subkind:"credit_card",severity:"critical",pattern:new RegExp(`${$t}[2-6][ -]?(?:\\d[ -]?){11,17}\\d${Rt}`,"g"),validate:ti,hint:"Payment card number (Luhn verified) in plaintext. This is PCI scope."},{subkind:"iban",severity:"high",pattern:/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g,validate:tt,hint:"Bank account in IBAN form (mod-97 verified) in plaintext."},{subkind:"israeli_phone",severity:"medium",pattern:new RegExp(`${$t}(?:\\+972[- ]?|0)(?:[57]\\d|[2-489])[- ]?\\d{3}[- ]?\\d{4}${Rt}`,"g"),validate:e=>{let t=e.replace(/\D/g,"").replace(/^972/,"0");return/^0[57]\d{8}$/.test(t)?!0:/^0[2-489]\d{7}$/.test(t)&&(/[- ]/.test(e)||e.startsWith("+972"))},hint:"Israeli phone number in plaintext."}];function kn(e){if(e.length!==14&&e.length!==17)return!1;let t=+e.slice(0,4),n=+e.slice(4,6),r=+e.slice(6,8),i=+e.slice(8,10),s=+e.slice(10,12),o=+e.slice(12,14);return t>=1970&&t<=2099&&n>=1&&n<=12&&r>=1&&r<=31&&i<24&&s<60&&o<60}function Sn(e){let t=Number(e);return!Number.isSafeInteger(t)||t<1024?!1:Number.isInteger(Math.log2(t))||t%1048576===0}var ni=new Set(["000000018","123456782","111111118","222222226","333333334","999999998","4111111111111111","4242424242424242","4000056655665556","5555555555554444","5105105105105100","2223003122003222","378282246310005","371449635398431","6011111111111117","3056930009020004","4012888888881881","4000000000000002"]);function Pe(e){return ni.has(e.replace(/\D/g,""))}function nt(e){let t=e.replace(/\D/g,"");return kn(t)||Sn(t)}function Ne(e,t){let n=[];for(let r of De){r.pattern.lastIndex=0;let i=new Set,s,o=0;for(;(s=r.pattern.exec(e))!==null&&(o+=1,!(o>2e5));){let a=s[0];if(!(r.subkind!=="iban"&&r.subkind!=="israeli_phone"&&nt(a))&&(r.validate(a)&&i.add(a.replace(/[\s-]/g,"")),i.size>=1e5))break}if(i.size>0){if(t)for(let c of i)Pe(c)||t(r.subkind,c);let a=[...i].filter(c=>!Pe(c)).length;n.push({subkind:r.subkind,severity:a===0?"low":r.severity,hint:a===0?`${r.hint} All ${i.size} are published test numbers.`:r.hint,count:i.size,real:a})}}for(let r of qe()){let i=new Set;for(let s of r.find(e))i.add(e.slice(s.start,s.end).trim());i.size>0&&n.push({subkind:r.kind,severity:r.severity,hint:r.hint,count:i.size})}return n}function Fe(e,t){let n=[],r="",i=!1;for(let s=0;s<e.length;s++){let o=e[s];i?o==='"'&&e[s+1]==='"'?(r+='"',s++):o==='"'?i=!1:r+=o:o==='"'?i=!0:o===t?(n.push(r),r=""):r+=o}return n.push(r),n}import{inflateRawSync as ns}from"node:zlib";import{inflateSync as En}from"node:zlib";var Me=new Set([".pdf"]),An=8*1024*1024;function rt(e){let t=e.toString("latin1"),n=new Map,r=/(\d+)\s+(\d+)\s+obj\b/g,i;for(;(i=r.exec(t))!==null;){let s=Number(i[1]),o=r.lastIndex,a=t.indexOf("endobj",o);if(a<0)continue;let c=t.indexOf("stream",o),l,p=null;if(c>=0&&c<a){l=t.slice(o,c);let u=c+6;t[u]==="\r"&&(u+=1),t[u]===`
|
|
4
4
|
`&&(u+=1);let h=t.indexOf("endstream",u);h>u&&(p=e.subarray(u,h))}else l=t.slice(o,a);n.set(s,{num:s,dict:l,stream:p})}for(let s of[...n.values()]){if(!s.stream||!/\/Type\s*\/ObjStm\b/.test(s.dict))continue;let o=je(s),a=Number(/\/N\s+(\d+)/.exec(s.dict)?.[1]??0),c=Number(/\/First\s+(\d+)/.exec(s.dict)?.[1]??-1);if(o===null||!a||c<0)continue;let l=o.slice(0,c).trim().split(/\s+/).map(Number);for(let p=0;p<a;p+=1){let u=l[2*p],h=l[2*p+1];if(u===void 0||h===void 0||Number.isNaN(u)||Number.isNaN(h))break;let y=p+1<a?l[2*(p+1)+1]:void 0,_=o.slice(c+h,y!==void 0?c+y:void 0);n.has(u)||n.set(u,{num:u,dict:_,stream:null})}}return n}function Ot(e){let t=[...e.replace(/\s+/g,"")];if(t.length<40)return!1;let n=0,r=0;for(let i of t){let s=i.codePointAt(0)??0;s<32||s>=127&&s<=191||s===65533||s>=57344&&s<=63743?n+=1:/[\p{L}\p{N}]/u.test(i)&&(r+=1)}return n/t.length>.2||r/t.length<.25}function ri(e){let t=e.toString("latin1").replace(/\s/g,"");t.startsWith("<~")&&(t=t.slice(2));let n=t.indexOf("~>");n>=0&&(t=t.slice(0,n));let r=[],i=0,s=0;for(let o of t){if(o==="z"&&s===0){r.push(0,0,0,0);continue}let a=o.charCodeAt(0)-33;if(a<0||a>84)return null;i=i*85+a,s+=1,s===5&&(r.push(i>>>24&255,i>>>16&255,i>>>8&255,i&255),i=0,s=0)}if(s>0){for(let a=s;a<5;a+=1)i=i*85+84;let o=[i>>>24&255,i>>>16&255,i>>>8&255,i&255];for(let a=0;a<s-1;a+=1)r.push(o[a]??0)}return Buffer.from(r)}function ii(e){let t=e.toString("latin1").replace(/\s/g,"").split(">")[0]??"",n=t.length%2?t+"0":t;return/^[0-9A-Fa-f]*$/.test(n)?Buffer.from(n,"hex"):null}function si(e){let t=/\/Filter\s*(\[[^\]]*\]|\/\w+)/.exec(e);return!t||!t[1]?[]:[...t[1].matchAll(/\/(\w+)/g)].map(n=>n[1]??"")}function je(e,t){if(!e.stream)return null;let n=e.stream;for(let r of si(e.dict)){let i=null;if(r==="FlateDecode")try{i=t!==void 0?En(n,{maxOutputLength:Math.max(1,t)}):En(n)}catch{return null}else if(r==="ASCII85Decode")i=ri(n);else if(r==="ASCIIHexDecode")i=ii(n);else return null;if(i===null)return null;n=i}return n.toString("latin1")}function oi(e){let t=new Map,n=1,r=/begincodespacerange([\s\S]*?)endcodespacerange/.exec(e);if(r&&r[1]){let c=/<([0-9A-Fa-f]+)>/.exec(r[1]);c&&c[1]&&c[1].length>=4&&(n=2)}let i=c=>{let l="";for(let p=0;p+3<c.length+1;p+=4){let u=parseInt(c.slice(p,p+4),16);Number.isFinite(u)&&u>0&&(l+=String.fromCharCode(u))}return l},s=/beginbfchar([\s\S]*?)endbfchar/g,o;for(;(o=s.exec(e))!==null;){let c=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,l;for(;(l=c.exec(o[1]??""))!==null;)t.set(parseInt(l[1]??"0",16),i(l[2]??""))}let a=/beginbfrange([\s\S]*?)endbfrange/g;for(;(o=a.exec(e))!==null;){let c=o[1]??"",l=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,p;for(;(p=l.exec(c))!==null;){let u=parseInt(p[1]??"0",16),h=parseInt(p[2]??"0",16),y=parseInt((p[3]??"0").slice(0,4)||"0",16);if(!(h-u>65535))for(let _=u;_<=h;_+=1)t.set(_,String.fromCharCode(y+(_-u)))}}return{map:t,bytes:n}}function ai(e){let t=new Map,n=[],r=[];for(let s of e.values()){for(let o of s.dict.matchAll(/\/Font\s*<<([\s\S]*?)>>/g))o[1]&&r.push(o[1]);for(let o of s.dict.matchAll(/\/Font\s+(\d+)\s+\d+\s+R/g)){let a=e.get(Number(o[1]));a&&r.push(a.dict)}}let i=new Set;for(let s of r){let o=/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g,a;for(;(a=o.exec(s))!==null;){let c=`${a[1]}#${a[2]}`;i.has(c)||(i.add(c),n.push([a[1]??"",Number(a[2])]))}}for(let[s,o]of n){let a=e.get(o);if(!a)continue;let c=null,l=/\/ToUnicode\s+(\d+)\s+\d+\s+R/.exec(a.dict);if(l){let u=e.get(Number(l[1])),h=u?je(u):null;h&&(c=oi(h))}if(c||(c=ui(a.dict,e)),!c)continue;let p=t.get(s)??[];p.push(c),t.set(s,p)}return t}var ci=["alef","bet","gimel","dalet","he","vav","zayin","het","tet","yod","finalkaf","kaf","lamed","finalmem","mem","finalnun","nun","samekh","ayin","finalpe","pe","finaltsadi","tsadi","qof","resh","shin","tav"];function li(e){let t=/^uni([0-9A-Fa-f]{4})$/.exec(e)??/^u([0-9A-Fa-f]{4,6})$/.exec(e);if(t)return String.fromCodePoint(parseInt(t[1],16));let n=/^afii(\d{5})$/.exec(e);if(n){let s=Number(n[1]);if(s>=57664&&s<=57690)return String.fromCharCode(1488+(s-57664))}let r=ci.indexOf(e.replace(/hebrew$/,""));return r>=0?String.fromCharCode(1488+r):e==="space"?" ":/^[A-Za-z]$/.test(e)?e:{zero:"0",one:"1",two:"2",three:"3",four:"4",five:"5",six:"6",seven:"7",eight:"8",nine:"9",period:".",comma:",",hyphen:"-",colon:":",slash:"/",at:"@"}[e]??null}function ui(e,t){let n=e,r=/\/Encoding\s+(\d+)\s+\d+\s+R/.exec(e);r&&(n=t.get(Number(r[1]))?.dict??"");let i=/\/Differences\s*\[([^\]]*)\]/.exec(n);if(!i?.[1])return null;let s=new Map,o=0;for(let a of i[1].match(/\d+|\/[^\s/[\]]+/g)??[]){if(/^\d+$/.test(a)){o=Number(a);continue}let c=li(a.slice(1));c!==null&&s.set(o,c),o+=1}return s.size?{map:s,bytes:1}:null}function Cn(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r!=="\\"){t.push(r.charCodeAt(0)&255);continue}let i=e[n+1];if(i===void 0)break;if(i>="0"&&i<="7"){let o="",a=n+1;for(;a<e.length&&o.length<3&&e[a]>="0"&&e[a]<="7";)o+=e[a],a+=1;t.push(parseInt(o,8)&255),n=a-1;continue}let s={n:10,r:13,t:9,b:8,f:12};t.push(s[i]??i.charCodeAt(0)&255),n+=1}return t}function Pn(e){if(e.length<2||e[0]!==254||e[1]!==255)return null;let t="";for(let n=2;n+1<e.length;n+=2)t+=String.fromCharCode((e[n]??0)<<8|(e[n+1]??0));return t}function In(e,t){let n=Pn(e);if(n!==null)return n;if(!t)return e.map(i=>String.fromCharCode(i)).join("");let r="";if(t.bytes===2)for(let i=0;i+1<e.length;i+=2){let s=(e[i]??0)<<8|(e[i+1]??0);r+=t.map.get(s)??""}else for(let i of e)r+=t.map.get(i)??String.fromCharCode(i);return r}function di(e){let t=0;for(let n of e){let r=n.codePointAt(0)??0;/[\p{L}\p{N}]/u.test(n)?t+=1:(r<32||r>=127&&r<=191||r===65533)&&(t-=2)}return t}function Tn(e,t){if(!t||t.length<=1)return In(e,t?.[0]);let n="",r=-1/0;for(let i of t){let s=In(e,i),o=di(s);o>r&&(n=s,r=o)}return n}function fi(e,t){let n="",r="",i,s=!1,o="",a=0,c=null,l=()=>{r.trim()&&(n+=r+`
|
package/dist/status.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @nodatachat/mcp 1.6.
|
|
1
|
+
/*! @nodatachat/mcp 1.6.44 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
|
|
2
2
|
import{execSync as bn}from"node:child_process";import{existsSync as xn,readFileSync as Z}from"node:fs";import{existsSync as L,mkdirSync as Bn,readdirSync as X,readFileSync as nn,rmSync as Jn,writeFileSync as Pn,chmodSync as Mn}from"node:fs";import{homedir as F}from"node:os";import{basename as zn,isAbsolute as en,join as u,relative as tn,resolve as rn}from"node:path";var g=()=>u(F(),".nodata"),on=()=>u(g(),"credentials.json"),v=()=>u(g(),"orgs"),sn=()=>u(g(),"bindings.json"),ln=/^[A-Za-z0-9_.-]{1,80}$/,b=n=>ln.test(n)&&n!=="."&&n!=="..";function D(n){try{return L(n)?JSON.parse(nn(n,"utf8")):null}catch{return null}}function cn(n){return n?n.device?.org_id?n.device.org_id:n.api_key?`key-${(n.key_prefix??n.api_key.slice(0,12)).replace(/[^A-Za-z0-9_-]/g,"")}`:null:null}function E(){return cn(D(on()))}function m(){let n=[],t=E();t&&n.push(t);try{for(let e of X(v()))b(e)&&!n.includes(e)&&L(u(v(),e,"credentials.json"))&&n.push(e)}catch{}return n}function an(n){return n===E()?g():b(n)?u(v(),n):null}var un=n=>process.platform==="win32"||process.platform==="darwin"?n.toLowerCase():n,h=n=>un(rn(n.replace(/^~(?=[\\/]|$)/,F())));function dn(n,t){let e=tn(h(n),h(t));return e===""||!e.startsWith("..")&&!en(e)}function A(){let n=D(sn());return(Array.isArray(n?.bindings)?n.bindings:[]).filter(e=>!!e&&typeof e.folder=="string"&&typeof e.org_id=="string"&&b(e.org_id)).map(e=>e.project===void 0||hn(e.project)===e.project?e:{...e,project:void 0}).map(e=>e.client===void 0||typeof e.client?.org_id=="string"&&fn.test(e.client.org_id)?e:{...e,client:void 0})}var fn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function gn(n,t=A()){let e=null;for(let s of t)dn(s.folder,n)&&(!e||h(s.folder).length>h(e.folder).length)&&(e=s);return e}function x(n,t=m(),e=A()){if(t.length===0)return{kind:"none"};let s=gn(n,e.filter(c=>t.includes(c.org_id)));return s?{kind:"bound",org_id:s.org_id,folder:s.folder}:t.length===1?{kind:"only",org_id:t[0]}:{kind:"unbound",orgs:t}}function pn(n){let t=x(n);return t.kind==="bound"||t.kind==="only"?t.org_id:null}function hn(n){if(typeof n!="string")return null;let t=n.trim();return t&&t.length<=120&&!/[\u0000-\u001f\\/]/.test(t)?t:null}function R(n,t=process.cwd()){if(m().length===0)return g();let e=n??pn(t);return e?an(e):null}import{homedir as Sn}from"node:os";import{join as d}from"node:path";var B=["\u{1F7E3}","\u{1F535}","\u{1F7E0}","\u{1F7E4}","\u{1F7E1}"];function mn(n){let t=0;for(let e of n)t=t*31+e.codePointAt(0)>>>0;return B[t%B.length]}function J(n,t){let e=(n||"agent").toLowerCase().replace(/[^a-z0-9._-]+/g,"-").slice(0,40);return t?`${e}@${t}`:e}function P(n){return`${mn(n)} ${n}`}var M="2026-09-24-v3";import{existsSync as $n,mkdirSync as Wn,readFileSync as _n,writeFileSync as Zn}from"node:fs";import{homedir as yn}from"node:os";import{join as jn}from"node:path";var H=()=>jn(yn(),".nodata","prefs.json");function wn(){try{let n=$n(H())?JSON.parse(_n(H(),"utf8")).lang:null;return n==="he"||n==="en"?n:null}catch{return null}}function kn(){let t=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||"";try{t||=Intl.DateTimeFormat().resolvedOptions().locale}catch{}return/^(he|iw)(?:[-_.@]|$)/i.test(t)?"he":"en"}function vn(){return wn()??kn()}function r(n,t,e=vn()){return e==="he"?n:t}var On="\x1B[32m",a="\x1B[33m",k="\x1B[31m",N="\x1B[2m",i="\x1B[0m";function f(n){try{return xn(n)?JSON.parse(Z(n,"utf8")):null}catch{return null}}var T="";try{T=Z(0,"utf8")}catch{}var p=Sn(),Nn=f(d(p,".claude","settings.json")),I=(Nn?.hooks?.PreToolUse??[]).flatMap(n=>n.hooks??[]).find(n=>n.command.includes("gate.mjs"))?.command,S=I?I.includes("--block")?"block":"ask":null,Cn=f(d(p,".nodata","consent.json")),Tn=Cn?.terms_version===M,q=f(d(p,".nodata","credentials.json")),Ln=J("claude-code",q?.device?.label),o=[],_;Tn?S?(_=On,o.push(r(`\u05E9\u05E2\u05E8 ${S==="block"?"\u05D7\u05D5\u05E1\u05DD":"\u05E9\u05D5\u05D0\u05DC"}`,`gate ${S}`),r("\u05EA\u05E0\u05D0\u05D9\u05DD \u2713","terms \u2713"))):(_=a,o.push(r("\u05E9\u05E2\u05E8 \u05DB\u05D1\u05D5\u05D9","gate off"))):(_=k,o.push(r("\u05EA\u05E0\u05D0\u05D9 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05DC\u05D0 \u05D0\u05D5\u05E9\u05E8\u05D5 \u2014 nodata_terms","terms not accepted \u2014 nodata_terms")));var l=f(d(p,".nodata","connection.json")),C=l?.at?Date.now()-Date.parse(l.at)<60*6e4:!1,z=`${a}${r("\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8","not connected")}${i}`;C&&l?.state==="waiting"?o.push(`${a}${r("\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8","waiting for approval")}${i}`):q?!l||!C?o.push(`${a}${r("\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05D0 \u05E0\u05D1\u05D3\u05E7","connection not checked")}${i}`):l.state==="connected"?o.push(r("\u05DE\u05D7\u05D5\u05D1\u05E8 \u2713","connected \u2713")):l.state==="reconnecting"?o.push(`${a}${r("\u05DE\u05EA\u05D7\u05D1\u05E8 \u05DE\u05D7\u05D3\u05E9\u2026","reconnecting\u2026")}${i}`):l.state==="restart"?o.push(`${a}${r("\u05D0\u05D5\u05E9\u05E8 \u2014 \u05D4\u05E7\u05DC\u05D3 /mcp","approved \u2014 type /mcp")}${i}`):l.state==="needs-you"?o.push(`${k}${r("\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8","not connected")} \u2192 ${l.step??"nodata_connect"}${i}`):o.push(z):o.push(z);var G=m(),y=process.cwd();try{let n=JSON.parse(T);y=n.workspace?.current_dir||n.cwd||y}catch{}if(G.length>1){let n=x(y,G);n.kind==="bound"||n.kind==="only"?o.push(`${r("\u05D0\u05E8\u05D2\u05D5\u05DF","org")} ${n.org_id.slice(0,8)}`):o.push(`${k}${r("\u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05DC\u05D0 \u05E9\u05D5\u05D9\u05DB\u05D4 \u05DC\u05D0\u05E8\u05D2\u05D5\u05DF","folder bound to no org")}${i}`)}var U=R(null,y),$=U?f(d(U,"capsule.json")):null;if($){let n=$.last_heartbeat_ok_at?Date.parse($.last_heartbeat_ok_at):NaN,t=Number.isFinite(n)?Math.round((Date.now()-n)/6e4):1/0,e=s=>s<120?r(`${s} \u05D3'`,`${s}m`):r(`${Math.round(s/60)} \u05E9'`,`${Math.round(s/60)}h`);$.revoked?o.push(`${k}${r('\u05D4\u05E6\u05D5\u05DE\u05EA \u05D4\u05D5\u05E9\u05D4\u05D4 \u05E2"\u05D9 \u05D4\u05D0\u05E8\u05D2\u05D5\u05DF',"node paused by org")}${i}`):t<=15?o.push(`${r("\u05E6\u05D5\u05DE\u05EA","node")} \u2713 ${t<1?r("\u05E2\u05DB\u05E9\u05D9\u05D5","now"):e(t)}`):o.push(`${a}${r("\u05E6\u05D5\u05DE\u05EA \u05DC\u05D0 \u05D0\u05D5\u05DE\u05EA","node not verified")}${Number.isFinite(t)?` ${e(t)}`:""}${i}`)}o.push(P(Ln));var K=n=>n.split(".").map(Number),Y=(n,t)=>{let[e,s]=[K(n),K(t)];for(let c=0;c<3;c++)if(e[c]!==s[c])return e[c]>s[c];return!1},Fn=60*6e4,Dn=n=>!!n&&Date.now()-Date.parse(n)<Fn,En=Object.values(l?.versions??{}).filter(n=>Dn(n.at)).map(n=>n.version),Q=[...new Set(En.concat(C&&l?.version?[l.version]:[]))].filter(n=>/^\d+\.\d+\.\d+$/.test(n)),j=Q.reduce((n,t)=>!n||Y(t,n)?t:n,null),O=Q.filter(n=>j&&Y(j,n)),An=j?` ${N}v${j}${i}${O.length?` ${a}${r(`(v${O.join(", v")} \u05D1\u05D7\u05DC\u05D5\u05DF \u05D0\u05D7\u05E8: /mcp)`,`(v${O.join(", v")} in another window: /mcp)`)}${i}`:""}`:"",V=`${_}\u25CF NoData${i}${An} ${N}\xB7${i} ${o.join(` ${N}\xB7${i} `)}`,W=f(d(p,".nodata","statusline-prev.json"))?.command,w="";if(W)try{w=bn(W,{input:T,timeout:2e3,encoding:"utf8"}).trim()}catch{w=""}process.stdout.write(w?`${w} \u2502 ${V}`:V);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodatachat/mcp",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.44",
|
|
4
4
|
"mcpName": "io.github.daviderez4/nodata",
|
|
5
5
|
"description": "NoData MCP server: connect any MCP client (Claude Code, Codex, Cursor, VS Code) to the NoData Information Access Processor. Governed access for AI agents, with a verifiable proof for every decision.",
|
|
6
6
|
"bin": {
|