@futdevpro/fdp-agent-memory 0.1.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/README.md +345 -0
- package/build/package.json +96 -0
- package/build/src/_assets/mcp-client-config/README.md +29 -0
- package/build/src/_assets/mcp-client-config/claude_desktop_config.json +15 -0
- package/build/src/_assets/mcp-client-config/mcp.json +15 -0
- package/build/src/_collections/config-catalog.const.js +180 -0
- package/build/src/_collections/config-error-codes.const.js +30 -0
- package/build/src/_collections/config-presets.const.js +25 -0
- package/build/src/_collections/error-banners.const.js +100 -0
- package/build/src/_collections/error-codes.const.js +150 -0
- package/build/src/_collections/fam-db-models.const.js +37 -0
- package/build/src/_collections/fam-entry-bootstrap.util.js +80 -0
- package/build/src/_collections/fam-error-context.util.js +90 -0
- package/build/src/_collections/fam-error-factory.util.js +64 -0
- package/build/src/_enums/fam-config-level.type-enum.js +15 -0
- package/build/src/_enums/fam-table.type-enum.js +20 -0
- package/build/src/_integration-tests/_helpers/fam-integration-test-setup.util.js +105 -0
- package/build/src/_models/data-models/fam-codebase.data-model.js +51 -0
- package/build/src/_models/data-models/fam-coding-patterns.data-model.js +58 -0
- package/build/src/_models/data-models/fam-config.data-model.js +68 -0
- package/build/src/_models/data-models/fam-documents.data-model.js +53 -0
- package/build/src/_models/data-models/fam-entry-base-properties.const.js +43 -0
- package/build/src/_models/data-models/fam-entry.data-model.js +81 -0
- package/build/src/_models/data-models/fam-error.data-model.js +88 -0
- package/build/src/_models/data-models/fam-ingest-run.data-model.js +74 -0
- package/build/src/_models/data-models/fam-knowledge.data-model.js +48 -0
- package/build/src/_models/data-models/fam-memory.data-model.js +55 -0
- package/build/src/_models/data-models/fam-reference.data-model.js +67 -0
- package/build/src/_models/data-models/fam-rules.data-model.js +51 -0
- package/build/src/_models/data-models/fam-scope.data-model.js +52 -0
- package/build/src/_models/interfaces/fam-common.interface.js +23 -0
- package/build/src/_models/interfaces/fam-config.interface.js +2 -0
- package/build/src/_models/interfaces/fam-error.interface.js +2 -0
- package/build/src/_modules/embedding/_collections/fam-embedding-pricing.const.js +22 -0
- package/build/src/_modules/embedding/_collections/fam-store-registry.const.js +63 -0
- package/build/src/_modules/embedding/_models/interfaces/fam-embedding-cost.interface.js +10 -0
- package/build/src/_modules/embedding/_models/interfaces/fam-embedding-provider.interface.js +2 -0
- package/build/src/_modules/embedding/_models/interfaces/fam-resolved-provider.interface.js +2 -0
- package/build/src/_modules/embedding/_services/fam-embedding-bootstrap.control-service.js +52 -0
- package/build/src/_modules/embedding/_services/fam-embedding-cost.control-service.js +175 -0
- package/build/src/_modules/embedding/_services/fam-embedding-pipeline.control-service.js +202 -0
- package/build/src/_modules/embedding/_services/fam-embedding-preset.control-service.js +66 -0
- package/build/src/_modules/embedding/_services/fam-embedding.control-service.js +253 -0
- package/build/src/_modules/embedding/_services/fam-entry.data-service.js +64 -0
- package/build/src/_modules/embedding/_services/fam-lmstudio-embedding.provider.js +112 -0
- package/build/src/_modules/embedding/_services/fam-mock-embedding.provider.js +64 -0
- package/build/src/_modules/embedding/_services/fam-openai-embedding.provider.js +64 -0
- package/build/src/_modules/embedding/_services/fam-vector-search.control-service.js +244 -0
- package/build/src/_modules/embedding/index.js +40 -0
- package/build/src/_modules/ingest/_collections/fam-content-hash.util.js +35 -0
- package/build/src/_modules/ingest/_collections/fam-file-routing.util.js +95 -0
- package/build/src/_modules/ingest/_collections/fam-glob-match.util.js +84 -0
- package/build/src/_modules/ingest/_collections/fam-md-chunker.util.js +164 -0
- package/build/src/_modules/ingest/_collections/fam-scan-path.util.js +91 -0
- package/build/src/_modules/ingest/_collections/fam-secret-exclude.util.js +54 -0
- package/build/src/_modules/ingest/_collections/fam-sliding-chunker.util.js +76 -0
- package/build/src/_modules/ingest/_collections/fam-ts-chunker.util.js +316 -0
- package/build/src/_modules/ingest/_models/interfaces/fam-ingest.interface.js +2 -0
- package/build/src/_modules/ingest/_services/fam-chunker.control-service.js +114 -0
- package/build/src/_modules/ingest/_services/fam-delta-compare.util.js +74 -0
- package/build/src/_modules/ingest/_services/fam-ingest-run.data-service.js +85 -0
- package/build/src/_modules/ingest/_services/fam-ingest.control-service.js +384 -0
- package/build/src/_modules/ingest/_services/fam-scan.control-service.js +211 -0
- package/build/src/_modules/ingest/index.js +46 -0
- package/build/src/_modules/mcp/_collections/fam-core-tools.const.js +186 -0
- package/build/src/_modules/mcp/_models/interfaces/fam-mcp.interface.js +31 -0
- package/build/src/_modules/mcp/_services/fam-capabilities-tool.service.js +111 -0
- package/build/src/_modules/mcp/_services/fam-capability-registry.service.js +1180 -0
- package/build/src/_modules/mcp/_services/fam-mcp-adapter.service.js +123 -0
- package/build/src/_modules/mcp/_services/fam-mcp-server.service.js +69 -0
- package/build/src/_modules/mcp/_services/fam-read-tool.service.js +99 -0
- package/build/src/_modules/mcp/_services/fam-write-tool.service.js +460 -0
- package/build/src/_modules/mcp/index.js +35 -0
- package/build/src/_modules/migration/_collections/fam-claude-mem-normalize.util.js +166 -0
- package/build/src/_modules/migration/_collections/fam-import-content-hash.util.js +38 -0
- package/build/src/_modules/migration/_collections/fam-target-mapping.util.js +90 -0
- package/build/src/_modules/migration/_enums/fam-claude-mem-source.type-enum.js +20 -0
- package/build/src/_modules/migration/_models/interfaces/fam-claude-mem.interface.js +26 -0
- package/build/src/_modules/migration/_services/fam-claude-mem-export-reader.service.js +134 -0
- package/build/src/_modules/migration/_services/fam-claude-mem-import.control-service.js +533 -0
- package/build/src/_modules/migration/_services/fam-claude-mem-sqlite-reader.service.js +144 -0
- package/build/src/_modules/migration/_services/fam-claude-mem-worker-reader.service.js +115 -0
- package/build/src/_modules/migration/_services/fam-import-dedup.data-service.js +102 -0
- package/build/src/_modules/migration/index.js +38 -0
- package/build/src/_modules/retrieval/_models/interfaces/fam-retrieval.interface.js +2 -0
- package/build/src/_modules/retrieval/_services/fam-retrieval-candidate.data-service.js +67 -0
- package/build/src/_modules/retrieval/_services/fam-retrieval-suggestions.util.js +182 -0
- package/build/src/_modules/retrieval/_services/fam-retrieval.control-service.js +282 -0
- package/build/src/_modules/retrieval/index.js +22 -0
- package/build/src/_modules/scope-reference/_collections/fam-fuzzy-match.util.js +86 -0
- package/build/src/_modules/scope-reference/_collections/fam-scope-normalize.util.js +47 -0
- package/build/src/_modules/scope-reference/_models/interfaces/fam-reference-resolution.interface.js +2 -0
- package/build/src/_modules/scope-reference/_models/interfaces/fam-resolution-trace.interface.js +2 -0
- package/build/src/_modules/scope-reference/_services/fam-reference.data-service.js +179 -0
- package/build/src/_modules/scope-reference/_services/fam-scope-resolver.control-service.js +473 -0
- package/build/src/_modules/scope-reference/_services/fam-scope.data-service.js +215 -0
- package/build/src/_modules/scope-reference/index.js +26 -0
- package/build/src/_routes/server/api/api.controller.js +400 -0
- package/build/src/_routes/server/client-app/client-app.control-service.js +132 -0
- package/build/src/_routes/server/client-app/client-app.controller.js +35 -0
- package/build/src/_routes/server/config/config.control-service.js +476 -0
- package/build/src/_routes/server/config/config.data-service.js +49 -0
- package/build/src/_routes/server/errors/errors.control-service.js +123 -0
- package/build/src/_routes/server/errors/errors.controller.js +65 -0
- package/build/src/_routes/server/errors/errors.data-service.js +80 -0
- package/build/src/_routes/server/server-status/server-status.control-service.js +19 -0
- package/build/src/_routes/server/server-status/server-status.controller.js +39 -0
- package/build/src/app.server.js +122 -0
- package/build/src/environments/environment.js +20 -0
- package/build/src/index.js +18 -0
- package/client-dist/chunk-GHKRM4SM.js +1 -0
- package/client-dist/chunk-LMTL7GA3.js +575 -0
- package/client-dist/index.html +17 -0
- package/client-dist/main-2KWB3QYK.js +2 -0
- package/client-dist/polyfills-HGDOEU5L.js +2 -0
- package/client-dist/styles-3J7JD5YE.css +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_ErrorContext_Util = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `FAM_ErrorContext_Util` (dsgn-008 §6, SP-8.1) — statikus, **függőség-mentes** util a hiba-kontextus
|
|
6
|
+
* (`contextSnapshot`) normalizálásához. A hívó réteg nyers kontextusát (`FAM_ErrorContextInput`) a
|
|
7
|
+
* `FAM_ErrorContext` shape-re hozza:
|
|
8
|
+
*
|
|
9
|
+
* - **scope-lánc → string:** ha a `scopePath` `string[]` (canonical-nevek), `">"`-tal láncolja
|
|
10
|
+
* (`"org>project>module"`); ha már string, változatlan.
|
|
11
|
+
* - **üres-kihagyás:** csak a jelenlévő mezőket írja be — a snapshot sosem hordoz üres/`undefined`
|
|
12
|
+
* zajt, de **sosem üres, ha a kontextus elérhető** (a snapshot összeállítás a hiba-kibocsátás
|
|
13
|
+
* kötelező része, dsgn-008 §4).
|
|
14
|
+
* - **sensitive-kiszűrés (HARD, dsgn-008 §6):** API-key / token / secret / password / bearer SOHA
|
|
15
|
+
* nem kerül a snapshot-ba. A snapshot mező-halmaza fix (`FAM_ErrorContext`), így a kiszűrés a
|
|
16
|
+
* string-mezők értékeit is védi (egy gyanús-mintára illeszkedő érték `'[redacted]'`).
|
|
17
|
+
*/
|
|
18
|
+
class FAM_ErrorContext_Util {
|
|
19
|
+
/** Sensitive-kulcs/érték minták (case-insensitive) — a snapshot SOHA nem hordozhat ilyet. */
|
|
20
|
+
static SENSITIVE_PATTERN = /(api[-_]?key|secret|token|password|passwd|bearer|authorization|private[-_]?key|access[-_]?key)/i;
|
|
21
|
+
/**
|
|
22
|
+
* A nyers kontextusból a normalizált `FAM_ErrorContext` snapshot. Csak a jelenlévő mezőket
|
|
23
|
+
* írja be; a `scopePath` tömböt láncolja; a string-értékeket sensitive-szűri. Ha a bemenet
|
|
24
|
+
* üres/hiányzik, `undefined`-et ad (a hiba-rekordon nem lesz `contextSnapshot`).
|
|
25
|
+
*/
|
|
26
|
+
static build(input) {
|
|
27
|
+
if (!input) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const snapshot = {};
|
|
31
|
+
FAM_ErrorContext_Util.setString(snapshot, 'instanceId', input.instanceId);
|
|
32
|
+
FAM_ErrorContext_Util.setString(snapshot, 'runId', input.runId);
|
|
33
|
+
FAM_ErrorContext_Util.setScopePath(snapshot, input.scopePath);
|
|
34
|
+
FAM_ErrorContext_Util.setTable(snapshot, input.table);
|
|
35
|
+
FAM_ErrorContext_Util.setString(snapshot, 'operation', input.operation);
|
|
36
|
+
FAM_ErrorContext_Util.setString(snapshot, 'sourceFilePath', input.sourceFilePath);
|
|
37
|
+
FAM_ErrorContext_Util.setNumber(snapshot, 'chunkIndex', input.chunkIndex);
|
|
38
|
+
FAM_ErrorContext_Util.setString(snapshot, 'query', input.query);
|
|
39
|
+
FAM_ErrorContext_Util.setString(snapshot, 'provider', input.provider);
|
|
40
|
+
// Ha minden mező hiányzott, NINCS snapshot (a rekordon nem jelenik meg üres objektum).
|
|
41
|
+
return Object.keys(snapshot).length ? snapshot : undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Egy szabad kulcs sensitive-e (a hívók is használhatják, pl. egy `additionalContent`-szerű
|
|
45
|
+
* objektum kulcs-szűréséhez a hiba-kibocsátás előtt). A `value` is vizsgált (egy nem-sensitive
|
|
46
|
+
* kulcson is lehet pl. teljes connection-string).
|
|
47
|
+
*/
|
|
48
|
+
static isSensitive(key, value) {
|
|
49
|
+
if (FAM_ErrorContext_Util.SENSITIVE_PATTERN.test(key)) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === 'string' && FAM_ErrorContext_Util.SENSITIVE_PATTERN.test(value)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
/** String-mező beállítás üres-kihagyással + sensitive-redakcióval. */
|
|
58
|
+
static setString(snapshot, key, value) {
|
|
59
|
+
if (value === undefined || value === null || value === '') {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const redacted = FAM_ErrorContext_Util.SENSITIVE_PATTERN.test(value) ? '[redacted]' : value;
|
|
63
|
+
snapshot[key] = redacted;
|
|
64
|
+
}
|
|
65
|
+
/** Number-mező beállítás (a 0 érvényes érték — csak az `undefined`/`null` kihagyott). */
|
|
66
|
+
static setNumber(snapshot, key, value) {
|
|
67
|
+
if (value === undefined || value === null || Number.isNaN(value)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
snapshot[key] = value;
|
|
71
|
+
}
|
|
72
|
+
/** A `table` enum beállítás (üres-kihagyással). */
|
|
73
|
+
static setTable(snapshot, value) {
|
|
74
|
+
if (value === undefined || value === null) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
snapshot.table = value;
|
|
78
|
+
}
|
|
79
|
+
/** A scope-lánc normalizálás: `string[]` → `">"`-láncolt string; string → változatlan. */
|
|
80
|
+
static setScopePath(snapshot, value) {
|
|
81
|
+
if (value === undefined || value === null) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const chained = Array.isArray(value) ? value.filter(Boolean).join('>') : value;
|
|
85
|
+
if (chained) {
|
|
86
|
+
snapshot.scopePath = chained;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.FAM_ErrorContext_Util = FAM_ErrorContext_Util;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_Error_Util = void 0;
|
|
4
|
+
exports.createFamError = createFamError;
|
|
5
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
6
|
+
const error_codes_const_1 = require("./error-codes.const");
|
|
7
|
+
const fam_error_context_util_1 = require("./fam-error-context.util");
|
|
8
|
+
/**
|
|
9
|
+
* `FAM_Error_Util` (SP-8.2, dsgn-008 §4) — a réteg-szintű hiba-emisszió **reusable factory**-ja. NEM
|
|
10
|
+
* persistál és NEM kapja el a hibát — csak megépíti a kanonikus `DyFM_Error`-t (errorCode + level +
|
|
11
|
+
* `contextSnapshot`), amit a réteg vagy dob (a `globalErrorHandler` perzistálja), vagy a
|
|
12
|
+
* `FAM_Error_ControlService.emit`-en át küld. Így minden réteg UGYANAZT a hiba-shape-et bocsátja ki
|
|
13
|
+
* (a 3-lépéses szerződés 1. lépése), nem ad-hoc `new DyFM_Error`-t szór szét.
|
|
14
|
+
*
|
|
15
|
+
* A `level` default a `<SVC>` réteg-kódból (a `errorCode` első szegmense után), a katalógus
|
|
16
|
+
* `FAM_ERROR_SVC_DEFAULT_LEVEL` map-jéből — így a réteg-MP-knek nem kell ismételten level-t adni.
|
|
17
|
+
*
|
|
18
|
+
* A `contextSnapshot` a `DyFM_Error.additionalContent.contextSnapshot`-ba kerül (a Dynamo-record
|
|
19
|
+
* `createErrorRecord` az `additionalContent`-et viszi át), majd a `FAM_Error_DataService` emeli a
|
|
20
|
+
* rekord top-level `contextSnapshot` mezőjébe (dsgn-008 §2).
|
|
21
|
+
*/
|
|
22
|
+
class FAM_Error_Util {
|
|
23
|
+
/**
|
|
24
|
+
* A kanonikus FAM `DyFM_Error` megépítése (errorCode + level + sensitive-szűrt snapshot). A
|
|
25
|
+
* `level` a megadott érték VAGY a `<SVC>` réteg-default. A `context` a `FAM_ErrorContext_Util`-on
|
|
26
|
+
* megy át (üres-kihagyás + sensitive-redakció). NEM dob, NEM persistál — a hívó dönti el.
|
|
27
|
+
*/
|
|
28
|
+
static create(params) {
|
|
29
|
+
const level = params.level ?? FAM_Error_Util.defaultLevelForCode(params.errorCode);
|
|
30
|
+
const snapshot = fam_error_context_util_1.FAM_ErrorContext_Util.build(params.context);
|
|
31
|
+
return new fsm_dynamo_1.DyFM_Error({
|
|
32
|
+
errorCode: params.errorCode,
|
|
33
|
+
message: params.message,
|
|
34
|
+
level: level,
|
|
35
|
+
issuer: params.issuer,
|
|
36
|
+
issuerService: params.issuer,
|
|
37
|
+
error: params.cause,
|
|
38
|
+
// A snapshot az additionalContent-en utazik a Dynamo-record-ba (createErrorRecord viszi),
|
|
39
|
+
// majd a FAM_Error_DataService emeli a rekord top-level contextSnapshot mezőjébe.
|
|
40
|
+
additionalContent: snapshot ? { contextSnapshot: snapshot } : undefined,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A `<SVC>` réteg-default szint egy `FAM-<SVC>-<METHOD>-NNN` kódhoz (a katalógus map-jéből). A
|
|
45
|
+
* kód 2. szegmense a `<SVC>` (`FAM-EMB-PROVIDER-001` → `EMB`). Ismeretlen prefix → `error`.
|
|
46
|
+
*/
|
|
47
|
+
static defaultLevelForCode(errorCode) {
|
|
48
|
+
const segments = (errorCode ?? '').split('-');
|
|
49
|
+
const svcSegment = segments[1];
|
|
50
|
+
const svc = Object.values(error_codes_const_1.FAM_ErrorSvc).includes(svcSegment ?? '')
|
|
51
|
+
? svcSegment
|
|
52
|
+
: undefined;
|
|
53
|
+
return svc ? error_codes_const_1.FAM_ERROR_SVC_DEFAULT_LEVEL[svc] : fsm_dynamo_1.DyFM_ErrorLevel.error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.FAM_Error_Util = FAM_Error_Util;
|
|
57
|
+
/**
|
|
58
|
+
* Kényelmi factory-függvény (a `FAM_Error_Util.create` rövid alakja) — a réteg-MP-k ezt hívják a
|
|
59
|
+
* hiba-emisszió 1. lépéséhez. Pl.: `throw createFamError({ errorCode: FAM_ERROR_CODES.dbConnect,
|
|
60
|
+
* message: '...', context: { operation: 'connect' } })`.
|
|
61
|
+
*/
|
|
62
|
+
function createFamError(params) {
|
|
63
|
+
return FAM_Error_Util.create(params);
|
|
64
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_ConfigLevel = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Config feloldási-szint (dsgn-007 §2). A `level` + `tableScope` + `scopeId` hármas adja a
|
|
6
|
+
* `FAM_Config` feloldási kulcsát; a precedencia **scope > table > global > builtin** (dsgn-007 §3).
|
|
7
|
+
*
|
|
8
|
+
* Enum-konvenció (workspace base CLAUDE.md): a key camelCase, a value kebab/snake-case.
|
|
9
|
+
*/
|
|
10
|
+
var FAM_ConfigLevel;
|
|
11
|
+
(function (FAM_ConfigLevel) {
|
|
12
|
+
FAM_ConfigLevel["global"] = "global";
|
|
13
|
+
FAM_ConfigLevel["table"] = "table";
|
|
14
|
+
FAM_ConfigLevel["scope"] = "scope";
|
|
15
|
+
})(FAM_ConfigLevel || (exports.FAM_ConfigLevel = FAM_ConfigLevel = {}));
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_Table = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tár-azonosítók (dsgn-001 §1). A 6 fő RAG-tár + a `reference` helper-tár.
|
|
6
|
+
*
|
|
7
|
+
* Enum-konvenció (workspace base CLAUDE.md): a key camelCase, a value kebab/snake-case.
|
|
8
|
+
* A Mongo-collection naming `fam_<value>` (pl. `fam_rules`, `fam_coding_patterns`).
|
|
9
|
+
* A `reference` séma eltér a fő táraktól (dsgn-001 §5) — helper, NEM fő RAG-tár.
|
|
10
|
+
*/
|
|
11
|
+
var FAM_Table;
|
|
12
|
+
(function (FAM_Table) {
|
|
13
|
+
FAM_Table["rules"] = "rules";
|
|
14
|
+
FAM_Table["documents"] = "documents";
|
|
15
|
+
FAM_Table["codebase"] = "codebase";
|
|
16
|
+
FAM_Table["knowledge"] = "knowledge";
|
|
17
|
+
FAM_Table["codingPatterns"] = "coding_patterns";
|
|
18
|
+
FAM_Table["memory"] = "memory";
|
|
19
|
+
FAM_Table["reference"] = "reference";
|
|
20
|
+
})(FAM_Table || (exports.FAM_Table = FAM_Table = {}));
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_IntegrationTest_Setup_Util = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const net = tslib_1.__importStar(require("net"));
|
|
6
|
+
const mongoose_1 = tslib_1.__importDefault(require("mongoose"));
|
|
7
|
+
const nts_dynamo_1 = require("@futdevpro/nts-dynamo");
|
|
8
|
+
const fam_db_models_const_1 = require("../../_collections/fam-db-models.const");
|
|
9
|
+
/** Integrációs teszt issuer — a MongoDB-dokumentumok azonosítására. */
|
|
10
|
+
const INTTEST_ISSUER = 'integration-test';
|
|
11
|
+
/** Teszt-adat prefix — a teszt-dokumentumok megkülönböztetésére (NEM ütközik production-nal). */
|
|
12
|
+
const INTTEST_PREFIX = 'inttest-';
|
|
13
|
+
/** A dedikált spec-DB neve (a runner/local Mongo-n; NEM a `fdp-agent-memory` prod-DB). */
|
|
14
|
+
const INTTEST_DB_NAME = 'fam_inttest';
|
|
15
|
+
/** MongoDB elérhetőség-ellenőrzés timeout (ms). */
|
|
16
|
+
const MONGO_CHECK_TIMEOUT_MS = 1500;
|
|
17
|
+
/**
|
|
18
|
+
* `FAM_IntegrationTest_Setup_Util` — az integrációs tesztek közös setup-utility-je (a
|
|
19
|
+
* `ccap-revisioned` `IntegrationTest_Setup_Util` mintára). MongoDB-elérhetőség (TCP-probe a
|
|
20
|
+
* `MONGO_URL`-re), egyedi `inttest-` ID-generálás, ÉS egy **lightweight DB-setup** (mongoose-connect +
|
|
21
|
+
* `DyNTS_GlobalService.setServices`) — **NEM a teljes `new App()` boot** (az HTTP-listen + LVS-hydrate
|
|
22
|
+
* postProcess-t indít, ami a spec-eket hangolja); csak a DataService-ek DB-rétegét állítja fel.
|
|
23
|
+
*/
|
|
24
|
+
class FAM_IntegrationTest_Setup_Util {
|
|
25
|
+
/** Teszt issuer azonosító — minden integrációs-teszt DataService-híváshoz. */
|
|
26
|
+
static getIssuer() {
|
|
27
|
+
return INTTEST_ISSUER;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Egyedi, időbélyeges ID/tartalom a teszt-adatokhoz. Pattern: `inttest-{timestamp}-{random}` —
|
|
31
|
+
* párhuzamos futtatásban is egyedi, és a prefix jelzi a teszt-adatot.
|
|
32
|
+
*/
|
|
33
|
+
static generateUniqueId() {
|
|
34
|
+
const timestamp = Date.now();
|
|
35
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
36
|
+
return `${INTTEST_PREFIX}${timestamp}-${random}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* MongoDB elérhetőség TCP-socket-tel (a `MONGO_URL` host:port-ja; default
|
|
40
|
+
* `mongodb://127.0.0.1:27017`). Ha nem elérhető → `false`, és a tesztek `pending()`-re állnak
|
|
41
|
+
* (CI-ben Mongo nélkül is zöld a suite — pending, NEM failure).
|
|
42
|
+
*/
|
|
43
|
+
static checkMongoAvailability() {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
const mongoUrl = process.env.MONGO_URL ?? 'mongodb://127.0.0.1:27017';
|
|
46
|
+
const urlNoProtocol = mongoUrl.replace(/^mongodb(\+srv)?:\/\//, '');
|
|
47
|
+
const hostPort = urlNoProtocol.split('/')[0];
|
|
48
|
+
const parts = hostPort.split(':');
|
|
49
|
+
const host = parts[0];
|
|
50
|
+
const port = parseInt(parts[1] ?? '27017', 10);
|
|
51
|
+
const socket = net.createConnection({ host: host, port: port });
|
|
52
|
+
let finished = false;
|
|
53
|
+
const finish = (available) => {
|
|
54
|
+
if (finished) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
finished = true;
|
|
58
|
+
try {
|
|
59
|
+
socket.destroy();
|
|
60
|
+
}
|
|
61
|
+
catch { /* ignore */ }
|
|
62
|
+
resolve(available);
|
|
63
|
+
};
|
|
64
|
+
socket.on('connect', () => { finish(true); });
|
|
65
|
+
socket.on('error', () => { finish(false); });
|
|
66
|
+
setTimeout(() => { finish(false); }, MONGO_CHECK_TIMEOUT_MS);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Lightweight DB-setup (`beforeAll`-ban, ha a Mongo elérhető): mongoose-connect a dedikált
|
|
71
|
+
* `fam_inttest` DB-re + `DyNTS_GlobalService.setServices` a `FAM_DB_MODELS`-szel (SSOT). Így a
|
|
72
|
+
* `new FAM_*_DataService(...)` (eager getDBService) feloldódik — App-boot, HTTP-listen és
|
|
73
|
+
* embedding/LVS-postProcess NÉLKÜL (azok a teljes boot velejárói, itt nem kellenek).
|
|
74
|
+
*/
|
|
75
|
+
static async setupDb() {
|
|
76
|
+
const mongoUrl = process.env.MONGO_URL ?? 'mongodb://127.0.0.1:27017';
|
|
77
|
+
const base = mongoUrl.replace(/^(mongodb(\+srv)?:\/\/[^/]+).*$/, '$1');
|
|
78
|
+
await mongoose_1.default.connect(`${base}/${INTTEST_DB_NAME}`);
|
|
79
|
+
await nts_dynamo_1.DyNTS_GlobalService.setServices({ dbModels: fam_db_models_const_1.FAM_DB_MODELS });
|
|
80
|
+
}
|
|
81
|
+
/** DB-teardown (`afterAll`-ban): a mongoose-kapcsolat zárása (best-effort). */
|
|
82
|
+
static async teardownDb() {
|
|
83
|
+
try {
|
|
84
|
+
if (mongoose_1.default.connection.readyState !== 0) {
|
|
85
|
+
await mongoose_1.default.disconnect();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best-effort — a process-vég úgyis bontja.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Egy collection ürítése teszt KÖZÖTT (a teszt-izolációhoz). No-op ha a kapcsolat nem áll. */
|
|
93
|
+
static async clearCollection(collectionName) {
|
|
94
|
+
if (mongoose_1.default.connection.readyState !== 1) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await mongoose_1.default.connection.collection(collectionName).deleteMany({});
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// a collection lehet hogy még nem létezik — nem hiba.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.FAM_IntegrationTest_Setup_Util = FAM_IntegrationTest_Setup_Util;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.famCodebase_dataParams = exports.FAM_Codebase_DataModel = void 0;
|
|
4
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
|
+
const fam_entry_base_properties_const_1 = require("./fam-entry-base-properties.const");
|
|
6
|
+
const fam_entry_data_model_1 = require("./fam-entry.data-model");
|
|
7
|
+
/**
|
|
8
|
+
* `codebase` tár (dsgn-001 §1/§4) — forráskód-chunkok (symbol / function / class / config …).
|
|
9
|
+
*
|
|
10
|
+
* A `FAM_Entry` bázisra épül; per-tár mezők: `parentSymbol`, `description` (JSDoc/komment),
|
|
11
|
+
* `requirementCodes`, `moduleSummary` (modul-összefoglaló chunk-e). `kind` default `'source'`.
|
|
12
|
+
*/
|
|
13
|
+
class FAM_Codebase_DataModel extends fam_entry_data_model_1.FAM_Entry {
|
|
14
|
+
/** A szülő-symbol (`FooClass` | `fooFunction`). */
|
|
15
|
+
parentSymbol;
|
|
16
|
+
/** JSDoc / komment a symbol-hoz. */
|
|
17
|
+
description;
|
|
18
|
+
/** Requirement-kódok (cross-search a `documents` tárral). */
|
|
19
|
+
requirementCodes = [];
|
|
20
|
+
/** Modul-összefoglaló chunk-e. */
|
|
21
|
+
moduleSummary;
|
|
22
|
+
constructor(set) {
|
|
23
|
+
super(set);
|
|
24
|
+
if (set) {
|
|
25
|
+
fsm_dynamo_1.DyFM_Object.cleanAssign(this, set);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.FAM_Codebase_DataModel = FAM_Codebase_DataModel;
|
|
30
|
+
/**
|
|
31
|
+
* MongoDB data-params a `codebase` tárhoz (collection `fam_codebase`, dsgn-001 §1).
|
|
32
|
+
*
|
|
33
|
+
* `contentVector` `vectorizedFrom: ['content', 'description']` — a kód-chunk + a JSDoc/komment
|
|
34
|
+
* adja a vektorizált jelet (embedding-provider MP-2). `kind` default `'source'` (dsgn-001 §4).
|
|
35
|
+
*/
|
|
36
|
+
exports.famCodebase_dataParams = new fsm_dynamo_1.DyFM_DataModel_Params({
|
|
37
|
+
dataName: 'fam_codebase',
|
|
38
|
+
addArchive: true,
|
|
39
|
+
properties: {
|
|
40
|
+
...fam_entry_base_properties_const_1.famEntryBaseProperties,
|
|
41
|
+
kind: { type: 'string', index: true, default: 'source' },
|
|
42
|
+
contentVector: {
|
|
43
|
+
type: 'number[]', vectorizedFrom: ['content', 'description'],
|
|
44
|
+
vectorizeUseIndex: 'contentVector', default: [],
|
|
45
|
+
},
|
|
46
|
+
parentSymbol: { type: 'string', index: true },
|
|
47
|
+
description: { type: 'string' },
|
|
48
|
+
requirementCodes: { type: 'string[]', index: true, default: [] },
|
|
49
|
+
moduleSummary: { type: 'boolean', index: true },
|
|
50
|
+
},
|
|
51
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.famCodingPatterns_dataParams = exports.FAM_CodingPatterns_DataModel = void 0;
|
|
4
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
|
+
const fam_entry_base_properties_const_1 = require("./fam-entry-base-properties.const");
|
|
6
|
+
const fam_entry_data_model_1 = require("./fam-entry.data-model");
|
|
7
|
+
/**
|
|
8
|
+
* `coding_patterns` tár (dsgn-001 §1/§4) — coding-patterns / anti-patterns / recipes / template-ek.
|
|
9
|
+
*
|
|
10
|
+
* A `FAM_Entry` bázisra épül; per-tár mezők: `patternName`, `code` (a kód-snippet — **NEM** kerül
|
|
11
|
+
* a vektorba), `description`, `dimensions`. `kind` default `'pattern'`, `weight` default **5**
|
|
12
|
+
* (magas context-injection prioritás — CCAP-örökség, dsgn-001 §4).
|
|
13
|
+
*/
|
|
14
|
+
class FAM_CodingPatterns_DataModel extends fam_entry_data_model_1.FAM_Entry {
|
|
15
|
+
/** A pattern neve (rövid azonosító). */
|
|
16
|
+
patternName;
|
|
17
|
+
/** Code-snippet — a kódszöveg NEM kerül a vektorba (zajos szemantikus keresés). */
|
|
18
|
+
code;
|
|
19
|
+
/** Részletes magyarázat / kontextus / mikor használjuk. */
|
|
20
|
+
description;
|
|
21
|
+
/** Dimenziók (`server`|`client`|`fullstack`|`devops`|`testing`). */
|
|
22
|
+
dimensions = [];
|
|
23
|
+
/** Retrieval-scoring szorzó; default **5** (magas context-injection prioritás). */
|
|
24
|
+
weight = 5;
|
|
25
|
+
constructor(set) {
|
|
26
|
+
super(set);
|
|
27
|
+
if (set) {
|
|
28
|
+
fsm_dynamo_1.DyFM_Object.cleanAssign(this, set);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.FAM_CodingPatterns_DataModel = FAM_CodingPatterns_DataModel;
|
|
33
|
+
/**
|
|
34
|
+
* MongoDB data-params a `coding_patterns` tárhoz (collection `fam_coding_patterns`, dsgn-001 §1).
|
|
35
|
+
*
|
|
36
|
+
* `contentVector` `vectorizedFrom: ['content', 'patternName', 'description']` — a `code` snippet
|
|
37
|
+
* SZÁNDÉKOSAN KIMARAD a vektorizált forrásból (dsgn-001 §4: a kódszöveg rontaná a szemantikus
|
|
38
|
+
* keresést). `kind` default `'pattern'`, `weight` default `5` (dsgn-001 §4). Embedding-provider MP-2.
|
|
39
|
+
*/
|
|
40
|
+
exports.famCodingPatterns_dataParams = new fsm_dynamo_1.DyFM_DataModel_Params({
|
|
41
|
+
dataName: 'fam_coding_patterns',
|
|
42
|
+
addArchive: true,
|
|
43
|
+
properties: {
|
|
44
|
+
...fam_entry_base_properties_const_1.famEntryBaseProperties,
|
|
45
|
+
kind: { type: 'string', index: true, default: 'pattern' },
|
|
46
|
+
contentVector: {
|
|
47
|
+
type: 'number[]',
|
|
48
|
+
vectorizedFrom: ['content', 'patternName', 'description'],
|
|
49
|
+
vectorizeUseIndex: 'contentVector',
|
|
50
|
+
default: [],
|
|
51
|
+
},
|
|
52
|
+
weight: { type: 'number', default: 5 },
|
|
53
|
+
patternName: { type: 'string', index: true },
|
|
54
|
+
code: { type: 'string' },
|
|
55
|
+
description: { type: 'string' },
|
|
56
|
+
dimensions: { type: 'string[]', index: true, default: [] },
|
|
57
|
+
},
|
|
58
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.famConfig_dataParams = exports.FAM_Config_DataModel = void 0;
|
|
4
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
|
+
/**
|
|
6
|
+
* `FAM_Config` entitás (dsgn-007 §2). Egy dokumentum = **egy setting-érték egy adott szinten**;
|
|
7
|
+
* a `level` + `tableScope` + `scopeId` hármas adja a feloldási kulcsot (dsgn-007 §3 precedencia).
|
|
8
|
+
*
|
|
9
|
+
* `extends DyFM_Metadata` (NEM `FAM_Entry`): nem RAG-tartalom, hanem config-rekord. Az identitás/
|
|
10
|
+
* metadata (`_id`, `__created`, `__lastModified`, `_deleted`) az ősből jön; a `_deleted` soft-delete
|
|
11
|
+
* marker (Date), amit a `DyNTS_ArchiveDataService` kezel (a felülírás-history alapja, dsgn-007 §7.2).
|
|
12
|
+
*
|
|
13
|
+
* **Logikai unique-constraint** (dsgn-007 §2): `(level, tableScope, scopeId, key)` — egy szinten egy
|
|
14
|
+
* kulcsnak EGY aktív (`_deleted=false`) értéke van; új `set` ugyanarra felülír (régi soft-delete).
|
|
15
|
+
*
|
|
16
|
+
* A `value` szándékosan `unknown` (Mongoose `Mixed`, séma-szinten `type:'object'`): a típushelyesség
|
|
17
|
+
* a katalógus + a `set`-kori validáció felelőssége (dsgn-007 §7.1), nem a séma. A `value` írása
|
|
18
|
+
* **`$set`-tel atomikus** (Mongoose Mixed silent-drop ellen — memory: mongoose_mixed_atomic_write).
|
|
19
|
+
*/
|
|
20
|
+
class FAM_Config_DataModel extends fsm_dynamo_1.DyFM_Metadata {
|
|
21
|
+
// --- a feloldási kulcs ---
|
|
22
|
+
/** A feloldási-szint (`global`|`table`|`scope`). */
|
|
23
|
+
level;
|
|
24
|
+
/** `level='table'|'scope'` esetén kötelező: melyik tár. */
|
|
25
|
+
tableScope;
|
|
26
|
+
/** `level='scope'` esetén kötelező: a `FAM_Scope._id` (dsgn-002). */
|
|
27
|
+
scopeId;
|
|
28
|
+
// --- a setting maga ---
|
|
29
|
+
/** A katalógus kulcsa (§4) — pl. `'read.topK'` (string-ként perzistált). */
|
|
30
|
+
key;
|
|
31
|
+
/** A setting-érték; típusa a katalógus szerint (§4), validált (§7). Mongoose `Mixed`. */
|
|
32
|
+
value;
|
|
33
|
+
// --- audit (dsgn-007 §7) ---
|
|
34
|
+
/** Ki/mi állította be (`manual`/`agent`/`cli`/`ui`/`preset`/`env-seed`/`system`). */
|
|
35
|
+
setBy;
|
|
36
|
+
/** Beállítás-részlet (pl. preset-név `'openai-recommended'`, CLI-user). */
|
|
37
|
+
setByDetail;
|
|
38
|
+
/** Opcionális indoklás. */
|
|
39
|
+
note;
|
|
40
|
+
constructor(set) {
|
|
41
|
+
super(set);
|
|
42
|
+
if (set) {
|
|
43
|
+
fsm_dynamo_1.DyFM_Object.cleanAssign(this, set);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.FAM_Config_DataModel = FAM_Config_DataModel;
|
|
48
|
+
/**
|
|
49
|
+
* MongoDB data-params a `fam_config` collection-höz (dsgn-007 §2). `addArchive: true` → a felülírt
|
|
50
|
+
* (régi) értékek soft-delete-elve megőrződnek (audit-trail / history, dsgn-007 §7.2).
|
|
51
|
+
*
|
|
52
|
+
* A `value` `type:'object'` (Mongoose `Mixed`) — séma NEM validál; a típushelyesség a katalógus +
|
|
53
|
+
* a `set`-kori validáció dolga (dsgn-007 §7.1).
|
|
54
|
+
*/
|
|
55
|
+
exports.famConfig_dataParams = new fsm_dynamo_1.DyFM_DataModel_Params({
|
|
56
|
+
dataName: 'fam_config',
|
|
57
|
+
addArchive: true,
|
|
58
|
+
properties: {
|
|
59
|
+
level: { type: 'string', index: true, required: true },
|
|
60
|
+
tableScope: { type: 'string', index: true },
|
|
61
|
+
scopeId: { type: 'string', index: true },
|
|
62
|
+
key: { type: 'string', index: true, required: true },
|
|
63
|
+
value: { type: 'object' },
|
|
64
|
+
setBy: { type: 'string', index: true },
|
|
65
|
+
setByDetail: { type: 'string' },
|
|
66
|
+
note: { type: 'string' },
|
|
67
|
+
},
|
|
68
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.famDocuments_dataParams = exports.FAM_Documents_DataModel = void 0;
|
|
4
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
|
+
const fam_entry_base_properties_const_1 = require("./fam-entry-base-properties.const");
|
|
6
|
+
const fam_entry_data_model_1 = require("./fam-entry.data-model");
|
|
7
|
+
/**
|
|
8
|
+
* `documents` tár (dsgn-001 §1/§4) — dokumentumok (spec / dokumentáció / FR / bug / dev-note …).
|
|
9
|
+
*
|
|
10
|
+
* A `FAM_Entry` bázisra épül; per-tár mezők: `documentTitle`, `sourceType`, `sourceDocumentId`,
|
|
11
|
+
* `pageNumber`, `requirementCodes` (cross-search a `codebase`-szel). `kind` default `'document'`.
|
|
12
|
+
*/
|
|
13
|
+
class FAM_Documents_DataModel extends fam_entry_data_model_1.FAM_Entry {
|
|
14
|
+
/** A dokumentum címe. */
|
|
15
|
+
documentTitle;
|
|
16
|
+
/** Forrás-típus (`specification`|`documentation`|`fr`|`bug`|`other`). */
|
|
17
|
+
sourceType;
|
|
18
|
+
/** A forrás-dokumentum azonosítója. */
|
|
19
|
+
sourceDocumentId;
|
|
20
|
+
/** Oldalszám (ha lapozható forrás). */
|
|
21
|
+
pageNumber;
|
|
22
|
+
/** Requirement-kódok (cross-search a `codebase` tárral). */
|
|
23
|
+
requirementCodes = [];
|
|
24
|
+
constructor(set) {
|
|
25
|
+
super(set);
|
|
26
|
+
if (set) {
|
|
27
|
+
fsm_dynamo_1.DyFM_Object.cleanAssign(this, set);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.FAM_Documents_DataModel = FAM_Documents_DataModel;
|
|
32
|
+
/**
|
|
33
|
+
* MongoDB data-params a `documents` tárhoz (collection `fam_documents`, dsgn-001 §1).
|
|
34
|
+
*
|
|
35
|
+
* `contentVector` `vectorizedFrom: ['content']` — auto-embed mentéskor (embedding-provider MP-2).
|
|
36
|
+
* `kind` default `'document'` (dsgn-001 §4).
|
|
37
|
+
*/
|
|
38
|
+
exports.famDocuments_dataParams = new fsm_dynamo_1.DyFM_DataModel_Params({
|
|
39
|
+
dataName: 'fam_documents',
|
|
40
|
+
addArchive: true,
|
|
41
|
+
properties: {
|
|
42
|
+
...fam_entry_base_properties_const_1.famEntryBaseProperties,
|
|
43
|
+
kind: { type: 'string', index: true, default: 'document' },
|
|
44
|
+
contentVector: {
|
|
45
|
+
type: 'number[]', vectorizedFrom: ['content'], vectorizeUseIndex: 'contentVector', default: [],
|
|
46
|
+
},
|
|
47
|
+
documentTitle: { type: 'string', index: true },
|
|
48
|
+
sourceType: { type: 'string', index: true },
|
|
49
|
+
sourceDocumentId: { type: 'string', index: true },
|
|
50
|
+
pageNumber: { type: 'number' },
|
|
51
|
+
requirementCodes: { type: 'string[]', index: true, default: [] },
|
|
52
|
+
},
|
|
53
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.famEntryBaseProperties = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A `FAM_Entry` bázis-mezők közös `dataParams.properties` definíciója (dsgn-001 §2).
|
|
6
|
+
*
|
|
7
|
+
* A 6 fő tár `dataParams`-e ezt spread-eli (`...famEntryBaseProperties`), kiegészítve a
|
|
8
|
+
* per-tár specifikus mezőkkel (dsgn-001 §4) és a `contentVector` `vectorizedFrom` annotációval.
|
|
9
|
+
* Így a közös bázis-szótár EGY helyen él (SSOT), és a per-tár fájlok csak a delta-t tartalmazzák.
|
|
10
|
+
*
|
|
11
|
+
* A `contentVector` itt SZÁNDÉKOSAN NEM `vectorizedFrom`-annotált — azt minden tár a SAJÁT
|
|
12
|
+
* forrás-mezőivel deklarálja felül (pl. `knowledge`: `content` + `subject` + `description`),
|
|
13
|
+
* mert a vektorizált forrás-halmaz per-tár eltér (dsgn-001 §4, dsgn-006 §3). Az embedding-provider
|
|
14
|
+
* bekötése MP-2.
|
|
15
|
+
*
|
|
16
|
+
* Default-ok a `dataParams`-ban (nem csak TS-default), hogy a Mongo-perzistált rekordon is
|
|
17
|
+
* megjelenjenek (dsgn-001 §2: `embeddingStatus='pending'`, `weight`, `chunkIndex=0`, `tags=[]`).
|
|
18
|
+
*/
|
|
19
|
+
exports.famEntryBaseProperties = {
|
|
20
|
+
table: { type: 'string', index: true, required: true },
|
|
21
|
+
kind: { type: 'string', index: true },
|
|
22
|
+
tags: { type: 'string[]', index: true, default: [] },
|
|
23
|
+
content: { type: 'string', required: true },
|
|
24
|
+
contentVector: { type: 'number[]', default: [] },
|
|
25
|
+
contentHash: { type: 'string', index: true },
|
|
26
|
+
embeddingModel: { type: 'string' },
|
|
27
|
+
embeddingStatus: { type: 'string', index: true, default: 'pending' },
|
|
28
|
+
scopePath: { type: 'array', default: [] },
|
|
29
|
+
referenceLinks: { type: 'string[]', default: [] },
|
|
30
|
+
weight: { type: 'number', default: 1 },
|
|
31
|
+
importance: { type: 'number', index: true },
|
|
32
|
+
source: { type: 'object' },
|
|
33
|
+
sourceFilePath: { type: 'string', index: true },
|
|
34
|
+
chunkIndex: { type: 'number', index: true, default: 0 },
|
|
35
|
+
chunkTotal: { type: 'number' },
|
|
36
|
+
chunkType: { type: 'string', index: true },
|
|
37
|
+
position: { type: 'object' },
|
|
38
|
+
headingPath: { type: 'string[]', default: [] },
|
|
39
|
+
addedBy: { type: 'string', index: true },
|
|
40
|
+
ingestRunId: { type: 'string', index: true },
|
|
41
|
+
importSource: { type: 'string', index: true },
|
|
42
|
+
importSourceId: { type: 'string', index: true },
|
|
43
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FAM_Entry = void 0;
|
|
4
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
|
+
/**
|
|
6
|
+
* Egységes entry-bázis (dsgn-001 §2). Minden FŐ tár (rules…memory) bejegyzése ezt a
|
|
7
|
+
* shape-et követi, kiegészítve a per-tár specifikus mezőkkel (dsgn-001 §4).
|
|
8
|
+
*
|
|
9
|
+
* A `DyFM_Metadata`-ból öröklődik az identitás/metadata (`_id`, `__created`, `__lastModified`,
|
|
10
|
+
* `_deleted`) — EZEKET NEM duplikáljuk (dsgn-001 §2). A `_deleted` a Dynamo-ban soft-delete
|
|
11
|
+
* marker (`Date`); a `DyNTS_ArchiveDataService` kezeli (dsgn-001 §8).
|
|
12
|
+
*
|
|
13
|
+
* Nem önálló collection (nincs saját `dataParams`): a 6 fő DataModel terjeszti ki (SP-1.2).
|
|
14
|
+
* A `vectorizedFrom` annotáció (auto-embed mentéskor) a per-tár `dataParams.contentVector`-on
|
|
15
|
+
* deklarált — az embedding-provider bekötése MP-2 (itt csak a forrás-mező jelölése).
|
|
16
|
+
*/
|
|
17
|
+
class FAM_Entry extends fsm_dynamo_1.DyFM_Metadata {
|
|
18
|
+
// --- besorolás ---
|
|
19
|
+
/** Melyik tár (denormalizált, kötelező — write-validáció dsgn-001 §9.2). */
|
|
20
|
+
table;
|
|
21
|
+
/** Alap forma / fő jelleg (per-tár default, dsgn-001 §3/§4). */
|
|
22
|
+
kind;
|
|
23
|
+
/** Többes kategorizálás (dsgn-001 §3); per-tár ajánlott vokabulár, de szabadon bővül. */
|
|
24
|
+
tags = [];
|
|
25
|
+
// --- tartalom + embedding ---
|
|
26
|
+
/** A vektorizált, ember-olvasható szöveg (kanonikus mező — dsgn-001 §2). */
|
|
27
|
+
content;
|
|
28
|
+
/** Embedding-vektor (auto-fill mentéskor, dsgn-006 / MP-2). */
|
|
29
|
+
contentVector = [];
|
|
30
|
+
/** SHA-256(normalizált content) — delta-detection (dsgn-004 §4). */
|
|
31
|
+
contentHash;
|
|
32
|
+
/** Mely modell állította elő a vektort (per-tár/scope override a configból — dsgn-007). */
|
|
33
|
+
embeddingModel;
|
|
34
|
+
/** Embedding-állapot; default `'pending'` (a vektor-feltöltés MP-2). */
|
|
35
|
+
embeddingStatus = 'pending';
|
|
36
|
+
// --- scope (dinamikus lánc; dsgn-002) ---
|
|
37
|
+
/** Gyökér→levél canonical scope-entitás referenciák; write-on KÖTELEZŐ (dsgn-002 §3.2). */
|
|
38
|
+
scopePath = [];
|
|
39
|
+
/** Feloldott reference-entitás `_id`-k (alias/fogalom kapcsolat — dsgn-002 §3). */
|
|
40
|
+
referenceLinks = [];
|
|
41
|
+
// --- pontozás ---
|
|
42
|
+
/** Retrieval-score multiplikátor (`> 0`); `0` → kizárt. Default `1.0` (per-tár override). */
|
|
43
|
+
weight = 1;
|
|
44
|
+
/** Opcionális kvalitatív hangsúly (0..1). */
|
|
45
|
+
importance;
|
|
46
|
+
// --- forrás / pozíció (scan/import esetén) ---
|
|
47
|
+
/** Provenance (dsgn-001 §6). */
|
|
48
|
+
source;
|
|
49
|
+
/** Projekt-relatív útvonal (scan). */
|
|
50
|
+
sourceFilePath;
|
|
51
|
+
/** Chunk pozíció a forrásfájlon belül (0-alapú). */
|
|
52
|
+
chunkIndex = 0;
|
|
53
|
+
/** Összes chunk az adott forrásra. */
|
|
54
|
+
chunkTotal;
|
|
55
|
+
/**
|
|
56
|
+
* A chunk típusa:
|
|
57
|
+
* `'class'|'function'|'method'|'imports'|'interface'|'enum'|'type'|
|
|
58
|
+
* 'heading-section'|'paragraph'|'generic'|'fallback'` (dsgn-001 §2, dsgn-004 §3).
|
|
59
|
+
*/
|
|
60
|
+
chunkType;
|
|
61
|
+
/** Karakter-/sor-pozíció a forráson belül (dsgn-001 §2). */
|
|
62
|
+
position;
|
|
63
|
+
/** MD heading-lánc VAGY kód-symbol-lánc (`['class:Foo','method:bar']`) — dsgn-004 §3. */
|
|
64
|
+
headingPath = [];
|
|
65
|
+
// --- provenance / csoportosítás ---
|
|
66
|
+
/** Ki/mi adta hozzá (dsgn-001 §6). */
|
|
67
|
+
addedBy;
|
|
68
|
+
/** Ingest-futtatás csoportosító ID (dsgn-004 §5). */
|
|
69
|
+
ingestRunId;
|
|
70
|
+
/** Külső import-forrás (pl. `'claude-mem'` — dsgn-009). */
|
|
71
|
+
importSource;
|
|
72
|
+
/** Eredeti rendszer rekord-azonosítója (dedup). */
|
|
73
|
+
importSourceId;
|
|
74
|
+
constructor(set) {
|
|
75
|
+
super(set);
|
|
76
|
+
if (set) {
|
|
77
|
+
fsm_dynamo_1.DyFM_Object.cleanAssign(this, set);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.FAM_Entry = FAM_Entry;
|