Commit Graph
100 Commits
Author SHA1 Message Date
1c2ea1aad2 feat(goal): /goal command & long-running tasks (long_task)
* feat(long-task): add LongTaskTool for multi-step agent tasks

Implements a meta-ReAct loop where long-running tasks are broken into
sequential subagent steps, each starting fresh with the original goal
and progress from the previous step. This prevents context drift when
agents work on complex, multi-step tasks.

- Extract build_tool_registry() from SubagentManager for reuse
- Add run_step() for synchronous subagent execution (no bus announcement)
- Add HandoffTool and CompleteTool as signal mechanisms via shared dict
- Add LongTaskTool orchestrator with simplified prompt (8 iterations/step)
- Register LongTaskTool in main agent loop
- Add _extract_handoff_from_messages fallback for robustness

* fix(long-task): add debug logging for step-level observability

* feat(long-task): major overhaul with structured handoffs, validation, and observability

- Structured HandoffState: HandoffTool now accepts files_created,
  files_modified, next_step_hint, and verification fields instead of
  a plain string. Progress is passed between steps as structured data.

- Completion validation round: After complete() is called, a dedicated
  validator step runs to verify the claim against the original goal.
  If validation fails, the task continues rather than returning
  a false completion.

- Dynamic prompt system: 3 Jinja2 templates (step_start, step_middle,
  step_final) selected based on step number. Final steps get tighter
  budget and stronger "wrap up" guidance.

- Automatic file change tracking: Extracts write_file/edit_file events
  from tool_events and injects them into the next step's context if
  the subagent forgot to report them explicitly.

- Budget tracking & adaptive strategy: Cumulative token usage is tracked
  across steps. Per-step tool budget drops from 8 to 4 in the last
  two steps to force handoff/completion.

- Crash retry with graceful degradation: A step that crashes is retried
  once. Persistent crashes terminate the task and return partial progress.

- Full observability hooks for future WebUI integration:
  - set_hooks() with on_step_start, on_step_complete, on_handoff,
    on_validation_started, on_validation_passed, on_validation_failed,
    on_task_complete, on_task_error, and catch-all on_event.
  - Readable state properties: current_step, total_steps, status,
    last_handoff, cumulative_usage, goal.
  - inject_correction() allows external code to send user corrections
    that are injected into the next step's prompt.

- run_step() accepts optional max_iterations for dynamic budget control.

All 27 long-task tests and 11 subagent tests pass.

* test(long-task): add boundary tests and fix race conditions

- Add 7 edge-case tests: validation crash resilience, hook exception safety, mid-run correction injection, FIFO correction ordering, explicit file changes overriding auto-detection, final budget for max_steps=1, and dynamic budget switching boundaries

- Fix assertion in test_long_task_completes_after_multiple_handoffs to match exact prompt format

- Remove asyncio timing hack from test_state_exposure

- Add asyncio.sleep(0) yield in test_inject_correction_during_execution to prevent race between signal injection and step continuation

- All 34 tests passing

* fix(long-task): address code review findings

- Declare _scopes = {"core"} explicitly to prevent recursive nesting in subagent scope
- Document fragile coupling in _extract_file_changes: path extraction depends on
  write_file/edit_file detail format; add debug log for unexpected formats
- Align final-template threshold (max_steps - 2) with budget switch threshold
- Eliminate hasattr(self, "_state") in _reset_state by initializing in __init__

* fix(long-task): honor final signal and file tracking

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(long-task): improve prompt structure and agent contract

- Expand LongTaskTool.description to instruct parent agent on goal
  construction, return value semantics, and how to handle results.
- Expand CompleteTool.description to emphasize that the summary IS the
  final answer returned to the parent agent.
- Prefix validated return value with an explicit "final answer" directive
  to stop parent agent from re-running work.
- Redesign step_start.md: Step 1 is now explicitly for exploration,
  planning, and skeleton-building. complete() is discouraged.
- Remove bulky payload debug logging from _emit(); add targeted
  info/warning/error logs at key state transitions instead.
- Add signal_type to HandoffState for cleaner signal detection.

* test(long-task): expect wrapped completion message after validation

Align assertions with LongTaskTool final return shape on main.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(webui): turn timing strip, latency, and session-switch restore

- Agent loop: publish goal_status run/idle for WebSocket turns; attach
  wall-clock latency_ms on turn_end and persisted assistant metadata.
- WebSocket channel: forward goal_status and latency fields to clients.
- NanobotClient: track goal_status started_at per chat without requiring
  onChat; useNanobotStream restores run strip when returning to a chat.
- Thread UI: composer/shell viewport hooks for run duration and latency;
  format helpers and i18n strings.
- MessageBubble: drop trailing StreamCursor (layout artifact vs block markdown).
- Builtin / tests: model command coverage, websocket and loop tests.

Covers multi-session UX and round-trip timing visibility for the WebUI.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: keep message-tool file attachments after canonical history hydrate

- MessageTool records per-turn media paths delivered to the active chat.
- nanobot.utils.session_attachments stages out-of-media-root files and
  merges into the last assistant message before save (loop stays a thin call).
- WebUI MediaCell: use a signed URL as a real download link when present.

Fixes attachments flashing then vanishing on turn_end when paths lived
outside get_media_dir (e.g. workspace files).

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(webui): agent activity cluster, stable keys, LTR sheen labels

- Group reasoning and tool traces in AgentActivityCluster with i18n summaries
- Stabilize React list keys for activity clusters (first message id anchor)
- Replace background-clip shimmer with overlay sheen for streaming labels
- ThreadMessages/MessageList integration and locale strings

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): render assistant reasoning with Markdown + deferred stream

- Use MarkdownText for ReasoningBubble body (same GFM/KaTeX path as replies)
- Apply muted/italic prose tokens so thinking stays visually subordinate
- useDeferredValue while reasoningStreaming to ease parser work during deltas
- Preload markdown chunk when trace opens; add regression test with preloaded renderer

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): default-collapse agent activity cluster while Working

Outer fold no longer auto-expands during isTurnStreaming; user opens to see traces.
Header sheen and live summary unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(long_task): cumulative run history, file union, and prompt tuning

Inject cross-step summaries and merged file paths into middle/final step
templates so chains do not lose early context. Strip the last run-history
block when it duplicates Previous Progress to save tokens. Add optional
cumulative_prompt_max_chars and cumulative_step_body_max_chars parameters
with clamped defaults.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): session switch keeps in-flight thread and replays buffered WS

Save the prior chat message list to the per-chat cache in a layout effect
when chatId changes (before stale writes could corrupt another chat).
Skip one post-switch layout cache tick so we do not snapshot the wrong tab.

Buffer inbound events per chat_id when no onChat subscriber is registered
(e.g. user focused another session) and drain on resubscribe up to a cap,
so streaming deltas are not lost while off-tab.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): snap thread scroll to bottom on session open (no smooth glide)

Use scroll-behavior auto on the viewport, instant programmatic scroll when
following new messages and on scrollToBottomSignal. Keep smooth only for
the explicit scroll-to-bottom button.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): respect manual scroll-up after opening a session

Track when the user leaves the bottom with a ref and skip ResizeObserver
and deferred bottom snaps until they return or the conversation is reset.
Remove the time-based force-bottom window that overrode atBottom.

Multi-frame scrollToBottom honours the same guard unless force (scroll button).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Publish long_task UI snapshots on outbound metadata

- Add OUTBOUND_META_AGENT_UI (_agent_ui) for channel-agnostic structured state
- LongTaskTool publishes {kind: long_task, data: snapshot} on the bus with _progress
- WebSocket send forwards metadata as agent_ui for WebUI clients
- Tests for bus payload, WS frame, and progress assertions
- Fix loop progress tests: ignore _goal_status in streaming final filter and
  avoid brittle outbound[-1] ordering after goal status idle messages

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: WebUI long_task activity card and resilient history merge

Add optional ui_summary to the long_task tool for one-line UI labels. Stream
long_task agent_ui into a dedicated message row with timeline, markdown peek,
and a right sheet for details. Merge canonical history after turn_end while
re-inserting long_task rows before the final assistant reply. Collapse
duplicate task_start/step_start steps in the timeline and extend i18n.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: align long_task with thread_goal and drop orchestrator UI

- Persist sustained objectives via session metadata (long_task / complete_goal); no subagent wiring or tool-driven agent_ui payloads.\n- Remove WebUI long-task activity UI, types, and translations; history merge preserves trace replay only, with legacy long_task rows normalized to traces.\n- Drop long_task prompt templates and get_long_task_run_dir; add webui thread disk helper for gateway persistence tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(agent): thread goal runtime context, tools, and skill

- Add thread_goal_state helper and mirror active objectives into Runtime Context
- Wire loop/context/memory/events as needed for goal metadata in turns
- Expand long_task / complete_goal semantics (pivot/cancel/honest recap)
- Add always-on thread-goal SKILL.md; align /goal command prompt
- Tests for context builder and thread goal state
- Remove unused webui ChatPane component

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(thread-goal): add websocket snapshot helper and publish goal updates from long_task

Introduce thread_goal_ws_blob for bounded JSON snapshots, attach snapshots to
websocket turn_end metadata in AgentLoop, and let long_task fan-out dedicated
thread_goal frames on the websocket channel after persisting session metadata.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(channels): websocket thread_goal frames, turn_end replay, and session API scrub for subagent inject

Emit thread_goal events and optional thread_goal on turn_end; scrub persisted
subagent announce blobs on GET /api/sessions/.../messages and shorten session
list previews so WebUI does not surface full Task/Summarize scaffolding.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(webui): merge ephemeral traces per user turn when reconciling canonical history

Preserve disk/live trace rows inside the matching user–assistant segment instead
of stacking every trace before the final assistant reply (fixes inflated tool
counts after refresh or session switch).

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(webui): show assistant reply copy only on the last slice before the next user turn

Avoid duplicate copy affordances on intermediate assistant bubbles that precede
more agent activity in the same turn (tools or further assistant text).

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(webui): thread_goal stream plumbing, composer goal strip, sky glow, and client-side subagent scrub projection

Track thread_goal and turn_goal snapshots in NanobotClient, hydrate React state
from thread_goal frames and turn_end, surface objective/elapsed in the composer,
add breathing sky halo CSS while goals are active, mirror server scrub logic on
history hydration and webui_thread snapshots, and extend tests/client mocks.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(channels): add Slack Socket Mode connect timeout with actionable timeout errors

Abort hung websockets.connect handshakes after a bounded wait, log REST-vs-WSS
guidance, surface RuntimeError to channel startup, and log successful WSS setup.

Co-authored-by: Cursor <cursoragent@cursor.com>

* webui: expand thread goal in composer bottom sheet

Add ChevronUp control on the run/goal strip that opens a bottom Sheet
with full ui_summary and objective. Inline preview logic in RunElapsedStrip,
add i18n strings across locales, and a composer unit test.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(webui): widen dedupeToolCallsForUi input for session API typing

fetchSessionMessages types tool_calls as unknown; accept unknown so tsc
build passes when passing message.tool_calls through.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(agent): extract WebSocket turn run status to webui_turn_helpers

* refactor(skills): rename thread-goal to long-task and document idempotent goals

* feat(skills): rename sustained-goal skill to long-goal and tighten long_task guidance

* chore: remove unused subagent/context/router helpers

* feat(session): rename sustained goal to goal_state and align WS/WebUI

- Move helpers from agent/thread_goal_state to session/goal_state:
  GOAL_STATE_KEY, goal_state_runtime_lines, goal_state_ws_blob, parse_goal_state.
- Session metadata now uses "goal_state"; still read legacy "thread_goal";
  long_task writes drop the legacy key after save.
- WebSocket: event/field goal_state, _goal_state_sync; turn_end carries goal_state;
  accept legacy _thread_goal_sync/thread_goal inbound metadata for dispatch.
- WebUI: GoalStateWsPayload, goalState hook/client props, i18n keys goalState*.
- Runtime Context copy uses "Goal (active):" instead of "Thread goal".

* feat(agent): stream Anthropic thinking deltas and fix stream idle timeout

* refactor(webui): transcript jsonl as sole timeline source

* fix(agent): reject mismatched WS message chat_id and stream reasoning deltas

* feat(webui): hydrate sustained goal and run timer after websocket subscribe

* chore(webui,websocket): remove unused fetch helpers and legacy thread_goal WS paths

* Raise default max_tokens and context window in agent schema.

Align AgentDefaults and ModelPresetConfig with typical Claude-scale usage
(32k completion budget, 256k context window) and update migration tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(gateway): bootstrap prefers in-memory model; clarify websocket naming

* fix(websocket): websocket _handle_message passes is_dm; refresh /status test expectations

---------

Co-authored-by: chengyongru <2755839590@qq.com>
Co-authored-by: chengyongru <chengyongru.ai@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-16 01:14:11 +08:00
Xubin RenandGitHub 921fe259f4 Merge PR #3756: feat(runner): model failover with fallback_models
feat(runner): model failover with fallback_models
2026-05-13 23:38:14 +08:00
Xubin RenandGitHub 79e528119c Merge PR #3655: feat(reason): display model reasoning content during streaming
feat(reason): display model reasoning content during streaming
2026-05-13 17:19:30 +08:00
Xubin Ren 9252f4d826 Revert "fix(agent): persist _last_summary across restarts with used sentinel"
This reverts commit e5a1416a37.
2026-05-09 15:00:54 +08:00
Xubin RenandGitHub d8fd4c80bf Merge PR #3646: fix(transcription): retry Whisper calls on transient failures
fix(transcription): retry Whisper calls on transient failures
2026-05-06 21:52:33 +08:00
Xubin RenandGitHub e16fa7c6b1 Merge PR #3561: fix: origin_message_id support and outbound deduplication
fix: origin_message_id support and outbound deduplication
2026-05-01 19:52:10 +08:00
Xubin Ren 26e953f0b9 Revert "fix(feishu): streaming card and tool hint respect reply_to_message in…"
This reverts commit 651b6b933f.
2026-04-30 13:27:37 +08:00
Xubin RenandGitHub 58f8c04bd5 Merge PR #3382: feat(web-tools): Improve to allow bypassing Cloudflare captchas
feat(web-tools): Improve to allow bypassing Cloudflare captchas
2026-04-28 15:27:47 +08:00
Xubin RenandGitHub b8932bc041 Merge PR #3397: fix(discord): full thread support with session isolation and allowlist enforcement
fix(discord): full thread support with session isolation and allowlist enforcement
2026-04-27 17:36:53 +08:00
Xubin RenandGitHub 2fe8d21b6e Merge PR #3459: feat(session): enforce replay/file-cap invariants for history lifecycle
feat(session): enforce replay/file-cap invariants for history lifecycle
2026-04-27 16:17:23 +08:00
Xubin RenandGitHub 537c66a3f8 Merge PR #3440: fix: Automatically clean up unsupported or expired MSTeams session
fix: Automatically clean up unsupported or expired MSTeams session
2026-04-27 15:45:31 +08:00
Xubin RenandGitHub ca66dd8cd1 Merge PR #3463: fix(agent): expose session timestamps in model context
fix(agent): expose session timestamps in model context
2026-04-27 02:22:37 +08:00
Xubin RenandGitHub c64ec3e73c Merge PR #3454: feat(webui): add ask-user choices and model settings
feat(webui): add ask-user choices and model settings
2026-04-26 22:19:39 +08:00
Xubin RenandGitHub d920f07715 Merge PR #3310: feat(webui): add initial browser UI with websocket chat and i18n
feat(webui): add initial browser UI with websocket chat and i18n
2026-04-19 21:41:07 +08:00
Xubin RenandGitHub 9773d4b8ab Merge PR #3112: fix(config): return provider default api base in config resolution
fix(config): return provider default api base in config resolution
2026-04-19 04:14:46 +08:00
Xubin RenandGitHub 3218307f80 Merge PR #3125: fix: harden cron tool contract
fix: harden cron tool contract
2026-04-19 04:01:27 +08:00
Xubin RenandGitHub 92a5125108 Merge PR #3141: fix(skills): use yaml.safe_load for frontmatter parsing to handle multiline descriptions
fix(skills): use yaml.safe_load for frontmatter parsing to handle multiline descriptions
2026-04-16 20:07:15 +08:00
Xubin RenandGitHub cbc1161f75 Merge PR #2938: feat(api): support file uploads via JSON base64 and multipart/form-data
feat(api): support file uploads via JSON base64 and multipart/form-data
2026-04-14 21:23:28 +08:00
Xubin RenandGitHub 12c12869b4 Merge PR #2625: feat: add HTTP health endpoint on gateway port
feat: add HTTP health endpoint on gateway port
2026-04-14 15:24:35 +08:00
Xubin RenandGitHub a81e4c1791 Merge PR #2959: feat(skills): add disabled_skills config to exclude skills from loading
feat(skills): add disabled_skills config to exclude skills from loading
2026-04-12 10:46:50 +08:00
Xubin RenandGitHub a70928cc5c Merge PR #3045: fix(agent): preserve tool results on fatal error to prevent orphan tool_calls
fix(agent): preserve tool results on fatal error to prevent orphan tool_calls (#2943)
2026-04-11 23:08:03 +08:00
Xubin RenandGitHub e0b9edf985 Merge PR #3017: feat(tool): improve file editing and add notebook tool
feat(tool): improve file editing and add notebook tool
2026-04-11 18:02:25 +08:00
Xubin RenandGitHub e7bbbe98f4 Merge PR #3019: fix(mcp): support multiple MCP servers
fix(mcp): support multiple MCP servers
2026-04-11 17:35:47 +08:00
Xubin RenandGitHub 1263869c0a Merge PR #3038: fix(cron): guard _load_store against reentrant reload during job execution
fix(cron): guard _load_store against reentrant reload during job execution
2026-04-11 16:28:47 +08:00
Xubin RenandGitHub 3361ac9dd1 Merge PR #2637: fix(providers): enforce role alternation for non-Claude providers
fix(providers): enforce role alternation for non-Claude providers
2026-04-09 12:47:41 +08:00
Xubin RenandGitHub f65f788ab1 Merge PR #2762: fix: make app-layer retry classification structured
fix: make app-layer retry classification structured (408/409/timeout/connection)
2026-04-06 16:47:49 +08:00
Xubin RenandGitHub 9174a85b4e Merge PR #2520: fix(telegram): split oversized final streamed replies
fix(telegram): split oversized final streamed replies
2026-04-06 14:41:00 +08:00
Xubin RenandGitHub b92d54140d Merge PR #2449: fix: cron reminder notifications being suppressed
fix: cron reminder notifications being suppressed
2026-04-06 14:33:20 +08:00
Xubin RenandGitHub 219c9c6137 Merge PR #2531: fix(whatsapp): detect phone vs LID by JID suffix, not field name
fix(whatsapp): detect phone vs LID by JID suffix, not field name
2026-04-06 14:21:06 +08:00
Xubin RenandGitHub 4c6a4321e0 Merge PR #2530: feat: unify voice message transcription via OpenAI/Groq Whisper
feat: unify voice message transcription via OpenAI/Groq Whisper
2026-04-06 14:16:09 +08:00
Xubin RenandGitHub ee71d8a31f Merge PR #121: fix typos in readme 2026-04-06 04:01:25 +08:00
Xubin RenandGitHub 5e01a910bf Merge PR #1940: feat: sandbox exec calls with bwrap and run container as non-root
feat: sandbox exec calls with bwrap and run container as non-root (minimally fixes #1873)
2026-04-06 03:33:53 +08:00
Xubin RenandGitHub 04a41e31ac Merge PR #2754: feat(agent): add built-in grep and glob search tools
feat(agent): add built-in grep and glob search tools
2026-04-04 23:30:18 +08:00
Xubin RenandGitHub cf56d15bdf Merge PR #2722: perf(cache): stabilize tool prefix caching under MCP tool churn
perf(cache): stabilize tool prefix caching under MCP tool churn
2026-04-04 21:57:15 +08:00
Xubin RenandGitHub 193eccdac7 Merge PR #2779: feat: integrate Jinja2 templating for agent responses and memory
feat: integrate Jinja2 templating for agent responses and memory
2026-04-04 19:17:56 +08:00
Xubin RenandGitHub b9ee236ca1 Merge PR #2717: feat(memory): two-stage memory system with Dream consolidation
feat(memory): two-stage memory system with Dream consolidation
2026-04-04 18:18:43 +08:00
Xubin RenandGitHub 6fbcecc880 Merge PR #2761: fix: Retry-After was ignored, causing premature retries
fix: Retry-After was ignored, causing premature retries (now honors header/json hints)
2026-04-04 03:10:14 +08:00
Xubin RenandGitHub b084122f9e Merge PR #2643: feat: unify web tool config under WebToolsConfig
feat: unify web tool config under WebToolsConfig + add web tool toggle controls
2026-04-04 02:51:40 +08:00
Xubin RenandGitHub 0a31e84044 Merge PR #2495: feat(provider): add Xiaomi MiMo LLM support
feat(provider): add Xiaomi MiMo LLM support
2026-04-04 02:02:16 +08:00
Xubin RenandGitHub 4d7493dd4a Merge PR #2646: fix(weixin): restore weixin typing indicator
fix: restore Weixin typing indicator
2026-04-04 02:00:47 +08:00
Xubin RenandGitHub 7113ad34f4 Merge PR #2733: harden agent runtime for long-running tasks 2026-04-02 22:34:00 +08:00
Xubin RenandGitHub 63d646f731 Merge PR #2676: fix(test): fix flaky test_fixed_session_requests_are_serialized
fix(test): fix flaky test_fixed_session_requests_are_serialized
2026-03-31 22:08:47 +08:00
Xubin RenandGitHub a4dfbdf996 Merge PR #2614: feat(weixin): weixin multimodal capabilities and align with version 2.1.1
feat(weixin): weixin multimodal capabilities and align with version 2.1.1
2026-03-31 19:43:02 +08:00
Xubin RenandGitHub 1814272583 Merge PR #1362: feat: add OpenAI-compatible API
feat: add OpenAI-compatible API
2026-03-30 23:40:04 +08:00
Xubin RenandGitHub c00e64a817 Merge PR #2386: feat(channel): enhance Telegram, QQ, Feishu, and WhatsApp
feat: telegram/qq/whatsapp/feishu enhancement
2026-03-24 11:40:15 +08:00
Xubin RenandGitHub b5c95b1a34 Merge PR #2204: fix(cron): scope cron state to each workspace with safe default-only migration
fix(cron): scope cron state to each workspace with safe default-only migration
2026-03-24 10:46:49 +08:00
Xubin RenandGitHub 5fd66cae5c Merge PR #1109: perf: optimize prompt cache hit rate for Anthropic models
perf: optimize prompt cache hit rate for Anthropic models
2026-03-22 14:23:41 +08:00
Xubin RenandGitHub 064ca256f5 Merge PR #1985: feat: add /status command to show runtime info
feat: add /status command to show runtime info
2026-03-22 00:11:34 +08:00
Xubin RenandGitHub ec2e12b028 Merge PR #1824: feat(tools): enhance ExecTool with enable flag
feat(tools): enhance ExecTool with enable flag
2026-03-21 01:54:18 +08:00
Xubin RenandGitHub b939a916f0 Merge PR #1763: align onboard with config and workspace overrides
align onboard with config and workspace overrides
2026-03-17 14:03:50 +08:00
Xubin RenandGitHub a9621e109f Merge PR #1136: fix: workspace path in onboard command ignores config setting
fix: workspace path in onboard command ignores config setting
2026-03-17 13:10:32 +08:00
Xubin RenandGitHub f1a82c0165 Merge PR #1963: feat(feishu): implement message reply/quote support
feat(feishu): implement message reply/quote support
2026-03-14 23:10:45 +08:00
Xubin RenandGitHub 37b994202d Merge PR #1796: fix(telegram): avoid media filename collisions
fix(telegram): avoid media filename collisions
2026-03-14 21:29:07 +08:00
Xubin RenandGitHub 58389766a7 Merge PR #1981: chore: bump wecom-aibot-sdk-python to >=0.1.5
chore: bump wecom-aibot-sdk-python to >=0.1.5
2026-03-13 23:42:43 +08:00
Xubin RenandGitHub 3ee80b000c Merge PR #1949: docs: correct BaiLian dashscope apiBase endpoint
docs: correct BaiLian dashscope apiBase endpoint
2026-03-13 12:18:00 +08:00
Xubin RenandGitHub 62a2e71748 Merge PR #1958: fix(restart): use -m nanobot for Windows compatibility
fix(restart): use -m nanobot for Windows compatibility
2026-03-13 11:19:57 +08:00
Xubin RenandGitHub ba045f56d8 Merge PR #1941: fix(qq): restore plain text replies for legacy clients
fix(qq): restore plain text replies for legacy clients
2026-03-13 10:57:58 +08:00
Xubin RenandGitHub aab909e936 Merge PR #1953: fix: catch BaseException in MCP connection to handle CancelledError
fix: catch BaseException in MCP connection to handle CancelledError
2026-03-13 10:57:11 +08:00
Xubin RenandGitHub fc4f7cca21 Merge PR #1909: fix: raise tool result history limit to 16k and force save_memory in consolidation
fix: raise tool result history limit to 16k and force save_memory in consolidation
2026-03-12 11:11:01 +08:00
Xubin RenandGitHub d313765442 Merge PR #1897: fix: wecom-aibot-sdk-python should use pypi version
fix: wecom-aibot-sdk-python should use pypi version
2026-03-12 10:52:37 +08:00
Xubin RenandGitHub 214693ce6e Merge PR #1895: enhance: improve filesystem & shell tools with pagination, fallback matching, and smarter output
enhance: improve filesystem & shell tools with pagination, fallback matching, and smarter output
2026-03-12 00:22:32 +08:00
Xubin RenandGitHub ff10d01d58 Merge PR #1885: feat: allow direct references in hatch metadata for wecom dep
feat: allow direct references in hatch metadata for wecom dep
2026-03-11 22:53:56 +08:00
Xubin RenandGitHub 0321fbe2ab Merge PR #1888: refactor: auto-discover channels via pkgutil, eliminate hardcoded registry
refactor: auto-discover channels via pkgutil, eliminate hardcoded registry
2026-03-11 22:24:25 +08:00
Xubin RenandGitHub 4f7613d608 Merge PR #1855: fix: bump litellm version to 1.82.1 for Moonshot provider support
fix: bump litellm version to 1.82.1 for Moonshot provider support
2026-03-11 11:31:14 +08:00
Xubin RenandGitHub 81b22a9e3a Merge PR #1741: fix: ensure feishu audio file has .opus extension for Groq Whisper compatibility
fix: ensure feishu audio file has .opus extension for Groq Whisper compatibility
2026-03-10 00:26:30 +08:00
Xubin RenandGitHub 51d113d5a5 Merge PR #1727: feat(qq): send messages using markdown payload
feat(qq): send messages using markdown payload
2026-03-08 23:40:30 +08:00
Xubin RenandGitHub 55fb771e1e Merge PR #1677: fix(auth): prevent allowlist bypass via sender_id token splitting
fix(auth): prevent allowlist bypass via sender_id token splitting
2026-03-08 00:37:09 +08:00
Xubin RenandGitHub 7b676962ed Merge PR #1568: fix(feishu): isolate lark ws Client event loop from main asyncio loop
fix(feishu): isolate lark ws Client event loop from main asyncio loop
2026-03-05 17:38:57 +08:00
Xubin RenandGitHub fb74281434 Merge PR #1499: fix(qq): add msg_seq to prevent message deduplication error
fix(qq): add msg_seq to prevent message deduplication error
2026-03-05 10:39:45 +08:00
Xubin RenandGitHub 2484dc5ea6 Merge PR #1533: fix(tests): resolve failing tests
fix(tests): resolve failing tests
2026-03-05 10:28:39 +08:00
Xubin RenandGitHub 4e9f08cafa Merge PR #1511: fix: add size limit to ReadFileTool to prevent OOM
fix: add size limit to ReadFileTool to prevent OOM
2026-03-05 01:12:40 +08:00
Xubin RenandGitHub fd3b4389d2 Merge PR #1531: fix(feishu): convert audio type to file for API compatibility
fix(feishu): convert audio type to file for API compatibility
2026-03-05 00:38:15 +08:00
Xubin RenandGitHub a156a8ee93 Merge PR #1507: fix: guard validate_params against non-dict input
fix: guard validate_params against non-dict input
2026-03-05 00:36:29 +08:00
Xubin RenandGitHub d9ce3942fa Merge PR #1508: fix: handle invalid ISO datetime in CronTool gracefully
fix: handle invalid ISO datetime in CronTool gracefully
2026-03-05 00:35:16 +08:00
Xubin RenandGitHub 522cf89d53 Merge PR #1521: test: fix test failures from refactored cron and context builder
test: fix test failures from refactored cron and context builder
2026-03-05 00:34:01 +08:00
Xubin RenandGitHub a2762351b3 Merge PR #1525: fix(codex): pass reasoning_effort to Codex API
fix(codex): pass reasoning_effort to Codex API
2026-03-05 00:31:09 +08:00
Xubin RenandGitHub 1303cc6669 Merge PR #1485: fix: add missed openai dependency
fix: add missed `openai` dependency
2026-03-04 00:14:52 +08:00
Xubin RenandGitHub c69e45f987 Merge PR #1371 to auto-reload jobs.json when modified externally
fix(cron): auto-reload jobs.json when modified externally
2026-03-01 14:02:37 +08:00
Xubin RenandGitHub 422969d468 Merge PR #1348: fix(lark): Remove non-existent stop() call on Lark ws.Client when enable lark channel
fix(lark): Remove non-existent stop() call on Lark ws.Client when enable lark channel
2026-03-01 01:23:27 +08:00
Xubin RenandGitHub 8c1627c594 Merge PR #1351 to add reasoning_effort config to enable LLM thinking mode
feat: add reasoning_effort config to enable LLM thinking mode
2026-03-01 01:20:49 +08:00
Xubin RenandGitHub 76c3144c7c Merge PR #1347 to streamline subagent prompt
refactor: streamline subagent prompt by reusing ContextBuilder and SkillsLoader
2026-03-01 00:38:44 +08:00
Xubin RenandGitHub 9e546442d2 Merge PR #1326: use WeakValueDictionary for consolidation locks
refactor: use WeakValueDictionary for consolidation locks
2026-02-28 16:31:16 +08:00
Xubin RenandGitHub 08752fab2f Merge PR #1307 to pass msg_id in QQ C2C reply
fix: pass msg_id in QQ C2C reply to avoid proactive message permissio…
2026-02-28 15:54:39 +08:00
Xubin RenandGitHub 44e120dd0b Merge PR #1317: modify Feishu bot permissions in README
Modify Feishu bot permissions in README
2026-02-28 15:48:59 +08:00
Xubin RenandGitHub 32f42df7ef Merge PR #1316 to remove overly broad "codex" keyword from openai_codex provider
fix: remove overly broad "codex" keyword from openai_codex provider
2026-02-28 12:14:30 +08:00
Xubin RenandGitHub a4d95fd064 Merge PR #1293 to generate short alphanumeric tool_call_id for Mistral compatibility
fix: generate short alphanumeric tool_call_id for Mistral compatibility
2026-02-28 00:15:52 +08:00
Xubin RenandGitHub ef09add825 Merge PR #1278 to guide llm grep using timestamp
Fix(prompt): guide llm grep using timestamp
2026-02-27 23:42:05 +08:00
Xubin RenandGitHub e86cfcde22 Merge PR #1200 to update heartbeat tests to match two-phase tool-call architecture
fix: update heartbeat tests to match two-phase tool-call architecture
2026-02-27 18:10:35 +08:00
Xubin RenandGitHub cffba8d0be Merge PR #1214 to support explicit provider selection in config
feat: support explicit provider selection in config
2026-02-26 10:17:08 +08:00
Xubin RenandGitHub 8d1eec114a Merge PR #1102 to replace HEARTBEAT_OK token with virtual tool-call decision
fix(heartbeat): replace HEARTBEAT_OK token with virtual tool-call decision
2026-02-24 19:07:55 +08:00
Xubin RenandGitHub 54e350a496 Merge PR #1054 to deliver agent response to user and fix HEARTBEAT_OK detection
fix(heartbeat): deliver agent response to user and fix HEARTBEAT_OK detection
2026-02-23 21:52:08 +08:00
Xubin RenandGitHub b2a1d1208e Merge PR #1046 to improve agent reliability: behavioral constraints, full tool history, error hints
improve agent reliability: behavioral constraints, full tool history, error hints
2026-02-23 17:16:09 +08:00
Xubin RenandGitHub e69ff8ac0e Merge pull request #1043 to move workspace/ to nanobot/templates/ for packaging
refactor: move workspace/ to nanobot/templates/ for packaging
2026-02-23 16:11:44 +08:00
Xubin RenandGitHub fff6207c6b Merge PR #982 to add DingTalk, QQ, and Email to channels status output
feat(cli): add DingTalk, QQ, and Email to channels status output
2026-02-22 14:57:44 +08:00
Xubin RenandGitHub 6a9152f0c4 Merge PR #947 to Fix 'Missing reasoning_content field' error for deepseek provider.
fix(context): Fix 'Missing `reasoning_content` field' error for deepseek provider.
2026-02-22 00:47:58 +08:00
Xubin RenandGitHub 9b4273f6a4 Merge PR #951 to change VolcEngine litellm prefix from openai to volcengine
fix: change VolcEngine litellm prefix from openai to volcengine
2026-02-22 00:45:49 +08:00
Xubin RenandGitHub 4dca2872bf Merge pull request #930 to slim down agent loop
refactor: extract memory consolidation to MemoryStore, slim down agent loop
2026-02-21 16:19:08 +08:00
Xubin RenandGitHub 6076f98527 Merge pull request #928 to remove interim text retry, use system prompt constraint instead
refactor(loop): remove interim text retry, use system prompt constraint instead
2026-02-21 15:35:35 +08:00
Xubin RenandGitHub 21dd9e4112 Merge pull request #908 to route CLI interactive mode through message bus
refactor: route CLI interactive mode through message bus
2026-02-21 00:46:06 +08:00
Xubin RenandGitHub cd0a5affd5 Merge pull request #879 to make Telegram reply-to-message behavior configurable (default false)
feat: make Telegram reply-to-message behavior configurable, default false
2026-02-20 19:14:15 +08:00