@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.
Files changed (21) hide show
  1. package/build/package.json +1 -1
  2. package/build/src/_collections/config-catalog.const.js +12 -0
  3. package/build/src/_collections/error-codes.const.js +2 -0
  4. package/build/src/_collections/fam-db-models.const.js +2 -0
  5. package/build/src/_collections/fam-error-context.util.js +1 -0
  6. package/build/src/_models/data-models/fam-dup-audit.data-model.js +72 -0
  7. package/build/src/_modules/embedding/_collections/fam-dup-file-rollup.util.js +48 -0
  8. package/build/src/_modules/embedding/_collections/fam-dup-fork-pair.util.js +86 -0
  9. package/build/src/_modules/embedding/_services/fam-dup-audit-scheduler.control-service.js +140 -0
  10. package/build/src/_modules/embedding/_services/fam-dup-audit.control-service.js +141 -0
  11. package/build/src/_modules/embedding/_services/fam-dup-audit.data-service.js +66 -0
  12. package/build/src/_modules/embedding/_services/fam-dup-coverage.control-service.js +123 -0
  13. package/build/src/_modules/embedding/_services/fam-duplicate-scan.control-service.js +63 -10
  14. package/build/src/_modules/embedding/_services/fam-embedding-bootstrap.control-service.js +9 -0
  15. package/build/src/_modules/embedding/_services/fam-exact-duplication.control-service.js +309 -0
  16. package/build/src/_modules/embedding/index.js +16 -1
  17. package/build/src/_modules/mcp/_services/fam-capability-registry.service.js +67 -0
  18. package/build/src/_modules/retrieval/_collections/fam-rule-propagation.util.js +1 -1
  19. package/build/src/app.server.js +52 -0
  20. package/client-dist/index.html +2 -2
  21. 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)
@@ -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
  }
@@ -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/v364/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/v365/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>
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.130",
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": {