Commit Graph
100 Commits
Author SHA1 Message Date
zhayujieandcowagent 1533a9d45d fix: keep scheduler loadable on Python < 3.9 without zoneinfo
Co-authored-by: cowagent <cow@cowagent.ai>
2026-10-01 10:03:13 +08:00
zhayujieandcowagent dae6bc6d8a fix: drop doc wording assertions from MCP console contract test
Co-authored-by: cowagent <cow@cowagent.ai>
2026-10-01 10:02:11 +08:00
zhayujieandcowagent 8d3138a93b docs: add console screenshots to the MCP guide and move the console section first
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-30 18:46:47 +08:00
zhayujie 5a195795a7 Merge pull request #3408 from 6vision/fix/mcp-windows-npx
fix(mcp): resolve stdio command via PATHEXT on Windows
2026-09-30 17:35:43 +08:00
zhayujieandcowagent c94f3bba90 feat: release v2.2.0
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-30 09:59:40 +08:00
zhayujieandcowagent 4f08165f48 feat: add gpt-6.1-sol as the default OpenAI model
Put gpt-6.1-sol ahead of gpt-6-luna in the model selector, install scripts,
README and docs. It routes through the Responses API via the existing gpt-6
prefix rule.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-30 09:53:51 +08:00
zhayujieandcowagent a0c5063bc6 fix(desktop): re-scan an existing WeChat instance instead of minting a new one
When a live WeChat instance lost its session, the scan panel fetched a
standalone QR and connected with an empty instance id on confirm, which
created a second WeChat card. The panel now reads the instance's own QR,
reconnects under the same id, and the page polls instance cards that are
waiting for a scan.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-30 09:17:13 +08:00
zhayujieandcowagent 77f7f608cc fix(skills): delete a skill from the folder it was loaded from
A skill's folder need not match its frontmatter name (e.g. wecom-cli holding
wecom-unified), so deleting by name silently left it on disk. Builtin skills
outside the workspace skills directory are now rejected instead.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-30 09:17:13 +08:00
zhayujieandcowagent 08f64f7087 ci(desktop): fail the overlay mac build when an extension links OpenSSL dynamically
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 23:22:18 +08:00
zhayujieandcowagent 6ed2a80243 fix(desktop): install cryptography from wheels so the Intel mac backend loads it
cryptography dropped macOS x86_64 wheels at 49.0, so the Intel build compiled it
against the runner's Homebrew OpenSSL while the bundle only ships Python's older
libssl.3.dylib, and importing it failed with a missing SSL_get0_group_name.
Also fail the mac build when any bundled extension links OpenSSL dynamically.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 23:15:43 +08:00
zhayujieandcowagent 25a44908cc fix(voice): drop return-in-finally so interrupts propagate from openai and pytts
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 22:38:26 +08:00
zhayujieandcowagent e5b535db5e fix: keep the agent profile form in sync when the roster refreshes
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 22:37:52 +08:00
zhayujie 96f633b1d5 Merge pull request #3325 from Lesereingrape/fix/skill-zip-tempdir-leak
fix(cli): remove the temp dir when a repo archive cannot be extracted
2026-09-29 22:37:23 +08:00
zhayujie 89eac32d95 Merge pull request #3326 from aniruddhaadak80/fix/google-voice-finally-swallows-errors
fix(voice): stop google_voice from turning errors into UnboundLocalError
2026-09-29 22:37:16 +08:00
zhayujieandcowagent 353eb7b95a fix(dingtalk): cap remote download time and keep URL query out of temp file names
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 22:29:04 +08:00
zhayujie 0198418729 Merge pull request #3322 from c020627/fix-dingtalk-bounded-download
fix(dingtalk): cap remote media download at MAX_FILE_BYTES
2026-09-29 22:28:08 +08:00
zhayujieandcowagent 9e8eb1192e docs: add wechatmp video reply and backup restore fixes to v2.2.0 notes
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 21:55:53 +08:00
zhayujie 724ecb045c Merge pull request #3319 from Lesereingrape/fix/restore-live-agent-roster
fix(cli): overlay the live roster when restoring a backup
2026-09-29 21:55:30 +08:00
zhayujie c7ce0e72ef Merge pull request #3321 from Lesereingrape/fix/wechatmp-local-video
fix(wechatmp): upload a local video reply instead of crashing on its path
2026-09-29 21:55:24 +08:00
zhayujieandcowagent f9d6565d25 fix: allow cancelling the skill add dialog while a preview is being fetched
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 21:21:35 +08:00
zhayujieandcowagent f184c4b5e4 fix: support owner-qualified ClawHub installs for ambiguous skill names
ClawHub slugs are only unique per publisher, so a bare slug shared by
several publishers returns 409. Accept owner/slug, @owner/slug and skill
page URLs, pass the owner as ownerHandle, skip the slug-only mirror when
an owner is given, and explain the conflict instead of surfacing a raw 409.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 21:21:34 +08:00
zhayujieandcowagent 3e74cd0739 fix(web): scope queue and run cancellation to the agent when deleting a session
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 20:44:34 +08:00
zhayujie 3c9b7d5deb Merge pull request #3316 from Lesereingrape/fix/cancel-session-queue-key
fix(channel): cancel queued work under the agent-scoped session key
2026-09-29 20:43:31 +08:00
zhayujie 2fa6a53e43 Merge pull request #3314 from Lesereingrape/fix/plugin-store-entry-shape
fix(plugins): normalize a damaged plugins.json entry instead of losing every plugin
2026-09-29 20:43:25 +08:00
zhayujieandcowagent 04eb97cfe8 fix: resolve non-default agents from team.json when installing skills
get_workspace_dir built its registry from config.json alone, but the roster
now lives in agents/team.json, so installing or uploading a skill for any
agent other than the default failed with a KeyError. Also read config.json
from COW_DATA_DIR in the desktop build, matching config.get_data_root().

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 20:13:48 +08:00
zhayujieandcowagent 44e84d1ede fix: keep /skill hub commands in renamed builds, hide the hub URL there
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 19:36:24 +08:00
zhayujieandcowagent 06bd817b57 fix(wechatcom): cap total remote download time and keep URLs out of the error log
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 19:31:21 +08:00
zhayujie 66fcc0b874 Merge pull request #3312 from Lesereingrape/fix/wechatcom-local-image
fix(wechatcom): read a locally generated image instead of fetching it
2026-09-29 19:27:59 +08:00
zhayujieandcowagent e58424e84e docs: update the 2.2.0 release notes
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 19:21:45 +08:00
zhayujieandcowagent 159be14de9 refactor: use the shared safe_filename in QQ and DingTalk, tighten the #model message
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 19:21:45 +08:00
zhayujie 37879dd399 Merge pull request #3301 from c020627/fix-qq-safe-filename
fix(qq): cap attachment filename at 180 chars in safe_filename
2026-09-29 19:12:27 +08:00
zhayujie 8fd55bce67 Merge pull request #3310 from Bdysj/fix/dashscope-session-system-prompt
fix(dashscope): keep the system prompt a session is built with
2026-09-29 19:12:14 +08:00
zhayujie 0d24c3a15a Merge pull request #3309 from Bdysj/fix/chunker-preface-and-skipped-levels
fix(memory): index markdown preface and stop duplicating skipped-level sections
2026-09-29 19:11:59 +08:00
zhayujie 641c349324 Merge pull request #3307 from Bdysj/fix/decorate-dropped-reply
fix(channel): drop a plugin-discarded reply without crashing in voice-reply chats
2026-09-29 19:11:46 +08:00
zhayujie 892abc8cc3 Merge pull request #3306 from Bdysj/fix/unsupported-reply-type-name
fix(channel): name the refused reply type in the unsupported-type error
2026-09-29 19:11:32 +08:00
zhayujie 1c4b7fca16 Merge pull request #3305 from Lesereingrape/fix/godcmd-model-argument
fix(godcmd): answer when #model is given more than one argument
2026-09-29 19:11:19 +08:00
zhayujie 68765209fb Merge pull request #3303 from Lesereingrape/fix/godcmd-setpri-priority
fix(godcmd): answer when the plugin priority is not a number
2026-09-29 19:11:06 +08:00
zhayujie 572ccceda8 fix: drop an unused import flagged by the CI lint gate 2026-09-29 19:01:29 +08:00
zhayujieandcowagent 86718f996f fix: use the startup default agent name in the agents snapshot
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 18:25:47 +08:00
zhayujieandcowagent 2e112da9c5 docs: credit #3300 in the 2.2.0 release notes
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 18:25:44 +08:00
zhayujieandcowagent 2726f00fd4 fix(feishu): cap total remote video download time and keep URLs out of the error log
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 18:25:43 +08:00
zhayujie b3b0c7d94f Merge pull request #3300 from c020627/fix-feishu-bounded-video-download
fix(feishu): bound remote video download at MAX_FILE_BYTES
2026-09-29 18:00:33 +08:00
zhayujieandcowagent b7b7efeb28 feat: improve model routing in the image generation skill
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:58:06 +08:00
zhayujieandcowagent 85c1d7ed0a docs: add 2.2.0 release notes (zh) and bump version to 2.2.0
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:55:12 +08:00
zhayujie 6798c4aef6 Merge pull request #3296 from Lesereingrape/fix/role-empty-customize-argument
fix(role): answer when the customize command has no description
2026-09-29 17:53:44 +08:00
zhayujie 812e4f06b7 Merge pull request #3297 from c020627/fix-wechat-kf-local-video
fix(wechat_kf): upload local video replies instead of dropping them
2026-09-29 17:53:15 +08:00
zhayujie bdcc7bfccf Merge pull request #3299 from Lesereingrape/fix/video-reply-dispatch
fix(feishu,dingtalk): upload local video replies instead of dropping them
2026-09-29 17:53:04 +08:00
zhayujieandcowagent b2d2bb5884 feat: add gpt-6-luna, gpt-6-sol and claude-opus-5-5 models
Make gpt-6-luna the OpenAI default (ordered gpt-6-luna, gpt-6-sol,
gpt-6-astra, then gpt-5.6) and claude-opus-5-5 the Claude default across
the model selector, install scripts, README and docs. Budget Claude 5+
models at 1M context / 128K output instead of 200K / 64K.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:49:38 +08:00
zhayujieandcowagent 208db92f31 fix: make the load-order check see console scripts and isolate a test
The check-load-order regex matched no script tags, so it always passed. Set
the feishu card test language per test instead of at import time.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent 1f000fd2c0 fix(desktop): keep loaded history and stream state when following a run
Reloading a running session replaced older pages and regenerated message
ids, so the view jumped and bubbles remounted. Use sequence-based ids, merge
the latest page into what is loaded, and stop streaming on every bubble
opened in a turn.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent 8b78c7b4a8 fix(mcp): keep servers configured in config.json when editing MCP
Without mcp.json the editor showed an empty list and the first save dropped
the mcp_servers from config.json. Fall back to them when loading, preserve
other top-level keys on save, and surface load errors on desktop.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent 3f0222e253 fix(web): redirect /chat with a relative location
web.seeother builds an absolute http:// URL behind a TLS-terminating proxy.
Also print the console root URL from the install scripts.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent e8bd8a3c4c fix(update): refuse to update a modified checkout and recover stale runs
Source updates now abort when tracked files have local edits and pull with
--ff-only, a crashed worker no longer blocks later updates forever, and the
console reloads once the new backend is up.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent 0dbd8edc1d fix(dingtalk): only strip real HTML tags from card markdown
The sanitizer removed any <Word> text such as generics or placeholders, and
touched inline code. Match a whitelist of HTML tag names and protect inline
code like fenced blocks.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent ff4298ff59 fix: fall back to in-place writes when an atomic replace is not possible
Renaming over a single-file bind mount (EBUSY/EXDEV), a file locked on
Windows, or a file in a read-only directory failed the whole save. Resolve
symlinks first and write the existing file in place in those cases.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujieandcowagent 66cd2b7d03 fix(web): keep every file in folder uploads and knowledge imports
web.py 0.76 parses multipart forms with the multipart package, which keeps
only the last value of a repeated field and caps a request at 128 parts, so
multi-file uploads silently kept a single file. Parse the body directly with
a per-endpoint part limit, and read the auth token from the query string so
the body is not consumed before the handler sees it.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 17:06:28 +08:00
zhayujie ebf206bffc Merge pull request #3293 from Lesereingrape/fix/dingtalk-richtext-without-images
fix(dingtalk): route text-only richText to the agent instead of dropping it
2026-09-29 16:44:47 +08:00
zhayujie 5da52c87f2 Merge pull request #3291 from Lesereingrape/fix/midjourney-index-argument
fix(linkai): reply when the midjourney image index is not a number
2026-09-29 15:59:05 +08:00
zhayujieandcowagent 7a342d0295 refactor: reuse shared download and atomic write helpers in new channel fixes
Fix the task store backup restore that still called the removed
_write_atomic, add an optional total deadline to media downloads, and
upload local VIDEO replies on Slack and Telegram.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 15:44:26 +08:00
zhayujie 03ebaa3af3 Merge pull request #3262 from c020627/fix-wechat-kf-file-reply
# Conflicts:
#	channel/wechat_kf/wechat_kf_channel.py
2026-09-29 15:29:08 +08:00
zhayujie c7ae3ba575 Merge pull request #3289 from Lesereingrape/fix/discord-video-reply
fix(discord): upload local video replies instead of printing the file:// path
2026-09-29 15:27:23 +08:00
zhayujie 6712476479 Merge pull request #3263 from c020627/fix-linkai-voice-error-reply
fix(linkai_voice): return an ERROR reply on ASR/TTS failure instead of None
2026-09-29 15:26:06 +08:00
zhayujie 9142fd2be9 Merge pull request #3261 from rudycelekli/fix/subagent-timeout-test-cleanup
test(subagent): wait for timed-out worker teardown
2026-09-29 15:25:51 +08:00
zhayujie 473ac8d3e4 Merge pull request #3260 from rudycelekli/fix/scheduler-backup-recovery
fix(scheduler): recover corrupt task store from backup
2026-09-29 15:25:41 +08:00
zhayujie 02daa54222 Merge pull request #3259 from c020627/fix-env-config-atomic-write
fix(env_config): write the credentials file atomically, and owner-only
2026-09-29 15:25:24 +08:00
zhayujie 539c41f821 Merge pull request #3257 from rudycelekli/fix/wechat-kf-media-download-bounds
fix(wechat-kf): bound remote media replies
2026-09-29 15:25:04 +08:00
zhayujie 18585ae3a6 Merge pull request #3256 from rudycelekli/fix/wechatmp-media-download-bounds
fix(wechatmp): bound remote media downloads
2026-09-29 15:24:42 +08:00
zhayujie 6f38e4defd Merge branch 'master' of https://github.com/zhayujie/CowAgent 2026-09-29 15:23:46 +08:00
zhayujieandcowagent 6c0579afec feat: make desktop app name, menu links, default agent name and icon/title overrides configurable
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 15:09:53 +08:00
zhayujie c872f6f022 Merge pull request #3258 from rudycelekli/fix/wechat-kf-cursor-after-delivery
fix(wechat-kf): advance cursor after queueing messages
2026-09-29 14:54:14 +08:00
zhayujieandcowagent 9340abe57c refactor: share one atomic file write helper across stores
Replace the per-module sibling-file-and-rename copies with
common/atomic_write.py, which uses a unique dot-prefixed temp name,
fsyncs, and keeps the target's permissions.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 14:51:02 +08:00
zhayujie 93c004542c Merge pull request #3281 from c020627/fix-cow-cli-config-atomic-write
# Conflicts:
#	plugins/cow_cli/cow_cli.py
2026-09-29 14:51:02 +08:00
zhayujie e5c4f31852 Merge pull request #3280 from c020627/fix-plugin-repair-atomic-write
fix(plugins): write the repaired plugin config through a sibling file
2026-09-29 14:49:42 +08:00
zhayujie 8ea5ea5f7d Merge pull request #3276 from c020627/fix-summarizer-atomic-memory-write
fix(memory): write MEMORY.md and the dream diary through a sibling file
2026-09-29 14:49:23 +08:00
zhayujie c2dad489b9 Merge pull request #3275 from c020627/fix-xunfei-tts-stream-timeout
fix(voice): bound the Xunfei TTS stream so a silent provider cannot hang it
2026-09-29 14:38:21 +08:00
zhayujie 977ffdfcea Merge pull request #3279 from c020627/fix-skills-config-atomic-write
fix(skills): write skills_config.json through a sibling file
2026-09-29 14:35:49 +08:00
zhayujie 62b9e229d5 Merge pull request #3274 from c020627/fix-plugin-save-config-atomic
fix(plugins): write plugin config through a sibling file and swap it in
2026-09-29 14:34:15 +08:00
zhayujie 94f749604a Merge pull request #3273 from c020627/fix-team-legacy-retire-atomic
fix(team): write config.json atomically when retiring the legacy roster
2026-09-29 14:34:07 +08:00
zhayujie a5f662bb57 Merge pull request #3287 from huiq777/fix/telegram-tilde-and-long-fences
fix(telegram): render ~~~ and longer code fences as code
2026-09-29 14:33:58 +08:00
zhayujie fd9a3b6661 Merge pull request #3278 from c020627/fix-edge-elevenlabs-tts-failure
fix(voice): answer an Edge/ElevenLabs TTS failure instead of dropping the reply
2026-09-29 14:33:48 +08:00
zhayujie 4b73b5ad58 Merge pull request #3285 from aniruddhaadak80/fix/token-bucket-shutdown-and-zero-rate
fix(common): stop the token generator from blocking shutdown or dying on a zero rate
2026-09-29 14:32:37 +08:00
zhayujie 87312c3203 Merge pull request #3282 from Lesereingrape/fix/dingtalk-reply-type-fallback
fix(dingtalk): deliver ERROR and INFO replies instead of dropping them
2026-09-29 14:32:26 +08:00
zhayujie a6da7afdd9 Merge pull request #3255 from rudycelekli/fix/terminal-image-download
fix(terminal): bound remote image downloads
2026-09-29 14:29:07 +08:00
zhayujie c84725a6d9 Merge pull request #3254 from c020627/fix-voice-request-timeouts
fix(voice): bound every outbound request so a stalled provider cannot hang the turn
2026-09-29 14:28:25 +08:00
zhayujie 302a5648c4 Merge pull request #3286 from aniruddhaadak80/fix/audio-convert-close-wave-handle
fix(voice): close the wave handle get_pcm_from_wav opens
2026-09-29 14:28:12 +08:00
zhayujie 37da1a998b Merge pull request #3284 from Lesereingrape/fix/dingtalk-group-context-none-guard
fix(dingtalk): skip group messages outside the whitelist instead of crashing
2026-09-29 14:26:53 +08:00
zhayujieandcowagent 1f44b0507b feat: configurable app name and skill hub toggle for commands, align suggestion cards
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 13:06:23 +08:00
zhayujieandcowagent b796721026 refactor: unify bounded media downloads into common/media_download
Replace the per-channel streaming download helpers (qq, slack, dingtalk,
feishu, wecom_bot, wechatcom) with one shared module using two limits:
20MB for images and 100MB for files. Also bound the wechatcom file URL
path, sanitize feishu image keys, and mark failed feishu post images.

Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 13:05:30 +08:00
zhayujie 1a2d7bf48c Merge pull request #3269 from rudycelekli/fix/bound-feishu-file-audio
fix(feishu): bound inbound file and audio downloads
2026-09-29 12:49:58 +08:00
zhayujie 3e83cb21ed Merge pull request #3272 from rudycelekli/fix/bound-feishu-outbound-media
fix(feishu): bound remote media before reply upload
2026-09-29 12:49:32 +08:00
zhayujie 6c3ba82c76 Merge pull request #3271 from rudycelekli/fix/bound-wecom-outbound-media
fix(wecom_bot): bound outbound remote media downloads
2026-09-29 12:49:22 +08:00
zhayujie be0d2d7855 Merge pull request #3267 from rudycelekli/fix/bound-dingtalk-downloads
fix(dingtalk): bound inbound media downloads
2026-09-29 12:48:48 +08:00
zhayujie a0572700a8 Merge pull request #3270 from rudycelekli/fix/bound-wechatcom-image
fix(wechatcom): bound outbound image URL downloads
2026-09-29 12:48:39 +08:00
zhayujie ca02a39847 Merge pull request #3265 from rudycelekli/fix/slack-unique-inbound-download
fix(slack): keep same-named inbound files separate
2026-09-29 11:45:57 +08:00
zhayujie 17c451b719 Merge pull request #3268 from rudycelekli/fix/bound-wecom-media-decrypt
fix(wecom_bot): bound encrypted media and validate padding
2026-09-29 11:44:03 +08:00
zhayujie cac61536cb Merge pull request #3266 from rudycelekli/fix/feishu-image-download-bounds
fix(feishu): bound inbound image downloads
2026-09-29 11:43:49 +08:00
zhayujie db4c8223dc Merge pull request #3264 from rudycelekli/fix/qq-bounded-attachment-download
fix(qq): bound inbound attachment downloads
2026-09-29 11:43:03 +08:00
zhayujie d08ad19238 Merge branch 'master' of https://github.com/zhayujie/CowAgent 2026-09-29 11:42:28 +08:00
zhayujieandcowagent 95dcc717d6 feat(desktop): request mic access on first use and add extension points for skills and suggestions
Co-authored-by: cowagent <cow@cowagent.ai>
2026-09-29 11:38:24 +08:00
zhayujie efdb9953cf Merge pull request #3253 from c020627/fix-scheduler-file-reply
fix(scheduler): deliver file replies from a scheduled skill instead of a path
2026-09-29 10:37:08 +08:00