network-ai 5.4.4 → 5.5.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.
@@ -0,0 +1,365 @@
1
+ "use strict";
2
+ /**
3
+ * TransportAgent — SAP Basis-inspired configuration transport layer
4
+ *
5
+ * Manages the safe promotion of configuration artefacts between deployment
6
+ * environments. Enforces the AuthGuardian permission wall, drains in-flight
7
+ * agent pools before promoting, runs an optional canary window, and rolls
8
+ * back on a violation spike.
9
+ *
10
+ * State machine:
11
+ * pending → draining → promoting → canary → complete
12
+ * ↘ rolled_back
13
+ * ↘ failed (auth denied / prerequisite missing / lock conflict)
14
+ *
15
+ * Blackboard keys (written by TransportAgent only):
16
+ * transport:request:<trId> — original request (written once by submitRequest)
17
+ * transport:status:<trId> — mutable status record (updated each state change)
18
+ * transport:lock:<toEnv> — advisory lock preventing concurrent promotions
19
+ *
20
+ * @module TransportAgent
21
+ * @version 1.0.0
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.TransportAgent = void 0;
25
+ const fs_1 = require("fs");
26
+ const path_1 = require("path");
27
+ const crypto_1 = require("crypto");
28
+ // ============================================================================
29
+ // HELPERS
30
+ // ============================================================================
31
+ function sleep(ms) {
32
+ return new Promise(resolve => setTimeout(resolve, ms));
33
+ }
34
+ // ============================================================================
35
+ // TRANSPORT AGENT
36
+ // ============================================================================
37
+ /**
38
+ * SAP Basis-inspired transport agent for environment promotion.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const agent = new TransportAgent({ blackboard, envManager, authGuardian, pools });
43
+ * agent.start();
44
+ *
45
+ * // From any agent — submit a transport request:
46
+ * const trId = TransportAgent.submitRequest(blackboard, {
47
+ * fromEnv: 'dev', toEnv: 'st', reason: 'Sprint 42 config', operator: 'dev-lead',
48
+ * });
49
+ * ```
50
+ */
51
+ class TransportAgent {
52
+ _blackboard;
53
+ _envManager;
54
+ _authGuardian;
55
+ _pools;
56
+ _complianceMonitor;
57
+ _agentId;
58
+ _pollIntervalMs;
59
+ _drainTimeoutMs;
60
+ _auditLogPath;
61
+ _pollHandle = null;
62
+ _running = false;
63
+ _processing = false;
64
+ constructor(options) {
65
+ this._blackboard = options.blackboard;
66
+ this._envManager = options.envManager;
67
+ this._authGuardian = options.authGuardian;
68
+ this._pools = options.pools ?? [];
69
+ this._complianceMonitor = options.complianceMonitor;
70
+ this._agentId = options.agentId ?? 'basis:transport';
71
+ this._pollIntervalMs = options.pollIntervalMs ?? 5_000;
72
+ this._drainTimeoutMs = options.drainTimeoutMs ?? 60_000;
73
+ this._auditLogPath = options.auditLogPath ?? (0, path_1.join)(process.cwd(), 'data', 'audit_log.jsonl');
74
+ }
75
+ // --------------------------------------------------------------------------
76
+ // Public lifecycle
77
+ // --------------------------------------------------------------------------
78
+ /**
79
+ * Start the transport agent's poll loop.
80
+ * Processes pending transport requests at `pollIntervalMs` intervals.
81
+ */
82
+ start() {
83
+ if (this._running)
84
+ return;
85
+ this._running = true;
86
+ this._pollHandle = setInterval(() => {
87
+ void this._pollOnce();
88
+ }, this._pollIntervalMs);
89
+ }
90
+ /**
91
+ * Stop the poll loop.
92
+ * In-flight transports already in progress will run to completion.
93
+ */
94
+ stop() {
95
+ this._running = false;
96
+ if (this._pollHandle) {
97
+ clearInterval(this._pollHandle);
98
+ this._pollHandle = null;
99
+ }
100
+ }
101
+ /** Whether the agent is currently running. */
102
+ get isRunning() { return this._running; }
103
+ /**
104
+ * Manually execute a single transport request by ID (one-shot).
105
+ * Useful for testing and CLI invocation.
106
+ *
107
+ * @param trId - Transport request ID as returned by {@link TransportAgent.submitRequest}.
108
+ * @throws if the TR does not exist on the blackboard.
109
+ */
110
+ async execute(trId) {
111
+ const entry = this._blackboard.read(`transport:request:${trId}`);
112
+ if (!entry) {
113
+ throw new Error(`Transport request '${trId}' not found on blackboard`);
114
+ }
115
+ return this._runTransport(trId, entry.value);
116
+ }
117
+ // --------------------------------------------------------------------------
118
+ // Static helpers
119
+ // --------------------------------------------------------------------------
120
+ /**
121
+ * Submit a new transport request to the blackboard.
122
+ * Any agent may call this; only {@link TransportAgent} will execute it.
123
+ *
124
+ * @returns The generated transport request ID (`trId`).
125
+ */
126
+ static submitRequest(blackboard, request) {
127
+ if (!request.fromEnv || !request.toEnv) {
128
+ throw new Error('TransportRequest must have fromEnv and toEnv');
129
+ }
130
+ if (!request.reason) {
131
+ throw new Error('TransportRequest must have a reason');
132
+ }
133
+ const trId = `tr-${(0, crypto_1.randomUUID)()}`;
134
+ blackboard.write(`transport:request:${trId}`, request, 'basis:transport');
135
+ const status = {
136
+ trId,
137
+ status: 'pending',
138
+ fromEnv: request.fromEnv,
139
+ toEnv: request.toEnv,
140
+ reason: request.reason,
141
+ operator: request.operator,
142
+ submittedAt: new Date().toISOString(),
143
+ };
144
+ blackboard.write(`transport:status:${trId}`, status, 'basis:transport');
145
+ return trId;
146
+ }
147
+ // --------------------------------------------------------------------------
148
+ // Internal poll loop
149
+ // --------------------------------------------------------------------------
150
+ async _pollOnce() {
151
+ if (this._processing)
152
+ return;
153
+ this._processing = true;
154
+ try {
155
+ const keys = this._blackboard.listKeys().filter(k => k.startsWith('transport:request:'));
156
+ for (const key of keys) {
157
+ const trId = key.replace('transport:request:', '');
158
+ const statusEntry = this._blackboard.read(`transport:status:${trId}`);
159
+ if (!statusEntry)
160
+ continue;
161
+ if (statusEntry.value.status !== 'pending')
162
+ continue;
163
+ const requestEntry = this._blackboard.read(key);
164
+ if (!requestEntry)
165
+ continue;
166
+ await this._runTransport(trId, requestEntry.value);
167
+ }
168
+ }
169
+ finally {
170
+ this._processing = false;
171
+ }
172
+ }
173
+ // --------------------------------------------------------------------------
174
+ // Transport lifecycle
175
+ // --------------------------------------------------------------------------
176
+ async _runTransport(trId, request) {
177
+ const now = () => new Date().toISOString();
178
+ const updateStatus = (patch) => {
179
+ const existing = this._blackboard.read(`transport:status:${trId}`)?.value;
180
+ const updated = {
181
+ ...(existing ?? {
182
+ trId,
183
+ status: 'pending',
184
+ fromEnv: request.fromEnv,
185
+ toEnv: request.toEnv,
186
+ reason: request.reason,
187
+ operator: request.operator,
188
+ submittedAt: now(),
189
+ }),
190
+ ...patch,
191
+ };
192
+ this._blackboard.write(`transport:status:${trId}`, updated, this._agentId);
193
+ return updated;
194
+ };
195
+ let status = updateStatus({ startedAt: now() });
196
+ // ------------------------------------------------------------------
197
+ // 1. Prerequisite check
198
+ // ------------------------------------------------------------------
199
+ for (const prereqId of (request.prerequisites ?? [])) {
200
+ const prereqEntry = this._blackboard.read(`transport:status:${prereqId}`);
201
+ if (!prereqEntry) {
202
+ status = updateStatus({ status: 'failed', error: `Prerequisite TR '${prereqId}' not found`, completedAt: now() });
203
+ this._writeAudit('transport:prereq_failed', { trId, prereqId });
204
+ return status;
205
+ }
206
+ const prereqState = prereqEntry.value.status;
207
+ if (prereqState !== 'complete') {
208
+ status = updateStatus({ status: 'failed', error: `Prerequisite TR '${prereqId}' is in state '${prereqState}' (expected 'complete')`, completedAt: now() });
209
+ this._writeAudit('transport:prereq_failed', { trId, prereqId, prereqState });
210
+ return status;
211
+ }
212
+ }
213
+ // ------------------------------------------------------------------
214
+ // 2. Advisory lock — prevent concurrent promotions to the same env
215
+ // ------------------------------------------------------------------
216
+ const lockKey = `transport:lock:${request.toEnv}`;
217
+ const existingLock = this._blackboard.read(lockKey);
218
+ if (existingLock) {
219
+ const lockData = existingLock.value;
220
+ status = updateStatus({ status: 'failed', error: `Environment '${request.toEnv}' is locked by TR '${lockData.trId}'`, completedAt: now() });
221
+ this._writeAudit('transport:lock_conflict', { trId, lockedBy: lockData.trId, toEnv: request.toEnv });
222
+ return status;
223
+ }
224
+ this._blackboard.write(lockKey, { trId, lockedAt: now() }, this._agentId);
225
+ try {
226
+ // ----------------------------------------------------------------
227
+ // 3. Auth check
228
+ // ----------------------------------------------------------------
229
+ const grant = await this._authGuardian.requestPermission(this._agentId, 'ENVIRONMENT_PROMOTE', `Transport ${trId}: ${request.reason}`, `${request.fromEnv}→${request.toEnv}`);
230
+ if (!grant.granted) {
231
+ status = updateStatus({ status: 'failed', error: `Permission denied: ${grant.reason ?? 'AuthGuardian rejected ENVIRONMENT_PROMOTE'}`, completedAt: now() });
232
+ this._writeAudit('transport:auth_denied', { trId, reason: grant.reason });
233
+ return status;
234
+ }
235
+ // ----------------------------------------------------------------
236
+ // 4. Drain pools tagged for the destination environment
237
+ // ----------------------------------------------------------------
238
+ status = updateStatus({ status: 'draining' });
239
+ const drainedPools = this._drainPools(request.toEnv);
240
+ await this._waitForDrain(drainedPools);
241
+ // ----------------------------------------------------------------
242
+ // 5. Backup destination environment before overwriting
243
+ // ----------------------------------------------------------------
244
+ let backupId;
245
+ try {
246
+ const backupResult = this._envManager.backup(request.toEnv);
247
+ backupId = backupResult.backupId;
248
+ }
249
+ catch {
250
+ // Destination env may not exist yet — nothing to back up
251
+ }
252
+ // ----------------------------------------------------------------
253
+ // 6. Promote
254
+ // ----------------------------------------------------------------
255
+ status = updateStatus({ status: 'promoting', backupId });
256
+ let promotionResult;
257
+ try {
258
+ promotionResult = this._envManager.promote(request.fromEnv, request.toEnv, {
259
+ confirmedBy: request.operator,
260
+ approvedBy: request.operator,
261
+ });
262
+ }
263
+ catch (err) {
264
+ status = updateStatus({ status: 'failed', error: `Promote failed: ${String(err)}`, completedAt: now() });
265
+ this._writeAudit('transport:promote_failed', { trId, error: String(err) });
266
+ this._resumePools(drainedPools, 100);
267
+ return status;
268
+ }
269
+ // ----------------------------------------------------------------
270
+ // 7. Canary phase
271
+ // ----------------------------------------------------------------
272
+ const canaryWindowMs = request.canaryWindowMs ?? 30_000;
273
+ const canaryMaxViolations = request.canaryMaxViolations ?? 0;
274
+ if (canaryWindowMs > 0 && this._complianceMonitor) {
275
+ status = updateStatus({ status: 'canary', promotionResult });
276
+ this._resumePools(drainedPools, request.canaryPercent ?? 20);
277
+ const violationsBefore = this._complianceMonitor.getViolations().length;
278
+ await sleep(canaryWindowMs);
279
+ const violationsAfter = this._complianceMonitor.getViolations().length;
280
+ const violationsDelta = Math.max(0, violationsAfter - violationsBefore);
281
+ if (violationsDelta > canaryMaxViolations) {
282
+ // Canary failed — roll back
283
+ status = updateStatus({ status: 'rolled_back', violationsDetected: violationsDelta, completedAt: now() });
284
+ this._writeAudit('transport:canary_failed', { trId, violationsDelta, canaryMaxViolations });
285
+ this._resumePools(drainedPools, 100);
286
+ if (backupId) {
287
+ try {
288
+ this._envManager.restore(request.toEnv, backupId);
289
+ this._writeAudit('transport:rollback_complete', { trId, backupId, toEnv: request.toEnv });
290
+ }
291
+ catch (rollbackErr) {
292
+ this._writeAudit('transport:rollback_failed', { trId, backupId, error: String(rollbackErr) });
293
+ }
294
+ }
295
+ return status;
296
+ }
297
+ status = updateStatus({ status: 'complete', violationsDetected: violationsDelta, promotionResult, completedAt: now() });
298
+ this._resumePools(drainedPools, 100);
299
+ }
300
+ else {
301
+ // No canary — complete immediately
302
+ status = updateStatus({ status: 'complete', promotionResult, completedAt: now() });
303
+ this._resumePools(drainedPools, 100);
304
+ }
305
+ this._writeAudit('transport:complete', {
306
+ trId,
307
+ fromEnv: request.fromEnv,
308
+ toEnv: request.toEnv,
309
+ operator: request.operator ?? null,
310
+ });
311
+ return status;
312
+ }
313
+ finally {
314
+ // Always release the advisory lock regardless of outcome
315
+ this._blackboard.delete(lockKey);
316
+ }
317
+ }
318
+ // --------------------------------------------------------------------------
319
+ // Pool helpers
320
+ // --------------------------------------------------------------------------
321
+ /** Pause dispatch on all pools tagged for `env`. Returns the paused pools. */
322
+ _drainPools(env) {
323
+ const tagged = this._pools.filter(p => Array.isArray(p.template.tags) && p.template.tags.includes(env));
324
+ for (const pool of tagged) {
325
+ pool.setDispatchPause(true);
326
+ }
327
+ return tagged;
328
+ }
329
+ /** Resume dispatch on `pools` at `percent` capacity. */
330
+ _resumePools(pools, percent) {
331
+ for (const pool of pools) {
332
+ pool.setDispatchPause(false, { percent });
333
+ }
334
+ }
335
+ /**
336
+ * Wait for all actively-running agents in the given pools to finish,
337
+ * up to `_drainTimeoutMs`. Proceeds even if timeout is reached
338
+ * (pools remain paused — only newly spawned agents are blocked).
339
+ */
340
+ async _waitForDrain(pools) {
341
+ if (pools.length === 0)
342
+ return;
343
+ const deadline = Date.now() + this._drainTimeoutMs;
344
+ while (Date.now() < deadline) {
345
+ const anyActive = pools.some(p => p.active > 0);
346
+ if (!anyActive)
347
+ return;
348
+ await sleep(500);
349
+ }
350
+ }
351
+ // --------------------------------------------------------------------------
352
+ // Audit helper
353
+ // --------------------------------------------------------------------------
354
+ _writeAudit(event, details) {
355
+ try {
356
+ const entry = JSON.stringify({ timestamp: new Date().toISOString(), event, ...details });
357
+ (0, fs_1.appendFileSync)(this._auditLogPath, entry + '\n', 'utf-8');
358
+ }
359
+ catch {
360
+ // Audit log is best-effort — never interrupt a transport for logging failures
361
+ }
362
+ }
363
+ }
364
+ exports.TransportAgent = TransportAgent;
365
+ //# sourceMappingURL=transport-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-agent.js","sourceRoot":"","sources":["../../lib/transport-agent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "network-ai",
3
- "version": "5.4.4",
3
+ "version": "5.5.0",
4
4
  "description": "AI agent orchestration framework for TypeScript/Node.js - 29 adapters (LangChain, AutoGen, CrewAI, OpenAI Assistants, LlamaIndex, Semantic Kernel, Haystack, DSPy, Agno, MCP, OpenClaw, A2A, Codex, MiniMax, NemoClaw, APS, Copilot, LangGraph, Anthropic Computer Use, OpenAI Agents SDK, Vertex AI, Pydantic AI, Browser Agent, Hermes, Orchestrator, RLM + streaming variants). Built-in CLI, security, swarm intelligence, real-time streaming, and agentic workflow patterns.",
5
5
  "homepage": "https://network-ai.org",
6
6
  "main": "dist/index.js",