This commit is contained in:
heming 2026-04-24 18:24:18 -05:00 committed by GitHub
commit f465212f98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 2050 additions and 594 deletions

436
README_CN.md Normal file
View file

@ -0,0 +1,436 @@
# Hermes Agent - 自进化 AI 代理
<p align="center">
<img src="assets/banner.png" alt="Hermes Agent" width="100%">
</p>
## 简介
**Hermes Agent** 是由 [Nous Research](https://nousresearch.com) 开发的自进化 AI 代理工具。它是唯一内置学习循环的代理系统——能够从经验中创建技能、在使用过程中改进技能、自主保留知识、搜索历史对话,并在多会话中建立对用户的深度理解模型。
你可以在 $5 VPS、GPU 集群或几乎无空闲成本的无服务器基础设施上运行它。它不局限于你的笔记本电脑——你可以在云端 VM 上运行它,同时通过 Telegram 与它对话。
## 核心特性
### 🔄 闭环学习系统
- **自主技能创建**:完成复杂任务后自动创建技能
- **技能自改进**:在使用过程中持续优化技能
- **智能记忆管理**:定期提示保存知识
- **跨会话搜索**FTS5 会话搜索 + LLM 摘要,实现跨会话回忆
- **用户建模**:兼容 [Honcho](https://github.com/plastic-labs/honcho) 辩证用户建模
- **开放标准**:支持 [agentskills.io](https://agentskills.io) 开放技能标准
### 💬 多平台支持
- **CLI 交互**:完整的 TUI终端 UI支持多行编辑、斜杠命令自动补全、对话历史、中断重定向、流式工具输出
- **消息平台**Telegram、Discord、Slack、WhatsApp、Signal、Email、Home Assistant 等——所有平台共享同一网关进程
- **语音支持**:语音备忘录转录、跨平台对话连续性
### ⏰ 定时自动化
- **内置 Cron 调度器**:支持任何平台的任务投递
- **自然语言任务**:每日报告、夜间备份、每周审计——全部用自然语言配置,无人值守运行
### 🤖 代理委派与并行
- **子代理委派**:生成独立的子代理处理并行工作流
- **RPC 脚本调用**:编写通过 RPC 调用工具的 Python 脚本,将多步骤流水线压缩为零上下文成本的轮次
### 🌍 无处不在的运行环境
- **六种终端后端**本地、Docker、SSH、Daytona、Singularity、Modal
- **无服务器持久化**Daytona 和 Modal 提供无服务器持久化——代理环境在空闲时休眠,按需唤醒,会话间几乎无成本
- **灵活部署**:在 $5 VPS 或 GPU 集群上运行
### 🧪 研究就绪
- **批量轨迹生成**
- **Atropos RL 环境**
- **轨迹压缩**:用于训练下一代工具调用模型
### 🔌 模型无关
支持任何你想用的模型:
- [Nous Portal](https://portal.nousresearch.com)
- [OpenRouter](https://openrouter.ai)200+ 模型)
- [NVIDIA NIM](https://build.nvidia.com)Nemotron
- [小米 MiMo](https://platform.xiaomimimo.com)
- [z.ai/GLM](https://z.ai)
- [Kimi/Moonshot](https://platform.moonshot.ai)
- [MiniMax](https://www.minimax.io)
- [Hugging Face](https://huggingface.co)
- OpenAI、Anthropic
- 或你自己的端点
使用 `hermes model` 切换模型——无需代码更改,无锁定。
---
## 安装指南
### 方式一:标准安装(网络畅通)
```bash
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
```
支持 Linux、macOS、WSL2 和 AndroidTermux
### 方式二:本地安装(适合中国用户或离线环境)
如果你在中国或网络环境无法访问 GitHub可以使用以下方法
**步骤 1下载代码**
- 从 GitHub 下载 ZIP 或使用镜像站下载
- 或使用 Git 镜像克隆
**步骤 2使用本地安装模式**
```bash
# 进入下载的代码目录
cd /path/to/hermes-agent
# 使用 --local 模式安装,指定已下载的目录
bash install.sh --local --dir /path/to/hermes-agent
```
**安装选项说明:**
| 选项 | 说明 |
|------|------|
| `--local` | 使用本地目录,跳过 git clone |
| `--dir PATH` | 指定安装目录路径 |
| `--no-venv` | 不创建虚拟环境 |
| `--skip-setup` | 跳过交互式设置向导 |
| `--hermes-home PATH` | 指定数据目录(默认:~/.hermes |
**完整示例:**
```bash
# 假设你已将代码下载到 /home/user/hermes-agent
cd /home/user/hermes-agent
# 使用本地目录安装
bash install.sh --local --dir /home/user/hermes-agent
# 或者跳过设置向导(适合自动化部署)
bash install.sh --local --dir /home/user/hermes-agent --skip-setup
```
### 方式三:开发者安装(已克隆仓库)
如果你是开发者,已经克隆了仓库:
```bash
cd hermes-agent
./setup-hermes.sh
```
### Windows 用户
原生 Windows 不支持。请安装 [WSL2](https://learn.microsoft.com/zh-cn/windows/wsl/install) 然后使用上述方式。
---
## 快速入门
### 安装后步骤
```bash
# 重新加载 shell 配置
source ~/.bashrc # 或 source ~/.zshrc
# 开始对话
hermes
```
### 常用命令
| 命令 | 说明 |
|------|------|
| `hermes` | 启动交互式 CLI开始对话 |
| `hermes model` | 选择 LLM 提供商和模型 |
| `hermes tools` | 配置启用哪些工具 |
| `hermes config set` | 设置单个配置值 |
| `hermes gateway` | 启动消息网关Telegram、Discord 等) |
| `hermes setup` | 运行完整设置向导(一次配置所有) |
| `hermes update` | 更新到最新版本 |
| `hermes doctor` | 诊断任何问题 |
### 斜杠命令速查
无论是 CLI 还是消息平台,以下斜杠命令都可用:
| 命令 | 说明 |
|------|------|
| `/new``/reset` | 开始新对话 |
| `/model [provider:model]` | 切换模型 |
| `/personality [name]` | 设置个性 |
| `/retry`, `/undo` | 重试或撤销上一轮 |
| `/compress`, `/usage`, `/insights` | 压缩上下文、查看使用情况、洞察 |
| `/skills``/<skill-name>` | 浏览技能 |
| `/stop` | 中断当前工作(消息平台) |
| `/platforms` | 平台特定状态CLI |
| `/status`, `/sethome` | 状态、设置主目录(消息平台) |
---
## 项目架构
### 项目结构
```
hermes-agent/
├── run_agent.py # AIAgent 类 — 核心对话循环
├── model_tools.py # 工具编排discover_builtin_tools(), handle_function_call()
├── toolsets.py # 工具集定义_HERMES_CORE_TOOLS 列表
├── cli.py # HermesCLI 类 — 交互式 CLI 编排器
├── hermes_state.py # SessionDB — SQLite 会话存储FTS5 搜索)
├── agent/ # 代理内部模块
│ ├── prompt_builder.py # 系统提示词构建
│ ├── context_compressor.py # 自动上下文压缩
│ ├── prompt_caching.py # Anthropic 提示词缓存
│ ├── auxiliary_client.py # 辅助 LLM 客户端(视觉、摘要)
│ ├── model_metadata.py # 模型上下文长度、token 估算
│ ├── display.py # KawaiiSpinner、工具预览格式化
│ └── skill_commands.py # 技能斜杠命令CLI/网关共享)
├── hermes_cli/ # CLI 子命令和设置
│ ├── main.py # 入口点 — 所有 `hermes` 子命令
│ ├── config.py # DEFAULT_CONFIG、OPTIONAL_ENV_VARS、迁移
│ ├── commands.py # 斜杠命令定义 + SlashCommandCompleter
│ ├── setup.py # 交互式设置向导
│ ├── skin_engine.py # 皮肤/主题引擎 — CLI 视觉定制
│ ├── skills_config.py # `hermes skills` — 按平台启用/禁用技能
│ ├── tools_config.py # `hermes tools` — 按平台启用/禁用工具
│ └── auth.py # 提供商凭证解析
├── tools/ # 工具实现(每个工具一个文件)
│ ├── registry.py # 中央工具注册表schema、handler、dispatch
│ ├── terminal_tool.py # 终端编排
│ ├── file_tools.py # 文件读写/搜索/补丁
│ ├── web_tools.py # Web 搜索/提取Parallel + Firecrawl
│ ├── browser_tool.py # 浏览器自动化
│ ├── mcp_tool.py # MCP 客户端(约 1050 行)
│ └── environments/ # 终端后端local、docker、ssh、modal、daytona、singularity
├── gateway/ # 消息平台网关
│ ├── run.py # 主循环、斜杠命令、消息分发
│ ├── session.py # SessionStore — 对话持久化
│ └── platforms/ # 适配器telegram、discord、slack、whatsapp、homeassistant、signal、qqbot
├── ui-tui/ # InkReact终端 UI — `hermes --tui`
│ ├── src/entry.tsx # TTY 入口 + render()
│ ├── src/app.tsx # 主状态机和 UI
│ └── src/components/ # Ink 组件品牌、Markdown、提示、选择器等
├── tui_gateway/ # TUI 的 Python JSON-RPC 后端
│ ├── entry.py # stdio 入口点
│ ├── server.py # RPC 处理器和会话逻辑
│ └── slash_worker.py # 斜杠命令的持久 HermesCLI 子进程
├── acp_adapter/ # ACP 服务器VS Code / Zed / JetBrains 集成)
├── cron/ # 调度器jobs.py、scheduler.py
├── tests/ # Pytest 测试套件(约 3000 个测试)
└── batch_runner.py # 并行批量处理
```
### 核心架构
#### 文件依赖链
```
tools/registry.py (无依赖 — 被所有工具文件导入)
tools/*.py (每个在导入时调用 registry.register())
model_tools.py (导入 tools/registry + 触发工具发现)
run_agent.py, cli.py, batch_runner.py, environments/
```
#### AIAgent 核心循环
核心循环在 `run_conversation()` 中,完全同步:
```python
while api_call_count < self.max_iterations and self.iteration_budget.remaining > 0:
response = client.chat.completions.create(model=model, messages=messages, tools=tool_schemas)
if response.tool_calls:
for tool_call in response.tool_calls:
result = handle_function_call(tool_call.name, tool_call.args, task_id)
messages.append(tool_result_message(result))
api_call_count += 1
else:
return response.content
```
消息遵循 OpenAI 格式:`{"role": "system/user/assistant/tool", ...}`。推理内容存储在 `assistant_msg["reasoning"]` 中。
#### CLI 架构
- **Rich** 用于横幅/面板,**prompt_toolkit** 用于带自动补全的输入
- **KawaiiSpinner** (`agent/display.py`) — API 调用期间的动画表情,工具结果的 `┊` 活动馈送
- `load_cli_config()` 合并硬编码默认值 + 用户配置 YAML
- **皮肤引擎** (`hermes_cli/skin_engine.py`) — 数据驱动的 CLI 主题化
- `process_command()` 根据从中央注册表 `resolve_command()` 解析的规范名称调度
---
## 学习路径
### 新手入门
1. **安装并运行**
- 按照安装指南完成安装
- 运行 `hermes setup` 配置 API 密钥
- 输入 `hermes` 开始第一次对话
2. **理解基本概念**
- 阅读 `AGENTS.md` 了解项目结构
- 查看 `run_agent.py` 理解核心循环
- 了解工具系统如何工作
3. **尝试常用功能**
- 使用文件工具读取和编辑文件
- 尝试终端工具执行命令
- 体验技能系统
### 进阶学习
1. **工具开发**
- 学习 `tools/registry.py` 的注册机制
- 参考现有工具(如 `tools/file_tools.py`
- 理解工具集toolsets的概念
2. **技能系统**
- 了解技能如何存储在 `~/.hermes/skills/`
- 学习如何创建和使用技能
- 理解技能与工具的区别
3. **消息网关**
- 配置 Telegram/Discord 机器人
- 理解网关架构
- 学习平台适配器开发
### 高级开发
1. **核心修改**
- 修改 `run_agent.py` 的对话循环
- 扩展 `model_tools.py` 的工具编排
- 自定义提示词构建器
2. **插件开发**
- 学习内存插件系统(`plugins/memory/`
- 理解 MCP 集成
- 开发自定义工具集
3. **研究与训练**
- 使用 `environments/` 进行 RL 训练
- 轨迹压缩与模型训练
- 批量轨迹生成
---
## 配置说明
### 配置文件位置
| 文件 | 路径 | 说明 |
|------|------|------|
| 主配置 | `~/.hermes/config.yaml` | 所有设置 |
| API 密钥 | `~/.hermes/.env` | 环境变量和密钥 |
| 个性定义 | `~/.hermes/SOUL.md` | 代理个性和语气 |
| 技能目录 | `~/.hermes/skills/` | 用户技能存储 |
### 常用配置项
```yaml
# ~/.hermes/config.yaml 示例
model:
provider: openrouter
name: anthropic/claude-opus-4.6
display:
skin: default # default, ares, mono, slate
tool_progress: true
tools:
enabled:
- terminal
- file
- web
```
### 环境变量
`~/.hermes/.env` 中配置:
```bash
# LLM 提供商
OPENROUTER_API_KEY=your-key
ANTHROPIC_API_KEY=your-key
OPENAI_API_KEY=your-key
# 消息平台
TELEGRAM_BOT_TOKEN=your-token
DISCORD_BOT_TOKEN=your-token
SLACK_BOT_TOKEN=your-token
# 其他
NOUS_PORTAL_API_KEY=your-key
```
---
## 常见问题
### Q: 在中国无法访问 GitHub 怎么办?
**A:** 使用 `--local` 安装模式:
1. 通过镜像站或其他方式下载代码
2. 运行:`bash install.sh --local --dir /path/to/downloaded/hermes-agent`
### Q: 支持哪些模型?
**A:** 支持任何兼容 OpenAI API 的模型提供商,包括:
- OpenRouter200+ 模型)
- Anthropic
- OpenAI
- Nous Portal
- 国内模型Kimi、智谱、MiniMax 等,通过 OpenRouter 或自定义端点)
### Q: 如何切换模型?
**A:** 使用:
```bash
hermes model # 交互式选择
hermes model openrouter/anthropic/claude-opus-4.6 # 直接指定
```
### Q: 如何在服务器上后台运行?
**A:** 使用网关服务:
```bash
hermes gateway install # 安装为 systemd 服务
hermes gateway start # 启动服务
```
或手动后台运行:
```bash
nohup hermes gateway > ~/.hermes/logs/gateway.log 2>&1 &
```
### Q: 技能和工具有什么区别?
**A:**
- **工具 (Tools)**: 由代码实现的底层能力文件操作、终端、Web 搜索等40+ 内置工具
- **技能 (Skills)**: 由代理从经验中学习或用户创建的高层流程,使用 Markdown 格式定义,可共享和改进
---
## 相关链接
- **官方文档**: https://hermes-agent.nousresearch.com/docs/
- **Discord 社区**: https://discord.gg/NousResearch
- **技能中心**: https://agentskills.io
- **GitHub**: https://github.com/NousResearch/hermes-agent
- **问题反馈**: https://github.com/NousResearch/hermes-agent/issues
---
## 许可证
MIT 许可证 — 详见 [LICENSE](LICENSE)。
由 [Nous Research](https://nousresearch.com) 开发。

1481
install.sh Normal file

File diff suppressed because it is too large Load diff

View file

@ -37,6 +37,7 @@ NODE_VERSION="22"
USE_VENV=true
RUN_SETUP=true
BRANCH="main"
USE_LOCAL_DIR=false
# Detect non-interactive mode (e.g. curl | bash)
# When stdin is not a terminal, read -p will fail with EOF,
@ -66,6 +67,10 @@ while [[ $# -gt 0 ]]; do
INSTALL_DIR="$2"
shift 2
;;
--local)
USE_LOCAL_DIR=true
shift
;;
--hermes-home)
HERMES_HOME="$2"
shift 2
@ -80,6 +85,7 @@ while [[ $# -gt 0 ]]; do
echo " --skip-setup Skip interactive setup wizard"
echo " --branch NAME Git branch to install (default: main)"
echo " --dir PATH Installation directory (default: ~/.hermes/hermes-agent)"
echo " --local Use existing local directory (--dir), skip git clone (for offline/China users)"
echo " --hermes-home PATH Data directory (default: ~/.hermes, or \$HERMES_HOME)"
echo " -h, --help Show this help"
exit 0
@ -717,6 +723,28 @@ show_manual_install_hint() {
clone_repo() {
log_info "Installing to $INSTALL_DIR..."
if [ "$USE_LOCAL_DIR" = true ]; then
log_info "Using --local mode: skipping git clone, using existing directory..."
if [ ! -d "$INSTALL_DIR" ]; then
log_error "Directory not found: $INSTALL_DIR"
log_info "Please specify an existing directory with --dir PATH"
log_info "Or download the repository first and point --dir to it"
exit 1
fi
if [ ! -f "$INSTALL_DIR/pyproject.toml" ]; then
log_error "Directory does not appear to be a hermes-agent repository"
log_info "Expected to find pyproject.toml in: $INSTALL_DIR"
log_info "Please verify the directory contains the hermes-agent source code"
exit 1
fi
cd "$INSTALL_DIR"
log_success "Using local directory: $INSTALL_DIR"
return 0
fi
if [ -d "$INSTALL_DIR" ]; then
if [ -d "$INSTALL_DIR/.git" ]; then
log_info "Existing installation found, updating..."
@ -768,7 +796,8 @@ clone_repo() {
fi
else
log_error "Directory exists but is not a git repository: $INSTALL_DIR"
log_info "Remove it or choose a different directory with --dir"
log_info "To use an existing non-git directory, add --local flag"
log_info "Example: bash install.sh --local --dir $INSTALL_DIR"
exit 1
fi
else
@ -786,6 +815,9 @@ clone_repo() {
log_success "Cloned via HTTPS"
else
log_error "Failed to clone repository"
log_info "For users in China or with network issues:"
log_info " 1. Download the repository manually (e.g., from Gitee or GitHub mirror)"
log_info " 2. Run: bash install.sh --local --dir /path/to/downloaded/hermes-agent"
exit 1
fi
fi
@ -1417,7 +1449,11 @@ main() {
detect_os
install_uv
check_python
check_git
if [ "$USE_LOCAL_DIR" = false ]; then
check_git
else
log_info "Using --local mode: skipping Git check"
fi
check_node
install_system_packages

687
ui-tui/package-lock.json generated
View file

@ -989,8 +989,101 @@
}
},
"node_modules/@hermes/ink": {
"resolved": "packages/hermes-ink",
"link": true
"version": "0.0.1",
"resolved": "file:packages/hermes-ink",
"dependencies": {
"@alcalzone/ansi-tokenize": "^0.1.0",
"auto-bind": "^5.0.0",
"bidi-js": "^1.0.0",
"chalk": "^5.4.0",
"cli-boxes": "^3.0.0",
"code-excerpt": "^4.0.0",
"emoji-regex": "^10.4.0",
"get-east-asian-width": "^1.3.0",
"indent-string": "^5.0.0",
"lodash-es": "^4.17.0",
"react": ">=19.0.0",
"react-reconciler": "0.33.0",
"semver": "^7.6.0",
"signal-exit": "^4.1.0",
"stack-utils": "^2.0.0",
"strip-ansi": "^7.1.0",
"supports-hyperlinks": "^3.1.0",
"type-fest": "^4.30.0",
"usehooks-ts": "^3.1.0",
"wrap-ansi": "^9.0.0"
},
"peerDependencies": {
"ink-text-input": ">=6.0.0",
"react": ">=19.0.0"
}
},
"node_modules/@hermes/ink/node_modules/@alcalzone/ansi-tokenize": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz",
"integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==",
"dependencies": {
"ansi-styles": "^6.2.1",
"is-fullwidth-code-point": "^4.0.0"
},
"engines": {
"node": ">=14.13.1"
}
},
"node_modules/@hermes/ink/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@hermes/ink/node_modules/chalk": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@hermes/ink/node_modules/is-fullwidth-code-point": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@hermes/ink/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@hermes/ink/node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
@ -6666,596 +6759,6 @@
"peerDependencies": {
"zod": "^3.25.0 || ^4.0.0"
}
},
"packages/hermes-ink": {
"name": "@hermes/ink",
"version": "0.0.1",
"dependencies": {
"@alcalzone/ansi-tokenize": "^0.1.0",
"auto-bind": "^5.0.0",
"bidi-js": "^1.0.0",
"chalk": "^5.4.0",
"cli-boxes": "^3.0.0",
"code-excerpt": "^4.0.0",
"emoji-regex": "^10.4.0",
"get-east-asian-width": "^1.3.0",
"indent-string": "^5.0.0",
"lodash-es": "^4.17.0",
"react": ">=19.0.0",
"react-reconciler": "0.33.0",
"semver": "^7.6.0",
"signal-exit": "^4.1.0",
"stack-utils": "^2.0.0",
"strip-ansi": "^7.1.0",
"supports-hyperlinks": "^3.1.0",
"type-fest": "^4.30.0",
"usehooks-ts": "^3.1.0",
"wrap-ansi": "^9.0.0"
},
"devDependencies": {
"esbuild": "^0.25.0"
},
"peerDependencies": {
"ink-text-input": ">=6.0.0",
"react": ">=19.0.0"
}
},
"packages/hermes-ink/node_modules/@alcalzone/ansi-tokenize": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz",
"integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"is-fullwidth-code-point": "^4.0.0"
},
"engines": {
"node": ">=14.13.1"
}
},
"packages/hermes-ink/node_modules/@esbuild/aix-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
"integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/android-arm": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
"integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/android-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
"integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/android-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
"integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/darwin-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
"integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/darwin-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
"integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
"integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/freebsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
"integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-arm": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
"integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
"integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-ia32": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
"integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-loong64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
"integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-mips64el": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
"integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
"cpu": [
"mips64el"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
"integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-riscv64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
"integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-s390x": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
"integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/linux-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
"integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
"integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/netbsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
"integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
"integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/openbsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
"integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/openharmony-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
"integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/sunos-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
"integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/win32-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
"integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/win32-ia32": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
"integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/@esbuild/win32-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
"integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"packages/hermes-ink/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"packages/hermes-ink/node_modules/chalk": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"packages/hermes-ink/node_modules/esbuild": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
"integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.12",
"@esbuild/android-arm": "0.25.12",
"@esbuild/android-arm64": "0.25.12",
"@esbuild/android-x64": "0.25.12",
"@esbuild/darwin-arm64": "0.25.12",
"@esbuild/darwin-x64": "0.25.12",
"@esbuild/freebsd-arm64": "0.25.12",
"@esbuild/freebsd-x64": "0.25.12",
"@esbuild/linux-arm": "0.25.12",
"@esbuild/linux-arm64": "0.25.12",
"@esbuild/linux-ia32": "0.25.12",
"@esbuild/linux-loong64": "0.25.12",
"@esbuild/linux-mips64el": "0.25.12",
"@esbuild/linux-ppc64": "0.25.12",
"@esbuild/linux-riscv64": "0.25.12",
"@esbuild/linux-s390x": "0.25.12",
"@esbuild/linux-x64": "0.25.12",
"@esbuild/netbsd-arm64": "0.25.12",
"@esbuild/netbsd-x64": "0.25.12",
"@esbuild/openbsd-arm64": "0.25.12",
"@esbuild/openbsd-x64": "0.25.12",
"@esbuild/openharmony-arm64": "0.25.12",
"@esbuild/sunos-x64": "0.25.12",
"@esbuild/win32-arm64": "0.25.12",
"@esbuild/win32-ia32": "0.25.12",
"@esbuild/win32-x64": "0.25.12"
}
},
"packages/hermes-ink/node_modules/is-fullwidth-code-point": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"packages/hermes-ink/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"packages/hermes-ink/node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
}
}