@acr-js/meta-mcp 0.8.2
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/README.md +212 -0
- package/dist/apps/cli/src/index.d.ts +3 -0
- package/dist/apps/cli/src/index.d.ts.map +1 -0
- package/dist/apps/cli/src/index.js +326 -0
- package/dist/apps/cli/src/index.js.map +1 -0
- package/dist/apps/control-plane-api/src/audit.d.ts +20 -0
- package/dist/apps/control-plane-api/src/audit.d.ts.map +1 -0
- package/dist/apps/control-plane-api/src/audit.js +26 -0
- package/dist/apps/control-plane-api/src/audit.js.map +1 -0
- package/dist/apps/control-plane-api/src/index.d.ts +2 -0
- package/dist/apps/control-plane-api/src/index.d.ts.map +1 -0
- package/dist/apps/control-plane-api/src/index.js +20 -0
- package/dist/apps/control-plane-api/src/index.js.map +1 -0
- package/dist/apps/control-plane-api/src/server.d.ts +17 -0
- package/dist/apps/control-plane-api/src/server.d.ts.map +1 -0
- package/dist/apps/control-plane-api/src/server.js +268 -0
- package/dist/apps/control-plane-api/src/server.js.map +1 -0
- package/dist/apps/control-plane-api/src/service.d.ts +63 -0
- package/dist/apps/control-plane-api/src/service.d.ts.map +1 -0
- package/dist/apps/control-plane-api/src/service.js +298 -0
- package/dist/apps/control-plane-api/src/service.js.map +1 -0
- package/dist/apps/control-plane-api/test/api.test.d.ts +2 -0
- package/dist/apps/control-plane-api/test/api.test.d.ts.map +1 -0
- package/dist/apps/control-plane-api/test/api.test.js +130 -0
- package/dist/apps/control-plane-api/test/api.test.js.map +1 -0
- package/dist/apps/control-plane-api/test/context7-e2e.test.d.ts +2 -0
- package/dist/apps/control-plane-api/test/context7-e2e.test.d.ts.map +1 -0
- package/dist/apps/control-plane-api/test/context7-e2e.test.js +166 -0
- package/dist/apps/control-plane-api/test/context7-e2e.test.js.map +1 -0
- package/dist/packages/auth-vault/src/crypto.d.ts +25 -0
- package/dist/packages/auth-vault/src/crypto.d.ts.map +1 -0
- package/dist/packages/auth-vault/src/crypto.js +117 -0
- package/dist/packages/auth-vault/src/crypto.js.map +1 -0
- package/dist/packages/auth-vault/src/db.d.ts +33 -0
- package/dist/packages/auth-vault/src/db.d.ts.map +1 -0
- package/dist/packages/auth-vault/src/db.js +154 -0
- package/dist/packages/auth-vault/src/db.js.map +1 -0
- package/dist/packages/auth-vault/src/index.d.ts +5 -0
- package/dist/packages/auth-vault/src/index.d.ts.map +1 -0
- package/dist/packages/auth-vault/src/index.js +5 -0
- package/dist/packages/auth-vault/src/index.js.map +1 -0
- package/dist/packages/auth-vault/src/types.d.ts +48 -0
- package/dist/packages/auth-vault/src/types.d.ts.map +1 -0
- package/dist/packages/auth-vault/src/types.js +2 -0
- package/dist/packages/auth-vault/src/types.js.map +1 -0
- package/dist/packages/auth-vault/src/vault.d.ts +21 -0
- package/dist/packages/auth-vault/src/vault.d.ts.map +1 -0
- package/dist/packages/auth-vault/src/vault.js +88 -0
- package/dist/packages/auth-vault/src/vault.js.map +1 -0
- package/dist/packages/auth-vault/test/vault.test.d.ts +2 -0
- package/dist/packages/auth-vault/test/vault.test.d.ts.map +1 -0
- package/dist/packages/auth-vault/test/vault.test.js +89 -0
- package/dist/packages/auth-vault/test/vault.test.js.map +1 -0
- package/dist/packages/catalog-projector/src/index.d.ts +3 -0
- package/dist/packages/catalog-projector/src/index.d.ts.map +1 -0
- package/dist/packages/catalog-projector/src/index.js +3 -0
- package/dist/packages/catalog-projector/src/index.js.map +1 -0
- package/dist/packages/catalog-projector/src/projector.d.ts +28 -0
- package/dist/packages/catalog-projector/src/projector.d.ts.map +1 -0
- package/dist/packages/catalog-projector/src/projector.js +85 -0
- package/dist/packages/catalog-projector/src/projector.js.map +1 -0
- package/dist/packages/catalog-projector/src/types.d.ts +33 -0
- package/dist/packages/catalog-projector/src/types.d.ts.map +1 -0
- package/dist/packages/catalog-projector/src/types.js +2 -0
- package/dist/packages/catalog-projector/src/types.js.map +1 -0
- package/dist/packages/catalog-projector/test/catalog.test.d.ts +2 -0
- package/dist/packages/catalog-projector/test/catalog.test.d.ts.map +1 -0
- package/dist/packages/catalog-projector/test/catalog.test.js +41 -0
- package/dist/packages/catalog-projector/test/catalog.test.js.map +1 -0
- package/dist/packages/config-parser/src/index.d.ts +5 -0
- package/dist/packages/config-parser/src/index.d.ts.map +1 -0
- package/dist/packages/config-parser/src/index.js +5 -0
- package/dist/packages/config-parser/src/index.js.map +1 -0
- package/dist/packages/config-parser/src/manifest.d.ts +3 -0
- package/dist/packages/config-parser/src/manifest.d.ts.map +1 -0
- package/dist/packages/config-parser/src/manifest.js +33 -0
- package/dist/packages/config-parser/src/manifest.js.map +1 -0
- package/dist/packages/config-parser/src/parser.d.ts +9 -0
- package/dist/packages/config-parser/src/parser.d.ts.map +1 -0
- package/dist/packages/config-parser/src/parser.js +69 -0
- package/dist/packages/config-parser/src/parser.js.map +1 -0
- package/dist/packages/config-parser/src/sanitizer.d.ts +7 -0
- package/dist/packages/config-parser/src/sanitizer.d.ts.map +1 -0
- package/dist/packages/config-parser/src/sanitizer.js +40 -0
- package/dist/packages/config-parser/src/sanitizer.js.map +1 -0
- package/dist/packages/config-parser/src/types.d.ts +47 -0
- package/dist/packages/config-parser/src/types.d.ts.map +1 -0
- package/dist/packages/config-parser/src/types.js +2 -0
- package/dist/packages/config-parser/src/types.js.map +1 -0
- package/dist/packages/config-parser/test/parser.test.d.ts +2 -0
- package/dist/packages/config-parser/test/parser.test.d.ts.map +1 -0
- package/dist/packages/config-parser/test/parser.test.js +35 -0
- package/dist/packages/config-parser/test/parser.test.js.map +1 -0
- package/dist/packages/policy-engine/src/engine.d.ts +12 -0
- package/dist/packages/policy-engine/src/engine.d.ts.map +1 -0
- package/dist/packages/policy-engine/src/engine.js +127 -0
- package/dist/packages/policy-engine/src/engine.js.map +1 -0
- package/dist/packages/policy-engine/src/index.d.ts +3 -0
- package/dist/packages/policy-engine/src/index.d.ts.map +1 -0
- package/dist/packages/policy-engine/src/index.js +3 -0
- package/dist/packages/policy-engine/src/index.js.map +1 -0
- package/dist/packages/policy-engine/src/types.d.ts +33 -0
- package/dist/packages/policy-engine/src/types.d.ts.map +1 -0
- package/dist/packages/policy-engine/src/types.js +2 -0
- package/dist/packages/policy-engine/src/types.js.map +1 -0
- package/dist/packages/policy-engine/test/policy.test.d.ts +2 -0
- package/dist/packages/policy-engine/test/policy.test.d.ts.map +1 -0
- package/dist/packages/policy-engine/test/policy.test.js +48 -0
- package/dist/packages/policy-engine/test/policy.test.js.map +1 -0
- package/dist/packages/registry-core/src/index.d.ts +3 -0
- package/dist/packages/registry-core/src/index.d.ts.map +1 -0
- package/dist/packages/registry-core/src/index.js +3 -0
- package/dist/packages/registry-core/src/index.js.map +1 -0
- package/dist/packages/registry-core/src/registry.d.ts +20 -0
- package/dist/packages/registry-core/src/registry.d.ts.map +1 -0
- package/dist/packages/registry-core/src/registry.js +65 -0
- package/dist/packages/registry-core/src/registry.js.map +1 -0
- package/dist/packages/registry-core/src/types.d.ts +26 -0
- package/dist/packages/registry-core/src/types.d.ts.map +1 -0
- package/dist/packages/registry-core/src/types.js +2 -0
- package/dist/packages/registry-core/src/types.js.map +1 -0
- package/dist/packages/registry-core/test/registry.test.d.ts +2 -0
- package/dist/packages/registry-core/test/registry.test.d.ts.map +1 -0
- package/dist/packages/registry-core/test/registry.test.js +25 -0
- package/dist/packages/registry-core/test/registry.test.js.map +1 -0
- package/dist/packages/sandbox-runtime/src/executor.d.ts +13 -0
- package/dist/packages/sandbox-runtime/src/executor.d.ts.map +1 -0
- package/dist/packages/sandbox-runtime/src/executor.js +84 -0
- package/dist/packages/sandbox-runtime/src/executor.js.map +1 -0
- package/dist/packages/sandbox-runtime/src/index.d.ts +4 -0
- package/dist/packages/sandbox-runtime/src/index.d.ts.map +1 -0
- package/dist/packages/sandbox-runtime/src/index.js +4 -0
- package/dist/packages/sandbox-runtime/src/index.js.map +1 -0
- package/dist/packages/sandbox-runtime/src/profiles.d.ts +4 -0
- package/dist/packages/sandbox-runtime/src/profiles.d.ts.map +1 -0
- package/dist/packages/sandbox-runtime/src/profiles.js +66 -0
- package/dist/packages/sandbox-runtime/src/profiles.js.map +1 -0
- package/dist/packages/sandbox-runtime/src/types.d.ts +24 -0
- package/dist/packages/sandbox-runtime/src/types.d.ts.map +1 -0
- package/dist/packages/sandbox-runtime/src/types.js +2 -0
- package/dist/packages/sandbox-runtime/src/types.js.map +1 -0
- package/dist/packages/sandbox-runtime/test/sandbox.test.d.ts +2 -0
- package/dist/packages/sandbox-runtime/test/sandbox.test.d.ts.map +1 -0
- package/dist/packages/sandbox-runtime/test/sandbox.test.js +30 -0
- package/dist/packages/sandbox-runtime/test/sandbox.test.js.map +1 -0
- package/dist/packages/transport-bridge/src/bridge.d.ts +30 -0
- package/dist/packages/transport-bridge/src/bridge.d.ts.map +1 -0
- package/dist/packages/transport-bridge/src/bridge.js +60 -0
- package/dist/packages/transport-bridge/src/bridge.js.map +1 -0
- package/dist/packages/transport-bridge/src/http-adapter.d.ts +30 -0
- package/dist/packages/transport-bridge/src/http-adapter.d.ts.map +1 -0
- package/dist/packages/transport-bridge/src/http-adapter.js +61 -0
- package/dist/packages/transport-bridge/src/http-adapter.js.map +1 -0
- package/dist/packages/transport-bridge/src/index.d.ts +5 -0
- package/dist/packages/transport-bridge/src/index.d.ts.map +1 -0
- package/dist/packages/transport-bridge/src/index.js +5 -0
- package/dist/packages/transport-bridge/src/index.js.map +1 -0
- package/dist/packages/transport-bridge/src/stdio-adapter.d.ts +36 -0
- package/dist/packages/transport-bridge/src/stdio-adapter.d.ts.map +1 -0
- package/dist/packages/transport-bridge/src/stdio-adapter.js +100 -0
- package/dist/packages/transport-bridge/src/stdio-adapter.js.map +1 -0
- package/dist/packages/transport-bridge/src/types.d.ts +35 -0
- package/dist/packages/transport-bridge/src/types.d.ts.map +1 -0
- package/dist/packages/transport-bridge/src/types.js +2 -0
- package/dist/packages/transport-bridge/src/types.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# ACR Meta-MCP Forward Proxy & Governance Control Plane
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
4
|
+
[](https://www.npmjs.com/org/acr-js)
|
|
5
|
+
[]()
|
|
6
|
+
[]()
|
|
7
|
+
|
|
8
|
+
The **ACR Meta-MCP Forward Proxy** is an enterprise-grade Model Context Protocol (MCP) reverse and forward proxy, sandbox runtime, and dual-consent governance engine. It implements the dual-layer MCP architecture for the Agentic Chat Rooms (ACR) ecosystem: a **native/master MCP layer** for internal platform orchestration and a **governed Meta-MCP fabric** for proxying, sandboxing, credential vaulting, and policy-controlling third-party MCP servers (stdio, SSE, Streamable HTTP).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Architecture Overview
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
┌────────────────────────────────────────────────────────┐
|
|
16
|
+
│ ACR Native / Master Layer │
|
|
17
|
+
│ (Agent Trust Ledger, JetStream Bus, DIDs) │
|
|
18
|
+
└───────────────────────────┬────────────────────────────┘
|
|
19
|
+
│ Dual-Consent Gate
|
|
20
|
+
┌─────────────────────────────────────────────────────▼─────────────────────────────────────────────────────┐
|
|
21
|
+
│ ACR Meta-MCP Forward Proxy (Port 20445) │
|
|
22
|
+
│ │
|
|
23
|
+
│ ┌───────────────────────┐ ┌────────────────────────┐ ┌────────────────────────────────────────────┐ │
|
|
24
|
+
│ │ Config Ingestion │ │ Policy Engine │ │ Auth Vault (SQLite3MultipleCiphers) │ │
|
|
25
|
+
│ │ • Schema Validation │ │ • Role & Room Scoping │ │ • AES-256-GCM / ChaCha20-Poly1305 / CBC │ │
|
|
26
|
+
│ │ • Secret Redaction │ │ • Quarantine Control │ │ • PBKDF2-HMAC-SHA512 (256,000 iters) │ │
|
|
27
|
+
│ │ • SHA-256 Fingerprint │ │ • Escalation Hooks │ │ • Multi-Domain Isolation (Personal/Org) │ │
|
|
28
|
+
│ └───────────┬───────────┘ └───────────┬────────────┘ └─────────────────────┬──────────────────────┘ │
|
|
29
|
+
│ │ │ │ │
|
|
30
|
+
│ └───────────────────────────┼──────────────────────────────────────┘ │
|
|
31
|
+
│ │ │
|
|
32
|
+
│ ┌─────────────────▼──────────────────┐ │
|
|
33
|
+
│ │ 3-Tier Catalog Projector │ │
|
|
34
|
+
│ │ Raw -> Policy -> Projected View │ │
|
|
35
|
+
│ └─────────────────┬──────────────────┘ │
|
|
36
|
+
│ │ │
|
|
37
|
+
│ ┌───────────────────────────────────────▼─────────────────────────────────────────────────────────────┐ │
|
|
38
|
+
│ │ Transport Bridge & Sandbox Execution │ │
|
|
39
|
+
│ │ • Stdio Child Process (ToolHive Sandbox: no-network | egress-allowlist | workspace-scoped) │ │
|
|
40
|
+
│ │ • Streamable HTTP JSON-RPC 2.0 Endpoint (POST /mcp) │ │
|
|
41
|
+
│ │ • Server-Sent Events (SSE) Multiplexed Tunneling │ │
|
|
42
|
+
│ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
|
|
43
|
+
└───────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Key Modules & Capabilities
|
|
49
|
+
|
|
50
|
+
### 1. Config Ingestion (`packages/config-parser`)
|
|
51
|
+
- Ingests standard `mcp_config.json` containing stdio (`command`/`args`/`env`) and remote (`url`/`headers`) server definitions.
|
|
52
|
+
- Automatically redacts inline credentials and tokens into deterministic reference placeholders (`sec_ref_<server>_<key>`).
|
|
53
|
+
- Generates canonical SHA-256 fingerprints for immutable `InstallManifest` versioning.
|
|
54
|
+
|
|
55
|
+
### 2. Multi-Cipher Auth Vault (`packages/auth-vault`)
|
|
56
|
+
- Fuses the cryptographic designs of **`utelle/SQLite3MultipleCiphers`** and **`sqlcipher/sqlcipher`**.
|
|
57
|
+
- Encrypted at rest (`vault.db`) with 64-byte authenticated magic header `ACR_MCDB_V1`.
|
|
58
|
+
- **Supported Ciphers**:
|
|
59
|
+
- `aes-256-gcm` (NIST SP 800-38D AEAD)
|
|
60
|
+
- `chacha20-poly1305` (RFC 8439 AEAD)
|
|
61
|
+
- `sqlcipher-v4` (AES-256-CBC + HMAC-SHA512 per record)
|
|
62
|
+
- **Key Derivation**: PBKDF2-HMAC-SHA512 (256,000 iterations default) with per-database random salts.
|
|
63
|
+
- **Domain Boundaries**: `personal`, `org`, `enterprise`, `ephemeral`.
|
|
64
|
+
- **Master Passphrase Rotation**: Atomic re-encryption of all database records.
|
|
65
|
+
|
|
66
|
+
### 3. ToolHive-Inspired Sandbox Containment (`packages/sandbox-runtime`)
|
|
67
|
+
- Isolates untrusted stdio processes using 4 containment profiles:
|
|
68
|
+
- `no-network`: Prohibits external network calls; scrubs proxy settings.
|
|
69
|
+
- `egress-allowlist`: Allows outbound HTTP/HTTPS exclusively to verified endpoints (e.g. `api.github.com`, `gitee.com`).
|
|
70
|
+
- `filesystem-readonly`: Blocks write operations outside ephemeral runtime `/tmp`.
|
|
71
|
+
- `workspace-scoped`: Restricts disk access strictly to designated project directories.
|
|
72
|
+
- Host environment variable sanitization and execution timeout bounds.
|
|
73
|
+
|
|
74
|
+
### 4. Dual-Consent Policy Engine (`packages/policy-engine`)
|
|
75
|
+
- Enforces access control at both the Master Layer and Meta-MCP Proxy Layer.
|
|
76
|
+
- Scopes tool accessibility by caller role (`admin`, `agent`, `human_operator`, `guest`) and active room deliberation context.
|
|
77
|
+
- Instant server quarantine mechanism (`toggleQuarantine`).
|
|
78
|
+
- Human operator confirmation hooks (`REQUIRE_HUMAN_CONFIRMATION`).
|
|
79
|
+
|
|
80
|
+
### 5. 3-Tier Catalog Projector (`packages/catalog-projector`)
|
|
81
|
+
- **Raw Catalog**: All tools discovered from downstream servers with prefix namespacing (`${serverId}__${toolName}`).
|
|
82
|
+
- **Policy Catalog**: Tools that pass server health, non-quarantine, and policy permission checks.
|
|
83
|
+
- **Projected Catalog**: Persona-filtered tool view tailored to the requesting agent DID and permissions.
|
|
84
|
+
|
|
85
|
+
### 6. Control Plane API & Streamable Gateway (`apps/control-plane-api`)
|
|
86
|
+
- Native HTTP daemon running on port `20445`.
|
|
87
|
+
- Private Network Access (PNA) and CORS compliant (`Access-Control-Allow-Private-Network: true`).
|
|
88
|
+
- Streamable HTTP JSON-RPC 2.0 gateway at `POST /mcp`.
|
|
89
|
+
- Replay audit logging with sub-millisecond precision.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Environment Variables
|
|
94
|
+
|
|
95
|
+
| Variable | Default | Description |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `ACR_META_MCP_PORT` | `20445` | HTTP listen port for Control Plane and MCP Gateway |
|
|
98
|
+
| `ACR_META_MCP_HOST` | `0.0.0.0` | Listen host interface |
|
|
99
|
+
| `ACR_VAULT_PATH` | (in-memory) | File path to encrypted MultipleCiphers database (`vault.db`) |
|
|
100
|
+
| `ACR_VAULT_SECRET` | (generated) | Master encryption secret for Auth Vault |
|
|
101
|
+
| `CONTEXT7_API_KEY` | (optional) | Dynamic API key for Context7 real-time library docs MCP |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## REST API Reference
|
|
106
|
+
|
|
107
|
+
| Method | Endpoint | Description |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `GET` | `/health` | Daemon status, version, server count, uptime |
|
|
110
|
+
| `GET` | `/api/v1/meta-mcp/servers` | List registered downstream MCP servers |
|
|
111
|
+
| `POST` | `/api/v1/meta-mcp/servers/import` | Import and compile standard `mcp_config.json` |
|
|
112
|
+
| `POST` | `/api/v1/meta-mcp/servers/:id/toggle` | Enable or disable a registered server |
|
|
113
|
+
| `POST` | `/api/v1/meta-mcp/servers/:id/quarantine` | Toggle quarantine status for a server |
|
|
114
|
+
| `GET` | `/api/v1/meta-mcp/tools` | Query tool catalog (`?view=raw\|policy\|projected`) |
|
|
115
|
+
| `POST` | `/api/v1/meta-mcp/tools/call` | Invoke a governed tool execution |
|
|
116
|
+
| `GET` | `/api/v1/meta-mcp/vault/secrets` | List vaulted secret refs with domain & cipher info |
|
|
117
|
+
| `POST` | `/api/v1/meta-mcp/vault/secrets` | Store an encrypted secret in the MultipleCiphers DB |
|
|
118
|
+
| `DELETE` | `/api/v1/meta-mcp/vault/secrets/:refId` | Purge a secret from the encrypted DB |
|
|
119
|
+
| `POST` | `/api/v1/meta-mcp/vault/rotate` | Rotate master passphrase & re-encrypt DB |
|
|
120
|
+
| `GET` | `/api/v1/meta-mcp/audit` | Replay cryptographic audit trail logs |
|
|
121
|
+
| `POST` | `/mcp` | Streamable HTTP JSON-RPC 2.0 MCP Gateway |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## CLI Usage
|
|
126
|
+
|
|
127
|
+
### Standalone Node CLI (`@acr-js/meta-mcp`)
|
|
128
|
+
```bash
|
|
129
|
+
# Check daemon health
|
|
130
|
+
acr-meta-mcp health
|
|
131
|
+
|
|
132
|
+
# List registered servers
|
|
133
|
+
acr-meta-mcp list
|
|
134
|
+
|
|
135
|
+
# Import mcp_config.json
|
|
136
|
+
acr-meta-mcp import ./path/to/mcp_config.json
|
|
137
|
+
|
|
138
|
+
# Query tools catalog
|
|
139
|
+
acr-meta-mcp tools projected
|
|
140
|
+
|
|
141
|
+
# Call governed tool
|
|
142
|
+
acr-meta-mcp call context7__query-docs '{"libraryId":"/vercel/next.js","query":"App Router"}'
|
|
143
|
+
|
|
144
|
+
# Manage encrypted Auth Vault
|
|
145
|
+
acr-meta-mcp vault list
|
|
146
|
+
acr-meta-mcp vault set context7 CONTEXT7_API_KEY "ctx7sk_..." personal chacha20-poly1305
|
|
147
|
+
acr-meta-mcp vault rotate "new-secure-passphrase"
|
|
148
|
+
acr-meta-mcp vault delete sec_ref_context7_context7_api_key
|
|
149
|
+
|
|
150
|
+
# Manage and test dynamic port bindings
|
|
151
|
+
acr-meta-mcp ports list
|
|
152
|
+
acr-meta-mcp ports set acr-meta-mcp 20495
|
|
153
|
+
acr-meta-mcp ports test
|
|
154
|
+
acr-meta-mcp ports export
|
|
155
|
+
|
|
156
|
+
# View audit logs
|
|
157
|
+
acr-meta-mcp audit
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Native Dart CLI (`acr-cli`)
|
|
161
|
+
```bash
|
|
162
|
+
acr meta-mcp list
|
|
163
|
+
acr meta-mcp import ./mcp_config.json
|
|
164
|
+
acr meta-mcp tools --view=projected
|
|
165
|
+
acr meta-mcp call context7__resolve-library-id '{"libraryName":"React"}'
|
|
166
|
+
acr meta-mcp vault list
|
|
167
|
+
acr meta-mcp vault set --server=github --key=GITHUB_TOKEN --value="ghp_..."
|
|
168
|
+
acr ports list
|
|
169
|
+
acr ports set acr-meta-mcp 20495
|
|
170
|
+
acr ports test
|
|
171
|
+
acr meta-mcp audit
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Integration with MCP Clients
|
|
177
|
+
|
|
178
|
+
Add the ACR Meta-MCP Forward Proxy to any standard MCP client (`claude_desktop_config.json`, `~/.cursor/mcp.json`, etc.):
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"mcpServers": {
|
|
183
|
+
"acr-meta-mcp": {
|
|
184
|
+
"url": "http://localhost:20445/mcp"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
All downstream tools (Context7, GitHub, Gitee, filesystem sandbox, custom agents) will be dynamically projected, sandboxed, and governed under dual-consent policy rules.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Test Suite Execution
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
npm install
|
|
198
|
+
npm test
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
✔ Meta-MCP Control Plane API & JSON-RPC Gateway (8 tests passed)
|
|
203
|
+
✔ Context7 Real MCP Tool E2E Integration & QA Test (7 tests passed)
|
|
204
|
+
✔ Auth Vault (SQLite3MultipleCiphers & SQLCipher Engine) (5 tests passed)
|
|
205
|
+
✔ Catalog Projector (3-Tier Catalog Pipeline) (2 tests passed)
|
|
206
|
+
✔ Config Parser & Manifest Compiler (2 tests passed)
|
|
207
|
+
✔ Policy Engine & Dual Consent (3 tests passed)
|
|
208
|
+
✔ Registry Core (State Machine & Server Persistence) (1 test passed)
|
|
209
|
+
✔ Sandbox Runtime (Containment Engine) (2 tests passed)
|
|
210
|
+
|
|
211
|
+
30 tests passed, 0 failed (971ms)
|
|
212
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/cli/src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
const BASE_URL = process.env.ACR_META_MCP_URL || 'http://127.0.0.1:20445';
|
|
6
|
+
const DEFAULT_SERVICES = [
|
|
7
|
+
{ id: 'acr-core', name: 'ACR Core Daemon', envVar: 'ACR_CORE_PORT', defaultPort: 20443, healthPath: '/health' },
|
|
8
|
+
{ id: 'acr-meta-mcp', name: 'Meta-MCP Forward Proxy', envVar: 'ACR_META_MCP_PORT', defaultPort: 20445, healthPath: '/health' },
|
|
9
|
+
{ id: 'acr-bridge', name: 'ACR MCP Bridge', envVar: 'ACR_BRIDGE_PORT', defaultPort: 20444, healthPath: '/health' },
|
|
10
|
+
{ id: 'nats-jetstream', name: 'Internal NATS Broker', envVar: 'ACR_NATS_PORT', defaultPort: 4222, healthPath: '' },
|
|
11
|
+
{ id: 'gitea', name: 'Local Ecosystem Gitea', envVar: 'ACR_GITEA_PORT', defaultPort: 3300, healthPath: '/api/v1/version' },
|
|
12
|
+
];
|
|
13
|
+
function getPortsConfigFile() {
|
|
14
|
+
const dir = join(homedir(), '.acr');
|
|
15
|
+
if (!existsSync(dir)) {
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
return join(dir, 'ports.json');
|
|
19
|
+
}
|
|
20
|
+
function loadPortOverrides() {
|
|
21
|
+
const file = getPortsConfigFile();
|
|
22
|
+
if (!existsSync(file))
|
|
23
|
+
return {};
|
|
24
|
+
try {
|
|
25
|
+
const raw = readFileSync(file, 'utf-8');
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
return parsed.ports || {};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function savePortOverrides(overrides) {
|
|
34
|
+
const file = getPortsConfigFile();
|
|
35
|
+
const data = {
|
|
36
|
+
version: '1.0.0',
|
|
37
|
+
updatedAt: new Date().toISOString(),
|
|
38
|
+
ports: overrides,
|
|
39
|
+
};
|
|
40
|
+
writeFileSync(file, JSON.stringify(data, null, 2), 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
function resolveServicePort(s, overrides) {
|
|
43
|
+
if (process.env[s.envVar] && !isNaN(Number(process.env[s.envVar]))) {
|
|
44
|
+
return Number(process.env[s.envVar]);
|
|
45
|
+
}
|
|
46
|
+
return overrides[s.id] || s.defaultPort;
|
|
47
|
+
}
|
|
48
|
+
async function main() {
|
|
49
|
+
const args = process.argv.slice(2);
|
|
50
|
+
const command = args[0] || 'help';
|
|
51
|
+
switch (command) {
|
|
52
|
+
case 'health': {
|
|
53
|
+
const res = await fetch(`${BASE_URL}/health`);
|
|
54
|
+
const data = await res.json();
|
|
55
|
+
console.log(JSON.stringify(data, null, 2));
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'list':
|
|
59
|
+
case 'servers': {
|
|
60
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/servers`);
|
|
61
|
+
const data = (await res.json());
|
|
62
|
+
console.log('\n======================================================');
|
|
63
|
+
console.log(' ACR META-MCP REGISTERED SERVERS');
|
|
64
|
+
console.log('======================================================');
|
|
65
|
+
for (const s of data.servers || []) {
|
|
66
|
+
const state = s.enabled ? (s.quarantined ? 'QUARANTINE' : s.healthStatus) : 'DISABLED';
|
|
67
|
+
console.log(` • [${state.padEnd(10)}] ${s.id.padEnd(20)} | ${s.transport.padEnd(16)} | ${s.displayName} (${s.toolCount} tools)`);
|
|
68
|
+
}
|
|
69
|
+
console.log(`\nTotal: ${data.count} registered servers\n`);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'import': {
|
|
73
|
+
const filePath = args[1];
|
|
74
|
+
if (!filePath) {
|
|
75
|
+
console.error('Usage: acr-meta-mcp import <path/to/mcp_config.json>');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const rawContent = readFileSync(filePath, 'utf-8');
|
|
79
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/servers/import`, {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: { 'Content-Type': 'application/json' },
|
|
82
|
+
body: rawContent,
|
|
83
|
+
});
|
|
84
|
+
const data = await res.json();
|
|
85
|
+
console.log('[ACR Meta-MCP] Config Imported:', JSON.stringify(data, null, 2));
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case 'enable':
|
|
89
|
+
case 'disable': {
|
|
90
|
+
const serverId = args[1];
|
|
91
|
+
if (!serverId) {
|
|
92
|
+
console.error(`Usage: acr-meta-mcp ${command} <serverId>`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/servers/${serverId}/toggle`, {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: { 'Content-Type': 'application/json' },
|
|
98
|
+
body: JSON.stringify({ enabled: command === 'enable' }),
|
|
99
|
+
});
|
|
100
|
+
const data = await res.json();
|
|
101
|
+
console.log(`[ACR Meta-MCP] Server ${serverId} updated:`, data);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case 'tools': {
|
|
105
|
+
const view = args[1] || 'projected';
|
|
106
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/tools?view=${view}`);
|
|
107
|
+
const data = (await res.json());
|
|
108
|
+
console.log(`\n======================================================`);
|
|
109
|
+
console.log(` ACR META-MCP CATALOG (${view.toUpperCase()})`);
|
|
110
|
+
console.log(`======================================================`);
|
|
111
|
+
for (const t of data.tools || []) {
|
|
112
|
+
console.log(` • ${t.name.padEnd(32)} | [${t.serverId}] ${t.description}`);
|
|
113
|
+
}
|
|
114
|
+
console.log(`\nTotal tools: ${data.tools?.length || 0}\n`);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'call': {
|
|
118
|
+
const toolName = args[1];
|
|
119
|
+
const jsonArgs = args[2] ? JSON.parse(args[2]) : {};
|
|
120
|
+
if (!toolName) {
|
|
121
|
+
console.error('Usage: acr-meta-mcp call <tool_name> [json_args]');
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/tools/call`, {
|
|
125
|
+
method: 'POST',
|
|
126
|
+
headers: { 'Content-Type': 'application/json' },
|
|
127
|
+
body: JSON.stringify({ toolName, arguments: jsonArgs }),
|
|
128
|
+
});
|
|
129
|
+
const data = await res.json();
|
|
130
|
+
console.log(JSON.stringify(data, null, 2));
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case 'vault': {
|
|
134
|
+
const subAction = args[1] || 'list';
|
|
135
|
+
if (subAction === 'list') {
|
|
136
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/vault/secrets`);
|
|
137
|
+
const data = (await res.json());
|
|
138
|
+
console.log('\n======================================================');
|
|
139
|
+
console.log(' ACR META-MCP AUTH VAULT SECRETS (ENCRYPTED DATABASE)');
|
|
140
|
+
console.log('======================================================');
|
|
141
|
+
for (const s of data.secrets || []) {
|
|
142
|
+
console.log(` • [${s.domain.padEnd(10)}] ${s.refId.padEnd(32)} | ${s.serverId.padEnd(16)} | Cipher: ${s.algorithm || 'aes-256-gcm'}`);
|
|
143
|
+
}
|
|
144
|
+
console.log(`\nTotal vaulted secrets: ${data.count}\n`);
|
|
145
|
+
}
|
|
146
|
+
else if (subAction === 'set') {
|
|
147
|
+
const serverId = args[2];
|
|
148
|
+
const key = args[3];
|
|
149
|
+
const value = args[4];
|
|
150
|
+
if (!serverId || !key || !value) {
|
|
151
|
+
console.error('Usage: acr-meta-mcp vault set <serverId> <key> <value> [domain] [cipher]');
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
const domain = args[5] || 'personal';
|
|
155
|
+
const cipher = args[6] || 'aes-256-gcm';
|
|
156
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/vault/secrets`, {
|
|
157
|
+
method: 'POST',
|
|
158
|
+
headers: { 'Content-Type': 'application/json' },
|
|
159
|
+
body: JSON.stringify({ serverId, key, value, domain, cipher }),
|
|
160
|
+
});
|
|
161
|
+
const data = await res.json();
|
|
162
|
+
console.log('[ACR Meta-MCP Vault] Stored secret:', data);
|
|
163
|
+
}
|
|
164
|
+
else if (subAction === 'delete') {
|
|
165
|
+
const refId = args[2];
|
|
166
|
+
if (!refId) {
|
|
167
|
+
console.error('Usage: acr-meta-mcp vault delete <refId>');
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/vault/secrets/${refId}`, {
|
|
171
|
+
method: 'DELETE',
|
|
172
|
+
});
|
|
173
|
+
const data = await res.json();
|
|
174
|
+
console.log('[ACR Meta-MCP Vault] Deleted secret:', data);
|
|
175
|
+
}
|
|
176
|
+
else if (subAction === 'rotate') {
|
|
177
|
+
const newMasterSecret = args[2];
|
|
178
|
+
if (!newMasterSecret) {
|
|
179
|
+
console.error('Usage: acr-meta-mcp vault rotate <newMasterPassphrase>');
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/vault/rotate`, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers: { 'Content-Type': 'application/json' },
|
|
185
|
+
body: JSON.stringify({ newMasterSecret }),
|
|
186
|
+
});
|
|
187
|
+
const data = await res.json();
|
|
188
|
+
console.log('[ACR Meta-MCP Vault] Master key rotated:', data);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
console.error('Unknown vault action. Valid: list | set | delete | rotate');
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case 'ports': {
|
|
196
|
+
const subAction = args[1] || 'list';
|
|
197
|
+
const overrides = loadPortOverrides();
|
|
198
|
+
if (subAction === 'list') {
|
|
199
|
+
console.log('\n======================================================');
|
|
200
|
+
console.log(' ACR ECOSYSTEM SERVICE PORT MAPPINGS');
|
|
201
|
+
console.log('======================================================');
|
|
202
|
+
for (const s of DEFAULT_SERVICES) {
|
|
203
|
+
const port = resolveServicePort(s, overrides);
|
|
204
|
+
const isCustom = port !== s.defaultPort;
|
|
205
|
+
const badge = isCustom ? '[CUSTOM]' : '[DEFAULT]';
|
|
206
|
+
console.log(` • ${badge.padEnd(10)} ${s.name.padEnd(24)} -> :${port.toString().padEnd(6)} ($${s.envVar})`);
|
|
207
|
+
}
|
|
208
|
+
console.log(`\nConfig file: ${getPortsConfigFile()}\n`);
|
|
209
|
+
}
|
|
210
|
+
else if (subAction === 'set') {
|
|
211
|
+
const serviceId = args[2];
|
|
212
|
+
const portNum = parseInt(args[3], 10);
|
|
213
|
+
if (!serviceId || isNaN(portNum)) {
|
|
214
|
+
console.error('Usage: acr-meta-mcp ports set <service-id> <port>');
|
|
215
|
+
console.error(`Available services: ${DEFAULT_SERVICES.map((s) => s.id).join(', ')}`);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
if (portNum < 1024 || portNum > 65535) {
|
|
219
|
+
console.error('[ERROR] Port must be between 1024 and 65535.');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
const found = DEFAULT_SERVICES.find((s) => s.id === serviceId);
|
|
223
|
+
if (!found) {
|
|
224
|
+
console.error(`[ERROR] Unknown service "${serviceId}". Valid: ${DEFAULT_SERVICES.map((s) => s.id).join(', ')}`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
overrides[serviceId] = portNum;
|
|
228
|
+
savePortOverrides(overrides);
|
|
229
|
+
console.log(`[SUCCESS] Port for "${serviceId}" set to :${portNum} in ~/.acr/ports.json`);
|
|
230
|
+
}
|
|
231
|
+
else if (subAction === 'reset') {
|
|
232
|
+
const serviceId = args[2];
|
|
233
|
+
if (serviceId) {
|
|
234
|
+
delete overrides[serviceId];
|
|
235
|
+
savePortOverrides(overrides);
|
|
236
|
+
console.log(`[SUCCESS] Reset port for "${serviceId}" to default.`);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
const file = getPortsConfigFile();
|
|
240
|
+
if (existsSync(file))
|
|
241
|
+
unlinkSync(file);
|
|
242
|
+
console.log('[SUCCESS] All service ports reset to factory defaults.');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else if (subAction === 'test') {
|
|
246
|
+
console.log('\n======================================================');
|
|
247
|
+
console.log(' TESTING SERVICE PORT CONNECTIVITY');
|
|
248
|
+
console.log('======================================================');
|
|
249
|
+
for (const s of DEFAULT_SERVICES) {
|
|
250
|
+
const port = resolveServicePort(s, overrides);
|
|
251
|
+
if (!s.healthPath) {
|
|
252
|
+
console.log(` • [ONLINE] ${s.name.padEnd(24)} :${port} (TCP socket assumed reachable)`);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const start = Date.now();
|
|
256
|
+
try {
|
|
257
|
+
const controller = new AbortController();
|
|
258
|
+
const timeout = setTimeout(() => controller.abort(), 1500);
|
|
259
|
+
const res = await fetch(`http://localhost:${port}${s.healthPath}`, { signal: controller.signal });
|
|
260
|
+
clearTimeout(timeout);
|
|
261
|
+
const latency = Date.now() - start;
|
|
262
|
+
console.log(` • [ONLINE] ${s.name.padEnd(24)} :${port} (${latency}ms) [HTTP ${res.status}]`);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
console.log(` • [OFFLINE] ${s.name.padEnd(24)} :${port} (unreachable)`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
console.log('');
|
|
269
|
+
}
|
|
270
|
+
else if (subAction === 'export') {
|
|
271
|
+
const asJson = args.includes('--json');
|
|
272
|
+
if (asJson) {
|
|
273
|
+
const obj = {};
|
|
274
|
+
for (const s of DEFAULT_SERVICES)
|
|
275
|
+
obj[s.id] = resolveServicePort(s, overrides);
|
|
276
|
+
console.log(JSON.stringify({ version: '1.0.0', ports: obj }, null, 2));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
console.log('# ACR Ecosystem Dynamic Port Configuration');
|
|
280
|
+
for (const s of DEFAULT_SERVICES) {
|
|
281
|
+
console.log(`${s.envVar}=${resolveServicePort(s, overrides)}`);
|
|
282
|
+
}
|
|
283
|
+
console.log(`ACR_DAEMON_URL=http://localhost:${resolveServicePort(DEFAULT_SERVICES[0], overrides)}`);
|
|
284
|
+
console.log(`ACR_META_MCP_URL=http://localhost:${resolveServicePort(DEFAULT_SERVICES[1], overrides)}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.error('Unknown ports action. Valid: list | set | reset | test | export');
|
|
289
|
+
}
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case 'audit': {
|
|
293
|
+
const res = await fetch(`${BASE_URL}/api/v1/meta-mcp/audit?limit=20`);
|
|
294
|
+
const data = (await res.json());
|
|
295
|
+
console.log('\n======================================================');
|
|
296
|
+
console.log(' ACR META-MCP AUDIT TRAIL');
|
|
297
|
+
console.log('======================================================');
|
|
298
|
+
for (const a of data.logs || []) {
|
|
299
|
+
console.log(` [${a.timestamp.slice(11, 19)}] ${a.eventType.padEnd(18)} | ${a.status.padEnd(8)} | ${a.actorDid} -> ${a.toolName || a.serverId || ''} (${a.latencyMs?.toFixed(2)}ms)`);
|
|
300
|
+
}
|
|
301
|
+
console.log('');
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
default:
|
|
305
|
+
console.log(`
|
|
306
|
+
ACR Meta-MCP Forward Proxy CLI (v0.8.2)
|
|
307
|
+
|
|
308
|
+
Usage:
|
|
309
|
+
acr-meta-mcp health
|
|
310
|
+
acr-meta-mcp list
|
|
311
|
+
acr-meta-mcp import <path/to/mcp_config.json>
|
|
312
|
+
acr-meta-mcp enable <serverId>
|
|
313
|
+
acr-meta-mcp disable <serverId>
|
|
314
|
+
acr-meta-mcp tools [raw|policy|projected]
|
|
315
|
+
acr-meta-mcp call <tool_name> [json_args]
|
|
316
|
+
acr-meta-mcp vault [list|set|delete|rotate]
|
|
317
|
+
acr-meta-mcp ports [list|set|reset|test|export]
|
|
318
|
+
acr-meta-mcp audit
|
|
319
|
+
`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
main().catch((err) => {
|
|
323
|
+
console.error('[ACR Meta-MCP CLI] Error:', err.message);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../apps/cli/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface AuditLogEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
timestamp: string;
|
|
4
|
+
eventType: 'CONFIG_IMPORT' | 'SERVER_TOGGLE' | 'SERVER_QUARANTINE' | 'TOOL_CALL' | 'POLICY_VIOLATION' | 'AUTH_ACCESS';
|
|
5
|
+
actorDid: string;
|
|
6
|
+
serverId?: string;
|
|
7
|
+
toolName?: string;
|
|
8
|
+
status: 'SUCCESS' | 'DENIED' | 'ERROR' | 'CONFIRMATION_REQUIRED';
|
|
9
|
+
latencyMs?: number;
|
|
10
|
+
details?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export declare class AuditLogger {
|
|
13
|
+
private readonly logs;
|
|
14
|
+
private readonly maxLogs;
|
|
15
|
+
constructor(maxLogs?: number);
|
|
16
|
+
record(entry: Omit<AuditLogEntry, 'id' | 'timestamp'>): AuditLogEntry;
|
|
17
|
+
getRecent(limit?: number): AuditLogEntry[];
|
|
18
|
+
filter(predicate: (e: AuditLogEntry) => boolean): AuditLogEntry[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../../apps/control-plane-api/src/audit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,eAAe,GAAG,eAAe,GAAG,mBAAmB,GAAG,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC;IACtH,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,uBAAuB,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YAAY,OAAO,SAAO,EAEzB;IAEM,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa,CAa3E;IAEM,SAAS,CAAC,KAAK,SAAK,GAAG,aAAa,EAAE,CAE5C;IAEM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,OAAO,GAAG,aAAa,EAAE,CAEvE;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class AuditLogger {
|
|
2
|
+
logs = [];
|
|
3
|
+
maxLogs;
|
|
4
|
+
constructor(maxLogs = 1000) {
|
|
5
|
+
this.maxLogs = maxLogs;
|
|
6
|
+
}
|
|
7
|
+
record(entry) {
|
|
8
|
+
const fullEntry = {
|
|
9
|
+
id: `aud_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
10
|
+
timestamp: new Date().toISOString(),
|
|
11
|
+
...entry,
|
|
12
|
+
};
|
|
13
|
+
this.logs.unshift(fullEntry);
|
|
14
|
+
if (this.logs.length > this.maxLogs) {
|
|
15
|
+
this.logs.pop();
|
|
16
|
+
}
|
|
17
|
+
return fullEntry;
|
|
18
|
+
}
|
|
19
|
+
getRecent(limit = 50) {
|
|
20
|
+
return this.logs.slice(0, limit);
|
|
21
|
+
}
|
|
22
|
+
filter(predicate) {
|
|
23
|
+
return this.logs.filter(predicate);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../apps/control-plane-api/src/audit.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,WAAW;IACL,IAAI,GAAoB,EAAE,CAAC;IAC3B,OAAO,CAAS;IAEjC,YAAY,OAAO,GAAG,IAAI;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,MAAM,CAAC,KAA8C;QAC1D,MAAM,SAAS,GAAkB;YAC/B,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACjE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,KAAK;SACT,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,SAAS,CAAC,KAAK,GAAG,EAAE;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,SAAwC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/control-plane-api/src/index.ts"],"names":[],"mappings":""}
|