1 line
44 KiB
JSON
1 line
44 KiB
JSON
{"repo": "20070316lbw-netizen/ai-c", "files": {"README.md": {"b66685d3d913695a0450e591f2b8fee74b475771": {"t": 1785746437.1702538, "n": 8245, "h": "0dd35c9ea82c35c5", "c": "# aic — AI Coding Assistant\n\n> 个人使用的命令行 AI 编程助手,直连主流 LLM API,无服务器依赖,无 Electron,无代理问题。\n> 内部使用,不开源。2026\n\n---\n\n## 项目定位\n\naic 的本质是一个**轻量化、私有、具备长程记忆**的 AI 编程辅助器,目标是复刻并优化类似 Claude Code 的工程实践,同时保持极简依赖(核心只有 `httpx` + `rich` + 标准库)。\n\n---\n\n## 架构分层\n\n| 层级 | 模块 | 职责 |\n|------|------|------|\n| L0 入口层 | `main.py` | argparse,参数解析,调起 repl |\n| L1 会话层 | `repl.py` / `session.py` / `config.py` / `tui.py` | 对话循环、slash 命令、消息管理、分栏渲染 |\n| L2 Provider 层 | `providers/base.py` + `claude.py` + `openai_compat.py` | 抽象流式接口,多 provider 路由 |\n| L3 Memory 层 | `memory/store.py` + `extractor.py` + `types.py` | SQLite 存储,每轮提取,记忆分类 |\n| L4 Dream 层 | `dream/scheduler.py` + `lock.py` + `consolidator.py` + `agent.py` | 三道门控,4 阶段整理,受限子代理 |\n| L5 MCP 层 | `mcp/loader.py` + `runner.py` + `registry.py` | 工具调用沙箱 |\n| L6 持久化 | `~/.aic/memory.db` + `.dream-lock` + `config.toml` | SQLite 记忆库,PID 锁,全局配置 |\n| L7 Search 层 | `search/brave.py` + `search/ddg.py` + `search/tool.py` | 内置 Web 检索,Brave 优先降级 DDG |\n| L8 Distill 层 | `distill/db.py` + `distill/pipeline.py` + `distill/primer.py` | 离线蒸馏,用户画像,Context Priming |\n| L9 Event Bus 层 | `eventbus/server.py` + `eventbus/handlers/` | 系统事件感知,shell hook,Clash 监控 |\n\n---\n\n## TUI 分栏设计\n\n```\n┌─────────────────────────┬──────────────────────────┐\n│ 💬 对话 │ 📄 文件变更 │\n│ │ │\n│ > /add main.py │ main.py │\n│ aic: 已加载 main.py │ @@ -12,4 +12,6 @@ │\n│ │ def run(): │\n│ > 帮我加初始化逻辑 │ + init_memory() │\n│ aic: 建议在 run() 里 │ + load_config() │\n│ 加这两行... │ start_repl() │\n│ │ │\n│ │ ✓ 2 additions │\n└─────────────────────────┴──────────────────────────┘\n [provider: deepseek] [model: deepseek-chat] [tokens: 1,204]\n```\n\n- 终端宽度 ≥ 120 列:左右各 50% 分栏\n- 终端宽度 < 120 列:自动退化为单列\n- 无文件加载时:全宽显示对话\n- 代码块未闭合前右栏显示占位符,闭合后触发 diff 渲染\n\n---\n\n## Provider 支持\n\n| Provider | 接口类型 | 备注 |\n|----------|----------|------|\n| Claude | Anthropic 原生 API | `x-api-key` header |\n| DeepSeek | OpenAI 兼容 | 主力便宜模型,决策层 |\n| Gemini | OpenAI 兼容 | Jules 使用 |\n| Grok | OpenAI 兼容 | xAI API,coding/推理专项 |\n| Step(阶跃星辰) | OpenAI 兼容 | 便宜,规划中作主理人模型 |\n| 任意兼容 provider | OpenAI 兼容 | config.toml 配 base_url 即可 |\n\n所有 provider 统一继承 `BaseProvider`,实现 `stream()` 接口,含 usage sentinel、status_code 检查和网络异常捕获。\n\n---\n\n## 配置\n\n```toml\n# ~/.config/aic/config.toml\nprovider = \"deepseek\"\n\n[claude]\napi_key = \"sk-ant-...\"\nmodel = \"claude-sonnet-4-20250514\"\nbase_url = \"https://api.anthropic.com\"\n\n[deepseek]\napi_key = \"sk-...\"\nmodel = \"deepseek-chat\"\nbase_url = \"https://api.deepseek.com\"\n\n[gemini]\napi_key = \"...\"\nmodel = \"gemini-2.5-pro\"\nbase_url = \"https://generativelanguage.googleapis.com/v1beta/openai\"\n\n[grok]\napi_key = \"xai-...\"\nmodel = \"grok-3-fast\"\nbase_url = \"https://api.x.ai/v1\"\n\n[dream]\nmin_unprocessed = 20\nmin_interval_h = 24\nmin_sessions = 5\nlock_timeout_h = 1\nmodel = \"deepseek-chat\"\n\n[search]\nauto_search = false\nbrave_api_key = \"\"\nmax_results = 5\n\n[pricing]\n\"claude-sonnet\" = [3.00, 15.00]\n\"claude-opus\" = [15.00, 75.00]\n\"deepseek-chat\" = [0.27, 1.10]\n\"grok-3-fast\" = [0.20, 0.40]\n\n[distill]\ngate2_hours = 24\ngate3_min_conversations = 10\n```\n\n环境变量优先级:`ENV > config.toml > 默认值`\n\n---\n\n## 上下文注入(双层)\n\n- **全局级**:`~/.aic/GLOBAL_CONTEXT.md` — 编程习惯、偏好,所有项目生效\n- **项目级**:`.aic/CONTEXT.md` — 当前项目特定指令,覆盖全局\n\n注入顺序:全局在前,项目在后。\n\n---\n\n## Memory 层\n\n### 记忆类型\n\n| 类型 | 示例 |\n|------|------|\n| `user` | 偏好中文交流;用 uv 管理环境 |\n| `feedback` | 不要生成测试桩;必须加 type hints |\n| `project` | 合并冻结从3月开始;认证是合规需求 |\n| `reference` | DeepSeek 文档地址;Linear 项目 ID |\n\n### SQLite 表结构(sql1)\n\n```sql\nCREATE TABLE memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n created_at REAL NOT NULL,\n updated_at REAL NOT NULL,\n source TEXT,\n is_archived INTEGER DEFAULT 0,\n superseded_by TEXT\n);\n```\n\n### Poor Mode\n\n`/poor` 命令切换,token 紧张时使用:\n- 跳过 extractor,不提取记忆\n- 跳过 dream 自动触发\n- 跳过 distill pipeline(归档仍执行)\n- 连续 3 次响应 output tokens > 2000 自动触发(TokenGuard)\n\n---\n\n## Dream 层\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 数量门 | 未整理记忆条数 ≥ 20 |\n| 门2 时间门 | 距上次 dream ≥ 24h 且历史会话数 ≥ 5 |\n| 门3 锁门 | PID 锁不存在 / 持有者已死 / mtime 超过 1 小时 |\n\n### 4 阶段整理\n\n| 阶段 | 名称 | 操作 |\n|------|------|------|\n| Phase 1 | Orient 定位 | 查看现有条目,了解全貌 |\n| Phase 2 | Gather 采集 | 过时记忆 → 新增条目 → 隐含信息 |\n| Phase 3 | Merge 合并 | 合并新信号,软删除被推翻事实 |\n| Phase 4 | Prune 修剪 | 低权重+高龄条目归档,每类控制数量 |\n\n断点续传:`.dream-lock` 存储当前 Phase,崩溃重启后从断点继续。\n\n---\n\n## Distill 层(sql2)\n\n离线蒸馏数据库 `~/.aic/distill.db`,与实时记忆库(sql1)完全分离。\n\n### 核心功能\n\n- **对话归档**:每次退出自动保存当前 session\n- **质量筛选**:DeepSeek 对历史对话打分,高质量进 dataset pool\n- **用户画像**:提取语言风格、决策模式、行为习惯\n- **Skill 文档**:生成 `~/.aic/skills/*.md`,人工审阅后 `/skill confirm` 入库\n- **Context Priming**:`/prime <query>` 检索历史经验注入当前上下文\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 | 未分析 session 窗口 ≥ 5 |\n| 门2 | 距上次 distill ≥ 24 小时 |\n| 门3 | 未分析对话总数 ≥ 10 |\n\n### 知识老化机制\n\n- `tech_stack` 字段记录技术栈,迁移时批量标记旧对话为 deprecated\n- 新 masterpiece 出现时,同标签旧对话 `quality_score × 0.5`\n- `/supersede <old_id> <new_id>` 手动建立替代关系\n\n---\n\n## 安全边界\n\n| 限制 | 数值 | 位置 |\n|------|------|------|\n| 单文件最大注入 | 500 KB | `session.py` |\n| 总上下文最大 | 400 KB | `session.py` |\n| 目录注入最大文件数 | 20 个 | `repl.py` |\n| TUI 渲染最大行数 | 1000 行 | `tui.py` |\n| TokenGuard 阈值 | 2000 output tokens | `session.py` |\n| Auto Poor Mode | 连续 3 次超限 | `session.py` |\n\n---\n\n## Slash 命令\n\n| 命令 | 功能 | 阶段 |\n|------|------|------|\n| `/add <file\\|dir>` | 注入文件或目录(最多 20 文件 / 400KB) | 一 |\n| `/files` | 查看已加载文件 | 一 |\n| `/clear` | 清空对话历史 | 一 |\n| `/reset` | 清空历史 + 上下文文件 | 一 |\n| `/model [name]` | 显示或热切换 provider/model(历史保留) | 一/五 |\n| `/status` | provider、model、session_id、poor_mode、token_guard、cost | 一/五 |\n| `/tree` | 显示当前目录树 | 一 |\n| `/poor` | 开关 Poor Mode | 二 |\n| `/memory [type]` | 查看/搜索记忆 | 二 |\n| `/forget <id>` | 软删除记忆条目 | 二 |\n| `/log` | 查看今日 KAIROS 日志 | 二 |\n| `/dream` | 手动触发 Dream 整理 | 三 |\n| `/mcp` | 查看已注册 MCP server 和工具列表 | 四 |\n| `/cost` | token 用量和费用估算 | 五 |\n| `/search <query>` | 手动触发 Web Search,结果注入上下文 | 五 |\n| `/index <dir>` | 索引目录建立代码检索器 | 五 |\n| `/find <query>` | 检索相关代码片段注入上下文 | 五 |\n| `/diag` | 诊断:线程数、内存、上下文大小、未处理记忆数 | 五 |\n| `/skill` | 查看/确认/拒绝 skill 文档 | 六 |\n| `/distill` | 手动触发 distill pipeline / 查看门控状态 | 六 |\n| `/prime [query]` | 检索历史经验注入当前上下文 | 六 |\n| `/supersede <old> <new>` | 手动标记旧对话被新对话替代 | 六 |\n| `/help` | 显示帮助 | 一 |\n| `/exit` | 退出 | 一 |\n\n---\n\n## 开发路线图\n\n### 阶段一 ✅ 已完成\n\n- [x] 目录骨架\n- [x] config.py\n- [x] BaseProvider + OpenAICompatProvider + ClaudeProvider\n- [x] session.py(含双层 CONTEXT 注入)\n- [x] tui.py(左对话右 diff 分栏)\n- [x] repl.py 主循环 + slash 基础命令\n\n### 阶段二 ✅ 已完成\n\n- [x] `memory/types.py` + `memory/store.py`\n- [x] `memory/extractor.py` — 每轮提取,Poor Mode 跳过\n- [x] KAIROS 日志 + `/poor` `/memory` `/forget` `/log`\n\n### 阶段三 ✅ 已完成\n\n- [x] Dream 三道门控 + PID 锁 + 断点续传\n- [x] Consolidator 4 阶段 + 受限子代理\n- [x] `/dream` 命令\n\n### 阶段四 ✅ 已完成\n\n- [x] MCP loader / runner / registry\n- [x] 沙箱临时会话,最多 10 轮工具调用\n- [x] `/mcp` 命令\n\n### 阶段五 ✅ 已完成\n\n- [x] Web Search 内置(Brave API + DuckDuckGo 降级)\n- [x] `/cost` token 统计 + 定价模糊匹配\n- [x] TokenGuard 自动 Poor Mode\n- [x] `/model` 热切换(历史保留)\n- [x] `/index` + `/find` 本地代码检索\n- [x] `/diag` 诊断命令\n- [x] 安全边界(文件大小限制、TUI 截断、HTTP 400 不重试)\n- [x] 统一错误格式(errors.py)\n\n### 阶段六(规划中)\n\n- [ ] Distill 层(sql2):对话归档、用户画像、Skill 文档、Context Priming\n- [ ] Event Bus:shell hook + Clash 监控 + inotify 文件监听\n- [ ] 多模型 `@` 调用语法\n- [ ] 子 Session 架构(DeepSeek 整理层)\n- [ ] Discord 集成\n\n### 阶段七(远期)\n\n- 自举模式:修改 aic 自身时自动加载源码\n- Langfuse 监控:token 消耗和任务链路追踪\n- Step 模型深度集成:主理人角色\n\n---\n\n## 快速开始\n\n```bash\ngit clone git@github.com:20070316lbw-netizen/AI-C.git\ncd AI-C\nuv venv .venv\nsource .venv/bin/activate\nuv pip install -e .\n\n# 配置\ncp config.example.toml ~/.config/aic/config.toml\n# 编辑填入 API key\n\n# 启动\naic\n\n# 在项目目录下启动(自动加载项目上下文)\ncd ~/your-project\naic\n```\n\n---\n\n## 依赖约定\n\n- `httpx` — HTTP 客户端,流式支持\n- `rich` — TUI 渲染\n- `sqlite3` — 标准库,memory 层\n- Python 3.12+\n- **严禁**引入 `openai` 或 `anthropic` SDK\n\n---\n\n## 开发约定\n\n- providers 层:mock `httpx` 的 stream 响应做单元测试\n- memory 层:用 `:memory:` SQLite 跑单元测试\n- dream 层:mock lock 文件和子代理调用\n- 测试统一用标准库 `unittest`,不引入 pytest\n- 所有 LLM 调用通过 `llm.complete()` 或 `provider.stream()`,不直接调 SDK\n\n---\n\n*— 内部使用,不开源 —*\n"}, "68530b3348bee5054ba60600a362a41ea85b7c3c": {"t": 1785764208.7028842, "n": 8245, "h": "0dd35c9ea82c35c5", "c": "# aic — AI Coding Assistant\n\n> 个人使用的命令行 AI 编程助手,直连主流 LLM API,无服务器依赖,无 Electron,无代理问题。\n> 内部使用,不开源。2026\n\n---\n\n## 项目定位\n\naic 的本质是一个**轻量化、私有、具备长程记忆**的 AI 编程辅助器,目标是复刻并优化类似 Claude Code 的工程实践,同时保持极简依赖(核心只有 `httpx` + `rich` + 标准库)。\n\n---\n\n## 架构分层\n\n| 层级 | 模块 | 职责 |\n|------|------|------|\n| L0 入口层 | `main.py` | argparse,参数解析,调起 repl |\n| L1 会话层 | `repl.py` / `session.py` / `config.py` / `tui.py` | 对话循环、slash 命令、消息管理、分栏渲染 |\n| L2 Provider 层 | `providers/base.py` + `claude.py` + `openai_compat.py` | 抽象流式接口,多 provider 路由 |\n| L3 Memory 层 | `memory/store.py` + `extractor.py` + `types.py` | SQLite 存储,每轮提取,记忆分类 |\n| L4 Dream 层 | `dream/scheduler.py` + `lock.py` + `consolidator.py` + `agent.py` | 三道门控,4 阶段整理,受限子代理 |\n| L5 MCP 层 | `mcp/loader.py` + `runner.py` + `registry.py` | 工具调用沙箱 |\n| L6 持久化 | `~/.aic/memory.db` + `.dream-lock` + `config.toml` | SQLite 记忆库,PID 锁,全局配置 |\n| L7 Search 层 | `search/brave.py` + `search/ddg.py` + `search/tool.py` | 内置 Web 检索,Brave 优先降级 DDG |\n| L8 Distill 层 | `distill/db.py` + `distill/pipeline.py` + `distill/primer.py` | 离线蒸馏,用户画像,Context Priming |\n| L9 Event Bus 层 | `eventbus/server.py` + `eventbus/handlers/` | 系统事件感知,shell hook,Clash 监控 |\n\n---\n\n## TUI 分栏设计\n\n```\n┌─────────────────────────┬──────────────────────────┐\n│ 💬 对话 │ 📄 文件变更 │\n│ │ │\n│ > /add main.py │ main.py │\n│ aic: 已加载 main.py │ @@ -12,4 +12,6 @@ │\n│ │ def run(): │\n│ > 帮我加初始化逻辑 │ + init_memory() │\n│ aic: 建议在 run() 里 │ + load_config() │\n│ 加这两行... │ start_repl() │\n│ │ │\n│ │ ✓ 2 additions │\n└─────────────────────────┴──────────────────────────┘\n [provider: deepseek] [model: deepseek-chat] [tokens: 1,204]\n```\n\n- 终端宽度 ≥ 120 列:左右各 50% 分栏\n- 终端宽度 < 120 列:自动退化为单列\n- 无文件加载时:全宽显示对话\n- 代码块未闭合前右栏显示占位符,闭合后触发 diff 渲染\n\n---\n\n## Provider 支持\n\n| Provider | 接口类型 | 备注 |\n|----------|----------|------|\n| Claude | Anthropic 原生 API | `x-api-key` header |\n| DeepSeek | OpenAI 兼容 | 主力便宜模型,决策层 |\n| Gemini | OpenAI 兼容 | Jules 使用 |\n| Grok | OpenAI 兼容 | xAI API,coding/推理专项 |\n| Step(阶跃星辰) | OpenAI 兼容 | 便宜,规划中作主理人模型 |\n| 任意兼容 provider | OpenAI 兼容 | config.toml 配 base_url 即可 |\n\n所有 provider 统一继承 `BaseProvider`,实现 `stream()` 接口,含 usage sentinel、status_code 检查和网络异常捕获。\n\n---\n\n## 配置\n\n```toml\n# ~/.config/aic/config.toml\nprovider = \"deepseek\"\n\n[claude]\napi_key = \"sk-ant-...\"\nmodel = \"claude-sonnet-4-20250514\"\nbase_url = \"https://api.anthropic.com\"\n\n[deepseek]\napi_key = \"sk-...\"\nmodel = \"deepseek-chat\"\nbase_url = \"https://api.deepseek.com\"\n\n[gemini]\napi_key = \"...\"\nmodel = \"gemini-2.5-pro\"\nbase_url = \"https://generativelanguage.googleapis.com/v1beta/openai\"\n\n[grok]\napi_key = \"xai-...\"\nmodel = \"grok-3-fast\"\nbase_url = \"https://api.x.ai/v1\"\n\n[dream]\nmin_unprocessed = 20\nmin_interval_h = 24\nmin_sessions = 5\nlock_timeout_h = 1\nmodel = \"deepseek-chat\"\n\n[search]\nauto_search = false\nbrave_api_key = \"\"\nmax_results = 5\n\n[pricing]\n\"claude-sonnet\" = [3.00, 15.00]\n\"claude-opus\" = [15.00, 75.00]\n\"deepseek-chat\" = [0.27, 1.10]\n\"grok-3-fast\" = [0.20, 0.40]\n\n[distill]\ngate2_hours = 24\ngate3_min_conversations = 10\n```\n\n环境变量优先级:`ENV > config.toml > 默认值`\n\n---\n\n## 上下文注入(双层)\n\n- **全局级**:`~/.aic/GLOBAL_CONTEXT.md` — 编程习惯、偏好,所有项目生效\n- **项目级**:`.aic/CONTEXT.md` — 当前项目特定指令,覆盖全局\n\n注入顺序:全局在前,项目在后。\n\n---\n\n## Memory 层\n\n### 记忆类型\n\n| 类型 | 示例 |\n|------|------|\n| `user` | 偏好中文交流;用 uv 管理环境 |\n| `feedback` | 不要生成测试桩;必须加 type hints |\n| `project` | 合并冻结从3月开始;认证是合规需求 |\n| `reference` | DeepSeek 文档地址;Linear 项目 ID |\n\n### SQLite 表结构(sql1)\n\n```sql\nCREATE TABLE memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n created_at REAL NOT NULL,\n updated_at REAL NOT NULL,\n source TEXT,\n is_archived INTEGER DEFAULT 0,\n superseded_by TEXT\n);\n```\n\n### Poor Mode\n\n`/poor` 命令切换,token 紧张时使用:\n- 跳过 extractor,不提取记忆\n- 跳过 dream 自动触发\n- 跳过 distill pipeline(归档仍执行)\n- 连续 3 次响应 output tokens > 2000 自动触发(TokenGuard)\n\n---\n\n## Dream 层\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 数量门 | 未整理记忆条数 ≥ 20 |\n| 门2 时间门 | 距上次 dream ≥ 24h 且历史会话数 ≥ 5 |\n| 门3 锁门 | PID 锁不存在 / 持有者已死 / mtime 超过 1 小时 |\n\n### 4 阶段整理\n\n| 阶段 | 名称 | 操作 |\n|------|------|------|\n| Phase 1 | Orient 定位 | 查看现有条目,了解全貌 |\n| Phase 2 | Gather 采集 | 过时记忆 → 新增条目 → 隐含信息 |\n| Phase 3 | Merge 合并 | 合并新信号,软删除被推翻事实 |\n| Phase 4 | Prune 修剪 | 低权重+高龄条目归档,每类控制数量 |\n\n断点续传:`.dream-lock` 存储当前 Phase,崩溃重启后从断点继续。\n\n---\n\n## Distill 层(sql2)\n\n离线蒸馏数据库 `~/.aic/distill.db`,与实时记忆库(sql1)完全分离。\n\n### 核心功能\n\n- **对话归档**:每次退出自动保存当前 session\n- **质量筛选**:DeepSeek 对历史对话打分,高质量进 dataset pool\n- **用户画像**:提取语言风格、决策模式、行为习惯\n- **Skill 文档**:生成 `~/.aic/skills/*.md`,人工审阅后 `/skill confirm` 入库\n- **Context Priming**:`/prime <query>` 检索历史经验注入当前上下文\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 | 未分析 session 窗口 ≥ 5 |\n| 门2 | 距上次 distill ≥ 24 小时 |\n| 门3 | 未分析对话总数 ≥ 10 |\n\n### 知识老化机制\n\n- `tech_stack` 字段记录技术栈,迁移时批量标记旧对话为 deprecated\n- 新 masterpiece 出现时,同标签旧对话 `quality_score × 0.5`\n- `/supersede <old_id> <new_id>` 手动建立替代关系\n\n---\n\n## 安全边界\n\n| 限制 | 数值 | 位置 |\n|------|------|------|\n| 单文件最大注入 | 500 KB | `session.py` |\n| 总上下文最大 | 400 KB | `session.py` |\n| 目录注入最大文件数 | 20 个 | `repl.py` |\n| TUI 渲染最大行数 | 1000 行 | `tui.py` |\n| TokenGuard 阈值 | 2000 output tokens | `session.py` |\n| Auto Poor Mode | 连续 3 次超限 | `session.py` |\n\n---\n\n## Slash 命令\n\n| 命令 | 功能 | 阶段 |\n|------|------|------|\n| `/add <file\\|dir>` | 注入文件或目录(最多 20 文件 / 400KB) | 一 |\n| `/files` | 查看已加载文件 | 一 |\n| `/clear` | 清空对话历史 | 一 |\n| `/reset` | 清空历史 + 上下文文件 | 一 |\n| `/model [name]` | 显示或热切换 provider/model(历史保留) | 一/五 |\n| `/status` | provider、model、session_id、poor_mode、token_guard、cost | 一/五 |\n| `/tree` | 显示当前目录树 | 一 |\n| `/poor` | 开关 Poor Mode | 二 |\n| `/memory [type]` | 查看/搜索记忆 | 二 |\n| `/forget <id>` | 软删除记忆条目 | 二 |\n| `/log` | 查看今日 KAIROS 日志 | 二 |\n| `/dream` | 手动触发 Dream 整理 | 三 |\n| `/mcp` | 查看已注册 MCP server 和工具列表 | 四 |\n| `/cost` | token 用量和费用估算 | 五 |\n| `/search <query>` | 手动触发 Web Search,结果注入上下文 | 五 |\n| `/index <dir>` | 索引目录建立代码检索器 | 五 |\n| `/find <query>` | 检索相关代码片段注入上下文 | 五 |\n| `/diag` | 诊断:线程数、内存、上下文大小、未处理记忆数 | 五 |\n| `/skill` | 查看/确认/拒绝 skill 文档 | 六 |\n| `/distill` | 手动触发 distill pipeline / 查看门控状态 | 六 |\n| `/prime [query]` | 检索历史经验注入当前上下文 | 六 |\n| `/supersede <old> <new>` | 手动标记旧对话被新对话替代 | 六 |\n| `/help` | 显示帮助 | 一 |\n| `/exit` | 退出 | 一 |\n\n---\n\n## 开发路线图\n\n### 阶段一 ✅ 已完成\n\n- [x] 目录骨架\n- [x] config.py\n- [x] BaseProvider + OpenAICompatProvider + ClaudeProvider\n- [x] session.py(含双层 CONTEXT 注入)\n- [x] tui.py(左对话右 diff 分栏)\n- [x] repl.py 主循环 + slash 基础命令\n\n### 阶段二 ✅ 已完成\n\n- [x] `memory/types.py` + `memory/store.py`\n- [x] `memory/extractor.py` — 每轮提取,Poor Mode 跳过\n- [x] KAIROS 日志 + `/poor` `/memory` `/forget` `/log`\n\n### 阶段三 ✅ 已完成\n\n- [x] Dream 三道门控 + PID 锁 + 断点续传\n- [x] Consolidator 4 阶段 + 受限子代理\n- [x] `/dream` 命令\n\n### 阶段四 ✅ 已完成\n\n- [x] MCP loader / runner / registry\n- [x] 沙箱临时会话,最多 10 轮工具调用\n- [x] `/mcp` 命令\n\n### 阶段五 ✅ 已完成\n\n- [x] Web Search 内置(Brave API + DuckDuckGo 降级)\n- [x] `/cost` token 统计 + 定价模糊匹配\n- [x] TokenGuard 自动 Poor Mode\n- [x] `/model` 热切换(历史保留)\n- [x] `/index` + `/find` 本地代码检索\n- [x] `/diag` 诊断命令\n- [x] 安全边界(文件大小限制、TUI 截断、HTTP 400 不重试)\n- [x] 统一错误格式(errors.py)\n\n### 阶段六(规划中)\n\n- [ ] Distill 层(sql2):对话归档、用户画像、Skill 文档、Context Priming\n- [ ] Event Bus:shell hook + Clash 监控 + inotify 文件监听\n- [ ] 多模型 `@` 调用语法\n- [ ] 子 Session 架构(DeepSeek 整理层)\n- [ ] Discord 集成\n\n### 阶段七(远期)\n\n- 自举模式:修改 aic 自身时自动加载源码\n- Langfuse 监控:token 消耗和任务链路追踪\n- Step 模型深度集成:主理人角色\n\n---\n\n## 快速开始\n\n```bash\ngit clone git@github.com:20070316lbw-netizen/AI-C.git\ncd AI-C\nuv venv .venv\nsource .venv/bin/activate\nuv pip install -e .\n\n# 配置\ncp config.example.toml ~/.config/aic/config.toml\n# 编辑填入 API key\n\n# 启动\naic\n\n# 在项目目录下启动(自动加载项目上下文)\ncd ~/your-project\naic\n```\n\n---\n\n## 依赖约定\n\n- `httpx` — HTTP 客户端,流式支持\n- `rich` — TUI 渲染\n- `sqlite3` — 标准库,memory 层\n- Python 3.12+\n- **严禁**引入 `openai` 或 `anthropic` SDK\n\n---\n\n## 开发约定\n\n- providers 层:mock `httpx` 的 stream 响应做单元测试\n- memory 层:用 `:memory:` SQLite 跑单元测试\n- dream 层:mock lock 文件和子代理调用\n- 测试统一用标准库 `unittest`,不引入 pytest\n- 所有 LLM 调用通过 `llm.complete()` 或 `provider.stream()`,不直接调 SDK\n\n---\n\n*— 内部使用,不开源 —*\n"}, "05579874e5cf429814054eecd08574ffd3a0ffbe": {"t": 1785764216.3679357, "n": 6031, "h": "1a4f99b9d931bfd8", "c": "# aic — AI Coding Assistant\n\n> 个人使用的命令行 AI 编程助手,直连主流 LLM API,无服务器依赖,无 Electron,无代理问题。\n> 内部使用,不开源。2026\n\n---\n\n## 项目定位\n\naic 的本质是一个**轻量化、私有、具备长程记忆**的 AI 编程辅助器,目标是复刻并优化类似 Claude Code 的工程实践,同时保持极简依赖(核心只有 `httpx` + `rich` + 标准库)。\n\n---\n\n## 架构分层\n\n| 层级 | 模块 | 职责 |\n|------|------|------|\n| L0 入口层 | `main.py` | argparse,参数解析,调起 repl |\n| L1 会话层 | `repl.py` / `session.py` / `config.py` / `tui.py` | 对话循环、slash 命令、消息管理、分栏渲染 |\n| L2 Provider 层 | `providers/base.py` + `claude.py` + `openai_compat.py` | 抽象流式接口,多 provider 路由 |\n| L3 Memory 层 | `memory/store.py` + `extractor.py` + `types.py` | SQLite 存储,每轮提取,记忆分类 |\n| L4 Dream 层 | `dream/scheduler.py` + `lock.py` + `consolidator.py` + `agent.py` | 三道门控,4 阶段整理,受限子代理 |\n| L5 MCP 层 | `mcp/loader.py` + `runner.py` + `registry.py` | 工具调用(后期) |\n| L6 持久化 | `~/.aic/memory.db` + `.dream-lock` + `config.toml` | SQLite 记忆库,PID 锁,全局配置 |\n\n---\n\n## TUI 分栏设计\n\n```\n┌─────────────────────────┬──────────────────────────┐\n│ 💬 对话 │ 📄 文件变更 │\n│ │ │\n│ > /add main.py │ main.py │\n│ aic: 已加载 main.py │ @@ -12,4 +12,6 @@ │\n│ │ def run(): │\n│ > 帮我加初始化逻辑 │ + init_memory() │\n│ aic: 建议在 run() 里 │ + load_config() │\n│ 加这两行... │ start_repl() │\n│ │ │\n│ │ ✓ 2 additions │\n└─────────────────────────┴──────────────────────────┘\n [provider: deepseek] [model: deepseek-chat] [tokens: 1,204]\n```\n\n- 终端宽度 ≥ 120 列:左右各 50% 分栏\n- 终端宽度 < 120 列:自动退化为单列\n- 无文件加载时:全宽显示对话\n- 代码块未闭合前右栏显示占位符,闭合后触发 diff 渲染\n\n---\n\n## Provider 支持\n\n| Provider | 接口类型 | 备注 |\n|----------|----------|------|\n| Claude | Anthropic 原生 API | `x-api-key` header |\n| DeepSeek | OpenAI 兼容 | 主力便宜模型 |\n| Gemini | OpenAI 兼容 | Jules 使用 |\n| GPT / o 系列 | OpenAI 兼容 | 按需使用 |\n| Step(阶跃星辰) | OpenAI 兼容 | 便宜,agent 微调,后续考虑 |\n| 任意兼容 provider | OpenAI 兼容 | config.toml 配 base_url 即可 |\n\n所有 provider 统一继承 `BaseProvider`,实现 `stream()` 接口,含 status_code 检查和网络异常捕获。\n\n---\n\n## 配置\n\n```toml\n# ~/.config/aic/config.toml\nprovider = \"deepseek\"\n\n[claude]\napi_key = \"sk-ant-...\"\nmodel = \"claude-sonnet-4-20250514\"\nbase_url = \"https://api.anthropic.com\"\n\n[deepseek]\napi_key = \"sk-...\"\nmodel = \"deepseek-chat\"\nbase_url = \"https://api.deepseek.com\"\n\n[gemini]\napi_key = \"...\"\nmodel = \"gemini-2.5-pro\"\nbase_url = \"https://generativelanguage.googleapis.com/v1beta/openai\"\n\n[dream]\nmin_unprocessed = 20\nmin_interval_h = 24\nmin_sessions = 5\nlock_timeout_h = 1\nmodel = \"deepseek-chat\"\n```\n\n环境变量优先级:`ENV > config.toml > 默认值`\n\n---\n\n## 上下文注入(双层)\n\n- **全局级**:`~/.aic/GLOBAL_CONTEXT.md` — 编程习惯、偏好,所有项目生效\n- **项目级**:`.aic/CONTEXT.md` — 当前项目特定指令,覆盖全局\n\n注入顺序:全局在前,项目在后。\n\n---\n\n## Memory 层\n\n### 记忆类型\n\n| 类型 | 示例 |\n|------|------|\n| `user` | 偏好中文交流;用 uv 管理环境 |\n| `feedback` | 不要生成测试桩;必须加 type hints |\n| `project` | 合并冻结从3月开始;认证是合规需求 |\n| `reference` | DeepSeek 文档地址;Linear 项目 ID |\n\n### SQLite 表结构\n\n```sql\nCREATE TABLE memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n created_at REAL NOT NULL,\n updated_at REAL NOT NULL,\n source TEXT,\n is_archived INTEGER DEFAULT 0, -- 软删除,不硬删\n superseded_by TEXT -- 指向替代条目的 id\n);\n```\n\n### Poor Mode\n\n`/poor` 命令切换,token 紧张时使用:\n- 跳过 extractor,不提取记忆\n- 跳过 dream 自动触发\n- Web Search 不受影响\n\n---\n\n## Dream 层\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 数量门 | 未整理记忆条数 ≥ 20 |\n| 门2 时间门 | 距上次 dream ≥ 24h 且历史会话数 ≥ 5 |\n| 门3 锁门 | PID 锁不存在 / 持有者已死 / mtime 超过1小时 |\n\n### 4 阶段整理\n\n| 阶段 | 名称 | 操作 |\n|------|------|------|\n| Phase 1 | Orient 定位 | 查看现有条目,了解全貌 |\n| Phase 2 | Gather 采集 | 过时记忆 → 新增条目 → 隐含信息 |\n| Phase 3 | Merge 合并 | 合并新信号,相对日期转绝对,软删除被推翻事实 |\n| Phase 4 | Prune 修剪 | 低权重+高龄条目归档,每类控制数量 |\n\n### 断点续传\n\n`.dream-lock` 存储 JSON 格式任务状态,记录当前执行到 Phase 几,崩溃重启后从断点继续,不重复消耗 token。\n\n---\n\n## Slash 命令\n\n| 命令 | 功能 | 阶段 |\n|------|------|------|\n| `/add <file>` | 注入文件到上下文(自动检测二进制拒绝加载) | 一 |\n| `/files` | 查看已加载文件 | 一 |\n| `/clear` | 清空对话历史 | 一 |\n| `/reset` | 清空历史 + 上下文文件 | 一 |\n| `/model` | 切换 provider/model | 一 |\n| `/status` | 当前 provider、model、session_id | 一 |\n| `/tree` | 显示当前目录树 | 一 |\n| `/poor` | 开关 Poor Mode | 二 |\n| `/memory [type]` | 查看/搜索记忆 | 二 |\n| `/forget <id>` | 软删除记忆条目 | 二 |\n| `/log` | 查看今日 KAIROS 日志 | 二 |\n| `/dream` | 手动触发 Dream 整理 | 三 |\n| `/cost` | token 用量和费用估算 | 五 |\n| `/help` | 显示帮助 | 一 |\n| `/exit` | 退出 | 一 |\n\n---\n\n## 开发路线图\n\n### 阶段一 ✅ 已完成\n\n- [x] 目录骨架\n- [x] config.py\n- [x] BaseProvider + OpenAICompatProvider\n- [x] ClaudeProvider\n- [x] session.py(含双层 CONTEXT 注入)\n- [x] tui.py(左对话右 diff 分栏)\n- [x] repl.py 主循环 + slash 基础命令\n- [x] 集成测试 + .gitignore(#8 进行中)\n\n### 阶段二 ✅ 已完成\n\n并行三个 issue:\n- [x] **#9** `memory/types.py` + `memory/store.py` — SQLite 建表,软删除字段\n- [x] **#10** `memory/extractor.py` — 每轮提取,Poor Mode 跳过\n- [x] **#11** KAIROS 日志 + `/poor` `/memory` `/forget` `/log` 命令\n\n### 阶段三 ✅ 已完成,正在验收\n\n- [x] Dream 三道门控 + PID 锁 + 断点续传\n- [x] Consolidator 4 阶段 + 受限子代理\n- [x] `/dream` 命令\n\n### 阶段四\n\n- MCP loader/runner/registry\n- `.aic/mcp.json` 配置格式\n\n### 阶段五\n\n- Web Search 内置工具(Brave API 优先,降级 DuckDuckGo)\n- `/cost` token 统计\n- 体验打磨\n\n### 阶段六(远期)\n\n- **多 Agent 协作**:参考 OpenClaw 架构,针对安全性做调整,开源社区已有多个参考实现\n- **Discord 集成**:为 agent 创建 Discord 账号,通过 Discord 服务器传递信号,实现远程任务触发和结果推送\n- **Step 模型深度集成**:阶跃星辰 agent 微调版本,适合后台 Dream 子代理(价格优势 + agent 能力)\n- **Langfuse 监控**:agent 可观测性,追踪 token 消耗和任务链路\n- **自举模式**:对 aic 自身进行修改时,自动加载源码作为上下文\n\n---\n\n## 快速开始\n\n```bash\ngit clone https://github.com/你的用户名/AI-C.git aic\ncd aic\nuv venv\nuv pip install -e .\n\n# 配置\ncp config.example.toml ~/.config/aic/config.toml\n# 编辑填入 API key\n\n# 启动\naic\n# 或\npython -m aic\n```\n\n---\n\n## 依赖约定\n\n- `httpx` — HTTP 客户端,流式支持\n- `rich` — TUI 渲染\n- `sqlite3` — 标准库,memory 层\n- Python 3.12+\n- **严禁**引入 `openai` 或 `anthropic` SDK\n\n---\n\n## 开发约定\n\n- providers 层:mock `httpx` 的 stream 响应做单元测试\n- memory 层:用 `:memory:` SQLite 跑单元测试\n- dream 层:mock lock 文件和子代理调用\n- 测试统一用标准库 `unittest`,不引入 pytest\n\n---\n\n*— 内部使用,不开源 —*\n"}, "fa9a0bdb5c692d6b4216dc751d316272317c32cc": {"t": 1785764218.4300752, "n": 6004, "h": "3cd914229baa9165", "c": "# aic — AI Coding Assistant\n\n> 个人使用的命令行 AI 编程助手,直连主流 LLM API,无服务器依赖,无 Electron,无代理问题。\n> 内部使用,不开源。2026\n\n---\n\n## 项目定位\n\naic 的本质是一个**轻量化、私有、具备长程记忆**的 AI 编程辅助器,目标是复刻并优化类似 Claude Code 的工程实践,同时保持极简依赖(核心只有 `httpx` + `rich` + 标准库)。\n\n---\n\n## 架构分层\n\n| 层级 | 模块 | 职责 |\n|------|------|------|\n| L0 入口层 | `main.py` | argparse,参数解析,调起 repl |\n| L1 会话层 | `repl.py` / `session.py` / `config.py` / `tui.py` | 对话循环、slash 命令、消息管理、分栏渲染 |\n| L2 Provider 层 | `providers/base.py` + `claude.py` + `openai_compat.py` | 抽象流式接口,多 provider 路由 |\n| L3 Memory 层 | `memory/store.py` + `extractor.py` + `types.py` | SQLite 存储,每轮提取,记忆分类 |\n| L4 Dream 层 | `dream/scheduler.py` + `lock.py` + `consolidator.py` + `agent.py` | 三道门控,4 阶段整理,受限子代理 |\n| L5 MCP 层 | `mcp/loader.py` + `runner.py` + `registry.py` | 工具调用(后期) |\n| L6 持久化 | `~/.aic/memory.db` + `.dream-lock` + `config.toml` | SQLite 记忆库,PID 锁,全局配置 |\n\n---\n\n## TUI 分栏设计\n\n```\n┌─────────────────────────┬──────────────────────────┐\n│ 💬 对话 │ 📄 文件变更 │\n│ │ │\n│ > /add main.py │ main.py │\n│ aic: 已加载 main.py │ @@ -12,4 +12,6 @@ │\n│ │ def run(): │\n│ > 帮我加初始化逻辑 │ + init_memory() │\n│ aic: 建议在 run() 里 │ + load_config() │\n│ 加这两行... │ start_repl() │\n│ │ │\n│ │ ✓ 2 additions │\n└─────────────────────────┴──────────────────────────┘\n [provider: deepseek] [model: deepseek-chat] [tokens: 1,204]\n```\n\n- 终端宽度 ≥ 120 列:左右各 50% 分栏\n- 终端宽度 < 120 列:自动退化为单列\n- 无文件加载时:全宽显示对话\n- 代码块未闭合前右栏显示占位符,闭合后触发 diff 渲染\n\n---\n\n## Provider 支持\n\n| Provider | 接口类型 | 备注 |\n|----------|----------|------|\n| Claude | Anthropic 原生 API | `x-api-key` header |\n| DeepSeek | OpenAI 兼容 | 主力便宜模型 |\n| Gemini | OpenAI 兼容 | Jules 使用 |\n| GPT / o 系列 | OpenAI 兼容 | 按需使用 |\n| Step(阶跃星辰) | OpenAI 兼容 | 便宜,agent 微调,后续考虑 |\n| 任意兼容 provider | OpenAI 兼容 | config.toml 配 base_url 即可 |\n\n所有 provider 统一继承 `BaseProvider`,实现 `stream()` 接口,含 status_code 检查和网络异常捕获。\n\n---\n\n## 配置\n\n```toml\n# ~/.config/aic/config.toml\nprovider = \"deepseek\"\n\n[claude]\napi_key = \"sk-ant-...\"\nmodel = \"claude-sonnet-4-20250514\"\nbase_url = \"https://api.anthropic.com\"\n\n[deepseek]\napi_key = \"sk-...\"\nmodel = \"deepseek-chat\"\nbase_url = \"https://api.deepseek.com\"\n\n[gemini]\napi_key = \"...\"\nmodel = \"gemini-2.5-pro\"\nbase_url = \"https://generativelanguage.googleapis.com/v1beta/openai\"\n\n[dream]\nmin_unprocessed = 20\nmin_interval_h = 24\nmin_sessions = 5\nlock_timeout_h = 1\nmodel = \"deepseek-chat\"\n```\n\n环境变量优先级:`ENV > config.toml > 默认值`\n\n---\n\n## 上下文注入(双层)\n\n- **全局级**:`~/.aic/GLOBAL_CONTEXT.md` — 编程习惯、偏好,所有项目生效\n- **项目级**:`.aic/CONTEXT.md` — 当前项目特定指令,覆盖全局\n\n注入顺序:全局在前,项目在后。\n\n---\n\n## Memory 层\n\n### 记忆类型\n\n| 类型 | 示例 |\n|------|------|\n| `user` | 偏好中文交流;用 uv 管理环境 |\n| `feedback` | 不要生成测试桩;必须加 type hints |\n| `project` | 合并冻结从3月开始;认证是合规需求 |\n| `reference` | DeepSeek 文档地址;Linear 项目 ID |\n\n### SQLite 表结构\n\n```sql\nCREATE TABLE memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n created_at REAL NOT NULL,\n updated_at REAL NOT NULL,\n source TEXT,\n is_archived INTEGER DEFAULT 0, -- 软删除,不硬删\n superseded_by TEXT -- 指向替代条目的 id\n);\n```\n\n### Poor Mode\n\n`/poor` 命令切换,token 紧张时使用:\n- 跳过 extractor,不提取记忆\n- 跳过 dream 自动触发\n- Web Search 不受影响\n\n---\n\n## Dream 层\n\n### 三道门控\n\n| 门 | 条件 |\n|----|------|\n| 门1 数量门 | 未整理记忆条数 ≥ 20 |\n| 门2 时间门 | 距上次 dream ≥ 24h 且历史会话数 ≥ 5 |\n| 门3 锁门 | PID 锁不存在 / 持有者已死 / mtime 超过1小时 |\n\n### 4 阶段整理\n\n| 阶段 | 名称 | 操作 |\n|------|------|------|\n| Phase 1 | Orient 定位 | 查看现有条目,了解全貌 |\n| Phase 2 | Gather 采集 | 过时记忆 → 新增条目 → 隐含信息 |\n| Phase 3 | Merge 合并 | 合并新信号,相对日期转绝对,软删除被推翻事实 |\n| Phase 4 | Prune 修剪 | 低权重+高龄条目归档,每类控制数量 |\n\n### 断点续传\n\n`.dream-lock` 存储 JSON 格式任务状态,记录当前执行到 Phase 几,崩溃重启后从断点继续,不重复消耗 token。\n\n---\n\n## Slash 命令\n\n| 命令 | 功能 | 阶段 |\n|------|------|------|\n| `/add <file>` | 注入文件到上下文(自动检测二进制拒绝加载) | 一 |\n| `/files` | 查看已加载文件 | 一 |\n| `/clear` | 清空对话历史 | 一 |\n| `/reset` | 清空历史 + 上下文文件 | 一 |\n| `/model` | 切换 provider/model | 一 |\n| `/status` | 当前 provider、model、session_id | 一 |\n| `/tree` | 显示当前目录树 | 一 |\n| `/poor` | 开关 Poor Mode | 二 |\n| `/memory [type]` | 查看/搜索记忆 | 二 |\n| `/forget <id>` | 软删除记忆条目 | 二 |\n| `/log` | 查看今日 KAIROS 日志 | 二 |\n| `/dream` | 手动触发 Dream 整理 | 三 |\n| `/cost` | token 用量和费用估算 | 五 |\n| `/help` | 显示帮助 | 一 |\n| `/exit` | 退出 | 一 |\n\n---\n\n## 开发路线图\n\n### 阶段一(当前)✅ 接近完成\n\n- [x] 目录骨架\n- [x] config.py\n- [x] BaseProvider + OpenAICompatProvider\n- [x] ClaudeProvider\n- [x] session.py(含双层 CONTEXT 注入)\n- [x] tui.py(左对话右 diff 分栏)\n- [x] repl.py 主循环 + slash 基础命令\n- [ ] 集成测试 + .gitignore(#8 进行中)\n\n### 阶段二(#8 合并后开始)\n\n并行三个 issue:\n- **#9** `memory/types.py` + `memory/store.py` — SQLite 建表,软删除字段\n- **#10** `memory/extractor.py` — 每轮提取,Poor Mode 跳过\n- **#11** KAIROS 日志 + `/poor` `/memory` `/forget` `/log` 命令\n\n### 阶段三\n\n- Dream 三道门控 + PID 锁 + 断点续传\n- Consolidator 4 阶段 + 受限子代理\n- `/dream` 命令\n\n### 阶段四\n\n- MCP loader/runner/registry\n- `.aic/mcp.json` 配置格式\n\n### 阶段五\n\n- Web Search 内置工具(Brave API 优先,降级 DuckDuckGo)\n- `/cost` token 统计\n- 体验打磨\n\n### 阶段六(远期)\n\n- **多 Agent 协作**:参考 OpenClaw 架构,针对安全性做调整,开源社区已有多个参考实现\n- **Discord 集成**:为 agent 创建 Discord 账号,通过 Discord 服务器传递信号,实现远程任务触发和结果推送\n- **Step 模型深度集成**:阶跃星辰 agent 微调版本,适合后台 Dream 子代理(价格优势 + agent 能力)\n- **Langfuse 监控**:agent 可观测性,追踪 token 消耗和任务链路\n- **自举模式**:对 aic 自身进行修改时,自动加载源码作为上下文\n\n---\n\n## 快速开始\n\n```bash\ngit clone https://github.com/你的用户名/AI-C.git aic\ncd aic\nuv venv\nuv pip install -e .\n\n# 配置\ncp config.example.toml ~/.config/aic/config.toml\n# 编辑填入 API key\n\n# 启动\naic\n# 或\npython -m aic\n```\n\n---\n\n## 依赖约定\n\n- `httpx` — HTTP 客户端,流式支持\n- `rich` — TUI 渲染\n- `sqlite3` — 标准库,memory 层\n- Python 3.12+\n- **严禁**引入 `openai` 或 `anthropic` SDK\n\n---\n\n## 开发约定\n\n- providers 层:mock `httpx` 的 stream 响应做单元测试\n- memory 层:用 `:memory:` SQLite 跑单元测试\n- dream 层:mock lock 文件和子代理调用\n- 测试统一用标准库 `unittest`,不引入 pytest\n\n---\n\n*— 内部使用,不开源 —*\n"}, "4f33ecb1899012a6a7abd2e684cc0100b2caae39": {"t": 1785764219.9136262, "n": 1196, "h": "ff63db19b90a68a6", "c": "# aic — AI Coding Assistant\n\n> 个人使用的命令行 AI 编程助手,直连主流 LLM API,无服务器依赖,无 Electron。\n\n---\n\n## 特性\n\n- 直连 API(Claude / DeepSeek / Gemini / GPT),不依赖任何第三方 CLI 框架\n- 分栏 TUI:左侧对话,右侧文件变更 diff(`rich` 实现)\n- Memory 体系:SQLite 持久化,四类记忆分类\n- Dream 整理:三道门控自动触发,4 阶段 prompt 整理记忆\n- Agent prompt 文件驱动,存放于 `.aic/agents/`,不硬编码\n- Poor Mode:token 紧张时关闭记忆提取\n\n## 项目状态\n\n🚧 **阶段一开发中** — Provider 抽象 + 基础 REPL\n\n## 架构层级\n\n```\nL0 main.py argparse 入口\nL1 repl / session 对话循环、slash 命令、消息管理\nL2 providers 流式接口抽象,多 provider 路由\nL3 memory SQLite 存储,记忆提取与分类\nL4 dream 三道门控,4 阶段自动整理\nL5 mcp 工具调用(后期)\nL6 持久化 ~/.aic/memory.db + config.toml\n```\n\n## 快速开始\n\n```bash\n# 安装(uv 推荐)\nuv pip install -e .\n\n# 配置\ncp config.example.toml ~/.config/aic/config.toml\n# 编辑填入 API key\n\n# 启动\naic\n```\n\n## 配置示例\n\n见 `config.example.toml`\n\n## 开发路线图\n\n| 阶段 | 内容 | 状态 |\n|------|------|------|\n| 阶段一 | Provider 抽象 + REPL + TUI 分栏 | 🚧 进行中 |\n| 阶段二 | Memory 全套 + KAIROS 日志 + Poor Mode | ⏳ 待开始 |\n| 阶段三 | Dream 三道门 + 受限子代理 | ⏳ 待开始 |\n| 阶段四 | MCP loader/runner | ⏳ 待开始 |\n| 阶段五 | Web Search + /cost 统计 | ⏳ 待开始 |\n\n## 依赖\n\n- `httpx` — HTTP 客户端(流式支持)\n- `rich` — TUI 渲染\n- `sqlite3` — 标准库,memory 层\n- Python 3.12+\n\n---\n\n*内部使用,不开源。*\n"}, "75fa99bf08bf86e4b9c5c44d024d6430e74916cd": {"t": 1785764221.5402136, "n": 6, "h": "733f95fb52cbabc0", "c": "# AI-C"}}}} |