@futdevpro/fdp-agent-memory 1.1.134 → 1.1.136
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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fdp-agent-memory",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.136",
|
|
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": {
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_AgentGuidance_Util = exports.FAM_AgentMistake = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A felismert agent-hiba osztálya (a guidance + az incidens-rögzítés kulcsa).
|
|
6
|
+
*/
|
|
7
|
+
var FAM_AgentMistake;
|
|
8
|
+
(function (FAM_AgentMistake) {
|
|
9
|
+
/** A body nem érvényes JSON (a leggyakoribb: aposztróf, lezáró vessző, nem-escape-elt sortörés). */
|
|
10
|
+
FAM_AgentMistake["malformedJson"] = "malformed-json";
|
|
11
|
+
/** Üres body egy olyan végponton, ami JSON-t vár. */
|
|
12
|
+
FAM_AgentMistake["emptyBody"] = "empty-body";
|
|
13
|
+
/** Nem létező útvonal (elgépelt/kitalált endpoint). */
|
|
14
|
+
FAM_AgentMistake["unknownEndpoint"] = "unknown-endpoint";
|
|
15
|
+
/** Rossz HTTP-metódus a létező útvonalon. */
|
|
16
|
+
FAM_AgentMistake["wrongMethod"] = "wrong-method";
|
|
17
|
+
})(FAM_AgentMistake || (exports.FAM_AgentMistake = FAM_AgentMistake = {}));
|
|
18
|
+
/**
|
|
19
|
+
* `FAM_AgentGuidance_Util` — **agent-támogató visszajelzések** (user-FR 2026-08-14).
|
|
20
|
+
*
|
|
21
|
+
* **A megfigyelt jelenség:** agentek, akiknek elsőre nem sikerült az MCP-t az elvárt módon használni, kerülőúton
|
|
22
|
+
* NYERS REST-hívásokkal próbálkoznak — és ezek gyakran rosszul összeállítottak (pl. aposztrófos „JSON"). Eddig egy
|
|
23
|
+
* néma parse-hiba volt a válasz: az agent nem tudta meg, MI a baj, sem azt, hogy MI lett volna a helyes út.
|
|
24
|
+
*
|
|
25
|
+
* **A cél (owner-direktíva):** „meg kell fogni a kis kezüket és irányba kell állítani őket — de NEM vehetjük el a
|
|
26
|
+
* kedvüket attól, hogy használják a FAM-ot; a FAM használata kritikusan fontos lépés MINDIG és MINDENKOR."
|
|
27
|
+
* Ezért minden üzenet: (1) tényszerűen megmondja mi a baj, (2) megadja a LEGVALÓSZÍNŰBB okot, (3) konkrét javítást,
|
|
28
|
+
* (4) másolható példát, (5) az ajánlott (MCP) utat, és (6) **megerősíti, hogy jó úton jár** — a hiba csak formai.
|
|
29
|
+
*
|
|
30
|
+
* PURE: nincs I/O, nincs állapot — így a szöveg-kontraktus unit-tesztelhető.
|
|
31
|
+
*/
|
|
32
|
+
class FAM_AgentGuidance_Util {
|
|
33
|
+
/** A `read` tool minimál, helyes hívása (a leggyakoribb szándék). */
|
|
34
|
+
static READ_EXAMPLE = '{"queries":[{"tables":["knowledge"],"query":"amit keresel","topK":5}]}';
|
|
35
|
+
/** A `write` tool minimál, helyes hívása. */
|
|
36
|
+
static WRITE_EXAMPLE = '{"operation":"create","table":"memory","content":"a megjegyzendő tudás","scopePath":[{"layer":"project","name":"<projekt>"}]}';
|
|
37
|
+
/**
|
|
38
|
+
* A JSON-parse hiba KONKRÉT okának felismerése a nyers body-ból (PURE). A body-parser üzenete önmagában
|
|
39
|
+
* (`Expected property name or '}' at position 1`) egy agentnek keveset mond — a tényleges minta viszont
|
|
40
|
+
* elárulja a tipikus elrontást, és így célzott javítási tanácsot tudunk adni.
|
|
41
|
+
*/
|
|
42
|
+
static diagnoseJson(rawBody) {
|
|
43
|
+
const body = (rawBody ?? '').trim();
|
|
44
|
+
if (!body) {
|
|
45
|
+
return {
|
|
46
|
+
mistake: FAM_AgentMistake.emptyBody,
|
|
47
|
+
likelyCause: 'A kérés törzse ÜRES, pedig ez a végpont JSON-objektumot vár.',
|
|
48
|
+
howToFix: 'Küldd el a JSON-body-t `Content-Type: application/json` fejléccel.',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// A leggyakoribb elrontás: aposztróf idézőjel helyett (shell-quoting / Python-szerű dict beillesztése).
|
|
52
|
+
if (/^\{\s*'/.test(body) || /:\s*'/.test(body)) {
|
|
53
|
+
return {
|
|
54
|
+
mistake: FAM_AgentMistake.malformedJson,
|
|
55
|
+
likelyCause: 'A body APOSZTRÓFOT (\') használ idézőjel (") helyett — ez Python/JS-objektum-szintaxis, '
|
|
56
|
+
+ 'NEM JSON. Gyakran shell-idézőjel-ütközésből vagy egy nyelvi dict beillesztéséből ered.',
|
|
57
|
+
howToFix: 'Cseréld az összes aposztrófot kettős idézőjelre; a kulcsokat is idézőjelezd: {"kulcs":"érték"}.',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (/,\s*[}\]]/.test(body)) {
|
|
61
|
+
return {
|
|
62
|
+
mistake: FAM_AgentMistake.malformedJson,
|
|
63
|
+
likelyCause: 'LEZÁRÓ VESSZŐ van az utolsó elem után (`…,}` vagy `…,]`) — a JSON ezt nem engedi.',
|
|
64
|
+
howToFix: 'Töröld a vesszőt az utolsó kulcs/elem után.',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (!/^[[{]/.test(body)) {
|
|
68
|
+
return {
|
|
69
|
+
mistake: FAM_AgentMistake.malformedJson,
|
|
70
|
+
likelyCause: 'A body nem `{` vagy `[` karakterrel kezdődik — valószínűleg idézőjelek közé csomagolva '
|
|
71
|
+
+ 'vagy escape-elve érkezett (dupla-stringify / shell-idézőjel).',
|
|
72
|
+
howToFix: 'Küldd a NYERS JSON-objektumot, ne stringbe csomagolva (ne `"{\\"a\\":1}"`, hanem `{"a":1}`).',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
mistake: FAM_AgentMistake.malformedJson,
|
|
77
|
+
likelyCause: 'A body szintaktikailag hibás JSON (hiányzó idézőjel/zárójel vagy nem-escape-elt sortörés).',
|
|
78
|
+
howToFix: 'Ellenőrizd a zárójel-párokat és az idézőjeleket; a többsoros szöveget `\\n`-nel escape-eld.',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Melyik FAM-tool tartozik az útvonalhoz (az „inkább ezt használd" tanácshoz). PURE. */
|
|
82
|
+
static toolForPath(path) {
|
|
83
|
+
const url = (path ?? '').toLowerCase();
|
|
84
|
+
if (url.includes('/read')) {
|
|
85
|
+
return 'read';
|
|
86
|
+
}
|
|
87
|
+
if (url.includes('/write') || url.includes('/scan')) {
|
|
88
|
+
return 'write';
|
|
89
|
+
}
|
|
90
|
+
if (url.includes('/capabilities')) {
|
|
91
|
+
return 'capabilities';
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A teljes eligazítás összeállítása (PURE). A hangnem KÖTELEZŐEN támogató: a FAM-hoz fordulás MINDIG helyes
|
|
97
|
+
* döntés volt — csak a kérés formája hibás, és pontosan megmondjuk, hogyan javítsd.
|
|
98
|
+
*/
|
|
99
|
+
static build(set) {
|
|
100
|
+
const tool = FAM_AgentGuidance_Util.toolForPath(set.path);
|
|
101
|
+
const example = tool === 'write' ? FAM_AgentGuidance_Util.WRITE_EXAMPLE : FAM_AgentGuidance_Util.READ_EXAMPLE;
|
|
102
|
+
const preferred = tool
|
|
103
|
+
? `AJÁNLOTT: a nyers REST helyett használd az MCP-toolt — \`mcp__fdp-agent-memory__${tool}\`. Ugyanezt a `
|
|
104
|
+
+ 'bemenetet várja, de a kliens szerializálja helyetted (nincs idézőjel-ütközés), és a hibákat is '
|
|
105
|
+
+ 'olvashatóan adja vissza. Ha az MCP-eszköz nem elérhető, a REST teljes értékű tartalék — csak a '
|
|
106
|
+
+ 'JSON-formára figyelj.'
|
|
107
|
+
: 'AJÁNLOTT: a FAM felülete a `read` / `write` / `capabilities` — a `capabilities` felsorolja a pontos '
|
|
108
|
+
+ 'bemeneti sémákat. MCP-n át (`mcp__fdp-agent-memory__*`) a legkényelmesebb, de a REST is teljes értékű.';
|
|
109
|
+
return {
|
|
110
|
+
mistake: set.mistake,
|
|
111
|
+
errorCode: FAM_AgentGuidance_Util.errorCodeFor(set.mistake),
|
|
112
|
+
whatHappened: `A FAM megkapta a kérésedet (${set.method ?? '?'} ${set.path ?? '?'}), de a törzsét nem tudta `
|
|
113
|
+
+ 'JSON-ként értelmezni, ezért NEM hajtotta végre. Semmi nem íródott és nem változott.',
|
|
114
|
+
likelyCause: set.likelyCause,
|
|
115
|
+
howToFix: set.howToFix,
|
|
116
|
+
example: example,
|
|
117
|
+
preferredApproach: preferred,
|
|
118
|
+
// A hangnem SZÁNDÉKOS: a következő lépés a ÚJRAPRÓBÁLKOZÁS legyen, nem a FAM elkerülése.
|
|
119
|
+
encouragement: 'Jó irányba indultál: a FAM-hoz fordulni MINDIG helyes lépés — a tudás ott van, csak a '
|
|
120
|
+
+ 'kérés formája volt hibás. Javítsd a fentiek szerint és próbáld újra; ha elakadsz, a '
|
|
121
|
+
+ '`capabilities` megadja a pontos sémát.',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** A hiba-osztályhoz tartozó stabil hibakód (az incidens-rögzítés dedup-kulcsa is). PURE. */
|
|
125
|
+
static errorCodeFor(mistake) {
|
|
126
|
+
switch (mistake) {
|
|
127
|
+
case FAM_AgentMistake.emptyBody:
|
|
128
|
+
return 'FAM-AGENT-INPUT-002';
|
|
129
|
+
case FAM_AgentMistake.unknownEndpoint:
|
|
130
|
+
return 'FAM-AGENT-INPUT-003';
|
|
131
|
+
case FAM_AgentMistake.wrongMethod:
|
|
132
|
+
return 'FAM-AGENT-INPUT-004';
|
|
133
|
+
default:
|
|
134
|
+
return 'FAM-AGENT-INPUT-001';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.FAM_AgentGuidance_Util = FAM_AgentGuidance_Util;
|
|
@@ -60,9 +60,46 @@ class FAM_RuleInjection_ControlService {
|
|
|
60
60
|
// CSAK a rangsorhoz/megjelenítéshez kellő mezők (a vektor NEM kell → könnyű lean-query).
|
|
61
61
|
const docs = await model.find(filter, {
|
|
62
62
|
content: 1, importance: 1, weight: 1, globalRule: 1, category: 1,
|
|
63
|
-
ruleScope: 1, ruleScopeTopic: 1, ruleId: 1, derivedFrom: 1, __lastModified: 1,
|
|
63
|
+
ruleScope: 1, ruleScopeTopic: 1, ruleId: 1, derivedFrom: 1, __lastModified: 1, chunkIndex: 1,
|
|
64
64
|
}).lean();
|
|
65
|
-
return docs.map((doc) => this.toInjectable(doc));
|
|
65
|
+
return FAM_RuleInjection_ControlService.mergeChunks(docs.map((doc) => this.toInjectable(doc)), docs.map((doc) => (typeof doc.chunkIndex === 'number' ? doc.chunkIndex : 0)));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A TÖBB CHUNKRA bomlott szabályok ÖSSZEFŰZÉSE `ruleId` szerint (2026-08-14 lelet — `core-rule-integrity`).
|
|
69
|
+
*
|
|
70
|
+
* **A hiba, amit javít:** a ~1100 karakternél hosszabb rule-fájlok több chunkra bomlanak az ingestkor, és a
|
|
71
|
+
* budget-fit ezeket KÜLÖN tételként kezelte. Következmény: (a) egy hosszabb szabályból a blokkba VÉLETLENSZERŰ
|
|
72
|
+
* TÖREDÉK került (mérve: a `core-review-until-clean`-ből csak a 2. fele, így a „két egymást követő tiszta kör"
|
|
73
|
+
* MAG KIMARADT), (b) ugyanaz a cím KÉTSZER jelent meg, feleslegesen fogyasztva a budget-et. Ez pontosan a
|
|
74
|
+
* `core-rule-integrity` által TILTOTT néma csonkolás — egy szabály CSAK teljes egészében adható tovább.
|
|
75
|
+
*
|
|
76
|
+
* **Megoldás:** `ruleId`-nként egyetlen tétellé fűzzük a chunkokat `chunkIndex` sorrendben. Így a budget-fit
|
|
77
|
+
* atomi egységként dönt: a szabály vagy TELJESEN bekerül, vagy a „(…and N more rules not shown)" jelzésbe esik —
|
|
78
|
+
* de SOSEM félig. A `ruleId` nélküli (nem-kurált) bejegyzések érintetlenül maradnak.
|
|
79
|
+
*/
|
|
80
|
+
static mergeChunks(rules, chunkIndexes) {
|
|
81
|
+
const byRuleId = new Map();
|
|
82
|
+
const passthrough = [];
|
|
83
|
+
rules.forEach((rule, position) => {
|
|
84
|
+
if (!rule.ruleId) {
|
|
85
|
+
passthrough.push(rule);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const existing = byRuleId.get(rule.ruleId);
|
|
89
|
+
const part = { index: chunkIndexes[position] ?? 0, content: rule.content ?? '' };
|
|
90
|
+
if (existing) {
|
|
91
|
+
existing.parts.push(part);
|
|
92
|
+
// A legfrissebb módosítás nyer a rangsor-tiebreaknél (a chunkok azonos fájlból jönnek).
|
|
93
|
+
existing.rule.lastModifiedMs = Math.max(existing.rule.lastModifiedMs ?? 0, rule.lastModifiedMs ?? 0);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
byRuleId.set(rule.ruleId, { rule: { ...rule }, parts: [part] });
|
|
97
|
+
});
|
|
98
|
+
const merged = Array.from(byRuleId.values()).map((entry) => ({
|
|
99
|
+
...entry.rule,
|
|
100
|
+
content: entry.parts.sort((a, b) => a.index - b.index).map((part) => part.content).join('\n'),
|
|
101
|
+
}));
|
|
102
|
+
return [...merged, ...passthrough];
|
|
66
103
|
}
|
|
67
104
|
/** Explicit felülírás > `cwd`-detekció. A `projectType`/`topics`/budget mindig az inputból. */
|
|
68
105
|
resolveContext(input) {
|
package/build/src/app.server.js
CHANGED
|
@@ -7,6 +7,7 @@ const logs_1 = require("@futdevpro/nts-dynamo/logs");
|
|
|
7
7
|
const package_json_1 = require("../package.json");
|
|
8
8
|
const fam_db_models_const_1 = require("./_collections/fam-db-models.const");
|
|
9
9
|
const fam_remote_config_util_1 = require("./_collections/fam-remote-config.util");
|
|
10
|
+
const fam_agent_guidance_util_1 = require("./_collections/fam-agent-guidance.util");
|
|
10
11
|
const api_controller_1 = require("./_routes/server/api/api.controller");
|
|
11
12
|
const client_app_controller_1 = require("./_routes/server/client-app/client-app.controller");
|
|
12
13
|
const errors_controller_1 = require("./_routes/server/errors/errors.controller");
|
|
@@ -163,6 +164,81 @@ class App extends nts_dynamo_1.DyNTS_App {
|
|
|
163
164
|
await embedding_1.FAM_EmbeddingBootstrap_ControlService.getInstance().boot();
|
|
164
165
|
fsm_dynamo_1.DyFM_Log.S_info(`UI is available at: localhost:${environment_1.env.httpPort}/api/app`);
|
|
165
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* AGENT-TÁMOGATÁS + ÖNDIAGNOSZTIKA (user-FR 2026-08-14). A bedrock `initOpenExpress` regisztrálja a
|
|
169
|
+
* body-parsert; KÖZVETLENÜL utána ékeljük be a saját JSON-hiba-kezelőnket, így:
|
|
170
|
+
* (1) a hibás kérés a **routing előtt** nálunk landol → van teljes kontextusunk (a bedrock-úton elveszne),
|
|
171
|
+
* (2) az agent **cselekvésre fordítható eligazítást** kap 400-zal (nem néma hibát), és
|
|
172
|
+
* (3) az esetet **incidensként rögzítjük** (öndiagnosztika: ki, mit, mikor, milyen mintával).
|
|
173
|
+
*
|
|
174
|
+
* A megfigyelt jelenség: akinek elsőre nem sikerült az MCP-használat, nyers REST-tel próbálkozik, és a body
|
|
175
|
+
* gyakran rosszul összeállított (pl. aposztrófos „JSON"). A válasz hangneme SZÁNDÉKOSAN támogató — a cél, hogy
|
|
176
|
+
* az agent JAVÍTVA ÚJRAPRÓBÁLJA, ne pedig elkerülje a FAM-ot.
|
|
177
|
+
*/
|
|
178
|
+
async initOpenExpress() {
|
|
179
|
+
await super.initOpenExpress();
|
|
180
|
+
this.openExpress?.use(App.jsonErrorMiddleware());
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* A body-parser JSON-hibáját elkapó Express error-middleware (4 argumentumos — ez teszi error-handlerré).
|
|
184
|
+
* Csak a PARSE-hibát kezeli; minden más hibát változatlanul továbbad a bedrock láncnak.
|
|
185
|
+
*/
|
|
186
|
+
static jsonErrorMiddleware() {
|
|
187
|
+
return (err, req, res, next) => {
|
|
188
|
+
const isParseError = err instanceof SyntaxError
|
|
189
|
+
&& typeof err.status === 'number'
|
|
190
|
+
&& 'body' in err;
|
|
191
|
+
if (!isParseError) {
|
|
192
|
+
next(err);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const rawBody = typeof err.body === 'string'
|
|
196
|
+
? err.body
|
|
197
|
+
: undefined;
|
|
198
|
+
const diagnosis = fam_agent_guidance_util_1.FAM_AgentGuidance_Util.diagnoseJson(rawBody);
|
|
199
|
+
const guidance = fam_agent_guidance_util_1.FAM_AgentGuidance_Util.build({
|
|
200
|
+
mistake: diagnosis.mistake, likelyCause: diagnosis.likelyCause, howToFix: diagnosis.howToFix,
|
|
201
|
+
path: req.originalUrl ?? req.url, method: req.method,
|
|
202
|
+
});
|
|
203
|
+
// (3) ÖNDIAGNOSZTIKA: incidens a FAM SAJÁT error-útján (dedup + occurrence-count + REST `/api/errors`),
|
|
204
|
+
// teljes kontextussal. Fire-and-forget: a diagnosztika SOHA nem késleltetheti/buktathatja a választ.
|
|
205
|
+
void App.recordAgentIncident(guidance, req, rawBody);
|
|
206
|
+
// (2) Cselekvésre fordítható válasz — 400 (a hibás kérés NEM 2xx; korábban a bedrock-út 200-at adott).
|
|
207
|
+
res.status(400).json({ ok: false, error: { errorCode: guidance.errorCode, message: guidance.whatHappened }, guidance: guidance });
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Egy agent-input-incidens rögzítése a `fam_errors` tárba (REUSE: a meglévő emit-út adja a dedupot, az
|
|
212
|
+
* occurrence-countot és a `/api/errors` felületet — nincs új tár). A kontextus a hívó azonosítóit viszi
|
|
213
|
+
* (metódus, útvonal, aláírás-headerek) + a hibás body CSONKOLT, sensitive-szűrt mintáját, hogy a minta
|
|
214
|
+
* felismerhető legyen. Best-effort: sosem dob.
|
|
215
|
+
*/
|
|
216
|
+
static async recordAgentIncident(guidance, req, rawBody) {
|
|
217
|
+
try {
|
|
218
|
+
const headers = (req.headers ?? {});
|
|
219
|
+
const text = (value) => typeof value === 'string' && value.trim() ? value.trim().slice(0, 120) : undefined;
|
|
220
|
+
const requestContext = [
|
|
221
|
+
`${req.method ?? '?'} ${req.originalUrl ?? req.url ?? '?'}`,
|
|
222
|
+
text(headers['user-agent']) ? `ua=${text(headers['user-agent'])}` : undefined,
|
|
223
|
+
text(headers['x-fam-agent']) ? `agent=${text(headers['x-fam-agent'])}` : undefined,
|
|
224
|
+
text(headers['x-fam-session']) ? `session=${text(headers['x-fam-session'])}` : undefined,
|
|
225
|
+
].filter(Boolean).join(' · ');
|
|
226
|
+
await errors_control_service_1.FAM_Error_ControlService.getInstance().emit({
|
|
227
|
+
errorCode: guidance.errorCode,
|
|
228
|
+
message: `Agent-input hiba (${guidance.mistake}): ${guidance.likelyCause}`,
|
|
229
|
+
level: fsm_dynamo_1.DyFM_ErrorLevel.warning,
|
|
230
|
+
context: {
|
|
231
|
+
operation: 'agent-input',
|
|
232
|
+
requestContext: requestContext,
|
|
233
|
+
// A hibás minta CSONKOLVA — ebből ismerhető fel a visszatérő elrontás; a sensitive-szűrés a factory-ban.
|
|
234
|
+
failedSample: rawBody ? rawBody.slice(0, 200) : undefined,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// best-effort: az öndiagnosztika sosem buktathatja a kérés-kezelést
|
|
240
|
+
}
|
|
241
|
+
}
|
|
166
242
|
/**
|
|
167
243
|
* A hiba `additionalContent`-jének BIZTONSÁGOSSÁ tétele + a kérés azonosítóinak megőrzése (2026-08-13).
|
|
168
244
|
*
|
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.136",
|
|
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": {
|