Commit graph

232 commits

Author SHA1 Message Date
xmanrui
fd303b6c78 Merge main into feat/conversation-title 2026-09-01 17:22:49 +08:00
曜 星
7a68e94f54 feat: add conversationTitle to context enhancement
Pass inbound group titles into <dsh_im_source> without extra platform API lookups.
DingTalk uses conversationTitle; Telegram groups use chat.title.
2026-09-01 17:15:17 +08:00
xmanrui
9c4628a821 build: refresh host bundle after workspace updates 2026-09-01 16:29:20 +08:00
xmanrui
13fc85cdce chore: release v4.4.0 2026-09-01 12:33:36 +08:00
xmanrui
840e5aa857 feat: add unified IM access policies 2026-09-01 10:46:41 +08:00
evanfang0054
82e7127cb4 fix(feishu): thread failure and error notices to the triggering message
Failure notices (turn failures, sub-flow errors from list/card/preset/
model/compact/stop/bind/switch paths, batch-input results, and the
card-queue rate-limit notice) were sent as fresh messages keyed only by
chat_id, so in topic groups they landed in the group's default area
instead of the topic the interaction belongs to.

- #sendFailure accepts options.replyTo; every call site forwards the
  anchor available in its context (command message, card message, or
  watch/list anchor)
- #handleMessageFailure and #finishBatchResult thread to the triggering
  message
- /repair stays private-chat-only by design; proactive delivery keeps
  its existing behavior (no thread context exists there)

- lib/index.js: regenerated host bundle
2026-09-01 10:02:11 +08:00
evanfang0054
6d815e0254 fix(feishu): deliver watch completions as replies inside the watch's topic
Watch-completion pushes rebuilt a fresh completion card keyed only by
chat_id, so in topic groups the "task finished" notice landed in the
group's default area instead of the topic where the watch was created.

- #runWatch persists the anchor message id (command message or card)
  on the durable watch entry
- #deliverCompletion sends the completion card as a reply to that
  anchor; entries without an anchor keep the previous behavior
- batch watch_add passes the card message as the anchor

- lib/index.js: regenerated host bundle
2026-09-01 10:02:11 +08:00
evanfang0054
fdab438a93 fix(feishu): thread card-action confirmations to the card message
Card-button sub-flows (bind session, watch/unwatch, workspace switch,
compact, stop, steer, preset/model selection and their confirmations)
sent fresh messages keyed only by chat_id, so in topic groups the
confirmations landed in the group's default area instead of the topic
containing the card.

- #handleCardAction anchors every confirmation and sub-flow to the
  card's message id; #handleMenuPick anchors to the replying message
- #bindSession / #switchWorkspace / #handleCompact / #handleStop /
  #handlePreset* / #handleModelSelect / #sendSteer accept and forward
  the anchor; the expired-menu and steer-form notices follow suit
- lib/index.js: regenerated host bundle
2026-09-01 10:02:11 +08:00
evanfang0054
adc0a89f13 fix(feishu): honor NO_PROXY before proxying the long connection
webSocketProxyUrl() picks up https_proxy/HTTPS_PROXY/http_proxy/
HTTP_PROXY and forces the Feishu WSS long connection through the proxy,
without consulting NO_PROXY/no_proxy. With a local proxy exported in
the shell (Clash/V2Ray setups), every long-connection attempt is
rejected by Feishu's server and the runtime force-closes and retries
in a loop, so the bot never reaches a stable connected state.

Resolve NO_PROXY/no_proxy for the long-connection endpoints
(open.feishu.cn / open.larksuite.com) before falling back to the proxy
env: exact host, parent-domain (.cn, feishu.cn) and * entries follow
the common NO_PROXY semantics.

- production.mjs: NO_PROXY gate in front of the proxy lookup
- feishu-proxy.test.mjs: NO_PROXY exclusion and fallthrough cases
- lib/index.js: regenerated host bundle
2026-09-01 09:46:49 +08:00
xmanrui
009f1abec9 feat: add tabs to bot settings 2026-09-01 02:31:57 +08:00
xmanrui
08368c135c chore: release v4.3.0 2026-09-01 02:09:33 +08:00
xmanrui
75ebaebf2e feat: split group and direct context enhancement 2026-09-01 02:06:22 +08:00
evanfang0054
fd6e0af81b feat(feishu): thread command replies, cards, and approvals to the triggering message
Plain command replies (menu cards, session/workspace/watch lists, /new,
/status, /compact, /archived, model and preset commands) and Harness
approval prompts were sent as fresh messages keyed only by chat_id, so
in topic groups they landed in the group's default area instead of the
topic the conversation belongs to.

Deliver them as replies to the triggering message, mirroring how stream
answers already thread:

- #sendCard accepts { replyTo } and replies interactively, falling back
  to a plain card when the referenced message is gone
- command replies, status text, menu/session/workspace/watch cards,
  approval prompts and resolved-question notices all carry the
  triggering message id
- batch-input failure notices follow the same rule

- bridge.test.mjs: /new in a topic group must thread the confirmation
  text and the menu card to the command message
- lib/index.js: regenerated host bundle
2026-08-31 20:06:04 +08:00
evanfang0054
3b810fea6b fix(feishu): present Harness questions as threaded replies in topic groups
Regular answers reuse the stream card, which is created through the
reply API targeting the triggering message, so they land in the right
Feishu thread. Pending Harness questions (ask_user_question) were sent
through a fresh message.create with only the chat_id, so in topic
groups they appeared in the group's default area instead of the topic
the conversation belongs to.

Thread question delivery the same way as answers:

- #send accepts { replyTo } and uses im.v1.message.reply, falling back
  to a plain message when the referenced one is gone
- the triggering message id now travels into the interaction context
  and pending state, and #presentInteraction replies to it
- resolved-question notices reply to the user's answer message

- bridge.test.mjs: assert the question is delivered via the reply API
  targeting the triggering message inside a topic group
- lib/index.js: regenerated host bundle
2026-08-31 17:12:55 +08:00
evanfang0054
da4114dfe3 feat(feishu): isolate Harness sessions per topic in topic groups
conversationKey derived the group session key from chat_id alone, so in
Feishu topic groups every topic shared one Harness session: context,
/new, pending approvals, and batch-input state all leaked across topics.

Append the event's thread_id to the session key when present. Topic
groups stamp every message with a thread_id, so each topic now maps to
its own group:<chat_id>🧵<thread_id> session. Regular group chats
carry no thread_id and keep the single shared group:<chat_id> key; p2p
keys are untouched.

- message-utils.mjs: thread-aware conversationKey
- message-utils.test.mjs: topic isolation + regular-group fallback cases
- lib/index.js: regenerated host bundle
2026-08-31 13:54:35 +08:00
Diluka
5efcfa6725 feat(qq): parse inbound QQ face/emoji tags into readable text
QQ delivers emoji messages as opaque <faceType=..,faceId="..",ext="..">
markup fragments (the ext field holds a base64 JSON blob with the face
name, e.g. {"text":"吃瓜"}). Without translation, the Harness receives
only this unusable tag and loses what the sender actually meant.

Register the SDK's contentSanitizer({ parseFaceTags: true }) middleware,
mirroring tencent-connect/dsh-qqbot, so C2C and group inbound messages
surface as e.g. 【表情: 吃瓜】 instead of the raw tag.

- qq-runtime.mjs: register contentSanitizer before the typing indicator
- runtime.test.mjs: assert sanitizer registration and update middleware order
- lib/index.js: regenerated host bundle
2026-08-31 09:07:55 +08:00
xmanrui
a0845a7a25 chore: release v4.2.1 2026-08-31 03:33:15 +08:00
xmanrui
14519060f0 fix(telegram): isolate long polling transport 2026-08-31 03:31:07 +08:00
xmanrui
02ddea0054 chore: release v4.2.0 2026-08-31 01:38:31 +08:00
xmanrui
347acceffb fix(feishu): integrate slash command permissions 2026-08-31 01:21:38 +08:00
xmanrui
4496c9601e chore: release v4.1.1 2026-08-31 00:50:07 +08:00
xmanrui
4d18cc4de0 fix(qq): respond to all mentioned group members 2026-08-31 00:45:59 +08:00
xmanrui
e08c3e9576 chore: release v4.1.0 2026-08-30 13:08:14 +08:00
xmanrui
32c6d48857 refine bot delivery settings labels 2026-08-30 13:03:57 +08:00
xmanrui
b90cb805c7 feat: add proactive delivery HTTP endpoint 2026-08-30 11:52:01 +08:00
xmanrui
31792d7bc8 feat: add stable proactive delivery 2026-08-30 11:24:53 +08:00
xmanrui
c4fd59e086 revert: remove package contributor metadata 2026-08-30 08:35:31 +08:00
xmanrui
f47c7c79fa chore: credit PR contributor 2026-08-30 08:30:13 +08:00
MikhailB
98c1e48271 feat: add session and preset list aliases 2026-08-30 02:34:40 +03:00
xmanrui
92ec91b7bd chore: release v4.0.1 2026-08-30 07:02:50 +08:00
xmanrui
8794a46e81 chore: release v4.0.0 2026-08-29 20:26:00 +08:00
xmanrui
6b9118fe95 fix: support legacy and current DSH hosts 2026-08-29 20:22:07 +08:00
xmanrui
72ffd7115c chore: release v3.2.0 2026-08-29 10:49:19 +08:00
xmanrui
0cb79f74e9 feat: add message source context enhancement 2026-08-29 10:46:06 +08:00
xmanrui
5928b33057 fix(dingtalk): mention senders in streamed group replies
Reuse sender metadata and the existing AI Card lifecycle to include native mentions in ordinary group answers. Preserve mentions across progress, completion, and cleanup without sending a separate reminder.

Verified with npm run check (1671 tests) and a real ordinary Q&A in the existing DingTalk test group.
2026-08-28 23:08:52 +08:00
xmanrui
092d2cbb9c test(dingtalk): cover PR #76 mentions and credit contributor
Add regression coverage for group mention chunks, private replies, mention payloads, and batch reply failure handling. Credit divingleee in package contributors and rebuild the checked-in bundles.
2026-08-28 21:51:03 +08:00
xmanrui
57eef234b1 feat(ui): add manual update commands and simplify update dialog 2026-08-28 15:32:09 +08:00
xmanrui
45c0a7f77f chore: release v3.1.1 2026-08-28 10:53:30 +08:00
xmanrui
6c6d4af936 fix(feishu): preserve long streaming replies
Keep a bounded streaming preview, then deliver the complete final answer across multiple cards. Preserve all provider message IDs and cover long snapshots and Unicode boundaries with regression tests.

Fixes #78
2026-08-28 10:50:35 +08:00
xmanrui
71ca552113 chore: release v3.1.0 2026-08-28 06:42:16 +08:00
xmanrui
f3cefd8a84 feat: add npm update checks and manual installation
Add profile-scoped npm updates for Desktop and Web, protect source installations, and keep restarts manual. Cover stale status recovery, request races, and dialog focus with regression tests.

Verified with npm run check (1626 tests) and isolated Desktop/Web npm installation flows.

Refs #61
2026-08-28 06:37:40 +08:00
xmanrui
5888641297 fix(ui): align channel tabs with scan action 2026-08-28 06:16:27 +08:00
xmanrui
8c6c31a1b6 feat: add bounded history previews across nine channels
Add shared /history parsing, read-only session access, message filtering, and bounded replies. Default to three messages, cap at five, and exclude saved history commands.

Include channel integration tests, translations, command help, and the Issue #62 implementation plan.
2026-08-28 03:01:53 +08:00
xmanrui
bf0e157cd4 chore: release v3.0.8 2026-08-28 01:32:15 +08:00
xmanrui
f0b6b38b45 fix: use in-process Harness API for local plugin connections 2026-08-28 01:24:17 +08:00
xmanrui
f4ded46278 chore: release v3.0.7 2026-08-27 22:37:34 +08:00
xmanrui
4c4c748864 fix(commands): support both Harness command argument formats
Keep images for newer Harness endpoints and retry without it only when an older gateway rejects the field before dispatch. Preserve cancellation and never retry business failures.

Add regression coverage, rebuild the Host bundle, and document the compatibility fix. Follow-up to #75.
2026-08-27 22:11:13 +08:00
OpenClaw Agent
03565e5a69 fix(commands): send empty images list to the commands Typert endpoint
The Harness commands execute descriptor declares agentId, line, and images
as required JSON wire fields (strict codec, no acceptsUndefined). The Host
command executor only sent agentId and line, so the Typert gateway rejected
every IM /compact call with arguments-invalid before the command could run.

Send images: [] so /compact works from every IM channel.
2026-08-27 19:40:50 +08:00
xmanrui
c93f42f1cc chore: release v3.0.6 2026-08-26 22:24:25 +08:00
xmanrui
7c5279e445 fixed:issues#69 2026-08-26 22:22:02 +08:00