1397 Commits

Author SHA1 Message Date
Hua
e9b8bee78f Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m18s
Test Suite / test (3.12) (push) Failing after 2m25s
Test Suite / test (3.13) (push) Failing after 1m54s
2026-03-20 15:51:26 +08:00
Xubin Ren
c138b2375b docs: refine spawn workspace guidance wording
Adjust the spawn tool description to keep the workspace-organizing hint while
avoiding language that sounds like the system automatically assigns a dedicated
working directory for subagents.

Made-with: Cursor
2026-03-20 13:30:21 +08:00
JilunSun7274
e5179aa7db delete redundant whitespaces in subagent prompts 2026-03-20 13:30:21 +08:00
JilunSun7274
517de6b731 docs: add subagent workspace assignment hint to spawn tool description 2026-03-20 13:30:21 +08:00
mamamiyear
d70ed0d97a fix: nanobot onboard update config crash
when use onboard and choose N,
maybe sometimes will be crash and
config file will be invalid.
2026-03-20 13:16:56 +08:00
Rupert Rebentisch
0b1beb0e9f Fix TypeError for MCP tools with nullable JSON Schema params
MCP servers (e.g. Zapier) return JSON Schema union types like
`"type": ["string", "null"]` for nullable parameters. The existing
`validate_params()` and `cast_params()` methods expected only simple
strings as `type`, causing `TypeError: unhashable type: 'list'` on
every MCP tool call with nullable parameters.

Add `_resolve_type()` helper that extracts the first non-null type
from union types, and use it in `_cast_value()` and `_validate()`.
Also handle `None` values correctly when the schema declares a
nullable type.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 13:13:11 +08:00
Hua
0274ee5c95 fix(session): avoid blocking large chat cleanup
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m7s
Test Suite / test (3.12) (push) Failing after 1m23s
Test Suite / test (3.13) (push) Failing after 1m9s
2026-03-20 12:47:52 +08:00
Hua
f34462c076 fix(qq): allow file_data uploads without media url 2026-03-20 11:33:47 +08:00
Hua
9ac73f1e26 refactor(delivery): use workspace out as artifact root
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m24s
Test Suite / test (3.12) (push) Failing after 1m46s
Test Suite / test (3.13) (push) Failing after 2m1s
2026-03-20 09:10:33 +08:00
Hua
73af8c574e feat(qq): prefer file_data for local uploads
Some checks failed
Test Suite / test (3.12) (push) Has been cancelled
Test Suite / test (3.13) (push) Has been cancelled
Test Suite / test (3.11) (push) Has been cancelled
2026-03-20 08:39:14 +08:00
Hua
e910769a9e fix(agent): guide generated media into workspace out
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m4s
Test Suite / test (3.12) (push) Failing after 1m8s
Test Suite / test (3.13) (push) Failing after 1m2s
2026-03-19 17:01:10 +08:00
Hua
0859d5c9f6 Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m3s
Test Suite / test (3.12) (push) Failing after 1m5s
Test Suite / test (3.13) (push) Failing after 1m2s
# Conflicts:
#	nanobot/channels/telegram.py
2026-03-19 16:47:40 +08:00
Hua
395fdc16f9 feat(qq): serve public media via gateway 2026-03-19 16:27:29 +08:00
Xubin Ren
dd7e3e499f fix: separate Telegram connection pools and add timeout retry to prevent pool exhaustion
The root cause of "Pool timeout" errors is that long-polling (getUpdates)
and outbound API calls (send_message, send_photo, etc.) shared the same
HTTPXRequest pool — polling holds connections indefinitely, starving sends
under concurrent load (e.g. cron jobs + user chat).

- Split into two independent pools: API calls (default 32) and polling (4)
- Expose connection_pool_size / pool_timeout in TelegramConfig for tuning
- Add _call_with_retry() with exponential backoff (3 attempts) on TimedOut
- Apply retry to _send_text and remote media URL sends
2026-03-19 16:15:41 +08:00
Hua
fd52973751 feat(config): hot reload agent runtime settings
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m7s
Test Suite / test (3.12) (push) Failing after 1m3s
Test Suite / test (3.13) (push) Failing after 1m14s
2026-03-19 14:01:18 +08:00
mamamiyear
d9cb729596 feat: support feishu code block 2026-03-19 13:59:31 +08:00
Hua
cfcfb35f81 feat(mcp): add slash command listing 2026-03-19 13:10:07 +08:00
Hua
49fbd5c15c Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m8s
Test Suite / test (3.12) (push) Failing after 1m8s
Test Suite / test (3.13) (push) Failing after 1m7s
# Conflicts:
#	README.md
#	nanobot/agent/context.py
#	nanobot/agent/loop.py
#	nanobot/channels/telegram.py
2026-03-19 00:42:43 +08:00
Xubin Ren
214bf66a29 docs(readme): clarify nanobot is unrelated to crypto 2026-03-18 15:18:38 +00:00
Xubin Ren
4b052287cb fix(telegram): validate remote media URLs 2026-03-18 23:12:11 +08:00
h4nz4
a7bd0f2957 feat(telegram): support HTTP(S) URLs for media in TelegramChannel
Fixes #1792
2026-03-18 23:12:11 +08:00
Xubin Ren
728d4e88a9 fix(providers): lazy-load provider exports 2026-03-18 22:01:29 +08:00
Javis486
28127d5210 When using custom_provider, a prompt "LiteLLM:WARNING" will still appear during conversation 2026-03-18 22:01:29 +08:00
Xubin Ren
4e40f0aa03 docs: MiniMax gifts to the nanobot community 2026-03-18 05:09:03 +00:00
vivganes
e6910becb6 logo: transparent background
Also useful when we build the gateway.  Dark and bright modes can use the same logo.
2026-03-18 12:41:38 +08:00
Xubin Ren
5bd1c9ab8f fix(cron): preserve exact intervals in list output 2026-03-18 12:39:06 +08:00
PJ Hoberman
12aa7d7aca test(cron): add unit tests for _format_timing and _format_state helpers
Tests the helpers directly without needing CronService, covering all
schedule kinds, edge cases (missing fields, unknown status), and
combined state output.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
PJ Hoberman
8d45fedce7 refactor(cron): extract _format_timing and _format_state helpers
Addresses review feedback: moves schedule formatting and state
formatting into dedicated static methods, removes duplicate
in-loop imports, and simplifies _list_jobs() to a clean loop.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
PJ Hoberman
228e1bb3de style: apply ruff format to cron tool
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
PJ Hoberman
5d8c5d2d25 style(test): fix import sorting and remove unused imports
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
PJ Hoberman
787e667dc9 test(cron): add tests for _list_jobs() schedule and state formatting
Covers all three schedule kinds (cron/every/at), human-readable interval
formatting, run state display (last run, status, errors, next run),
and disabled job filtering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
PJ Hoberman
eb83778f50 fix(cron): show schedule details and run state in _list_jobs() output
_list_jobs() only displayed job name, id, and schedule kind (e.g. "cron"),
omitting the actual timing and run state. The agent couldn't answer
"when does this run?" or "did it run?" even though CronSchedule and
CronJobState had all the data.

Now surfaces:
- Cron expression + timezone for cron jobs
- Human-readable interval for every jobs
- ISO timestamp for one-shot at jobs
- Enabled/disabled status
- Last run time + status (ok/error/skipped) + error message
- Next scheduled run time

Fixes #1496

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 12:39:06 +08:00
zhangxiaoyu.york
f72ceb7a3c fix:set subagent result message role = assistant 2026-03-18 00:43:46 +08:00
angleyanalbedo
20e3eb8fce docs(readme): fix broken link to Channel Plugin Guide 2026-03-17 23:09:35 +08:00
Xubin Ren
8cf11a0291 fix: preserve image paths in fallback and session history 2026-03-17 22:37:09 +08:00
Hua
61dcdffbbe Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m7s
Test Suite / test (3.12) (push) Failing after 1m5s
Test Suite / test (3.13) (push) Failing after 1m7s
# Conflicts:
#	nanobot/channels/slack.py
#	nanobot/config/schema.py
#	tests/test_feishu_reply.py
2026-03-17 21:13:12 +08:00
Xubin Ren
7086f57d05 test(feishu): cover media msg_type mapping 2026-03-17 17:05:13 +08:00
weipeng0098
47e2a1e8d7 fix(feishu): use correct msg_type for audio/video files 2026-03-17 17:05:13 +08:00
Xubin Ren
41d59c3b89 test(feishu): cover heading and table markdown rendering 2026-03-17 16:51:02 +08:00
Your Name
9afbf386c4 fix(feishu): fix markdown rendering issues in headings and tables
- Fix double bold markers (****) when heading text already contains **
- Strip markdown formatting (**bold**, *italic*, ~~strike~~) from table cells
  since Feishu table elements do not support markdown rendering

Fixes rendering issues where:
1. Headings like '**text**' were rendered as '****text****'
2. Table cells with '**bold**' showed raw markdown instead of plain text
2026-03-17 16:51:02 +08:00
Xubin Ren
91ca82035a feat(slack): add default done reaction on completion 2026-03-17 16:19:08 +08:00
Sihyeon Jang
8aebe20cac feat(slack): update reaction emoji on task completion
Remove the in-progress reaction (reactEmoji) and optionally add a
done reaction (doneEmoji) when the final response is sent, so users
get visual feedback that processing has finished.

Signed-off-by: Sihyeon Jang <sihyeon.jang@navercorp.com>
2026-03-17 16:19:08 +08:00
Hua
0126061d53 docs(skill): sync README and AGENTS guidance
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m23s
Test Suite / test (3.12) (push) Failing after 1m4s
Test Suite / test (3.13) (push) Failing after 1m4s
2026-03-17 16:00:59 +08:00
Hua
59b9b54cbc fix(skill): improve clawhub command handling 2026-03-17 15:55:41 +08:00
Hua
d31d6cdbe6 refactor(channels): formalize default config onboarding
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m32s
Test Suite / test (3.12) (push) Failing after 1m19s
Test Suite / test (3.13) (push) Failing after 1m27s
2026-03-17 15:12:15 +08:00
Hua
bae0332af3 fix: uv.lock update
Some checks failed
Test Suite / test (3.11) (push) Failing after 59s
Test Suite / test (3.12) (push) Failing after 57s
Test Suite / test (3.13) (push) Failing after 1m0s
2026-03-17 15:00:25 +08:00
Hua
06ee68d871 Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 1m2s
Test Suite / test (3.12) (push) Failing after 1m1s
Test Suite / test (3.13) (push) Failing after 59s
2026-03-17 14:47:40 +08:00
Hua
0613b2879f Merge remote-tracking branch 'origin/main'
Some checks failed
Test Suite / test (3.11) (push) Failing after 59s
Test Suite / test (3.12) (push) Failing after 59s
Test Suite / test (3.13) (push) Failing after 58s
# Conflicts:
#	tests/test_commands.py
2026-03-17 14:30:00 +08:00
Xubin Ren
49fc50b1e6 test(custom): cover empty choices response handling 2026-03-17 14:24:55 +08:00
Jiajun Xie
2eb0c283e9 fix(providers): handle empty choices in custom provider response 2026-03-17 14:24:55 +08:00