Block CLI/inventory until ume_alarm_xlsx_report (or aggregate) succeeds, and return job_id for big NE batches via get_ne_exec_job.
Co-authored-by: Cursor <cursoragent@cursor.com>
Prefer report tools without hard-hiding CLI, keep soft CLI budgets, store compact+result_ref for the model, and clear frozen wire after MCP sync.
Co-authored-by: Cursor <cursoragent@cursor.com>
Plugins/Skills install and edit via mcpServers JSON, with clearer row actions, soft reloads, and instant loading placeholders; also drop MCP market and harden related scheduler/logging/exec guards.
Co-authored-by: Cursor <cursoragent@cursor.com>
Align tool validation with playbook recipes, add turn checklist/idle guard, and cap interim WA status ticks so multi-hop CLI turns stop flooding the group.
Co-authored-by: Cursor <cursoragent@cursor.com>
Surface group names in channel titles, theme composer chips for light mode, and trim unused Runtime alert/stack panels.
Co-authored-by: Cursor <cursoragent@cursor.com>
Due ticks no longer stack on an active run (WA skip notice + stale clear); schedule_list/admin/gateway now show playbook, steps_n, and last_run signals without dumping full recipes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wrap successful scheduled jobs with a short WA header (+ attachment count), expire stale access pending and DM requesters on admin approve/deny, and add concrete next_steps for insufficient_scope:sql:query.
Co-authored-by: Cursor <cursoragent@cursor.com>
Fiber/offline/alarm/excel/license/congestion turns drop list/exec/sql/run_command so the model must use ume_alarm_xlsx_report instead of inventory self-loops.
Co-authored-by: Cursor <cursoragent@cursor.com>
When require_mention drops an ops short-intent, send one throttled @sender tip instead of silent ignore; casual chat stays quiet.
Co-authored-by: Cursor <cursoragent@cursor.com>
After admin YES/NO, DM the requester a field guide; WA help/bind no longer returns the Chinese productivity todo menu.
Co-authored-by: Cursor <cursoragent@cursor.com>
Reuse open pending requests without re-notifying admins, clarify already-waiting replies, and block further CLI after 4 calls or 2 failures in the same turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
After insufficient_scope/retry_forbidden, refuse the same tool for the rest of the turn (even with new args), emit pre-call WA progress from ToolExecutor, TTL-cache findTopologyPaths, and add bandwidth congestion short-intent + schedule template.
Co-authored-by: Cursor <cursoragent@cursor.com>
Always tag group senders, inject group-focus system hints, label queued follow-ups by speaker, and mark insufficient_scope failures as non-retryable with a user-facing hint.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stamp failure_class for schema/timeout/runtime analytics, refuse same tool+args after a failure in the turn, and add a license short-intent recipe for WhatsApp ops.
Co-authored-by: Cursor <cursoragent@cursor.com>
Enqueue a short English failure notice on job crashes, default scheduler lang to en, and tell unauthorized users their request id is pending admin YES.
Co-authored-by: Cursor <cursoragent@cursor.com>
Extend short TTL reuse to listManagedNe/queryUmeNeInventory to cut list self-loops, and treat short YES/continue as confirmation when a token is pending.
Co-authored-by: Cursor <cursoragent@cursor.com>
Inject English recipe hints for fiber/offline/excel/continue, ack the first queued follow-up, localize gate copy, and classify execManagedNe errors so agents stop blind retries.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default progress, quote wrappers, tool-error copy, and playbook recipes to English unless lang is explicitly zh.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wire channel inbound on_progress/on_tool_ui to outbound queue so group users see wait signals for CLI/UME work without sharing per-speaker session context.
Co-authored-by: Cursor <cursoragent@cursor.com>
Enqueue deliverable tool attachments on the WhatsApp queue path, and dedupe the same attachment_id within one Chat bubble (prefer deliverable).
Co-authored-by: Cursor <cursoragent@cursor.com>
Claim pending rows atomically and serialize the sidecar poller so overlapping polls cannot send the same reply twice; also stop inbound queue delivery from falling through to a second enqueue.
Co-authored-by: Cursor <cursoragent@cursor.com>
Strip @mention prefixes and widen history lookup so reply-to of the bot's own prior answer is not wrapped as [被引用消息] again.
Co-authored-by: Cursor <cursoragent@cursor.com>
Serialize per-session inbound turns and merge follow-ups after the active run; show composing while busy and enqueue final replies so long agent runs still reach the group.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pass the active workspace lane into tool execution and default schedule_create to that specialist so WhatsApp ops-bound jobs are stored and run as ops instead of generalist.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use a fresh execution session per run while keeping source_session_id for delivery only; filter bot JIDs and default scheduled @mentions to the job creator.
Co-authored-by: Cursor <cursoragent@cursor.com>
Require preview confirmation for schedule_delete, extra confirm_foreign for others' jobs in groups, and mirror the same flow in chat slash commands.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wire mention JIDs/names through scheduled delivery and immediate replies (including attachment captions), sanitize group message text for the model, and surface channel-derived sessions in admin Chat.
Co-authored-by: Cursor <cursoragent@cursor.com>
Require deliverable:true for all channel attachments including images; extend save_deliverable_attachment with attachment_id; add WeChat proactive attachment delivery; inject channel file rules via system prompt instead of repeating on every user message.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add save_deliverable_attachment for explicit document outbound, pass channel user_id into tool risk gating so write_file/run_command respect per-user allow_high settings, and document the workflow in channel-file-delivery skill.
Co-authored-by: Cursor <cursoragent@cursor.com>
WhatsApp/channel binary_ref uploads now expand into text_ref/tabular summaries for the model, and outbound replies only auto-attach generated image/video media instead of lookup tool text_ref results.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default WhatsApp groups to per-user sessions, skip redundant quoted-text injection when already in recent history, and disable group long-term memory writes unless explicitly enabled.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move schedule_* tool factories into the public registry so ops/generalist both can create and manage scheduled jobs, and add an English schedule shortcut.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce whitelist/blacklist gating, pending requests, Admin UI management, and stanza-mapped quote approval so admins can approve via WhatsApp DM without blocking normal LLM chat.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce persisted cron/interval jobs, gateway scheduler loop, worker turns,
and admin CRUD/edit UI. Route proactive reminders via the originating chat
channel (WhatsApp vs WeChat), harden Weixin outbound with durable queue and
PG-compatible polling, and fix chat UI to show each scheduled reminder separately.
Co-authored-by: Cursor <cursoragent@cursor.com>
Extract quotedText from reply context correctly and enrich inbound only after mention detection, keeping strict @-required group policy.
Co-authored-by: Cursor <cursoragent@cursor.com>
Copy bridge files when starting WhatsApp sidecar, enforce group policy only in gateway with richer @ detection, and log skipped group messages for debugging.
Co-authored-by: Cursor <cursoragent@cursor.com>
Match bot mentions across JID/LID formats, accept reply-to-bot triggers, keep raw quote participants, and fall back to plain text when quoted sends fail.
Co-authored-by: Cursor <cursoragent@cursor.com>
Infer group chats from @g.us JIDs, drop (silent)/NO_REPLY outbound text, and @ plus quote the asker when replying in groups.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop replying to every group message by filtering on @bot/triggers in the sidecar and gateway, and map group chats to one shared session while preserving per-sender identity.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Rename platform/ to svc/ to avoid shadowing stdlib platform.
- Replace from oclaw.* with from svc/runtime/interfaces; update -m CLI paths.
- tests/conftest: prepend repo root to sys.path (no parent-folder package name).
- CI: paths and offline_eval script under repo root.
- Ops scripts: PYTHONPATH must be repo root for python -m runtime.* (fixes gateway/WhatsApp sidecar startup).
- Fix default oclaw.json path in tabular/file attachment limits; stabilize attachment test config.
Co-authored-by: Cursor <cursoragent@cursor.com>
This aligns Weixin/WhatsApp with admin-managed model routing by adding channel/account-level specialist controls, improves OSS startup resilience by skipping missing sidecars gracefully, and refreshes runbook/readme guidance for the new default behavior and Weixin OpenAI-key silent handling.
Made-with: Cursor