blun-king-cli 9.1.393 → 9.1.394

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/LIESMICH.txt CHANGED
@@ -326,6 +326,25 @@ Nachweisbare Arbeitsabläufe
326
326
 
327
327
  Alle Befehle funktionieren identisch mit `king`.
328
328
 
329
+ Gemeinsamer kognitiver Speicherkern (optional)
330
+ ------------------------------------------------
331
+
332
+ Ohne zusätzliche Konfiguration bleibt der bisherige lokale SQLite-Speicher
333
+ aktiv. Betreiber können einen gemeinsamen, portalneutralen Speicherkern
334
+ ausdrücklich über BLUN_COGNITIVE_MEMORY_ADAPTER_MODULE wählen. Der Wert muss
335
+ auf eine absolute, kanonische CommonJS-Datei zeigen.
336
+
337
+ Das Modul exportiert synchron createCognitiveMemoryAdapter(context) und liefert
338
+ einen Adapter mit Vertragsversion 6. Relative Pfade, symbolische Verknüpfungen,
339
+ asynchrone Fabriken und abweichende Vertragsversionen werden geschlossen
340
+ abgewiesen. Der Adapter erhält nur die Vertragsversion, das Profilverzeichnis
341
+ sowie Mandanten-, Agenten- und Anzeigenamen. Zugangsdaten werden nicht
342
+ übergeben.
343
+
344
+ Damit kann derselbe geprüfte Ereignisstrom über CLI und Portale hinweg gelesen,
345
+ korrigiert und zurückgezogen werden. Ohne den optionalen Anbieter entstehen
346
+ keine neuen Netzwerkzugriffe und keine Verhaltensänderung.
347
+
329
348
  Medienerzeugung
330
349
  ---------------
331
350
  Für Medienaufträge bleiben GenerateImage, GenerateVideo, GenerateSpeech und
package/README.md CHANGED
@@ -338,6 +338,24 @@ Version 9.1.0 enthält sieben zusätzliche, getrennt nutzbare Befehlsgruppen:
338
338
 
339
339
  Sie stehen unter `blun` und `king` identisch zur Verfügung.
340
340
 
341
+ ## Gemeinsamer kognitiver Speicherkern (optional)
342
+
343
+ Ohne zusätzliche Konfiguration bleibt der bisherige lokale SQLite-Speicher
344
+ aktiv. Betreiber können einen gemeinsamen, portalneutralen Speicherkern
345
+ ausdrücklich über `BLUN_COGNITIVE_MEMORY_ADAPTER_MODULE` wählen. Der Wert muss
346
+ auf eine absolute, kanonische CommonJS-Datei zeigen.
347
+
348
+ Das Modul exportiert synchron `createCognitiveMemoryAdapter(context)` und
349
+ liefert einen Adapter mit Vertragsversion 6. Relative Pfade, symbolische
350
+ Verknüpfungen, asynchrone Fabriken und abweichende Vertragsversionen werden
351
+ geschlossen abgewiesen. Der Adapter erhält nur die Vertragsversion, das
352
+ Profilverzeichnis sowie Mandanten-, Agenten- und Anzeigenamen. Zugangsdaten
353
+ werden nicht übergeben.
354
+
355
+ Damit kann derselbe geprüfte Ereignisstrom über CLI und Portale hinweg gelesen,
356
+ korrigiert und zurückgezogen werden. Ohne den optionalen Anbieter entstehen
357
+ keine neuen Netzwerkzugriffe und keine Verhaltensänderung.
358
+
341
359
  ## Medienerzeugung
342
360
 
343
361
  Für Medienaufträge bleiben `GenerateImage`, `GenerateVideo`, `GenerateSpeech` und
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const {
6
+ COGNITIVE_MEMORY_ADAPTER_VERSION,
7
+ assertCognitiveMemoryAdapter,
8
+ } = require('./cognitive-memory-adapter.cjs');
9
+
10
+ const PROVIDER_ENV = 'BLUN_COGNITIVE_MEMORY_ADAPTER_MODULE';
11
+ const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
12
+
13
+ function fail(code) {
14
+ const error = new Error(code);
15
+ error.code = code;
16
+ throw error;
17
+ }
18
+
19
+ function canonicalFile(input) {
20
+ const configured = String(input ?? '').trim();
21
+ if (!configured || !path.isAbsolute(configured)) fail('COGNITIVE_MEMORY_PROVIDER_PATH_INVALID');
22
+ const resolved = path.resolve(configured);
23
+ let stat;
24
+ let canonical;
25
+ try {
26
+ stat = fs.lstatSync(resolved);
27
+ canonical = fs.realpathSync(resolved);
28
+ } catch {
29
+ fail('COGNITIVE_MEMORY_PROVIDER_PATH_INVALID');
30
+ }
31
+ if (!stat.isFile() || stat.isSymbolicLink()
32
+ || path.normalize(canonical).toLowerCase() !== path.normalize(resolved).toLowerCase()) {
33
+ fail('COGNITIVE_MEMORY_PROVIDER_PATH_INVALID');
34
+ }
35
+ return canonical;
36
+ }
37
+
38
+ function boundedContext({ home, tenantId, agentId, agentName }) {
39
+ const tenant = String(tenantId ?? '').trim();
40
+ const agent = String(agentId ?? '').trim();
41
+ const name = String(agentName ?? '').trim();
42
+ let canonicalHome;
43
+ try {
44
+ const stat = fs.lstatSync(path.resolve(String(home ?? '')));
45
+ canonicalHome = fs.realpathSync(path.resolve(String(home ?? '')));
46
+ if (!stat.isDirectory() || stat.isSymbolicLink()) fail('COGNITIVE_MEMORY_PROVIDER_CONTEXT_INVALID');
47
+ } catch (error) {
48
+ if (error?.code === 'COGNITIVE_MEMORY_PROVIDER_CONTEXT_INVALID') throw error;
49
+ fail('COGNITIVE_MEMORY_PROVIDER_CONTEXT_INVALID');
50
+ }
51
+ if (!SAFE_ID_RE.test(tenant) || !SAFE_ID_RE.test(agent) || !name || name.length > 128
52
+ || /[\u0000-\u001f\u007f]/u.test(name)) {
53
+ fail('COGNITIVE_MEMORY_PROVIDER_CONTEXT_INVALID');
54
+ }
55
+ return Object.freeze({
56
+ contractVersion: COGNITIVE_MEMORY_ADAPTER_VERSION,
57
+ home: canonicalHome,
58
+ tenantId: tenant,
59
+ agentId: agent,
60
+ agentName: name,
61
+ });
62
+ }
63
+
64
+ function loadConfiguredCognitiveMemoryAdapter({
65
+ modulePath,
66
+ env = process.env,
67
+ home,
68
+ tenantId,
69
+ agentId,
70
+ agentName,
71
+ } = {}) {
72
+ const configured = modulePath === undefined ? env?.[PROVIDER_ENV] : modulePath;
73
+ if (!String(configured ?? '').trim()) return undefined;
74
+ const providerPath = canonicalFile(configured);
75
+ const provider = require(providerPath);
76
+ if (!provider || typeof provider.createCognitiveMemoryAdapter !== 'function') {
77
+ fail('COGNITIVE_MEMORY_PROVIDER_FACTORY_REQUIRED');
78
+ }
79
+ const adapter = provider.createCognitiveMemoryAdapter(boundedContext({
80
+ home,
81
+ tenantId,
82
+ agentId,
83
+ agentName,
84
+ }));
85
+ if (adapter && typeof adapter.then === 'function') fail('COGNITIVE_MEMORY_PROVIDER_ASYNC_UNSUPPORTED');
86
+ return assertCognitiveMemoryAdapter(adapter);
87
+ }
88
+
89
+ module.exports = {
90
+ PROVIDER_ENV,
91
+ loadConfiguredCognitiveMemoryAdapter,
92
+ };
@@ -4,6 +4,7 @@ const crypto = require('node:crypto');
4
4
  const fs = require('node:fs');
5
5
  const path = require('node:path');
6
6
  const { openCognitiveMemoryAdapter } = require('./cognitive-memory-adapter.cjs');
7
+ const { loadConfiguredCognitiveMemoryAdapter } = require('./cognitive-memory-provider.cjs');
7
8
  const { buildCognitiveContextProjection } = require('./cognitive-context-projection.cjs');
8
9
  const { buildCognitiveFocusProjection } = require('./cognitive-focus-projection.cjs');
9
10
  const { authorizeAttentionCandidate } = require('./cognitive-attention-runtime.cjs');
@@ -521,6 +522,7 @@ function createRuntimeCognitiveTurnLifecycle({
521
522
  agentId,
522
523
  runtimeId,
523
524
  memoryAdapter,
525
+ memoryAdapterModule,
524
526
  now,
525
527
  } = {}) {
526
528
  const resolvedHome = String(home ?? '').trim();
@@ -537,12 +539,25 @@ function createRuntimeCognitiveTurnLifecycle({
537
539
  agentId: explicitAgent || manifestIdentity?.agentId || '',
538
540
  };
539
541
  const hasSharedIdentity = Boolean(identity.tenantId && identity.agentId);
542
+ const resolvedTenantId = hasSharedIdentity
543
+ ? identity.tenantId : digestId('home', [resolvedHome.toLowerCase()]);
544
+ const resolvedAgentId = hasSharedIdentity
545
+ ? identity.agentId : digestId('agent', [resolvedAgent.toLowerCase()]);
546
+ const resolvedMemoryAdapter = memoryAdapter === undefined
547
+ ? loadConfiguredCognitiveMemoryAdapter({
548
+ modulePath: memoryAdapterModule,
549
+ home: resolvedHome,
550
+ tenantId: resolvedTenantId,
551
+ agentId: resolvedAgentId,
552
+ agentName: resolvedAgent,
553
+ })
554
+ : memoryAdapter;
540
555
  return createCognitiveTurnLifecycle({
541
556
  home: resolvedHome,
542
- tenantId: hasSharedIdentity ? identity.tenantId : digestId('home', [resolvedHome.toLowerCase()]),
543
- agentId: hasSharedIdentity ? identity.agentId : digestId('agent', [resolvedAgent.toLowerCase()]),
557
+ tenantId: resolvedTenantId,
558
+ agentId: resolvedAgentId,
544
559
  runtimeId,
545
- memoryAdapter,
560
+ memoryAdapter: resolvedMemoryAdapter,
546
561
  now,
547
562
  });
548
563
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.393",
3
+ "version": "9.1.394",
4
4
  "description": "BLUN CLI - your own AI agent with a Telegram channel. Get it done. With BLUN.",
5
5
  "license": "MIT",
6
6
  "bin": {