network-ai
Advanced tools
| /** | ||
| * Pluggable Backend API for Named Blackboards | ||
| * | ||
| * Defines the `BlackboardBackend` interface that abstracts the storage layer | ||
| * used by `SharedBlackboard`. Two built-in implementations are provided: | ||
| * | ||
| * - `FileBackend` — persisted to disk via LockedBlackboard (default) | ||
| * - `MemoryBackend` — pure in-memory, no disk writes (testing / ephemeral boards) | ||
| * | ||
| * Custom backends (Redis, CRDT, cloud storage, etc.) can be implemented by | ||
| * satisfying the `BlackboardBackend` interface and passing the instance to | ||
| * `orchestrator.getBlackboard(name, { backend: myBackend })`. | ||
| * | ||
| * @module BlackboardBackend | ||
| * @version 1.0.0 | ||
| * @license MIT | ||
| */ | ||
| import type { BlackboardEntry } from './locked-blackboard'; | ||
| export type { BlackboardEntry }; | ||
| /** | ||
| * Storage abstraction for a `SharedBlackboard` instance. | ||
| * | ||
| * Implement this interface to plug in any storage backend: | ||
| * file system, Redis, an in-memory Map, a cloud KV store, etc. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * class RedisBackend implements BlackboardBackend { | ||
| * constructor(private client: RedisClient) {} | ||
| * read(key: string) { ... } | ||
| * write(key, value, sourceAgent, ttl) { ... } | ||
| * delete(key) { ... } | ||
| * listKeys() { ... } | ||
| * getSnapshot() { ... } | ||
| * } | ||
| * const board = orchestrator.getBlackboard('prod', { backend: new RedisBackend(client) }); | ||
| * ``` | ||
| */ | ||
| export interface BlackboardBackend { | ||
| /** | ||
| * Read a single entry. Returns `null` if not found or expired. | ||
| */ | ||
| read(key: string): BlackboardEntry | null; | ||
| /** | ||
| * Write a value. Returns the stored entry including generated metadata. | ||
| * @param key The entry key | ||
| * @param value Any JSON-serializable value | ||
| * @param sourceAgent The agent performing the write | ||
| * @param ttl Optional time-to-live in seconds | ||
| */ | ||
| write(key: string, value: unknown, sourceAgent: string, ttl?: number): BlackboardEntry; | ||
| /** | ||
| * Delete an entry by key. Returns `true` if it existed. | ||
| */ | ||
| delete(key: string): boolean; | ||
| /** | ||
| * Return all non-expired keys. | ||
| */ | ||
| listKeys(): string[]; | ||
| /** | ||
| * Return a full snapshot of all non-expired entries, keyed by entry key. | ||
| */ | ||
| getSnapshot(): Record<string, BlackboardEntry>; | ||
| } | ||
| /** | ||
| * File-backed persistent storage using `LockedBlackboard`. | ||
| * | ||
| * All writes are atomic and file-locked. Data survives process restarts. | ||
| * This is the default backend used when no `backend` option is provided to | ||
| * `orchestrator.getBlackboard()`. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const board = orchestrator.getBlackboard('reports', { | ||
| * backend: new FileBackend('./data/reports'), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export declare class FileBackend implements BlackboardBackend { | ||
| private lb; | ||
| constructor(basePath: string); | ||
| read(key: string): BlackboardEntry | null; | ||
| write(key: string, value: unknown, sourceAgent: string, ttl?: number): BlackboardEntry; | ||
| delete(key: string): boolean; | ||
| listKeys(): string[]; | ||
| getSnapshot(): Record<string, BlackboardEntry>; | ||
| } | ||
| /** | ||
| * Pure in-memory backend — data lives only for the lifetime of the process. | ||
| * | ||
| * Ideal for: | ||
| * - Unit testing (no temp directories, instant, isolated) | ||
| * - Short-lived ephemeral boards | ||
| * - Read-heavy caches that don't need persistence | ||
| * | ||
| * Thread-safety note: Node.js is single-threaded; no locking is needed for | ||
| * in-process use. For multi-process scenarios use `FileBackend` or a | ||
| * distributed backend (Redis, etc.). | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const board = orchestrator.getBlackboard('ephemeral', { | ||
| * backend: new MemoryBackend(), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export declare class MemoryBackend implements BlackboardBackend { | ||
| private store; | ||
| private isExpired; | ||
| read(key: string): BlackboardEntry | null; | ||
| write(key: string, value: unknown, sourceAgent: string, ttl?: number): BlackboardEntry; | ||
| delete(key: string): boolean; | ||
| listKeys(): string[]; | ||
| getSnapshot(): Record<string, BlackboardEntry>; | ||
| /** | ||
| * Clear all entries. Useful for test teardown. | ||
| */ | ||
| clear(): void; | ||
| /** | ||
| * Returns the current entry count (including expired entries not yet evicted). | ||
| */ | ||
| size(): number; | ||
| } | ||
| //# sourceMappingURL=blackboard-backend.d.ts.map |
| {"version":3,"file":"blackboard-backend.d.ts","sourceRoot":"","sources":["../../lib/blackboard-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,YAAY,EAAE,eAAe,EAAE,CAAC;AAMhC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IAE1C;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IAEvF;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE,CAAC;IAErB;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAChD;AAMD;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,EAAE,CAAmB;gBAEjB,QAAQ,EAAE,MAAM;IAI5B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAIzC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe;IAItF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,QAAQ,IAAI,MAAM,EAAE;IAIpB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;CAG/C;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,KAAK,CAA2C;IAExD,OAAO,CAAC,SAAS;IAKjB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAMzC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe;IAetF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,QAAQ,IAAI,MAAM,EAAE;IAMpB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAU9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf"} |
| "use strict"; | ||
| /** | ||
| * Pluggable Backend API for Named Blackboards | ||
| * | ||
| * Defines the `BlackboardBackend` interface that abstracts the storage layer | ||
| * used by `SharedBlackboard`. Two built-in implementations are provided: | ||
| * | ||
| * - `FileBackend` — persisted to disk via LockedBlackboard (default) | ||
| * - `MemoryBackend` — pure in-memory, no disk writes (testing / ephemeral boards) | ||
| * | ||
| * Custom backends (Redis, CRDT, cloud storage, etc.) can be implemented by | ||
| * satisfying the `BlackboardBackend` interface and passing the instance to | ||
| * `orchestrator.getBlackboard(name, { backend: myBackend })`. | ||
| * | ||
| * @module BlackboardBackend | ||
| * @version 1.0.0 | ||
| * @license MIT | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.MemoryBackend = exports.FileBackend = void 0; | ||
| const locked_blackboard_1 = require("./locked-blackboard"); | ||
| // ============================================================================ | ||
| // FILE BACKEND (default — wraps LockedBlackboard) | ||
| // ============================================================================ | ||
| /** | ||
| * File-backed persistent storage using `LockedBlackboard`. | ||
| * | ||
| * All writes are atomic and file-locked. Data survives process restarts. | ||
| * This is the default backend used when no `backend` option is provided to | ||
| * `orchestrator.getBlackboard()`. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const board = orchestrator.getBlackboard('reports', { | ||
| * backend: new FileBackend('./data/reports'), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| class FileBackend { | ||
| lb; | ||
| constructor(basePath) { | ||
| this.lb = new locked_blackboard_1.LockedBlackboard(basePath); | ||
| } | ||
| read(key) { | ||
| return this.lb.read(key); | ||
| } | ||
| write(key, value, sourceAgent, ttl) { | ||
| return this.lb.write(key, value, sourceAgent, ttl); | ||
| } | ||
| delete(key) { | ||
| return this.lb.delete(key); | ||
| } | ||
| listKeys() { | ||
| return this.lb.listKeys(); | ||
| } | ||
| getSnapshot() { | ||
| return this.lb.getSnapshot(); | ||
| } | ||
| } | ||
| exports.FileBackend = FileBackend; | ||
| // ============================================================================ | ||
| // MEMORY BACKEND (pure in-memory, no disk) | ||
| // ============================================================================ | ||
| /** | ||
| * Pure in-memory backend — data lives only for the lifetime of the process. | ||
| * | ||
| * Ideal for: | ||
| * - Unit testing (no temp directories, instant, isolated) | ||
| * - Short-lived ephemeral boards | ||
| * - Read-heavy caches that don't need persistence | ||
| * | ||
| * Thread-safety note: Node.js is single-threaded; no locking is needed for | ||
| * in-process use. For multi-process scenarios use `FileBackend` or a | ||
| * distributed backend (Redis, etc.). | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const board = orchestrator.getBlackboard('ephemeral', { | ||
| * backend: new MemoryBackend(), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| class MemoryBackend { | ||
| store = new Map(); | ||
| isExpired(entry) { | ||
| if (!entry.ttl) | ||
| return false; | ||
| return Date.now() > new Date(entry.timestamp).getTime() + entry.ttl * 1000; | ||
| } | ||
| read(key) { | ||
| const entry = this.store.get(key); | ||
| if (!entry || this.isExpired(entry)) | ||
| return null; | ||
| return entry; | ||
| } | ||
| write(key, value, sourceAgent, ttl) { | ||
| const existing = this.store.get(key); | ||
| const version = existing ? existing.version + 1 : 1; | ||
| const entry = { | ||
| key, | ||
| value, | ||
| source_agent: sourceAgent, | ||
| timestamp: new Date().toISOString(), | ||
| ttl: ttl ?? null, | ||
| version, | ||
| }; | ||
| this.store.set(key, entry); | ||
| return entry; | ||
| } | ||
| delete(key) { | ||
| return this.store.delete(key); | ||
| } | ||
| listKeys() { | ||
| return Array.from(this.store.entries()) | ||
| .filter(([, entry]) => !this.isExpired(entry)) | ||
| .map(([key]) => key); | ||
| } | ||
| getSnapshot() { | ||
| const result = {}; | ||
| for (const [key, entry] of this.store.entries()) { | ||
| if (!this.isExpired(entry)) { | ||
| result[key] = entry; | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| /** | ||
| * Clear all entries. Useful for test teardown. | ||
| */ | ||
| clear() { | ||
| this.store.clear(); | ||
| } | ||
| /** | ||
| * Returns the current entry count (including expired entries not yet evicted). | ||
| */ | ||
| size() { | ||
| return this.store.size; | ||
| } | ||
| } | ||
| exports.MemoryBackend = MemoryBackend; | ||
| //# sourceMappingURL=blackboard-backend.js.map |
| {"version":3,"file":"blackboard-backend.js","sourceRoot":"","sources":["../../lib/blackboard-backend.ts"],"names":[],"mappings":"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"} |
+21
-1
@@ -13,2 +13,3 @@ /** | ||
| import type { ConflictResolutionStrategy, AgentPriority, LockedBlackboardOptions } from './lib/locked-blackboard'; | ||
| import type { BlackboardBackend } from './lib/blackboard-backend'; | ||
| import { QualityGateAgent } from './lib/blackboard-validator'; | ||
@@ -222,2 +223,19 @@ import type { ValidationConfig, AIReviewCallback } from './lib/blackboard-validator'; | ||
| validationConfig?: Partial<ValidationConfig>; | ||
| /** | ||
| * Pluggable storage backend for this board. | ||
| * | ||
| * - Omit (default): `FileBackend` — persisted to disk at `<workspacePath>/boards/<name>/` | ||
| * - `new MemoryBackend()`: pure in-memory, no disk writes | ||
| * - Custom class implementing `BlackboardBackend`: Redis, CRDT, cloud KV, etc. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Ephemeral board (testing / short-lived tasks) | ||
| * const board = orchestrator.getBlackboard('tmp', { backend: new MemoryBackend() }); | ||
| * | ||
| * // Custom Redis backend | ||
| * const board = orchestrator.getBlackboard('prod', { backend: new RedisBackend(client) }); | ||
| * ``` | ||
| */ | ||
| backend?: BlackboardBackend; | ||
| } | ||
@@ -290,3 +308,3 @@ /** A single task within a parallel execution batch. */ | ||
| private agentNamespaces; | ||
| constructor(basePath: string); | ||
| constructor(backendOrPath: string | BlackboardBackend); | ||
| /** | ||
@@ -658,2 +676,4 @@ * Register a verified agent identity. Only agents with registered tokens | ||
| export type { ConflictResolutionStrategy, AgentPriority, LockedBlackboardOptions }; | ||
| export { FileBackend, MemoryBackend } from './lib/blackboard-backend'; | ||
| export type { BlackboardBackend } from './lib/blackboard-backend'; | ||
| export { Logger, LogLevel } from './lib/logger'; | ||
@@ -660,0 +680,0 @@ export type { LogEntry, LogTransport, LoggerConfig } from './lib/logger'; |
@@ -273,3 +273,3 @@ "use strict"; | ||
| `; | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, 'utf-8'); | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, { encoding: 'utf-8', mode: 0o600 }); | ||
| } | ||
@@ -367,3 +367,3 @@ computeHash(content) { | ||
| `; | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, 'utf-8'); | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, { encoding: 'utf-8', mode: 0o600 }); | ||
| } | ||
@@ -382,3 +382,3 @@ finally { | ||
| const filePath = (0, path_1.join)(this.pendingDir, `${change.change_id}.json`); | ||
| (0, fs_1.writeFileSync)(filePath, JSON.stringify(change, null, 2)); | ||
| (0, fs_1.writeFileSync)(filePath, JSON.stringify(change, null, 2), { encoding: 'utf-8', mode: 0o600 }); | ||
| } | ||
@@ -394,3 +394,3 @@ archivePendingChange(change) { | ||
| if ((0, fs_1.existsSync)(sourcePath)) { | ||
| (0, fs_1.writeFileSync)(archivePath, JSON.stringify(change, null, 2)); | ||
| (0, fs_1.writeFileSync)(archivePath, JSON.stringify(change, null, 2), { encoding: 'utf-8', mode: 0o600 }); | ||
| (0, fs_1.unlinkSync)(sourcePath); | ||
@@ -756,3 +756,3 @@ } | ||
| `; | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, 'utf-8'); | ||
| (0, fs_1.writeFileSync)(this.blackboardPath, content, { encoding: 'utf-8', mode: 0o600 }); | ||
| } | ||
@@ -759,0 +759,0 @@ // ========================================================================== |
+3
-2
| { | ||
| "name": "network-ai", | ||
| "version": "3.4.1", | ||
| "version": "3.5.0", | ||
| "description": "AI agent orchestration framework for TypeScript/Node.js - plug-and-play multi-agent coordination with 12 frameworks (LangChain, AutoGen, CrewAI, OpenAI Assistants, LlamaIndex, Semantic Kernel, Haystack, DSPy, Agno, MCP, OpenClaw). Built-in security, swarm intelligence, and agentic workflow patterns.", | ||
@@ -18,3 +18,4 @@ "main": "dist/index.js", | ||
| "test:phase5": "npx ts-node test-phase5.ts", | ||
| "test:all": "npx ts-node test-standalone.ts && npx ts-node test-security.ts && npx ts-node test-adapters.ts && npx ts-node test-priority.ts && npx ts-node test-phase4.ts && npx ts-node test-phase5.ts", | ||
| "test:phase5b": "npx ts-node test-phase5b.ts", | ||
| "test:all": "npx ts-node test-standalone.ts && npx ts-node test-security.ts && npx ts-node test-adapters.ts && npx ts-node test-priority.ts && npx ts-node test-phase4.ts && npx ts-node test-phase5.ts && npx ts-node test-phase5b.ts", | ||
| "setup": "npx ts-node setup.ts", | ||
@@ -21,0 +22,0 @@ "setup:check": "npx ts-node setup.ts --check", |
+4
-2
@@ -7,3 +7,3 @@ # Network-AI: Multi-Agent Orchestration Framework | ||
| [](https://github.com/jovanSAPFIONEER/Network-AI/actions/workflows/codeql.yml) | ||
| [](https://github.com/jovanSAPFIONEER/Network-AI/releases) | ||
| [](https://github.com/jovanSAPFIONEER/Network-AI/releases) | ||
| [](https://www.npmjs.com/package/network-ai) | ||
@@ -17,3 +17,3 @@ [](https://clawhub.ai/skills/network-ai) | ||
| [](https://agentskills.io) | ||
| [](#testing) | ||
| [](#testing) | ||
| [](#adapter-system) | ||
@@ -218,2 +218,3 @@ [](https://github.com/jovanSAPFIONEER/Network-AI/releases.atom) | ||
| |-- test-phase5.ts # Phase 5 Named Multi-Blackboard tests (35 tests) | ||
| |-- test-phase5b.ts # Phase 5 Part 2 Pluggable Backend tests (55 tests) | ||
| |-- test-ai-quality.ts # AI quality gate demo | ||
@@ -300,2 +301,3 @@ |-- test.ts # Full integration test suite | ||
| npm run test:phase5 # Phase 5 Named Multi-Blackboard (35 tests) | ||
| npm run test:phase5b # Phase 5 Part 2 Pluggable Backend (55 tests) | ||
| npm run test:all # All suites in sequence | ||
@@ -302,0 +304,0 @@ ``` |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
971542
1.66%120
3.45%15087
2.05%1035
0.19%