# vaiv **Repository Path**: iqdo/vaiv ## Basic Information - **Project Name**: vaiv - **Description**: V codeAgents in V. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-11 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vaiv — 用 V 语言写的代码智能体(V codeAgents in V) > 📖 English documentation: [README.md](README.md) [![CI](https://github.com/ovlo/vaiv/actions/workflows/ci.yml/badge.svg)](https://github.com/ovlo/vaiv/actions/workflows/ci.yml) 一个完全用 [V 语言](https://vlang.io) 编写的代码智能体,在终端 CLI 中实现 ReAct 风格的智能体循环(LLM ↔ 工具)。这是长期项目 `V codeAgents in V` (代号 vaiv);**目前 Phase 0–12 均已实现**(最新版本 v0.6.6)。 ## 功能特性 - **ReAct 循环**:LLM 请求工具调用;智能体执行工具并把结果回填,直到模型返回最终答案。 - **内置工具**: - `read_file` — 带分页的文本读取。 - `write_file` — 写入/覆盖(受 `VCA_ALLOW_WRITE` 开关控制)。 - `search_files` — 正则搜索(regex.pcre),自动跳过过大/二进制文件。 - `terminal` — 运行 shell 命令(受 `VCA_ALLOW_EXEC` 开关控制)。 - **`list_files`**(Phase 12)— 列出某路径下的文件/目录(类似 `ls`/`find`), 支持可选 glob `pattern` 过滤与 `recursive` 开关。只读,无需写/执行权限——方便 智能体快速摸清项目结构。 - **`web_search`**(Phase 12)— 通过 DuckDuckGo 搜索网页并返回结果标题 + 链接。 底层调用系统 `curl`,因此同样受 `VCA_ALLOW_EXEC` 闸门(与 `terminal` 一致); 离线或缺失 curl 时返回清晰错误,绝不挂起。 - **`git`**(Phase 14)— 在项目内执行 git 子命令(`status`、`diff`、`log`、 `add`、`commit -m "..."`、`branch` 等)。与 `terminal` 同受 `VCA_ALLOW_EXEC` 闸门;**破坏性操作**(`push`、`reset --hard`、`clean`、`rebase`、`branch -D` 等) 走同一套 `confirm()` 确认机制,绝不盲跑;且 `commit` 不带 `-m` 会被拒绝 (本环境无编辑器)。方便智能体自检并记录自己的工作。 - **语法高亮**(Phase 15)— 一个零依赖的 `syntax` 模块,支持 V / Go / JavaScript / HTML / bash 语法高亮,输出 HTML(Web UI)或 ANSI(CLI)。 Web 聊天里 ```lang 围栏代码块自动着色;所有输出均做 HTML 转义防注入。 - **`patch`**(Phase 1)— 精确的就地编辑: - `mode=exact`:把 `old_string` 替换为 `new_string`(要求唯一匹配,或设 `replace_all=true` 全替换)。 - `mode=lines`:替换行区间 `[start,end]`(1 基、含端点)为 `replacement`。 - 支持 `dry_run`(只报告)与交互式确认。 - **`vet` / `fmt` / `test`**(Phase 1)— 对项目(默认整个项目)运行 `v vet .` / `v fmt -w .` / `v -silent test .`。 - ** Provider 无关的聊天客户端**:兼容 OpenAI / OpenRouter / **Ollama** / **llama.cpp** 的 OpenAI 兼容接口。 - **离线 `mock` provider**:无需 API key 即可测试。 - **SQLite 会话持久化**:可恢复的对话记录(transcript)。 - **追加式事件日志**:写入 `data/vaiv.log`。 - **默认安全(Phase 1)**: - 写/执行受标志位控制(`VCA_ALLOW_WRITE` / `VCA_ALLOW_EXEC`)。 - 危险的 `terminal` 命令(`rm -rf`、`git push`、`dd`、`kill` 等)**默认拦截**, 除非显式批准(`VCA_AUTO_YES=1`)或交互式确认。 - `dry_run` 模式:`patch`/`fmt` 只报告意图、不修改文件。 - 工具输出会被**截断**(`VCA_RESULT_LIMIT`,默认 8000 字节),防止超大文件/命令撑爆上下文窗口。 - **记忆与上下文(Phase 2)**: - SQLite 跨会话记忆表(`MemoryRow`):用户偏好、项目事实在重启后保留,并在每次运行时注入系统提示。 - 会话检索:`recall(query)` 对存储记忆做关键词搜索。 - **上下文压缩**:当对话记录超过 `VCA_COMPACT_THRESHOLD` 条消息时,中间轮次会被摘要化 (在线时调用 LLM,离线时走确定性的抽取式回退),而系统提示与最近 `keep_recent` 条消息原样保留——关键信息不丢。 - 可配置系统提示:通过 `VCA_SYSTEM` 或 config.yaml 的 `system:` 字段。 - **多智能体编排(Phase 3)** ✓ - `Planner` 把请求分解为有序/可并行的 `SubTask`:有真实 LLM 时让模型返回 JSON 计划; 离线(mock)时用确定性启发式(拆分编号/项目符号列表,否则整体作为一个任务)。 - 每个 `SubTask` 在**隔离的子智能体**(独立 ReAct 循环 + 独立工具上下文)中运行, 通过 `run_parallel`(goroutine + channel,按依赖分层波次)或 `run_sequential` 执行。 - `Reducer` 把子结果合并为一份答案;某个子任务失败会内联报告,但**不会**中止整体运行(失败隔离)。 - 用 `VCA_PARALLEL=1`(或 config.yaml 的 `parallel: true`)开启。 - **健壮性(Phase 6)**:LLM 调用指数退避重试(网络/5xx/429)、可配置单次超时、 以及每工具连续失败守卫(≥3 次连续失败即中止,避免空转烧 token)。`4xx` 不重试(请求格式/鉴权问题)。 - **运行遥测与机器可读输出(Phase 7)**: - 每次 `run` 都会填充 `Agent.last_run`(provider、model、steps、tool_calls、各工具计数、errors、 duration_ms、finish)——**绝不写入对话记录**,保持持久化干净。 - CLI 标志:`--json` 输出 `{"ok":true,"final":"...","stats":{...}}`(或错误信封)便于 CI / `jq`; `--stats` 在答案后打印一行人类可读摘要。两者都可在 `mock` provider 下离线测试。 - **持久化遥测与可观测性(Phase 8)** ✓ (v0.5.3) - **Token 用量(P8.1)**:每次运行从 OpenAI 兼容端点采集 `usage{prompt_tokens, completion_tokens}`(mock = 0)。真实 provider(如商汤、OpenAI)会填充;缺失 `usage` 时降为 0。 - **持久化存储(P8.2/P8.3)**:每次运行——单轮、REPL 轮次、并行编排、**以及 Web 聊天**—— 都会追加到独立的 SQLite 文件 `data/vaiv-telemetry.sqlite`(与 `session.sqlite`、 `vaiv-web.sqlite` 分离,不会被会话 `replace()` 干扰)。 - **CLI 报告(P8.4)**:`vaiv --report` 打印人类可读聚合(总运行数、总 token、耗时、按 provider 分组、最近运行);`vaiv --report json`(或 `--report-json`)输出机器可读 JSON 对象。 两者只读本地遥测库,完全离线可用。 - **Web 看板(P8.5)**:`vaiv-web` 新增 `GET /metrics`(暗色主题卡片:运行/token/耗时 + 按 provider 分布)与 `GET /api/metrics`(JSON),聚合同一持久化存储。 - **测试(P8.6)**:`telemetry_store_test.v`(save/count/summarise/last_n/reset)与 `llm_test.v`(usage 解析:有/无)锁定行为。 - **约定模块——用户原则与习惯(Phase 9)** ✓ (v0.6.0) - 智能体可以**创建并维护**用户的原则与习惯,以 Markdown 文件存储,分两层: - **system**:`~/.vaiv/conventions.md`(对所有 vaiv 项目生效) - **project**:`<项目根>/.vaiv/conventions.md`(可提交,团队共享) - 三个内置工具:`convention_add(layer, category, text)`、`convention_list(layer)`、 `convention_remove(layer, id)`。`add` 受 `VCA_ALLOW_WRITE` 控制;`remove` 是破坏性操作、 需确认(`VCA_AUTO_YES=1` 自动批准,与 terminal 工具策略一致)。 - **主动注入**:每次 `run()` 开始时,system+project 两层约定会被合并注入系统提示 (与 Phase 2 记忆同机制,绝不持久化进对话记录),让智能体无需每次提醒就遵循用户原则。 - **学习触发**:被动(用户说"记住:…" → 调 `convention_add`)与主动(智能体发现用户反复纠正 → 提议保存,但**先确认**以免误记)。 - **测试(P9.4)**:`conventions_test.v`(add/list/remove、自动编号、跨层隔离、run() 注入) 与 `tools_test.v`(`convention_*` 工具端到端,含 remove 确认闸门)。 - **学习提醒(Phase 9.5)**:在**成功且真正用到工具**的一轮结束后,vaiv 打印一行 `[tip]`,提醒你用 `convention_add` 把本次有价值的原则 / 习惯 / 踩坑存为约定, 让后续编程少走弯路。提醒**不啰嗦**:仅当你的约定库仍稀疏(两层合计 < 3 条)时才出现, 且会点名本轮实际用到的工具;`--json` 模式下绝不输出(保持机读纯净)。 (`conventions_learning.v` + `conventions_learning_test.v`。) **CLI 与 Web 双端一致**:Web 同步接口在回复末尾追加 `[tip]` 行;流式接口额外推送 独立 `event: tip` SSE 事件,前端渲染为绿色提示气泡(`.msg.tip`)。 **Web 端「存为约定」按钮**:tip 气泡上的「存为约定」按钮展开内联表单 (范围 / 分类 / 内容),提交 `POST /api/convention` 直接落盘——手动确认、 不自动保存,保存即生效于后续 agent 运行(与 `convention_add` 同存储后端)。 - **自更新(Phase 10)** ✓ (v0.6.1) - `vaiv update` 自我更新二进制,**不经过 LLM**。它委托给 `scripts/vaiv_update.vsh` (形式 C),该脚本也可通过 `v run scripts/vaiv_update.vsh` 独立运行。 - 流程:定位仓库根 → 检查 `git status`(有未提交改动则中止,除非 `--force`)→ 备份旧二进制为 `.bak` → `git pull --ff-only` → 重编译 `bin/vaiv` + `bin/vaiv-web` → 运行 `v test` → **任何一步失败则回滚到 `.bak`** → 从 `v.mod` 打印新版本。 - **安全性**:绝不 `git reset --hard`、绝不删除用户文件;备份是重命名(`.bak`), 回滚即还原它们。V 编译器(`~/v`)**从不触碰**——只拉取并重建 vaiv 源码。 - 标志:`vaiv update --force`(跳过未提交改动检查)、`vaiv update --dry-run` (只打印步骤、不实际执行)、`vaiv update --self-test`(运行脚本内置的纯函数测试)。 - 已验证:未提交改动守卫会清晰中止;`--dry-run` 正确打印完整流水线;脚本自测通过(4/4)。 - **会话管理与配置自检(Phase 11)** ✓ (v0.6.1) - **多会话**:每个对话独立存为 `data/sessions/.sqlite` 下的一个 SQLite 文件, 可并排保留多个线程。用 `vaiv --session "prompt"`(或单独 `--session ` 进入 REPL)与指定会话对话;默认会话名为 `default`。 - `vaiv sessions` 列出所有会话及其消息条数。 - `vaiv export [name]` 把会话记录导出为 Markdown(跳过系统提示),便于存档或粘贴。 - `vaiv config` 打印完全解析后的配置(file → env → defaults 合并结果),API key 脱敏, 方便你确认智能体实际将以什么配置运行。这四个子命令**均不经过 LLM**。 - **模型登记表与手动切换(Phase 16)**:✓(v0.7.1) - 一个专门的模型管理入口,不再需要手工编辑 `config.yaml`。模型清单存放在独立的 `.vaiv/models.yaml`(不触碰你手写注释的 `config.yaml`)。 - `vaiv models` 列出所有已配置模型,活动模型用 `*` 标记。 - `vaiv models add [base_url] [api_key]` 追加模型并持久化;首个添加的模型自动成为活动模型。 - `vaiv models use ` 设定活动模型(优先尝试;失败时在其他已启用模型间故障转移)。 - `vaiv models remove ` / `vaiv models enable ` / `vaiv models disable ` 修改登记表。 - REPL 中:`/models` 列出、`/use ` 仅当前会话热切换(不落盘)。 - Web UI 在 `/models` 提供**模型**页面:新增 / 删除 / 启停 / 一键切换,均驱动同一个 `.vaiv/models.yaml`。 - **可选 Web UI(Phase 4)**: - 基于 veb 的 Web 前端,复用同一套 `agent` 核心(不重复实现 ReAct 循环),作为独立的 `cmd/web` 入口。 - 会话列表、"新建对话"、单会话记录视图,以及 **SSE 流式**聊天(每个 assistant 增量与工具调用 实时经 Server-Sent Events 推送;不支持 SSE 时回退到同步 POST)。 - 双语 UI:`translations/zh.tr` + `translations/en.tr`(默认中文),由 veb 的 `veb.tr` 加载。 - **SQLite 会话存储**(`webstore.v`,文件 `data/vaiv-web.sqlite`)——Web 会话**跨服务重启存活**。 Web 库刻意与 CLI 的 `data/session.sqlite` 隔离(不同表、不同文件)。 - **双语界面 + 实时切换**:顶栏有 `中文 / EN` 切换按钮,点击设置 `vaiv_lang` cookie 并刷新; `GET /lang?l=zh|en&from=` 切换语言并重定向回原页面。模板通过 `veb.tr(lang, key)` 从 `translations/zh.tr` + `translations/en.tr` 取字符串。 - 离线运行:无 API key 时自动使用 `mock` provider,整个 UI(创建 → 聊天 → 流式)用 `v -o` + `curl` 即可跑通。 ## 构建与运行 需要 V 0.5.x,位于 `~/v`(或在 PATH 中)。 # CLI v -o bin/vaiv main.v ./bin/vaiv "read v.mod and tell me the module name" # Web UI (Phase 4) v -o bin/vaiv-web cmd/web ./bin/vaiv-web # 打开 http://localhost:3003/ ### 安装 / 卸载(Phase 17) 一个自包含的 V 脚本,把两个二进制安装到自定义前缀目录,并安全卸载: # 安装到 ~/.local/bin(默认);从当前仓库树编译 v run scripts/vaiv_install.vsh install # 自定义前缀 + 显式指定 V 编译器: v run scripts/vaiv_install.vsh install --prefix /opt/vaiv --v ~/v/vnew # 从仓库 URL 全新 clone 而非使用当前目录树: v run scripts/vaiv_install.vsh install --repo https://github.com/ovlo/vaiv --prefix ~/apps # 卸载——默认安全:重命名为 .bak,绝不删除 v run scripts/vaiv_install.vsh uninstall v run scripts/vaiv_install.vsh uninstall --prefix /opt/vaiv --purge # 彻底移除 参数:`--prefix DIR`(安装根,二进制 → `DIR/bin`;默认 `~/.local`)、 `--repo URL`(不在仓库内时 clone 的 git 地址)、`--v PATH`(V 编译器,默认 PATH 上的 `v`)、 `--force`(无 .bak 提示直接覆盖)、`--purge`(卸载时真正删除而非 .bak)、`--dry-run`(只打印不执行)。 安装后请将 `DIR/bin` 加入 `PATH`。 ### 使用真实远程 LLM export VCA_API_KEY=sk-... # OpenAI 或 OpenRouter key export VCA_MODEL=openai/gpt-4o-mini # 或 openrouter/... export VCA_PROVIDER=openrouter # 或 openai ./bin/vaiv "refactor main.v to use a config struct" ### 本地优先(无云) Ollama: export VCA_PROVIDER=ollama ./bin/vaiv "explain this module" llama.cpp server(例如 `./server -m model.gguf`): export VCA_PROVIDER=llamacpp ./bin/vaiv "summarize tools.v" 两者都在 `.vaiv/config.yaml` 下配置(`ollama:` / `llamacpp:` 块),暴露 OpenAI 兼容的 `/v1` API, 因此走的是同一套客户端代码路径。 ### 安全标志(环境变量或 .vaiv/config.yaml) VCA_ALLOW_WRITE=0 # 禁用 write_file / patch(默认开启) VCA_ALLOW_EXEC=0 # 禁用 terminal / vet / fmt / test(默认开启) VCA_AUTO_YES=1 # 自动批准危险操作(跳过确认) VCA_DRY_RUN=1 # patch/fmt 只报告意图,不修改文件 VCA_RESULT_LIMIT=4000 # 工具输出字节上限(默认 8000) VCA_COMPACT_THRESHOLD=40 # 超过 N 条消息压缩对话记录(0 = 关闭) VCA_PARALLEL=1 # 把请求分解为子任务,并发运行 VCA_SYSTEM="You are vaiv, a V coding agent." # 覆盖系统提示 ### 输出标志(仅 CLI) vaiv --json "read v.mod" # 机器可读:{"ok","final","stats"} vaiv --stats "read v.mod" # 答案后打印一行人类可读运行摘要 # 也适用于并行模式:VCA_PARALLEL=1 vaiv --json "1. do A\n2. do B" vaiv --report # 聚合遥测:总运行数、token、按 provider 分布 vaiv --report json # 同上,JSON 对象(对 CI / jq 友好) # 注意:--report 只读本地 data/vaiv-telemetry.sqlite,无需 API key,完全离线。 ### 会话与配置(Phase 11) vaiv --session work "refactor main.v" # 与 'work' 会话对话(不存在则新建) vaiv --session work # 以 REPL 模式继续 'work' 会话 vaiv sessions # 列出所有会话及消息条数 vaiv export work # 把 'work' 会话记录导出为 Markdown 到 stdout vaiv export work > work-chat.md # ... 重定向到文件 vaiv config # 打印解析后的配置(API key 脱敏) vaiv models # 列出已配置模型(* = 活动) vaiv models add shangtang m1 https://x/v1 # 新增模型(持久化到 .vaiv/models.yaml) vaiv models use 2 # 将第 2 个模型设为活动 # 每个会话独立存为一个文件:data/sessions/.sqlite # 默认会话为 'default'(旧的 data/session.sqlite 已迁移至此) ### 自更新(Phase 10) vaiv update # 拉取最新、重编译 bin/vaiv + bin/vaiv-web、跑测试 vaiv update --force # 忽略未提交改动(风险:可能合并覆盖本地工作) vaiv update --dry-run # 只显示步骤,不实际 pull / 编译 # 更新器在有未提交改动时会中止(绝不覆盖你的工作)。 # 任何构建/测试失败都会从 .bak 恢复旧二进制。 ## 配置 系统配置位于仓库内的 `.vaiv/config.yaml`(可提交;密钥走环境变量)。 解析顺序:`.vaiv/config.yaml` → `VCA_*` 环境变量 → 内置默认值。 当远程 provider 没有 API key 时,自动降级为 `mock`。 | 变量 | 默认值 | 用途 | |-----|---------|---------| | VCA_PROVIDER | mock | mock / openai / openrouter / ollama / llamacpp | | VCA_API_KEY | (无) | LLM key;缺失则降级为 mock(远程) | | VCA_MODEL | mock-model | 模型 id | | VCA_BASE_URL | provider 默认 | API base | | VCA_WORKDIR | 项目根(见下) | 工具沙箱根目录 | ## 运行时数据位置 所有运行时状态都锚定到 **vaiv 项目根**(即包含 `v.mod` 的目录),无论你从哪个目录启动二进制。 这意味着 `./bin/vaiv` 和 `cd bin && ./vaiv` 都写到同一处——**绝不**写进 `bin/`。 项目根由可执行文件路径推导(`/bin/vaiv` → ``)并以存在 `v.mod` 确认; 若 `vaiv` 安装在仓库之外,则回退到当前目录。 data/session.sqlite # CLI 对话记录(跨轮次 & 重启持久化) data/vaiv.log # 追加式事件日志 data/vaiv-web.sqlite # Web UI 会话(Phase 4,与 CLI 隔离) ~/.vaiv/conventions.md # 系统级用户原则(Phase 9) /.vaiv/conventions.md # 项目级原则(Phase 9,可提交) `bin/` 是构建产物目录(git 忽略),刻意不存放任何运行时数据。 ## 布局 | 变量 | 默认值 | 用途 | |-----|---------|---------| | VCA_MAX_STEPS | 12 | agent 循环最大迭代次数 | | VCA_SYSTEM | 内置 | 系统提示 | | VCA_ALLOW_WRITE | 1 | 启用 write_file / patch | | VCA_ALLOW_EXEC | 1 | 启用 terminal / vet / fmt / test | | VCA_AUTO_YES | 0 | 自动批准危险操作(跳过 `y/N`) | | VCA_DRY_RUN | 0 | 只报告意图不应用 | | VCA_RESULT_LIMIT | 8000 | 工具输出字节上限 | | VCA_COMPACT_THRESHOLD | 0 | 超过 N 条消息压缩对话记录 | | VCA_PARALLEL | 0 | 把请求分解为子任务,并发运行 | | VCA_SYSTEM | 内置 | 覆盖系统提示 | v.mod main.v # CLI 入口(module main) .vaiv/config.yaml # 系统配置 agent/ # module agent types.v config.v llm.v tools.v agent.v session.v logger.v confirm.v # 危险命令检测 + 交互式确认(Phase 1) patch.v # 精确 patch 工具(Phase 1) devtools.v # vet / fmt / test 工具(Phase 1) compress.v # 上下文压缩(Phase 2) session.v # SQLite:对话记录 + MemoryRow(Phase 2) orchestrator.v # planner + 子智能体运行时 + reducer(Phase 3) webapi.v # Phase 4:veb 处理器(REST + SSE + 页面) webstore.v # Phase 4:SQLite 支持的 Web 会话存储(data/vaiv-web.sqlite) telemetry.v # Phase 7/8 运行指标 telemetry_store.v # Phase 8 持久化遥测存储 conventions.v # Phase 9:用户原则与习惯(system+project) *_test.v # 各模块单元测试(含 webapi_test.v + webapi_http_test.v) cmd/web/ # Phase 4 入口:veb WebApp 引导 main.v scripts/ vaiv_update.vsh # Phase 10:自更新逻辑(也可 `v run` 独立运行) web/ templates/ # veb HTML 模板(index、new_session、session、about) static/ # app.js(SSE 客户端)+ style.css translations/ # zh.tr + en.tr(veb i18n,从 cwd 加载) data/ # 运行时:session.sqlite + vaiv.log(git 忽略) agents.md # 分阶段计划 + 验收标准 ## 测试 v fmt -w . && v vet . && v -silent test . ## 路线图(详见 agents.md) | 版本 | 日期 | 亮点 | |------|------|------| | v0.7.1 | 2026-07-15 | 模型管理入口(CLI+Web)、安装/卸载脚本 | | v0.7.0 | 2026-07-15 | 语法高亮模块 + v-fullstack-dev skill 索引 | | v0.6.9 | 2026-07-14 | Web UI 学习提醒「存为约定」按钮 | | v0.6.8 | 2026-07-13 | Git 工具(agent 自检) | | v0.6.7 | 2026-07-13 | GitHub Actions CI 门禁 | | v0.6.6 | 2026-07-13 | Web UI 学习提醒(SSE event: tip) | | v0.6.5 | 2026-07-13 | 约定学习提醒系统 | | v0.6.4 | 2026-07-13 | list_files + web_search 工具 | | v0.6.2 | 2026-07-13 | 多会话存储 + vaiv config 自检 | | v0.6.1 | 2026-07-13 | 自更新 + 约定模块 | | v0.6.0 | 2026-07-13 | 约定模块——agent 维护的用户原则 | | v0.5.3 | 2026-07-12 | 持久化遥测、token 用量、Web 看板 | | v0.5.2 | 2026-07-12 | 重试加固、--json/--stats 修复 | | v0.5.0 | 2026-07-12 | 运行遥测 + 机器可读输出 | | v0.4.7 | 2026-07-12 | LLM 重试 + 超时 + 工具失败守卫 | - Phase 2:记忆 + 上下文压缩。✓ - Phase 3:多智能体编排。✓ - Phase 4:可选 veb Web UI。✓ (v0.4.1) - Phase 6:LLM 重试 + 超时 + 工具失败守卫。✓ (v0.4.7) - Phase 7:运行遥测 + 机器可读 `--json`/`--stats`。✓ (v0.5.0,v0.5.2 加固) - Phase 8:持久化遥测(token 用量、SQLite 存储、`--report`、Web 看板、测试)。✓ (v0.5.3) - Phase 9:约定模块——智能体维护的用户原则与习惯(system + project 两层,注入系统提示)。✓ (v0.6.0) - Phase 10:自更新(`vaiv update`)——pull + 重编译 + 测试,带安全回滚,不经过 LLM。✓ (v0.6.1) - Phase 11:会话管理(`--session`、`vaiv sessions`、`vaiv export`)+ 配置自检(`vaiv config`)。✓ (v0.6.1)