@batalabs/virlow-mcp-core 3.19.0 → 3.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -18
- package/README.md +1 -1
- package/dist/api.d.ts +14 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +6 -0
- package/dist/api.js.map +1 -1
- package/dist/attrs-extract.d.ts +48 -0
- package/dist/attrs-extract.d.ts.map +1 -0
- package/dist/attrs-extract.js +153 -0
- package/dist/attrs-extract.js.map +1 -0
- package/dist/attrs.d.ts +445 -0
- package/dist/attrs.d.ts.map +1 -0
- package/dist/attrs.js +604 -0
- package/dist/attrs.js.map +1 -0
- package/dist/cjs/api.d.ts +14 -0
- package/dist/cjs/api.js +6 -0
- package/dist/cjs/attrs-extract.d.ts +47 -0
- package/dist/cjs/attrs-extract.js +159 -0
- package/dist/cjs/attrs.d.ts +444 -0
- package/dist/cjs/attrs.js +635 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +22 -1
- package/dist/cjs/memories.d.ts +79 -1
- package/dist/cjs/memories.js +249 -15
- package/dist/cjs/memory-graph.d.ts +105 -0
- package/dist/cjs/memory-graph.js +270 -0
- package/dist/cjs/memory-note.d.ts +57 -0
- package/dist/cjs/memory-note.js +174 -10
- package/dist/cjs/memory-secrets.d.ts +19 -0
- package/dist/cjs/memory-secrets.js +108 -0
- package/dist/cjs/notes.d.ts +208 -2
- package/dist/cjs/notes.js +721 -12
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/memories.d.ts +79 -1
- package/dist/memories.d.ts.map +1 -1
- package/dist/memories.js +249 -15
- package/dist/memories.js.map +1 -1
- package/dist/memory-graph.d.ts +106 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +258 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/memory-note.d.ts +57 -0
- package/dist/memory-note.d.ts.map +1 -1
- package/dist/memory-note.js +170 -10
- package/dist/memory-note.js.map +1 -1
- package/dist/memory-secrets.d.ts +20 -0
- package/dist/memory-secrets.d.ts.map +1 -0
- package/dist/memory-secrets.js +103 -0
- package/dist/memory-secrets.js.map +1 -0
- package/dist/notes.d.ts +208 -2
- package/dist/notes.d.ts.map +1 -1
- package/dist/notes.js +722 -13
- package/dist/notes.js.map +1 -1
- package/dist/tools.d.ts +2 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +464 -9
- package/dist/tools.js.map +1 -1
- package/package.json +15 -5
package/dist/memory-note.js
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
import { parse as parseYaml } from 'yaml';
|
|
2
|
+
import { decodeEntities } from './attrs-extract.js';
|
|
2
3
|
/** Serialisation order, so a rewrite of unchanged metadata is a no-op diff. */
|
|
3
|
-
const KEY_ORDER = [
|
|
4
|
+
const KEY_ORDER = [
|
|
5
|
+
'source',
|
|
6
|
+
'tags',
|
|
7
|
+
'confidence',
|
|
8
|
+
'created',
|
|
9
|
+
'format',
|
|
10
|
+
'about',
|
|
11
|
+
'relations',
|
|
12
|
+
'validFrom',
|
|
13
|
+
'validTo',
|
|
14
|
+
'supersededBy',
|
|
15
|
+
];
|
|
16
|
+
/** The frontmatter key for each field: snake_case on disk, as a person
|
|
17
|
+
* editing the YAML would write it. */
|
|
18
|
+
const YAML_KEY = {
|
|
19
|
+
validFrom: 'valid_from',
|
|
20
|
+
validTo: 'valid_to',
|
|
21
|
+
supersededBy: 'superseded_by',
|
|
22
|
+
};
|
|
23
|
+
/** A date field as a string: YAML reads an unquoted date as a Date. */
|
|
24
|
+
function dateField(value) {
|
|
25
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
26
|
+
return value.trim();
|
|
27
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
28
|
+
const iso = value.toISOString();
|
|
29
|
+
// A bare date comes back as midnight UTC; keep it a date.
|
|
30
|
+
return iso.endsWith('T00:00:00.000Z') ? iso.slice(0, 10) : iso;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
function coerceRelation(raw) {
|
|
35
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
36
|
+
return null;
|
|
37
|
+
const r = raw;
|
|
38
|
+
const text = (v) => (typeof v === 'string' && v.trim() !== '' ? v.trim() : null);
|
|
39
|
+
const s = text(r.s);
|
|
40
|
+
const p = text(r.p);
|
|
41
|
+
const o = text(r.o);
|
|
42
|
+
if (!s || !p || !o)
|
|
43
|
+
return null;
|
|
44
|
+
const relation = { s, p, o };
|
|
45
|
+
const from = dateField(r.from);
|
|
46
|
+
const to = dateField(r.to);
|
|
47
|
+
if (from)
|
|
48
|
+
relation.from = from;
|
|
49
|
+
if (to)
|
|
50
|
+
relation.to = to;
|
|
51
|
+
return relation;
|
|
52
|
+
}
|
|
4
53
|
const FENCE = '---';
|
|
5
54
|
/**
|
|
6
55
|
* The note type a memory is written as.
|
|
@@ -59,8 +108,86 @@ function coerceMeta(raw) {
|
|
|
59
108
|
// YAML parses unquoted ISO timestamps into Dates.
|
|
60
109
|
meta.created = raw.created.toISOString();
|
|
61
110
|
}
|
|
111
|
+
if (raw.format === 'html')
|
|
112
|
+
meta.format = 'html';
|
|
113
|
+
if (Array.isArray(raw.about)) {
|
|
114
|
+
const about = raw.about.filter((a) => typeof a === 'string' && a.trim() !== '');
|
|
115
|
+
if (about.length > 0)
|
|
116
|
+
meta.about = about.map((a) => a.trim());
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(raw.relations)) {
|
|
119
|
+
// One malformed relation is dropped; its neighbours survive.
|
|
120
|
+
const relations = raw.relations
|
|
121
|
+
.map(coerceRelation)
|
|
122
|
+
.filter((r) => r !== null);
|
|
123
|
+
if (relations.length > 0)
|
|
124
|
+
meta.relations = relations;
|
|
125
|
+
}
|
|
126
|
+
const validFrom = dateField(raw.valid_from);
|
|
127
|
+
if (validFrom)
|
|
128
|
+
meta.validFrom = validFrom;
|
|
129
|
+
const validTo = dateField(raw.valid_to);
|
|
130
|
+
if (validTo)
|
|
131
|
+
meta.validTo = validTo;
|
|
132
|
+
if (typeof raw.superseded_by === 'string' && raw.superseded_by !== '') {
|
|
133
|
+
meta.supersededBy = raw.superseded_by;
|
|
134
|
+
}
|
|
62
135
|
return meta;
|
|
63
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* A rich fact as text an AI can read: one line per paragraph, heading or
|
|
139
|
+
* list item, list items marked, code and inline marks reduced to their text.
|
|
140
|
+
* Entities are decoded, so a fact that talks about `<p>` tags reads back as
|
|
141
|
+
* exactly that.
|
|
142
|
+
*/
|
|
143
|
+
export function memoryHtmlToText(html) {
|
|
144
|
+
const text = html
|
|
145
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
146
|
+
// A list item's paragraph is the item, not a paragraph of its own.
|
|
147
|
+
.replace(/<li[^>]*>\s*(<p[^>]*>)?/gi, '- ')
|
|
148
|
+
.replace(/(<\/p>)?\s*<\/li>/gi, '\n')
|
|
149
|
+
.replace(/<\/(p|h[1-6]|blockquote|pre|ul|ol|table)>/gi, '\n\n')
|
|
150
|
+
.replace(/<\/tr>/gi, '\n')
|
|
151
|
+
.replace(/<\/(td|th)>/gi, ' ')
|
|
152
|
+
.replace(/<[^>]+>/g, '');
|
|
153
|
+
return decodeEntities(text)
|
|
154
|
+
.split('\n')
|
|
155
|
+
.map((line) => line.replace(/[ \t]+$/, ''))
|
|
156
|
+
.join('\n')
|
|
157
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
158
|
+
.trim();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Plain text as the rich editor's HTML: a paragraph per blank-line-separated
|
|
162
|
+
* block, single line breaks kept, everything escaped. Used to open a
|
|
163
|
+
* connector-written (plain) memory in the editor.
|
|
164
|
+
*/
|
|
165
|
+
export function memoryTextToHtml(text) {
|
|
166
|
+
const escape = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
167
|
+
const blocks = text.split(/\n{2,}/).filter((b) => b.trim() !== '');
|
|
168
|
+
if (blocks.length === 0)
|
|
169
|
+
return '<p></p>';
|
|
170
|
+
return blocks.map((b) => `<p>${b.split('\n').map(escape).join('<br>')}</p>`).join('');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* A plain-text fact that is really HTML: it opens and closes with a block
|
|
174
|
+
* tag. AI tools told that Virlow notes are HTML sometimes write a memory the
|
|
175
|
+
* same way, without the `format` marker the app adds, and it then showed its
|
|
176
|
+
* tags as text. A fact that merely mentions a tag ("every paragraph in
|
|
177
|
+
* <p>") does not start and end with one, so it stays text.
|
|
178
|
+
*/
|
|
179
|
+
const BLOCK = '(p|ul|ol|h[1-6]|blockquote|pre|table|div)';
|
|
180
|
+
const OPENS_WITH_BLOCK = new RegExp(`^\\s*<${BLOCK}[\\s>]`, 'i');
|
|
181
|
+
const CLOSES_WITH_BLOCK = new RegExp(`</${BLOCK}>\\s*$`, 'i');
|
|
182
|
+
export function looksLikeHtml(fact) {
|
|
183
|
+
return OPENS_WITH_BLOCK.test(fact) && CLOSES_WITH_BLOCK.test(fact);
|
|
184
|
+
}
|
|
185
|
+
function plainOrHtml(fact, meta) {
|
|
186
|
+
if (meta.format === 'html' || looksLikeHtml(fact)) {
|
|
187
|
+
return { fact: memoryHtmlToText(fact), meta, html: fact };
|
|
188
|
+
}
|
|
189
|
+
return { fact, meta };
|
|
190
|
+
}
|
|
64
191
|
/**
|
|
65
192
|
* Split a decrypted note body into its fact and metadata.
|
|
66
193
|
*
|
|
@@ -75,19 +202,19 @@ export function parseMemoryNote(decryptedContent) {
|
|
|
75
202
|
// a plain note dropped into the folder by hand — still reads correctly.
|
|
76
203
|
const body = unwrapEnvelope(decryptedContent);
|
|
77
204
|
if (!body.startsWith(`${FENCE}\n`))
|
|
78
|
-
return
|
|
205
|
+
return plainOrHtml(body, {});
|
|
79
206
|
// Only the first fence pair is frontmatter; --- lines inside the fact are
|
|
80
207
|
// ordinary content.
|
|
81
208
|
const close = body.indexOf(`\n${FENCE}\n`, FENCE.length);
|
|
82
209
|
if (close === -1)
|
|
83
|
-
return
|
|
210
|
+
return plainOrHtml(body, {});
|
|
84
211
|
const front = body.slice(FENCE.length + 1, close);
|
|
85
212
|
const fact = body.slice(close + FENCE.length + 2);
|
|
86
213
|
// An empty fence is the marker `serializeMemoryBody` writes when a fact
|
|
87
214
|
// would otherwise be misread as its own frontmatter. Strip it and keep the
|
|
88
215
|
// fact whole.
|
|
89
216
|
if (front.trim() === '')
|
|
90
|
-
return
|
|
217
|
+
return plainOrHtml(fact, {});
|
|
91
218
|
let raw;
|
|
92
219
|
try {
|
|
93
220
|
raw = parseYaml(front);
|
|
@@ -98,7 +225,7 @@ export function parseMemoryNote(decryptedContent) {
|
|
|
98
225
|
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
99
226
|
return { fact: body, meta: {} };
|
|
100
227
|
}
|
|
101
|
-
return
|
|
228
|
+
return plainOrHtml(fact, coerceMeta(raw));
|
|
102
229
|
}
|
|
103
230
|
function yamlScalar(value) {
|
|
104
231
|
// Quote anything YAML would otherwise reinterpret (or that would break the
|
|
@@ -112,19 +239,42 @@ function yamlScalar(value) {
|
|
|
112
239
|
* there is no metadata to record.
|
|
113
240
|
*/
|
|
114
241
|
export function serializeMemoryBody(fact, meta) {
|
|
242
|
+
// Plain text, always: `format` describes the body, so it is dropped here
|
|
243
|
+
// rather than carried forward from the memory being updated. An AI
|
|
244
|
+
// rewriting a rich memory writes text, and the marker must not survive
|
|
245
|
+
// onto a body it no longer describes.
|
|
246
|
+
const { format: _format, ...plain } = meta;
|
|
247
|
+
return writeBody(fact, plain);
|
|
248
|
+
}
|
|
249
|
+
/** The app's rich editor output, marked as HTML. */
|
|
250
|
+
export function serializeMemoryHtml(html, meta) {
|
|
251
|
+
return writeBody(html, { ...meta, format: 'html' });
|
|
252
|
+
}
|
|
253
|
+
function writeBody(fact, meta) {
|
|
115
254
|
const lines = [];
|
|
116
255
|
for (const key of KEY_ORDER) {
|
|
117
256
|
const value = meta[key];
|
|
118
257
|
if (value === undefined)
|
|
119
258
|
continue;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
259
|
+
const name = YAML_KEY[key] ?? key;
|
|
260
|
+
if (key === 'tags' || key === 'about') {
|
|
261
|
+
const list = value;
|
|
262
|
+
if (list.length === 0)
|
|
263
|
+
continue;
|
|
264
|
+
lines.push(`${name}: [${list.map(yamlScalar).join(', ')}]`);
|
|
265
|
+
}
|
|
266
|
+
else if (key === 'relations') {
|
|
267
|
+
const relations = value;
|
|
268
|
+
if (relations.length === 0)
|
|
123
269
|
continue;
|
|
124
|
-
|
|
270
|
+
// Flow style, one relation per line: JSON is valid YAML, and this
|
|
271
|
+
// keeps each edge readable and editable by hand.
|
|
272
|
+
lines.push(`${name}:`);
|
|
273
|
+
for (const r of relations)
|
|
274
|
+
lines.push(` - ${JSON.stringify(r)}`);
|
|
125
275
|
}
|
|
126
276
|
else {
|
|
127
|
-
lines.push(`${
|
|
277
|
+
lines.push(`${name}: ${yamlScalar(value)}`);
|
|
128
278
|
}
|
|
129
279
|
}
|
|
130
280
|
if (lines.length === 0) {
|
|
@@ -148,6 +298,16 @@ export function mergeMeta(existing, changes) {
|
|
|
148
298
|
merged.tags = [...changes.tags];
|
|
149
299
|
if (changes.confidence !== undefined)
|
|
150
300
|
merged.confidence = changes.confidence;
|
|
301
|
+
if (changes.about !== undefined)
|
|
302
|
+
merged.about = [...changes.about];
|
|
303
|
+
if (changes.relations !== undefined)
|
|
304
|
+
merged.relations = changes.relations.map((r) => ({ ...r }));
|
|
305
|
+
if (changes.validFrom !== undefined)
|
|
306
|
+
merged.validFrom = changes.validFrom;
|
|
307
|
+
if (changes.validTo !== undefined)
|
|
308
|
+
merged.validTo = changes.validTo;
|
|
309
|
+
if (changes.supersededBy !== undefined)
|
|
310
|
+
merged.supersededBy = changes.supersededBy;
|
|
151
311
|
// Pinned to the first write, so an in-place dedupe merge cannot make an old
|
|
152
312
|
// memory look newly created.
|
|
153
313
|
if (changes.created !== undefined && existing.created === undefined) {
|
package/dist/memory-note.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-note.js","sourceRoot":"","sources":["../src/memory-note.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-note.js","sourceRoot":"","sources":["../src/memory-note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAmEpD,+EAA+E;AAC/E,MAAM,SAAS,GAAG;IAChB,QAAQ;IACR,MAAM;IACN,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,OAAO;IACP,WAAW;IACX,WAAW;IACX,SAAS;IACT,cAAc;CACN,CAAC;AAEX;uCACuC;AACvC,MAAM,QAAQ,GAAwD;IACpE,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,UAAU;IACnB,YAAY,EAAE,eAAe;CAC9B,CAAC;AAEF,uEAAuE;AACvE,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1E,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,0DAA0D;QAC1D,OAAO,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,QAAQ,GAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,KAAK,GAAG,KAAK,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IACE,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAQ,MAA6B,CAAC,IAAI,KAAK,QAAQ,EACvD,CAAC;YACD,OAAQ,MAA2B,CAAC,IAAI,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;6DAC6D;AAC7D,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAE7D,IACE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EACzD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,2EAA2E;IAC3E,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;QACvC,kDAAkD;QAClD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7F,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,6DAA6D;QAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS;aAC5B,GAAG,CAAC,cAAc,CAAC;aACnB,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IACvD,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACpC,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;QACtE,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9B,mEAAmE;SAClE,OAAO,CAAC,2BAA2B,EAAE,IAAI,CAAC;SAC1C,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC;SACpC,OAAO,CAAC,6CAA6C,EAAE,MAAM,CAAC;SAC9D,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;SACzB,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,cAAc,CAAC,IAAI,CAAC;SACxB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SAC1C,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAC3B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,KAAK,GAAG,2CAA2C,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,GAAG,CAAC,CAAC;AACjE,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC9D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAgB;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB;IACtD,2EAA2E;IAC3E,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,IAAI,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEjE,0EAA0E;IAC1E,oBAAoB;IACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElD,wEAAwE;IACxE,2EAA2E;IAC3E,cAAc;IACd,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,GAA8B,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,2EAA2E;IAC3E,kDAAkD;IAClD,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrE,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAgB;IAChE,yEAAyE;IACzE,mEAAmE;IACnE,uEAAuE;IACvE,sCAAsC;IACtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAC3C,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAgB;IAChE,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAgB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAClC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAiB,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,KAAyB,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACrC,kEAAkE;YAClE,iDAAiD;YACjD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,UAAU,CAAC,KAAe,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,+DAA+D;QAC/D,sEAAsE;QACtE,0CAA0C;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,QAAoB,EAAE,OAAmB;IACjE,MAAM,MAAM,GAAe,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACjE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC7E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC1E,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACpE,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACnF,4EAA4E;IAC5E,6BAA6B;IAC7B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuses memories that contain credentials, before anything is written.
|
|
3
|
+
*
|
|
4
|
+
* Memories are captured automatically, so the rule cannot depend on the AI
|
|
5
|
+
* remembering not to save a key: a memory is encrypted, but it is recalled
|
|
6
|
+
* into prompts and shown in the app, and a secret has no business in either.
|
|
7
|
+
* The check is on-device and returns a reason, so the AI can say what it
|
|
8
|
+
* left out instead of retrying with the secret reworded.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately narrow: patterns that are credentials with near certainty,
|
|
11
|
+
* plus long high-entropy tokens. A false positive costs one memory; a false
|
|
12
|
+
* negative puts a live key into every future prompt that recalls it.
|
|
13
|
+
*/
|
|
14
|
+
/** What secret the text holds, or null when it holds none. */
|
|
15
|
+
export declare function findSecret(text: string): string | null;
|
|
16
|
+
export declare class SecretInMemoryError extends Error {
|
|
17
|
+
constructor(what: string);
|
|
18
|
+
}
|
|
19
|
+
export declare function assertNoSecret(...texts: string[]): void;
|
|
20
|
+
//# sourceMappingURL=memory-secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-secrets.d.ts","sourceRoot":"","sources":["../src/memory-secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAmEH,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOtD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,IAAI,EAAE,MAAM;CAOzB;AAED,wBAAgB,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAKvD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuses memories that contain credentials, before anything is written.
|
|
3
|
+
*
|
|
4
|
+
* Memories are captured automatically, so the rule cannot depend on the AI
|
|
5
|
+
* remembering not to save a key: a memory is encrypted, but it is recalled
|
|
6
|
+
* into prompts and shown in the app, and a secret has no business in either.
|
|
7
|
+
* The check is on-device and returns a reason, so the AI can say what it
|
|
8
|
+
* left out instead of retrying with the secret reworded.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately narrow: patterns that are credentials with near certainty,
|
|
11
|
+
* plus long high-entropy tokens. A false positive costs one memory; a false
|
|
12
|
+
* negative puts a live key into every future prompt that recalls it.
|
|
13
|
+
*/
|
|
14
|
+
const PATTERNS = [
|
|
15
|
+
{ what: 'a private key', test: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },
|
|
16
|
+
{ what: 'an AWS access key', test: /\b(AKIA|ASIA)[0-9A-Z]{16}\b/ },
|
|
17
|
+
{ what: 'a GitHub token', test: /\b(ghp|gho|ghu|ghs|ghr|github_pat)_[A-Za-z0-9_]{20,}\b/ },
|
|
18
|
+
{ what: 'a Slack token', test: /\bxox[abprs]-[A-Za-z0-9-]{10,}\b/ },
|
|
19
|
+
{ what: 'a Stripe key', test: /\b(sk|rk|pk)_(live|test)_[A-Za-z0-9]{16,}\b/ },
|
|
20
|
+
{ what: 'a Stripe webhook secret', test: /\bwhsec_[A-Za-z0-9]{16,}\b/ },
|
|
21
|
+
{ what: 'an API key', test: /\bsk-(ant-|proj-)?[A-Za-z0-9_-]{20,}\b/ },
|
|
22
|
+
{ what: 'a Google API key', test: /\bAIza[0-9A-Za-z_-]{35}\b/ },
|
|
23
|
+
{ what: 'a JSON web token', test: /\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/ },
|
|
24
|
+
{
|
|
25
|
+
what: 'a password',
|
|
26
|
+
test: /\b(password|passwd|pwd|passphrase|api[_ -]?key|secret|token)\s*[:=]\s*\S{6,}/i,
|
|
27
|
+
},
|
|
28
|
+
{ what: 'a connection string with a password', test: /\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s@/]{3,}@/i },
|
|
29
|
+
];
|
|
30
|
+
/** Luhn-valid runs of 13 to 19 digits, spaces or dashes allowed. */
|
|
31
|
+
function hasCardNumber(text) {
|
|
32
|
+
for (const match of text.matchAll(/\b(?:\d[ -]?){13,19}\b/g)) {
|
|
33
|
+
const digits = match[0].replace(/\D/g, '');
|
|
34
|
+
if (digits.length < 13 || digits.length > 19)
|
|
35
|
+
continue;
|
|
36
|
+
let sum = 0;
|
|
37
|
+
for (let i = 0; i < digits.length; i++) {
|
|
38
|
+
let d = Number(digits[digits.length - 1 - i]);
|
|
39
|
+
if (i % 2 === 1) {
|
|
40
|
+
d *= 2;
|
|
41
|
+
if (d > 9)
|
|
42
|
+
d -= 9;
|
|
43
|
+
}
|
|
44
|
+
sum += d;
|
|
45
|
+
}
|
|
46
|
+
if (sum % 10 === 0)
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/** Shannon entropy per character. */
|
|
52
|
+
function entropy(token) {
|
|
53
|
+
const counts = new Map();
|
|
54
|
+
for (const ch of token)
|
|
55
|
+
counts.set(ch, (counts.get(ch) ?? 0) + 1);
|
|
56
|
+
let bits = 0;
|
|
57
|
+
for (const n of counts.values()) {
|
|
58
|
+
const p = n / token.length;
|
|
59
|
+
bits -= p * Math.log2(p);
|
|
60
|
+
}
|
|
61
|
+
return bits;
|
|
62
|
+
}
|
|
63
|
+
/** A long run of mixed letters and digits with no structure a person
|
|
64
|
+
* writes: what an unlabelled key or token looks like. Ids like UUIDs and
|
|
65
|
+
* hex hashes are common in notes and are left alone. */
|
|
66
|
+
function hasHighEntropyToken(text) {
|
|
67
|
+
for (const [token] of text.matchAll(/[A-Za-z0-9+/_=-]{32,}/g)) {
|
|
68
|
+
if (/^[0-9a-f-]+$/i.test(token))
|
|
69
|
+
continue; // uuid or hex hash
|
|
70
|
+
if (!/[a-z]/.test(token) || !/[A-Z]/.test(token) || !/[0-9]/.test(token))
|
|
71
|
+
continue;
|
|
72
|
+
if (entropy(token) >= 4.2)
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/** What secret the text holds, or null when it holds none. */
|
|
78
|
+
export function findSecret(text) {
|
|
79
|
+
for (const pattern of PATTERNS) {
|
|
80
|
+
if (pattern.test.test(text))
|
|
81
|
+
return pattern.what;
|
|
82
|
+
}
|
|
83
|
+
if (hasCardNumber(text))
|
|
84
|
+
return 'a card number';
|
|
85
|
+
if (hasHighEntropyToken(text))
|
|
86
|
+
return 'what looks like a key or token';
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
export class SecretInMemoryError extends Error {
|
|
90
|
+
constructor(what) {
|
|
91
|
+
super(`Not saved: this memory contains ${what}. Memories are recalled into prompts, so credentials are never ` +
|
|
92
|
+
'stored. Save the fact without the secret (for example "the API key is in 1Password"), not the secret.');
|
|
93
|
+
this.name = 'SecretInMemoryError';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function assertNoSecret(...texts) {
|
|
97
|
+
for (const text of texts) {
|
|
98
|
+
const what = findSecret(text);
|
|
99
|
+
if (what)
|
|
100
|
+
throw new SecretInMemoryError(what);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=memory-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-secrets.js","sourceRoot":"","sources":["../src/memory-secrets.ts"],"names":[],"mappings":"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"}
|