1 line
43 KiB
JSON
1 line
43 KiB
JSON
{"repo": "aresbit/cclaw", "files": {"include/providers/base.h": {"1eab2d0784c1ebd0e348c89d388641c4122b20d6": {"t": 1785746371.4824471, "n": 6829, "h": "ea6f0ab51315e823", "c": "// base.h - AI Provider base interface for CClaw\n// SPDX-License-Identifier: MIT\n\n#ifndef CCLAW_PROVIDERS_BASE_H\n#define CCLAW_PROVIDERS_BASE_H\n\n#include \"core/types.h\"\n#include \"core/error.h\"\n#include \"utils/http.h\"\n\n#include <stdint.h>\n#include <stdbool.h>\n\n// Forward declarations\ntypedef struct provider_t provider_t;\ntypedef struct provider_vtable_t provider_vtable_t;\ntypedef struct chat_response_t chat_response_t;\ntypedef struct provider_config_t provider_config_t;\n\n// chat_role_t and chat_message_t are defined in core/types.h\n\n// Tool definition for function calling\ntypedef struct tool_def_t {\n str_t name;\n str_t description;\n str_t parameters; // JSON schema\n} tool_def_t;\n\n// Chat response structure\ntypedef struct chat_response_t {\n str_t content;\n str_t finish_reason; // \"stop\", \"length\", \"tool_calls\", etc.\n str_t model;\n uint32_t prompt_tokens;\n uint32_t completion_tokens;\n uint32_t total_tokens;\n str_t tool_calls; // JSON array if tools were called\n} chat_response_t;\n\n// Provider configuration\ntypedef struct provider_config_t {\n str_t name; // Provider name (e.g., \"openrouter\", \"deepseek\")\n str_t api_key;\n str_t base_url; // API base URL\n str_t default_model;\n double default_temperature;\n uint32_t max_tokens;\n uint32_t timeout_ms;\n bool stream; // Enable streaming responses\n // Retry configuration\n uint32_t max_retries;\n uint32_t retry_delay_ms;\n} provider_config_t;\n\n// Provider VTable - defines the interface\nstruct provider_vtable_t {\n // Provider identification\n str_t (*get_name)(void);\n str_t (*get_version)(void);\n\n // Lifecycle\n err_t (*create)(const provider_config_t* config, provider_t** out_provider);\n void (*destroy)(provider_t* provider);\n\n // Connection\n err_t (*connect)(provider_t* provider);\n void (*disconnect)(provider_t* provider);\n bool (*is_connected)(provider_t* provider);\n\n // Chat completion\n err_t (*chat)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n chat_response_t** out_response);\n\n // Stream chat (callback-based)\n err_t (*chat_stream)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const char* model,\n double temperature,\n void (*on_chunk)(const char* chunk, void* user_data),\n void* user_data);\n\n // Model management\n err_t (*list_models)(provider_t* provider, str_t** out_models, uint32_t* out_count);\n bool (*supports_model)(provider_t* provider, const char* model);\n\n // Health check\n err_t (*health_check)(provider_t* provider, bool* out_healthy);\n\n // Get available models (static)\n const char** (*get_available_models)(uint32_t* out_count);\n};\n\n// Provider instance structure\nstruct provider_t {\n const provider_vtable_t* vtable;\n provider_config_t config;\n http_client_t* http;\n void* impl_data; // Provider-specific data\n bool connected;\n};\n\n// Helper macros for provider implementation\n#define PROVIDER_IMPLEMENT(name, vtable_ptr) \\\n const provider_vtable_t* name##_get_vtable(void) { return vtable_ptr; }\n\n// Global provider registry\nerr_t provider_registry_init(void);\nvoid provider_registry_shutdown(void);\n\n// Register a provider type\nerr_t provider_register(const char* name, const provider_vtable_t* vtable);\n\n// Create provider by name\nerr_t provider_create(const char* name, const provider_config_t* config, provider_t** out_provider);\n\n// Get registered provider names\nerr_t provider_registry_list(const char*** out_names, uint32_t* out_count);\n\n// Built-in providers\nconst provider_vtable_t* openrouter_get_vtable(void);\nconst provider_vtable_t* deepseek_get_vtable(void);\nconst provider_vtable_t* kimi_get_vtable(void);\nconst provider_vtable_t* openai_get_vtable(void);\nconst provider_vtable_t* anthropic_get_vtable(void);\n\n// Provider creation helpers\nprovider_t* provider_alloc(const provider_vtable_t* vtable);\nvoid provider_free(provider_t* provider);\n\n// Retry and failover helpers\nerr_t provider_chat_with_retry(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n uint32_t max_retries,\n uint64_t retry_delay_ms,\n chat_response_t** out_response);\n\n// Response helpers\nchat_response_t* chat_response_create(void);\nvoid chat_response_free(chat_response_t* response);\nvoid chat_response_clear(chat_response_t* response);\n\n// Message helpers\nchat_message_t* chat_message_create(chat_role_t role, const char* content);\nvoid chat_message_free(chat_message_t* message);\nvoid chat_message_array_free(chat_message_t* messages, uint32_t count);\n\n// Tool helpers\ntool_def_t* tool_def_create(const char* name, const char* description, const char* parameters);\nvoid tool_def_free(tool_def_t* tool);\nvoid tool_def_array_free(tool_def_t* tools, uint32_t count);\n\n// Parse chat response from JSON (common helper)\nerr_t provider_parse_chat_response(const char* json_str, chat_response_t* out_response);\n\n// Build chat request JSON (common helper)\nchar* provider_build_chat_request(const provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n bool stream);\n\n// Default model names\n#define DEFAULT_OPENROUTER_MODEL \"anthropic/claude-3.5-sonnet\"\n#define DEFAULT_DEEPSEEK_MODEL \"deepseek-chat\"\n#define DEFAULT_KIMI_MODEL \"moonshot-k2.5\"\n#define DEFAULT_OPENAI_MODEL \"gpt-4o\"\n#define DEFAULT_ANTHROPIC_MODEL \"claude-3-5-sonnet-20241022\"\n\n// Provider-specific base URLs\n#define OPENROUTER_BASE_URL \"https://openrouter.ai/api/v1\"\n#define DEEPSEEK_BASE_URL \"https://api.deepseek.com/v1\"\n#define KIMI_BASE_URL \"https://api.moonshot.cn/v1\"\n#define OPENAI_BASE_URL \"https://api.openai.com/v1\"\n#define ANTHROPIC_BASE_URL \"https://api.anthropic.com/v1\"\n\n#endif // CCLAW_PROVIDERS_BASE_H\n"}, "5942fdf7edc92259df15af6b1715b92a02d1a8c5": {"t": 1785763003.3789887, "n": 6829, "h": "ea6f0ab51315e823", "c": "// base.h - AI Provider base interface for CClaw\n// SPDX-License-Identifier: MIT\n\n#ifndef CCLAW_PROVIDERS_BASE_H\n#define CCLAW_PROVIDERS_BASE_H\n\n#include \"core/types.h\"\n#include \"core/error.h\"\n#include \"utils/http.h\"\n\n#include <stdint.h>\n#include <stdbool.h>\n\n// Forward declarations\ntypedef struct provider_t provider_t;\ntypedef struct provider_vtable_t provider_vtable_t;\ntypedef struct chat_response_t chat_response_t;\ntypedef struct provider_config_t provider_config_t;\n\n// chat_role_t and chat_message_t are defined in core/types.h\n\n// Tool definition for function calling\ntypedef struct tool_def_t {\n str_t name;\n str_t description;\n str_t parameters; // JSON schema\n} tool_def_t;\n\n// Chat response structure\ntypedef struct chat_response_t {\n str_t content;\n str_t finish_reason; // \"stop\", \"length\", \"tool_calls\", etc.\n str_t model;\n uint32_t prompt_tokens;\n uint32_t completion_tokens;\n uint32_t total_tokens;\n str_t tool_calls; // JSON array if tools were called\n} chat_response_t;\n\n// Provider configuration\ntypedef struct provider_config_t {\n str_t name; // Provider name (e.g., \"openrouter\", \"deepseek\")\n str_t api_key;\n str_t base_url; // API base URL\n str_t default_model;\n double default_temperature;\n uint32_t max_tokens;\n uint32_t timeout_ms;\n bool stream; // Enable streaming responses\n // Retry configuration\n uint32_t max_retries;\n uint32_t retry_delay_ms;\n} provider_config_t;\n\n// Provider VTable - defines the interface\nstruct provider_vtable_t {\n // Provider identification\n str_t (*get_name)(void);\n str_t (*get_version)(void);\n\n // Lifecycle\n err_t (*create)(const provider_config_t* config, provider_t** out_provider);\n void (*destroy)(provider_t* provider);\n\n // Connection\n err_t (*connect)(provider_t* provider);\n void (*disconnect)(provider_t* provider);\n bool (*is_connected)(provider_t* provider);\n\n // Chat completion\n err_t (*chat)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n chat_response_t** out_response);\n\n // Stream chat (callback-based)\n err_t (*chat_stream)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const char* model,\n double temperature,\n void (*on_chunk)(const char* chunk, void* user_data),\n void* user_data);\n\n // Model management\n err_t (*list_models)(provider_t* provider, str_t** out_models, uint32_t* out_count);\n bool (*supports_model)(provider_t* provider, const char* model);\n\n // Health check\n err_t (*health_check)(provider_t* provider, bool* out_healthy);\n\n // Get available models (static)\n const char** (*get_available_models)(uint32_t* out_count);\n};\n\n// Provider instance structure\nstruct provider_t {\n const provider_vtable_t* vtable;\n provider_config_t config;\n http_client_t* http;\n void* impl_data; // Provider-specific data\n bool connected;\n};\n\n// Helper macros for provider implementation\n#define PROVIDER_IMPLEMENT(name, vtable_ptr) \\\n const provider_vtable_t* name##_get_vtable(void) { return vtable_ptr; }\n\n// Global provider registry\nerr_t provider_registry_init(void);\nvoid provider_registry_shutdown(void);\n\n// Register a provider type\nerr_t provider_register(const char* name, const provider_vtable_t* vtable);\n\n// Create provider by name\nerr_t provider_create(const char* name, const provider_config_t* config, provider_t** out_provider);\n\n// Get registered provider names\nerr_t provider_registry_list(const char*** out_names, uint32_t* out_count);\n\n// Built-in providers\nconst provider_vtable_t* openrouter_get_vtable(void);\nconst provider_vtable_t* deepseek_get_vtable(void);\nconst provider_vtable_t* kimi_get_vtable(void);\nconst provider_vtable_t* openai_get_vtable(void);\nconst provider_vtable_t* anthropic_get_vtable(void);\n\n// Provider creation helpers\nprovider_t* provider_alloc(const provider_vtable_t* vtable);\nvoid provider_free(provider_t* provider);\n\n// Retry and failover helpers\nerr_t provider_chat_with_retry(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n uint32_t max_retries,\n uint64_t retry_delay_ms,\n chat_response_t** out_response);\n\n// Response helpers\nchat_response_t* chat_response_create(void);\nvoid chat_response_free(chat_response_t* response);\nvoid chat_response_clear(chat_response_t* response);\n\n// Message helpers\nchat_message_t* chat_message_create(chat_role_t role, const char* content);\nvoid chat_message_free(chat_message_t* message);\nvoid chat_message_array_free(chat_message_t* messages, uint32_t count);\n\n// Tool helpers\ntool_def_t* tool_def_create(const char* name, const char* description, const char* parameters);\nvoid tool_def_free(tool_def_t* tool);\nvoid tool_def_array_free(tool_def_t* tools, uint32_t count);\n\n// Parse chat response from JSON (common helper)\nerr_t provider_parse_chat_response(const char* json_str, chat_response_t* out_response);\n\n// Build chat request JSON (common helper)\nchar* provider_build_chat_request(const provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n bool stream);\n\n// Default model names\n#define DEFAULT_OPENROUTER_MODEL \"anthropic/claude-3.5-sonnet\"\n#define DEFAULT_DEEPSEEK_MODEL \"deepseek-chat\"\n#define DEFAULT_KIMI_MODEL \"moonshot-k2.5\"\n#define DEFAULT_OPENAI_MODEL \"gpt-4o\"\n#define DEFAULT_ANTHROPIC_MODEL \"claude-3-5-sonnet-20241022\"\n\n// Provider-specific base URLs\n#define OPENROUTER_BASE_URL \"https://openrouter.ai/api/v1\"\n#define DEEPSEEK_BASE_URL \"https://api.deepseek.com/v1\"\n#define KIMI_BASE_URL \"https://api.moonshot.cn/v1\"\n#define OPENAI_BASE_URL \"https://api.openai.com/v1\"\n#define ANTHROPIC_BASE_URL \"https://api.anthropic.com/v1\"\n\n#endif // CCLAW_PROVIDERS_BASE_H\n"}, "84c8cdf4295ce9f1a83a413256752a6fa57390e2": {"t": 1785763004.7526748, "n": 6830, "h": "6aaddc5b5ec25cdc", "c": "// base.h - AI Provider base interface for CClaw\n// SPDX-License-Identifier: MIT\n\n#ifndef CCLAW_PROVIDERS_BASE_H\n#define CCLAW_PROVIDERS_BASE_H\n\n#include \"core/types.h\"\n#include \"core/error.h\"\n#include \"utils/http.h\"\n\n#include <stdint.h>\n#include <stdbool.h>\n\n// Forward declarations\ntypedef struct provider_t provider_t;\ntypedef struct provider_vtable_t provider_vtable_t;\ntypedef struct chat_response_t chat_response_t;\ntypedef struct provider_config_t provider_config_t;\n\n// chat_role_t and chat_message_t are defined in core/types.h\n\n// Tool definition for function calling\ntypedef struct tool_def_t {\n str_t name;\n str_t description;\n str_t parameters; // JSON schema\n} tool_def_t;\n\n// Chat response structure\ntypedef struct chat_response_t {\n str_t content;\n str_t finish_reason; // \"stop\", \"length\", \"tool_calls\", etc.\n str_t model;\n uint32_t prompt_tokens;\n uint32_t completion_tokens;\n uint32_t total_tokens;\n str_t tool_calls; // JSON array if tools were called\n} chat_response_t;\n\n// Provider configuration\ntypedef struct provider_config_t {\n str_t name; // Provider name (e.g., \"openrouter\", \"deepseek\")\n str_t api_key;\n str_t base_url; // API base URL\n str_t default_model;\n double default_temperature;\n uint32_t max_tokens;\n uint32_t timeout_ms;\n bool stream; // Enable streaming responses\n // Retry configuration\n uint32_t max_retries;\n uint32_t retry_delay_ms;\n} provider_config_t;\n\n// Provider VTable - defines the interface\nstruct provider_vtable_t {\n // Provider identification\n str_t (*get_name)(void);\n str_t (*get_version)(void);\n\n // Lifecycle\n err_t (*create)(const provider_config_t* config, provider_t** out_provider);\n void (*destroy)(provider_t* provider);\n\n // Connection\n err_t (*connect)(provider_t* provider);\n void (*disconnect)(provider_t* provider);\n bool (*is_connected)(provider_t* provider);\n\n // Chat completion\n err_t (*chat)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n chat_response_t** out_response);\n\n // Stream chat (callback-based)\n err_t (*chat_stream)(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const char* model,\n double temperature,\n void (*on_chunk)(const char* chunk, void* user_data),\n void* user_data);\n\n // Model management\n err_t (*list_models)(provider_t* provider, str_t** out_models, uint32_t* out_count);\n bool (*supports_model)(provider_t* provider, const char* model);\n\n // Health check\n err_t (*health_check)(provider_t* provider, bool* out_healthy);\n\n // Get available models (static)\n const char** (*get_available_models)(uint32_t* out_count);\n};\n\n// Provider instance structure\nstruct provider_t {\n const provider_vtable_t* vtable;\n provider_config_t config;\n http_client_t* http;\n void* impl_data; // Provider-specific data\n bool connected;\n};\n\n// Helper macros for provider implementation\n#define PROVIDER_IMPLEMENT(name, vtable_ptr) \\\n const provider_vtable_t* name##_get_vtable(void) { return vtable_ptr; }\n\n// Global provider registry\nerr_t provider_registry_init(void);\nvoid provider_registry_shutdown(void);\n\n// Register a provider type\nerr_t provider_register(const char* name, const provider_vtable_t* vtable);\n\n// Create provider by name\nerr_t provider_create(const char* name, const provider_config_t* config, provider_t** out_provider);\n\n// Get registered provider names\nerr_t provider_registry_list(const char*** out_names, uint32_t* out_count);\n\n// Built-in providers\nconst provider_vtable_t* openrouter_get_vtable(void);\nconst provider_vtable_t* deepseek_get_vtable(void);\nconst provider_vtable_t* kimi_get_vtable(void);\nconst provider_vtable_t* openai_get_vtable(void);\nconst provider_vtable_t* anthropic_get_vtable(void);\n\n// Provider creation helpers\nprovider_t* provider_alloc(const provider_vtable_t* vtable);\nvoid provider_free(provider_t* provider);\n\n// Retry and failover helpers\nerr_t provider_chat_with_retry(provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n uint32_t max_retries,\n uint64_t retry_delay_ms,\n chat_response_t** out_response);\n\n// Response helpers\nchat_response_t* chat_response_create(void);\nvoid chat_response_free(chat_response_t* response);\nvoid chat_response_clear(chat_response_t* response);\n\n// Message helpers\nchat_message_t* chat_message_create(chat_role_t role, const char* content);\nvoid chat_message_free(chat_message_t* message);\nvoid chat_message_array_free(chat_message_t* messages, uint32_t count);\n\n// Tool helpers\ntool_def_t* tool_def_create(const char* name, const char* description, const char* parameters);\nvoid tool_def_free(tool_def_t* tool);\nvoid tool_def_array_free(tool_def_t* tools, uint32_t count);\n\n// Parse chat response from JSON (common helper)\nerr_t provider_parse_chat_response(const char* json_str, chat_response_t* out_response);\n\n// Build chat request JSON (common helper)\nchar* provider_build_chat_request(const provider_t* provider,\n const chat_message_t* messages,\n uint32_t message_count,\n const tool_def_t* tools,\n uint32_t tool_count,\n const char* model,\n double temperature,\n bool stream);\n\n// Default model names\n#define DEFAULT_OPENROUTER_MODEL \"anthropic/claude-3.5-sonnet\"\n#define DEFAULT_DEEPSEEK_MODEL \"deepseek-chat\"\n#define DEFAULT_KIMI_MODEL \"moonshot-v1-8k\"\n#define DEFAULT_OPENAI_MODEL \"gpt-4o\"\n#define DEFAULT_ANTHROPIC_MODEL \"claude-3-5-sonnet-20241022\"\n\n// Provider-specific base URLs\n#define OPENROUTER_BASE_URL \"https://openrouter.ai/api/v1\"\n#define DEEPSEEK_BASE_URL \"https://api.deepseek.com/v1\"\n#define KIMI_BASE_URL \"https://api.moonshot.cn/v1\"\n#define OPENAI_BASE_URL \"https://api.openai.com/v1\"\n#define ANTHROPIC_BASE_URL \"https://api.anthropic.com/v1\"\n\n#endif // CCLAW_PROVIDERS_BASE_H\n"}}, "GUIDE.md": {"1eab2d0784c1ebd0e348c89d388641c4122b20d6": {"t": 1785747165.055881, "n": 6211, "h": "a2ee8939291fc52e", "c": "# CClaw 配置及运行指南\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\n# Debian/Ubuntu\nsudo apt-get install -y clang libcurl4-openssl-dev libsqlite3-dev libsodium-dev libuv1-dev uuid-dev\n\n# Termux (Android)\npkg install clang curl sqlite libsodium libuv libuuid\n\n# macOS\nbrew install curl sqlite libsodium libuv ossp-uuid\n```\n\n### 2. 编译\n\n```bash\ncd /data/data/com.termux/files/home/yyscode/dev216/cclaw\nmake clean && make\n```\n\n### 3. 初始化配置\n\n```bash\n./bin/cclaw onboard\n```\n\n按提示输入:\n- API Key (从 OpenRouter/Anthropic/OpenAI/kimi/deepseek 获取)\n- 默认提供商 (openrouter/anthropic/openai/kimi/deepseek)\n- 默认模型\n- 内存后端 (sqlite/markdown/none)\n\n## 配置文件\n\n配置文件位于 `~/.cclaw/config.json`:\n\n```json\n{\n \"api_key\": \"sk-or-v1-...\",\n \"default_provider\": \"openrouter\",\n \"default_model\": \"anthropic/claude-sonnet-4-20250514\",\n \"default_temperature\": 0.7,\n \"memory\": {\n \"backend\": \"sqlite\",\n \"auto_save\": true,\n \"conversation_retention_days\": 30\n },\n \"gateway\": {\n \"port\": 8080,\n \"host\": \"127.0.0.1\"\n },\n \"autonomy\": {\n \"level\": 1,\n \"workspace_only\": true,\n \"max_actions_per_hour\": 100\n },\n \"channels\": {\n \"cli\": true\n }\n}\n```\n\n### 配置项说明\n\n| 配置项 | 说明 | 默认值 |\n|--------|------|--------|\n| `api_key` | LLM API 密钥 | 必填 |\n| `default_provider` | 默认提供商 | openrouter |\n| `default_model` | 默认模型 | anthropic/claude-sonnet-4 |\n| `default_temperature` | 采样温度 | 0.7 |\n| `memory.backend` | 记忆后端 | sqlite |\n| `gateway.port` | 网关端口 | 8080 |\n| `autonomy.level` | 自主级别 (0-2) | 1 |\n\n## 运行模式\n\n### 1. 交互式 Agent (推荐)\n\n```bash\n./bin/cclaw agent\n```\n\n快捷键:\n- `Ctrl+H` - 显示帮助\n- `Ctrl+N` - 创建新分支 (Pi-style)\n- `Ctrl+B` - 显示分支\n- `Ctrl+L` - 清屏\n- `Ctrl+Q` - 退出\n- `↑/↓` - 历史记录\n\n### 2. TUI 界面\n\n```bash\n./bin/cclaw tui\n```\n\nTUI 特点:\n- 侧边栏显示会话列表\n- 状态栏显示模型和 token 数\n- 支持分支导航\n- 颜色主题支持\n\n### 3. 单消息模式\n\n```bash\n./bin/cclaw agent -m \"你好,请帮我写一段 Python 代码\"\n```\n\n### 4. 守护进程模式\n\n启动守护进程:\n```bash\n./bin/cclaw daemon start\n```\n\n查看状态:\n```bash\n./bin/cclaw daemon status\n```\n\n停止守护进程:\n```bash\n./bin/cclaw daemon stop\n```\n\n重启:\n```bash\n./bin/cclaw daemon restart\n```\n\n守护进程特点:\n- 后台运行\n- 自动重连\n- Cron 定时任务\n- 健康检查端点\n\n## 命令参考\n\n### 基础命令\n\n| 命令 | 说明 | 示例 |\n|------|------|------|\n| `onboard` | 初始化配置 | `cclaw onboard` |\n| `agent` | 启动交互式 Agent | `cclaw agent -m \"Hello\"` |\n| `tui` | 启动 TUI 界面 | `cclaw tui` |\n| `daemon` | 守护进程管理 | `cclaw daemon start` |\n| `status` | 查看状态 | `cclaw status` |\n| `doctor` | 诊断检查 | `cclaw doctor` |\n| `channel` | 通道管理 | `cclaw channel list` |\n| `cron` | 定时任务 | `cclaw cron list` |\n\n### Agent 命令\n\n```bash\n# 交互模式\ncclaw agent\n\n# 单消息模式\ncclaw agent -m \"你好\"\n\n# 指定模型\ncclaw agent --model \"gpt-4o\"\n\n# 指定温度\ncclaw agent -t 0.5\n```\n\n### Daemon 命令\n\n```bash\n# 启动\ncclaw daemon start\n\n# 停止\ncclaw daemon stop\n\n# 重启\ncclaw daemon restart\n\n# 查看状态\ncclaw daemon status\n\n# 指定 PID 文件\ncclaw daemon start -p ~/.cclaw/daemon.pid\n```\n\n### Cron 命令\n\n```bash\n# 列出定时任务\ncclaw cron list\n\n# 添加任务 (格式: 分 时 日 月 周)\ncclaw cron add \"0 9 * * *\" \"backup\"\n\n# 删除任务\ncclaw cron remove <job-id>\n```\n\n## 环境变量\n\n可以通过环境变量覆盖配置:\n\n```bash\nexport CCLAW_API_KEY=\"sk-...\"\nexport CCLAW_PROVIDER=\"openrouter\"\nexport CCLAW_MODEL=\"anthropic/claude-sonnet-4\"\nexport CCLAW_WORKSPACE=\"/path/to/workspace\"\n\n./bin/cclaw agent\n```\n\n## 高级用法\n\n### 自定义系统提示\n\n在 `~/.cclaw/system_prompt.txt` 创建文件:\n\n```\n你是一个专业的编程助手,擅长:\n- Python/Rust/C 语言\n- 代码审查和重构\n- 算法优化\n```\n\n### 扩展开发 (Pi Philosophy)\n\nCClaw 支持 Agent 自我扩展:\n\n```c\n// 生成工具扩展代码\nstr_t source;\nextension_generate_tool(\n &STR_LIT(\"my_tool\"),\n &STR_LIT(\"My custom tool\"),\n &schema,\n &implementation,\n &source\n);\n```\n\n### 会话管理 (Pi-Style)\n\n```\nUser: 帮我优化这段代码\nAgent: 请分享代码\nUser: [分享代码]\n ├── Branch 1: 使用函数式编程\n └── Branch 2: 使用面向对象 <-- 你在这里\n └── User: 为什么用类?\n```\n\n使用 `/new` 创建分支,`/back` 返回上级。\n\n## 故障排除\n\n### 1. 配置文件错误\n\n```bash\n# 重新初始化\nrm ~/.cclaw/config.json\n./bin/cclaw onboard\n```\n\n### 2. API 连接失败\n\n```bash\n# 检查网络\n./bin/cclaw doctor\n\n# 测试 API\ncurl -H \"Authorization: Bearer $API_KEY\" \\\n https://openrouter.ai/api/v1/models\n```\n\n### 3. 守护进程无法启动\n\n```bash\n# 检查 PID 文件\nrm ~/.cclaw/daemon.pid\n\n# 手动启动查看错误\n./bin/cclaw daemon start\n```\n\n### 4. TUI 显示异常\n\n```bash\n# 检查终端支持\necho $TERM\n\n# 设置合适的 TERM\nexport TERM=xterm-256color\n```\n\n## 示例工作流\n\n### 编程助手\n\n```bash\n# 1. 进入工作目录\ncd ~/projects/myapp\n\n# 2. 启动 Agent\n./bin/cclaw agent\n\n# 3. 对话\n> 请帮我审查 main.py\n> [Agent 读取文件]\n> 这里有三个问题:...\n\n# 4. 创建分支探讨不同方案\n/new\n> 如果改用 asyncio 会怎样?\n```\n\n### 自动化任务\n\n```bash\n# 1. 配置定时任务\ncclaw cron add \"0 9 * * *\" \"daily_report\"\n\n# 2. 启动守护进程\ncclaw daemon start\n\n# 3. 查看日志\ntail -f ~/.cclaw/daemon.log\n```\n\n## 系统服务 (systemd)\n\n创建 `/etc/systemd/system/cclaw.service`:\n\n```ini\n[Unit]\nDescription=CClaw AI Assistant\nAfter=network.target\n\n[Service]\nType=forking\nUser=username\nExecStart=/usr/local/bin/cclaw daemon start\nExecStop=/usr/local/bin/cclaw daemon stop\nPIDFile=/home/username/.cclaw/daemon.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n```\n\n启用服务:\n```bash\nsudo systemctl enable cclaw\nsudo systemctl start cclaw\n```\n\n## 更多信息\n\n- 项目文档: `AGENT_FRAMEWORK.md`\n- 开发计划: `plan.md`\n- 示例代码: `examples/`\n\n## 获取帮助\n\n```bash\n# 查看帮助\n./bin/cclaw help\n\n# 命令帮助\n./bin/cclaw help agent\n./bin/cclaw help daemon\n```\n## Workspace 工作目录\n\nCClaw 使用 **workspace** 作为 Agent 的安全工作沙盒,限制文件操作范围。\n\n### 默认配置\n\n- **workspace_dir**: `~/.cclaw/workspace`(自动创建,不在 config.json 中显示)\n- **autonomy.workspace_only**: `true`(限制 agent 只能访问 workspace 内文件)\n\n### 相关配置项\n\n```json\n{\n \"autonomy\": {\n \"workspace_only\": true, // 安全开关,限制文件访问范围\n \"max_actions_per_hour\": 20, // 每小时最大操作数\n \"allowed_commands\": [...], // 允许的命令白名单\n \"forbidden_paths\": [...] // 禁止访问的路径\n },\n \"runtime\": {\n \"docker\": {\n \"mount_workspace\": false, // Docker 模式是否挂载 workspace\n \"allowed_workspace_roots\": [] // 多 workspace 根目录白名单\n }\n }\n}\n```\n\n### 修改 Workspace\n\n**方法 1 - 环境变量**(推荐):\n```bash\nexport CCLAW_WORKSPACE=/path/to/your/workspace\n./bin/cclaw agent\n```\n\n**方法 2 - 环境变量(别的方式)**:\n```bash\nexport ZEROCLAW_WORKSPACE=/path/to/workspace\n./bin/cclaw agent\n```\n\n### Workspace 用途\n\n1. **文件隔离**:防止 Agent 意外修改系统文件(如 `/etc`, `/usr` 等)\n2. **会话数据**:存储对话历史、记忆文件、临时文件\n3. **工具限制**:`file_read`/`file_write`/`shell` 工具默认只能在 workspace 内操作\n4. **项目隔离**:不同项目使用不同 workspace,避免文件冲突\n\n### 安全建议\n\n- 保持 `workspace_only: true`(默认)\n- 敏感项目使用独立 workspace\n- 定期清理 `~/.cclaw/workspace` 中的临时文件\n- 使用 Docker 模式时启用 `mount_workspace` 进行额外隔离\n\n"}, "5942fdf7edc92259df15af6b1715b92a02d1a8c5": {"t": 1785763002.2164156, "n": 5016, "h": "0cf66e2468f651d9", "c": "# CClaw 配置及运行指南\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\n# Debian/Ubuntu\nsudo apt-get install -y clang libcurl4-openssl-dev libsqlite3-dev libsodium-dev libuv1-dev uuid-dev\n\n# Termux (Android)\npkg install clang curl sqlite libsodium libuv libuuid\n\n# macOS\nbrew install curl sqlite libsodium libuv ossp-uuid\n```\n\n### 2. 编译\n\n```bash\ncd /data/data/com.termux/files/home/yyscode/dev216/cclaw\nmake clean && make\n```\n\n### 3. 初始化配置\n\n```bash\n./bin/cclaw onboard\n```\n\n按提示输入:\n- API Key (从 OpenRouter/Anthropic/OpenAI/kimi/deepseek 获取)\n- 默认提供商 (openrouter/anthropic/openai/kimi/deepseek)\n- 默认模型\n- 内存后端 (sqlite/markdown/none)\n\n## 配置文件\n\n配置文件位于 `~/.cclaw/config.json`:\n\n```json\n{\n \"api_key\": \"sk-or-v1-...\",\n \"default_provider\": \"openrouter\",\n \"default_model\": \"anthropic/claude-sonnet-4-20250514\",\n \"default_temperature\": 0.7,\n \"memory\": {\n \"backend\": \"sqlite\",\n \"auto_save\": true,\n \"conversation_retention_days\": 30\n },\n \"gateway\": {\n \"port\": 8080,\n \"host\": \"127.0.0.1\"\n },\n \"autonomy\": {\n \"level\": 1,\n \"workspace_only\": true,\n \"max_actions_per_hour\": 100\n },\n \"channels\": {\n \"cli\": true\n }\n}\n```\n\n### 配置项说明\n\n| 配置项 | 说明 | 默认值 |\n|--------|------|--------|\n| `api_key` | LLM API 密钥 | 必填 |\n| `default_provider` | 默认提供商 | openrouter |\n| `default_model` | 默认模型 | anthropic/claude-sonnet-4 |\n| `default_temperature` | 采样温度 | 0.7 |\n| `memory.backend` | 记忆后端 | sqlite |\n| `gateway.port` | 网关端口 | 8080 |\n| `autonomy.level` | 自主级别 (0-2) | 1 |\n\n## 运行模式\n\n### 1. 交互式 Agent (推荐)\n\n```bash\n./bin/cclaw agent\n```\n\n快捷键:\n- `Ctrl+H` - 显示帮助\n- `Ctrl+N` - 创建新分支 (Pi-style)\n- `Ctrl+B` - 显示分支\n- `Ctrl+L` - 清屏\n- `Ctrl+Q` - 退出\n- `↑/↓` - 历史记录\n\n### 2. TUI 界面\n\n```bash\n./bin/cclaw tui\n```\n\nTUI 特点:\n- 侧边栏显示会话列表\n- 状态栏显示模型和 token 数\n- 支持分支导航\n- 颜色主题支持\n\n### 3. 单消息模式\n\n```bash\n./bin/cclaw agent -m \"你好,请帮我写一段 Python 代码\"\n```\n\n### 4. 守护进程模式\n\n启动守护进程:\n```bash\n./bin/cclaw daemon start\n```\n\n查看状态:\n```bash\n./bin/cclaw daemon status\n```\n\n停止守护进程:\n```bash\n./bin/cclaw daemon stop\n```\n\n重启:\n```bash\n./bin/cclaw daemon restart\n```\n\n守护进程特点:\n- 后台运行\n- 自动重连\n- Cron 定时任务\n- 健康检查端点\n\n## 命令参考\n\n### 基础命令\n\n| 命令 | 说明 | 示例 |\n|------|------|------|\n| `onboard` | 初始化配置 | `cclaw onboard` |\n| `agent` | 启动交互式 Agent | `cclaw agent -m \"Hello\"` |\n| `tui` | 启动 TUI 界面 | `cclaw tui` |\n| `daemon` | 守护进程管理 | `cclaw daemon start` |\n| `status` | 查看状态 | `cclaw status` |\n| `doctor` | 诊断检查 | `cclaw doctor` |\n| `channel` | 通道管理 | `cclaw channel list` |\n| `cron` | 定时任务 | `cclaw cron list` |\n\n### Agent 命令\n\n```bash\n# 交互模式\ncclaw agent\n\n# 单消息模式\ncclaw agent -m \"你好\"\n\n# 指定模型\ncclaw agent --model \"gpt-4o\"\n\n# 指定温度\ncclaw agent -t 0.5\n```\n\n### Daemon 命令\n\n```bash\n# 启动\ncclaw daemon start\n\n# 停止\ncclaw daemon stop\n\n# 重启\ncclaw daemon restart\n\n# 查看状态\ncclaw daemon status\n\n# 指定 PID 文件\ncclaw daemon start -p ~/.cclaw/daemon.pid\n```\n\n### Cron 命令\n\n```bash\n# 列出定时任务\ncclaw cron list\n\n# 添加任务 (格式: 分 时 日 月 周)\ncclaw cron add \"0 9 * * *\" \"backup\"\n\n# 删除任务\ncclaw cron remove <job-id>\n```\n\n## 环境变量\n\n可以通过环境变量覆盖配置:\n\n```bash\nexport CCLAW_API_KEY=\"sk-...\"\nexport CCLAW_PROVIDER=\"openrouter\"\nexport CCLAW_MODEL=\"anthropic/claude-sonnet-4\"\nexport CCLAW_WORKSPACE=\"/path/to/workspace\"\n\n./bin/cclaw agent\n```\n\n## 高级用法\n\n### 自定义系统提示\n\n在 `~/.cclaw/system_prompt.txt` 创建文件:\n\n```\n你是一个专业的编程助手,擅长:\n- Python/Rust/C 语言\n- 代码审查和重构\n- 算法优化\n```\n\n### 扩展开发 (Pi Philosophy)\n\nCClaw 支持 Agent 自我扩展:\n\n```c\n// 生成工具扩展代码\nstr_t source;\nextension_generate_tool(\n &STR_LIT(\"my_tool\"),\n &STR_LIT(\"My custom tool\"),\n &schema,\n &implementation,\n &source\n);\n```\n\n### 会话管理 (Pi-Style)\n\n```\nUser: 帮我优化这段代码\nAgent: 请分享代码\nUser: [分享代码]\n ├── Branch 1: 使用函数式编程\n └── Branch 2: 使用面向对象 <-- 你在这里\n └── User: 为什么用类?\n```\n\n使用 `/new` 创建分支,`/back` 返回上级。\n\n## 故障排除\n\n### 1. 配置文件错误\n\n```bash\n# 重新初始化\nrm ~/.cclaw/config.json\n./bin/cclaw onboard\n```\n\n### 2. API 连接失败\n\n```bash\n# 检查网络\n./bin/cclaw doctor\n\n# 测试 API\ncurl -H \"Authorization: Bearer $API_KEY\" \\\n https://openrouter.ai/api/v1/models\n```\n\n### 3. 守护进程无法启动\n\n```bash\n# 检查 PID 文件\nrm ~/.cclaw/daemon.pid\n\n# 手动启动查看错误\n./bin/cclaw daemon start\n```\n\n### 4. TUI 显示异常\n\n```bash\n# 检查终端支持\necho $TERM\n\n# 设置合适的 TERM\nexport TERM=xterm-256color\n```\n\n## 示例工作流\n\n### 编程助手\n\n```bash\n# 1. 进入工作目录\ncd ~/projects/myapp\n\n# 2. 启动 Agent\n./bin/cclaw agent\n\n# 3. 对话\n> 请帮我审查 main.py\n> [Agent 读取文件]\n> 这里有三个问题:...\n\n# 4. 创建分支探讨不同方案\n/new\n> 如果改用 asyncio 会怎样?\n```\n\n### 自动化任务\n\n```bash\n# 1. 配置定时任务\ncclaw cron add \"0 9 * * *\" \"daily_report\"\n\n# 2. 启动守护进程\ncclaw daemon start\n\n# 3. 查看日志\ntail -f ~/.cclaw/daemon.log\n```\n\n## 系统服务 (systemd)\n\n创建 `/etc/systemd/system/cclaw.service`:\n\n```ini\n[Unit]\nDescription=CClaw AI Assistant\nAfter=network.target\n\n[Service]\nType=forking\nUser=username\nExecStart=/usr/local/bin/cclaw daemon start\nExecStop=/usr/local/bin/cclaw daemon stop\nPIDFile=/home/username/.cclaw/daemon.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n```\n\n启用服务:\n```bash\nsudo systemctl enable cclaw\nsudo systemctl start cclaw\n```\n\n## 更多信息\n\n- 项目文档: `AGENT_FRAMEWORK.md`\n- 开发计划: `plan.md`\n- 示例代码: `examples/`\n\n## 获取帮助\n\n```bash\n# 查看帮助\n./bin/cclaw help\n\n# 命令帮助\n./bin/cclaw help agent\n./bin/cclaw help daemon\n```\n"}, "84c8cdf4295ce9f1a83a413256752a6fa57390e2": {"t": 1785763003.4387608, "n": 4988, "h": "e8fecf7bd3b783dc", "c": "# CClaw 配置及运行指南\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\n# Debian/Ubuntu\nsudo apt-get install -y clang libcurl4-openssl-dev libsqlite3-dev libsodium-dev libuv1-dev uuid-dev\n\n# Termux (Android)\npkg install clang curl sqlite libsodium libuv libuuid\n\n# macOS\nbrew install curl sqlite libsodium libuv ossp-uuid\n```\n\n### 2. 编译\n\n```bash\ncd /data/data/com.termux/files/home/yyscode/dev216/cclaw\nmake clean && make\n```\n\n### 3. 初始化配置\n\n```bash\n./bin/cclaw onboard\n```\n\n按提示输入:\n- API Key (从 OpenRouter/Anthropic/OpenAI 获取)\n- 默认提供商 (openrouter/anthropic/openai)\n- 默认模型\n- 内存后端 (sqlite/markdown/none)\n\n## 配置文件\n\n配置文件位于 `~/.cclaw/config.json`:\n\n```json\n{\n \"api_key\": \"sk-or-v1-...\",\n \"default_provider\": \"openrouter\",\n \"default_model\": \"anthropic/claude-sonnet-4-20250514\",\n \"default_temperature\": 0.7,\n \"memory\": {\n \"backend\": \"sqlite\",\n \"auto_save\": true,\n \"conversation_retention_days\": 30\n },\n \"gateway\": {\n \"port\": 8080,\n \"host\": \"127.0.0.1\"\n },\n \"autonomy\": {\n \"level\": 1,\n \"workspace_only\": true,\n \"max_actions_per_hour\": 100\n },\n \"channels\": {\n \"cli\": true\n }\n}\n```\n\n### 配置项说明\n\n| 配置项 | 说明 | 默认值 |\n|--------|------|--------|\n| `api_key` | LLM API 密钥 | 必填 |\n| `default_provider` | 默认提供商 | openrouter |\n| `default_model` | 默认模型 | anthropic/claude-sonnet-4 |\n| `default_temperature` | 采样温度 | 0.7 |\n| `memory.backend` | 记忆后端 | sqlite |\n| `gateway.port` | 网关端口 | 8080 |\n| `autonomy.level` | 自主级别 (0-2) | 1 |\n\n## 运行模式\n\n### 1. 交互式 Agent (推荐)\n\n```bash\n./bin/cclaw agent\n```\n\n快捷键:\n- `Ctrl+H` - 显示帮助\n- `Ctrl+N` - 创建新分支 (Pi-style)\n- `Ctrl+B` - 显示分支\n- `Ctrl+L` - 清屏\n- `Ctrl+Q` - 退出\n- `↑/↓` - 历史记录\n\n### 2. TUI 界面\n\n```bash\n./bin/cclaw tui\n```\n\nTUI 特点:\n- 侧边栏显示会话列表\n- 状态栏显示模型和 token 数\n- 支持分支导航\n- 颜色主题支持\n\n### 3. 单消息模式\n\n```bash\n./bin/cclaw agent -m \"你好,请帮我写一段 Python 代码\"\n```\n\n### 4. 守护进程模式\n\n启动守护进程:\n```bash\n./bin/cclaw daemon start\n```\n\n查看状态:\n```bash\n./bin/cclaw daemon status\n```\n\n停止守护进程:\n```bash\n./bin/cclaw daemon stop\n```\n\n重启:\n```bash\n./bin/cclaw daemon restart\n```\n\n守护进程特点:\n- 后台运行\n- 自动重连\n- Cron 定时任务\n- 健康检查端点\n\n## 命令参考\n\n### 基础命令\n\n| 命令 | 说明 | 示例 |\n|------|------|------|\n| `onboard` | 初始化配置 | `cclaw onboard` |\n| `agent` | 启动交互式 Agent | `cclaw agent -m \"Hello\"` |\n| `tui` | 启动 TUI 界面 | `cclaw tui` |\n| `daemon` | 守护进程管理 | `cclaw daemon start` |\n| `status` | 查看状态 | `cclaw status` |\n| `doctor` | 诊断检查 | `cclaw doctor` |\n| `channel` | 通道管理 | `cclaw channel list` |\n| `cron` | 定时任务 | `cclaw cron list` |\n\n### Agent 命令\n\n```bash\n# 交互模式\ncclaw agent\n\n# 单消息模式\ncclaw agent -m \"你好\"\n\n# 指定模型\ncclaw agent --model \"gpt-4o\"\n\n# 指定温度\ncclaw agent -t 0.5\n```\n\n### Daemon 命令\n\n```bash\n# 启动\ncclaw daemon start\n\n# 停止\ncclaw daemon stop\n\n# 重启\ncclaw daemon restart\n\n# 查看状态\ncclaw daemon status\n\n# 指定 PID 文件\ncclaw daemon start -p ~/.cclaw/daemon.pid\n```\n\n### Cron 命令\n\n```bash\n# 列出定时任务\ncclaw cron list\n\n# 添加任务 (格式: 分 时 日 月 周)\ncclaw cron add \"0 9 * * *\" \"backup\"\n\n# 删除任务\ncclaw cron remove <job-id>\n```\n\n## 环境变量\n\n可以通过环境变量覆盖配置:\n\n```bash\nexport CCLAW_API_KEY=\"sk-...\"\nexport CCLAW_PROVIDER=\"openrouter\"\nexport CCLAW_MODEL=\"anthropic/claude-sonnet-4\"\nexport CCLAW_WORKSPACE=\"/path/to/workspace\"\n\n./bin/cclaw agent\n```\n\n## 高级用法\n\n### 自定义系统提示\n\n在 `~/.cclaw/system_prompt.txt` 创建文件:\n\n```\n你是一个专业的编程助手,擅长:\n- Python/Rust/C 语言\n- 代码审查和重构\n- 算法优化\n```\n\n### 扩展开发 (Pi Philosophy)\n\nCClaw 支持 Agent 自我扩展:\n\n```c\n// 生成工具扩展代码\nstr_t source;\nextension_generate_tool(\n &STR_LIT(\"my_tool\"),\n &STR_LIT(\"My custom tool\"),\n &schema,\n &implementation,\n &source\n);\n```\n\n### 会话管理 (Pi-Style)\n\n```\nUser: 帮我优化这段代码\nAgent: 请分享代码\nUser: [分享代码]\n ├── Branch 1: 使用函数式编程\n └── Branch 2: 使用面向对象 <-- 你在这里\n └── User: 为什么用类?\n```\n\n使用 `/new` 创建分支,`/back` 返回上级。\n\n## 故障排除\n\n### 1. 配置文件错误\n\n```bash\n# 重新初始化\nrm ~/.cclaw/config.json\n./bin/cclaw onboard\n```\n\n### 2. API 连接失败\n\n```bash\n# 检查网络\n./bin/cclaw doctor\n\n# 测试 API\ncurl -H \"Authorization: Bearer $API_KEY\" \\\n https://openrouter.ai/api/v1/models\n```\n\n### 3. 守护进程无法启动\n\n```bash\n# 检查 PID 文件\nrm ~/.cclaw/daemon.pid\n\n# 手动启动查看错误\n./bin/cclaw daemon start\n```\n\n### 4. TUI 显示异常\n\n```bash\n# 检查终端支持\necho $TERM\n\n# 设置合适的 TERM\nexport TERM=xterm-256color\n```\n\n## 示例工作流\n\n### 编程助手\n\n```bash\n# 1. 进入工作目录\ncd ~/projects/myapp\n\n# 2. 启动 Agent\n./bin/cclaw agent\n\n# 3. 对话\n> 请帮我审查 main.py\n> [Agent 读取文件]\n> 这里有三个问题:...\n\n# 4. 创建分支探讨不同方案\n/new\n> 如果改用 asyncio 会怎样?\n```\n\n### 自动化任务\n\n```bash\n# 1. 配置定时任务\ncclaw cron add \"0 9 * * *\" \"daily_report\"\n\n# 2. 启动守护进程\ncclaw daemon start\n\n# 3. 查看日志\ntail -f ~/.cclaw/daemon.log\n```\n\n## 系统服务 (systemd)\n\n创建 `/etc/systemd/system/cclaw.service`:\n\n```ini\n[Unit]\nDescription=CClaw AI Assistant\nAfter=network.target\n\n[Service]\nType=forking\nUser=username\nExecStart=/usr/local/bin/cclaw daemon start\nExecStop=/usr/local/bin/cclaw daemon stop\nPIDFile=/home/username/.cclaw/daemon.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n```\n\n启用服务:\n```bash\nsudo systemctl enable cclaw\nsudo systemctl start cclaw\n```\n\n## 更多信息\n\n- 项目文档: `AGENT_FRAMEWORK.md`\n- 开发计划: `plan.md`\n- 示例代码: `examples/`\n\n## 获取帮助\n\n```bash\n# 查看帮助\n./bin/cclaw help\n\n# 命令帮助\n./bin/cclaw help agent\n./bin/cclaw help daemon\n```\n"}}}} |