matevip
6b397a10ed
feat(feishu): inbound file/audio/video download — SDK path + cache push
2026-05-20 15:53:40 +08:00
matevip
71e08b015e
sync: Feishu approval card 5-chain hotfix — verified end-to-end in production
2026-05-20 15:24:47 +08:00
matevip
090bb64c6a
sync: Feishu channel-native tool provider + DbRuleGuardian generic guard
2026-05-20 12:29:29 +08:00
matevip
85d7ee23c4
sync: ChannelToolProvider SPI + node-local reconcile framework for channel-native tools
2026-05-20 12:18:51 +08:00
matevip
a9fa8e7fb1
sync: interactive approval card on Feishu via Schema-2.0 button + card.action callback
2026-05-20 12:05:47 +08:00
matevip
3554da8dbc
sync: inject sender context into agent prompt + Feishu DONE ack hook
2026-05-20 11:51:58 +08:00
matevip
35f010d7a1
sync: Feishu CardKit streaming-card adapter via cardkit/v1 SDK
2026-05-20 11:37:12 +08:00
matevip
0e1b8ca564
sync: componentized media upload SPI + Feishu SDK-backed file sender
2026-05-20 11:23:33 +08:00
matevip
3340885da3
fix(llm): skip chat-style probe for embedding-prefix models in DashScope discovery
2026-05-20 10:14:25 +08:00
matevip
a6b5e3b515
refactor(llm): extract testable embedding protocol routing + drop dead fromProviderId
2026-05-20 10:14:12 +08:00
matevip
73ab31a13c
fix(feishu): fail open when bot open_id is unavailable
2026-05-20 10:13:34 +08:00
倪程伟
af3e68d271
fix(feishu): use SDK mentions field for require_mention group filtering ( #163 )
...
Closes #162
require_mention=true previously degraded to a no-op when botPrefix was unset:
shouldProcess() returned true for all messages and checkAccess() fell through
unconditionally, so any group message would be answered — including ones where
the @mention targeted another user.
FeishuChannelAdapter now consults the Feishu SDK's mentions field directly:
- WebSocket: read EventMessage.getMentions(); webhook: read mentions[] from the
JSON payload. In both paths each mention's id.open_id is compared against the
bot's own open_id.
- Bot open_id is fetched lazily via /open-apis/bot/v3/info and cached on the
adapter instance. If the call fails the message is allowed through, matching
the previous behaviour.
- The require_mention gate is applied at the top of handleFeishuMessage so 1:1
chats are unaffected.
Tests: 15 unit cases covering null/empty inputs, bot mentioned, only-other
mentioned, bot among multiple mentions, and malformed payloads.
2026-05-20 08:49:11 +08:00
倪程伟
ee0c229f52
feat(feishu): support Interactive Card JSON for structured message rendering ( #161 )
...
Auto-route Agent replies to Feishu Interactive Card (schema 2.0) when the
content carries structure — JSON object / array, Markdown with code blocks
or headings, or long-form prose — and keep the original text path for
short plain replies.
- FeishuCardFormatter: package-private detect() + render() helper
- JSON object → two-column summary card
- JSON array (≤4 fields) → table component; (>4 fields) → div per item
- Markdown → lark_md card with 'AI 助手' header
- Long text (>300 chars with paragraph breaks) → plain_text card
- JSON embedded in Markdown code blocks is recognised across all fences
- FeishuChannelAdapter
- sendMessage() honours channel config 'card_format' (auto | always | never)
- sendCard() POSTs interactive messages; ou_-prefixed targets use open_id
- updateCard() PATCHes an existing message (streaming-update hook)
- Tests: 32 unit cases covering every detect path and render branch
Closes #141
2026-05-20 08:42:02 +08:00
matevip
db16ff02a5
chore: drop external project name references from code comments
2026-05-20 08:09:43 +08:00
matevip
c0f9d1d9fb
test(wiki): add adversarial HTML normalization tests and harden skeleton-tag handling
2026-05-19 21:23:13 +08:00
matevip
c1b878b7e1
fix(agent): fail over to backup providers when the primary is rate-limited
2026-05-19 20:06:21 +08:00
matevip
c6d51f8ced
fix(wiki): resolve an agent's own knowledge base before shared ones
2026-05-19 16:53:12 +08:00
matevip
3d643f909d
feat(skill): typed wrapper tools for declared script entrypoints
2026-05-19 09:56:39 +08:00
matevip
31d4d014ed
fix(skill): normalize runSkillScript JSON args
2026-05-19 09:56:33 +08:00
matevip
520429ac6f
test(skill): end-to-end coverage for the lifecycle curator
2026-05-19 09:56:27 +08:00
matevip
4cd21056a0
feat(skill): automatic lifecycle archival for idle skills
2026-05-19 09:55:59 +08:00
matevip
d53d66abe3
feat(chat): per-conversation model selection ( #150 )
2026-05-18 16:27:27 +08:00
matevip
0ff8da0caa
fix(llm): stop MODEL_NOT_FOUND from evicting the whole provider ( #150 )
2026-05-18 16:27:20 +08:00
matevip
3157dde1f4
fix(memory): route long-term memory edits to the file being edited ( #148 )
2026-05-18 11:28:01 +08:00
matevip
75107ac815
feat(llm): native Gemini chat builder, Nano Banana image gen, xAI/Grok provider
2026-05-18 10:00:55 +08:00
matevip
a88edbdd07
refactor(llm): decouple model construction from the agent graph layer ( #147 )
2026-05-18 07:47:49 +08:00
matevip
18df97a8e6
fix(agent): scope MCP tools to explicit per-agent selection ( #117 )
2026-05-17 09:24:56 +08:00
matevip
e647f1d6cf
fix(cron): isolate scheduled-job runs from shared conversation ( #142 )
2026-05-17 07:58:10 +08:00
matevip
b4add8b139
fix(agent): keep wiki tools available to skill-bound agents ( #143 )
2026-05-16 23:00:45 +08:00
matevip
dca71b5a43
test(task): de-flake the submitOneShot enrolled-latch ordering test
2026-05-16 14:51:57 +08:00
matevip
f56f4b059a
fix(workspace): reject impossible calendar dates in memory snapshot import
2026-05-16 14:51:52 +08:00
matevip
725fdd1e0f
feat(workspace): memory snapshot export and import with whitelist
2026-05-16 14:51:25 +08:00
matevip
81c6488a3c
feat(tool): async sub-agent delegation with attribution gate
2026-05-16 14:51:20 +08:00
matevip
419ee57cc8
feat(agent): structured compaction on prompt-too-long preserves prefix
2026-05-16 14:51:14 +08:00
matevip
b9c0ead024
feat(workspace): keyword search across agent memory files
2026-05-16 14:51:09 +08:00
matevip
d90591fa35
feat(task): generic one-shot Callable runner with parent-conv cancel
2026-05-16 14:51:04 +08:00
matevip
c320aab1ba
fix(skill): synthesize SKILL.md body for ACP-derived virtual skills ( #136 )
2026-05-16 14:50:51 +08:00
matevip
130dfd5278
fix(skill): synthesize SKILL.md for MCP-derived virtual skills ( #136 )
2026-05-16 14:50:46 +08:00
matevip
3b9b4d79d5
feat(skill): scope skill catalog and runtime by workspace ( #135 )
2026-05-15 20:01:25 +08:00
matevip
65dd4c1f49
fix(skill): cascade-delete agent-skill bindings on skill removal ( #127 )
2026-05-15 10:17:41 +08:00
matevip
adf5d93975
fix(wiki): align HTTP status with R envelope and harden config + edit paths
2026-05-14 23:01:00 +08:00
matevip
1bba59fc7e
fix(skill): encode bridge virtual ids in the top two bits
2026-05-14 18:18:21 +08:00
matevip
139a478bcd
fix(skill): give CJK-only MCP/ACP names a stable id-based slug
2026-05-14 18:18:15 +08:00
matevip
d1be02985c
fix(agent): collapse model-predicted tool results that the actual tool replaced
2026-05-14 15:44:03 +08:00
matevip
bf3f4af913
fix(agent): structured tool-call replay + final-answer-only content ( #120 )
2026-05-14 07:46:30 +08:00
matevip
1ea90c25cb
fix(agent): make head-orphan repair order-sensitive — a later same-id assistant does not redeem an earlier orphan
2026-05-13 09:03:16 +08:00
matevip
bff57924d6
fix(agent): repair head-side orphan tool responses on the pagination cut
2026-05-13 09:03:10 +08:00
matevip
51b5eceb7d
feat(context): preserve spill markers across compaction phases, persist enriched boundary, broadcast compact_status SSE ( #110 )
2026-05-13 08:50:28 +08:00
matevip
86a6829102
feat(executor): retention sweep and per-conversation purge for tool-result spill files
2026-05-13 08:50:22 +08:00
matevip
7015d1513c
feat(context): anchor the first user message after compaction so long tasks remember the original goal
2026-05-13 08:50:15 +08:00