network-ai 4.15.3 → 5.1.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.
- package/INTEGRATION_GUIDE.md +12 -5
- package/QUICKSTART.md +32 -5
- package/README.md +42 -17
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/custom-adapter.d.ts +1 -1
- package/dist/adapters/custom-adapter.js +1 -1
- package/dist/adapters/index.d.ts +17 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +25 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +1 -1
- package/dist/adapters/mcp-adapter.js +3 -3
- package/dist/adapters/mcp-adapter.js.map +1 -1
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +1 -1
- package/dist/adapters/openclaw-adapter.js +3 -3
- package/dist/adapters/openclaw-adapter.js.map +1 -1
- package/dist/adapters/orchestrator-adapter.d.ts +118 -0
- package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
- package/dist/adapters/orchestrator-adapter.js +219 -0
- package/dist/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/demo-control-plane.d.ts +12 -0
- package/dist/demo-control-plane.d.ts.map +1 -0
- package/dist/demo-control-plane.js +147 -0
- package/dist/demo-control-plane.js.map +1 -0
- package/dist/demo-worktree-dashboard.d.ts +2 -0
- package/dist/demo-worktree-dashboard.d.ts.map +1 -0
- package/dist/demo-worktree-dashboard.js +131 -0
- package/dist/demo-worktree-dashboard.js.map +1 -0
- package/dist/examples/01-hello-swarm.d.ts +13 -0
- package/dist/examples/01-hello-swarm.d.ts.map +1 -0
- package/dist/examples/01-hello-swarm.js +165 -0
- package/dist/examples/01-hello-swarm.js.map +1 -0
- package/dist/examples/02-fsm-pipeline.d.ts +20 -0
- package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
- package/dist/examples/02-fsm-pipeline.js +189 -0
- package/dist/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/examples/03-parallel-agents.d.ts +21 -0
- package/dist/examples/03-parallel-agents.d.ts.map +1 -0
- package/dist/examples/03-parallel-agents.js +192 -0
- package/dist/examples/03-parallel-agents.js.map +1 -0
- package/dist/examples/05-code-review-swarm.d.ts +21 -0
- package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
- package/dist/examples/05-code-review-swarm.js +1177 -0
- package/dist/examples/05-code-review-swarm.js.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/examples/07-full-showcase.d.ts +27 -0
- package/dist/examples/07-full-showcase.d.ts.map +1 -0
- package/dist/examples/07-full-showcase.js +946 -0
- package/dist/examples/07-full-showcase.js.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/examples/09-real-langchain.d.ts +19 -0
- package/dist/examples/09-real-langchain.d.ts.map +1 -0
- package/dist/examples/09-real-langchain.js +231 -0
- package/dist/examples/09-real-langchain.js.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/examples/demo-runner.d.ts +2 -0
- package/dist/examples/demo-runner.d.ts.map +1 -0
- package/dist/examples/demo-runner.js +119 -0
- package/dist/examples/demo-runner.js.map +1 -0
- package/dist/index.d.ts +113 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +310 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/control-plane.d.ts +128 -0
- package/dist/lib/control-plane.d.ts.map +1 -0
- package/dist/lib/control-plane.js +527 -0
- package/dist/lib/control-plane.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +391 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/lib/work-tree-dashboard.d.ts +130 -0
- package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
- package/dist/lib/work-tree-dashboard.js +583 -0
- package/dist/lib/work-tree-dashboard.js.map +1 -0
- package/dist/lib/work-tree-ui.d.ts +107 -0
- package/dist/lib/work-tree-ui.d.ts.map +1 -0
- package/dist/lib/work-tree-ui.js +333 -0
- package/dist/lib/work-tree-ui.js.map +1 -0
- package/dist/lib/work-tree.d.ts +184 -0
- package/dist/lib/work-tree.d.ts.map +1 -0
- package/dist/lib/work-tree.js +480 -0
- package/dist/lib/work-tree.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -4
- package/dist/security.js.map +1 -1
- package/package.json +8 -6
- package/types/agent-adapter.d.ts +5 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Universal permission wall for multi-agent systems.
|
|
4
|
+
*
|
|
5
|
+
* Evaluates permission requests using a weighted formula of justification
|
|
6
|
+
* quality (40%), agent trust level (30%), and risk score (30%).
|
|
7
|
+
* Resource types, risk profiles, trust levels, and restrictions are all
|
|
8
|
+
* configurable — works for coding, finance, DevOps, or any domain.
|
|
9
|
+
*
|
|
10
|
+
* @module AuthGuardian
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.AuthGuardian = void 0;
|
|
14
|
+
const fs_1 = require("fs");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const crypto_1 = require("crypto");
|
|
17
|
+
const security_1 = require("../security");
|
|
18
|
+
const errors_1 = require("./errors");
|
|
19
|
+
const orchestrator_types_1 = require("./orchestrator-types");
|
|
20
|
+
/**
|
|
21
|
+
* Universal permission wall for multi-agent systems.
|
|
22
|
+
*
|
|
23
|
+
* Evaluates permission requests using a weighted formula of justification
|
|
24
|
+
* quality (40%), agent trust level (30%), and risk score (30%).
|
|
25
|
+
* Resource types, risk profiles, trust levels, and restrictions are all
|
|
26
|
+
* configurable — works for coding, finance, DevOps, or any domain.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const guardian = new AuthGuardian({
|
|
31
|
+
* trustLevels: [{ agentId: 'analyst', trustLevel: 0.8 }],
|
|
32
|
+
* resourceProfiles: { CUSTOM_API: { baseRisk: 0.5, defaultRestrictions: ['audit_required'] } },
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* const grant = await guardian.requestPermission(
|
|
36
|
+
* 'analyst', 'CUSTOM_API', 'Need to fetch Q4 revenue data for report', 'read'
|
|
37
|
+
* );
|
|
38
|
+
* if (grant.granted) {
|
|
39
|
+
* // Use grant.grantToken to prove authorization
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
class AuthGuardian {
|
|
44
|
+
activeGrants = new Map();
|
|
45
|
+
agentTrustLevels = new Map();
|
|
46
|
+
agentTrustConfigs = new Map();
|
|
47
|
+
resourceProfiles = new Map();
|
|
48
|
+
auditLog = [];
|
|
49
|
+
auditLogPath;
|
|
50
|
+
trustConfigPath;
|
|
51
|
+
signingAlgorithm;
|
|
52
|
+
hmacSecret;
|
|
53
|
+
ed25519PrivateKey;
|
|
54
|
+
ed25519PublicKey;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.auditLogPath = options?.auditLogPath ?? orchestrator_types_1.CONFIG.auditLogPath;
|
|
57
|
+
this.trustConfigPath = options?.trustConfigPath ?? orchestrator_types_1.CONFIG.trustConfigPath;
|
|
58
|
+
this.signingAlgorithm = options?.algorithm ?? 'hmac-sha256';
|
|
59
|
+
if (this.signingAlgorithm === 'ed25519') {
|
|
60
|
+
const { publicKey, privateKey } = (0, crypto_1.generateKeyPairSync)('ed25519');
|
|
61
|
+
this.ed25519PrivateKey = privateKey;
|
|
62
|
+
this.ed25519PublicKey = publicKey;
|
|
63
|
+
this.hmacSecret = '';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.ed25519PrivateKey = null;
|
|
67
|
+
this.ed25519PublicKey = null;
|
|
68
|
+
this.hmacSecret = options?.hmacSecret ?? (0, crypto_1.randomUUID)();
|
|
69
|
+
}
|
|
70
|
+
// Load resource profiles (file → user-provided → defaults)
|
|
71
|
+
const fileProfiles = this.loadResourceProfilesFromDisk();
|
|
72
|
+
const profiles = { ...orchestrator_types_1.DEFAULT_RESOURCE_PROFILES, ...fileProfiles, ...(options?.resourceProfiles ?? {}) };
|
|
73
|
+
for (const [name, profile] of Object.entries(profiles)) {
|
|
74
|
+
this.resourceProfiles.set(name, profile);
|
|
75
|
+
}
|
|
76
|
+
// Load trust levels (try disk first, then user-provided, then defaults)
|
|
77
|
+
const trustConfigs = options?.trustLevels ?? this.loadTrustFromDisk() ?? orchestrator_types_1.DEFAULT_AGENT_TRUST;
|
|
78
|
+
for (const config of trustConfigs) {
|
|
79
|
+
this.agentTrustLevels.set(config.agentId, config.trustLevel);
|
|
80
|
+
this.agentTrustConfigs.set(config.agentId, config);
|
|
81
|
+
}
|
|
82
|
+
// Load existing audit log from disk
|
|
83
|
+
this.loadAuditFromDisk();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Register a new resource type at runtime.
|
|
87
|
+
* Makes the system extensible for any domain.
|
|
88
|
+
*/
|
|
89
|
+
registerResourceType(name, profile) {
|
|
90
|
+
if (!name || typeof name !== 'string' || name.trim() === '') {
|
|
91
|
+
throw new errors_1.ValidationError('resource name must be a non-empty string');
|
|
92
|
+
}
|
|
93
|
+
if (!profile || typeof profile !== 'object' || typeof profile.baseRisk !== 'number') {
|
|
94
|
+
throw new errors_1.ValidationError('profile must be an object with a numeric baseRisk');
|
|
95
|
+
}
|
|
96
|
+
if (profile.baseRisk < 0 || profile.baseRisk > 1) {
|
|
97
|
+
throw new errors_1.ValidationError('profile.baseRisk must be between 0 and 1');
|
|
98
|
+
}
|
|
99
|
+
if (!Array.isArray(profile.defaultRestrictions)) {
|
|
100
|
+
throw new errors_1.ValidationError('profile.defaultRestrictions must be an array');
|
|
101
|
+
}
|
|
102
|
+
this.resourceProfiles.set(name, profile);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Register or update an agent's trust configuration at runtime.
|
|
106
|
+
*/
|
|
107
|
+
registerAgentTrust(config) {
|
|
108
|
+
if (!config || typeof config !== 'object') {
|
|
109
|
+
throw new errors_1.ValidationError('config must be an object');
|
|
110
|
+
}
|
|
111
|
+
if (!config.agentId || typeof config.agentId !== 'string' || config.agentId.trim() === '') {
|
|
112
|
+
throw new errors_1.ValidationError('config.agentId must be a non-empty string');
|
|
113
|
+
}
|
|
114
|
+
if (typeof config.trustLevel !== 'number' || config.trustLevel < 0 || config.trustLevel > 1) {
|
|
115
|
+
throw new errors_1.ValidationError('config.trustLevel must be a number between 0 and 1');
|
|
116
|
+
}
|
|
117
|
+
this.agentTrustLevels.set(config.agentId, config.trustLevel);
|
|
118
|
+
this.agentTrustConfigs.set(config.agentId, config);
|
|
119
|
+
this.persistTrustToDisk();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Request permission to access a resource.
|
|
123
|
+
* resourceType is now a free string -- validated against registered profiles.
|
|
124
|
+
*/
|
|
125
|
+
async requestPermission(agentId, resourceType, justification, scope) {
|
|
126
|
+
if (!agentId || typeof agentId !== 'string') {
|
|
127
|
+
throw new errors_1.ValidationError('agentId must be a non-empty string');
|
|
128
|
+
}
|
|
129
|
+
if (!resourceType || typeof resourceType !== 'string') {
|
|
130
|
+
throw new errors_1.ValidationError('resourceType must be a non-empty string');
|
|
131
|
+
}
|
|
132
|
+
if (!justification || typeof justification !== 'string') {
|
|
133
|
+
throw new errors_1.ValidationError('justification must be a non-empty string');
|
|
134
|
+
}
|
|
135
|
+
// Sanitize inputs
|
|
136
|
+
let safeAgentId;
|
|
137
|
+
let safeJustification;
|
|
138
|
+
try {
|
|
139
|
+
safeAgentId = security_1.InputSanitizer.sanitizeAgentId(agentId);
|
|
140
|
+
safeJustification = security_1.InputSanitizer.sanitizeString(justification, 2000);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
safeAgentId = agentId.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 64) || 'unknown';
|
|
144
|
+
safeJustification = justification.slice(0, 2000);
|
|
145
|
+
}
|
|
146
|
+
this.log('permission_request', { agentId: safeAgentId, resourceType, justification: safeJustification, scope });
|
|
147
|
+
// Check if agent is allowed to access this resource type
|
|
148
|
+
const agentConfig = this.agentTrustConfigs.get(safeAgentId);
|
|
149
|
+
if (agentConfig && agentConfig.allowedResources && !agentConfig.allowedResources.includes('*')) {
|
|
150
|
+
if (!agentConfig.allowedResources.includes(resourceType)) {
|
|
151
|
+
this.log('permission_denied', { agentId: safeAgentId, resourceType, reason: 'resource_not_in_allowlist' });
|
|
152
|
+
return {
|
|
153
|
+
granted: false,
|
|
154
|
+
grantToken: null,
|
|
155
|
+
expiresAt: null,
|
|
156
|
+
restrictions: [],
|
|
157
|
+
reason: `Agent '${safeAgentId}' is not authorized to access '${resourceType}'. Allowed: ${agentConfig.allowedResources.join(', ')}`,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Evaluate the permission request
|
|
162
|
+
const evaluation = this.evaluateRequest(safeAgentId, resourceType, safeJustification, scope);
|
|
163
|
+
if (!evaluation.approved) {
|
|
164
|
+
this.log('permission_denied', { agentId: safeAgentId, resourceType, reason: evaluation.reason });
|
|
165
|
+
return {
|
|
166
|
+
granted: false,
|
|
167
|
+
grantToken: null,
|
|
168
|
+
expiresAt: null,
|
|
169
|
+
restrictions: [],
|
|
170
|
+
reason: evaluation.reason,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Generate grant token
|
|
174
|
+
const grantToken = this.generateGrantToken();
|
|
175
|
+
const expiresAt = new Date(Date.now() + orchestrator_types_1.CONFIG.grantTokenTTL).toISOString();
|
|
176
|
+
const grant = {
|
|
177
|
+
grantToken,
|
|
178
|
+
resourceType,
|
|
179
|
+
agentId: safeAgentId,
|
|
180
|
+
expiresAt,
|
|
181
|
+
restrictions: evaluation.restrictions,
|
|
182
|
+
scope,
|
|
183
|
+
};
|
|
184
|
+
this.activeGrants.set(grantToken, grant);
|
|
185
|
+
this.log('permission_granted', { grantToken, agentId: safeAgentId, resourceType, expiresAt, restrictions: evaluation.restrictions });
|
|
186
|
+
return {
|
|
187
|
+
granted: true,
|
|
188
|
+
grantToken,
|
|
189
|
+
expiresAt,
|
|
190
|
+
restrictions: evaluation.restrictions,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validate a grant token and return `true` if it is active and not expired.
|
|
195
|
+
*
|
|
196
|
+
* @param token - The grant token to validate
|
|
197
|
+
* @returns `true` if the token is valid, `false` otherwise
|
|
198
|
+
*/
|
|
199
|
+
validateToken(token) {
|
|
200
|
+
if (!token || typeof token !== 'string')
|
|
201
|
+
return false;
|
|
202
|
+
const grant = this.activeGrants.get(token);
|
|
203
|
+
if (!grant)
|
|
204
|
+
return false;
|
|
205
|
+
if (new Date(grant.expiresAt) < new Date()) {
|
|
206
|
+
this.activeGrants.delete(token);
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Validate a token and return the full grant object (including restrictions
|
|
213
|
+
* and scope) for point-of-use enforcement.
|
|
214
|
+
*
|
|
215
|
+
* @param token - The grant token to validate
|
|
216
|
+
* @returns The grant details, or `null` if invalid/expired
|
|
217
|
+
*/
|
|
218
|
+
validateTokenWithGrant(token) {
|
|
219
|
+
if (!token || typeof token !== 'string')
|
|
220
|
+
return null;
|
|
221
|
+
const grant = this.activeGrants.get(token);
|
|
222
|
+
if (!grant)
|
|
223
|
+
return null;
|
|
224
|
+
if (new Date(grant.expiresAt) < new Date()) {
|
|
225
|
+
this.activeGrants.delete(token);
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
return grant;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Enforce restrictions on an operation. Returns an error string if
|
|
232
|
+
* the operation violates any restriction, or `null` if all restrictions pass.
|
|
233
|
+
*
|
|
234
|
+
* @param grantToken - The grant token authorizing the operation
|
|
235
|
+
* @param operation - Description of the operation to check against restrictions
|
|
236
|
+
* @returns Error message string if a restriction is violated, or `null` if allowed
|
|
237
|
+
*/
|
|
238
|
+
enforceRestrictions(grantToken, operation) {
|
|
239
|
+
if (!grantToken || typeof grantToken !== 'string') {
|
|
240
|
+
return 'Invalid or expired grant token';
|
|
241
|
+
}
|
|
242
|
+
const grant = this.validateTokenWithGrant(grantToken);
|
|
243
|
+
if (!grant)
|
|
244
|
+
return 'Invalid or expired grant token';
|
|
245
|
+
for (const restriction of grant.restrictions) {
|
|
246
|
+
// Enforce read_only
|
|
247
|
+
if (restriction === 'read_only' && operation.type && operation.type !== 'read') {
|
|
248
|
+
return `Restriction 'read_only' violated: attempted '${operation.type}'`;
|
|
249
|
+
}
|
|
250
|
+
// Enforce max_records
|
|
251
|
+
const maxRecordsMatch = restriction.match(/^max_records:(\d+)$/);
|
|
252
|
+
if (maxRecordsMatch && operation.recordCount) {
|
|
253
|
+
const max = parseInt(maxRecordsMatch[1], 10);
|
|
254
|
+
if (operation.recordCount > max) {
|
|
255
|
+
return `Restriction '${restriction}' violated: requested ${operation.recordCount} records`;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Enforce sandbox_only
|
|
259
|
+
if (restriction === 'sandbox_only' && operation.targetPath) {
|
|
260
|
+
if (/^\/|^[A-Z]:\\(?:Windows|Program)/i.test(operation.targetPath)) {
|
|
261
|
+
return `Restriction 'sandbox_only' violated: path '${operation.targetPath}' is outside sandbox`;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Enforce no_sudo
|
|
265
|
+
if (restriction === 'no_sudo' && operation.command) {
|
|
266
|
+
if (/\bsudo\b/i.test(operation.command)) {
|
|
267
|
+
return `Restriction 'no_sudo' violated: command contains sudo`;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Enforce workspace_only
|
|
271
|
+
if (restriction === 'workspace_only' && operation.targetPath) {
|
|
272
|
+
if (/\.\.[/\\]/.test(operation.targetPath)) {
|
|
273
|
+
return `Restriction 'workspace_only' violated: path traversal detected`;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Enforce no_system_dirs
|
|
277
|
+
if (restriction === 'no_system_dirs' && operation.targetPath) {
|
|
278
|
+
if (/(?:\/etc|\/usr|\/var|\\Windows|\\System32)/i.test(operation.targetPath)) {
|
|
279
|
+
return `Restriction 'no_system_dirs' violated: system directory access`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Enforce no_attachments
|
|
283
|
+
if (restriction === 'no_attachments' && operation.hasAttachments) {
|
|
284
|
+
return `Restriction 'no_attachments' violated`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return null; // All restrictions passed
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Revoke a grant token, immediately invalidating it.
|
|
291
|
+
* Silently no-ops if the token doesn't exist.
|
|
292
|
+
*
|
|
293
|
+
* @param token - The grant token to revoke
|
|
294
|
+
*/
|
|
295
|
+
revokeToken(token) {
|
|
296
|
+
this.activeGrants.delete(token);
|
|
297
|
+
this.log('permission_revoked', { token });
|
|
298
|
+
}
|
|
299
|
+
evaluateRequest(agentId, resourceType, justification, scope) {
|
|
300
|
+
// 1. Justification Quality (40% weight) -- now includes resource-relevance
|
|
301
|
+
const justificationScore = this.scoreJustification(justification, resourceType);
|
|
302
|
+
if (justificationScore < 0.3) {
|
|
303
|
+
return {
|
|
304
|
+
approved: false,
|
|
305
|
+
reason: 'Justification is insufficient. Please provide specific task context.',
|
|
306
|
+
restrictions: [],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
// 2. Agent Trust Level (30% weight)
|
|
310
|
+
const trustLevel = this.agentTrustLevels.get(agentId) ?? 0.5;
|
|
311
|
+
if (trustLevel < 0.4) {
|
|
312
|
+
return {
|
|
313
|
+
approved: false,
|
|
314
|
+
reason: 'Agent trust level is below threshold. Escalate to human operator.',
|
|
315
|
+
restrictions: [],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// 3. Risk Assessment (30% weight)
|
|
319
|
+
const riskScore = this.assessRisk(resourceType, scope);
|
|
320
|
+
if (riskScore > 0.8) {
|
|
321
|
+
return {
|
|
322
|
+
approved: false,
|
|
323
|
+
reason: 'Risk assessment exceeds acceptable threshold. Narrow the requested scope.',
|
|
324
|
+
restrictions: [],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Get restrictions from resource profile (data-driven, not hardcoded)
|
|
328
|
+
const profile = this.resourceProfiles.get(resourceType);
|
|
329
|
+
const restrictions = profile
|
|
330
|
+
? [...profile.defaultRestrictions]
|
|
331
|
+
: ['audit_required']; // Unknown resources get audited by default
|
|
332
|
+
// Calculate weighted approval
|
|
333
|
+
const weightedScore = (justificationScore * 0.4) + (trustLevel * 0.3) + ((1 - riskScore) * 0.3);
|
|
334
|
+
const approved = weightedScore >= 0.5;
|
|
335
|
+
return {
|
|
336
|
+
approved,
|
|
337
|
+
reason: approved ? undefined : 'Combined evaluation score below threshold.',
|
|
338
|
+
restrictions,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Improved justification scoring with resource-relevance checking.
|
|
343
|
+
* Prevents trivial gaming by verifying the justification mentions
|
|
344
|
+
* concepts relevant to the requested resource.
|
|
345
|
+
*/
|
|
346
|
+
scoreJustification(justification, resourceType) {
|
|
347
|
+
let score = 0;
|
|
348
|
+
// Length scoring
|
|
349
|
+
if (justification.length > 20)
|
|
350
|
+
score += 0.15;
|
|
351
|
+
if (justification.length > 50)
|
|
352
|
+
score += 0.15;
|
|
353
|
+
// Intent keywords
|
|
354
|
+
if (/task|purpose|need|require|generate|analyze|process|build|deploy|test|review/i.test(justification))
|
|
355
|
+
score += 0.15;
|
|
356
|
+
// Specificity keywords
|
|
357
|
+
if (/specific|particular|exact|for\s+the|in\s+order\s+to|because|so\s+that/i.test(justification))
|
|
358
|
+
score += 0.15;
|
|
359
|
+
// Penalty for vague/test phrasing
|
|
360
|
+
if (/^test$|^debug$|^try$|^just\s+testing/i.test(justification.trim()))
|
|
361
|
+
score -= 0.3;
|
|
362
|
+
// Resource-relevance check: does the justification mention anything related
|
|
363
|
+
// to the requested resource? (+0.2 bonus for relevant context)
|
|
364
|
+
if (resourceType) {
|
|
365
|
+
const relevancePatterns = {
|
|
366
|
+
SAP_API: /sap|erp|invoice|procurement|purchase|material|vendor/i,
|
|
367
|
+
FINANCIAL_API: /financ|revenue|budget|accounting|payment|ledger|balance/i,
|
|
368
|
+
DATA_EXPORT: /export|report|csv|download|extract|migrate/i,
|
|
369
|
+
FILE_SYSTEM: /file|read|write|save|load|path|directory|workspace/i,
|
|
370
|
+
SHELL_EXEC: /command|script|compile|build|run|execute|terminal/i,
|
|
371
|
+
GIT: /git|commit|branch|merge|pull|push|repository|diff/i,
|
|
372
|
+
PACKAGE_MANAGER: /package|install|dependency|npm|pip|cargo|module/i,
|
|
373
|
+
BUILD_TOOL: /build|compile|webpack|tsc|make|gradle|cargo/i,
|
|
374
|
+
DOCKER: /container|docker|image|deploy|service|compose/i,
|
|
375
|
+
CLOUD_DEPLOY: /deploy|cloud|staging|production|release|infrastructure/i,
|
|
376
|
+
DATABASE: /database|query|sql|table|record|schema|migration/i,
|
|
377
|
+
EXTERNAL_SERVICE: /api|service|endpoint|webhook|request|fetch/i,
|
|
378
|
+
EMAIL: /email|mail|send|notification|alert|message/i,
|
|
379
|
+
WEBHOOK: /webhook|callback|notification|event|dispatch/i,
|
|
380
|
+
};
|
|
381
|
+
const pattern = relevancePatterns[resourceType];
|
|
382
|
+
if (pattern && pattern.test(justification)) {
|
|
383
|
+
score += 0.2;
|
|
384
|
+
}
|
|
385
|
+
else if (pattern && !pattern.test(justification)) {
|
|
386
|
+
// Justification doesn't mention anything relevant -- small penalty
|
|
387
|
+
score -= 0.1;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Bonus for mentioning a task/ticket ID
|
|
391
|
+
if (/(?:task|ticket|issue|jira|pr|bug)[_\-#]?\s*\d+/i.test(justification))
|
|
392
|
+
score += 0.1;
|
|
393
|
+
return Math.max(0, Math.min(score, 1));
|
|
394
|
+
}
|
|
395
|
+
assessRisk(resourceType, scope) {
|
|
396
|
+
// Look up base risk from registered profile (not hardcoded)
|
|
397
|
+
const profile = this.resourceProfiles.get(resourceType);
|
|
398
|
+
let risk = profile?.baseRisk ?? 0.5; // Unknown resources get medium risk
|
|
399
|
+
// Broad scopes increase risk
|
|
400
|
+
if (!scope || scope === '*' || scope === 'all') {
|
|
401
|
+
risk += 0.2;
|
|
402
|
+
}
|
|
403
|
+
// Write/delete operations increase risk
|
|
404
|
+
if (scope && /write|delete|update|modify|execute|deploy/i.test(scope)) {
|
|
405
|
+
risk += 0.2;
|
|
406
|
+
}
|
|
407
|
+
return Math.min(risk, 1);
|
|
408
|
+
}
|
|
409
|
+
generateGrantToken() {
|
|
410
|
+
const id = (0, crypto_1.randomUUID)().replace(/-/g, '');
|
|
411
|
+
const payload = `grant_${id}`;
|
|
412
|
+
if (this.signingAlgorithm === 'ed25519' && this.ed25519PrivateKey) {
|
|
413
|
+
const sig = (0, crypto_1.sign)(null, Buffer.from(payload), this.ed25519PrivateKey).toString('base64url');
|
|
414
|
+
return `${payload}.${sig}`;
|
|
415
|
+
}
|
|
416
|
+
// HMAC: append signature so tokens are tamper-evident
|
|
417
|
+
const sig = (0, crypto_1.createHmac)('sha256', this.hmacSecret).update(payload).digest('base64url');
|
|
418
|
+
return `${payload}.${sig}`;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Verify a grant token's cryptographic signature.
|
|
422
|
+
* For Ed25519 tokens, this can be done by any party holding the public key.
|
|
423
|
+
* For HMAC tokens, only the issuing AuthGuardian can verify.
|
|
424
|
+
*
|
|
425
|
+
* @param token - The grant token to verify
|
|
426
|
+
* @returns `true` if the signature is valid
|
|
427
|
+
*/
|
|
428
|
+
verifyTokenSignature(token) {
|
|
429
|
+
const dotIndex = token.lastIndexOf('.');
|
|
430
|
+
if (dotIndex === -1)
|
|
431
|
+
return false;
|
|
432
|
+
const payload = token.slice(0, dotIndex);
|
|
433
|
+
const sig = token.slice(dotIndex + 1);
|
|
434
|
+
if (this.signingAlgorithm === 'ed25519' && this.ed25519PublicKey) {
|
|
435
|
+
try {
|
|
436
|
+
return (0, crypto_1.verify)(null, Buffer.from(payload), this.ed25519PublicKey, Buffer.from(sig, 'base64url'));
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const expected = (0, crypto_1.createHmac)('sha256', this.hmacSecret).update(payload).digest('base64url');
|
|
443
|
+
// Constant-time comparison
|
|
444
|
+
if (expected.length !== sig.length)
|
|
445
|
+
return false;
|
|
446
|
+
let result = 0;
|
|
447
|
+
for (let i = 0; i < expected.length; i++) {
|
|
448
|
+
result |= expected.charCodeAt(i) ^ sig.charCodeAt(i);
|
|
449
|
+
}
|
|
450
|
+
return result === 0;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Get the signing algorithm used by this AuthGuardian instance.
|
|
454
|
+
*/
|
|
455
|
+
getSigningAlgorithm() {
|
|
456
|
+
return this.signingAlgorithm;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Export the Ed25519 public key in PEM format for third-party verification.
|
|
460
|
+
* Returns `null` if the instance uses HMAC signing.
|
|
461
|
+
*/
|
|
462
|
+
exportPublicKey() {
|
|
463
|
+
if (!this.ed25519PublicKey)
|
|
464
|
+
return null;
|
|
465
|
+
return this.ed25519PublicKey.export({ type: 'spki', format: 'pem' });
|
|
466
|
+
}
|
|
467
|
+
log(action, details) {
|
|
468
|
+
const entry = {
|
|
469
|
+
timestamp: new Date().toISOString(),
|
|
470
|
+
action,
|
|
471
|
+
details,
|
|
472
|
+
};
|
|
473
|
+
this.auditLog.push(entry);
|
|
474
|
+
// Persist to disk (non-blocking — in-memory array is the source of truth)
|
|
475
|
+
try {
|
|
476
|
+
const dir = (0, path_1.join)('.', 'data');
|
|
477
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
478
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
479
|
+
}
|
|
480
|
+
(0, fs_1.appendFile)(this.auditLogPath, JSON.stringify(entry) + '\n', () => { });
|
|
481
|
+
}
|
|
482
|
+
catch {
|
|
483
|
+
// Non-fatal -- log is also in memory
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Get all active (non-expired) permission grants.
|
|
488
|
+
* Automatically cleans up expired grants before returning.
|
|
489
|
+
*/
|
|
490
|
+
getActiveGrants() {
|
|
491
|
+
// Clean expired grants
|
|
492
|
+
const now = new Date();
|
|
493
|
+
for (const [token, grant] of this.activeGrants.entries()) {
|
|
494
|
+
if (new Date(grant.expiresAt) < now) {
|
|
495
|
+
this.activeGrants.delete(token);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return Array.from(this.activeGrants.values());
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Get the full audit log of permission decisions.
|
|
502
|
+
* Returns a defensive copy.
|
|
503
|
+
*/
|
|
504
|
+
getAuditLog() {
|
|
505
|
+
return [...this.auditLog];
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Get all registered resource profiles.
|
|
509
|
+
*/
|
|
510
|
+
getResourceProfiles() {
|
|
511
|
+
return Object.fromEntries(this.resourceProfiles);
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Get the allowed namespaces for an agent (used by blackboard scoping).
|
|
515
|
+
*/
|
|
516
|
+
getAgentNamespaces(agentId) {
|
|
517
|
+
if (!agentId || typeof agentId !== 'string')
|
|
518
|
+
return ['task:'];
|
|
519
|
+
const config = this.agentTrustConfigs.get(agentId);
|
|
520
|
+
return config?.allowedNamespaces ?? ['task:'];
|
|
521
|
+
}
|
|
522
|
+
// ---- Persistence helpers ----
|
|
523
|
+
/** Path for the resource profiles policy file. */
|
|
524
|
+
get resourceProfilesPath() {
|
|
525
|
+
return (0, path_1.join)('.', 'data', 'resource-profiles.json');
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Load resource profiles from `data/resource-profiles.json` if it exists.
|
|
529
|
+
* Expected format: `{ "PROFILE_NAME": { baseRisk, defaultRestrictions, description? } }`
|
|
530
|
+
*/
|
|
531
|
+
loadResourceProfilesFromDisk() {
|
|
532
|
+
try {
|
|
533
|
+
if ((0, fs_1.existsSync)(this.resourceProfilesPath)) {
|
|
534
|
+
const raw = (0, fs_1.readFileSync)(this.resourceProfilesPath, 'utf-8');
|
|
535
|
+
const parsed = JSON.parse(raw);
|
|
536
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
537
|
+
return parsed;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
catch { /* ignore — fall back to defaults */ }
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Persist the current resource profiles to `data/resource-profiles.json`.
|
|
546
|
+
* Useful after calling registerResourceType() at runtime.
|
|
547
|
+
*/
|
|
548
|
+
persistResourceProfiles() {
|
|
549
|
+
try {
|
|
550
|
+
const dir = (0, path_1.join)('.', 'data');
|
|
551
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
552
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
553
|
+
}
|
|
554
|
+
const profiles = {};
|
|
555
|
+
for (const [name, profile] of this.resourceProfiles) {
|
|
556
|
+
profiles[name] = profile;
|
|
557
|
+
}
|
|
558
|
+
(0, fs_1.writeFile)(this.resourceProfilesPath, JSON.stringify(profiles, null, 2), () => { });
|
|
559
|
+
}
|
|
560
|
+
catch {
|
|
561
|
+
// Non-fatal
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
loadTrustFromDisk() {
|
|
565
|
+
try {
|
|
566
|
+
if ((0, fs_1.existsSync)(this.trustConfigPath)) {
|
|
567
|
+
const raw = (0, fs_1.readFileSync)(this.trustConfigPath, 'utf-8');
|
|
568
|
+
return JSON.parse(raw);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
catch { /* ignore */ }
|
|
572
|
+
return null;
|
|
573
|
+
}
|
|
574
|
+
persistTrustToDisk() {
|
|
575
|
+
try {
|
|
576
|
+
const dir = (0, path_1.join)('.', 'data');
|
|
577
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
578
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
579
|
+
}
|
|
580
|
+
const configs = Array.from(this.agentTrustConfigs.values());
|
|
581
|
+
(0, fs_1.writeFile)(this.trustConfigPath, JSON.stringify(configs, null, 2), () => { });
|
|
582
|
+
}
|
|
583
|
+
catch {
|
|
584
|
+
// Non-fatal
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
loadAuditFromDisk() {
|
|
588
|
+
try {
|
|
589
|
+
if ((0, fs_1.existsSync)(this.auditLogPath)) {
|
|
590
|
+
const raw = (0, fs_1.readFileSync)(this.auditLogPath, 'utf-8');
|
|
591
|
+
const lines = raw.trim().split('\n').filter(l => l);
|
|
592
|
+
for (const line of lines) {
|
|
593
|
+
try {
|
|
594
|
+
this.auditLog.push(JSON.parse(line));
|
|
595
|
+
}
|
|
596
|
+
catch { /* skip malformed */ }
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
catch { /* ignore */ }
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
exports.AuthGuardian = AuthGuardian;
|
|
604
|
+
//# sourceMappingURL=auth-guardian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-guardian.js","sourceRoot":"","sources":["../../lib/auth-guardian.ts"],"names":[],"mappings":"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"}
|