Commit Graph

131 Commits

Author SHA1 Message Date
yinwm
cef1e39734 docs: add heartbeat documentation with spawn/subagent details
- Add Heartbeat section explaining periodic task execution
- Document spawn tool for async subagent creation
- Explain independent context and message tool communication
- Add workflow diagram for subagent communication
- Update workspace layout with HEARTBEAT.md and state/
- Add heartbeat config to config.example.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:19:37 +08:00
yinwm
a6aa833237 Merge remote-tracking branch 'origin/main' into ralph/tool-result-refactor 2026-02-13 15:06:23 +08:00
yinwm
8851152cbd refactor(tools): extract shared logic for internal channels and tool definitions
- Add constants package with IsInternalChannel helper to centralize internal channel checks across agent, channels, and heartbeat services
- Add ToProviderDefs method to ToolRegistry to consolidate tool definition conversion logic used in agent loop and tool loop
- Refactor SubagentTool.Execute to use RunToolLoop for consistent tool execution with iteration tracking
- Remove duplicate inline map definitions and type assertion code throughout codebase
2026-02-13 15:05:16 +08:00
yinwm
0cce9fc905 refactor(agent): extract reusable tool loop and make subagents independent
Extract core LLM tool loop logic into shared RunToolLoop function that can be
used by both main agent and subagents. Subagents now run their own tool loop
with dedicated tool registry, enabling full independence.

Key changes:
- New pkg/tools/toolloop.go with reusable tool execution logic
- Subagents use message tool to communicate directly with users
- Heartbeat processing is now stateless via ProcessHeartbeat
- Simplified system message routing without result forwarding
- Shared tool registry creation for consistency between agents

This architecture follows openclaw's design where async tools notify via
bus and subagents handle their own user communication.
2026-02-13 14:39:39 +08:00
lxowalle
42e0e588dd * The docker-build workflow will no longer run when submitting a PR. 2026-02-13 12:14:45 +08:00
lxowalle
68abf6b2ee * fix: docker build failed 2026-02-13 12:10:00 +08:00
yinwm
4dfa133cb8 refactor(heartbeat): add configurable interval and channel-aware routing
feat(config): add heartbeat interval configuration with default 30 minutes

feat(state): migrate state file from workspace root to state directory

feat(channels): skip internal channels in outbound dispatcher

feat(agent): record last active channel for heartbeat context

refactor(subagent): use configurable default model instead of provider default
2026-02-13 11:13:32 +08:00
Guoguo
92b8710f59 fix(version): default to dev (#95)
`make build` injects the real version from git tags via ldflags. Avoid hardcoded version strings here.

Signed-off-by: Guoguo <i@qwq.trade>
2026-02-13 10:33:07 +08:00
Guoguo
8e15c9093b ci: add release workflow 2026-02-13 10:03:04 +08:00
yinwm
8fbbb67f70 refactor(heartbeat): simplify service with single handler and direct bus usage
- Remove redundant ChannelSender interface, use *bus.MessageBus directly
- Consolidate two handlers (onHeartbeat, onHeartbeatWithTools) into one
- Move HEARTBEAT.md and heartbeat.log to workspace root
- Simplify NewHeartbeatService signature (remove handler param)
- Add SetBus and SetHandler methods for dependency injection

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 09:51:51 +08:00
zepan
aa0ab7294b 1. update wechat group qrcode 2026-02-13 09:20:47 +08:00
yinwm
b59464230a perf(cron): use read lock for concurrent reads in addJob 2026-02-13 02:15:56 +08:00
yinwm
e353844dfb feat: re-enable cronTool service after refactor completion
Re-enable cronTool service integration after completing the ToolResult
refactor (US-016). Removed all temporary disable comments and restored
full cron service lifecycle including start/stop operations.

Additional improvements:
- Add thread-safe access to onHeartbeatWithTools handler
- Fix channel parsing to handle user IDs with special characters
- Add error handling for state file loading failures
2026-02-13 02:09:49 +08:00
yinwm
474f3dbf90 fix: resolve code review issues in tool-result-refactor
1. Remove duplicate ToolResult definition in heartbeat package
   - Import tools.ToolResult instead of local definition
   - Add nil check for handler before execution

2. Fix SpawnTool to return AsyncResult and implement AsyncTool
   - Add callback field and SetCallback method
   - Return AsyncResult instead of NewToolResult

3. Add context cancellation support to SubagentManager
   - Check ctx.Done() before and during task execution
   - Set task status to "cancelled" on cancellation
   - Call callback with result on completion

4. Fix data race window in CronTool.addJob
   - Use Lock instead of RLock for channel/chatID access
   - Ensure consistent snapshot during job creation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:59:50 +08:00
yinwm
e7e086155e feat: merge heartbeat service improvements from feat-heartbeat branch
- Add ChannelSender interface for sending heartbeat results to users
- Add sendResponse() to automatically deliver results to last channel
- Add createDefaultHeartbeatTemplate() for first-run setup
- Support HEARTBEAT_OK silent response (legacy compatibility)
- Add structured logging with INFO/ERROR levels
- Move integration tests to separate file with build tag

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:42:22 +08:00
yinwm
53b5be862f Merge remote-tracking branch 'origin/main' into ralph/tool-result-refactor 2026-02-13 01:02:52 +08:00
yinwm
ab20314882 Merge upstream/main into ralph/tool-result-refactor
Resolved conflicts:
- pkg/heartbeat/service.go: merged both 'started' field and 'onHeartbeatWithTools'
- pkg/tools/edit.go: use validatePath() with ToolResult return
- pkg/tools/filesystem.go: fixed return values to use ToolResult
- cmd/picoclaw/main.go: kept active setupCronTool, fixed toolsPkg import
- pkg/tools/cron.go: fixed Execute return value handling

Fixed tests for new function signatures (NewEditFileTool, NewAppendFileTool, NewExecTool)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:00:26 +08:00
lxowalle
d83fb6e081 * Fix typos 2026-02-13 00:25:08 +08:00
Sunwood-ai-labs
d2a372e7cc Add openrouter config sample 2026-02-13 00:25:08 +08:00
Sunwood-ai-labs
759f4cfe25 refactor(docker): consolidate compose files and move config to config/ directory
- Deleted docker-compose.discord.yml and merged into docker-compose.yml
- Moved config.example.json to config/
- Updated volume mounts to use ./config/config.json
- Updated verify script permissions (implied if valid)
2026-02-13 00:25:08 +08:00
Sunwood-ai-labs
2997ea0b01 ci: add GitHub Actions workflow for Docker image build & push 🐳 2026-02-13 00:25:08 +08:00
Sunwood-ai-labs
1b45195acb feat: add Docker Compose support for Discord bot deployment
- Add Dockerfile with multi-stage build for picoclaw
- Add docker-compose.discord.yml for Discord bot service
- Add docker-compose.yml for agent mode service
- Add .env.example with environment variable template
- Add .dockerignore for optimized builds
- Update README.md with Docker Compose section and language switch
- Add README.ja.md (Japanese documentation)
- Update .gitignore with Docker-related entries
2026-02-13 00:25:08 +08:00
yinwm
b36c87bd60 chore: Clean up Ralph agent tracking files
Remove .ralph/ directory files from git tracking.
These are no longer needed as the tool-result-refactor is complete.

Also removes root-level prd.json and progress.txt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:51:52 +08:00
Guoguo
d165fde011 build: add darwin arm64 target (#76) 2026-02-12 23:37:40 +08:00
yinwm
3eb9d6a409 chore: Remove backup cron files
Remove .bak2 and .broken backup files from pkg/tools/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:35:28 +08:00
lxowalle
e2862c721d Merge pull request #74 from SatyamDevv/main
feat(cron): Add support for direct shell command execution in scheduled jobs
2026-02-12 23:31:36 +08:00
Satyam Tiwari
0b7f8c1e82 Merge remote-tracking branch 'upstream/main' 2026-02-12 20:58:36 +05:30
lxowalle
19fc918e9c Merge pull request #73 from Leeaandrob/feat/claude-cli-provider
feat: add cli-based LLM provider
2026-02-12 23:27:29 +08:00
lxowalle
bba44cf89c Merge pull request #72 from xray918/add-clawdchat-social-network
Add ClawdChat Agent Social Network section
2026-02-12 23:07:58 +08:00
Satyam Tiwari
19b9f93935 Merge remote-tracking branch 'upstream/main' 2026-02-12 20:35:25 +05:30
Satyam Tiwari
2855764712 Merge branch 'main' of https://github.com/SatyamDevv/picoclaw 2026-02-12 20:30:13 +05:30
lxowalle
a8cd784636 Merge pull request #64 from DevEverything01/fix/heartbeat-service-start-bug
fix(heartbeat): resolve bug where service could never start
2026-02-12 22:59:50 +08:00
Satyam Tiwari
7c16afbe62 merged and fixed the issues 2026-02-12 20:29:15 +05:30
Satyam Tiwari
71a81eb297 Merge branch 'main' of https://github.com/SatyamDevv/picoclaw 2026-02-12 20:25:31 +05:30
xiexinfa
ae2501d943 Add ClawdChat Agent Social Network section to README
- Add new section introducing ClawdChat.ai agent social network
- Include ClawdChat icon with transparent background
- Provide clear instructions for joining the network
- Position section before Configuration for better visibility

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 22:53:04 +08:00
Leandro Barbosa
f6362ce7b1 feat: add cli-based LLM provider
Add ClaudeCliProvider that executes the local CLI as a subprocess,
enabling PicoClaw to leverage advanced capabilities (MCP tools,
workspace awareness, session management) through any messaging channel.

- Implement LLMProvider interface via subprocess execution
- Support --system-prompt, --model, --output-format json flags
- Parse real v2.x JSON response format including usage tokens
- Handle error responses, stderr, context cancellation
- Register "claude-cli", "claude-code", "claudecode" aliases in CreateProvider
- 56 unit tests with mock scripts + 3 integration tests against real binary
- 100% coverage on all functions except stripToolCallsJSON (85.7%)
2026-02-12 11:51:51 -03:00
Satyam Tiwari
9c98c11351 Enhance CronTool to support executing shell commands and update job handling 2026-02-12 20:21:49 +05:30
lxowalle
930080f603 Merge pull request #56 from jmahotiedu/fix/openai-device-code-interval
fix(auth): support string interval in OpenAI device-code flow
2026-02-12 22:51:37 +08:00
lxowalle
5b6ad3f7cf Merge pull request #55 from Diegox-17/patch-1
Fix LLM error by cleaning up CONSCIOUSLY message history
2026-02-12 22:49:57 +08:00
mxrain
a9a7a89c07 feat: add Moonshot/Kimi and NVIDIA provider support with proxy 2026-02-12 22:39:38 +08:00
mxrain
53c69ae41e fix: use cmd /c on Windows for shell command execution
The exec tool was hardcoded to use 'sh -c' which doesn't exist on Windows,
causing all tool calls to fail silently in gateway mode.
2026-02-12 22:38:47 +08:00
mxrain
1d143fa10a feat: add Telegram proxy support and flexible allow_from matching
- Add proxy config field for Telegram channel to support HTTP/SOCKS proxies
- Use telego.WithHTTPClient to route all Telegram API requests through proxy
- Add FlexibleStringSlice type so allow_from accepts both strings and numbers
- Improve IsAllowed to match numeric ID, username, and @username formats
- Update config.example.json with proxy field
2026-02-12 22:38:47 +08:00
Guoguo
0661d05541 ci: add build check workflow (#71)
Signed-off-by: Guoguo <i@qwq.trade>
2026-02-12 22:28:27 +08:00
lxowalle
8661d54406 * Delete unused file 2026-02-12 21:58:40 +08:00
lxowalle
8d155988a9 Merge pull request #26 from RinZ27/fix-path-traversal-and-unrestricted-exec
Enforce workspace directory boundaries for system tools
2026-02-12 21:57:29 +08:00
lxowalle
df1e4d0494 Merge branch 'main' into fix-path-traversal-and-unrestricted-exec 2026-02-12 21:57:16 +08:00
yinwm
5582b6d910 docs: Complete tool-result-refactor - All 21 user stories done
All 21 user stories for tool-result-refactor project completed:
- US-001 through US-021
- All acceptance criteria met
- Typecheck passes
- Tests created and passing

Project successfully refactored all tools to use structured ToolResult
return values, supporting async tasks and proper user/LLM message routing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:17:13 +08:00
yinwm
be81ba1f30 feat: US-021 - Heartbeat calls ExecuteHeartbeatWithTools
Verified US-021 acceptance criteria:
- checkHeartbeat() calls hs.executeHeartbeatWithTools(prompt) ✓
- ProcessHeartbeat function does not exist (already deleted) ✓
- Typecheck passes (go build ./... succeeds) ✓

Note: US-020 and US-021 were already implemented in previous commits.
The checkHeartbeat function prioritizes the new tool-supporting handler
(hs.onHeartbeatWithTools) over the legacy handler (hs.onHeartbeat).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:17:03 +08:00
yinwm
e63f96794f feat: US-020 - Move heartbeat log to memory directory
Verified and tested that heartbeat log is written to memory directory:
- Current code uses workspace/memory/heartbeat.log (correct)
- Added TestLogPath test verifying log is in memory directory
- All acceptance criteria met

Note: US-020 was already implemented (log path was already memory/heartbeat.log).
This commit adds the missing test to verify the requirement.

Acceptance criteria met:
- Log path is workspace/memory/heartbeat.log (not workspace/heartbeat.log)
- Directory auto-created if missing (os.MkdirAll)
- Log format unchanged (timestamped messages)
- Typecheck passes (go build ./... succeeds)
- go test ./pkg/heartbeat -run TestLogPath passes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:16:36 +08:00
yinwm
03b02cc7d7 feat: US-019 - Enable heartbeat by default in config
- Added HeartbeatConfig struct with Enabled field
- Added Heartbeat to Config struct
- Set default Heartbeat.Enabled = true in DefaultConfig()
- Updated main.go to use cfg.Heartbeat.Enabled instead of hardcoded true
- Added config tests verifying heartbeat is enabled by default

Acceptance criteria met:
- DefaultConfig() Heartbeat.Enabled changed to true
- Can override via PICOCLAW_HEARTBEAT_ENABLED=false env var
- Config documentation updated showing default enabled
- Typecheck passes (go build ./... succeeds)
- go test ./pkg/config -run TestDefaultConfig passes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:15:43 +08:00