Commit Graph
3506 Commits
Author SHA1 Message Date
Ho1yShifandXubin Ren 63895fc101 fix: update Deploy to Render link in README
Changed the repository link for the one-click Deploy to Render button in the README.md file to point to the correct GitHub repository.
2026-07-18 17:39:59 +08:00
770d89b430 feat: add one-click Deploy to Render support
Adds a Render Blueprint (render.yaml) and supporting pieces so nanobot can
be deployed to Render in one click, with persistent memory across deploys.

- render.yaml: web service + 1GB persistent disk mounted at
  /home/nanobot/.nanobot. Prompts for ANTHROPIC_API_KEY and
  NANOBOT_WEB_TOKEN at deploy time (sync: false).
- render-config.json: committed gateway config that wires secrets via
  ${VAR} placeholders (resolved at runtime). Nothing secret is committed.
- entrypoint.sh: adds a branch gated on RENDER=true that copies the config
  onto the mounted disk, chowns the root-owned mount, and drops to the
  non-root nanobot user via setpriv. Local (non-Render) path is unchanged.
- Dockerfile: COPY render-config.json; USER nanobot -> USER root so the
  entrypoint can chown the freshly-mounted disk before dropping privileges;
  add PYTHONUNBUFFERED/PYTHONFAULTHANDLER for diagnosable crash output.
- README.md: Deploy to Render button + section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 17:39:59 +08:00
santhrealandXubin Ren afed32b013 fix(cron): dual-case keys when loading jobs.json
jobs.json hand-edits and asdict-style snake_case for schedule intervals and
runHistory crashed or silently disabled cron. Deserialize via Cron* from_store_dict
and shared get_camel_snake (also used by local triggers).
2026-07-18 17:39:06 +08:00
bingqilinweimaotaiandXubin Ren 8c68c6fe1e feat: support Kimi K3 2026-07-18 17:38:32 +08:00
Yuxin LouandXubin Ren b76d54aae1 Harden default Docker Compose security 2026-07-18 17:37:41 +08:00
KDBandXubin Ren d35f99abfc fix(session): bound the in-memory session cache
Keep only 128 recently used sessions strongly cached while retaining weak references to evicted sessions still owned by active callers. This bounds idle memory growth without allowing duplicate live Session objects or skipping shutdown flushes.

Add LRU, lifecycle, SDK, and flush regression coverage.

Refs #4786
2026-07-18 17:37:07 +08:00
adabarbulescuandXubin Ren d4f5abe004 fix: preserve real cancellation in MCP paths 2026-07-18 17:36:35 +08:00
yu-xin-candXubin Ren 07ad0bafa8 test(exec): relax wait-for timing on Windows 2026-07-18 17:35:56 +08:00
yu-xin-candXubin Ren 995cc44e89 fix(exec): isolate exec session managers 2026-07-18 17:35:56 +08:00
santhrealandXubin Ren 7ac9a46978 fix(utils): avoid hang in split_message when max_len <= 0
When max_len is 0 or negative the cut pointer never advances, so the loop hangs. Return the content unsplit, matching truncate_text_to_tokens for non-positive budgets.
2026-07-18 17:24:12 +08:00
santhrealandXubin Ren fe0e65928d fix(utils): coerce Tavily usage counters to int
JSON APIs sometimes return numeric fields as strings; subtracting them raised TypeError and /status dropped the usage block.
2026-07-18 17:23:26 +08:00
santhrealandXubin Ren 85097aa143 fix(utils): handle empty commit messages in CommitInfo.format
Empty git commit messages made splitlines()[0] raise IndexError in format() and /dream-restore list rendering.
2026-07-18 17:22:16 +08:00
Peter Dave Helloandchengyongru 6de5a0c5ca Improve zh-TW Traditional Chinese locale 2026-07-18 00:59:05 +08:00
bingqilinweimaotaiandchengyongru 8a48af7c74 fix(providers): omit Kimi K2.5/K2.6 temperature 2026-07-17 22:39:33 +08:00
Xubin Ren b4adb29c2b feat(webui): support native folder picker bridges 2026-07-17 12:26:03 +08:00
Xubin Ren 6519737860 docs(readme): reflect community maintenance 2026-07-16 13:52:12 +08:00
chengyongruandchengyongru d4e0294734 fix(gateway): stop channels before draining tasks 2026-07-15 22:25:08 +08:00
chengyongruandchengyongru 681edfa6f3 fix(providers): honor Codex proxy config consistently 2026-07-15 20:01:48 +08:00
chengyongruandGitHub ba86dccc8d fix(webui): correct activity timer duration (#4649) 2026-07-15 16:46:05 +08:00
chengyongruandGitHub 5ed28a6744 fix(webui): validate inferred file paths before preview (#4935) 2026-07-15 10:45:40 +08:00
chengyongruandGitHub aa70aa48f9 fix(cli): point onboarding to the WebUI launcher (#4938) 2026-07-15 10:34:46 +08:00
chengyongruandchengyongru 0fd4d0ab29 fix(prompts): handle undecodable overrides 2026-07-15 01:19:48 +08:00
chengyongruandchengyongru c1fd76add3 refactor(prompts): share workspace override handling 2026-07-15 01:19:48 +08:00
chengyongruandchengyongru 63a6d5d07d fix(heartbeat): retain history after empty runs 2026-07-15 01:19:48 +08:00
Arthur K.andchengyongru dcb37259fa feat(heartbeat): custom evaluator prompt 2026-07-15 01:19:48 +08:00
chengyongruandGitHub 88c38e9b38 fix(restart): deliver completion after channel reconnects (#4931) 2026-07-15 01:08:39 +08:00
chengyongruandGitHub 37165b0db0 feat(webui): highlight slash commands and app mentions (#4933) 2026-07-15 00:34:22 +08:00
chengyongruandchengyongru 2116e32013 test: speed up CI and harden the suite 2026-07-15 00:18:37 +08:00
Olu Bandchengyongru 06f47fa540 fix: standardize --config help text across CLI commands 2026-07-14 23:51:39 +08:00
chengyongruandchengyongru 905da8e34a ci(webui): verify npm and bun lockfiles 2026-07-14 23:16:21 +08:00
5365bab088 fix(webui): sync package-lock.json for qrcode dependency
fe0717b3 ("feat(webui): add guided setup flows") added qrcode and
@types/qrcode to webui/package.json without regenerating the lockfile,
so `npm ci` fails in the Docker build with EUSAGE (Missing: qrcode,
@types/qrcode, dijkstrajs, pngjs, yargs, ...).

Regenerate the lockfile so it matches package.json again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 23:16:21 +08:00
chengyongruandchengyongru f718c69b2d feat(webui): add copy action to user messages 2026-07-14 22:41:17 +08:00
chengyongruandGitHub 07f54c25e3 chore(codex): identify failing request stage (#4929) 2026-07-14 22:40:10 +08:00
chengyongruandchengyongru 1a1e666625 fix: install timezone data on Windows 2026-07-14 17:30:16 +08:00
chengyongruandchengyongru 297a9e5939 test: cover MCP cleanup cancellation paths 2026-07-14 16:17:35 +08:00
Brian Noahandchengyongru 86f6558707 fix: catch asyncio.CancelledError in close_mcp shutdown
When an MCP server (e.g. stdio browser-agent subprocess) does not
terminate within the AsyncExitStack.aclose() timeout, asyncio raises
CancelledError. The existing exception handler only caught RuntimeError
and BaseExceptionGroup, so CancelledError escaped the except block and
crashed nanobot with exit code 1 on every shutdown.

Add asyncio.CancelledError to the caught exception tuple so the error
is logged at debug level and shutdown completes cleanly.

Stack trace from the crash:

Traceback (most recent call last):
  File ".../nanobot/agent/loop.py", line 1194, in close_mcp
    await stack.aclose()
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".../asyncio/__main__.py", line ?, in <module>
  File ".../nanobot/agent/loop.py", line ?, in close_mcp
    ...
RuntimeError: ... (or BaseExceptionGroup) not caught
SystemExit: 1
2026-07-14 16:17:35 +08:00
chengyongruandchengyongru 4916fc07ab fix(agent): close reasoning on stream timeout 2026-07-14 15:51:22 +08:00
WK Wongandchengyongru 11eb9d8cc8 fix(agent): add wall-clock timeout for streaming LLM requests 2026-07-14 15:51:22 +08:00
chengyongruandGitHub 6c9e3a2cc3 refactor(webui): centralize native runtime access (#4769) 2026-07-14 15:00:30 +08:00
chengyongruandGitHub b7048cf76a feat(webui): support document attachments with ingress safeguards (#4771)
* feat: support document attachments in webui

* fix(webui): normalize document attachment MIME

* refactor(webui): move attachment policy out of channel

* fix(webui): reject oversized attachments before send

* fix(webui): align Portuguese attachment errors

* refactor(webui): separate ingress and transport limits

* fix(webui): reject malformed attachment payloads
2026-07-14 14:47:42 +08:00
chengyongruandGitHub b2759e8a6b docs: reorganize documentation around user workflows (#4916) 2026-07-14 13:59:47 +08:00
chengyongruandchengyongru 1643aa7ef5 fix(shell): narrow PowerShell UTF-8 configuration
Avoid changing native pipeline input encoding and consolidate real PowerShell checks to reduce Windows runner startup flakiness.
2026-07-14 13:50:02 +08:00
chengyongruandchengyongru 9f8c2cb1bf test(shell): wait for Windows PowerShell sessions 2026-07-14 13:50:02 +08:00
chengyongruandchengyongru 61afbffc89 fix(shell): configure PowerShell UTF-8 output 2026-07-14 13:50:02 +08:00
adabarbulescuandchengyongru 9cdf17f5d5 Fix Windows exec UTF-16 output decoding 2026-07-14 13:50:02 +08:00
chengyongruandXubin Ren 3b14d59dcd fix(telegram): fall back on overflow HTML rejection 2026-07-14 12:25:28 +08:00
chengyongruandXubin Ren a335ce07db fix(telegram): bound streamed HTML overflow chunks 2026-07-14 12:25:28 +08:00
sanasif786kaandXubin Ren 87478b6e92 fix(telegram): keep raw markdown in overflow stream buffer tail
Send the overflow tail message with HTML parse_mode, but persist the
unrendered markdown chunk in buf.text so later deltas and stream_end
re-render correctly via _split_telegram_markdown_html().
2026-07-14 12:25:28 +08:00
sanasif786kaandXubin Ren 67648774e2 fix(telegram): preserve HTML formatting in stream overflow chunks
Apply parse_mode=HTML to overflow intermediate chunks so markdown
formatting is not lost when long streamed messages are split.

Fixes #4637
2026-07-14 12:25:28 +08:00
chengyongruandchengyongru 6e462e62a6 fix(dream): limit newline normalization to CRLF 2026-07-14 00:30:50 +08:00