@futdevpro/fdp-agent-memory 1.1.136 → 1.1.137

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fdp-agent-memory",
3
- "version": "1.1.136",
3
+ "version": "1.1.137",
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": {
@@ -485,6 +485,15 @@ exports.CONFIG_CATALOG = {
485
485
  + 'dup-audit scheduler ezzel dönti el, hogy a legutóbbi heti re-scan után futott-e már audit (markRan-before-run '
486
486
  + '— crash-tűrő idempotencia). `0` = még sosem futott. A scheduler írja; kézzel ne állítsd.',
487
487
  },
488
+ // --- 4.5c. Rules-injekció (fogyasztó: FAM_RuleInjection_ControlService) ---
489
+ 'rules.injectBudgetChars': {
490
+ type: 'number', default: 32000, min: 1000, max: 200000, integer: true, levels: GLOBAL_ONLY,
491
+ description: 'Az always-on szabály-injekció char-budgetje (owner-döntés 2026-08-14: „a szabályok kritikusak"). '
492
+ + 'MÉRVE: a teljes kurált készlet egy FDP-projekten belül 56 szabály / 25 179 char; a korábbi 6000-es '
493
+ + 'budget ebből csak ~10-et engedett be (36 kimaradt). A budget-fit ATOMI: egy szabály vagy TELJESEN '
494
+ + 'bekerül, vagy a „(…and N more rules not shown)" jelzésbe esik — sosem félig (`core-rule-integrity`). '
495
+ + 'A hívó explicit `budgetChars`-a (pl. a SessionStart-hook) felülírja ezt.',
496
+ },
488
497
  // --- 4.6. Reference / scope (fogyasztó: dsgn-002) ---
489
498
  'reference.cacheTtlMs': {
490
499
  type: 'number', default: 60000, min: 0, max: 3600000, integer: true, levels: GLOBAL_ONLY,
@@ -12,8 +12,16 @@ const fam_rule_scope_type_enum_1 = require("../../../_enums/fam-rule-scope.type-
12
12
  * (NEM-aggresszív injektálás: a core befér, a többi „létezik" jelzéssel) — így az agent tudja, hogy `read`-elhet továbbiakat.
13
13
  */
14
14
  class FAM_RuleInjection_Util {
15
- /** Default char-budget az injektált blokkra (a hook felül tudja írni). Tömör core ~ ennyibe fér. */
16
- static DEFAULT_BUDGET_CHARS = 6000;
15
+ /**
16
+ * Default char-budget az injektált blokkra. **32000 (owner-döntés 2026-08-14: „a szabályok kritikusak").**
17
+ *
18
+ * MÉRVE: a teljes kurált készlet egy FDP-PROJEKTEN BELÜL 56 szabály / **25 179 char** (global 19 552 +
19
+ * fdp-global 2 103 + project-internal 2 779 + project-type 745). A korábbi `6000` ebből csak ~10-et engedett be,
20
+ * 36-ot kihagyva — és mivel a hosszabb szabályok chunkokra bomlottak, a kimaradás NÉMA CSONKOLÁSKÉNT jelent meg
21
+ * (`core-rule-integrity` sérülés). A 32000 a mért 25 179-re ad ~27% fejlődési tartalékot, hogy egy új szabály
22
+ * felvétele NE szorítson ki egy meglévőt. Konfigurálható: `rules.injectBudgetChars` (a hívó `budgetChars`-a nyer).
23
+ */
24
+ static DEFAULT_BUDGET_CHARS = 32000;
17
25
  /** A `globalRule:true` legacy hard-rule effektív fontossága, ha nincs explicit `importance`. */
18
26
  static LEGACY_GLOBAL_IMPORTANCE = 90;
19
27
  /** Importance-default explicit érték nélkül (közepes — a globalRule-legacy fölött, nem-jelölt alatt). */
@@ -6,6 +6,7 @@ const mongoose_1 = tslib_1.__importDefault(require("mongoose"));
6
6
  const error_codes_const_1 = require("../../../_collections/error-codes.const");
7
7
  const fam_error_factory_util_1 = require("../../../_collections/fam-error-factory.util");
8
8
  const fam_rules_data_model_1 = require("../../../_models/data-models/fam-rules.data-model");
9
+ const config_control_service_1 = require("../../../_routes/server/config/config.control-service");
9
10
  const embedding_1 = require("../../embedding");
10
11
  const fam_rule_injection_util_1 = require("../_collections/fam-rule-injection.util");
11
12
  const fam_rule_propagation_util_1 = require("../_collections/fam-rule-propagation.util");
@@ -30,8 +31,11 @@ class FAM_RuleInjection_ControlService {
30
31
  async assembleInjection(input) {
31
32
  const context = this.resolveContext(input);
32
33
  const rules = await this.loadRulesForContext(context);
34
+ // A budget feloldása: a hívó EXPLICIT `budgetChars`-a nyer (pl. egy szűkebb kontextusú hook), különben a
35
+ // `rules.injectBudgetChars` config (owner-döntés 2026-08-14: „a szabályok kritikusak" → 32000), végül a
36
+ // beépített default. Így a budget kód-változtatás NÉLKÜL hangolható, ha a szabály-készlet tovább nő.
33
37
  const assembled = fam_rule_injection_util_1.FAM_RuleInjection_Util.assemble({
34
- rules: rules, budgetChars: input.budgetChars,
38
+ rules: rules, budgetChars: input.budgetChars ?? await this.resolveBudgetChars(),
35
39
  });
36
40
  return { ...assembled, context: context };
37
41
  }
@@ -97,10 +101,39 @@ class FAM_RuleInjection_ControlService {
97
101
  });
98
102
  const merged = Array.from(byRuleId.values()).map((entry) => ({
99
103
  ...entry.rule,
100
- content: entry.parts.sort((a, b) => a.index - b.index).map((part) => part.content).join('\n'),
104
+ content: FAM_RuleInjection_ControlService.joinChunks(entry.parts.sort((a, b) => a.index - b.index).map((part) => part.content)),
101
105
  }));
102
106
  return [...merged, ...passthrough];
103
107
  }
108
+ /** A `rules.injectBudgetChars` config feloldása (hiba/hiányzó érték → a beépített default). Best-effort. */
109
+ async resolveBudgetChars() {
110
+ try {
111
+ const resolved = await config_control_service_1.FAM_Config_ControlService.getInstance().resolve('rules.injectBudgetChars');
112
+ return typeof resolved.value === 'number' && resolved.value > 0 ? resolved.value : undefined;
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ }
118
+ /**
119
+ * A chunkok összefűzése az ISMÉTELT címsor nélkül (2026-08-14). A chunkoló minden darab elejére odateszi a
120
+ * szekció-címet (kontextusnak), ezért a naiv összefűzés UGYANAZT a `# Címet` többször írná a blokkba — ez
121
+ * zavaró (töröttnek látszik) és fölöslegesen fogyasztja a budget-et. Az ELSŐ chunk címét MEGTARTJUK; a
122
+ * továbbiakból csak akkor vágjuk le a nyitó sort, ha az SZÓ SZERINT ugyanaz (különben valódi tartalom lenne).
123
+ */
124
+ static joinChunks(parts) {
125
+ if (parts.length < 2) {
126
+ return parts[0] ?? '';
127
+ }
128
+ const firstLine = (parts[0] ?? '').split(String.fromCharCode(10))[0].trim();
129
+ const rest = parts.slice(1).map((part) => {
130
+ const lines = part.split(String.fromCharCode(10));
131
+ return firstLine && lines[0]?.trim() === firstLine
132
+ ? lines.slice(1).join(String.fromCharCode(10)).replace(new RegExp('^' + String.fromCharCode(10) + '+'), '')
133
+ : part;
134
+ });
135
+ return [parts[0], ...rest].join(String.fromCharCode(10));
136
+ }
104
137
  /** Explicit felülírás > `cwd`-detekció. A `projectType`/`topics`/budget mindig az inputból. */
105
138
  resolveContext(input) {
106
139
  const detected = fam_rule_scope_context_util_1.FAM_RuleScopeContext_Util.detect(input.cwd);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fdp-agent-memory",
3
- "version": "1.1.136",
3
+ "version": "1.1.137",
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": {