5RIndustries/darkhan

GitHub: 5RIndustries/darkhan

一个以安全为核心的 AI 代理指挥中心,通过证据校验与哈希链审计解决代理不可信问题。

Stars: 0 | Forks: 0

# Darkhan [![License: BSL 1.1](https://img.shields.io/badge/License-BSL%201.1-orange.svg)](LICENSE) [![Node.js 20+](https://img.shields.io/badge/Node.js-20%2B-green.svg)](https://nodejs.org) [![macOS](https://img.shields.io/badge/Platform-macOS-blue.svg)](https://www.apple.com/macos/) [![GitHub Discussions](https://img.shields.io/github/discussions/5RIndustries/darkhan)](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, 本地推理, 权限隔离, 自定义脚本, 证据核查, 防篡改