@futdevpro/fdp-agent-memory 1.1.130 → 1.1.134
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/build/package.json +1 -1
- package/build/src/_collections/config-catalog.const.js +12 -0
- package/build/src/_collections/error-codes.const.js +2 -0
- package/build/src/_collections/fam-db-models.const.js +2 -0
- package/build/src/_collections/fam-error-context.util.js +1 -0
- package/build/src/_models/data-models/fam-dup-audit.data-model.js +72 -0
- package/build/src/_modules/embedding/_collections/fam-dup-file-rollup.util.js +48 -0
- package/build/src/_modules/embedding/_collections/fam-dup-fork-pair.util.js +86 -0
- package/build/src/_modules/embedding/_services/fam-dup-audit-scheduler.control-service.js +140 -0
- package/build/src/_modules/embedding/_services/fam-dup-audit.control-service.js +141 -0
- package/build/src/_modules/embedding/_services/fam-dup-audit.data-service.js +66 -0
- package/build/src/_modules/embedding/_services/fam-dup-coverage.control-service.js +123 -0
- package/build/src/_modules/embedding/_services/fam-duplicate-scan.control-service.js +63 -10
- package/build/src/_modules/embedding/_services/fam-embedding-bootstrap.control-service.js +9 -0
- package/build/src/_modules/embedding/_services/fam-exact-duplication.control-service.js +309 -0
- package/build/src/_modules/embedding/index.js +16 -1
- package/build/src/_modules/mcp/_services/fam-capability-registry.service.js +67 -0
- package/build/src/_modules/retrieval/_collections/fam-rule-propagation.util.js +1 -1
- package/build/src/app.server.js +52 -0
- package/client-dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -337,6 +337,9 @@ class FAM_CapabilityRegistry_Service {
|
|
|
337
337
|
projects: { type: 'array', items: { type: 'string' }, description: 'Csak ezek a projektek (scopePath project-layer canonicalName).' },
|
|
338
338
|
excludeProjects: { type: 'array', items: { type: 'string' }, description: 'Kizárt projektek (fork-zaj — pl. ccap — elnyomása).' },
|
|
339
339
|
minProjects: { type: 'number', description: 'Csak a legalább ennyi KÜLÖNBÖZŐ projektet átfedő clusterek (default 2).' },
|
|
340
|
+
minContentLength: { type: 'number', description: 'Minimális content-hossz (karakter) — a rövid boilerplate-zaj kizárása a prefilterben (dup-v2).' },
|
|
341
|
+
suppressForkPairs: { type: 'boolean', description: 'A fork-gyanús projekt-párokra eső clusterek elnyomása a kimenetben (default false; dup-v2).' },
|
|
342
|
+
includeCoverage: { type: 'boolean', description: 'A lefedettség-preflight beágyazása az eredménybe (default true; dup-v2).' },
|
|
340
343
|
}),
|
|
341
344
|
handler: async (args) => {
|
|
342
345
|
const input = this.asObject(args);
|
|
@@ -352,9 +355,73 @@ class FAM_CapabilityRegistry_Service {
|
|
|
352
355
|
projects: this.asStringArray(input.projects),
|
|
353
356
|
excludeProjects: this.asStringArray(input.excludeProjects),
|
|
354
357
|
minProjects: this.asNumber(input.minProjects) ?? 2,
|
|
358
|
+
minContentLength: this.asNumber(input.minContentLength),
|
|
359
|
+
suppressForkPairs: input.suppressForkPairs === true,
|
|
360
|
+
includeCoverage: input.includeCoverage !== false,
|
|
355
361
|
}));
|
|
356
362
|
},
|
|
357
363
|
});
|
|
364
|
+
// detect_exact_duplication (dup-v2, task #20): EXACT (contentHash-azonos) duplikáció-mérés egyetlen
|
|
365
|
+
// Mongo-aggregációval — a TELJES szűrt halmazon fut (nincs maxEntries-cap, nincs vektor-számítás), így a
|
|
366
|
+
// flotta-szintű „mennyi az exact duplikáció?" kérdés kanonikus mérője. A near-dup scan (fent) a drift-elt
|
|
367
|
+
// másolatokra való; ez a bitre-azonos sokszorozódásra.
|
|
368
|
+
this.register({
|
|
369
|
+
name: 'detect_exact_duplication', category: category,
|
|
370
|
+
description: 'EXACT (contentHash-azonos) duplikáció-mérés (read-only; dup-v2 task #20): egyetlen Mongo-'
|
|
371
|
+
+ 'aggregáció a TELJES szűrt halmazon (a 300k-s codebase táron is cap nélkül fut). Kimenet: totals '
|
|
372
|
+
+ '(totalGroups/redundantCopies/wastedChars) + top-N csoport (wasted DESC, projekt-/repo-lefedettséggel '
|
|
373
|
+
+ '+ fájl-listával) + fork-pár statisztika (`forkPairs`) + a ≥4-projektes csoport-hash-ek + '
|
|
374
|
+
+ 'lefedettség-preflight (`coverage`, default be). A `suppressForkPairs` a fork-gyanús párokra eső '
|
|
375
|
+
+ 'csoportokat elnyomja a listából (a totals a mért valóság marad). A `minContentLength` a rövid '
|
|
376
|
+
+ 'boilerplate-zajt szűri (ajánlott: 200).',
|
|
377
|
+
inputSchema: this.objectSchema({
|
|
378
|
+
table: this.tableSchema(false),
|
|
379
|
+
pathRegex: { type: 'string', description: 'A sourceFilePath include-regexe (case-insensitive).' },
|
|
380
|
+
excludePathRegex: { type: 'string', description: 'A sourceFilePath exclude-regexe.' },
|
|
381
|
+
excludeRootRegex: { type: 'string', description: 'A source.root exclude-regexe (pl. "STALE-projects").' },
|
|
382
|
+
projects: { type: 'array', items: { type: 'string' }, description: 'Csak ezek a projektek (scopePath project-layer canonicalName).' },
|
|
383
|
+
excludeProjects: { type: 'array', items: { type: 'string' }, description: 'Kizárt projektek.' },
|
|
384
|
+
minProjects: { type: 'number', description: 'Csak a legalább ennyi KÜLÖNBÖZŐ projektet átfedő csoportok (default 1).' },
|
|
385
|
+
minContentLength: { type: 'number', description: 'Minimális content-hossz karakterben (default 0; ajánlott 200 a boilerplate-zaj ellen).' },
|
|
386
|
+
maxGroups: { type: 'number', description: 'A visszaadott top-csoportok száma (default 100, hard cap 500; a totals a teljes halmazon számolt).' },
|
|
387
|
+
maxFilesPerGroup: { type: 'number', description: 'Per-csoport fájl-lista cap (default 20; a filesTruncated jelzi a csonkolást).' },
|
|
388
|
+
suppressForkPairs: { type: 'boolean', description: 'A fork-gyanús projekt-párokra eső csoportok elnyomása a listából (default false).' },
|
|
389
|
+
includeCoverage: { type: 'boolean', description: 'A lefedettség-preflight beágyazása (default true).' },
|
|
390
|
+
}),
|
|
391
|
+
handler: async (args) => {
|
|
392
|
+
const input = this.asObject(args);
|
|
393
|
+
return this.ok(await embedding_1.FAM_ExactDuplication_ControlService.getInstance().run({
|
|
394
|
+
table: this.optionalTable(input.table),
|
|
395
|
+
pathRegex: this.asString(input.pathRegex),
|
|
396
|
+
excludePathRegex: this.asString(input.excludePathRegex),
|
|
397
|
+
excludeRootRegex: this.asString(input.excludeRootRegex),
|
|
398
|
+
projects: this.asStringArray(input.projects),
|
|
399
|
+
excludeProjects: this.asStringArray(input.excludeProjects),
|
|
400
|
+
minProjects: this.asNumber(input.minProjects),
|
|
401
|
+
minContentLength: this.asNumber(input.minContentLength),
|
|
402
|
+
maxGroups: this.asNumber(input.maxGroups),
|
|
403
|
+
maxFilesPerGroup: this.asNumber(input.maxFilesPerGroup),
|
|
404
|
+
suppressForkPairs: input.suppressForkPairs === true,
|
|
405
|
+
includeCoverage: input.includeCoverage !== false,
|
|
406
|
+
}));
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
// duplication_coverage_report (dup-v2, task #20): a dup-mérés lefedettség-preflight-je ÖNÁLLÓ eszközként —
|
|
410
|
+
// mely projektek hiányoznak (0 entry) vagy elavultak a korpuszból (a „nincs duplikáció X-szel" hamis-negatív
|
|
411
|
+
// gyanújának ellenőrzése a mérés ELŐTT/UTÁN).
|
|
412
|
+
this.register({
|
|
413
|
+
name: 'duplication_coverage_report', category: category,
|
|
414
|
+
description: 'A dup-mérés LEFEDETTSÉG-preflight riportja (read-only; dup-v2): a scope-fa project-layer '
|
|
415
|
+
+ 'listája × a tár per-projekt entry-száma + a legfrissebb entry kora. Kimenet: zeroEntryProjects '
|
|
416
|
+
+ '(a mérésből NÉMÁN kimaradók), staleProjects (> 8 nap), per-projekt sorok (entryCount DESC) + '
|
|
417
|
+
+ 'warnings. A dup-eredmény flotta-szintű értelmezésének előfeltétele.',
|
|
418
|
+
inputSchema: this.objectSchema({ table: this.tableSchema(false) }),
|
|
419
|
+
handler: async (args) => {
|
|
420
|
+
const input = this.asObject(args);
|
|
421
|
+
return this.ok(await embedding_1.FAM_DupCoverage_ControlService.getInstance()
|
|
422
|
+
.report(this.optionalTable(input.table) ?? fam_table_type_enum_1.FAM_Table.codebase));
|
|
423
|
+
},
|
|
424
|
+
});
|
|
358
425
|
}
|
|
359
426
|
/** maintenance → MP-2 (re-embed) + MP-3 (rebuild reference index). */
|
|
360
427
|
registerMaintenance() {
|
|
@@ -47,7 +47,7 @@ class FAM_RulePropagation_Util {
|
|
|
47
47
|
const lines = [];
|
|
48
48
|
lines.push(opts?.heading ?? '## FDP Agent Hard-Rules (synced from FAM)');
|
|
49
49
|
lines.push('');
|
|
50
|
-
lines.push('> Generated from the canonical rule set. Edit the rules in `documentations/rules/`, not here.');
|
|
50
|
+
lines.push('> Generated from the canonical rule set. Edit the rules in `fdp-documentations/rules/`, not here.');
|
|
51
51
|
for (const group of FAM_RulePropagation_Util.SCOPE_ORDER) {
|
|
52
52
|
const inScope = deduped
|
|
53
53
|
.filter((rule) => rule.ruleScope === group.scope)
|
package/build/src/app.server.js
CHANGED
|
@@ -163,6 +163,52 @@ class App extends nts_dynamo_1.DyNTS_App {
|
|
|
163
163
|
await embedding_1.FAM_EmbeddingBootstrap_ControlService.getInstance().boot();
|
|
164
164
|
fsm_dynamo_1.DyFM_Log.S_info(`UI is available at: localhost:${environment_1.env.httpPort}/api/app`);
|
|
165
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* A hiba `additionalContent`-jének BIZTONSÁGOSSÁ tétele + a kérés azonosítóinak megőrzése (2026-08-13).
|
|
168
|
+
*
|
|
169
|
+
* **Miért kell:** a bedrock express-error-handlere a nyers `req`/`res`-t is beleteszi az `additionalContent`-be,
|
|
170
|
+
* ami KÖRKÖRÖS → a Dynamo `JSON.stringify`-ja elhasal, és a mezőt TELJESEN eldobja. Következmény: a `fam_errors`
|
|
171
|
+
* rekordon NINCS semmi kontextus (se út, se metódus, se hívó), így egy visszatérő hiba diagnosztizálhatatlan —
|
|
172
|
+
* ez sérti a „minden hiba debug-szintű részletet hordoz" hard rule-t.
|
|
173
|
+
*
|
|
174
|
+
* **Mit tesz:** ha az `additionalContent` már szerializálható, HOZZÁNYÚLNI SEM kell (nincs információ-veszteség).
|
|
175
|
+
* Ha nem, egy sensitive-szűrt, lapos snapshotra cseréli: metódus + útvonal + content-type/length + távoli cím +
|
|
176
|
+
* user-agent. A body-t NEM másoljuk (titkot hordozhat, és parse-hiba esetén amúgy sincs feldolgozva).
|
|
177
|
+
* PURE-közeli, best-effort: SOHA nem dob (egy hibakezelő nem bukhat el a hibakezelés közben).
|
|
178
|
+
*/
|
|
179
|
+
static attachSafeRequestContext(err, req) {
|
|
180
|
+
try {
|
|
181
|
+
const target = err;
|
|
182
|
+
if (target.additionalContent !== undefined) {
|
|
183
|
+
try {
|
|
184
|
+
JSON.stringify(target.additionalContent);
|
|
185
|
+
return; // szerializálható → érintetlenül hagyjuk (a bedrock saját kontextusa megmarad)
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// nem szerializálható → lecseréljük (különben a Dynamo némán eldobja)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (!req) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const headers = (req.headers ?? {});
|
|
195
|
+
const asText = (value) => typeof value === 'string' && value.trim() ? value.trim().slice(0, 200) : undefined;
|
|
196
|
+
const requestContext = [
|
|
197
|
+
`${req.method ?? '?'} ${req.originalUrl ?? req.url ?? '?'}`,
|
|
198
|
+
asText(headers['content-type']) ? `type=${asText(headers['content-type'])}` : undefined,
|
|
199
|
+
asText(headers['content-length']) ? `bytes=${asText(headers['content-length'])}` : undefined,
|
|
200
|
+
asText(req.ip) ? `from=${asText(req.ip)}` : undefined,
|
|
201
|
+
asText(headers['user-agent']) ? `ua=${asText(headers['user-agent'])}` : undefined,
|
|
202
|
+
// A FAM event-signing headerei (ha a hívó aláírta magát) — ez azonosítja az agentet/sessiont.
|
|
203
|
+
asText(headers['x-fam-agent']) ? `agent=${asText(headers['x-fam-agent'])}` : undefined,
|
|
204
|
+
asText(headers['x-fam-session']) ? `session=${asText(headers['x-fam-session'])}` : undefined,
|
|
205
|
+
].filter(Boolean).join(' · ');
|
|
206
|
+
target.additionalContent = { contextSnapshot: { operation: 'http-request', requestContext: requestContext } };
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// best-effort: a hibakezelés SOHA nem bukhat el a kontextus-mentés miatt
|
|
210
|
+
}
|
|
211
|
+
}
|
|
166
212
|
getGlobalErrorHandler() {
|
|
167
213
|
return async (err, req, res, issuer) => {
|
|
168
214
|
// No-silent-failure (dsgn-008): minden hibát persistálunk a `fam_errors` tárba a
|
|
@@ -173,6 +219,12 @@ class App extends nts_dynamo_1.DyNTS_App {
|
|
|
173
219
|
}
|
|
174
220
|
let setIssuer = issuer ?? (req?.body)?.issuer;
|
|
175
221
|
setIssuer = setIssuer ?? err?.___issuerService ?? 'unknown-service';
|
|
222
|
+
// KÉRÉS-KONTEXTUS MENTÉSE (2026-08-13 lelet): a bedrock express-hibáin (`Express ERROR`) az
|
|
223
|
+
// `additionalContent` NEM JSON-szerializálható (körkörös `req`/`res`), ezért a Dynamo ELDOBJA
|
|
224
|
+
// („additionalContent is not JSON.stringifyable… it will be removed!") — és a hiba KONTEXTUS NÉLKÜL
|
|
225
|
+
// perzisztálódik. Így egy hibás-JSON POST-ról (body-parser SyntaxError, a routing ELŐTT) nem derül ki,
|
|
226
|
+
// KI küldte. Itt biztonságos, szerializálható snapshotra cseréljük — a hívó azonosíthatóvá válik.
|
|
227
|
+
App.attachSafeRequestContext(err, req);
|
|
176
228
|
await errors_control_service_1.FAM_Error_ControlService.globalErrorHandler(err, setIssuer);
|
|
177
229
|
};
|
|
178
230
|
}
|
package/client-dist/index.html
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
|
9
9
|
<style>@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
|
|
10
10
|
<style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
|
|
11
|
-
<style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/
|
|
12
|
-
<style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/
|
|
11
|
+
<style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v367/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1hCs5Y0.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
|
|
12
|
+
<style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/v368/syl7-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvLgyidOK7BDB_Qb9vUdV6_gjDK-P3JuF_Zs-obHph2-jOcZTKPqw.woff2) format('woff2');}.material-symbols-rounded{font-family:'Material Symbols Rounded';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
|
|
13
13
|
<style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}html,body{height:100%;background-color:#0f0f0f}body{margin:0;font-family:Roboto,Helvetica Neue,sans-serif;color:#c8c8c8}</style><link rel="stylesheet" href="styles-3J7JD5YE.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-3J7JD5YE.css"></noscript></head>
|
|
14
14
|
<body class="mat-typography">
|
|
15
15
|
<a-root-root></a-root-root>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fdp-agent-memory",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.134",
|
|
4
4
|
"description": "Local-first, vector-backed multi-table agent memory exposed as an MCP server (read/write/capabilities). Public, FDP-Templates-free, no auth.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|