5RIndustries/darkhan
GitHub: 5RIndustries/darkhan
一个以安全为核心的 AI 代理指挥中心,通过证据校验与哈希链审计解决代理不可信问题。
Stars: 0 | Forks: 0
# Darkhan
[](LICENSE)
[](https://nodejs.org)
[](https://www.apple.com/macos/)
[](https://github.com/5RIndustries/darkhan/discussions)
**一个基于以下原则构建的 AI 代理指挥中心:代理在架构上无法撒谎。**
Darkhan 从一个可部署的 Node.js 服务器协调 AI 代理和人类。每个代理消息都会经过证据校验,每个操作都会通过哈希链记录到不可变的审计日志中,每个凭证都会与代理访问隔离。如果你的代理产生幻觉、编造或失控——你会知道,系统会将其关闭。
## 什么让 Darkhan 不同
大多数代理框架信任代理。Darkhan 不信任。
**代理证明其主张。** 代理做出的每个事实断言都会自动针对文件系统、心跳数据或真实值注册表进行验证。主张在到达你之前会被标记为 `verified`(已验证)、`unverified`(未验证)或 `self-reported`(自报)。
**不可变的审计日志。** 每个操作——LLM 调用、文件写入、Shell 命令、安全事件——都会记录到 SHA-256 哈希链中。SQLite 触发器防止删除或修改。你可以全程密码学验证整个链条。
**设计层面的凭证隔离。** 密码、API 密钥和 PIN 存储在独立的数据库中,代理工作单元永远无法获取其句柄。被破坏的代理无法读取凭证。
**身份强制。** 代理无法冒充人类或其他代理。尝试会被静默修正、记录并触发自动锁定。
**$0/天的本地 LLM。** 分类、筛选和常规代理工作在本地通过原生推理运行(Apple Silicon 上使用 node-llama-cpp 和 Metal GPU 加速)。默认使用 Qwen 2.5 7B——在任何配备 M 系列芯片和 16GB RAM 的 Mac 上均可流畅运行。支持四种云提供商(Google Gemini、Anthropic Claude、OpenAI GPT)用于更重的任务和跨提供商共识。你选择每个模型,你控制成本。
**行动-证据协议。** 每个工具调用都会产生系统捕获的证据(文件哈希、PID、退出码、搜索结果)。代理消息会根据其证据链进行评估并标记:verified(已验证)、partial(部分)、claimed(声称)或 contradicted(矛盾)。代理可以说任何话——证据链是不可变的。跨提供商验证会将证据链发送给两个独立的 LLM 进行共识。
**观察-证据协议。** 系统观察(进程状态、资源压力、行为模式)会记录信号与解释分离,并强制提供替代解释。置信度根据信号数量计算,而非自我评估。
**跨机器联邦。** 在多个节点上运行工作单元,单一中心控制。工作单元在本地或远程使用相同代码——运行时透明处理差异。
**对抗性测试。** 在公开发布前,Darkhan 接受了结构化对抗测试:8 类(社交工程、权威压力、多语言攻击、竞争情报 framing 等)共 32 个语义注入载荷。两个 LLM 共识流水线成功阻止或隔离了 100% 的载荷。完整方法论与结果:[对抗性测试报告](docs/ADVERSARIAL-TESTING-REPORT.md)。
## 快速开始
**要求:** Node.js 20.12+、npm、16GB+ 内存、Ollama(用于本地 LLM 模型文件)
```
# 克隆仓库
git clone https://github.com/5RIndustries/darkhan.git
cd darkhan
# 运行交互式设置向导
node setup.js
```
安装向导会处理一切:检查前置条件、创建 `.env` 和配置、复制所选代理的示例工作单元、拉取本地 LLM、初始化数据库、清理旧运行的数据库残留,并启动服务器。它会自动检测系统时区,默认为进程内工作单元(非 fork),并在服务器就绪时自动打开浏览器(macOS 和 Linux)。
**首次登录:** 默认密码为 `changeme`。首次登录时,Darkhan 会强制你通过门控流程——必须更改密码,然后设置锁定 PIN。在完成这两步之前无法访问应用。无需手动查找设置。
如需手动设置、Ollama 配置、launchd 自动启动和多节点联邦,请参见 [SETUP.md](SETUP.md)。
## 架构
```
┌───────────────────────────────────────────┐
│ Darkhan Web UI │
├──────────┬──────────┬─────────────────────┤
│ Channels │ Terminal │ Dashboard/Folio/... │
└────┬─────┴────┬─────┴─────────────────────┘
│ │
Socket.IO Socket.IO /terminal
│ │
┌───────────┴──────────┴───────────┐
│ Darkhan Server │
│ │
│ ┌─────────────────────────────┐ │
│ │ UnifiedClaudeSession │ │
│ │ (one Claude per user, │ │
│ │ shared across terminal │ │
│ │ and chat interfaces) │ │
│ └─────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌───────────────┐ │
│ │ Workers │ │ Terminal Relay │ │
│ │ (agents) │ │ (PTY/SDK) │ │
│ └──────────┘ └───────────────┘ │
│ │
│ Security ─ Evidence ─ Hash Chain │
└───────────────────────────────────┘
```
```
darkhan/
server/
server.js # Express app entry point
darkhan.config.json # Team config: agents, humans, channels, schedules, permissions
.env # Secrets (never committed)
db/ # SQLite databases (darkhan.db + secrets.db)
routes/ # REST API (auth, messages, tasks, health, folio, security)
services/ # Core services (see below)
workers/ # Agent worker definitions (your agents live here)
middleware/ # Auth, identity enforcement
break-glass.js # Emergency admin recovery (TTY-only)
scripts/ # Secret scanner, service user setup, cert generation
client/ # Web UI (vanilla JS, dark theme, PWA)
terminal-popout.html # Pop-out terminal window for multi-monitor setups
scripts/ # Pre-commit hook, install helpers
.github/workflows/ # CI pipeline (lint, audit, secret scan, smoke test)
.npmignore # Defensive publish filter (prevents Anthropic-class leaks)
```
**核心服务:**
| 服务 | 用途 |
|------|------|
| `llm.js` | 统一 LLM 接口(Ollama、Gemini、Anthropic、OpenAI),带自动速率限制和成本追踪 |
| `action-evidence.js` | 行动-证据协议——15 动词受控词汇、系统捕获证据、自动主张降级、跨提供商主张验证 |
| `observation-evidence.js` | 观察-证据协议——系统观察的信号与解释分离、强制替代解释、置信度评分 |
| `security.js` | 注入检测、身份强制、泄漏预防、自动锁定 |
| `integrity.js` | 文件哈希监控、配置校验和、篡改检测 |
| `activity-log.js` | 不可变哈希链审计日志(含 CRISPR 防御间隔) |
| `evidence.js` | 基于 SHA-256 哈希的证据报告 |
| `claim-verifier.js` | 每个代理消息自动验证并打标签 |
| `ground-truth.js` | 已验证事实的规范注册表、矛盾检测 |
| `onboarding.js` | 在每个代理启动时注入已验证的身份与规则 |
| `worker-runtime.js` | 定时调度、任务执行、监听器分发、Google Workspace 工具、完整活动日志 |
| `unified-claude.js` | 在终端与聊天界面间共享单个 Claude 会话 |
| `terminal-relay.js` | 浏览器中 Claude Code 与 Shell 终端的 WebSocket 中继 |
| `auto-responder.js` | 两级消息路由:本地 LLM 筛选,然后云升级,统一会话桥接、斜杠命令 |
| `review-gate.js` | 可选输出验证——本地 LLM 在发布前审查 Claude 响应中的未验证主张与幻觉 |
| `federated-runtime.js` | 分布式工作单元的跨节点 HTTP 联邦 |
| `sandbox.js` | macOS 原生进程隔离(sandbox-exec 配置文件) |
| `tool-executor.js` | 注入扫描与速率限制的沙箱工具执行 |
| `cost-tracker.js` | 每代理 token 与成本会计(整型毫分) |
| `rate-limiter.js` | 两级速率限制(每提供商、每代理) |
| `secrets-crypto.js` | AES-256-GCM 加密静态存储的 API 密钥,HMAC 索引查找 |
| `session-store.js` | 自定义 SQLite 会话存储(取代 connect-sqlite3 以消除传递漏洞链) |
| `maintenance.js` | 启动清理、孤儿进程检测、过期心跳清理、每日数据库维护 |
| `behavioral-baseline.js` | 每代理异常检测:消息、LLM、Shell、频道的滚动 24 小时基线 |
| `instance-identity.js` | 每实例 Ed25519 密钥对,消息签名以支持联邦 |
| `model-verifier.js` | 验证本地 Ollama 模型文件与清单的 SHA-256 |
| `agent-relay.js` | Claude Agent SDK 中继,带程序化工具门控与会话持久化 |
| `keychain.js` | macOS Keychain 集成,用于第 3 层凭证存储 |
| `permissions.js` | 权限管理,含文件路径允许/拒绝列表 |
| `telegram.js` | 可选的 Telegram 桥接,供外部利益相关者通信 |
| `worker-process.js` | 带 IPC 协议的 fork 工作代理子进程处理器 |
## 安全模型
安全是基础,而非附加。Darkhan 假设一个敌对环境,其中通过消息链的提示注入是主要攻击向量。
### 威胁模型
Darkhan 设计用于防御以下攻击:
1. **提示注入**——试图劫持代理行为的外部内容(角色覆盖、指令重置、代理社交工程)
2. **级联注入**——被妥协或操纵的代理通过通道系统向其他代理注入指令
3. **基于编码的规避**——隐藏在 Base64、Unicode 控制字符、隐形字符、RTL 覆盖或 HTML 注释中的注入
4. **凭证窃取**——代理或被注入内容试图读取或泄露 API 密钥、密码或数据库内容
5. **信任级别伪造**——客户端提供的头部试图提升消息信任分类
6. **工具滥用**——失控或被操纵的代理耗尽资源、删除文件或进行未经的网络连接
7. **前沿模型对手**——比两个分类器更强大的代理,针对单个 LLM 精心构造注入以欺骗
8. **“有用”代理绕过**——非恶意的目标导向代理为高效完成任务而绕过安全控制。这是新型威胁:代理并非攻击系统,而是在帮助用户绕过障碍。Darkhan 通过架构约束(HMAC 锚定、部署模式、联邦门)应对此类问题,这些约束无法被绕过。
我们**不声称**能防御以下情况:
- 拥有主机机器 shell 访问权限并知晓服务用户密码的人类攻击者
- 对我们依赖项(npm 包、Ollama、Node.js 本身)的供应链攻击——尽管我们在 CI 中通过 `npm audit`、预提交钩子和依赖审计进行缓解(参见 [RELEASE-CHECKLIST.md](RELEASE-CHECKLIST.md))
- 针对本地 LLM 的旁路攻击(为特定 Ollama 模型量身定制的对抗性 token 序列)
- 两个云 LLM 提供商同时返回被操纵的分类结果
- 人类管理员的社会工程(如果管理员被诱骗执行恶意命令,Darkhan 无法干预)
### 扫描流水线
每条消息在到达代理或存储之前都会流经安全流水线:
```
Message arrives
│
├─ Human internal message (scanHumanMessages: false)
│ → regex pattern scan → allow/flag
│
├─ Human internal message (scanHumanMessages: true)
│ → full pipeline below (defends against session hijacking)
│
└─ External / Agent / Federated message:
│
├─ 1. Content normalization
│ Strip Unicode control chars, zero-width chars, RTL overrides,
│ HTML comments. Decode and scan base64 blocks.
│
├─ 2. Regex pattern scan
│ 30+ injection patterns checked against normalized text
│ AND decoded base64 content. Critical match → block.
│
├─ 3. Two-LLM consensus classification
│ Local Ollama AND cloud Gemini/Anthropic/OpenAI both classify the
│ message independently. Both must agree SAFE.
│ Disagreement → quarantine for human review.
│
└─ 4. Action
allow (both classifiers + patterns agree safe)
flag (single classifier available, marked safe)
quarantine (classifier disagreement — human must review)
block (critical pattern match or both classifiers agree threat)
```
代理到代理的消息会经过完整流水线,而不只是外部消息。这会关闭级联注入向量——被妥协的代理通过通道消息污染其他代理。
所有扫描都通过单个 `sanitizeMessage()` 入口点。没有并行或重复的扫描路径——每条消息都使用相同的流水线与相同的决策逻辑。
### 防御层级
**输入/输出扫描**
- 所有传入消息的 Regex + 本地 LLM 分类
- 内容规范化:在扫描前剥离编码技巧(Unicode 控制字符、隐形字符、RTL 覆盖、HTML 注释、Base64 解码后扫描)
- 外部与代理来源消息的双 LLM 共识(本地 Ollama + 云提供商必须一致——支持跨公司独立性)
- 行动-证据协议:15 动词受控词汇、系统捕获证据、自动主张降级、跨提供商验证
- 观察-证据协议:信号与解释分离,强制替代解释与置信度评分
- 自动权限边界检测:当代理访问敏感资源时系统会标记
- 在 `fs.read()` 与 `shell.exec()` 前的工具输出注入扫描
- 出站泄漏预防扫描 API 密钥、密码、私钥
**代理隔离**
- 每代理文件写入权限(代理只能写入指定目录)
- Shell 命令限制:两种模式——默认黑名单(阻止已知危险命令);Mythos 硬化模式(仅允许明确列出的命令)
- 工具调用速率限制(每任务读取 200 次、写入 50 次、Shell 执行 10 次)
- 默认拒绝网络出口(仅允许 Ollama、Gemini API、OpenAI API)
- 环境变量白名单:工作 Shell 进程与交互式终端 PTY 会话(密钥永不暴露)
- 通过 `fork()` 的进程隔离与 IPC 通信
- 工作单元数据最小化(不获取主机名、平台、端口或其他代理的 LLM 细节)
**信任验证**
- 证据驱动报告:SHA-256 哈希将主张绑定到其验证方法与结果
- 真实值注册表:自动矛盾检测
- 主张验证器:每个代理消息存储前打标签
- LLM 模型文件完整性验证(启动时)
- 模型版本标记:每个 LLM 调用都记录模型 + 摘要到活动追踪
- 消息信任级别:`human_verified`、`agent_local`、`agent_federated`、`external`、`quarantined`——由服务端根据认证方法确定,客户端头部无法影响分配
- Ed25519 实例身份与加密消息签名
**异常检测**
- 每代理行为基线:滚动 24 小时平均值(消息、LLM 调用、Shell 执行、文件写入、活跃频道、活跃时段)
- 3 倍偏差触发异常告警
- 基线每日 02:00 ET 更新;需 3 天以上数据才视为可靠
**完整性加固**
- 密码学基线锚定(HMAC-SHA256)——基线文件篡改检测,数据库锚点支撑
- 首次启动 vs 基线删除检测——删除基线文件会触发锁定而非重新信任
- 部署模式(`node server.js --deploy`)——带锁定 PIN 的人类认证基线重置
- Ed25519 私钥隔离——签名密钥存于 `secrets.db`,工作单元无法访问
- 联邦门——默认拒绝所有联邦流量,除非显式设置 `FEDERATION_APPROVED_PEERS`
- 节点出生证明——配置时记录来源数据,用于联邦信任决策
- 代理安全约束在启动时注入——架构层面限制代理可修改的内容
**审计与恢复**
- 完整活动日志:每条用户消息、Claude 响应、工具调用、LLM 请求、文件读/写、Shell 命令、权限决策都记录到不可变哈希链
- 不可变哈希链与 CRISPR 防御间隔(标记安全事件)
- 文件完整性监控(SHA-256 基线,每 5 分钟验证一次)
- 自动锁定:冒充、重复注入、数据泄露或完整性违规时触发
- 仅人类可通过 PIN 解锁(代理在架构上无法解除锁定)
- 紧急恢复工具需交互式 TTY + PIN
- 密码恢复:通过管理员生成的一次性令牌(无需邮件)
**磁盘加密**
- API 密钥使用 AES-256-GCM 在 secrets.db 中加密存储,HMAC 索引查找
- 加密密钥通过 HKDF 从 SESSION_SECRET 派生
- 启动时自动迁移明文密钥
### 3 层凭证加固
| 层级 | 机制 |
|------|------|
| 1 | 紧急恢复需交互式 TTY——阻止脚本或自动化访问 |
| 2 | `_darkhan` 服务用户拥有敏感文件;应用代码以独立账户运行 |
| 3 | macOS Keychain 完全在文件系统外存储密钥 |
### 执行层级
用户通过三种执行层级控制代理自主度,可随时更改:
| 层级 | 预先批准 | 需批准 |
|------|----------|--------|
| **监督**(默认) | 读操作 | 所有写入、编辑、命令 |
| **操作** | 读 + 代码编辑、文件写入、命令 | 安全敏感操作 |
| **自主** | 除安全外的所有操作 | 凭证访问、认证、管理操作 |
**安全边界是架构层面的,而非策略。** 所有涉及凭证、认证、管理操作或直接数据库访问的操作始终需要人工批准——即使在自主模式下也是如此。工具调用按工具名称与输入内容分类:`Bash` 读取日志是“写入”,但读取 `secrets.db` 则是“安全”。
更改在下一个 Claude 会话生效。所有层级变更与自动批准都会记录到不可变审计日志。
### 锁定
安全事件会触发自动锁定。所有代理流量停止。仅人类管理员可通过 Web UI 与 PIN 解锁。锁定状态带有 HMAC 签名——数据库篡改会导致系统故障安全(保持锁定)。
更多细节请参见 [SECURITY.md](SECURITY.md)。
## 功能特性
**代理与工作单元**
- 将代理定义为带有定时任务与消息监听器的 JavaScript 模块
- 工作单元从运行时接收 `llm`、`darkhan`、`tools`、`observe`、`evidence`、`config`、`log` 接口
- Cron 调度、错误隔离、超时强制
- 顺序执行(单个工作单元内)与并行执行(跨工作单元)
- 启动时注入已验证身份到每个 LLM 调用
**通信**
- 基于频道的消息(为任意目的创建频道)
- 实时 WebSocket 更新(Socket.IO)
- 自动响应器:两级路由——本地 LLM 筛选,然后云升级
- 可选 Telegram 桥接,供外部利益相关者使用
**集成终端**
- 通过 xterm.js + node-pty 在 Darkhan Web UI 中提供完整的 Claude Code 会话
- 通用 Shell 终端(bash/zsh)用于系统命令、SSH 与管理
- 统一的 Claude 会话:终端与聊天共享同一 Claude 进程与上下文
- Claude 的终端工作会通过频道广播,让代理与人类看到正在发生的内容
- 分屏终端观察器:可在侧边栏实时观看正在运行的 Claude 会话
- 多显示器支持(可将终端拖至第二屏)
- 每用户层级(监督/操作/自主)与硬安全边界
- 可配置的权限模式,智能路由(终端打开时提示,否则通知聊天)
- 会话持久化,页面刷新后保留 120 秒宽限期
- 所有终端会话事件与交互记录到不可变哈希链审计日志
**LLM 支持**
- 本地原生推理(node-llama-cpp,$0):默认 Qwen 2.5 7B(在任意 16GB+ Apple Silicon Mac 上运行),8GB 机器支持 3B,或通过 Ollama 清单支持任意 GGUF 模型。Apple Silicon 上使用 Metal GPU 加速。
- Google Gemini:按用量付费用于工作单元
- Anthropic Claude:按用量付费用于战略任务
- OpenAI ChatGPT:按用量付费用于工作单元与共识
- 每代理可配置速率限制(设置 `requestsPerDay: 0` 表示无限制)
- 两级速率限制:每提供商全局限制与每代理限制
- 每代理成本追踪明细
**知识库(Folio)**
- 支持 Markdown 渲染的文件浏览器
- 全文搜索 Folio 内容
- 通过 API 与 Web UI 创建、编辑、删除文件
- 每代理写入权限
**Web UI**
- 纯 JS 单页应用,无框架依赖,暗色主题
- 频道、任务、代理健康仪表板、Folio 浏览器、成本报告
- 集成 Claude Code 与 Shell 终端,支持分屏弹出窗口
- 管理设置:锁定控制、密码管理、PIN 设置、执行层级控制
- PWA,支持 Service Worker
**联邦**
- 中心 + 远程工作单元架构
- 远程与本地使用相同代码
- 通过每代理 API 密钥认证
- 支持 mTLS 进行节点间加密
- CRISPR 防御间隔传播到联邦实例
**会话连续性**
- 自动频道转录:每 30 分钟将逐字对话捕获到 `docs/transcripts/`
- 每日一个文件(`Transcript_YYYY-MM-DD.md`),移除代码块,按频道组织
- 智能写入:若无新消息则跳过(避免夜间冗余写入)
- 新 Claude 会话读取当日与昨日转录以在启动时获得完整上下文
- 会话轮换:每 50 条消息轮换以保持上下文精简
- 转录文件位于 `docs/`(而非 `server/`)——写入不会触发完整性锁定
- 人类用户也可向 `docs/` 添加注释,供代理与团队成员参考
**运维卫生**
- 启动时自动清理:PID 跟踪、孤儿进程检测、过期心跳清理
- 每日维护周期:数据库 VACUUM、过期会话清理、活动日志修剪、死工作单元检测
- 通过 API (`POST /api/health/maintenance`) 触发的管理维护
- 预提交钩子阻止密钥、Source Map、数据库文件、私钥及大文件
- CI 流水线:`npm audit`、密钥扫描、Source Map 拦截、语法检查、冒烟测试
- 发布清单与持续评估流程(参见 [RELEASE-CHECKLIST.md](RELEASE-CHECKLIST.md))
**可观测性**
- 代理健康仪表板(绿/黄/红状态灯)
- 带有哈希链验证 API 的活动日志
- 按代理、提供商、模型与日期的成本追踪
- 工作单元状态与最后运行报告
- 安全事件摘要 API
## 编写工作单元
工作单元是 `server/workers/` 目录下的 JavaScript 模块。以下是最简结构:
```
module.exports = {
id: 'agent_myagent', // Must match an entry in darkhan.config.json
name: 'My Agent',
async onLoad({ darkhan, log }) {
log.info('Worker loaded');
await darkhan.post('chan_coordination', 'My Agent online.');
},
tasks: {
my_task: {
schedule: '0 */4 * * *', // Every 4 hours
timeout: 300000,
async run({ llm, darkhan, tools, log }) {
const data = await tools.fs.read('project/status.md');
const result = await llm.complete({
messages: [{ role: 'user', content: `Summarize: ${data}` }],
});
await darkhan.post('chan_coordination', result.response);
}
}
},
listeners: {
comms_check: {
patterns: [/^comms?\s*check$/i],
timeout: 15000,
async run({ darkhan }, { channelId }) {
await darkhan.post(channelId, 'Standing by.');
}
}
}
};
```
将代理添加到 `darkhan.config.json`,重启 Darkhan,工作单元会自动加载。
如需完整运行时契约——接口、权限、错误处理、测试、联邦——请参见 [WORKER-CONTRACT.md](WORKER-CONTRACT.md)。
## API 概览
所有端点均需通过会话 Cookie 或 `X-API-Key` 头部进行认证。
| 区域 | 关键端点 |
|------|----------|
| 认证 | `POST /api/auth/login`、`/logout`、`/change-password`、`/set-lockdown-pin`、`GET/POST /api/auth/execution-tier` |
| 消息 | `GET /api/messages`、`POST /api/messages` |
| 任务 | `GET /api/tasks`、`POST /api/tasks`、`PATCH /api/tasks/:id` |
| 健康 | `GET /api/health/status`、`POST /api/health/ping`、`GET /api/workers`、`POST /api/health/maintenance`(管理员)、`GET /api/health/maintenance` |
| 终端 | `GET /api/terminal`(活跃会话状态) |
| 知识库 | `GET /api/folio/tree`、`GET /api/folio/file`、`PUT /api/folio/file`、`GET /api/folio/search` |
| 安全 | `GET /api/security`、`POST /api/security/lockdown`、`POST /api/security/unlock` |
| 活动 | `GET /api/activity`、`GET /api/activity/chain-head`、`GET /api/activity/stats` |
| 真实值 | `GET /api/ground-truth`、`POST /api/ground-truth`、`POST /api/ground-truth/check` |
| 上下文 | `GET /api/context/brief`、`GET /api/context/state`、`GET /api/context/transcript`、`GET/POST /api/context/settings` |
| 成本 | `GET /api/costs/daily`、`GET /api/costs/total` |
WebSocket 命名空间:
- `/`——频道消息、任务更新、代理健康(`new_message`、`task_update`、`agent_health`、`delete_message`)
- `/terminal`——Claude Code 与 Shell 终端会话(`terminal:spawn`、`terminal:output`、`terminal:input`、`terminal:exit`)
## 部署
**单节点(本地)**——一台机器运行服务器与所有工作单元:
```
cd server && node server.js
```
**单节点(VPS)**——在 $5 虚拟服务器上部署并启用自动 HTTPS:
```
# 位于 Caddy 反向代理之后(推荐)
DARKHAN_TRUST_PROXY=true DARKHAN_HTTPS=true \
DARKHAN_ALLOWED_ORIGINS=https://your-domain.com \
node server.js
```
Darkhan 检测到无 TLS 的外部暴露并在启动时发出警告。IP 登录速率限制、WebSocket 来源验证与安全 Cookie 标志会自动激活。完整 VPS 加固指南请参见 [SECURITY.md](SECURITY.md#vps-deployment-hardening)。
**多节点(联邦)**——一个中心节点,远程工作单元部署在其他机器上:
1. 中心节点运行 `server.js`(数据库、Web UI、本地工作单元)
2. 远程节点运行 `remote-runner.js`(工作单元通过 HTTP API 向中心提交结果)
3. 节点通过 Tailscale 或任意私有网络连接(支持无 VPN 的 mTLS 加密)
启动配置、服务用户设置与 Keychain 配置请参见 [SETUP.md](SETUP.md)。
## 平台支持
| 平台 | 状态 |
|------|------|
| macOS(Apple Silicon) | 支持——完整功能集(含原生沙箱) |
| macOS(Intel) | 支持 |
| Linux VPS | 支持——除 macOS 原生沙箱(sandbox-exec)外的全部功能 |
| Linux 桌面 | 支持——与 VPS 相同,可添加 Ollama 用于本地 LLM |
| Windows | 计划中 |
## 贡献
请参见 [CONTRIBUTING.md](CONTRIBUTING.md) 获取指南。
**安全漏洞:** 请勿公开提交问题。请通过 [SECURITY.md](SECURITY.md) 邮件地址进行负责任披露。
## 许可证
Darkhan 根据 [商业源码许可 1.1](LICENSE) 授权。
- **非生产用途免费**——内部使用、开发与评估
- **生产用途**——需要从许可方购买商业许可
- 许可代码在指定变更日期后转换为完全开源许可证(Apache 2.0)
企业联邦功能用于连接多个 Darkhan 实例,提供独立的 [Mokume](https://mokume.ai) 产品,具备 14B 跨节点安全监控、消息路由与企业态势感知能力。
## 背景
名称源自蒙古/突厥语:**darkhan** 指技艺精湛的工匠,其技能赢得自主权。锻造场是工匠工作的地方位团队成员——无论人类还是代理——都是拥有特定专长的工匠。Darkhan 是协调他们的锻造场。
由 [5R Industries LLC](https://github.com/5RIndustries) 构建。从 2026 年五次内部迭代演进而来,从零开始以安全为基石重新构建。
标签:AI 代理, AI安全, AI风险缓解, Apple Silicon, Chat Copilot, GNU通用公共许可证, Ground Truth, Hash Chain, Metal GPU, MITM代理, Node.js, Node.js 20, node-llama-cpp, SHA-256, SQLite, 不可变审计追踪, 凭证隔离, 去中心化安全, 可信AI, 地面真值验证, 平台, 指挥中心, 本地LLM, 本地推理, 权限隔离, 自定义脚本, 证据核查, 防篡改