Files

1 line
43 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}