wimotek-edge-agent 1.0.0 → 1.0.5

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 CHANGED
@@ -1,219 +1,285 @@
1
- # Wimotek Edge Agent (wimotek-edge-agent)
1
+ # edge_agent commercial module
2
+
3
+ Commercial-grade edge agent with explicit access policy, TOFU quarantine,
4
+ Edge Agent token verification, session fast re-auth, and NAT4 reverse tunnel.
5
+
6
+ ## Table of contents
7
+
8
+ - [Design goals](#design-goals)
9
+ - [Architecture](#architecture)
10
+ - [Decision matrix](#decision-matrix)
11
+ - [Install](#install)
12
+ - [Environment variables](#environment-variables)
13
+ - [CLI usage](#cli-usage)
14
+ - [Programmatic usage](#programmatic-usage)
15
+ - [Reverse tunnel / NAT4](#reverse-tunnel--nat4)
16
+ - [Audit log](#audit-log)
17
+ - [Security model](#security-model)
18
+ - [Commercial deployment checklist](#commercial-deployment-checklist)
19
+ - [Publishing](#publishing)
20
+ - [License](#license)
21
+
22
+ ## Design goals
23
+
24
+ 1. **Local connections default allow**, gated by a `local_bypass_token`
25
+ written with mode `0600`, so other processes on the same host cannot
26
+ trivially reuse `127.0.0.1`.
27
+ 2. **External connections default TOFU**. A node without a token is
28
+ placed in a quarantine that only exchanges heartbeats. No business
29
+ data is relayed until an administrator approves the node.
30
+ 3. **External connections with token use Edge Agent mode**. The token is
31
+ verified for signature, TTL, audience, issuer, `node_uuid` binding,
32
+ optional source IP CIDR binding, and single-use replay protection.
33
+ 4. **NAT4 / no public IP uses reverse tunnel**. Authentication strength
34
+ does not downgrade when the network profile is `nat4_reverse`.
35
+ 5. **Trusted nodes re-auth with short-lived session tickets**. A trusted
36
+ node without token or session is denied, preventing downgrade to TOFU.
37
+
38
+ ## Architecture
2
39
 
3
- [![PyPI version](https://img.shields.io/pypi/v/wimotek-edge-agent.svg?color=blue)](https://pypi.org/project/wimotek-edge-agent/)
4
- [![npm version](https://img.shields.io/npm/v/wimotek-edge-agent.svg?color=red)](https://www.npmjs.com/package/wimotek-edge-agent)
5
- [![Python Version](https://img.shields.io/pypi/pyversions/wimotek-edge-agent.svg)](https://pypi.org/project/wimotek-edge-agent/)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
40
+ ```text
41
+ +---------------------------+
42
+ loopback ---> | AccessPolicyEngine | ---> ALLOW_LOCAL
43
+ | (single decision point) |
44
+ external ---> | | ---> ALLOW_TOKEN
45
+ + token | 1. local bypass token |
46
+ | 2. join token verify | ---> ALLOW_SESSION
47
+ external ---> | 3. session ticket |
48
+ no token | 4. TOFU pending | ---> PENDING_TOFU
49
+ | 5. revoked / mismatch |
50
+ nat4_rev ---> | | ---> DENY
51
+ +---------------------------+
52
+ |
53
+ v
54
+ +-------------------+
55
+ | TrustStore |
56
+ | pending/trusted/ |
57
+ | revoked + jti |
58
+ +-------------------+
59
+ |
60
+ v
61
+ +-------------------+
62
+ | AuditLogger |
63
+ | JSON Lines |
64
+ +-------------------+
65
+ ```
7
66
 
8
- 轻量、通用、零侵入的边缘节点出站反向代理与服务中继客户端(Universal Edge Reverse Tunnel & Service Bridge Agent)。
67
+ ## Decision matrix
9
68
 
10
- 专为处于 **无公网 IP、NAT4、移动宽带、家用路由器或严格云防火墙** 环境下的容器(noVNC、Kasm Workspaces、Headless Chromium、自动化爬虫等)与边缘服务器设计,提供全自动设备确权、双模身份认证与本地端口透明反向穿透能力。
69
+ | Source | Loopback | Join token | Session ticket | Existing trust | Decision |
70
+ |--------|----------|------------|----------------|----------------|----------|
71
+ | direct | yes | - | - | any | `ALLOW_LOCAL` if bypass token ok, else `DENY` |
72
+ | direct | no | valid | - | any | `ALLOW_TOKEN`, bind trust |
73
+ | direct | no | invalid | - | any | `DENY` |
74
+ | direct | no | - | valid | trusted | `ALLOW_SESSION` |
75
+ | direct | no | - | - | trusted | `DENY` (no downgrade) |
76
+ | direct | no | - | - | pending, same fp | `PENDING_TOFU` |
77
+ | direct | no | - | - | pending, diff fp | `DENY` |
78
+ | direct | no | - | - | none | `PENDING_TOFU` |
79
+ | direct | no | - | - | revoked | `DENY` |
80
+ | nat4_reverse | no | valid | - | any | `ALLOW_TOKEN` |
81
+ | nat4_reverse | no | - | - | none | `PENDING_TOFU` |
11
82
 
12
- ---
83
+ ## Install
13
84
 
14
- ## 🌟 核心特性
85
+ ```bash
86
+ pip install edge-agent-commercial
87
+ ```
15
88
 
16
- - **⚡ 出站长连接 NAT4 极速穿透**:通过单向发起 Outbound WebSocket (WSS/TLS) 长连接直达中心管理端,彻底突破多层 NAT 与企业内网防火墙,**节点无需公网 IP、无需路由器端口映射**。
17
- - **🛡️ 生产级双模身份认证与防伪造(TOFU + Edge Agent)**:
18
- - **默认 TOFU 模式(Trust On First Use)**:零配置启动,节点自动生成硬件指纹 UUID,管理端后台实时弹出审核认领,管理员「一键信任锁定」后完成公钥防篡改绑定。
19
- - **Edge Agent 模式**:批量注入 `JOIN_TOKEN`,节点开机秒级自验证入网,支持 CI/CD 与大规模集群全自动挂靠。
20
- - **🤖 智能命名与设备自协商**:自动探测出口公网 IP 或物理网卡 IP 智能拼接命名(如 `Node-123.45.67.89`),嗅探失败平滑降级为容器主机名。
21
- - **🔌 通用本地服务透明桥接(Decoupled & Multi-Service)**:业务完全解耦,不仅支持 Chromium CDP(9222),亦可同时中继 VNC 桌面(6080)、Web 业务 API(8080)等任意本地端口。
22
- - **🌐 跨语言分发与 CLI 驱动**:同时发布至 PyPI 与 npm,支持系统级全局命令 `edge-agent` 与 `npx wimotek-edge-agent`。
89
+ From source:
23
90
 
24
- ---
91
+ ```bash
92
+ git clone https://github.com/yourorg/edge-agent.git
93
+ cd edge-agent
94
+ pip install -e ".[dev]"
95
+ ```
25
96
 
26
- ## 🏗️ 架构原理
97
+ ## Environment variables
98
+
99
+ | Variable | Required | Default | Description |
100
+ |----------|----------|---------|-------------|
101
+ | `EDGE_AGENT_DATA_DIR` | no | `./edge_agent_data` | Data directory for trust DB, audit log, local bypass token |
102
+ | `EDGE_AGENT_TOKEN_SECRET` | yes | - | HMAC secret, >= 32 bytes |
103
+ | `EDGE_AGENT_TOKEN_AUDIENCE` | no | `edge-agent` | Token audience |
104
+ | `EDGE_AGENT_TOKEN_ISSUER` | no | `central` | Token issuer |
105
+ | `EDGE_AGENT_TOKEN_MAX_TTL_SECONDS` | no | `600` | Max token TTL |
106
+ | `EDGE_AGENT_SESSION_TICKET_TTL_SECONDS` | no | `300` | Session ticket TTL |
107
+ | `EDGE_AGENT_TOFU_HEARTBEAT_SECONDS` | no | `10` | TOFU quarantine heartbeat interval |
108
+ | `EDGE_AGENT_REQUIRE_LOCAL_BYPASS_TOKEN` | no | `true` | Require local bypass token for loopback |
109
+ | `EDGE_AGENT_REVERSE_TUNNEL` | no | auto | `true` / `false` / unset |
110
+ | `EDGE_AGENT_NAT_TYPE` | no | `unknown` | `nat4`, `symmetric`, etc. |
111
+ | `EDGE_AGENT_NODE_UUID` | reverse only | - | Agent node UUID |
112
+ | `EDGE_AGENT_PUBLIC_KEY_FINGERPRINT` | reverse only | - | Agent public key fingerprint |
113
+ | `EDGE_AGENT_JOIN_TOKEN` | reverse only | - | Join token for Edge Agent mode |
114
+ | `EDGE_AGENT_TLS_SERVER_NAME` | no | - | TLS SNI |
115
+ | `EDGE_AGENT_CERTIFICATE_PIN_SHA256` | no | - | TLS certificate pin |
116
+
117
+ Generate a secret:
27
118
 
28
- ```text
29
- ┌────────────────────────────────────────────────────────┐
30
- │ 边缘内网节点 (家用宽带 / NAT4 / 容器无公网IP) │
31
- │ │
32
- │ - Chromium CDP (:9222) │
33
- │ - noVNC 桌面 (:6080) │
34
- │ - 自定义业务服务 (:8080) │
35
- └──────────────────────────┬─────────────────────────────┘
36
- ▲ 本地 127.0.0.1 访问
37
- ▼
38
- ┌────────────────────────────────────────────────────────┐
39
- │ wimotek-edge-agent 客户端 │
40
- │ │
41
- │ 职责: 硬件指纹生成 + TOFU/Token协商 + 本地服务透明中继 │
42
- └──────────────────────────┬─────────────────────────────┘
43
- │
44
- │ 主动发起出站反向长连接 (Outbound TLS/WSS)
45
- │ 仅需中心管理端暴露 8443 端口,无视客户端网络环境
46
- ▼
47
- ┌────────────────────────────────────────────────────────┐
48
- │ 中心控制端 (Central Hub) │
49
- │ │
50
- │ - 管理员在线认领锁定 (TOFU) / Token 自动化放行 │
51
- │ - 借由反向长连接随时下发指令、Cookie同步、采集探针 │
52
- └────────────────────────────────────────────────────────┘
119
+ ```bash
120
+ python -c "import secrets; print(secrets.token_urlsafe(48))"
53
121
  ```
54
122
 
55
- ---
123
+ ## CLI usage
56
124
 
57
- ## 📦 安装与调用
125
+ Start a direct TLS JSON-line server:
58
126
 
59
- ### 1. Python / PyPI 安装(推荐)
60
127
  ```bash
61
- pip install wimotek-edge-agent
128
+ edge-agent listen --host 0.0.0.0 --port 8443 \
129
+ --cert /path/server.crt --key /path/server.key
62
130
  ```
63
- 安装后直接获得系统全局命令 **`edge-agent`**。
64
131
 
65
- ### 2. Node.js / npm 免安装执行
66
- ```bash
67
- npx wimotek-edge-agent --hub-url https://hub.yourdomain.com:8443
68
- ```
69
- 或全局安装:
132
+ Approve a pending TOFU node (admin, out-of-band):
133
+
70
134
  ```bash
71
- npm install -g wimotek-edge-agent
135
+ edge-agent approve --node-uuid node-xxx --fingerprint sha256:...
72
136
  ```
73
137
 
74
- ---
75
-
76
- ## 🚀 快速上手
138
+ Revoke a trusted node:
77
139
 
78
- ### 1. 命令行直接启动 (CLI)
79
140
  ```bash
80
- # 最简启动 (直连模式,自动嗅探 IP 命名)
81
- edge-agent --hub-url https://hub.yourdomain.com:8443
141
+ edge-agent revoke --node-uuid node-xxx
142
+ ```
82
143
 
83
- # NAT4 穿透模式 (无公网 IP 环境)
84
- edge-agent --hub-url https://hub.yourdomain.com:8443 --reverse
144
+ Show a node record:
85
145
 
86
- # 批量免审批模式 (携带集群入网通行码)
87
- edge-agent --hub-url https://hub.yourdomain.com:8443 --join-token hub_join_xxxxxx --reverse
146
+ ```bash
147
+ edge-agent show-node --node-uuid node-xxx
88
148
  ```
89
149
 
90
- ### 2. 环境变量一键启动(容器化最佳实践)
91
- 无需修改命令,直接传入环境变量:
150
+ Issue a single-use Edge Agent join token:
151
+
92
152
  ```bash
93
- export HUB_URL="https://hub.yourdomain.com:8443"
94
- export JOIN_TOKEN="hub_join_xxxxxx" # 可选,不填走 TOFU 待认领模式
95
- export REVERSE_TUNNEL="true" # 可选,默认 false;NAT4 无公网环境设为 true
96
- edge-agent
153
+ edge-agent issue-token \
154
+ --node-group group-a \
155
+ --ttl 300 \
156
+ --node-uuid node-xxx \
157
+ --allowed-ip-cidr 203.0.113.0/24
97
158
  ```
98
159
 
99
- ### 3. Python 脚本编程式集成
100
- ```python
101
- from wimotek_edge_agent import EdgeAgent
102
-
103
- agent = EdgeAgent(
104
- hub_url="https://hub.yourdomain.com:8443",
105
- join_token="hub_join_xxxxxx", # 可选
106
- node_name="Seoul-Worker-01", # 可选,留空自动按 IP 拼接
107
- node_group="爬虫矩阵组", # 默认: 默认分组
108
- cdp_port=9222, # 默认: 9222
109
- reverse_tunnel=True # 开启 NAT4 反向长连接
110
- )
160
+ ## Programmatic usage
111
161
 
112
- # 启动后台代理 (阻塞运行)
113
- agent.run()
162
+ ```python
163
+ import asyncio
164
+ from edge_agent import Config, EdgeAgent
165
+
166
+ async def main() -> None:
167
+ config = Config.from_env()
168
+ agent = EdgeAgent(config)
169
+
170
+ async def data_handler(transport, ctx):
171
+ while True:
172
+ msg = await transport.read_message()
173
+ if msg.get("type") == "ping":
174
+ await transport.write_message({"type": "pong"})
175
+
176
+ agent.data_handler = data_handler
177
+
178
+ server = await asyncio.start_server(
179
+ lambda r, w: agent.handle_connection(
180
+ __import__("edge_agent.transport", fromlist=["JsonLineTransport"]).JsonLineTransport(r, w),
181
+ w.get_extra_info("peername")[0],
182
+ ),
183
+ host="0.0.0.0",
184
+ port=8443,
185
+ )
186
+ async with server:
187
+ await server.serve_forever()
188
+
189
+ asyncio.run(main())
114
190
  ```
115
191
 
116
- ---
192
+ ## Reverse tunnel / NAT4
117
193
 
118
- ## ⚙️ 环境变量与参数字典
194
+ `transport.TunnelDialer` is a protocol. Implement it with your existing
195
+ WebSocket stack, then call:
119
196
 
120
- | 环境变量名 | CLI 参数 | 默认值 | 描述 |
121
- | :--- | :--- | :--- | :--- |
122
- | `HUB_URL` | `--hub-url` | *无 (必填)* | 中心管理端 HTTPS/WSS 地址,如 `https://hub.domain.com:8443` |
123
- | `JOIN_TOKEN` | `--join-token` | `""` (空) | 集群入网通行码。**留空走 TOFU 后台审核认领**;填入则走 Edge Agent 自动放行入网 |
124
- | `REVERSE_TUNNEL`| `--reverse` / `--direct` | `false` | 是否开启出站反向长连接隧道。**无公网 IP/NAT4 环境设为 `true`**;有公网/局域网设为 `false` |
125
- | `NODE_NAME` | `--node-name` | 自动嗅探 | 节点名称。未设置时自动以出口 IP 命名(如 `Node-123.45.67.89`),兜底为主机名 |
126
- | `NODE_GROUP` | `--group` | `默认分组` | 节点所属集群分组,便于多策略调度分类 |
127
- | `CDP_PORT` | `--port` | `9222` | 容器本地需要中继的主服务端口(如 Chromium 调试端口) |
128
- | `LOCAL_CDP_HOST`| `--cdp-host` | `127.0.0.1` | 节点本地被中继服务的绑定地址 |
129
- | `SERVICES` | `--services` | *无* | 多服务端口定义,格式:`cdp:9222,vnc:6080,api:8080` |
130
- | `UUID_FILE` | `--uuid-file` | `/data/node_machine.id` | 硬件指纹持久化文件路径,保障重启后身份不漂移 |
131
-
132
- ---
197
+ ```python
198
+ await agent.run_reverse_tunnel(
199
+ url="wss://central.example.com/tunnel",
200
+ dialer=your_dialer,
201
+ ssl_context=ssl_context,
202
+ server_hostname="central.example.com",
203
+ )
204
+ ```
133
205
 
134
- ## 🐳 Docker 生产环境集成示例
206
+ The reverse tunnel:
135
207
 
136
- ### 场景 1:noVNC / Kasm 节点 Dockerfile 集成
137
- 在现有的浏览器镜像中,只需增加 `pip install` 即可:
208
+ - uses TLS and supports certificate pinning via
209
+ `EDGE_AGENT_CERTIFICATE_PIN_SHA256`;
210
+ - sends the same handshake fields as direct mode (`node_uuid`,
211
+ `public_key_fingerprint`, `join_token`, `nat_type`, `reverse_tunnel`);
212
+ - keeps waiting on `pending_tofu` until the central side sends
213
+ `approved` or `denied`;
214
+ - applies exponential backoff on reconnect.
138
215
 
139
- ```dockerfile
140
- FROM debian:bookworm-slim
216
+ Authentication is performed by the central side using the same
217
+ `AccessPolicyEngine`. The network profile is `nat4_reverse`; the auth
218
+ strength is identical to direct mode.
141
219
 
142
- # 安装 Chromium、noVNC 及基础环境
143
- RUN apt-get update && apt-get install -y --no-install-recommends \
144
- chromium xvfb x11vnc novnc websockify python3 python3-pip curl \
145
- && rm -rf /var/lib/apt/lists/*
220
+ ## Audit log
146
221
 
147
- # 一行安装通用边缘 Agent
148
- RUN pip3 install --no-cache-dir --break-system-packages wimotek-edge-agent
222
+ Every `AccessDecision` is written to `EDGE_AGENT_DATA_DIR/audit.jsonl`:
149
223
 
150
- COPY entrypoint.sh /app/entrypoint.sh
151
- RUN chmod +x /app/entrypoint.sh
152
- ENTRYPOINT ["/app/entrypoint.sh"]
224
+ ```json
225
+ {"ts":"2026-11-06T12:00:00+00:00","event":"access_decision","node_uuid":"node-xxx","source_ip":"203.0.113.10","is_loopback":false,"decision":"allow_token","reason":"edge_agent_token_verified","network_profile":"direct","nat_type":"unknown","fingerprint":"sha256:...","node_status":"trusted"}
153
226
  ```
154
227
 
155
- 在 `entrypoint.sh` 中只需一行后台唤起:
156
- ```bash
157
- #!/bin/bash
158
- # 启动本地服务 (如 Chromium 9222)
159
- chromium --remote-debugging-port=9222 --remote-allow-origins=* &
160
-
161
- # 只要注入了 HUB_URL,自动在后台拉起边缘代理
162
- if [ -n "$HUB_URL" ]; then
163
- echo "🚀 启动 wimotek-edge-agent ..."
164
- edge-agent &
165
- fi
228
+ Ship this file to your central log platform (Loki, ELK, CloudWatch, etc.).
229
+ Do not store the raw join token in the audit log; only record the decision.
230
+
231
+ ## Security model
232
+
233
+ - **Token secret**: >= 32 bytes. Rotate by restarting with a new secret;
234
+ old tokens become invalid immediately.
235
+ - **Token single use**: `jti` is stored in `used_tokens` until `exp`.
236
+ - **Token binding**: optional `node_uuid` and `allowed_ip_cidr`.
237
+ - **TOFU quarantine**: pending nodes exchange heartbeat only. No data
238
+ relay, no business messages.
239
+ - **Fingerprint mismatch**: pending node presenting a different
240
+ fingerprint is denied; trusted node presenting a different fingerprint
241
+ is denied.
242
+ - **No downgrade**: trusted node without token or session is denied.
243
+ - **Local bypass**: `local_bypass.token` is written with mode `0600`.
244
+ Set `EDGE_AGENT_REQUIRE_LOCAL_BYPASS_TOKEN=false` only if you fully
245
+ trust every process on the host.
246
+ - **TLS pinning**: optional SHA-256 pin of the peer certificate.
247
+ - **Audit**: every decision is logged. Revocation is immediate on the
248
+ next handshake.
249
+
250
+ ## Commercial deployment checklist
251
+
252
+ - [ ] Rotate `EDGE_AGENT_TOKEN_SECRET` per environment.
253
+ - [ ] Store `EDGE_AGENT_DATA_DIR` on persistent, encrypted storage.
254
+ - [ ] Ship `audit.jsonl` to central logging with retention policy.
255
+ - [ ] Enable TLS with a valid certificate; set
256
+ `EDGE_AGENT_CERTIFICATE_PIN_SHA256` for reverse tunnel.
257
+ - [ ] Restrict `edge-agent approve` to an admin-only host or CI job.
258
+ - [ ] Monitor `tofu_pending_queue_size`, `token_replay_rejections`,
259
+ `reverse_tunnel_reconnect_count`.
260
+ - [ ] Run `edge-agent revoke` on node decommission.
261
+ - [ ] Back up `trust_store.sqlite3` before upgrades.
262
+ - [ ] Pin Python and Node versions in CI.
263
+ - [ ] Publish PyPI and npm from tagged releases only.
264
+
265
+ ## Publishing
266
+
267
+ PyPI:
166
268
 
167
- wait -n
269
+ ```bash
270
+ python -m build
271
+ python -m twine check dist/*
272
+ python -m twine upload dist/*
168
273
  ```
169
274
 
170
- ### 场景 2:`docker-compose.yml` 极简部署
171
-
172
- #### 无公网 IP / 家用宽带 / NAT4(开启反向长连接):
173
- ```yaml
174
- version: '3.8'
175
-
176
- services:
177
- browser-node:
178
- image: your-browser-image:latest
179
- restart: unless-stopped
180
- ports:
181
- - "6080:6080" # 仅供内网访问桌面,公网无需暴露 9222
182
- environment:
183
- - HUB_URL=https://hub.yourdomain.com:8443
184
- - JOIN_TOKEN=hub_join_abcdef1234567890 # 可选:留空在控制台一键点击认领
185
- - REVERSE_TUNNEL=true # NAT4 穿透开关
186
- - NODE_GROUP=北美爬虫矩阵组
187
- volumes:
188
- - ./data:/data
189
- ```
275
+ npm (CLI wrapper):
190
276
 
191
- #### 拥有独立公网 IP 的云服务器(直连心跳上报):
192
- ```yaml
193
- version: '3.8'
194
-
195
- services:
196
- browser-node:
197
- image: your-browser-image:latest
198
- restart: unless-stopped
199
- ports:
200
- - "9222:9222" # 防火墙已开放端口
201
- environment:
202
- - HUB_URL=https://hub.yourdomain.com:8443
203
- - REVERSE_TUNNEL=false # 默认即为 false,仅发起轻量 HTTP 登记,零长连接开销
277
+ ```bash
278
+ cd npm
279
+ npm pack --dry-run
280
+ npm publish --access public
204
281
  ```
205
282
 
206
- ---
207
-
208
- ## 🔒 安全性考量
209
-
210
- 1. **防恶意伪造(SSRF 防御)**:在直连上报模式下,管理端强制从底层 TCP 握手来源直接锁定节点的真实来源 IP,杜绝假冒内网私网地址。
211
- 2. **防公网扫描冒充**:未携带 `JOIN_TOKEN` 的未知连接一律进入隔离待审核队列(TOFU),未经管理端管理员后台显式认领的节点,绝不参与任何数据交互。
212
- 3. **安全通信**:长连接反向通道强制基于 TLS (WSS) 传输,天然防御中间人窃听与数据篡改。
213
-
214
- ---
215
-
216
- ## 📄 License
283
+ ## License
217
284
 
218
- MIT License © 2026 [Wimotek](https://github.com/wimotek)
219
- ```
285
+ MIT. See `LICENSE`.
@@ -0,0 +1,23 @@
1
+ from .agent import EdgeAgent
2
+ from .config import Config
3
+ from .models import (
4
+ AccessDecision,
5
+ AccessDecisionResult,
6
+ ConnectionContext,
7
+ NodeRecord,
8
+ TrustStatus,
9
+ )
10
+ from .policy import AccessPolicyEngine
11
+ from .trust_store import TrustStore
12
+
13
+ __all__ = [
14
+ "EdgeAgent",
15
+ "Config",
16
+ "AccessDecision",
17
+ "AccessDecisionResult",
18
+ "ConnectionContext",
19
+ "NodeRecord",
20
+ "TrustStatus",
21
+ "AccessPolicyEngine",
22
+ "TrustStore",
23
+ ]