memshare-mcp 0.2.6
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/LICENSE +21 -0
- package/README.md +243 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +702 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui.d.ts +28 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +104 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +176 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/project.d.ts +15 -0
- package/dist/memory/project.d.ts.map +1 -0
- package/dist/memory/project.js +77 -0
- package/dist/memory/project.js.map +1 -0
- package/dist/memory/redact.d.ts +35 -0
- package/dist/memory/redact.d.ts.map +1 -0
- package/dist/memory/redact.js +275 -0
- package/dist/memory/redact.js.map +1 -0
- package/dist/memory/store.d.ts +75 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +325 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +165 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +88 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/sharing/bundle.d.ts +36 -0
- package/dist/sharing/bundle.d.ts.map +1 -0
- package/dist/sharing/bundle.js +130 -0
- package/dist/sharing/bundle.js.map +1 -0
- package/dist/sharing/export.d.ts +54 -0
- package/dist/sharing/export.d.ts.map +1 -0
- package/dist/sharing/export.js +77 -0
- package/dist/sharing/export.js.map +1 -0
- package/dist/sharing/import.d.ts +59 -0
- package/dist/sharing/import.d.ts.map +1 -0
- package/dist/sharing/import.js +101 -0
- package/dist/sharing/import.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conservative PII detection, run before anything leaves the machine.
|
|
3
|
+
*
|
|
4
|
+
* The bias here is deliberate: a false positive costs the user one keystroke
|
|
5
|
+
* in the export preview, a false negative leaks their medical history to a
|
|
6
|
+
* colleague. When in doubt, flag it.
|
|
7
|
+
*/
|
|
8
|
+
const LABELS = {
|
|
9
|
+
email: "email address",
|
|
10
|
+
phone: "phone number",
|
|
11
|
+
"government-id": "government ID",
|
|
12
|
+
"credit-card": "payment card",
|
|
13
|
+
"bank-account": "bank account",
|
|
14
|
+
secret: "credential or API key",
|
|
15
|
+
health: "health information",
|
|
16
|
+
financial: "financial information",
|
|
17
|
+
};
|
|
18
|
+
/** Lower priority categories lose when two findings cover the same text. */
|
|
19
|
+
const PRIORITY = [
|
|
20
|
+
"secret",
|
|
21
|
+
"credit-card",
|
|
22
|
+
"bank-account",
|
|
23
|
+
"government-id",
|
|
24
|
+
"email",
|
|
25
|
+
"phone",
|
|
26
|
+
"health",
|
|
27
|
+
"financial",
|
|
28
|
+
];
|
|
29
|
+
const EMAIL = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;
|
|
30
|
+
// Any run of 7-15 digits held together by the usual separators, optionally
|
|
31
|
+
// with a country code. Post-filtered below so "15min" and "2024-01-02" survive.
|
|
32
|
+
const PHONE_CANDIDATE = /\+?\d[\d\s().-]{5,}\d/g;
|
|
33
|
+
const SSN = /\b\d{3}-\d{2}-\d{4}\b/g;
|
|
34
|
+
// A bare 9-digit national ID is indistinguishable from any other number, so
|
|
35
|
+
// it only counts when the surrounding text says that is what it is.
|
|
36
|
+
const GOV_ID_IN_CONTEXT = /\b(?:ssn|social security|passport(?:\s*(?:no|number|#))?|national\s*id|id\s*(?:no|number|#)|driver'?s?\s*licen[cs]e|tax\s*id|tin)\b\W{0,12}([A-Z0-9][A-Z0-9-]{5,})/gi;
|
|
37
|
+
const CARD_CANDIDATE = /\b(?:\d[ -]?){13,19}\b/g;
|
|
38
|
+
const IBAN = /\b[A-Z]{2}\d{2}(?:[ ]?[A-Z0-9]{4}){2,7}[ ]?[A-Z0-9]{1,4}\b/g;
|
|
39
|
+
const BANK_IN_CONTEXT = /\b(?:iban|swift|bic|routing(?:\s*number)?|sort\s*code|account\s*(?:no|number|#))\b\W{0,12}([A-Z0-9][A-Z0-9-]{5,})/gi;
|
|
40
|
+
const SECRET_PATTERNS = [
|
|
41
|
+
/\bsk-[A-Za-z0-9_-]{16,}\b/g, // OpenAI-style
|
|
42
|
+
/\bsk-ant-[A-Za-z0-9_-]{16,}\b/g, // Anthropic
|
|
43
|
+
/\bgh[pousr]_[A-Za-z0-9]{20,}\b/g, // GitHub
|
|
44
|
+
/\bxox[abposr]-[A-Za-z0-9-]{10,}\b/g, // Slack
|
|
45
|
+
/\bAKIA[0-9A-Z]{16}\b/g, // AWS access key id
|
|
46
|
+
/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g,
|
|
47
|
+
/\b(?:api[_-]?key|secret|token|password|passwd|bearer)\b\s*[:=]\s*["']?([A-Za-z0-9_\-./+]{12,})["']?/gi,
|
|
48
|
+
];
|
|
49
|
+
const HEALTH_KEYWORDS = [
|
|
50
|
+
"diagnosis",
|
|
51
|
+
"diagnosed",
|
|
52
|
+
"prescription",
|
|
53
|
+
"prescribed",
|
|
54
|
+
"medication",
|
|
55
|
+
"dosage",
|
|
56
|
+
"symptom",
|
|
57
|
+
"therapist",
|
|
58
|
+
"therapy session",
|
|
59
|
+
"psychiatric",
|
|
60
|
+
"psychiatrist",
|
|
61
|
+
"antidepressant",
|
|
62
|
+
"depression",
|
|
63
|
+
"anxiety disorder",
|
|
64
|
+
"bipolar",
|
|
65
|
+
"adhd",
|
|
66
|
+
"autism",
|
|
67
|
+
"cancer",
|
|
68
|
+
"chemotherapy",
|
|
69
|
+
"tumor",
|
|
70
|
+
"hiv",
|
|
71
|
+
"diabetes",
|
|
72
|
+
"insulin",
|
|
73
|
+
"pregnant",
|
|
74
|
+
"pregnancy",
|
|
75
|
+
"miscarriage",
|
|
76
|
+
"fertility",
|
|
77
|
+
"surgery",
|
|
78
|
+
"hospitalized",
|
|
79
|
+
"medical record",
|
|
80
|
+
"blood test",
|
|
81
|
+
"disability",
|
|
82
|
+
"chronic illness",
|
|
83
|
+
];
|
|
84
|
+
const FINANCIAL_KEYWORDS = [
|
|
85
|
+
"salary",
|
|
86
|
+
"my income",
|
|
87
|
+
"net worth",
|
|
88
|
+
"credit score",
|
|
89
|
+
"mortgage",
|
|
90
|
+
"in debt",
|
|
91
|
+
"bankruptcy",
|
|
92
|
+
"bank balance",
|
|
93
|
+
"take-home pay",
|
|
94
|
+
"annual compensation",
|
|
95
|
+
"stock options",
|
|
96
|
+
"equity grant",
|
|
97
|
+
"severance",
|
|
98
|
+
];
|
|
99
|
+
/** Finds every PII-looking span in `text`, highest-confidence first. */
|
|
100
|
+
export function scanForPII(text) {
|
|
101
|
+
const found = [];
|
|
102
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
103
|
+
collect(text, pattern, "secret", found);
|
|
104
|
+
}
|
|
105
|
+
for (const m of matches(text, CARD_CANDIDATE)) {
|
|
106
|
+
const digits = m.value.replace(/\D/g, "");
|
|
107
|
+
if (digits.length < 13 || digits.length > 19)
|
|
108
|
+
continue;
|
|
109
|
+
if (!luhn(digits))
|
|
110
|
+
continue;
|
|
111
|
+
found.push(finding("credit-card", m.value, m.index));
|
|
112
|
+
}
|
|
113
|
+
collect(text, IBAN, "bank-account", found, (v) => /\d/.test(v) && /[A-Z]/.test(v));
|
|
114
|
+
collectGroup(text, BANK_IN_CONTEXT, "bank-account", found);
|
|
115
|
+
collect(text, SSN, "government-id", found);
|
|
116
|
+
collectGroup(text, GOV_ID_IN_CONTEXT, "government-id", found);
|
|
117
|
+
collect(text, EMAIL, "email", found);
|
|
118
|
+
for (const m of matches(text, PHONE_CANDIDATE)) {
|
|
119
|
+
if (!looksLikePhone(m.value))
|
|
120
|
+
continue;
|
|
121
|
+
found.push(finding("phone", m.value, m.index));
|
|
122
|
+
}
|
|
123
|
+
collectKeywords(text, HEALTH_KEYWORDS, "health", found);
|
|
124
|
+
collectKeywords(text, FINANCIAL_KEYWORDS, "financial", found);
|
|
125
|
+
return dedupe(found);
|
|
126
|
+
}
|
|
127
|
+
/** True when `text` carries anything that should not be exported by default. */
|
|
128
|
+
export function containsPII(text) {
|
|
129
|
+
return scanForPII(text).length > 0;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Replaces every finding with a `[redacted: ...]` marker. Keyword findings
|
|
133
|
+
* mark the keyword only -- the surrounding sentence is left intact so the
|
|
134
|
+
* user can see what they are deciding about.
|
|
135
|
+
*/
|
|
136
|
+
export function redact(text) {
|
|
137
|
+
const findings = scanForPII(text);
|
|
138
|
+
if (findings.length === 0)
|
|
139
|
+
return { text, findings };
|
|
140
|
+
// Right to left, so earlier offsets stay valid as we splice.
|
|
141
|
+
const ordered = [...findings].sort((a, b) => b.index - a.index);
|
|
142
|
+
let out = text;
|
|
143
|
+
for (const f of ordered) {
|
|
144
|
+
out =
|
|
145
|
+
out.slice(0, f.index) +
|
|
146
|
+
`[redacted: ${LABELS[f.category]}]` +
|
|
147
|
+
out.slice(f.index + f.match.length);
|
|
148
|
+
}
|
|
149
|
+
return { text: out, findings };
|
|
150
|
+
}
|
|
151
|
+
/** One line per finding, for the export preview. */
|
|
152
|
+
export function summarisePII(findings) {
|
|
153
|
+
const byCategory = new Map();
|
|
154
|
+
for (const f of findings)
|
|
155
|
+
byCategory.set(f.category, (byCategory.get(f.category) ?? 0) + 1);
|
|
156
|
+
return [...byCategory.entries()]
|
|
157
|
+
.map(([category, count]) => (count > 1 ? `${LABELS[category]} x${count}` : LABELS[category]))
|
|
158
|
+
.join(", ");
|
|
159
|
+
}
|
|
160
|
+
export function labelFor(category) {
|
|
161
|
+
return LABELS[category];
|
|
162
|
+
}
|
|
163
|
+
function finding(category, match, index) {
|
|
164
|
+
return { category, label: LABELS[category], match, index };
|
|
165
|
+
}
|
|
166
|
+
function* matches(text, pattern) {
|
|
167
|
+
const re = new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`);
|
|
168
|
+
let m;
|
|
169
|
+
while ((m = re.exec(text)) !== null) {
|
|
170
|
+
if (m[0] === "") {
|
|
171
|
+
re.lastIndex += 1;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
yield { value: m[0], index: m.index };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function collect(text, pattern, category, out, accept = () => true) {
|
|
178
|
+
for (const m of matches(text, pattern)) {
|
|
179
|
+
if (accept(m.value))
|
|
180
|
+
out.push(finding(category, m.value, m.index));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Like `collect`, but flags only capture group 1 (the value after a label). */
|
|
184
|
+
function collectGroup(text, pattern, category, out) {
|
|
185
|
+
const re = new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`);
|
|
186
|
+
let m;
|
|
187
|
+
while ((m = re.exec(text)) !== null) {
|
|
188
|
+
const value = m[1];
|
|
189
|
+
if (!value)
|
|
190
|
+
continue;
|
|
191
|
+
const index = m.index + m[0].lastIndexOf(value);
|
|
192
|
+
out.push(finding(category, value, index));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function collectKeywords(text, keywords, category, out) {
|
|
196
|
+
const lower = text.toLowerCase();
|
|
197
|
+
for (const keyword of keywords) {
|
|
198
|
+
let from = 0;
|
|
199
|
+
for (;;) {
|
|
200
|
+
const at = lower.indexOf(keyword, from);
|
|
201
|
+
if (at === -1)
|
|
202
|
+
break;
|
|
203
|
+
if (isWordBoundary(lower, at, keyword.length)) {
|
|
204
|
+
out.push(finding(category, text.slice(at, at + keyword.length), at));
|
|
205
|
+
}
|
|
206
|
+
from = at + keyword.length;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function isWordBoundary(text, index, length) {
|
|
211
|
+
const before = index === 0 ? "" : text[index - 1];
|
|
212
|
+
const after = text[index + length] ?? "";
|
|
213
|
+
return !/[a-z0-9]/i.test(before) && !/[a-z0-9]/i.test(after);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Keeps the highest-priority finding when spans overlap, so a credit card
|
|
217
|
+
* number is not also reported as a phone number.
|
|
218
|
+
*/
|
|
219
|
+
function dedupe(findings) {
|
|
220
|
+
const ranked = [...findings].sort((a, b) => {
|
|
221
|
+
const byPriority = PRIORITY.indexOf(a.category) - PRIORITY.indexOf(b.category);
|
|
222
|
+
if (byPriority !== 0)
|
|
223
|
+
return byPriority;
|
|
224
|
+
return b.match.length - a.match.length;
|
|
225
|
+
});
|
|
226
|
+
const kept = [];
|
|
227
|
+
for (const candidate of ranked) {
|
|
228
|
+
const start = candidate.index;
|
|
229
|
+
const end = start + candidate.match.length;
|
|
230
|
+
const overlaps = kept.some((k) => start < k.index + k.match.length && k.index < end);
|
|
231
|
+
if (!overlaps)
|
|
232
|
+
kept.push(candidate);
|
|
233
|
+
}
|
|
234
|
+
return kept.sort((a, b) => a.index - b.index);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Rejects the things that look like phone numbers but aren't: version strings,
|
|
238
|
+
* dates, plain counts, and anything with too few or too many digits.
|
|
239
|
+
*/
|
|
240
|
+
function looksLikePhone(value) {
|
|
241
|
+
const digits = value.replace(/\D/g, "");
|
|
242
|
+
if (digits.length < 7 || digits.length > 15)
|
|
243
|
+
return false;
|
|
244
|
+
const trimmed = value.trim();
|
|
245
|
+
// ISO dates and dotted versions.
|
|
246
|
+
if (/^\d{4}-\d{2}-\d{2}/.test(trimmed))
|
|
247
|
+
return false;
|
|
248
|
+
if (/^\d+(?:\.\d+){2,}$/.test(trimmed))
|
|
249
|
+
return false;
|
|
250
|
+
const separators = (trimmed.match(/[\s().-]/g) ?? []).length;
|
|
251
|
+
const hasCountryCode = trimmed.startsWith("+");
|
|
252
|
+
// A long unbroken digit run is more likely an id or an amount than a number
|
|
253
|
+
// someone would dial.
|
|
254
|
+
if (!hasCountryCode && separators === 0 && digits.length < 9)
|
|
255
|
+
return false;
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
function luhn(digits) {
|
|
259
|
+
let sum = 0;
|
|
260
|
+
let double = false;
|
|
261
|
+
for (let i = digits.length - 1; i >= 0; i -= 1) {
|
|
262
|
+
let d = digits.charCodeAt(i) - 48;
|
|
263
|
+
if (d < 0 || d > 9)
|
|
264
|
+
return false;
|
|
265
|
+
if (double) {
|
|
266
|
+
d *= 2;
|
|
267
|
+
if (d > 9)
|
|
268
|
+
d -= 9;
|
|
269
|
+
}
|
|
270
|
+
sum += d;
|
|
271
|
+
double = !double;
|
|
272
|
+
}
|
|
273
|
+
return sum % 10 === 0;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/memory/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Config, MemoryItem, type Confidence, type ImportProvenance, type MemorySource, type Suggestion, type Visibility } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Where the store lives. MEMSHARE_DIR wins, so a second identity can run side
|
|
4
|
+
* by side on one machine -- which is also how the two-person sharing flow is
|
|
5
|
+
* tested without two laptops.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveMemoryDir(): string;
|
|
8
|
+
export declare function expandHome(p: string): string;
|
|
9
|
+
/** Stable identity for a memory's text, used to dedup on import. */
|
|
10
|
+
export declare function contentKey(content: string): string;
|
|
11
|
+
export interface AddInput {
|
|
12
|
+
content: string;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
visibility?: Visibility;
|
|
15
|
+
confidence?: Confidence;
|
|
16
|
+
source?: Partial<MemorySource>;
|
|
17
|
+
expiresAt?: string;
|
|
18
|
+
id?: string;
|
|
19
|
+
importedFrom?: ImportProvenance;
|
|
20
|
+
}
|
|
21
|
+
export interface ListFilter {
|
|
22
|
+
/** Case-insensitive substring match against content and tags. */
|
|
23
|
+
query?: string;
|
|
24
|
+
/** An item matches when it carries at least one of these tags. */
|
|
25
|
+
tags?: string[];
|
|
26
|
+
visibility?: Visibility;
|
|
27
|
+
confidence?: Confidence;
|
|
28
|
+
/** Filter by the adapter that wrote the item: claude, chatgpt, cli, ... */
|
|
29
|
+
tool?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
/** Expired items are hidden unless this is set. */
|
|
32
|
+
includeExpired?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare class MemoryStore {
|
|
35
|
+
readonly root: string;
|
|
36
|
+
constructor(root?: string);
|
|
37
|
+
get memoriesDir(): string;
|
|
38
|
+
get bundlesDir(): string;
|
|
39
|
+
get configPath(): string;
|
|
40
|
+
get suggestionsPath(): string;
|
|
41
|
+
exists(): boolean;
|
|
42
|
+
/** Creates the directory layout and a config file. Safe to re-run. */
|
|
43
|
+
init(overrides?: Partial<Config>): Promise<Config>;
|
|
44
|
+
readConfig(): Promise<Config>;
|
|
45
|
+
writeConfig(config: Config): Promise<void>;
|
|
46
|
+
private itemPath;
|
|
47
|
+
add(input: AddInput): Promise<MemoryItem>;
|
|
48
|
+
get(id: string): Promise<MemoryItem | undefined>;
|
|
49
|
+
/** Every item on disk, newest first. Malformed files are skipped, not fatal. */
|
|
50
|
+
all(): Promise<MemoryItem[]>;
|
|
51
|
+
list(filter?: ListFilter): Promise<MemoryItem[]>;
|
|
52
|
+
update(id: string, patch: Partial<Pick<MemoryItem, "content" | "tags" | "visibility" | "expiresAt">>): Promise<MemoryItem | undefined>;
|
|
53
|
+
remove(id: string): Promise<boolean>;
|
|
54
|
+
/** Deletes items whose expiresAt has passed. Returns how many went. */
|
|
55
|
+
pruneExpired(): Promise<number>;
|
|
56
|
+
listTags(): Promise<string[]>;
|
|
57
|
+
/** Content keys of every stored item, for import-time dedup. */
|
|
58
|
+
contentKeys(): Promise<Set<string>>;
|
|
59
|
+
readSuggestions(): Promise<Suggestion[]>;
|
|
60
|
+
writeSuggestions(suggestions: Suggestion[]): Promise<void>;
|
|
61
|
+
addSuggestions(entries: Array<{
|
|
62
|
+
content: string;
|
|
63
|
+
tags?: string[];
|
|
64
|
+
}>, source?: Partial<MemorySource>): Promise<Suggestion[]>;
|
|
65
|
+
removeSuggestions(ids: string[]): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export declare function isExpired(item: MemoryItem, now?: number): boolean;
|
|
68
|
+
export declare function normaliseTags(tags: string[]): string[];
|
|
69
|
+
/** Parses --tags "a,b" (repeatable) into a flat tag list. */
|
|
70
|
+
export declare function parseTagList(value: string | string[] | undefined): string[];
|
|
71
|
+
/** Turns 7d / 12h / 30m, or an ISO date, into an absolute ISO timestamp. */
|
|
72
|
+
export declare function parseDuration(value: string, from?: Date): string;
|
|
73
|
+
/** Write via temp file + rename so a crash can't leave a half-written record. */
|
|
74
|
+
export declare function writeJsonAtomic(file: string, data: unknown): Promise<void>;
|
|
75
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
|