network-ai 3.2.10 → 3.3.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,261 @@
1
+ "use strict";
2
+ /**
3
+ * Real-Time Compliance Monitor — Phase 4: Behavioral Control Plane
4
+ *
5
+ * Async monitoring loop that continuously checks for:
6
+ * - Turn-taking violations (agent acting out of turn)
7
+ * - Response timeouts (agent silent for too long)
8
+ * - Journey adherence (current FSM state timed out)
9
+ * - Tool usage anomalies (tool called more than allowed rate)
10
+ *
11
+ * @module compliance-monitor
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ComplianceMonitor = void 0;
15
+ // ============================================================================
16
+ // COMPLIANCE MONITOR
17
+ // ============================================================================
18
+ /**
19
+ * Real-time async compliance monitor.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { ComplianceMonitor } from 'network-ai';
24
+ *
25
+ * const monitor = new ComplianceMonitor({
26
+ * pollIntervalMs: 5_000,
27
+ * fsm,
28
+ * agentConfigs: [
29
+ * { agentId: 'data_analyst', responseTimeoutMs: 30_000, maxToolCallsPerWindow: 10 },
30
+ * ],
31
+ * onViolation: v => console.warn('[COMPLIANCE]', v.type, v.message),
32
+ * });
33
+ *
34
+ * monitor.start();
35
+ *
36
+ * // Record actions as agents work
37
+ * monitor.recordAction({ agentId: 'data_analyst', action: 'query', tool: 'query_db' });
38
+ *
39
+ * // Later…
40
+ * monitor.stop();
41
+ * const violations = monitor.getViolations();
42
+ * ```
43
+ */
44
+ class ComplianceMonitor {
45
+ options;
46
+ running = false;
47
+ timer = null;
48
+ // agentId -> last action timestamp
49
+ lastActionAt = new Map();
50
+ // agentId -> { tool -> timestamps[] }
51
+ toolCallLog = new Map();
52
+ // recorded turn order
53
+ turnOrder = [];
54
+ // violations collected internally
55
+ violations = [];
56
+ // agentId -> action count (for sequential turn checking)
57
+ consecutiveActionsBy = new Map();
58
+ lastActingAgent = null;
59
+ constructor(options = {}) {
60
+ this.options = {
61
+ pollIntervalMs: options.pollIntervalMs ?? 5_000,
62
+ agentConfigs: options.agentConfigs ?? [],
63
+ collectViolations: options.collectViolations ?? true,
64
+ maxViolationsInMemory: options.maxViolationsInMemory ?? 500,
65
+ fsm: options.fsm,
66
+ onViolation: options.onViolation,
67
+ };
68
+ }
69
+ // --------------------------------------------------------------------------
70
+ // Lifecycle
71
+ // --------------------------------------------------------------------------
72
+ /** Start the monitoring loop. */
73
+ start() {
74
+ if (this.running)
75
+ return;
76
+ this.running = true;
77
+ this.timer = setInterval(() => this._poll(), this.options.pollIntervalMs);
78
+ }
79
+ /** Stop the monitoring loop. */
80
+ stop() {
81
+ this.running = false;
82
+ if (this.timer !== null) {
83
+ clearInterval(this.timer);
84
+ this.timer = null;
85
+ }
86
+ }
87
+ /** Whether the monitor is currently running. */
88
+ get isRunning() {
89
+ return this.running;
90
+ }
91
+ // --------------------------------------------------------------------------
92
+ // Action recording
93
+ // --------------------------------------------------------------------------
94
+ /**
95
+ * Record an agent action. Call this every time an agent performs an action
96
+ * so the monitor can track turn-taking, timeouts, and tool rates.
97
+ */
98
+ recordAction(action) {
99
+ const now = action.timestamp ?? Date.now();
100
+ const { agentId, tool } = action;
101
+ this.lastActionAt.set(agentId, now);
102
+ // Track turn taking
103
+ if (this.lastActingAgent !== null && this.lastActingAgent !== agentId) {
104
+ this.consecutiveActionsBy.set(this.lastActingAgent, 0);
105
+ }
106
+ const prev = this.consecutiveActionsBy.get(agentId) ?? 0;
107
+ this.consecutiveActionsBy.set(agentId, prev + 1);
108
+ this.lastActingAgent = agentId;
109
+ this.turnOrder.push(agentId);
110
+ // Keep turn order bounded
111
+ if (this.turnOrder.length > 1000)
112
+ this.turnOrder.splice(0, 500);
113
+ // Track tool calls
114
+ if (tool) {
115
+ if (!this.toolCallLog.has(agentId))
116
+ this.toolCallLog.set(agentId, new Map());
117
+ const agentTools = this.toolCallLog.get(agentId);
118
+ if (!agentTools.has(tool))
119
+ agentTools.set(tool, []);
120
+ agentTools.get(tool).push(now);
121
+ }
122
+ // Immediate tool-rate check
123
+ if (tool)
124
+ this._checkToolRate(agentId, tool, now);
125
+ }
126
+ // --------------------------------------------------------------------------
127
+ // Queries
128
+ // --------------------------------------------------------------------------
129
+ /** Get all collected violations (newest last). */
130
+ getViolations(filter) {
131
+ if (!filter)
132
+ return [...this.violations];
133
+ return this.violations.filter(v => {
134
+ if (filter.type && v.type !== filter.type)
135
+ return false;
136
+ if (filter.agentId && v.agentId !== filter.agentId)
137
+ return false;
138
+ if (filter.severity && v.severity !== filter.severity)
139
+ return false;
140
+ return true;
141
+ });
142
+ }
143
+ /** Clear collected violations. */
144
+ clearViolations() {
145
+ this.violations = [];
146
+ }
147
+ /** Get a compliance summary (counts per type and agent). */
148
+ getSummary() {
149
+ const bySeverity = {};
150
+ const byType = {};
151
+ const byAgent = {};
152
+ for (const v of this.violations) {
153
+ bySeverity[v.severity] = (bySeverity[v.severity] ?? 0) + 1;
154
+ byType[v.type] = (byType[v.type] ?? 0) + 1;
155
+ byAgent[v.agentId] = (byAgent[v.agentId] ?? 0) + 1;
156
+ }
157
+ return { total: this.violations.length, bySeverity, byType, byAgent };
158
+ }
159
+ /** Update (or add) a per-agent config at runtime. */
160
+ setAgentConfig(config) {
161
+ const idx = this.options.agentConfigs.findIndex(c => c.agentId === config.agentId);
162
+ if (idx >= 0)
163
+ this.options.agentConfigs[idx] = config;
164
+ else
165
+ this.options.agentConfigs.push(config);
166
+ }
167
+ // --------------------------------------------------------------------------
168
+ // Internal polling
169
+ // --------------------------------------------------------------------------
170
+ _poll() {
171
+ this._checkResponseTimeouts();
172
+ this._checkJourneyTimeout();
173
+ this._checkTurnTaking();
174
+ }
175
+ _checkResponseTimeouts() {
176
+ const now = Date.now();
177
+ for (const cfg of this.options.agentConfigs) {
178
+ if (!cfg.responseTimeoutMs)
179
+ continue;
180
+ const lastAt = this.lastActionAt.get(cfg.agentId);
181
+ if (!lastAt)
182
+ continue;
183
+ const elapsed = now - lastAt;
184
+ if (elapsed > cfg.responseTimeoutMs) {
185
+ this._emit({
186
+ type: 'RESPONSE_TIMEOUT',
187
+ agentId: cfg.agentId,
188
+ message: `Agent "${cfg.agentId}" has been silent for ${Math.round(elapsed / 1000)}s (limit: ${Math.round(cfg.responseTimeoutMs / 1000)}s)`,
189
+ severity: 'high',
190
+ metadata: { elapsed, limit: cfg.responseTimeoutMs },
191
+ });
192
+ }
193
+ }
194
+ }
195
+ _checkJourneyTimeout() {
196
+ const fsm = this.options.fsm;
197
+ if (!fsm)
198
+ return;
199
+ if (fsm.isTimedOut) {
200
+ this._emit({
201
+ type: 'JOURNEY_TIMEOUT',
202
+ agentId: 'system',
203
+ message: `FSM state "${fsm.state}" has exceeded its timeout (${fsm.timeInCurrentState}ms elapsed)`,
204
+ severity: 'high',
205
+ metadata: { state: fsm.state, elapsed: fsm.timeInCurrentState },
206
+ });
207
+ }
208
+ }
209
+ _checkTurnTaking() {
210
+ // Detect any single agent acting more than 5 consecutive times
211
+ for (const [agentId, count] of this.consecutiveActionsBy) {
212
+ if (count >= 5) {
213
+ this._emit({
214
+ type: 'TURN_TAKING',
215
+ agentId,
216
+ message: `Agent "${agentId}" has taken ${count} consecutive actions without yielding`,
217
+ severity: 'medium',
218
+ metadata: { consecutiveCount: count },
219
+ });
220
+ // Reset after emitting so we don't spam
221
+ this.consecutiveActionsBy.set(agentId, 0);
222
+ }
223
+ }
224
+ }
225
+ _checkToolRate(agentId, tool, now) {
226
+ const cfg = this.options.agentConfigs.find(c => c.agentId === agentId);
227
+ if (!cfg?.maxToolCallsPerWindow)
228
+ return;
229
+ const windowMs = cfg.toolRateWindowMs ?? 60_000;
230
+ const maxCalls = cfg.maxToolCallsPerWindow;
231
+ const timestamps = this.toolCallLog.get(agentId)?.get(tool) ?? [];
232
+ const windowStart = now - windowMs;
233
+ const recentCalls = timestamps.filter(t => t >= windowStart);
234
+ if (recentCalls.length > maxCalls) {
235
+ this._emit({
236
+ type: 'TOOL_ABUSE',
237
+ agentId,
238
+ message: `Agent "${agentId}" called tool "${tool}" ${recentCalls.length}x in ${windowMs / 1000}s (max: ${maxCalls})`,
239
+ severity: 'high',
240
+ metadata: { tool, callCount: recentCalls.length, windowMs, max: maxCalls },
241
+ });
242
+ }
243
+ }
244
+ _emit(params) {
245
+ const violation = {
246
+ id: `cv_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
247
+ timestamp: new Date().toISOString(),
248
+ ...params,
249
+ };
250
+ if (this.options.collectViolations) {
251
+ this.violations.push(violation);
252
+ // Trim if over limit
253
+ if (this.violations.length > this.options.maxViolationsInMemory) {
254
+ this.violations.splice(0, Math.floor(this.options.maxViolationsInMemory / 4));
255
+ }
256
+ }
257
+ this.options.onViolation?.(violation);
258
+ }
259
+ }
260
+ exports.ComplianceMonitor = ComplianceMonitor;
261
+ //# sourceMappingURL=compliance-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-monitor.js","sourceRoot":"","sources":["../../lib/compliance-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * FSM Journey Layer — Phase 4: Behavioral Control Plane
3
+ *
4
+ * Implements state machine–based workflow authorization. Agents can only act
5
+ * in their designated states, and tools can only be called when the current
6
+ * workflow state permits it.
7
+ *
8
+ * @module fsm-journey
9
+ */
10
+ /** Named workflow states. Extend by passing custom string literals. */
11
+ export type WorkflowStateName = string;
12
+ /** Built-in canonical workflow states for common agent pipelines. */
13
+ export declare const WORKFLOW_STATES: {
14
+ readonly INTAKE: "INTAKE";
15
+ readonly VALIDATE: "VALIDATE";
16
+ readonly RESEARCH: "RESEARCH";
17
+ readonly PLAN: "PLAN";
18
+ readonly EXECUTE: "EXECUTE";
19
+ readonly REVIEW: "REVIEW";
20
+ readonly DELIVER: "DELIVER";
21
+ readonly COMPLETE: "COMPLETE";
22
+ readonly ERROR: "ERROR";
23
+ };
24
+ /** A single state definition in the FSM. */
25
+ export interface WorkflowStateDefinition {
26
+ /** Unique state name */
27
+ name: WorkflowStateName;
28
+ /** Human-readable description */
29
+ description?: string;
30
+ /** Agents authorised to perform actions in this state. '*' means any. */
31
+ authorizedAgents: string[];
32
+ /** Tools authorised in this state, keyed by agentId ('*' = any agent). */
33
+ authorizedTools?: Record<string, string[]>;
34
+ /** Maximum time (ms) the FSM may remain in this state before it's a violation. */
35
+ timeoutMs?: number;
36
+ }
37
+ /** A named transition between two states triggered by an event. */
38
+ export interface StateTransition {
39
+ from: WorkflowStateName;
40
+ event: string;
41
+ to: WorkflowStateName;
42
+ /** If set, only this agent (or '*') may fire this transition. */
43
+ allowedBy?: string;
44
+ }
45
+ /** Describes what happened when a state transition was attempted. */
46
+ export interface TransitionResult {
47
+ success: boolean;
48
+ previousState: WorkflowStateName;
49
+ currentState: WorkflowStateName;
50
+ reason?: string;
51
+ }
52
+ /** Result from an inline compliance check. */
53
+ export interface ComplianceCheckResult {
54
+ allowed: boolean;
55
+ reason?: string;
56
+ currentState: WorkflowStateName;
57
+ agentId: string;
58
+ tool?: string;
59
+ }
60
+ /** Options passed to JourneyFSM constructor. */
61
+ export interface JourneyFSMOptions {
62
+ states: WorkflowStateDefinition[];
63
+ transitions: StateTransition[];
64
+ initialState: WorkflowStateName;
65
+ /** Called whenever a transition fires (success or failure). */
66
+ onTransition?: (result: TransitionResult, agentId: string) => void;
67
+ /** Called whenever a compliance violation is blocked. */
68
+ onViolation?: (check: ComplianceCheckResult) => void;
69
+ }
70
+ /**
71
+ * Standalone tool authorization matrix.
72
+ *
73
+ * Maps `agentId -> state -> allowedTools[]`.
74
+ * The FSM embeds one automatically, but you can also use this independently.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const matrix = new ToolAuthorizationMatrix();
79
+ * matrix.allow('data_analyst', 'RESEARCH', ['search_web', 'query_db']);
80
+ * matrix.allow('*', 'REVIEW', ['read_blackboard']);
81
+ * matrix.isAllowed('data_analyst', 'RESEARCH', 'query_db'); // true
82
+ * ```
83
+ */
84
+ export declare class ToolAuthorizationMatrix {
85
+ private rules;
86
+ /**
87
+ * Grant an agent permission to use a list of tools in a given state.
88
+ * Use `'*'` for agentId or toolNames to mean "all".
89
+ */
90
+ allow(agentId: string, state: WorkflowStateName, tools: string[]): void;
91
+ /** Revoke a specific tool permission. */
92
+ revoke(agentId: string, state: WorkflowStateName, tool: string): void;
93
+ /**
94
+ * Check if an agent is allowed to use a tool in a given state.
95
+ * Checks exact agentId first, then falls back to '*' wildcard.
96
+ */
97
+ isAllowed(agentId: string, state: WorkflowStateName, tool: string): boolean;
98
+ private _check;
99
+ /** Dump current rules for debugging/audit. */
100
+ dump(): Record<string, Record<string, string[]>>;
101
+ }
102
+ /**
103
+ * Finite-state machine for workflow authorization.
104
+ *
105
+ * Governs which agents can act (and with which tools) based on the current
106
+ * workflow state. Integrates an inline `ComplianceMiddleware` and a
107
+ * `ToolAuthorizationMatrix`.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * import { JourneyFSM, WORKFLOW_STATES } from 'network-ai';
112
+ *
113
+ * const fsm = new JourneyFSM({
114
+ * states: [
115
+ * { name: 'INTAKE', authorizedAgents: ['orchestrator'], authorizedTools: { orchestrator: ['read_intake'] } },
116
+ * { name: 'RESEARCH', authorizedAgents: ['data_analyst'], authorizedTools: { data_analyst: ['query_db', 'search_web'] } },
117
+ * { name: 'DELIVER', authorizedAgents: ['orchestrator'], authorizedTools: { '*': ['write_blackboard'] } },
118
+ * ],
119
+ * transitions: [
120
+ * { from: 'INTAKE', event: 'start_research', to: 'RESEARCH', allowedBy: 'orchestrator' },
121
+ * { from: 'RESEARCH', event: 'research_done', to: 'DELIVER', allowedBy: '*' },
122
+ * ],
123
+ * initialState: 'INTAKE',
124
+ * });
125
+ *
126
+ * fsm.transition('start_research', 'orchestrator'); // moves to RESEARCH
127
+ * fsm.canAgentAct('data_analyst'); // true — we're now in RESEARCH
128
+ * ```
129
+ */
130
+ export declare class JourneyFSM {
131
+ private currentState;
132
+ private stateMap;
133
+ private transitions;
134
+ private options;
135
+ private stateEnteredAt;
136
+ private history;
137
+ /** Embedded tool authorization matrix (populated from state definitions). */
138
+ readonly toolMatrix: ToolAuthorizationMatrix;
139
+ constructor(options: JourneyFSMOptions);
140
+ /** Current workflow state name. */
141
+ get state(): WorkflowStateName;
142
+ /** Full definition of the current state. */
143
+ get stateDefinition(): WorkflowStateDefinition;
144
+ /** How long (ms) the FSM has been in the current state. */
145
+ get timeInCurrentState(): number;
146
+ /** Whether the current state has timed out. */
147
+ get isTimedOut(): boolean;
148
+ /** Full transition history. */
149
+ get transitionHistory(): ReadonlyArray<{
150
+ state: WorkflowStateName;
151
+ enteredAt: number;
152
+ exitedAt?: number;
153
+ triggeredBy?: string;
154
+ }>;
155
+ /**
156
+ * Check if an agent is authorized to perform any action in the current state.
157
+ */
158
+ canAgentAct(agentId: string): boolean;
159
+ /**
160
+ * Check if an agent is authorized to use a specific tool in the current state.
161
+ * Checks both the tool matrix AND agent authorization.
162
+ */
163
+ canAgentUseTool(agentId: string, tool: string): boolean;
164
+ /**
165
+ * Inline compliance check — call this BEFORE executing any agent action.
166
+ * Returns `{ allowed: true }` or `{ allowed: false, reason }`.
167
+ */
168
+ checkCompliance(agentId: string, tool?: string): ComplianceCheckResult;
169
+ /**
170
+ * Fire a named event to transition the FSM to the next state.
171
+ * Returns a `TransitionResult` describing what happened.
172
+ */
173
+ transition(event: string, agentId: string): TransitionResult;
174
+ /**
175
+ * Returns all events available from the current state.
176
+ */
177
+ availableEvents(): string[];
178
+ /**
179
+ * Returns which agents are authorized in a given state (defaults to current).
180
+ */
181
+ getAuthorizedAgents(stateName?: WorkflowStateName): string[];
182
+ /**
183
+ * Reset the FSM to its initial state.
184
+ */
185
+ reset(): void;
186
+ }
187
+ /**
188
+ * Wraps an async action and blocks its execution if the FSM denies it.
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * const middleware = new ComplianceMiddleware(fsm);
193
+ *
194
+ * const result = await middleware.enforce('data_analyst', 'query_db', async () => {
195
+ * return await db.query('SELECT * FROM invoices');
196
+ * });
197
+ * ```
198
+ */
199
+ export declare class ComplianceMiddleware {
200
+ private fsm;
201
+ constructor(fsm: JourneyFSM);
202
+ /**
203
+ * Enforce compliance before running `action`.
204
+ * Throws if not authorized; returns the action's result if allowed.
205
+ */
206
+ enforce<T>(agentId: string, tool: string, action: () => Promise<T>): Promise<T>;
207
+ /**
208
+ * Synchronous version — use when the action is not async.
209
+ */
210
+ enforceSync<T>(agentId: string, tool: string, action: () => T): T;
211
+ }
212
+ /** Thrown when ComplianceMiddleware blocks an action. */
213
+ export declare class ComplianceViolationError extends Error {
214
+ readonly check: ComplianceCheckResult;
215
+ constructor(message: string, check: ComplianceCheckResult);
216
+ }
217
+ /**
218
+ * Build a standard delivery pipeline FSM with sensible defaults.
219
+ * States: INTAKE → VALIDATE → RESEARCH → PLAN → EXECUTE → REVIEW → DELIVER → COMPLETE
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * const fsm = createDeliveryPipelineFSM({
224
+ * orchestratorId: 'orchestrator',
225
+ * researchAgentId: 'data_analyst',
226
+ * executorId: 'code_writer',
227
+ * });
228
+ * ```
229
+ */
230
+ export declare function createDeliveryPipelineFSM(options: {
231
+ orchestratorId?: string;
232
+ researchAgentId?: string;
233
+ executorId?: string;
234
+ reviewerId?: string;
235
+ onTransition?: JourneyFSMOptions['onTransition'];
236
+ onViolation?: JourneyFSMOptions['onViolation'];
237
+ }): JourneyFSM;
238
+ //# sourceMappingURL=fsm-journey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsm-journey.d.ts","sourceRoot":"","sources":["../../lib/fsm-journey.ts"],"names":[],"mappings":"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"}