Feature/v0.4.3 with customizations#17
Open
mionemedia wants to merge 312 commits intoopenagen:masterfrom
Open
Conversation
…w-labs#3414) * Ignore JetBrains .idea folder * fix(ollama): support stringified JSON tool call arguments * providers: allow ZEROCLAW_PROVIDER_URL env var to override Ollama base URL Supports container deployments where Ollama runs on a Docker network host (e.g. http://ollama:11434) without requiring config.toml changes. Includes regression test ensuring the environment override works. * fix(clippy): replace Default::default() with ProviderRuntimeOptions::default() --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3450) Add README and SUMMARY translations for 25 missing languages to match the root-level README coverage. Update English docs hub and SUMMARY with links to all localized hubs. New languages: ar, bn, cs, da, de, el, es, fi, he, hi, hu, id, it, ko, nb, nl, pl, pt, ro, sv, th, tl, tr, uk, ur. Also adds missing SUMMARY.vi.md for Vietnamese. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
zeroclaw-labs#3429) * docs(i18n/zh-CN): Complete full Chinese documentation translation and i18n migration - Translate 58 core Chinese docs covering all modules (setup, reference, operations, security, hardware, contributor guides, etc.) - Migrate all .zh-CN.md files to i18n/zh-CN directory preserving original directory structure - Update internal links across 3 entry files: * Root README.zh-CN.md * docs/README.zh-CN.md * docs/SUMMARY.zh-CN.md - All links point to correct i18n paths with full accessibility - Align with Vietnamese i18n directory structure per project conventions * fix(i18n/zh-CN): resolve all 30 blocking markdown lint errors - Fix all MD022 blank lines around headings issues across 10 files - Fix MD036 emphasis used as heading issue in refactor-candidates.md * docs(i18n/zh-CN): resolve broken document reference link in root README.zh-CN.md * fix(docs): repair double-quote HTML bug and broken relative links in zh-CN docs - Remove stray extra `"` after href closing quotes in 6 HTML links in root README.zh-CN.md - Fix relative link depth for files under docs/i18n/zh-CN/ that reference repo-root files (CONTRIBUTING.md, README.zh-CN.md, .github/workflows/, tests/, docs/SUMMARY.zh-CN.md): use correct number of `../` levels based on actual file location in the tree --------- Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
Co-authored-by: Argenis <theonlyhennygod@gmail.com>
Co-authored-by: Argenis <theonlyhennygod@gmail.com>
Co-authored-by: Alix-007 <Alix-007@users.noreply.github.com>
* fix(config): recover docker runtime path on save * style(config): align docker save path formatting --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
* fix(config): decrypt feishu channel secrets on load * style(config): format feishu secret assertions --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
* fix(linq): accept current webhook payload shape * style(linq): satisfy clippy lifetime lint --------- Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
* ci: add x86_64-pc-windows-msvc to build matrix * fix: prevent test deadlock in ensure_onboard_overwrite_allowed Gate non-interactive terminal check behind cfg!(not(test)) so tests with force=false do not hang waiting on stdin. cfg!(test) path bails immediately with a clear message. No changes to extra_headers, mcp, nodes, or shellexpand. --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3453) * docs(readme): add v0.1.9a release highlights and contributor credits Add "What's New in v0.1.9a" section covering web dashboard restyle, new providers/channels, MCP tools, infrastructure updates, and fixes. Add "Recent Contributors" table crediting key contributors with their specific highlights for this release cycle. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(docs): use table format for release highlights to pass MD036 lint Replace bold-text subsections with a table to satisfy the markdown linter's no-emphasis-as-heading rule (MD036). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Update What's New and Recent Contributors sections to reference v0.1.9b release. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…rt, and manual dispatch
After publishing a beta or stable release, dispatch a repository_dispatch event to zeroclaw-website so it rebuilds with the latest version tag automatically. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…w-labs#3462) Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…#3459) The system prompt has no documentation of channel media markers ([Voice], [IMAGE:], [Document:]), causing the LLM to misinterpret transcribed voice messages as unprocessable audio attachments instead of responding to the transcribed text content. Re-applies fix from merged dev PR zeroclaw-labs#1697 which was lost during the master branch migration. Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3469) The website at zeroclawlabs.ai shows a copy button with curl -fsSL https://zeroclawlabs.ai/install.sh | bash but the website does not serve the script, returning 404. Add install.sh as a GitHub release asset in both beta and stable workflows so it is always available at a stable URL. Pass the raw GitHub URL in the website redeploy dispatch payload so the website can configure a redirect or proxy for /install.sh. Closes zeroclaw-labs#3463
…claw-labs#3467) Replace single-turn chat with persistent Agent to maintain conversation history across WebSocket turns within the same connection. Co-authored-by: staz <starzwan2333@gmail.com> Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…claw-labs#3470) The relative href="install.sh" in README nav headers resolves to zeroclawlabs.ai/install.sh when viewed on the website, which returns 404 since the website does not serve repo-root files. Replace with the raw.githubusercontent.com URL used elsewhere in the docs. Fixes zeroclaw-labs#3463
…call (zeroclaw-labs#3473) Conversation history on long-running channel sessions (e.g. Feishu) grew unbounded until the provider returned a context-window-exceeded error. The existing reactive compaction only kicked in *after* the error, causing the user's message to be lost and requiring a resend. Add proactive_trim_turns() which estimates total character count and drops the oldest turns before the request reaches the provider. The budget (400 k chars ≈ 100 k tokens) leaves headroom for system prompt, memory context, and model output. Closes zeroclaw-labs#3460
…abs#3461) * fix(channels): harden slack threading and utf8 truncation * refactor(channel): collapse interrupt flags to satisfy clippy --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3471) * feat(install): consolidate one-click installer with branded output and inline onboarding - Add blue color scheme with 🦀 crab emoji branding throughout installer - Add structured [1/3] [2/3] [3/3] step output with ✓/·/✗ indicators - Consolidate onboarding into install.sh: inline provider selection menu, API key prompt, and model override — no separate wizard step needed - Replace --onboard/--interactive-onboard with --skip-onboard (opt-out) - Add OS detection display, install method, version detection, upgrade vs fresh install logic - Add post-install gateway service install/restart, doctor health check - Add dashboard URL (port 42617) with clipboard copy and browser auto-open - Add docs link (https://www.zeroclawlabs.ai/docs) to success output - Display pairing code after onboarding in Rust CLI (src/main.rs) - Remove --interactive flag from `zeroclaw onboard` CLI command - Remove redundant scripts/install-release.sh legacy redirect - Update all --interactive references across codebase Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(onboard): auto-pair and include bearer token in dashboard URL After onboarding, the CLI now auto-pairs using the generated pairing code to produce a bearer token, then displays the dashboard URL with the token embedded (e.g. http://127.0.0.1:42617?token=zc_...) so users can access the dashboard immediately without a separate pairing step. The token is also persisted to config for gateway restarts. The install script captures this token-bearing URL from the onboard output and uses it for clipboard copy and browser auto-open. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * security(onboard): revert token-in-URL, keep pairing code terminal-only Removes the auto-pair + token-in-URL approach in favor of the original secure pairing flow. Bearer tokens should never appear in URLs where they can leak via browser history, Referer headers, clipboard, or proxy logs. The pairing code stays in the terminal and the user enters it in the dashboard to complete the handshake securely. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style: apply cargo fmt formatting Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eroclaw-labs#3475) * feat(release): bump to v0.2.0, auto-tweet with features + contributors - Bump version from 0.1.9 to 0.2.0 - Release notes now auto-generate from feat() commits only (no bug fixes) keeping them clean and concise - Contributors are always featured in release notes, pulled from git log authors and Co-Authored-By trailers - Tweet workflow now fires on all releases (beta + stable), auto- generates punchy feature-focused tweets with contributor shoutouts - Stable release workflow gets the same release notes treatment - Tweet gracefully skips if Twitter secrets aren't configured Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(release): credit all contributors, wider range, filter bots - Use wider git range for contributor collection — skips same-version betas to capture everyone who contributed to the release, not just the last incremental push - Filter out bot accounts (dependabot, github-actions, copilot, etc.) from contributor lists - Tweet shows up to 6 contributors with "+ N more" when there are extras, ensuring everyone gets credit - Deduplicate contributors across git authors and Co-Authored-By - Deduplicate features with sort -uf for cleaner notes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(release): use last stable tag for contributor range, not last beta Ensures the tweet and release notes capture ALL contributors since the last stable release (e.g. v0.1.9a), not just since the last beta tag. This gives proper credit to everyone who contributed across the full release cycle. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eroclaw-labs#3481) - Only tweet when there are NEW feat() commits since the previous release (including betas) — skips if no new features to announce - Feature diff uses previous release tag (beta-to-beta) to prevent listing the same features across consecutive releases - Contributor count uses stable-to-HEAD range for full cycle credit - Shows count instead of names to avoid 280 char clipping - Added #zeroclaw #rust #ai #opensource hashtags Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ions (zeroclaw-labs#3480) * feat(channels): add show_tool_calls config to suppress tool notifications When show_tool_calls is false, the ChannelNotifyObserver drains tool events silently instead of forwarding them as individual messages to the channel. Server-side logs remain unaffected. Defaults to true for backwards compatibility. * docs: add before/after screenshots for show_tool_calls PR * docs(config): add doc comment on show_tool_calls field --------- Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…#3458) parse_attachment_markers uses .find(']') which matches the first ] in the content. Filenames containing brackets (e.g. yt-dlp output 'Video [G4PvTrTp7Tc].mp4') get truncated at the inner bracket, causing the send to fail with 'path not found'. Uses depth-tracking bracket matching instead. Re-applies fix from merged dev PR zeroclaw-labs#1632 which was lost during the master branch migration. Co-authored-by: Argenis <theonlyhennygod@gmail.com>
zeroclaw-labs#3457) Documents with image extensions (jpg, png, etc.) are routed to [Document: name] /path instead of [IMAGE:/path], bypassing the multimodal pipeline entirely. This causes the model to have no vision input for images sent as Telegram Documents. Re-applies fix from merged dev PR zeroclaw-labs#1631 which was lost during the master branch migration. Co-authored-by: Argenis <theonlyhennygod@gmail.com>
- Mounted deploy/marketing/output/ into container at /zeroclaw-data/workspace/output/ - Init container chowns output dir to uid 65534 for write access - Updated AGENTS.md with output folder instructions for all agents - Agent can create .md, .txt, .pdf scripts, .docx scripts directly readable by user
…selection - Orchestrator now auto-selects the right specialist based on user's request - No need to manually 'Activate' agents — it reads definitions and adopts workflows automatically - Multi-step projects get planned across multiple specialists sequentially - Manual override still available via 'Activate [Agent Name]'
- Configured hybrid OpenRouter + Ollama setup - Added model selection strategy to AGENTS.md orchestrator - Created marketing-specific hints: brainstorm, outline, seo, draft, final - Implemented two-stage workflow (free draft → premium polish) - Default: Claude Sonnet 4 for marketing/books - Ollama routes for utility tasks (code, reasoning, fast responses) - Added OLLAMA_URL env var for Docker host access - Updated docker-compose.yml with extra_hosts for Ollama connectivity Cost optimization: 80% savings by using free models for drafts/brainstorming and premium Claude only for final publication-ready content.
- Created comprehensive SOUL.md with agent personality and core principles - Defines role as Senior Marketing Strategist and Book Publishing Expert - Includes hard boundaries: cost optimization, quality standards, security, autonomy limits - Establishes cost-first thinking: free Ollama for drafts, premium Claude for finals - Documents specialist agent coordination workflow - Provides task execution framework and success metrics - Mounted SOUL.md in docker-compose.yml alongside AGENTS.md - SOUL.md forms the stable identity layer of the Soul Stack This file defines the agent's DNA - who it is, how it communicates, and what rules it must always follow. Ensures consistent persona across all sessions.
…fantasy - Created STYLE.md with dual-mode voice guidance (professional vs casual) - Professional mode: Direct, data-driven, strategic (for plans/reports) - Casual mode: Immersive, mythic, urgent (for social media/ads) - Includes transition rules for seamless Pro ↔ Casual shifts - Defines formatting rules, do's/don'ts, and sample outputs - Specific to Odin Smalls' ZAHANARA dark cultivation fantasy series - Emphasizes African myth (Anansi), realm curses, power ascension - Mounted STYLE.md in docker-compose.yml alongside SOUL.md and AGENTS.md This completes the Soul Stack voice layer, ensuring consistent brand voice across all marketing materials while maintaining cost-efficient operations.
- Created system brief documenting entire marketing deployment - Covers architecture, Soul Stack, model routing, access points - Includes configuration details, security features, daily operations - Documents cost management strategy and troubleshooting guides - Lists all specialist agents and their roles - Provides technical stack overview and next steps - Reference guide for deployment at localhost:42617 - Specific to ZAHANARA marketing agent setup This serves as the complete operational manual for the deployment.
- Created marketing-cron.sh for automated marketing tasks - Supports 7 task types: bookbub, cover-review, email, storyorigin, relaunch, review, monthly - Each task invokes ZeroClaw agent with specialist prompts - Output saved to dated markdown files in output/ folder - Added comprehensive CRON-SETUP.md documentation - Includes Windows Task Scheduler setup instructions - Tested successfully with 'email' task - generated complete nurture email - Cost: ~.05 per task, well under budget - Note: Requires auto_approve config for file_write to run unattended Test results: email task generated 250-word nurture campaign with STYLE.md voice (casual mode), lore hook, BookBub tease, and 99¢ CTA. Duration: 74 seconds, Cost: ~.05, Output: professional quality.
- Enabled scheduler and cron in config.toml (was disabled) - Added 3 native cron jobs via zeroclaw cron add: * Weekly email (Mon 8am): Content Creator nurture campaign * Weekly review (Fri 5pm): Analytics Reporter metrics * Monthly summary (28-31st 4pm): Executive metrics review - Jobs now visible in zeroclaw cron list - Next runs: Mar 19 (review), Mar 22 (email), Mar 28 (monthly) This replaces external bash script with ZeroClaw's built-in scheduler. Jobs persist in agent database and run automatically when scheduled.
- Comprehensive guide for native ZeroClaw cron functionality - Documents all 3 active scheduled jobs with next run times - Includes cron expression format reference and examples - Covers job management (add/pause/resume/update/remove) - Explains one-time tasks and timezone configuration - Compares native cron vs bash script approach - Troubleshooting guide and cost estimates - Auto-approval configuration instructions Native cron jobs persist in database, visible in CLI, and work cross-platform without external Task Scheduler dependencies.
…tent - Added query classification system with 7 priority-based rules - Routes messages to optimal models automatically (no manual hints needed) - Marketing/creative content → Claude Sonnet 4 (premium) - Deep analysis (100+ chars) → Claude Sonnet 4.5 (advanced reasoning) - Code/technical → Ollama qwen2.5-coder (free specialist) - SEO/data analysis → Ollama deepseek-r1 (free) - Short messages (<50 chars) → Ollama gemma3:4b (fast & free) - Brainstorming → Ollama llama3.2 (free ideation) - Default fallback → Claude Sonnet 4 Works for: - Telegram channel (@Kuffsbot) - Gateway dashboard (http://localhost:42617) - Webhook API - Scheduled cron jobs Estimated cost savings: 60-70% by routing utility tasks to free local models while preserving premium quality for marketing/creative work. Classification uses keyword matching, pattern detection, and message length constraints. Rules evaluated by priority (100→50). First match wins. New file: INTELLIGENT-ROUTING.md - complete guide with examples
- Added [model_providers.ollama] section with correct field names - Set base_url to http://host.docker.internal:11434 for container→host access - Fixed 'localhost' connection error when routing to Ollama models - Verified all required models present: qwen2.5-coder, deepseek-r1, gemma3, llama3.2 This enables intelligent routing to free local models for: - Code tasks (qwen2.5-coder) - SEO/data analysis (deepseek-r1) - Quick responses (gemma3:4b) - Brainstorming (llama3.2) Container can now successfully connect to host Ollama instance.
Root cause: ZeroClaw's router only uses api_url for PRIMARY provider. When routing to Ollama (non-primary), it defaults to localhost:11434. Solution: 1. Bind-mount config.toml directly to container for Ollama provider config 2. Set ZEROCLAW_PROVIDER_URL=http://host.docker.internal:11434 env var - This env var is checked by Ollama provider factory for routed instances Changes: - docker-compose.yml: Added config.toml bind mount (read-only) - docker-compose.yml: Added ZEROCLAW_PROVIDER_URL environment variable - config.toml: Added [model_providers.ollama] with base_url This allows intelligent routing rules to successfully use local Ollama models for code, SEO, brainstorming, and fast-response tasks without connection errors.
The bot_token was set to '__TELEGRAM_BOT_TOKEN__' causing 404 errors when attempting to connect to Telegram API. Replaced with actual token: 8711868088:AAE3ymXEXa739HfPm0crvBEI6XMIVcRaORk Bot now connects successfully without 404 errors.
The 'fast' rule wasn't triggering because ZeroClaw's classifier requires at least one keyword OR pattern match - length constraints alone aren't enough. Added common short reply keywords: - Acknowledgments: ok, thanks, sure, got it - Yes/no variants: yes, no, yeah, yep, nope - Abbreviations: k, ty, thx This ensures short conversational messages like 'ok thanks' route to Ollama gemma3:4b (fast & free) instead of expensive Claude Sonnet 4. Test results after fix: - 'Generate SEO keywords' → deepseek-r1 (Ollama) ✅ - 'Write email' → Claude Sonnet 4 ✅ - 'ok thanks' → Will now route to gemma3:4b ✅
Problem: deepseek-r1-tool-calling model outputs reasoning/tool schemas instead of direct content for SEO keyword requests. Solution: Changed SEO route to llama3.2 for direct content generation. Updated route: - hint: seo - provider: ollama - model: llama3.2 Ready to test with Telegram @Kuffsbot
Problem: llama3.2 model not found in Ollama instance Error: 404 Not Found - model 'llama3.2' not found Solution: Replaced all llama3.2 references with llama3:8b which is available in the local Ollama installation. Updated routes: - seo: llama3.2 → llama3:8b - draft: llama3.2 → llama3:8b - brainstorm: llama3.2 → llama3:8b - outline: llama3.2 → llama3:8b Available Ollama models verified: - llama3:8b ✅ - qwen2.5-coder:latest ✅ - gemma3:4b ✅ - MFDoom/deepseek-r1-tool-calling:latest ✅ SEO routing now works: seo hint → llama3:8b (free)
Problem: Ollama models (llama3:8b) were handling high-level creative work: - draft (content creation) - brainstorm (strategic ideation) - outline (content planning) - seo (marketing keyword research) These are higher-level functions requiring premium quality, not utility tasks. Solution: Realigned model routing based on task complexity: Ollama (LOW-level utility only): - code → qwen2.5-coder (technical tasks) - fast → gemma3:4b (quick acknowledgments) - reasoning → deepseek-r1-tool-calling (data processing) OpenRouter (HIGH-level creative/strategic): - marketing → Claude Sonnet 4 (campaigns, copy) - book → Claude Sonnet 4 (fiction writing) - deep → Claude Sonnet 4.5 (strategic analysis) - draft → Claude Sonnet 4 (content drafts) ← moved - brainstorm → Claude Sonnet 4 (ideation) ← moved - outline → Claude Sonnet 4 (planning) ← moved - seo → Claude Sonnet 4 (keywords) ← moved - final → Claude Sonnet 4 (polish) - DEFAULT → Claude Sonnet 4 (everything else) Updated classification rule comments to reflect new routing. This ensures premium quality for all creative/strategic work while keeping Ollama strictly for low-level utility functions.
Problem: Claude Sonnet 4.5 has availability issues on OpenRouter. Solution: Changed 'deep' route from Sonnet 4.5 to Sonnet 4 which is proven reliable across all other routes. Sonnet 4 still provides excellent strategic analysis, deep reasoning, and complex decision-making while ensuring consistent availability. Updated: - model_routes deep hint: 4.5 → 4 - query_classification rule comment for accuracy
Strategy: Use Ollama for drafts/brainstorming/planning/SEO to maximize savings, reserve OpenRouter for premium marketing/book/deep work only. New Ollama Routes (High Savings): - draft → llama3:8b (4.34GB) - versatile drafts, lore (15-25 t/s) - brainstorm → gemma3:4b (3.11GB) - creative hooks, ideas (20-40 t/s) - outline → qwen2.5:7b (4.36GB) - plans/structure (12-25 t/s) - seo → deepseek-r1-tool-calling (4.36GB) - keywords/promos (10-20 t/s) - reasoning → mixtral:8x7b (24GB) - complex analysis/BookBub (5-15 t/s) - code → qwen2.5-coder (4.36GB) - programming tasks - fast → gemma3:4b (3.11GB) - quick acknowledgments OpenRouter Routes (Premium Quality Only): - marketing → Claude Sonnet 4 - campaigns, emails, copy - book → Claude Sonnet 4 - fiction chapters, prose - deep → Claude Sonnet 4 - strategic analysis - final → Claude Sonnet 4 - publication polish - DEFAULT → Claude Sonnet 4 - everything else Expected Impact: - 80%+ cost reduction on drafts/brainstorming/planning/SEO - Premium quality preserved for final marketing/book content - Fast local processing (15-40 t/s) for creative tasks - Complex reasoning via mixtral:8x7b for BookBub strategy Updated classification rule comments to reflect new routing.
Problem 1: gemma3:4b doesn't support tools/function calling Error: 'gemma3:4b does not support tools' Problem 2: Bot can't access workspace files without tool support Solution: Changed routes to tool-capable models: - draft: gemma3:4b → deepseek-r1-tool-calling (tool access) - brainstorm: gemma3:4b → llama3:8b (tool access) - fast: kept gemma3:4b (no tools needed for acknowledgments) Tool-capable Ollama models: ✅ deepseek-r1-tool-calling (draft route) ✅ llama3:8b (brainstorm route) ✅ qwen2.5-coder (code route) ✅ mixtral:8x7b (reasoning route) ✅ qwen2.5:7b (outline route) Non-tool models (fast responses only): ❌ gemma3:4b (fast route - acknowledgments only) Now bot can use file_read, web_search_tool, and other functions when drafting or brainstorming.
User preference: llama3:8b is better general model for versatile drafts. Updated: - draft route: deepseek-r1-tool-calling → llama3:8b - Both draft and brainstorm now use llama3:8b (tool-capable, 15-25 t/s) llama3:8b supports tools (file_read, web_search) while being more versatile for general drafting tasks compared to specialized deepseek-r1-tool-calling model.
Problem: 'Draft ZAHANARA email' routed to marketing (Claude) instead of draft (llama3:8b) because no draft classification rule existed. The word 'email' matched marketing keywords (priority 100), so it used expensive Claude Sonnet 4 instead of free llama3:8b. Solution: Added draft classification rule with priority 110 (higher than marketing's 100) to catch draft requests first. New rule: - hint: draft - keywords: draft, rough draft, first draft, quick draft, write a draft - priority: 110 (highest) Now 'Draft X email' routes to llama3:8b (tool access, ) instead of Claude Sonnet 4 (.003). Test: 'Draft ZAHANARA email' should now use llama3:8b with workspace access.
Removed from Ollama: - llama3:8b (no tool support) - gemma3:4b (no tool support) - gemma3:latest (duplicate) Freed: ~11GB storage New routing based on user benchmarks: - draft → gpt-oss:20b (90% Sonnet quality, tool access, 8-15 t/s) - brainstorm → gpt-oss:20b (best balance quality/tools, CoT-strong) - fast → deepseek-r1-tool-calling (tool access, 10-20 t/s) - outline → qwen2.5:7b (82% quality, likely tools, 12-25 t/s) - seo → deepseek-r1-tool-calling (85% quality, explicit tools) - reasoning → mixtral:8x7b (92% quality, 5-15 t/s) - code → qwen2.5-coder (tool-capable) All Ollama routes now support workspace file access (file_read, web_search). User benchmark data confirmed gpt-oss:20b as optimal for draft/brainstorm tasks requiring ZAHANARA notes and knowledge stack access.
Problem: Agent couldn't access or manage scheduled cron jobs without manual approval, limiting its ability to create automated marketing tasks. Solution: Added cron management tools to auto_approve list: - cron_add: Create new scheduled jobs (shell or agent tasks) - cron_list: View all scheduled jobs - cron_remove: Delete jobs by ID - cron_update: Modify existing jobs - cron_run: Manually trigger a job These tools were already registered in the tool registry (src/tools/mod.rs lines 284-289) but required manual approval. Now the agent can: 1. Create marketing automation schedules autonomously 2. List/view existing cron jobs 3. Edit schedules or prompts 4. Remove outdated jobs 5. Test jobs with manual runs Use cases: - 'Create a cron job to post SEO keywords every Monday at 9am' - 'Show me all scheduled jobs' - 'Delete the job named daily-email-draft' - 'Update job X to run at 2pm instead of 9am' Security: Jobs still respect SecurityPolicy constraints (rate limits, workspace_only, etc.) and are persisted in cron store.
Problem: User expected cron job results delivered to Telegram, but jobs were saving to output/*.md files instead. Solution: Created TELEGRAM-CRON-DELIVERY.md with instructions for updating existing jobs to use delivery configuration. Key points: - Easiest method: Ask agent on Telegram to update all jobs - Agent has cron_update in auto_approve (enabled earlier) - Delivery config: mode=announce, channel=telegram, to=8203092181 - CLI doesn't support delivery flags (tool-only feature) Jobs to update (7 total): - Weekly Email Draft, BookBub Daily Check, Weekly Review - Monthly Review, Mini-Relaunch Kickoff, StoryOrigin Promos - MiBlart Cover Arrival User can now receive cron output directly in Telegram instead of checking Docker logs or browsing output folder.
Problem: Agent was saying it couldn't see scheduled jobs, even though cron_list/cron_update were in auto_approve and working. The agent simply didn't know these tools existed. Root cause: SOUL.md (agent identity document) listed file_read, file_write, web_search, memory, and shell commands, but didn't mention any cron tools. When the agent is asked to manage jobs, it has no awareness that cron_list exists as an available tool. Solution: Added 5 cron tools to 'Tools at Your Disposal' section in SOUL.md: - cron_list: List all jobs with IDs, schedules, delivery settings - cron_add: Create new scheduled jobs with Telegram delivery - cron_update: Modify jobs (schedule, prompt, delivery, enable/disable) - cron_remove: Delete jobs by ID - cron_run: Manually trigger jobs for testing Impact: Agent now knows it can proactively use cron_list when asked about scheduled jobs, then use cron_update to modify them. This completes the cron management capability enablement. Testing: After restart, user should message agent on Telegram asking it to list and update jobs. Agent should now use the tools autonomously. Related: Earlier commit 11380b1 added tools to auto_approve but didn't update the agent's identity document.
…tion capabilities - Removed failing models: deepseek-r1-tool-calling, mixtral:8x7b (freed 30.7 GB) - Updated model routes: hint:seo/fast → gpt-oss:20b, hint:reasoning → qwen3:8b - Verified tool-calling reliability: gpt-oss:20b (primary), qwen3:8b (backup) - Documented full cron management capabilities in BRIEF.md - Added marketing automation framework with recommended scheduled tasks - Updated BRIEF.md with model test results and latest deployment info (2026-03-22)
- Fix web_search_tool: Update snippet regex to match any HTML tag (not just <a>) DuckDuckGo changed HTML structure, breaking result parsing - Update SOUL.md: Add rule to prevent automatic file creation Bot now only creates files when explicitly requested by user - Update BRIEF.md: Document web search fix and behavior optimization Tested: Web search now returns real results, bot provides research-backed analysis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Describe this PR in 2-5 bullets:
masterfor all contributions):Label Snapshot (required)
risk: low|medium|high):size: XS|S|M|L|XL, auto-managed/read-only):core|agent|channel|config|cron|daemon|doctor|gateway|health|heartbeat|integration|memory|observability|onboard|provider|runtime|security|service|skillforge|skills|tool|tunnel|docs|dependencies|ci|tests|scripts|dev, comma-separated):<module>: <component>, for examplechannel: telegram,provider: kimi,tool: shell):trusted contributor|experienced contributor|principal contributor|distinguished contributor, auto-managed/read-only; author merged PRs >=5/10/20/50):Change Metadata
bug|feature|refactor|docs|security|chore):runtime|provider|channel|memory|security|ci|docs|multi):Linked Issue
Supersede Attribution (required when
Supersedes #is used)#<pr> by @<author>, one per line):Co-authored-bytrailers added for materially incorporated contributors? (Yes/No)No, explain why (for example: inspiration-only, no direct code/design carry-over):\n): (Pass/Fail)Validation Evidence (required)
Commands and result summary:
cargo fmt --all -- --check cargo clippy --all-targets -- -D warnings cargo testSecurity Impact (required)
Yes/No)Yes/No)Yes/No)Yes/No)Yes, describe risk and mitigation:Privacy and Data Hygiene (required)
pass|needs-follow-up):Compatibility / Migration
Yes/No)Yes/No)Yes/No)i18n Follow-Through (required when docs or user-facing wording changes)
Yes/No)Yes, locale navigation parity updated inREADME*,docs/README*, anddocs/SUMMARY.mdfor supported locales (en,zh-CN,ja,ru,fr,vi)? (Yes/No)Yes, localized runtime-contract docs updated where equivalents exist (minimum forfr/vi:commands-reference,config-reference,troubleshooting)? (Yes/No/N.A.)Yes, Vietnamese canonical docs underdocs/i18n/vi/**synced and compatibility shims underdocs/*.vi.mdvalidated? (Yes/No/N.A.)No/N.A., link follow-up issue/PR and explain scope decision:Human Verification (required)
What was personally validated beyond CI:
Side Effects / Blast Radius (required)
Agent Collaboration Notes (recommended)
AGENTS.md+CONTRIBUTING.md):Rollback Plan (required)
Risks and Mitigations
List real risks in this PR (or write
None).