Commit graph

343 commits

Author SHA1 Message Date
cointem
394d1d1197
fix: Templates update (#485)
* fix: add MaxTokens and Temperature fields to AgentInstance and update related logic

* feat: add MaxTokens and Temperature options to SubagentManager and update tool loop logic

* feat: add default temperature handling and update related tests

* feat: allow temperature 0 and distinguish unset

* fix: format MockLLMProvider struct in subagent_tool_test.go
2026-02-19 19:16:37 +01:00
yinwm
e2d37f09bf style: run gofmt to fix code formatting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 01:27:00 +08:00
yinwm
c08deb93d1 refactor(config): use provider-specific protocol instead of generic openai protocol
Update model configurations to use provider-specific protocols (zhipu, vllm,
gemini, shengsuanyun, deepseek, volcengine) instead of using the generic
"openai" protocol for all providers. This change ensures each provider
uses its correct protocol identifier and model naming convention.
2026-02-20 01:07:36 +08:00
yinwm
7f241647be feat(providers): add thought_signature support for gemini
Add support for persisting thought_signature metadata from Google/Gemini 3
models. This introduces ExtraContent and GoogleExtra types to handle
provider-specific metadata, and ensures thought signatures are properly
preserved through the tool call lifecycle.
2026-02-20 00:36:31 +08:00
yinwm
68cdafc5f2 refactor(providers): restructure provider creation with protocol-based configuration
- Move provider creation logic to factory_provider.go with protocol-based approach
- Add OpenAIProviderConfig with WebSearch support and embedded ProviderConfig
- Add maxTokensField to OpenAI-compatible provider for configurable token field
- Introduce new providers: Ollama, DeepSeek, GitHubCopilot, Antigravity, Qwen
- Remove redundant CreateProvider function from factory.go
- Add ThoughtSignature field to FunctionCall for tool response handling
- Remove duplicate Name field assignment in tool loop
- Update tests to reflect new provider configuration structure
2026-02-20 00:12:01 +08:00
yinwm
f8f1d539d4 Merge remote-tracking branch 'origin/main' into feat/refactor-provider-by-protocol 2026-02-20 00:11:46 +08:00
yinwm
1e96733435 fix(agent): avoid consecutive system messages in compression
Append emergency compression note to the original system prompt
instead of creating a separate system message. Some APIs like
Zhipu reject two consecutive system messages.
2026-02-19 22:47:03 +08:00
Jex
213274002a
fix: keep Discord typing indicator alive during agent processing (#391)
* fix: keep Discord typing indicator alive during agent processing

Discord's ChannelTyping() expires after ~10s, but agent processing
(LLM + tool execution) typically takes 30-60s+. Replace single-fire
ChannelTyping() with a self-managed typing loop inside DiscordChannel.

- startTyping(chatID): goroutine refreshes ChannelTyping every 8s
- stopTyping(chatID): called in Send() when response is dispatched
- Stop() cleans up all typing goroutines on shutdown
- startTyping placed after all early returns to prevent goroutine leaks

Typing lifecycle fully contained in channel layer, no interface changes.

Fixes #390

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add goroutine safety to Discord typing indicator

- Add 5-minute timeout as safety net to prevent indefinite goroutine leaks
  when agent produces no outbound message (empty response, panic, etc.)
- Listen on c.ctx.Done() so goroutine exits when channel context is cancelled
- Log ChannelTyping() errors at debug level for diagnostics (rate limits, session closed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:28:58 +01:00
tpkeeper
12f0c4a6cf
fix: ensure tool name is correctly assigned in LLM iteration(missing tool call name in debug mode logs) (#454)
* fix: ensure tool name is correctly assigned in LLM iteration

* fix: ensure tool name is correctly included in assistant message
2026-02-19 12:06:09 +01:00
Ruslan Semagin
32c5c4b3a4
refactor: replace bool map with set-style map for internal channels (#472)
* refactor: replace bool map with set-style map for internal channels

Use map[string]struct{} and comma-ok idiom for clearer and more idiomatic membership checks.

* Update pkg/constants/channels.go

Co-authored-by: Harsh Bansal <122075346+harshbansal7@users.noreply.github.com>

---------

Co-authored-by: Harsh Bansal <122075346+harshbansal7@users.noreply.github.com>
2026-02-19 11:48:17 +01:00
hsohinna
56a060ff61
feat(onebot): enhance OneBot channel (#192)
* fix: change BotStatus type to json.RawMessage and add isAPIResponse function

* feat(onebot): add rich media, API callback, keepalive and voice transcription

   Comprehensive improvements to the OneBot channel for better NapCatQQ
   compatibility:

   - Add echo-based API callback mechanism (sendAPIRequest) for
     request/response correlation via pending map
   - Add WebSocket ping/pong keepalive (30s ping, 60s read deadline)
   - Fetch bot self ID via get_login_info on connect/reconnect
   - Refactor parseMessageContentEx into parseMessageSegments supporting
     image, record, video, file, reply, face, forward segments
   - Add voice transcription via Groq transcriber (SetTranscriber)
   - Switch to message segment array format for sending with auto reply
     quote via lastMessageID tracking
   - Add message_sent event handling and detailed notice event processing
     (recall, poke, group increase/decrease, friend add, etc.)
   - Use sync/atomic for echoCounter, optimize listen() lock pattern
   - Clean up pending callbacks on Stop(), defer temp file cleanup
   - Mount Groq transcriber on OneBot channel in main.go gateway

* feat(onebot): add user ID allowlist check for incoming messages

- Currently, the agent does not respond to messages sent by users outside the allowlist.

* refactor(onebot): simplify channel implementation and add emoji reaction

- onebot.go from 1179 to 980 lines (~17%)
2026-02-19 14:39:35 +08:00
yinwm
58b5e21d90 fix(config): support legacy config without provider field
When no provider field is set but model is specified, use the user's model
as ModelName for the first provider. This maintains backward compatibility
with old configs that relied on implicit provider selection and ensures
GetModelConfig(model) can find the model by its configured name.
2026-02-19 13:05:21 +08:00
yinwm
1e26312cb3 feat(config): validate duplicate model names
Add validation to ensure model_name is unique across all entries in
model_list. This prevents potential conflicts when multiple model
configs share the same model_name identifier.
2026-02-19 12:45:12 +08:00
yinwm
ec86b21d3f fix: improve migration logic and reduce code duplication
- Preserve user's configured model during config migration (issue #5)
- Simplify ExtractProtocol using strings.Cut
- Extract NormalizeToolCall to shared utility, removing ~70 lines of duplicate code
- Clean up unused fields in providerMigrationConfig struct

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 09:22:39 +08:00
mattn
e8afd31b28
Replace \s+ with [^\S\n]+ to preserve newlines (#299) 2026-02-19 02:02:28 +01:00
Kai Xia(夏恺)
d167b47431
dead code cleanup (#210) 2026-02-19 01:54:13 +01:00
fipso
bb0424e1e2
fix: also use max_completion_tokens for gpt5 era models (#445) 2026-02-19 01:29:34 +01:00
Hua Audio
0d6b22fb3a
Update pkg/utils/message.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-18 23:26:39 +01:00
Huaaudio
98afd39913 remove unicode 2026-02-18 23:18:17 +01:00
Huaaudio
a46fe140a3 update dynamic buffer 2026-02-18 23:14:44 +01:00
Huaaudio
7d8894d842 update message test, change dynamic buffer 2026-02-18 23:14:24 +01:00
Hua Audio
dfc3dffd06
Update pkg/utils/message.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-18 22:43:49 +01:00
Huaaudio
82a2faed9d Privated function 2026-02-18 22:37:45 +01:00
Huaaudio
f38ce0d4ac Update to support extra long code blocks 2026-02-18 22:31:18 +01:00
Hua Audio
4ccee85561
Update pkg/utils/message.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-18 22:16:19 +01:00
Hua Audio
0a9d24e2a2
Merge branch 'sipeed:main' into feat/base-layer-message-split 2026-02-18 22:03:11 +01:00
harshbansal7
b122abd30f fix 2026-02-19 02:28:44 +05:30
Huaaudio
e35a827624 update documents 2026-02-18 21:44:25 +01:00
Hua
e03124dc8a refactor: improve SplitMessage API clarity
- Accept hard upper limit (maxLen) instead of pre-subtracted value
- Caller now passes actual platform limit (e.g., 2000 for Discord)
- Internal buffer of 500 chars is handled within message.go
- Preferred split at maxLen - 500, may extend to maxLen for code blocks
- Never exceeds maxLen, no more mental math for callers
2026-02-18 20:21:51 +00:00
Hua
94a1b8664b refactor: extract message splitting logic to shared utils
- Move FindLast, findLast, and SplitMessage from discord.go to pkg/utils/message.go
- Update discord.go to use utils.SplitMessage()
- Makes splitting logic reusable across other channels
2026-02-18 20:01:53 +00:00
Artem Yadelskyi
d07ac54eef
feat(fmt): Fix fmt 2026-02-18 21:55:55 +02:00
Artem Yadelskyi
5ff4a0f0ef
Merge branch 'main' into fix-formatting 2026-02-18 21:55:29 +02:00
Leandro Barbosa
f7ec89d82d
Merge pull request #411 from harshbansal7/frontmatter_fix
Bug Fix: Fix parsing of SKILL.md file frontmatter - regex
2026-02-18 16:48:47 -03:00
Artem Yadelskyi
9e120f90ea
feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
harshbansal7
287100f303 Comments resolved 2026-02-18 23:13:47 +05:30
yinwm
09a0d19119 fix: add VLLM default API base and implement MaxTokensField support
1. Add VLLM default API base (http://localhost:8000/v1)
   - Previously returned empty string, causing provider creation to fail

2. Implement MaxTokensField configuration
   - Add maxTokensField field to HTTPProvider
   - Add NewHTTPProviderWithMaxTokensField constructor
   - Use configured field name for max_tokens parameter
   - Fallback to model-based detection for backward compatibility

3. Add tests for VLLM, deepseek, ollama default API bases

Example config usage:
{
  "model_name": "glm-4",
  "model": "openai/glm-4",
  "max_tokens_field": "max_completion_tokens"
}

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 01:43:24 +08:00
yinwm
e1583f3b13 refactor: simplify legacy_provider.go from 349 to 49 lines
- Move OAuth helper functions to factory_provider.go
- Add auto-migration in LoadConfig: old providers -> model_list
- Add Workspace field to ModelConfig for CLI-based providers
- Fix OAuth handling to use auth store instead of raw APIKey
- Update tests to use new model_list configuration format

This eliminates the giant switch-case in legacy_provider.go,
achieving the goal of "zero-code provider addition" from the
design document (issue #283).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 01:30:19 +08:00
yinwm
ef7078a356 refactor: reorganize commands and provider architecture
Refactor command handlers into separate files to improve code organization
and maintainability. Each command (agent, auth, cron, gateway, migrate,
onboard, skills, status) now has its own dedicated file.

Restructure provider creation to support new model_list configuration
system that enables zero-code addition of OpenAI-compatible providers.
Move legacy provider logic to separate file for backward compatibility.

Move configuration functions from config.go to separate files
(defaults.go, migration.go) for better organization.
2026-02-19 01:03:34 +08:00
yinwm
a73d8e1a16 feat: add model_list configuration for zero-code provider addition
- Add ModelConfig struct with protocol prefix support (openai/, anthropic/, etc.)
- Implement GetModelConfig with round-robin load balancing
- Add CreateProviderFromConfig factory for protocol-based routing
- Add ModelRegistry for thread-safe endpoint selection
- Maintain full backward compatibility with legacy providers config
- Update README.md and README.zh.md with model_list documentation
- Add migration guide at docs/migration/model-list-migration.md

Supported protocols: openai, anthropic, antigravity, claude-cli, codex-cli,
github-copilot, openrouter, groq, deepseek, cerebras, qwen, zhipu, gemini

Closes #283

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 23:26:00 +08:00
Leandro Barbosa
b1e3b11a5d
Merge pull request #304 from mymmrac/golangci-lint
feat(linters): Added golangci-lint config & CI job
2026-02-18 12:16:58 -03:00
Leandro Barbosa
447c17aeb1 merge: sync upstream/main (PR #213) into feat/multi-agent-routing
Resolve conflicts in pkg/providers/types.go and pkg/agent/loop.go:
- types.go: use protocoltypes aliases from PR #213, keep fallback types
- loop.go: drop old single-agent createToolRegistry (replaced by multi-agent pattern)

Refactor to align with PR #213 patterns:
- instance.go: use NewExecToolWithConfig (accept full config for deny patterns)
- registry.go: pass full config to NewAgentInstance
- loop.go: add Perplexity web search options to registerSharedTools
2026-02-18 11:39:14 -03:00
Artem Yadelskyi
df52d4ad01
feat(linters): Fix linter 2026-02-18 16:26:35 +02:00
Artem Yadelskyi
ef8965048a
Merge branch 'main' into golangci-lint 2026-02-18 16:26:18 +02:00
Artem Yadelskyi
b88f4c9ab5
feat(linters): Fix linter 2026-02-18 16:24:55 +02:00
Leandro Barbosa
2276bd149e merge: sync upstream/main, wire WebSearch through factory
Merge upstream/main into refactor/provider-protocol-122.
Resolve http_provider.go conflict (keep thin delegate).
Wire OpenAIProviderConfig.WebSearch through providerSelection
and into CodexProvider for codex-auth and codex-cli-token paths.
2026-02-18 11:09:18 -03:00
lxowalle
eda6e37332
feat: Support modifying the command filtering list of the exec tool (#410) 2026-02-18 19:31:15 +08:00
harshbansal7
02b5811b95 add support for \r as well 2026-02-18 16:58:27 +05:30
harshbansal7
994ec72d91 Fix parsing of SKILL.md file frontmatter - regex 2026-02-18 16:55:20 +05:30
Zenix
3390576eea
Feature/websearch OpenAI (#118)
* feature: add web search for codex models

* fix: use more elegant way to solve the issue.
2026-02-18 16:30:30 +08:00
lxowalle
01d694b998
fix: Add comprehensive command injection and system abuse prevention patterns (#401)
* Add comprehensive command injection and system abuse prevention patterns

* fix: Container running as root
2026-02-18 15:33:34 +08:00
Luna Reed
acac1972e6 fix(exec): terminate process tree on timeout 2026-02-18 02:01:29 +08:00
yinwm
5d1669ecc4 Merge PR #343: Add Google Antigravity provider and harden tool-call compatibility 2026-02-18 00:13:24 +08:00
Jared Mahotiere
c4cbb5fb35 providers: finalize PR213 review fixes
Phase 1: centralize protocol message/tool/response types in protocoltypes and keep compatibility aliases in providers and protocol packages.

Phase 1: preserve HTTPProvider constructor compatibility and route Anthropic api_base through factory auth/provider constructors with base URL normalization.

Phase 2: expand provider routing/auth tests (deepseek/nvidia/shengsuanyun, codex/claude oauth/codex-cli) and add openai_compat + anthropic coverage for proxy transport, model normalization, numeric option coercion, token-source refresh, and base URL behavior.

Phase 3: apply gofmt and validate with Dockerized tests (go test ./pkg/providers/... ./pkg/migrate and go test ./...).
2026-02-17 11:13:10 -05:00
Leandro Barbosa
4fde0175cf
Merge pull request #227 from mattn/fix-shadowing-running
Fix shadowing field runnnig
2026-02-17 12:58:48 -03:00
yinwm
6913edbb5b Merge PR #368: Add Volcengine (doubao) provider 2026-02-17 23:51:40 +08:00
yinwm
6992012737 Merge PR #333: Add Cerebras provider 2026-02-17 23:41:19 +08:00
yinwm
de4ef9a8be Merge PR #365: Add Qwen provider 2026-02-17 23:37:55 +08:00
zenix.huang
0d16525fab fix: codex tool call 2026-02-17 22:56:31 +08:00
zenix.huang
4cd3f99dd6 fix: remove max_tokens 2026-02-17 22:56:31 +08:00
likeaturtle
6cd419b6e2 Fix the case sensitivity issue when automatically recognizing VolcEngine LLM model names. 2026-02-17 22:49:43 +08:00
mrbeandev
84110aa408 fix(antigravity): preserve thought signature on tool call parts 2026-02-17 20:05:47 +05:30
mrbeandev
99c32714f1 fix(antigravity): sanitize invalid tool-call history ordering 2026-02-17 20:05:41 +05:30
mrbeandev
caf3913347 fix(antigravity): normalize tool calls to avoid empty function names 2026-02-17 20:05:35 +05:30
mrbeandev
d1655d5996 fix(antigravity): update default model from gemini-3-flash-preview to gemini-3-flash 2026-02-17 20:05:29 +05:30
mrbeandev
1765f6d0e7 fix: strip antigravity prefix and improve model list for flash-preview 2026-02-17 20:05:25 +05:30
mrbeandev
d3fe8c5e17 feat: use gemini-3-flash-preview as default model name 2026-02-17 20:05:20 +05:30
mrbeandev
29e07ec7b4 feat: add manual callback URL entry for headless OAuth flow 2026-02-17 20:05:10 +05:30
mrbeandev
848aaedc24 feat: complete Antigravity provider integration with robust error handling and docs 2026-02-17 20:05:06 +05:30
mrbeandev
33915fb712 fix(gemini): preserve thought_signature in tool calls to prevent 400 errors 2026-02-17 20:04:45 +05:30
likeaturtle
2f24be6c59 add Volcengine LLM (doubao) support 2026-02-17 22:31:19 +08:00
Jared Mahotiere
e3c246a36f Merge origin/main into refactor/provider-protocol-122 2026-02-17 09:28:56 -05:00
HansonJames
f0e90e6379 feat: Add the Qwen provider 2026-02-17 22:07:58 +08:00
daming大铭
7b9b8104c8
Merge pull request #225 from yinwm/feat/cron-exec-timeout-config
feat(cron): add configurable execution timeout for cron jobs
2026-02-17 21:12:59 +08:00
yinwm
881999aceb refactor(shell): interpret zero timeout as unlimited execution
Replace unconditional WithTimeout usage with conditional context creation
based on timeout configuration. Zero values now bypass timeout enforcement,
using WithCancel for graceful cancellation while preserving existing timeout
behavior for positive values. Simplifies CronTool initialization by removing
unnecessary conditional timeout assignment.
2026-02-17 21:10:20 +08:00
Hua Audio
f929268ab2
feat: Add Perplexity search provider integration (#138)
* feat: Add Perplexity search provider integration

- Add PerplexityConfig struct to config package
- Add PerplexitySearchProvider implementing SearchProvider interface
- Update WebSearchTool to support Perplexity with priority system (Perplexity > Brave > DuckDuckGo)
- Update agent loop to pass Perplexity config options
- Update config.example.json with Perplexity configuration template
- Uses Perplexity's 'sonar' model for web search capabilities

* Edit config example

* make fmt

---------

Co-authored-by: Hua <zhangmikoto@gmail.com>
2026-02-17 21:02:56 +08:00
yinwm
684e7413e1 Merge remote-tracking branch 'origin/main' into feat/cron-exec-timeout-config 2026-02-17 20:53:31 +08:00
Yasuhiro Matsumoto
852d361eb0
Add new provider cerebras 2026-02-17 08:23:44 +09:00
Leandro Barbosa
12007b5670 merge: sync upstream/main into feat/multi-agent-routing
Resolve conflicts:
- pkg/agent/loop.go: integrate context compression, command handling,
  utf8 token estimation, and summarization notification into
  multi-agent routing architecture
- pkg/config/config_test.go: merge imports from both branches
- pkg/agent/loop_test.go: update test to use registry-based sessions
2026-02-16 10:34:55 -03:00
Tzufucius
8d757fbb6f
Feat issue 183 (#189)
* feat: add slash command support (e.g., /show model, /help)

* style: fix code formatting

* feat: implement robust context compression and error recovery with user notifications
2026-02-16 16:30:54 +08:00
Goksu Ceylan
e3f65fc3d6
fix(security): block critical symlink workspace escape (#188) 2026-02-16 16:20:35 +08:00
is-Xiaoen
5c321a90de
fix: tighten file perms and enforce Slack ACL checks (#186)
- write config and cron store with 0600 instead of 0644
- check allow list in Slack slash commands and app mentions
- pass workspace restrict flag to cron exec tool

Closes #179
2026-02-16 16:06:39 +08:00
mattn
a371d53438
Prevent panic on publish after MessageBus is closed (#223) 2026-02-16 15:04:25 +08:00
Avisek Ray
9d5728ec5b
feat: implement structured Telegram command handling with a dedicated command service and telegohandler integration. (#164) 2026-02-16 14:20:16 +08:00
Huaaudio
32cb8fdc12
Feat: Discord message length check and auto split (#143)
* feat: discord message auto split

* make fmt

* chore: remove failing discord_test.go

---------

Co-authored-by: Hua <zhangmikoto@gmail.com>
2026-02-16 13:39:26 +08:00
fahadahmadansari111
341dbd3007
Add health check endpoints (/health and /ready) for container orchestration liveness and readiness probes. (#104)
* added health endpoint

* formatted files

---------

Co-authored-by: lxowalle <83055338+lxowalle@users.noreply.github.com>
2026-02-16 11:53:11 +08:00
Zenix
0cb9387cf8
fix: codex agent 400 error (#102) 2026-02-16 11:46:02 +08:00
Leandro Barbosa
e77b0a6755
feat: add Codex CLI provider for subprocess integration (#80)
* feat: add Codex CLI provider for OpenAI subprocess integration

Add CodexCliProvider that wraps `codex exec --json` as a subprocess,
analogous to the existing ClaudeCliProvider pattern. This enables using
OpenAI's Codex CLI tool as a local LLM backend.

- CodexCliProvider: subprocess wrapper parsing JSONL event stream
- Credential reader for ~/.codex/auth.json with token expiry detection
- Factory integration: provider "codex-cli" and auth_method "codex-cli"
- Fix tilde expansion in workspace path for CLI providers
- 37 unit tests covering parsing, prompt building, credentials, and mocks

* fix: add tool call extraction to Codex CLI provider

- Extract shared tool call parsing into tool_call_extract.go
  (extractToolCallsFromText, stripToolCallsFromText, findMatchingBrace)
- Both ClaudeCliProvider and CodexCliProvider now share the same
  tool call extraction logic for PicoClaw-specific tools
- Fix cache token accounting: include cached_input_tokens in total
- Add 2 new tests for tool call extraction from JSONL events
- Update existing tests for corrected token calculations

* fix(docker): update Go version to match go.mod requirement

Dockerfile used golang:1.24-alpine but go.mod requires go >= 1.25.7.
This caused Docker builds to fail on all branches with:
  "go: go.mod requires go >= 1.25.7 (running go 1.24.13)"

Update to golang:1.25-alpine to match the project requirement.

* fix: handle codex CLI stderr noise without losing valid stdout

Codex writes diagnostic messages to stderr (e.g. rollout errors) which
cause non-zero exit codes even when valid JSONL output exists on stdout.
Parse stdout first before checking exit code to avoid false errors.

* style: fix gofmt formatting and update web search API in tests

- Remove trailing whitespace in web.go and base_test.go
- Update config_test.go and web_test.go for WebSearchToolOptions API
2026-02-16 11:40:17 +08:00
trungtt6
cd638fff6c
Add local AI ollama for security purpose (#226)
Co-authored-by: PhotoPortfolio Developer <developer@photportfolio.local>
2026-02-16 11:28:38 +08:00
mattn
1d748fb742
Remove duplicate file extension in DownloadFile (#230) 2026-02-16 02:20:20 +08:00
ian
c6c82b3c44
feat(skills): add validation for skill info and test cases (#231)
Add validation logic for SkillInfo to ensure name and description meet requirements
Include test cases covering various validation scenarios
Add testify dependency for testing assertions
2026-02-16 02:12:50 +08:00
Luke Milby
811e4f8728
add when picoclaw responsed to discord message will show its typing (#236) 2026-02-16 01:37:32 +08:00
Yasuhiro Matsumoto
7ce5b75178
Fix shadowing field runnnig 2026-02-16 00:47:17 +09:00
Jared Mahotiere
362c49a69d docs(test): document protocol architecture and migration compatibility 2026-02-15 08:04:16 -05:00
Jared Mahotiere
762565b0d4 refactor(providers): move anthropic logic to protocol package 2026-02-15 08:04:12 -05:00
Jared Mahotiere
a6e885bb47 refactor(providers): extract protocol factory and openai-compat transport 2026-02-15 08:04:07 -05:00
yinwm
40f90281e5 Merge remote-tracking branch 'upstream/main' into feat/cron-exec-timeout-config 2026-02-15 18:41:54 +08:00
yinwm
82856bc57a feat(cron): add configurable execution timeout for cron jobs
Add a new configuration option `exec_timeout_minutes` under the `tools.cron`
section to control the maximum execution time for cron jobs. The default
timeout is set to 5 minutes, which is appropriate for LLM operations.

The configuration can be set in the config file or via the
`PICOCLAW_TOOLS_CRON_EXEC_TIMEOUT_MINUTES` environment variable. A value of
0 disables the timeout entirely.

This change improves system reliability by preventing cron jobs from running
indefinitely in case of unexpected failures or hanging processes.
2026-02-15 18:41:39 +08:00
Meng Zhuo
8eb9dcd99a
Merge pull request #173 from is-Xiaoen/fix/code-review-bugs-116
fix: resolve multiple bugs from code review #116
2026-02-15 09:42:26 +08:00
xiaoen
0a88ff0817 fix: resolve multiple bugs from code review #116
Fixes four issues identified in the community code review:

- Session persistence broken on Windows: session keys like
  "telegram:123456" contain ':', which is illegal in Windows
  filenames. filepath.Base() strips drive-letter prefixes on Windows,
  causing Save() to silently fail. Added sanitizeFilename() to
  replace invalid chars in the filename while keeping the original
  key in the JSON payload.

- HTTP client with no timeout: HTTPProvider used Timeout: 0 (infinite
  wait), which can hang the entire agent if an API endpoint becomes
  unresponsive. Set a 120s safety timeout.

- Slack AllowFrom type mismatch: SlackConfig used plain []string
  while every other channel uses FlexibleStringSlice, so numeric
  user IDs in Slack config would fail to parse.

- Token estimation wrong for CJK: estimateTokens() divided byte
  length by 4, but CJK characters are 3 bytes each, causing ~3x
  overestimation and premature summarization. Switched to
  utf8.RuneCountInString() / 3 for better cross-language accuracy.

Also added unit tests for the session filename sanitization.

Ref #116
2026-02-15 09:36:59 +08:00
Meng Zhuo
ddd73cad48
Merge pull request #151 from qiaoborui/codex/fix-openai-oauth-authorize-url
fix(auth): align OpenAI OAuth browser login URL
2026-02-15 09:27:19 +08:00
Meng Zhuo
0f506d4202
Merge pull request #165 from alexhoshina/feat/onebot
feat: add OneBot channel support
2026-02-15 09:12:00 +08:00
Meng Zhuo
6f2e730eba
Merge pull request #178 from Lixeer/main
feat: Add `GitHub Copilot` provider support
2026-02-15 09:04:05 +08:00
Lixeer
16e5a02953 fix(http_provider): Remove extra parameter from CreateProvider function. 2026-02-15 08:06:29 +08:00
Lixeer
4b886b6573 fix: not used result 2026-02-15 08:02:23 +08:00
Lixeer
0a4bf32e81 try after workflow fix 2026-02-15 07:54:04 +08:00
Lixeer
5a6ad37dab code fmt 2026-02-15 07:34:12 +08:00
Lixeer
f6d6221c09 make fmt 2026-02-15 07:00:40 +08:00
Lixeer
7a9659971d make fmt 2026-02-15 06:55:20 +08:00
Lixeer
ecbe31599e chore: remove redundant debug output 2026-02-15 06:30:31 +08:00
Lixeer
6c392c3387 fix: openclaw crash because of empty config 2026-02-15 06:11:07 +08:00
Lixeer
0aab8d8afc feat:add github_copilot to providers factory 2026-02-15 06:10:00 +08:00
Lixeer
5faa67b77d feat: add Github Copilot provider 2026-02-15 05:23:42 +08:00
lxowalle
dbf2739783 fix: Remove the waiting animation for Telegram replies to reduce the risk of being rate-limited. 2026-02-15 02:26:42 +08:00
Leandro Barbosa
5e89264536 merge: sync upstream/main into feat/multi-agent-routing
Update registerSharedTools to use new WebSearchToolOptions API and
add hardware tools (I2C, SPI) from upstream. Accept upstream's
new web tools config test.
2026-02-14 10:38:04 -03:00
Hoshina
8cff6cf312 fix: improve connection handling in OneBotChannel 2026-02-14 20:25:55 +08:00
Hoshina
60c3d96b5e style: fix alignment of fields in BotStatus struct 2026-02-14 20:02:30 +08:00
Hoshina
773ce9bcb6 fix: update BotStatus type in oneBotRawEvent and adjust status checks 2026-02-14 19:58:19 +08:00
Hoshina
f7421128a0 style: remove unnecessary log messages in WebSocket listener 2026-02-14 17:46:47 +08:00
Meng Zhuo
1cb690df32
Merge pull request #169 from PixelTux/architecture-32-bit
Architecture 32 bit
2026-02-14 17:27:20 +08:00
Meng Zhuo
59c7aa1628
Merge pull request #167 from Lixeer/main
feat: add provider `deepseek`
2026-02-14 17:27:01 +08:00
Hoshina
1fcf3fde0f style: fix format 2026-02-14 17:23:18 +08:00
Meng Zhuo
b805ec8bde
Merge pull request #158 from easyzoom/feat/device-hotplug-notifications
feat: add device hotplug event notifications (USB on Linux)
2026-02-14 17:17:53 +08:00
easyzoom
378045510d feat: add device hotplug event notifications (USB on Linux) 2026-02-14 17:03:04 +08:00
karan
2720fa71c7
add I2C and SPI tools for hardware interaction (#140)
* add I2C and SPI tools for hardware interaction

- Implemented I2CTool for I2C bus interaction, including device scanning, reading, and writing.
- Implemented SPITool for SPI bus communication, supporting device listing, data transfer, and reading.
- Added platform-specific implementations for Linux and stubs for non-Linux platforms.
- Updated agent loop to register new I2C and SPI tools.
- Created documentation for hardware skills, including usage examples and pinmux setup instructions.

* Remove build constraints for Linux from I2C and SPI tool files.
2026-02-14 16:53:17 +08:00
Hoshina
7fa641a2ed feat: add OneBot channel support 2026-02-14 16:50:21 +08:00
Lixeer
18d3634f1b feat: Improve parameter fault tolerance for DeepSeek 2026-02-14 16:47:46 +08:00
Lixeer
afc3a2cda3 feat: add provider deepseek 2026-02-14 16:35:49 +08:00
PixelTux
ba0ef4b62c Merge branch 'main' into architecture-32-bit 2026-02-14 09:32:24 +01:00
moveyield
1299b20465 refactor: remove unused min func
Signed-off-by: moveyield <moveyield@outlook.com>
2026-02-14 16:24:20 +08:00
qiaoborui
da804a0748 fix(codex): include required instructions and improve account-id extraction 2026-02-14 12:48:16 +08:00
qiaoborui
7304ab7d33 fix(auth): align OpenAI OAuth authorize URL and params 2026-02-14 12:37:49 +08:00
ex-takashima
6463796fa1 fix: update tests to match upstream API changes
Fix web_test.go and config_test.go to use current function signatures
after merging upstream changes (WebSearchToolOptions, BraveConfig).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 11:32:42 +09:00
ex-takashima
ac79a23e0a style: fix gofmt formatting (CRLF -> LF)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 11:21:47 +09:00
ex-takashima
aa7a8b89c3 merge: resolve conflict with upstream main
Merge upstream changes (HeartbeatConfig addition) alongside LINEConfig.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 10:47:06 +09:00
ex-takashima
f294a71bc5 feat(channels): add LINE Official Account channel support
Add LINE Messaging API as the 9th messaging channel using HTTP Webhook.
Supports text/image/audio messages, group chat @mention detection,
reply with quote, and loading animation.

- No external SDK required (standard library only)
- HMAC-SHA256 webhook signature verification
- Reply Token (free) with Push API fallback
- Group chat: respond only when @mentioned
- Quote original message in replies using quoteToken

Closes #146

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 10:01:20 +09:00
PixelTux
2cb90f2fe6 Merge branch 'main' into architecture-32-bit 2026-02-13 21:18:34 +01:00
Avisek
45351a6a79 refactor: Trim trailing slashes from the API base URL and enhance API error messages with status codes. 2026-02-14 02:09:55 +08:00
lxowalle
1aea912fcd
Merge pull request #83 from carzygod/main
update telegram username support
2026-02-14 00:49:14 +08:00
lxowalle
bd9c9d7efc
Merge branch 'main' into main 2026-02-14 00:16:10 +08:00
Leandro Barbosa
0f5b2f67bb style: fix gofmt formatting in cooldown files
Remove extra spaces in comment alignment to pass fmt-check CI.
2026-02-13 12:26:44 -03:00
Leandro Barbosa
8a6fb7d9e3 merge: sync upstream/main into feat/multi-agent-routing
Resolve conflicts in loop.go, config.go, config_test.go,
spawn.go, and subagent.go. Integrate upstream ToolResult/AsyncTool
pattern with multi-agent routing features. Rename mockProvider
to mockRegistryProvider in registry_test.go to avoid redeclaration
with upstream's loop_test.go.
2026-02-13 12:24:26 -03:00
Leandro Barbosa
272536a11a feat: add multi-agent routing with declarative bindings
Implement per-agent workspace/model/session isolation with 7-level
priority routing cascade (peer > parent_peer > guild > team > account >
channel > default). Backward compatible - empty agents.list creates
implicit "main" agent from defaults.

Core components:
- routing/agent_id.go: ID normalization with pre-compiled regex
- routing/session_key.go: 4 DM scope modes with identity links
- routing/route.go: RouteResolver with priority-based binding matcher
- agent/instance.go: Per-agent state (workspace, sessions, tools, model)
- agent/registry.go: Agent lifecycle, route resolution, subagent ACL

Integration:
- config.go: AgentModelConfig (flexible JSON), bindings, session config
- loop.go: Complete rewrite for multi-agent dispatch
- Channel adapters: peer_kind/peer_id metadata (telegram, discord, slack)
- spawn.go: Subagent allowlist enforcement per agent

Validated end-to-end with Discord channel-based bindings, default
fallback routing, and per-agent session persistence.
2026-02-13 12:12:33 -03:00
Leandro Barbosa
6e7149509a feat: add model fallback chain with error classification
Add 2-layer fallback system (text + image) with automatic candidate
resolution. Includes error classifier (~40 patterns), per-provider
cooldown (exponential backoff), and model reference parsing.

- FailoverError/FailoverReason types for structured error handling
- ErrorClassifier with rate_limit, billing, auth, timeout patterns
- FallbackChain with cooldown management and candidate rotation
- ModelRef parser for provider/model string format
- 128 tests, 95%+ coverage
2026-02-13 12:12:12 -03:00
Meng Zhuo
82a9a80d94
Merge pull request #130 from MHCP000/fix/codeblock-index-bug
fix: correct index bug in extractCodeBlocks and extractInlineCodes
2026-02-13 22:52:42 +08:00
lxowalle
878650c459 * fix: heartbeat/service_test.go test failed 2026-02-13 22:19:18 +08:00
lxowalle
bc27707671
Merge branch 'main' into main 2026-02-13 22:08:20 +08:00
zeo
1e17bac9f0 fix: correct index bug in extractCodeBlocks and extractInlineCodes
The previous implementation used len(codes)-1 in ReplaceAllStringFunc,
which caused all placeholders to point to the same (last) index.
This resulted in only the last code block being displayed correctly
when multiple code blocks were present in a message.

Now using a proper counter variable that increments for each match,
ensuring each code block gets a unique placeholder index.
2026-02-13 21:38:14 +08:00
Satyam Tiwari
c86e121688 refactor: update tool registry usage and enhance WebSearchTool execution result handling 2026-02-13 15:41:37 +05:30
Satyam Tiwari
e0a766243e Merge branch 'main' of https://github.com/sipeed/picoclaw 2026-02-13 15:36:43 +05:30
Meng Zhuo
584a3dcc87 misc: fmt code 2026-02-13 17:51:47 +08:00