Skip to content

已知限制

相关文档: 错误处理 — 错误容忍机制 | 调度配置 — 调度系统限制与配置 | Hook 机制 — Hook 限制

以下是 rolebox 当前版本(v1.x)的已知功能限制。

限制一览

限制说明应对策略
无角色继承角色之间不支持继承或组合机制,每个角色是独立定义通过技能(skills)和引用(references)共享通用配置;利用子代理(subagents)实现功能组合与分层复用
无运行时角色切换会话启动后不能动态切换角色预先定义多个子代理在不同工作模式下并行激活;或退出当前会话后以新角色身份重新启动
函数全会话持久化函数在整个会话期间持续激活,暂不支持按消息级别激活/停用通过条件函数设计控制函数的生效范围;利用子代理隔离不同阶段所需的函数上下文
无项目上下文条件函数不支持根据项目上下文(如文件类型、目录结构)条件性地激活函数在角色初始化阶段手动识别项目类型;为不同项目类型分别定义专用角色并在需要时切换
子代理嵌套深度上限基于文件的递归子代理嵌套最高支持 3 层(父 → 子 → 孙)将超出深度的子代理以内联方式声明在父级 role.yaml 的 subagents: 字段中;或将深层子代理扁平化为中间层引用
-- 为保留字符-- 在角色 ID 中作为父/子代理分隔符使用,不可用于命名使用 -. 等替代分隔符;避免在角色名称中包含 -- 组合

详细说明

无角色继承

每个角色通过 role.yaml 独立定义,不允许从一个角色继承另一个角色的配置(如函数、技能、权限等)。如果多个角色需要共享配置,目前需要通过复制或引用来实现。

无运行时角色切换

角色在会话初始化时确定,会话运行期间不能切换为其他角色。如果需要在不同角色之间切换工作模式,需要通过子代理调度来实现。

函数全会话持久化

通过 functions: 字段激活的函数会在整个会话生命周期内保持激活状态。当前不支持按消息粒度动态启用/禁用函数。

子代理嵌套深度上限

子代理可以通过文件目录进行递归嵌套,但深度上限为 3 层(父 → 子 → 孙 → 曾孙)。超过深度限制的子代理将无法加载。

各子系统限制

调度系统(Dispatch)

限制默认值说明
模型并发槽位数5每个模型密钥(providerID/modelID)的并发执行上限。详见 concurrency.ts:92
保留槽位数1保留给同步(sync)任务的槽位,后台任务可用上限为 limit - reserved(即 4 个)。详见 concurrency.ts:92
队列最大深度10等待队列最大长度,超出时返回 QueueFullError。详见 concurrency.ts:92
等待超时300 秒(5 分钟)队列中等待超时后抛出 WaiterTimeoutError,详见 concurrency.ts:46
子代理嵌套深度3 层基于文件的子代理递归解析最大深度,超过深度限制的层级被忽略。详见 subagents.ts:237
通知间隔2 秒loop 模块中连续轮次之间的最小延迟。详见 loop/constants.ts:14

记忆系统(Memory)

限制默认值说明
存储后端bun:sqlite(WAL 模式)使用 bun:sqlite 作为持久化引擎,启用 WAL 日志模式以提高并发性能。详见 store.ts:28-29
全文检索引擎FTS5基于 SQLite FTS5 虚拟表,自动同步 titlecontenttags 字段。详见 schema.ts:29-34
列表默认上限20 条memory_list 未指定 limit 时最多返回 20 条摘要记录。详见 store.ts:212
搜索默认上限10 条memory_recall 未指定 limit 时最多返回 10 条完整记录。详见 search.ts:42
自动注入上限10 条会话启动时自动注入系统提示的记忆摘要最大数量。详见 types.ts:13
分类维度scope / category / relevance支持按作用域、分类和相关性等级过滤;tags 和 source_sessions 以 JSON 数组存储

图编排系统(Graph)

限制默认值说明
最大迭代次数(含环图)3 次当图中检测到环(cycle)且未显式设置 max_iterations 时,默认上限为 3 次。详见 parser.ts:80-81
最大迭代次数(无环图)无限制(0)无环图默认不限制迭代次数。详见 parser.ts:82-83
用户自定义上限max_iterations 字段指定支持在 graph 配置中显式设置,最小值为 0。详见 parser.ts:44-47
环组独立上限通过 termination 配置每个 loop group 可单独设置 maxIterations,互不干扰。详见 termination.ts:49

循环执行系统(Loop)

限制默认值说明
默认迭代次数5 次未指定 iterations 参数时的默认循环轮次。详见 constants.ts:2
硬上限50 次单次循环的最大轮次,防止失控执行。详见 constants.ts:5
单轮超时900 秒(15 分钟)每个 dispatch 轮次的最长等待时间。详见 constants.ts:8
轮次间隔2 秒连续轮次之间的最小延迟,避免瞬态负载。详见 constants.ts:14
摘要输入上限8,000 字符每次轮次输出送入摘要器的最大字符数。详见 constants.ts:17
种子字符上限8,000 字符合并后预置到下一轮次的摘要最大字符数。详见 constants.ts:20

通知系统(Notifications)

通道平台支持说明
SystemToastmacOS(terminal-notifier / osascript)、Linux(notify-send)、Windows(PowerShell)原生系统通知,各平台依赖不同命令行工具。详见 system-toast.ts
SoundmacOS(afplay)、Linux(paplay / aplay 回退)、Windows(PowerShell SoundPlayer)播放通知音效,需要对应平台音频播放工具。详见 sound.ts
File全平台以 JSONL 格式追加写入文件,无平台依赖。详见 file.ts
Log全平台写入结构化日志,无平台依赖。详见 log.ts
Webhook全平台(依赖网络可达)HTTP POST 到指定 URL,支持自定义请求头和超时(默认 5 秒)。详见 webhook.ts:21
CustomCommand全平台通过子进程执行自定义命令,参数以环境变量传递,支持 stdin 输入。详见 custom-command.ts

哈希行系统(Hashline)

限制默认值说明
小文件哈希宽度2 位文件 ≤ 1000 行时使用,提供 64² = 4,096 个不重复桶。详见 constants.ts:6
中文件哈希宽度3 位文件 1001–10000 行时使用,提供 64³ = 262,144 个桶。详见 constants.ts:7
大文件哈希宽度4 位文件 > 10000 行时使用,提供 64⁴ = 16,777,216 个桶。详见 constants.ts:8
环境变量覆盖ROLEBOX_HASHLINE_WIDTH可覆盖自动选择的哈希宽度。详见 constants.ts:14
校验正则/^(\d+)#([A-Za-z0-9_-]{2,4})$/哈希引用格式为 行号#哈希,宽度限制 2-4 位。详见 constants.ts:18
模糊搜索窗口±10 行定位失败时在目标行前后各 10 行内搜索匹配内容。详见 constants.ts:27

平台命令依赖

通知后端通过平台特定的命令行工具发送通知(src/notifications/platform.ts):

平台SystemToastSound
macOSterminal-notifier 或回退到 osascriptafplay
Linuxnotify-sendpaplay,回退到 aplay
WindowsPowerShellPowerShell (SoundPlayer)

如果目标平台缺少对应的命令行工具,通知静默降级(跳过该通道),不会报错。

升级注意事项

从 v0.12.0 开始,状态存储从 XDG_DATA_HOME 迁移到项目本地 .rolebox/ 目录。如果你从更早版本升级,旧的状态文件不会自动迁移。升级后建议先运行 rolebox status 确认所有子系统正常工作。详见兼容性

外部工具限制

LSP 服务器

rolebox 内置的 LSP 服务器注册表(src/lsp/servers.ts:9-122)支持以下语言,每个语言对应一个外部服务器二进制文件:

语言服务器命令根文件标记
TypeScript/JavaScripttypescript-language-servertsconfig.json / package.json
Pythonpyright-langserverpyproject.toml / setup.py
Gogoplsgo.mod
Rustrust-analyzerCargo.toml
C/C++clangdcompile_commands.json / CMakeLists.txt
Javajdtlspom.xml / build.gradle
RubysolargraphGemfile
Bashbash-language-server自动检测
Lualua-language-server.luarc.json
Kotlinkotlin-lspbuild.gradle.kts

如果对应服务器的二进制文件未在 PATH 或常见安装路径中找到,该语言的 LSP 功能(诊断、跳转定义、补全等)不可用(src/lsp/servers.ts:226-233)。

Web 搜索与渲染引擎

Web 抓取功能依赖可选的浏览器自动化包(src/web/browser-detect.ts:24-46):

  • Playwright:提供完整的 JS 渲染能力,用于抓取 SPA 和动态网页。
  • Crawlee:提供高级爬取功能。

如果两者都未安装,web 抓取回退到静态 HTTP 请求模式,无法渲染 JavaScript 生成的内容。

TUI (终端 UI)

rolebox 的终端 UI 默认支持 macOS 和 Linux 终端(如 iTerm2、Kitty、Terminator)。Windows 终端兼容性取决于使用的终端模拟器 —— PowerShell 和 Windows Terminal 的基本功能可用,但某些高级渲染特性(如 ANSI 转义序列)可能受限。

已知边缘情况

场景表现相关参考
同时启动大量并发任务超出 maxConcurrent + maxQueueDepth 的任务返回 QueueFullError,需等待重试调度配置
子代理长时间无响应后台任务在 backgroundStaleTimeoutMs(默认 15 分钟)后标记为过期调度配置
队列中任务等待超时超过 WAITER_TTL_MS(300 秒)后抛出 WaiterTimeoutError调度配置错误处理
图循环中代理卡住达到 max_iterations 或 termination 条件后自动终止错误处理
预算限制触发后任务取消采样间隔 budgetSampleIntervalMs 内可能多消耗一些配额调度配置
扩展模块加载失败按模块捕获,记录警告,跳过该扩展,不会影响其他功能扩展机制
Hook 模块加载失败记录警告,Hook 被跳过,注册中心存储 null 并继续Hook 机制
插件关闭时 Hook 未释放onDispose 确保在关闭时清理资源;如果模块未实现 onDispose,资源由进程回收Hook 机制
环境变量插值未解析保留原始 {env:VARIABLE_NAME} 文本,不做猜测性替换调度配置
通知通道平台命令缺失通道静默降级,无报错;不影响其他功能本页上方「平台命令依赖」
并发策略自定义实现错误concurrency_policies 扩展加载失败仅影响该策略,回退到默认 ConcurrencyManager扩展机制

版本演进路线

以下标记哪些限制属于有意设计约束(短期内不会改变),哪些在规划路线上可能调整。

设计约束 vs 路线图

「设计约束」标记的限制基于架构性决策,短期内不会改变——应将其视为系统的稳定边界来规划你的角色设计。「路线图待定」标记的限制在规划中可能调整,但无明确时间表。在受这些限制影响时,可以先采用「应对策略」列中建议的变通方案。

限制分类说明
无角色继承设计约束角色模型基于组合(composition)而非继承(inheritance),通过子代理和技能复用实现模块化。此为架构性决策,不计划引入继承机制
无运行时角色切换路线图待定技术上可通过 dispatch() 间接实现,但原生会话内角色切换需要更复杂的上下文管理机制
函数全会话持久化设计约束函数激活模型与函数状态机的生命期绑定,按消息粒度激活/停用将显著增加状态管理复杂度。暂不在路线图中
无项目上下文条件函数路线图待定条件函数是需求中高频出现的请求,可能在后续版本中通过扩展 conditions 系统增强
子代理嵌套深度上限路线图待定当前 maxDepth: number = 3 在源码中为可调默认值(src/loader/subagents.ts:237),未来可能提高或开放配置
-- 为保留字符设计约束此分隔符是子代理 ID 路由机制的基础,无法变更

下一步

  • 错误处理 — 了解 rolebox 的错误容忍与降级机制

基于 MIT 许可协议发布