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 +19 -0
- package/README.md +18 -0
- package/bin/cognitive-memory-provider.cjs +92 -0
- package/bin/cognitive-turn-lifecycle.cjs +18 -3
- package/package.json +1 -1
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:
|
|
543
|
-
agentId:
|
|
557
|
+
tenantId: resolvedTenantId,
|
|
558
|
+
agentId: resolvedAgentId,
|
|
544
559
|
runtimeId,
|
|
545
|
-
memoryAdapter,
|
|
560
|
+
memoryAdapter: resolvedMemoryAdapter,
|
|
546
561
|
now,
|
|
547
562
|
});
|
|
548
563
|
}
|