original-flipster69/koko

GitHub: original-flipster69/koko

koko 是一款安全优先的沙盒化终端编码助手,通过最小权限访问保护用户隐私并提供安全的 LLM 编码体验。

Stars: 1 | Forks: 0

# koko 🦍💻 koko ![GitHub 许可证](https://img.shields.io/github/license/original-flipster69/koko?v=2) ![Go](https://img.shields.io/badge/-Go-00ADD8?logo=go&logoColor=00add8&labelColor=grey&style=flat) ![original.flipster](https://img.shields.io/badge/-original.flipster-grey?logo=data%3Aimage%2Fgif%3Bbase64%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&logoSize=auto&labelColor=grey&color=292524) 一个以安全和隐私为首要考量的沙盒化终端编码助手。`koko` 可连接至您所有喜爱的 LLM 提供商,并为您的文件和 shell 提供最小权限访问。您不希望离开设备的任何内容都不会离开。无忧的代理式编码。 ## 功能 ### 多提供商 LLM 支持 koko 支持三种 LLM 后端: - **Claude** — 通过 Anthropic API 使用的 Claude 模型 (`CLAUDE_API_KEY`) - **Mistral** — 通过 Mistral API 或任何兼容端点使用的 Mistral 模型 (`MISTRAL_API_KEY`) - **Ollama** — 本地模型,无需 API 密钥(默认地址:`http://localhost:11434`) 可在运行时使用 `:model ` 切换活动模型,或在 `~/.koko/config.toml` 中设置默认值。 ### 沙盒 沙盒是核心安全边界。每个文件操作在执行前都会根据其进行验证。 - **目录允许列表** — 代理只能读取、写入或列出于显式允许的目录内部。默认是当前工作目录;可配置额外目录。 - **符号链接安全路径解析** — 路径在验证前会通过符号链接进行规范化。最终组件的打开操作使用 `O_NOFOLLOW` 以防止 TOCTOU 替换。 - **类型化验证令牌** — 路径必须通过 `ValidatePath`(返回类型化的 `ValidPath`)才能到达任何 I/O 方法。编译器强制执行“编辑器中不使用原始路径”。 - **拒绝的文件模式** — 敏感文件通过 glob 模式被阻止,无论其位于哪个目录。默认值: - `.env`, `.env.*` - `*.pem`, `*.key`, `id_rsa*` - `credentials.json` - `*.secret`, `*.password` - **文件大小限制** — 读取/写入有可配置的最大值上限(默认:1 MB)。 ### 命令策略 通过 `exec_command` 运行的 shell 命令受基于正则表达式的策略控制: - **默认拒绝列表** 涵盖权限提升 (`sudo`, `su`)、远程网络 (`ssh`, `scp`, `nc`, `telnet`)、shell 求值 (`eval`, `source`, 反引号, `$(…)`)、管道到 shell (`curl|sh`, `wget|sh`) 以及其他经典的潜在风险。 - **可选的允许列表** — 设置后,每个命令的第一个标记必须出现在该列表中。拒绝模式优先。 - **用户确认** — 每次调用 `exec_command` 运行前都会提示用户明确批准。 - **执行加固** — 命令在运行时受 `ulimit` 对 CPU 秒数、内存和输出文件大小的限制。标准输出/标准错误有缓冲区限制。 ### 代理工具 代理拥有 12 个工具,全部通过沙盒进行调用: **文件操作** | 工具 | 描述 | |------|-------------| | `read_file` | 读取文件内容,可选行偏移量/限制 | | `write_file` | 创建新文件(除非 `overwrite=true`,否则拒绝覆盖) | | `replace_in_file` | 查找并替换,要求匹配唯一 | | `rename_file` | 移动或重命名文件 | | `delete_file` | 删除文件(支持 `/undo`) | | `list_dir` | 列出目录内容,可选递归树形结构 | | `search_files` | 跨文件模式搜索,带上下文行 | **Shell 操作** | 工具 | 描述 | |------|-------------| | `exec_command` | 运行 shell 命令(受策略控制,需要用户确认) | **记忆操作** | 工具 | 描述 | |------|-------------| | `save_memory` | 保存跨会话的持久记忆 | | `delete_memory` | 删除已存储的记忆 | | `list_memories` | 列出所有已存储的记忆及其正文 | **规划操作** | 工具 | 描述 | |------|-------------| | `exit_plan_mode` | 提出计划供用户批准(仅在计划模式下可调用) | ### 隐私与编辑 两层自动编辑: - **机密信息** — 扫描并编辑已知的令牌格式:AWS 密钥、GitHub PAT (`ghp_`/`gho_`/`ghu_`/`ghr_`/`ghs_`)、Google API 密钥、Slack 令牌、Stripe 密钥、OpenAI/Anthropic 密钥、JWT、PEM 私钥头,以及赋值式机密 (`API_KEY=...`)。 - **PII(个人身份信息)** — 电子邮件、美国 SSN、NANP 格式的美国电话号码、经 Luhn 验证的信用卡以及公共 IPv4 地址(不包括环回地址 / RFC1918 / 链路本地地址)。 编辑在发送到 LLM 的出站消息流上运行(当 `scrub_pii=true` 时,此为默认值),以及在会话写入磁盘时运行。`write_file` 和 `replace_in_file` 也会对其新内容运行机密扫描。 ### 项目检测 koko 扫描沙盒根目录下的标记文件(`go.mod`、`package.json`、`Cargo.toml`、`pyproject.toml`、`Dockerfile` 等),并在启动横幅和 LLM 系统提示中(用于定位)展示结果。 ### 审计日志 每个工具调用都记录到 `~/.koko/audit.jsonl`,包含时间戳、工具名称、参数、结果,以及一个链式 SHA-256 哈希(链接到前一个条目)。该链在启动时进行验证 — 哈希中断或缺失会导致明显失败。 ### 记忆 持久的跨会话记忆存储在 `~/.koko/memory/`。代理可以保存 (`save_memory`) 和删除 (`delete_memory`) 类型化的条目(用户 / 反馈 / 项目 / 引用),这些条目会在未来的会话中作为上下文显示。 ### 剧本 `~/.koko/plays/` 中的 Markdown 文件注册为命名的 playbook。可通过斜杠命令按名称调用任何 play(例如,`:review` 运行 `review.md` play)。`:plays` 列出已安装的 plays。 ### 计划模式 使用 `:plan` 切换以进入只读调查模式。写入工具被禁用,直到代理通过 `exit_plan_mode` 提出计划并经您批准。 ### 交互式 REPL | 命令 | 描述 | |---------|-------------| | `:help` | 显示可用命令 | | `:koko` | 打印 koko 吉祥物 | | `:clear` | 重置对话历史 | | `:history` | 显示消息计数 | | `:tokens` | 显示令牌使用情况统计 | | `:undo` | 撤销上一次文件更改 | | `:run ` | 直接运行 shell 命令(绕过代理) | | `:compact` | 总结历史以回收上下文 | | `:model [name]` | 显示或切换活动模型 | | `:config` | 显示当前配置 | | `:save` | 将当前会话保存到磁盘 | | `:resume` | 恢复已保存的会话 | | `:plays` | 列出已安装的 plays | | `:plan` | 切换计划模式 | | `:` | 运行命名的 play(例如,`:review`) | 当代理完成一个回合时,会话会自动保存。 ## 安装 **单行命令(macOS / Linux,amd64 / arm64):** ``` curl -fsSL https://raw.githubusercontent.com/original-flipster69/koko/main/install.sh | sh ``` 该脚本会下载与您平台匹配的最新 GitHub 发行版,根据 `checksums.txt` 验证其 SHA-256 校验和,并将二进制文件安装到 `/usr/local/bin/koko`(如果该目录不可写,则使用 `sudo`)。 使用 `KOKO_INSTALL_DIR` 覆盖安装位置,或使用 `KOKO_VERSION` 固定版本: ``` KOKO_INSTALL_DIR=$HOME/.local/bin sh install.sh KOKO_VERSION=v0.1.0 sh install.sh ``` **通过 Go 安装:** ``` go install github.com/original-flipster69/koko@latest ``` ## 从源码构建 ``` ./build.sh ``` 构建脚本运行 `go build -buildvcs=false`,并且(如果 `goda` 在 `PATH` 中)会重新生成 `docs/deps.svg`。 ## 用法 ``` koko [flags] ``` | 标志 | 描述 | 默认值 | |------|-------------|---------| | `-provider` | LLM 提供商:`Claude`、`mistral`、`ollama` | `mistral` | | `-model` | 模型名称 | `mistral-large-latest` | | `-llm-url` | API URL(用于本地或自定义端点) | 提供商默认值 | | `-sandbox` | 沙盒根目录 | 当前工作目录 | | `-config` | 配置文件路径 | `~/.koko/config.toml` | ## 配置 koko 从 `~/.koko/config.toml` 读取配置: ``` [llm] provider = "Claude" model = "claude-sonnet-4-20250514" url = "" max_tokens = 16384 max_session_tokens = 1000000 [sandbox] root = "/home/user/projects" additional_dirs = [] deny_files = [".env", ".env.*", "*.pem", "*.key", "id_rsa*", "credentials.json", "*.secret", "*.password"] max_file_size = 1048576 scrub_pii = true [sandbox.exec] profile = "default" allow = [] deny = [] [ignore] mode = "gitignore" files = [] [style] thinking_verbs = ["thinking", "pondering", "scheming"] ``` API 密钥来自环境变量: - `CLAUDE_API_KEY` 用于 Claude - `MISTRAL_API_KEY` 用于 Mistral - Ollama 无需密钥 命令行标志会覆盖配置值;环境变量仅填充在配置 + 标志之后仍为空的项。 ## 数据目录 koko 将运行时数据存储在 `~/.koko/` 中: | 路径 | 用途 | |------|---------| | `config.toml` | 用户配置 | | `audit.jsonl` | 链式哈希工具调用日志 | | `koko.log` | 应用程序日志(JSON 格式) | | `session.json` | 已保存的对话历史(已编辑) | | `memory/` | 持久的跨会话记忆 | | `plays/` | 可作为 `:` 调用的 Markdown playbook |
标签:EVTX分析, Go语言, Homebrew安装, LLM集成, Python安全, XML 请求, 人工智能助手, 代理编码, 安全开发, 安全编码, 数据隔离, 日志审计, 最小权限访问, 沙箱化, 秘密管理, 程序破解, 终端助手, 编码助手, 编程工具, 网络安全, 远程代码执行, 隐私保护, 隐私编程