Xubin Ren
1dd2d5486e
docs: add unified session configuration to README for cross-channel continuity
2026-04-09 03:15:21 +00:00
Xubin Ren and Xubin Ren
cf02408fc0
Merge origin/main; remove stale comment and fix blank-line style
...
Made-with: Cursor
2026-04-09 11:09:25 +08:00
Xubin Ren and Xubin Ren
61dd5ac13a
test(discord): cover streamed reply overflow
...
Lock the Discord streaming path with a regression test for final chunk splitting so oversized replies stay safe to merge and ship.
Made-with: Cursor
2026-04-09 00:24:11 +08:00
Xubin Ren and Xubin Ren
715f2a79be
fix(version): fall back to pyproject in source checkouts
...
Keep importlib.metadata as the primary source for installed packages, but avoid PackageNotFoundError when nanobot is imported directly from a source tree.
Made-with: Cursor
2026-04-08 23:47:36 +08:00
Xubin Ren and Xubin Ren
6bf101c79b
fix(hook): keep composite hooks backward compatible
...
Avoid AttributeError regressions when hooks define their own __init__ or when a CompositeHook wraps another composite.
Made-with: Cursor
2026-04-08 23:41:31 +08:00
Xubin Ren and Xubin Ren
142cb46956
fix(cron): preserve manual run state and merged history
...
Keep manual runs from flipping the scheduler's running flag, rebuild merged run history records from action logs, and avoid delaying sub-second jobs to a one-second floor. Add regression coverage for disabled/manual runs, merged history persistence, and sub-second timers.
Made-with: Cursor
2026-04-08 23:34:47 +08:00
Xubin Ren
d084d10dc2
feat(openai): auto-route direct reasoning requests with responses fallback
2026-04-08 15:21:08 +00:00
Xubin Ren and Xubin Ren
c092896922
fix(tool-hint): handle quoted paths in exec hints
...
Preserve path folding for quoted exec command paths with spaces so hint previews do not fall back to mid-path truncation. Add regression coverage for quoted Unix and Windows path cases.
Made-with: Cursor
2026-04-08 23:05:52 +08:00
Xubin Ren and Xubin Ren
c7d10de253
feat(soul): restore friendly and curious tone to SOUL.md
...
Made-with: Cursor
2026-04-08 02:22:25 +08:00
Xubin Ren and Xubin Ren
edb821e10d
feat(agent): prompt behavior directives, tool descriptions, and loop robustness
2026-04-08 02:22:25 +08:00
Xubin Ren and Xubin Ren
ef0284a4e0
fix(exec): add Windows support for shell command execution
...
ExecTool hardcoded bash, breaking exec on Windows. Now uses cmd.exe
via COMSPEC on Windows with a curated minimal env (PATH, SYSTEMROOT,
etc.) that excludes secrets. bwrap sandbox gracefully skips on Windows.
2026-04-08 01:48:55 +08:00
Xubin Ren and Xubin Ren
63acfc4f2f
test: fix trailing-space mismatch and add regression tests for normal models
...
- Fix assertion in streaming dict fallback test (trailing space in data
not reflected in expected value).
- Add two regression tests proving that models with reasoning_content
(e.g. DeepSeek-R1) and standard models (no reasoning fields) are
completely unaffected by the reasoning fallback.
Made-with: Cursor
2026-04-08 00:59:39 +08:00
Xubin Ren and Xubin Ren
c736cecc28
chore(gitignore): remove bogus extensions and relocate nano.*.save
...
- Drop *.pycs, *.pywz, *.pyzz — not real Python file extensions.
- Move nano.*.save from "Project-specific" to "Editors & IDEs" where
it belongs (nano editor backup files, not project artifacts).
Made-with: Cursor
2026-04-08 00:42:25 +08:00
Xubin Ren and Xubin Ren
8871a57b4c
fix(mcp): forward prompt arg descriptions & standardise error format
...
- Propagate `description` from MCP prompt arguments into the JSON
Schema so LLMs can better understand prompt parameters.
- Align generic-exception error message with tool/resource wrappers
(drop redundant `{exc}` detail).
- Extend test fixture to mock `mcp.shared.exceptions.McpError`.
- Add tests for argument description forwarding and McpError handling.
Made-with: Cursor
2026-04-08 00:28:04 +08:00
Xubin Ren and Xubin Ren
ce7986e492
fix(memory): add timestamp and cap to recent history injection
2026-04-08 00:03:11 +08:00
Xubin Ren and Xubin Ren
05d8062c70
test: add regression tests for unprocessed history injection in system prompt
...
Made-with: Cursor
2026-04-07 23:41:05 +08:00
Xubin Ren and Xubin Ren
acafcf3cb0
docs: fix inaccurate claim about supports_streaming and dict config
...
supports_streaming already handles dict configs via isinstance check;
only is_allowed() fails with plain dicts. Narrow the explanation.
Made-with: Cursor
2026-04-07 23:01:30 +08:00
Xubin Ren and Xubin Ren
1e8a6663ca
test(anthropic): add regression tests for thinking modes incl. adaptive
...
Also update schema comment to mention 'adaptive' as a valid value.
Made-with: Cursor
2026-04-07 22:53:43 +08:00
423aab09dd
test(cron): add regression test for running service picking up external adds
...
Co-authored-by: chengyongru
Made-with: Cursor
2026-04-07 22:48:40 +08:00
Xubin Ren and Xubin Ren
82dec12f66
refactor: extract tool hint formatting to utils/tool_hints.py
...
- Move _tool_hint implementation from loop.py to nanobot/utils/tool_hints.py
- Keep thin delegation in AgentLoop._tool_hint for backward compat
- Update test imports to test format_tool_hints directly
Made-with: Cursor
2026-04-07 15:15:07 +08:00
Xubin Ren and Xubin Ren
02597c3ec9
fix(runner): silent retry on empty response before finalization
2026-04-07 15:03:41 +08:00
Xubin Ren and Xubin Ren
0355f20919
test: add regression tests for _resolve_mentions
...
7 tests covering: single mention, dual IDs, no-id skip, multiple mentions,
no mentions, empty text, and key-not-in-text edge case.
Made-with: Cursor
2026-04-07 14:03:55 +08:00
Xubin Ren and Xubin Ren
075bdd5c3c
refactor: move SafeFileHistory to module level + add regression tests
...
- Promote _SafeFileHistory to module-level SafeFileHistory for testability
- Add 5 regression tests: surrogates, normal text, emoji, mixed CJK, multi-surrogates
Made-with: Cursor
2026-04-07 13:57:34 +08:00
Xubin Ren
bf459c7887
fix(docker): fix volume mount path and add permission error guidance
2026-04-06 13:15:40 +00:00
Xubin Ren
4dac0a8930
docs: update nanobot docs badge
2026-04-06 11:55:47 +00:00
Xubin Ren
a30e84bfd1
docs: update v0.1.5 release news
2026-04-06 11:46:16 +00:00
Xubin Ren
6269876bc7
docs: update v0.1.5 release news
2026-04-06 11:45:37 +00:00
Xubin Ren
bc2253c83f
docs: update v0.1.5 release news
2026-04-06 11:45:08 +00:00
Xubin Ren
b719da7400
fix(feishu): use RawRequest for bot info API
2026-04-06 11:39:23 +00:00
Xubin Ren
79234d237e
chore: bump version to 0.1.5
2026-04-06 11:26:07 +00:00
Xubin Ren
1243c08745
docs: update news section
2026-04-06 11:22:20 +00:00
Xubin Ren and Xubin Ren
dad9c07843
fix(tests): update Tavily usage tests to match actual API response shape
...
The _parse_tavily_usage implementation was updated to use the real
{account: {plan_usage, plan_limit, ...}} structure, but the tests
still used the old flat {used, limit, breakdown} format.
Made-with: Cursor
2026-04-06 19:17:55 +08:00
Xubin Ren
35f53a721d
refactor: consolidate _parse_retry_after_headers into base class
...
Merge the three retry-after header parsers (base, OpenAI, Anthropic)
into a single _extract_retry_after_from_headers on LLMProvider that
handles retry-after-ms, case-insensitive lookup, and HTTP date.
Remove the per-provider _parse_retry_after_headers duplicates and
their now-unused email.utils / time imports. Add test for retry-after-ms.
Made-with: Cursor
2026-04-06 08:44:52 +00:00
Xubin Ren
aeba9a23e6
refactor: remove dead _error_response wrapper in Anthropic provider
...
Fold _error_response back into _handle_error to match OpenAI/Azure
convention. Update all call sites and tests accordingly.
Made-with: Cursor
2026-04-06 08:35:02 +00:00
Xubin Ren
b575aed20e
Merge origin/main into fix/structured-retry-classification-main
...
Made-with: Cursor
2026-04-06 08:28:20 +00:00
Xubin Ren and Xubin Ren
d108879b48
security: bind api port to localhost by default
...
Prevents accidental exposure to the public internet. Users who need
external access can change to 0.0.0.0:8900:8900 explicitly.
Made-with: Cursor
2026-04-06 16:20:20 +08:00
Xubin Ren and Xubin Ren
634261f07a
fix: correct api-workspace path for non-root container user
...
The Dockerfile runs as user nanobot (HOME=/home/nanobot), not root.
Made-with: Cursor
2026-04-06 16:20:20 +08:00
Xubin Ren and Xubin Ren
ebf29d87ae
fix: include byteplus providers, guard None reasoning_effort, merge extra_body
...
- Add byteplus and byteplus_coding_plan to thinking param providers
- Only send extra_body when reasoning_effort is explicitly set
- Use setdefault().update() to avoid clobbering existing extra_body
- Add 7 regression tests for thinking params
Made-with: Cursor
2026-04-06 16:12:08 +08:00
Xubin Ren and Xubin Ren
c0e161de23
docs: add attachment example to email config JSON
...
Made-with: Cursor
2026-04-06 15:09:44 +08:00
Xubin Ren and Xubin Ren
b98a0aabfc
style: fix stdlib import ordering in email.py
...
Made-with: Cursor
2026-04-06 15:09:44 +08:00
Xubin Ren
bdec2637ae
test: add regression test for oversized stream-end splitting
...
Made-with: Cursor
2026-04-06 06:39:23 +00:00
Xubin Ren
09ec9991e1
Merge remote-tracking branch 'origin/main' into pr-2520
...
Made-with: Cursor
# Conflicts:
# nanobot/channels/telegram.py
2026-04-06 06:37:54 +00:00
Xubin Ren
c9d4b7b905
Merge remote-tracking branch 'origin/main' into pr-2449
...
Made-with: Cursor
# Conflicts:
# nanobot/utils/evaluator.py
2026-04-06 06:30:11 +00:00
Xubin Ren
897d5a7e58
test: add regression tests for JID suffix classification and LID cache
...
Made-with: Cursor
2026-04-06 06:19:06 +00:00
Xubin Ren
722ffe0654
Merge remote-tracking branch 'origin/main' into pr-2531
...
Made-with: Cursor
# Conflicts:
# nanobot/channels/whatsapp.py
2026-04-06 06:17:56 +00:00
Xubin Ren
019eaff225
simplify: remove transcription fallback, respect explicit config
...
Configured provider is the only one used — no silent fallback.
Made-with: Cursor
2026-04-06 06:13:43 +00:00
Xubin Ren
3bf1fa5225
feat: auto-fallback to other transcription provider on failure
...
When the primary transcription provider fails (bad key, API error, etc.),
automatically try the other provider if its API key is available.
Made-with: Cursor
2026-04-06 06:10:08 +00:00
Xubin Ren
35dde8a30e
refactor: unify voice transcription config across all channels
...
- Move transcriptionProvider to global channels config (not per-channel)
- ChannelManager auto-resolves API key from matching provider config
- BaseChannel gets transcription_provider attribute, no more getattr hack
- Remove redundant transcription fields from WhatsAppConfig
- Update README: document transcriptionProvider, update provider table
Made-with: Cursor
2026-04-06 06:07:30 +00:00
Xubin Ren
7b7a3e5748
fix: media_paths NameError, import order, add error logging and tests
...
- Move media_paths assignment before voice message handling to prevent
NameError at runtime
- Fix broken import layout in transcription.py (httpx/loguru after class)
- Add error logging to OpenAITranscriptionProvider matching Groq style
- Add regression tests for voice transcription and no-media fallback
Made-with: Cursor
2026-04-06 06:01:14 +00:00
Xubin Ren
413740f585
Merge remote-tracking branch 'origin/main' into pr-2530
...
Made-with: Cursor
# Conflicts:
# nanobot/channels/whatsapp.py
2026-04-06 05:59:31 +00:00
Xubin Ren and Xubin Ren
71061a0c82
fix: return on login failure, use loguru format strings, fix import order
...
- Add missing return after failed password login to prevent starting
sync loop with no credentials
- Replace f-strings in logger calls with loguru {} placeholders
- Fix stdlib import order (asyncio before json)
Made-with: Cursor
2026-04-06 13:57:57 +08:00
Xubin Ren and Xubin Ren
f82b5a1b02
fix: graceful fallback when langfuse is not installed
...
- Use import importlib.util (not bare importlib) for find_spec
- Warn and fall back to standard openai instead of crashing with
ImportError when LANGFUSE_SECRET_KEY is set but langfuse is missing
Made-with: Cursor
2026-04-06 13:53:42 +08:00
Xubin Ren and Xubin Ren
c88d97c652
fix: fall back to heuristic when bot open_id fetch fails
...
If _fetch_bot_open_id returns None the exact-match path would silently
disable all @mention detection. Restore the old heuristic as a fallback.
Add 6 unit tests for _is_bot_mentioned covering both paths.
Made-with: Cursor
2026-04-06 13:49:38 +08:00
Xubin Ren and Xubin Ren
424b9fc262
refactor: extract _kill_process helper to DRY timeout/cancel cleanup
...
Made-with: Cursor
2026-04-06 13:47:09 +08:00
Xubin Ren and Xubin Ren
7ffd93f48d
refactor: move search_usage to utils/searchusage, remove brave stub
...
- Rename agent/tools/search_usage.py → utils/searchusage.py
(not an LLM tool, matches utils/ naming convention)
- Remove redundant _fetch_brave_usage — handled by else branch
- Move test to tests/utils/test_searchusage.py
Made-with: Cursor
2026-04-06 13:37:55 +08:00
Xubin Ren and Xubin Ren
28e0a76b80
fix: path_append must not clobber login shell PATH
...
Seeding PATH in the env before bash -l caused /etc/profile
to skip its default PATH setup, breaking standard commands.
Move path_append to an inline export so the login shell
establishes a proper base PATH first.
Add regression test: ls still works when path_append is set.
Made-with: Cursor
2026-04-06 13:20:53 +08:00
Xubin Ren
84b1c6a0d7
docs: update nanobot features
2026-04-05 20:07:11 +00:00
Xubin Ren
3c28d1e651
docs: rename Assistant to Agent across README
2026-04-05 20:06:38 +00:00
Xubin Ren
861072519a
chore: remove codespell CI workflow and config, keep typo fixes only
...
Made-with: Cursor
2026-04-05 19:59:49 +00:00
Xubin Ren
70bdf4a9f5
Merge origin/main into enh-codespell (resolve pyproject.toml conflict)
...
Made-with: Cursor
2026-04-05 19:57:50 +00:00
Xubin Ren
9823130432
docs: clarify bwrap sandbox is Linux-only
2026-04-05 19:28:46 +00:00
Xubin Ren
9f96be6e9b
fix(sandbox): mount media directory read-only inside bwrap sandbox
2026-04-05 19:08:38 +00:00
Xubin Ren
cef0f3f988
refactor: replace podman-seccomp.json with minimal cap_add, harden bwrap, add sandbox tests
2026-04-05 19:03:06 +00:00
Xubin Ren
a8707ca8f6
Merge origin/main into feat/best_skill_and_hook (resolve 4 conflicts)
...
Made-with: Cursor
2026-04-05 18:53:17 +00:00
Xubin Ren and Xubin Ren
bb9da29eff
test: add regression tests for private DM thread session key derivation
...
Made-with: Cursor
2026-04-06 02:44:21 +08:00
Xubin Ren and Xubin Ren
4b4d8b506d
test: add regression test for DuckDuckGo asyncio.wait_for timeout guard
...
Made-with: Cursor
2026-04-06 02:21:51 +08:00
Xubin Ren and Xubin Ren
90caf5ce51
test: remove duplicate test_jina_422_falls_back_to_duckduckgo
...
The same test function name appeared twice; Python silently shadows the
first definition so it never ran. Keep the version that also asserts
the request URL contains "s.jina.ai".
Made-with: Cursor
2026-04-06 02:06:00 +08:00
Xubin Ren
acf652358c
feat(dream): non-blocking /dream with progress feedback
2026-04-05 15:48:00 +00:00
Xubin Ren
33bef8d508
Merge remote-tracking branch 'origin/main' into feat/search-tools
...
Made-with: Cursor
2026-04-04 14:37:59 +00:00
Xubin Ren and Xubin Ren
f4983329c6
fix(docker): preserve both github ssh rewrite rules for npm install
2026-04-04 22:33:46 +08:00
Xubin Ren
1c1eee523d
fix: secure whatsapp bridge with automatic local auth token
2026-04-04 14:16:46 +00:00
Xubin Ren
77a88446fb
Merge remote-tracking branch 'origin/main' into pr-2722
2026-04-04 13:51:59 +00:00
Xubin Ren and Xubin Ren
17d9d74ccc
fix(provider): omit temperature for GPT-5 models
2026-04-04 20:18:22 +08:00
Xubin Ren and Xubin Ren
11c84f21a6
test(session): preserve reasoning_content in session history
2026-04-04 20:08:44 +08:00
Xubin Ren and Xubin Ren
05fe7d4fb1
fix(tools): isolate decorated tool schemas and add regression tests
2026-04-04 19:58:44 +08:00
Xubin Ren and Xubin Ren
9ef5b1e145
fix: reset ssrf whitelist on config reload and document config refresh
2026-04-04 19:43:18 +08:00
Xubin Ren
c3b4ebae53
refactor(agent): move internal prompts into packaged templates
2026-04-04 11:09:37 +00:00
Xubin Ren
7b852506ff
fix(telegram): register Dream menu commands with Telegram-safe aliases
...
Use dream_log and dream_restore in Telegram's bot command menu so command registration succeeds, while still accepting the original dream-log and dream-restore forms in chat. Keep the internal command routing unchanged and add coverage for the alias normalization path.
2026-04-04 10:31:26 +00:00
Xubin Ren
549e5ea8e2
fix(telegram): shorten polling network errors
2026-04-04 10:26:58 +00:00
Xubin Ren
04419326ad
fix(memory): migrate legacy HISTORY.md even when history.jsonl is empty
2026-04-04 10:11:53 +00:00
Xubin Ren
0a3a60a7a4
refactor(memory): simplify Dream config naming and rename gitstore module
2026-04-04 10:01:45 +00:00
Xubin Ren
a166fe8fc2
docs: clarify memory design and source-vs-release features
2026-04-04 09:34:37 +00:00
Xubin Ren
408a61b0e1
feat(memory): protect Dream cron and polish migration UX
2026-04-04 09:01:42 +00:00
Xubin Ren
6e896249c8
feat(memory): harden legacy history migration and Dream UX
2026-04-04 08:41:46 +00:00
Xubin Ren
7e0c196797
fix(memory): repair Dream follow-up paths and move GitStore to utils
...
Made-with: Cursor
2026-04-04 04:49:42 +00:00
Xubin Ren
30ea048f19
Merge remote-tracking branch 'origin/main' into pr-2717-review
2026-04-04 04:42:52 +00:00
Xubin Ren and Xubin Ren
7229a81594
fix(providers): disable Azure SDK retries by default
...
Made-with: Cursor
2026-04-04 12:36:45 +08:00
Xubin Ren
91a9b7db24
Merge origin/main into fix/retry-after-robust
...
Made-with: Cursor
2026-04-03 19:07:30 +00:00
Xubin Ren and Xubin Ren
9840270f7f
test(tools): cover media dir access under workspace restriction
...
Made-with: Cursor
2026-04-04 03:03:58 +08:00
Xubin Ren
ca3b918cf0
docs: clarify retry behavior and web search defaults
2026-04-03 18:57:44 +00:00
Xubin Ren
400f8eb38e
docs: update web search configuration information
2026-04-03 18:44:46 +00:00
Xubin Ren
652377bee9
Merge origin/main into feat/web-disable-flag
...
Made-with: Cursor
2026-04-03 18:41:43 +00:00
Xubin Ren
f409337fcf
Merge remote-tracking branch 'origin/main' into pr-2646
2026-04-03 17:53:52 +00:00
Xubin Ren
cb84f2b908
docs: update nanobot news section
2026-04-03 16:18:36 +00:00
Xubin Ren
3c3a72ef82
update .gitignore
2026-04-03 16:02:23 +00:00
Xubin Ren
15cc9b23b4
feat(agent): add built-in grep and glob search tools
2026-04-02 15:37:57 +00:00
Xubin Ren
e4b335ce81
refactor: extract runtime response guards into utils runtime module
2026-04-02 13:54:40 +00:00
Xubin Ren
714a4c7bb6
fix(runtime): address review feedback on retry and cleanup
2026-04-02 10:57:12 +00:00
Xubin Ren
eefd7e60f2
Merge remote-tracking branch 'origin/main' into feat/runtime-hardening
2026-04-02 10:40:49 +00:00
Xubin Ren and Xubin Ren
3558fe4933
fix(cli): honor custom config path in channel commands
2026-04-02 18:37:46 +08:00