{"_id":"@alkaidstart/call-code","name":"@alkaidstart/call-code","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@alkaidstart/call-code","version":"0.1.0","type":"module","bin":{"call-code":"bin/call-code.js"},"publishConfig":{"access":"public"},"engines":{"node":">=22.5.0"},"packageManager":"bun@1.3.11","workspaces":["packages/*"],"scripts":{"dev":"tsx source/app.tsx","start":"tsx source/app.tsx","build":"bun scripts/build.ts","typecheck":"tsc -p tsconfig.json --noEmit","typecheck:client":"tsc -p packages/client/tsconfig.json --noEmit","test":"vitest run --reporter verbose","build:agent-core":"tsc -p packages/agent-core/tsconfig.json","build:session-sqlite":"tsc -p packages/session-sqlite/tsconfig.json","build:server":"bun run build:session-sqlite && bun run build:agent-core && bun run --cwd packages/server build","export:web":"tsx tests/export-web.ts","dev:client":"bun run --cwd packages/client dev","build:client":"bun run --cwd packages/client build","preview:client":"bun run --cwd packages/client preview","web:serve":"tsx source/web-server.ts","prepublishOnly":"bun run build && bun run test"},"dependencies":{"dotenv":"^17.4.2","ink":"^7.1.1","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","openai":"^6.34.0","react":"^19.2.8","react-dom":"^19.2.8","sqlite-vec":"^0.1.9","tesseract.js":"^7.0.0","tiktoken":"^1.0.20","ws":"^8.21.3"},"devDependencies":{"@types/node":"^25.6.0","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@types/ws":"^8.18.1","esbuild":"^0.28.2","prettier":"^3.4.2","tsx":"^4.23.7","typescript":"^6.0.3","vite":"^8.2.0","vitest":"^3.2.4"},"trustedDependencies":["esbuild","tesseract.js"],"gitHead":"a037b6ab64d955059e2a8ab5606698fad86b4d73","_id":"@alkaidstart/call-code@0.1.0","description":"<p align=\"center\">   <img src=\"packages/client/assets/call-code.png\" alt=\"call-code 产品标识\" width=\"240\" /> </p>","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-OLtz+uD66Pip6W5hij3Lhqvq6giydI10No8lbhYO0SQuHz1j/hcOFBDoQQDX6AG44Tbirbrx2KsBa93O7SJscw==","shasum":"7211c76f0bcc3f62ffb73e2e542db84782ea8590","tarball":"https://registry.npmjs.org/@alkaidstart/call-code/-/call-code-0.1.0.tgz","fileCount":11,"unpackedSize":1297407,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDnehLQfXNRsRBV4h7FvAHQjV8Y0MCY1cZ9ZByVP2eOiAiEAjlUJC12p8SZS93zTWxSIZC5rmjOomE2u52cdTtMc6OQ="}]},"_npmUser":{"name":"alkaidstart","email":"2595006848@qq.com"},"directories":{},"maintainers":[{"name":"alkaidstart","email":"2595006848@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/call-code_0.1.0_1788000360579_0.7607789465491592"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T10:46:00.365Z","0.1.0":"2026-08-29T10:46:00.747Z","modified":"2026-08-29T10:46:00.989Z"},"maintainers":[{"name":"alkaidstart","email":"2595006848@qq.com"}],"description":"<p align=\"center\">   <img src=\"packages/client/assets/call-code.png\" alt=\"call-code 产品标识\" width=\"240\" /> </p>","readme":"# call-code\n\n<p align=\"center\">\n  <img src=\"packages/client/assets/call-code.png\" alt=\"call-code 产品标识\" width=\"240\" />\n</p>\n\n![Node.js](https://img.shields.io/badge/Node.js-22.5%2B-339933?logo=nodedotjs&logoColor=white)\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)\n![Bun](https://img.shields.io/badge/Bun-1.3.11-F69220?logo=bun&logoColor=white)\n![MIT License](https://img.shields.io/badge/License-MIT-4B32C3)\n\ncall-code 是一个本地运行的终端编程 Agent（CLI coding agent），基于 Node.js、TypeScript、Bun 和 Ink 构建。它可以在用户当前工作目录中接受自然语言任务，通过工具调用读取文件、写入文件、执行命令、搜索代码、查看环境信息，并结合本地短/长期记忆持续完成任务。\n\n## 功能特性\n\n- 终端交互界面：基于 Ink 的命令行界面，支持首页、对话、历史选择和相关页面预览。\n- 双执行模式：`PLAN` 模式只允许生成计划和读取环境，`BUILD` 模式可以写入文件、执行命令并推进任务。\n- 本地工具集：内置 `get_environment`、`read_file`、`write_file`、`search`、`bash`、`git_diff`、`ocr_image` 七个工具。\n- 结构化响应协议：模型输出统一为 `tool_call` 或 `final` 的 JSON action，循环解析并继续执行。\n- 本地记忆：短期记忆按任务保存，长期记忆按主题沉淀，仅在进程内使用，不写入本地 JSON。\n- 上下文预算：运行时基于 token 估算对历史消息做裁剪，减少超出模型上下文的风险。\n- 会话持久化：基于 Node 内置 `node:sqlite` 保存会话、条目、泳道、分支、记录、统计、事实和租约，默认写入 `.agent-sessions/sessions.db`。\n- 会话客户端：`packages/client` 提供 React + Vite 会话界面，通过 WebSocket 实时展示会话数据。\n\n## 架构\n\n```text\nsource/app.tsx                         CLI 层\n   首页 / 对话 / 历史 / 相关页面预览\n        │  用户输入、命令与活动面板操作\n        ▼\nagent-core/src/harness                核心层\n├─ core/       agent、LLM 客户端与任务状态\n├─ runtime/    runLoop 主循环、会话与工具运行时\n├─ context/    构建上下文、历史摘要与 token 预算\n├─ compaction/ 上下文压缩与分支摘要\n├─ protocol/   解析 tool_call / final JSON action\n├─ prompt/     系统提示词、工具说明与模式提示词\n├─ tools/      七个本地工具，及 PLAN / BUILD 权限\n│  └─ policy/  模式权限守卫\n├─ session/    会话恢复、活动查询与任务会话\n├─ memory/     短期 / 长期记忆（仅存内存，不落盘 JSON）\n└─ utils/      shell 与文本截断等通用工具\n        │  OpenAI chat.completions 请求（支持流式）\n        ▼\nOpenAI-compatible LLM                  模型层\n        ▲\n        │  返回 tool_call 或 final action\n        └── 循环执行，直到任务完成\n```\n\n整体架构见交互式版本 [docs/index.html](docs/index.html)，可明暗主题切换、搜索、关系高亮与节点聚焦，直接在浏览器打开。`docs/index.html` 会由 GitHub Actions 发布到 `gh-pages` 分支。\n\n运行时核心流程：\n\n1. CLI 接收自然语言任务，交给 agent 构建上下文并调用 LLM。\n2. 模型返回 `tool_call` 或 `final`，由 protocol 解析为结构化 action。\n3. tools/policy 按 `PLAN` / `BUILD` 模式校验权限，允许后由对应工具执行。\n4. 工具执行结果作为 observation 回写，memory 记录关键信息，循环继续，直到返回 `final`。\n\n## 项目结构\n\n```text\nsource/\n  app.tsx                    # Ink CLI 入口与交互界面\n  web-server.ts              # Web 会话面板服务入口\npackages/\n  agent-core/                # 核心 agent、上下文、记忆、工具与协议实现\n    src/\n      harness/\n        core/                # agent、LLM、任务状态\n        runtime/             # runLoop、会话与工具运行时\n        context/             # 上下文构建、摘要与 token 管理\n        compaction/          # 上下文压缩与分支摘要\n        memory/              # 短期/长期记忆存储与检索\n        protocol/            # 模型 action/observation 协议解析\n        prompt/              # 系统提示词、工具说明、模式提示词\n        session/             # 会话恢复、活动查询与任务会话\n        tools/               # 七个本地工具\n        tools/policy/        # PLAN/BUILD 模式下的工具权限\n        utils/               # shell 与文本截断等工具\n      types/                 # 领域类型\n      utils/                 # JSON、日志工具\n      web/                   # 会话导出与 WebSocket 服务\n  client/                    # TypeScript + React 会话界面客户端（WebSocket 数据）\n  session-sqlite/            # 基于 node:sqlite 的会话历史与运行状态存储\ntests/                        # 项目统一单元测试\n vitest.config.ts             # Vitest 测试配置\n```\n\n## 会话存储\n\n会话历史由 `packages/session-sqlite` 持久化，默认数据库路径为 `.agent-sessions/sessions.db`。也可以通过 `SESSION_DB_PATH` 环境变量覆盖路径。数据层支持：\n\n- 会话：会话元数据、父子会话和当前工作目录。\n- 条目：用户、助手、工具和系统消息，支持泳道与分支。\n- 记录与统计：运行记录、token 消耗、成本等统计信息。\n- 事实与租约：供长任务复用的事实表，以及并发写入保护租约。\n\n## 快速开始\n\n1. 安装依赖（需要 Node.js 22.5+，包管理器为 Bun，版本固定为 1.3.11）。\n2. 将 `.env.example` 复制为 `.env.local`，配置 `OPENAI_API_KEY` 与 `OPENAI_MODEL`；`.env` 与 `.env.local` 都会被加载。\n3. 启动 CLI，入口为 `source/app.tsx`。\n\n```bash\ncp .env.example .env.local\nbun install\nbun dev\n```\n\n进入 CLI 后可以直接输入自然语言任务。CLI 默认按当前模式执行：`PLAN` 模式先生成计划，`BUILD` 模式直接参与文件读写和命令执行。计划生成后可用 Enter 确认执行，也可以继续补充修改意见。\n\n## 环境变量\n\n| 变量                  | 说明                                                                         |\n| --------------------- | ---------------------------------------------------------------------------- |\n| `OPENAI_API_KEY`      | 必填，OpenAI 兼容 API 的 Key。                                               |\n| `OPENAI_API_BASE_URL` | 可选，自定义 OpenAI 兼容 base URL。                                          |\n| `OPENAI_MODEL`        | 必填，模型名称，无默认值；未配置时 CLI 会提示。                              |\n| `OPENAI_CONTEXT_WINDOW` | 可选，上下文窗口 token 数，默认 8000。                                     |\n| `AGENT_DESKTOP_DIR`   | 可选，覆盖桌面目录路径，便于测试或自定义工作环境。                           |\n| `SESSION_DB_PATH`     | 可选，SQLite 会话库文件路径，默认 `.agent-sessions/sessions.db`。            |\n| `CALL_CODE_WEB_DATA`  | 可选，CLI 内 `/export` 的输出路径，默认 `packages/client/public/data.json`。 |\n| `CALL_CODE_WEB_PORT`  | 可选，Web 会话面板监听端口，默认 4173。                                      |\n\n## CLI 命令与快捷键\n\n```text\n/help      查看命令与快捷键\n/history   打开最近对话和相关页面选择\n/pages     打开相关页面选择\n/memory    查看 memory 概览\n/status    查看当前 CLI 状态\n/export    导出会话数据到 JSON 文件\n/mode      查看当前模式和阶段\n/plan      切换到 PLAN 模式\n/build     切换到 BUILD 模式\n/clear     清空当前聊天窗口\n/home      返回首页并保留当前会话\n/exit      结束当前会话并返回首页\n```\n\n快捷键：`Tab` 切换模式，`Ctrl+H` 打开历史选择，`Esc` 返回首页或退出选择，`Ctrl+C` 退出程序。\n\n## 常用命令\n\n以下命令与当前 CI 保持一致：\n\n```bash\n# 启动 CLI\nbun dev\n\n# 类型检查\nbun run typecheck\n\n# 类型检查（session-sqlite）\nbun x tsc -p packages/session-sqlite/tsconfig.json --noEmit\n\n# 类型检查客户端\nbun run typecheck:client\n\n# 运行全部测试（推荐）\nbun run test\n\n# 构建 agent-core\nbun run build:agent-core\n\n# 导出会话数据到 packages/client/public/data.json\nbun run export:web\n\n# 构建会话客户端（本地预览用）\nbun run build:client\n\n# 启动 Web 会话面板（静态托管客户端 + WebSocket 数据服务）\nbun run web:serve\n```\n\n## Web 会话面板\n\nWeb 会话面板由 `source/web-server.ts` 启动：它读取 `SESSION_DB_PATH` 指向的会话库，静态托管 `packages/client/dist`，并在 `/ws` 提供 `sessions.list` / `sessions.snapshot` 消息。客户端默认连接同源 `/ws`，并周期性刷新会话快照；也可以用 `?ws=<url>` 覆盖服务地址，用 `?session=<id>` 直达某个会话。\n\n```bash\nbun run build:client\nbun run web:serve\n```\n\n然后打开 `http://127.0.0.1:4173`。开发模式下先启动 `web:serve`，再运行 `bun run dev:client`，Vite 会把 `/ws` 代理到会话服务。\n\n## Docker 镜像\n\n构建镜像：\n\n```bash\ndocker build -t call-code .\n```\n\n以当前目录作为工作区运行，容器内工作目录固定为 `/workspace`，会话库会写入 `/workspace/.agent-sessions`：\n\n```bash\ndocker run --rm -it \\\n  -v \"$PWD\":/workspace \\\n  call-code\n```\n\nAPI 配置优先从挂载目录下的 `.env.local` 读取，也可以用 `-e OPENAI_API_KEY=... -e OPENAI_MODEL=...` 传入。\n\n## 测试说明\n\n测试文件统一放在项目根目录的 `tests/` 目录下，根目录的 `vitest.config.ts` 会统一收集并运行。\n\n## License\n\nMIT License，详见 [LICENSE](LICENSE)。\n","readmeFilename":"README.md","_rev":"1-2843f8252d4407e9f3e8a22bad1cd86f"}