Commit Graph

607 Commits

Author SHA1 Message Date
matevip
dac3f5be20 fix(extract): trigger OCR when text extraction returns unreadable bytes 2026-05-12 08:44:20 +08:00
matevip
071ccff9bf feat(tool): add render_html_image to deliver HTML artifacts as native IM images 2026-05-12 07:11:35 +08:00
matevip
b74176ef66 refactor(agent): tighten template pre-binding contract and prune product-assistant skills 2026-05-12 07:11:29 +08:00
matevip
201e510b17 feat(agent): pre-bind skills and tools when applying an agent template 2026-05-12 07:11:19 +08:00
matevip
08fcab12d1 fix(deploy): drop DASHSCOPE_API_KEY requirement so Docker boots with no LLM key configured (#99) 2026-05-11 20:44:31 +08:00
matevip
e6fd39f6ba fix(agent): raise parallel delegation timeout to 300s for thinking models 2026-05-11 17:23:26 +08:00
matevip
f25f910a82 feat(skill): support optional: true frontmatter for off-by-default bundled skills 2026-05-11 17:22:30 +08:00
matevip
6d5fb595d3 fix(agent): harden digital-employee isolation across creation, skill binding and prompt catalog 2026-05-11 16:10:28 +08:00
matevip
9fd5843dda fix(llm): pin OpenAI-compatible HTTP client to HTTP/1.1 (#89) 2026-05-11 11:22:23 +08:00
matevip
3f1f83bbfe fix(channel): gate WS/long-polling channels on a distributed leader lease (#85) 2026-05-11 10:50:00 +08:00
matevip
b7f69dbefe fix(skill): merge partial PUT into existing row so SKILL.md saves stop 500ing (#93) 2026-05-11 07:59:49 +08:00
matevip
9cac7a31d1 refactor(skill-mcp): expose tool display names via ResolvedSkill instead of Map view 2026-05-10 23:46:37 +08:00
czhcc
18148aa724
feat(skill-mcp): expose readable display name alongside prefixed MCP tool names
Add a parallel effectiveAllowedToolsDisplay field on the runtime status payload so the SkillMarket detail drawer can render mcp_<server>_<slug>_<hash> with the raw tool name appended in parentheses, while leaving the original prefixed list unchanged for any caller that needs the machine name. McpSkillBridge#decorateToolNameForDisplay reverses a prefixed name via the per-server cached tool list; the frontend prefers the new display field and falls back to effectiveAllowedTools when the field is absent.
2026-05-10 23:30:22 +08:00
matevip
f71f49bda1 fix(agent): dedup repetition output + mark INCOMPLETE instead of NORMAL 2026-05-10 19:16:16 +08:00
matevip
fb0ae2b6cc fix(agent): break out of self-arguing reasoning loops via content-repetition cap 2026-05-10 19:16:10 +08:00
matevip
a886447a39 fix(channel): drop stray 'group:' infix in wecom inbound media path 2026-05-10 19:16:04 +08:00
matevip
f18626304e feat(agent,ui): recovery affordance card for non-transient LLM errors 2026-05-10 19:15:57 +08:00
matevip
48510c9751 feat(channel): per-sender attribution + debounce boundary for group chats 2026-05-10 19:15:51 +08:00
matevip
00098fe5f1 feat(agent,channel): scrub fake generated-file URLs + paste-body hint for public-account articles 2026-05-10 19:15:44 +08:00
matevip
19a8c9e16c fix(agent): retry transient TLS / socket errors instead of failing the LLM call 2026-05-10 19:15:38 +08:00
matevip
6b3fba2ed4 feat(channel): wecom group reply fallback + upload size pre-check + appmsg parsing 2026-05-10 19:15:32 +08:00
matevip
63f14acb72 fix(settings): stop bulk save from clobbering multimodal sidecar config 2026-05-10 19:15:27 +08:00
matevip
4e1afa6b6f feat(channel): parse wecom quoted-message context for inbound replies 2026-05-10 19:15:20 +08:00
matevip
2b84d94897 fix(channel): adaptive debounce window for paste-split long messages 2026-05-10 19:15:15 +08:00
matevip
3d1f0469ca feat(channel): wecom group reply slot + upload size limits + appmsg inbound
Group-chat reply slot fallback:
- The platform blocks proactive sends in group chats; outbound paths
  (cron summaries, async-task completions, generated image/music/3D
  delivery, TTS audio) silently failed because they fell through to
  the proactive-send command. New bounded LRU maps each group chat
  to its most recent inbound frame id; the dispatcher prefers that
  reply slot and falls through to proactive only for single chats.
- Centralised text and media dispatch through a single helper so the
  group rule never has to be re-implemented per outbound path.

Upload size pre-check + auto-downgrade:
- Without client-side limits, oversized uploads streamed for ~1 minute
  before the server rejected at the finish step — users saw nothing
  arrive in their chat. The new decision layer mirrors the platform's
  hard limits and produces three outcomes: rejected with a friendly
  reason, downgraded to a generic file delivery with an inline note,
  or pass-through unchanged.
- Files over 20MB reject. Images / videos over their 10MB limit
  downgrade to file. Voice content that isn't AMR or exceeds 2MB
  downgrades. AMR voice within 2MB stays native.

appmsg inbound parsing:
- Forwarded complex messages (document transfers, article links,
  miniprogram cards) used to fall into the inbound switch's default
  branch and silently drop. The new branch flattens four sub-types
  into a text marker the agent reads plus any media that needs to
  reach downstream tools — document forwards reuse the same magic-
  byte sniff and per-conversation upload layout as native file
  inbound, so extension recovery and chat-uploads serving work
  identically.
- Article links produce "[链接] title\ndescription\nurl" so the agent
  can summarize without round-tripping. Miniprograms surface their
  title. Unknown sub-types still emit a generic marker so the agent
  is never blind.
2026-05-10 15:13:14 +08:00
matevip
9075abfef2 feat(channel + settings): wecom quote message parsing + sidecar config preservation
WeCom quoted-message context:
- Parse the body.quote field that arrives alongside any inbound message
  (text / image / voice / file / mixed sub-types). When a user long-
  presses a previous bot bubble and types a follow-up like "解释一下",
  the agent now sees both the user's new text and the referenced
  content as proper context — replies stay on topic instead of
  guessing what was being explained.
- Quoted images / files are downloaded through the same pipeline as
  inbound new media (magic-byte sniff, ZIP container peek for
  DOCX / XLSX / PPTX recovery, chat-uploads layout) so the vision
  sidecar and document tools can actually analyse what was quoted.
- Reading order in the assembled prompt: "[引用消息: ...]\n<user text>"
  first, then quoted media parts, then the user's own current-message
  media. Mixed quotes flatten into a space-joined summary.

Multimodal sidecar settings preservation:
- The bulk settings PUT used to unconditionally overwrite the vision /
  video sidecar model ids — null in a partial payload became "" in
  the DB, silently wiping the configured sidecar every time a user
  saved an unrelated settings page (System / Music / Image / etc.).
  Symptom: "I picked a vision model, saved a different settings tab,
  now the bot can't see images anymore."
- Bulk save now guards both keys with non-null checks, matching the
  pattern used for music / 3D / image / video / tts / stt blocks.
- A dedicated /settings/sidecar endpoint always writes both keys, so
  the sidecar UI can still explicitly clear via null without leaking
  the write-on-null semantics into every other settings save.
- Frontend sidecar card switches to the dedicated endpoint; other
  settings pages keep their existing partial-payload behaviour.
2026-05-10 11:38:35 +08:00
matevip
2e0a4674e5 feat(channel): IM channel media + paste-merge + native file delivery
Inbound (WeCom):
- Save uploaded media under data/chat-uploads/{conversationId}/ with full
  fileName/path/fileUrl/storedName/fileSize on the content part. Web mirrors
  of an IM conversation now show real thumbnails instead of "未命名".
- Magic-byte sniff (PDF / PNG / JPEG / GIF / Office / ODF / archives /
  audio / video) recovers a real extension when the platform omits filename
  for forwarded files — no more PDFs labelled "file.bin".
- ZIP container peek distinguishes DOCX / XLSX / PPTX / VSDX / ODT / ODS /
  ODP / EPUB / JAR from a plain zip via discriminator paths and the OASIS
  mimetype entry.

Outbound (WeCom):
- Chunk upload field name corrected so server-side actually stores the
  bytes — file messages used to arrive with correct filename/size but
  empty content, breaking every PDF / DOCX / PPTX recipient.
- Scan agent text for served-file URLs in both the text-reply and
  content-parts paths; fetch bytes from the in-memory generated-file
  cache and dispatch through the native chunk upload + media message
  protocol so users receive a tappable file card instead of an
  unopenable markdown link. Cache miss surfaces a clear retry hint.

Async tool result forwarding:
- New AsyncTaskMediaDispatcher routes generation completions (image,
  video, music, 3D model) to whichever IM channel the conversation is
  bound to via ChannelSessionStore + ChannelManager. Web / webchat
  conversations are intentionally skipped — their SSE stream already
  renders the result.
- Wired into all four generation services so IM users actually receive
  generated media as native attachments. Each part now carries an
  absolute disk path so adapters read bytes locally instead of round-
  tripping through an authenticated served URL.

Slack native file upload:
- SlackChannelAdapter overrides the content-parts dispatch. Image /
  audio / video / file / model3d parts ride filesUploadV2 so users see a
  file card with preview thumbnail bound to the same thread as the
  originating message. Text parts continue through chat.postMessage.
- Resolves bytes from the part's local path, falls back to an HTTP fetch
  of fully-qualified URLs.

IM approval hint visibility:
- IM-driven approve / deny / auto-cancel / replay-error hints now go
  through saveMessage + tracker broadcast in addition to the channel
  adapter, so a Web mirror viewing the same conversationId sees the
  resolution. Previously hints reached only the IM channel; the Web
  admin console had no record of the outcome.

Adaptive paste-merge debounce:
- WeCom and other IM clients silently split long pasted prompts into
  fragments that arrive 0.5-2 seconds apart, missing the existing 500ms
  merge window. The agent then saw torn context and emitted multiple
  conflicting replies.
- When the merged buffer crosses a content-length threshold, extend the
  debounce window so subsequent fragments arrive in time. Default
  500ms unchanged for normal short messages.
2026-05-10 09:00:22 +08:00
matevip
ee48b114f6 chore: scrub external project references from wecom comments 2026-05-10 08:28:26 +08:00
matevip
f6b4f7e402 feat(channel): forward async tool results to IM channels + slack file upload 2026-05-10 08:28:20 +08:00
matevip
134fa1a975 fix(channel): wecom file pipeline + IM approval hint visibility 2026-05-10 08:28:14 +08:00
matevip
225d14026b feat(channel): wecom approval card + keepalive + chunk dedup 2026-05-10 08:28:07 +08:00
matevip
20393ea679 test(channel): wecom reply queue concurrency stress suite 2026-05-10 08:28:01 +08:00
matevip
78f6ca8d33 feat(channel): reply queue foundation + lifecycle gate 2026-05-10 08:27:48 +08:00
matevip
ae4d432ee2 fix(security): root-cause guards against blank tool guard rule rows 2026-05-10 08:27:42 +08:00
matevip
4567bd6019 fix(security): require tool guard rule id (#88) 2026-05-10 08:02:15 +08:00
matevip
f7c1af80a4 fix(wiki): preserve user-owned files when deleting directory-scanned raws (#84) 2026-05-09 17:15:57 +08:00
matevip
c2aecf18ef feat(agent,llm): multimodal sidecar routing for unsupported attachments (#87) 2026-05-09 16:41:26 +08:00
matevip
97e2b12f71 feat(chat): show reply model attribution in assistant message bubbles 2026-05-09 16:41:18 +08:00
matevip
d2886bdaa3 fix(llm): let custom OpenAI-compatible providers opt out of API Key requirement (#89) 2026-05-09 14:26:35 +08:00
matevip
88fb28a22a feat(stt): route OpenAI Whisper provider to any OpenAI-compatible endpoint (#76) 2026-05-09 13:57:52 +08:00
matevip
d5969bb32c fix(chat,llm): liveness-aware model popup with row-based configured check (#81) 2026-05-09 11:07:08 +08:00
matevip
52e06afec4 feat(llm,tool/image): dashscope-compat provider + media-gen test profile 2026-05-09 06:28:38 +08:00
matevip
3f289da6b7 feat(tool/image,video): image edit support + new DashScope models (#75) 2026-05-08 22:05:06 +08:00
matevip
1605146931 fix(workflow/draftgen): teach prompt Pebble logical operator syntax 2026-05-08 15:09:29 +08:00
matevip
2804905500 fix(workflow,trigger): template preview-compile + 3 alpha consistency cleanups 2026-05-08 15:09:14 +08:00
matevip
2416d603c4 fix(workflow,trigger): generator triggerDrafts loop closure + 5 paper cuts 2026-05-08 15:09:06 +08:00
matevip
826c20639a feat(workflow): natural-language → workflow draft generator + agent tool 2026-05-08 15:08:58 +08:00
matevip
dcf1f56944 fix(workflow,trigger): fan_out isolation + workspace spoof + approval→resume bridge + payload strict + draft clear 2026-05-08 15:08:41 +08:00
matevip
3ed540e6eb feat(workflow,trigger): async dispatch + GC schedulers + trigger list polish 2026-05-08 15:07:55 +08:00
matevip
ed64cda043 fix(workflow): PublishContext arg order + drop workspace-agnostic agent fallback 2026-05-08 15:07:32 +08:00
matevip
231724d6a9 feat(agent,trigger): wire agent_lifecycle as a real event source 2026-05-08 15:07:18 +08:00
matevip
dae74cf26c feat(channel,trigger): wire channel_message + content_match event sources 2026-05-08 15:07:11 +08:00
matevip
87727414d5 feat(workflow,trigger): wire workflow_completion as a real event source 2026-05-08 15:06:53 +08:00
matevip
e3af03645b feat(workflow): wire await_approval into the approval inbox 2026-05-08 15:06:46 +08:00
matevip
2a803d2904 fix(trigger): honest fireCount + last_error via DispatchResult 2026-05-08 15:06:28 +08:00
matevip
dac774f15e feat(workflow): trigger workspace isolation + step property editor + custom dialogs 2026-05-08 15:06:16 +08:00
matevip
844a64ad37 fix(workflow): hard-delete + blank-draft compile + canvas blank pane 2026-05-08 15:05:53 +08:00
matevip
20884c1773 feat(workflow): payload fs fallback for medium-size payloads 2026-05-08 15:05:28 +08:00
matevip
e09c62b529 feat(trigger): match pattern_json before fan-out + periodic sync 2026-05-08 15:05:20 +08:00
matevip
05a2caa47c fix(workflow): tighten workspace isolation across CRUD / run / resume 2026-05-08 15:05:13 +08:00
matevip
67c0efe8ae feat(workflow): add publish API + workflow / trigger REST controllers 2026-05-08 15:04:55 +08:00
matevip
ce08b311d3 feat(trigger): add event ingest pipeline with dedup / rate limit / bot-self 2026-05-08 15:04:48 +08:00
matevip
54b12f5270 feat(trigger): add cron trigger engine with lamport coordination 2026-05-08 15:04:41 +08:00
matevip
67279bb9c9 feat(workflow): add write_memory adapter with four merge strategies 2026-05-08 15:04:33 +08:00
matevip
7c3c68bcfe feat(workflow): add dispatch_channel adapter for multi-channel delivery 2026-05-08 15:04:26 +08:00
matevip
48559343e2 feat(workflow): add await_approval pause / resume to the runtime 2026-05-08 15:04:16 +08:00
matevip
4e457c2e8b feat(workflow): add linear runtime for the four base step modes 2026-05-08 15:04:07 +08:00
matevip
3065d095fd feat(workflow): add publish-time compiler for the linear step DSL 2026-05-08 15:03:53 +08:00
matevip
f3b1cba6dc fix(conversation): render image/video/audio attachment markers for LLM (#66) 2026-05-08 15:03:42 +08:00
matevip
d87ed0365a feat(workflow): add foundational schema for workflow runtime 2026-05-08 15:03:34 +08:00
matevip
91e93e8831 feat(wiki): circuit-breaker for failing embedding provider (#72) 2026-05-08 15:03:19 +08:00
matevip
0357c9891d feat(wiki): user-initiated cancel for in-progress raw material processing (#72) 2026-05-08 15:03:10 +08:00
matevip
2af2620b4c fix(tool/mcp): split full URL into base + endpoint for HTTP transports (#70) 2026-05-08 15:03:03 +08:00
matevip
d13637f778 fix(skill/mcp): preserve Chinese MCP server names in zh-CN skill list (#65) 2026-05-08 15:02:56 +08:00
matevip
96840b0126 chore: bump version to 1.3.0-SNAPSHOT 2026-05-08 15:02:08 +08:00
matevip
023f0cfb06 fix(conversation): render image/video/audio attachment markers for LLM (#66) 2026-05-07 17:13:17 +08:00
matevip
b63d83a596 feat(wiki): circuit-breaker for failing embedding provider (#72) 2026-05-07 16:39:39 +08:00
matevip
76f5b3ca94 feat(wiki): user-initiated cancel for in-progress raw material processing (#72) 2026-05-07 16:32:35 +08:00
matevip
274aeb7695 fix(tool/mcp): split full URL into base + endpoint for HTTP transports (#70) 2026-05-07 14:39:27 +08:00
matevip
c830dd902c fix(skill/mcp): preserve Chinese MCP server names in zh-CN skill list (#65) 2026-05-07 14:25:32 +08:00
matevip
c82bf4d18f feat(tool/document): generate xlsx, pptx, pdf documents from markdown 2026-05-07 13:59:28 +08:00
matevip
a65aaa7aa4 fix(tool/extract): route xlsx/pptx extraction directly through Tika 2026-05-07 13:59:20 +08:00
matevip
ad1264ff51 fix(skill): refuse mutating MCP/ACP virtual skills and hide their card-level edit affordance 2026-05-07 08:18:00 +08:00
matevip
5cb82ed8f8 feat(agent,mcp): validate tool bindings on save and keep returnDirect raw-name config working 2026-05-07 08:17:53 +08:00
matevip
9adcc0a2a8 feat(skill,tool): expose MCP-derived skills and tools through the agent picker endpoints 2026-05-07 08:17:38 +08:00
matevip
845b5bb1b1 feat(mcp): stable prefixed callback names and persisted per-server tool cache 2026-05-07 08:17:30 +08:00
matevip
d58fd0c3fd fix(task): gate every worker completion branch with isConversationCanceled 2026-05-06 17:40:47 +08:00
matevip
01c8765c96 fix(task): cancel running async workers on conversation delete to prevent orphan writes 2026-05-06 16:45:31 +08:00
matevip
bf8a533b19 fix(approval): clear in-memory pendingMap on conversation delete via domain event 2026-05-06 16:45:23 +08:00
matevip
73d69c1dfe fix(conversation): cascade-clean orphan rows on conversation delete 2026-05-06 16:45:16 +08:00
matevip
0665a6be09 fix(mcp): expand JVM system properties in stdio args/env/cwd 2026-05-05 15:21:20 +08:00
matevip
fd05c3c9e1 fix(llm): record token usage on ChatGPT OAuth chat turns 2026-05-05 15:21:14 +08:00
DayByDay
a77f632c0a
fix(mcp): support Java system property placeholders in env expansion
Resolve ${user.home} and other JVM system properties in MCP server env, headers, and cwd — previously only OS env vars were expanded, causing the filesystem MCP server to fail on Windows where $HOME isn't set.
2026-05-05 14:54:54 +08:00
matevip
10fe511d48 chore(mcp): revert McpClientManager polish to enable PR #60 merge
Temporarily restore McpClientManager.java to its pre-#60 state so the
contributor's PR can squash-merge cleanly with their authorship preserved.
The args-expansion follow-up will land as a separate commit right after.
2026-05-05 14:53:58 +08:00
matevip
609da7029f fix(mcp): expand JVM system properties in stdio args/env/cwd 2026-05-05 14:46:08 +08:00
matevip
bbf978ed89 fix(image): handle data: URLs and broadcast sync image-gen completion 2026-05-05 13:06:53 +08:00
matevip
66510c96fa fix(image): set stream=true on ChatGPT OAuth /codex/responses request 2026-05-05 13:06:46 +08:00
matevip
80cb3c84eb fix(agent): decouple framework recursion limit from per-agent max_iterations 2026-05-05 13:06:40 +08:00
matevip
0f388382a2 feat(image): gpt-image-2 generation through ChatGPT subscription OAuth 2026-05-05 13:06:26 +08:00
matevip
704c6317e3 feat(llm): live model discovery for ChatGPT OAuth provider 2026-05-05 13:06:19 +08:00
matevip
bf7bc73f5f fix(llm): JSON body + 403/404 status mapping for OpenAI device code 2026-05-05 13:06:11 +08:00
matevip
e9a11f8db4 fix(chat): persist empty assistant turns 2026-05-05 11:12:45 +08:00
matevip
2ab0bd000b fix(chat): suppress duplicate assistant row on force-recycle 2026-05-05 10:39:54 +08:00
matevip
be2235a493 feat(llm): OAuth device authorization grant for ChatGPT remote deploy 2026-05-05 10:39:47 +08:00
matevip
eb64556636 fix(wiki): skip per-turn retrieval for continuation messages + drop weak tail hits 2026-05-04 20:54:44 +08:00
matevip
2e0ff8f90f fix(agent): unblock multi-role parallel delegation + propagate force-stop 2026-05-04 20:54:38 +08:00
matevip
be1fc86836 feat(agents): pixelart icons, per-role colors, runtime identity merge, locale templates 2026-05-04 15:26:02 +08:00
matevip
2a8f6774e7 feat(agents): role/goal/backstory profile, employee-card tagline, 5 career templates 2026-05-04 15:25:53 +08:00
DayByDay
1aa7787ced
fix(mcp): clear stale MCP connection errors
Update MCP server status with an explicit wrapper so successful reconnects can persist lastError=null while keeping updateTime refreshed.
2026-05-04 14:16:43 +08:00
matevip
42d406ffc8 fix(agent): drop brittle output policing, add evidence-grounded long-task safeguards 2026-05-04 11:55:44 +08:00
matevip
3d50b9c132 feat(skill): catalog sort + usage stats 2026-05-04 11:55:35 +08:00
matevip
68e1c6f50d fix(skill): harden ckjia skill binding and virtual dedup 2026-05-03 20:32:23 +08:00
matevip
6fe9b6e5f7 fix(llm): skip Ollama auto-discovery network probe when provider disabled 2026-05-03 20:32:17 +08:00
matevip
7d02841d1d fix(chat): per-event SSE ids for safe reconnect dedup + queue race recovery 2026-05-03 19:57:06 +08:00
matevip
a2c96946e3 fix(repetition-detector): catch markdown-list duplication separated by transition paragraph 2026-05-03 17:15:33 +08:00
matevip
a5e7f82a69 fix(cron): self-heal missing tasks_<wsId> conversation row before saving messages 2026-05-03 17:15:25 +08:00
matevip
74edc09b2b feat(backstage): admin runtime console for live agent visibility + force-recycle 2026-05-03 17:15:17 +08:00
matevip
66f09a968a feat(chat-stream): streaming UX overhaul + multi-agent stability layer 2026-05-03 17:15:02 +08:00
matevip
c07048f258 feat(skill,mcp): ckjia-shopping skill bundle + same-name dedup against bridged MCP/ACP virtual skills 2026-05-03 17:14:19 +08:00
matevip
03a82ece93 fix(wiki): retry route LLM call once with strict-JSON correction when first response isn't JSON 2026-05-03 09:12:51 +08:00
matevip
912a6336d3 fix(wiki): also remove the upload file from disk when a raw material is deleted 2026-05-03 09:12:44 +08:00
matevip
b0ca4c06d4 fix(wiki): cascade-delete pages + chunks when a raw material is removed 2026-05-03 09:12:32 +08:00
matevip
41ed929882 fix(wiki): deterministic, health-aware chat-LLM fallback 2026-05-02 23:31:48 +08:00
matevip
29d2d49d25 fix(wiki): widen mime_type to VARCHAR(255) so Office uploads don't blow the column 2026-05-02 23:11:40 +08:00
matevip
c60fc4cf83 feat(wiki): one-hop chat-LLM fallback when the primary provider is wedged 2026-05-02 21:46:22 +08:00
matevip
ac654f3957 feat(wiki): add Zhipu GLM-V and Volcano Doubao vision providers 2026-05-02 21:46:15 +08:00
matevip
2ae8758cd1 feat(wiki): admin endpoints for hot cache — get / regenerate / reset 2026-05-02 21:46:02 +08:00
matevip
5e936fd50a feat(wiki): hot cache rebuild engine — LLM updater, scheduler, conversation-end listener 2026-05-02 21:45:55 +08:00
matevip
93807d85ef feat(wiki): inject KB hot cache into agent system prompt via MemoryProvider SPI 2026-05-02 21:45:49 +08:00
matevip
a8f0998c24 feat(wiki): hot cache storage skeleton — table, entity, value object, read service 2026-05-02 21:45:43 +08:00
matevip
062b5169fa fix(llm): drop bogus qwen3-plus seed and gate enable_search to supporting models (issue #53) 2026-05-02 19:40:03 +08:00
matevip
44ea8c784b fix(wiki): skip vision pipeline entirely when wiki.ocr.enabled is off 2026-05-02 19:05:05 +08:00
matevip
f910d762a3 feat(wiki): feature-flag toggle UI + defer extracted_text cache when vision unavailable 2026-05-02 19:04:58 +08:00
matevip
bcefe43234 feat(wiki): inline image refs in search results + click-to-zoom lightbox 2026-05-02 19:04:51 +08:00
matevip
51995275bd feat(wiki): caption inline PDF images via the vision-in pipeline 2026-05-02 19:04:45 +08:00
matevip
4dc280a3d1 feat(wiki): wire image uploads to vision-in pipeline 2026-05-02 19:04:39 +08:00
matevip
088ffcaee1 feat(wiki): add image-to-text vision SPI with DashScope provider 2026-05-02 19:04:32 +08:00
matevip
b26a4ee4d1 feat(wiki): add SHA-256 keyed image caption cache 2026-05-02 19:04:25 +08:00
matevip
6f0ead162e feat(wiki): instrument compile / relation / retrieval with WikiMetrics 2026-05-02 19:04:19 +08:00
matevip
4f96a46900 feat(system): add runtime-toggleable feature flag store 2026-05-02 19:04:12 +08:00
matevip
d0706239ea feat(wiki): add mate_wiki_relation cache table for page-to-page edges 2026-05-02 19:04:06 +08:00
matevip
19b82cdc2a feat(wiki): add WikiMetrics gateway for compile/relation/retrieval/vision 2026-05-02 19:03:59 +08:00
matevip
bc417d00ef chore: neutralize internal references in code comments and migrations 2026-05-02 15:42:10 +08:00
matevip
2246df9d09 fix(agent): allow PUT modelName=null to revert to global default 2026-05-02 15:42:04 +08:00
matevip
cbc34a12c9 docs(mcp): align /tools javadoc with HTTP 200 + biz-code convention 2026-05-02 15:41:53 +08:00
matevip
a8d94681e5 fix(auth): suppress tokenHash from PAT JSON responses 2026-05-02 15:41:47 +08:00
matevip
9411dfff7b fix(auth): move PersonalAccessTokenMapper under repository/ for @MapperScan 2026-05-02 15:41:41 +08:00
matevip
3c33422a08 feat(auth): personal access tokens for headless / CI integration 2026-05-02 15:41:34 +08:00
matevip
4522dfaebc feat(channel): MediaPathGuard utility for unified media validation 2026-05-02 15:41:27 +08:00
matevip
ab62f26ae0 feat(delegate): inherit parent conversation context into child agent 2026-05-02 15:41:20 +08:00
matevip
22231e28a7 feat(hook): HMAC-SHA-256 body signing for outbound webhooks 2026-05-02 15:41:13 +08:00
matevip
25e93c4a89 feat(cron): suppressAgentReply flag for silent cron jobs 2026-05-02 15:41:06 +08:00
matevip
55f4ba1195 feat(llm): per-Model HTTP read-timeout override 2026-05-02 15:40:59 +08:00
matevip
0c7554212b feat(mcp): GET /mcp/servers/{id}/tools surfaces discovered tools 2026-05-02 15:40:53 +08:00
matevip
311cad7ea6 feat(agent): cap tool_calls per single LLM response 2026-05-02 15:40:45 +08:00
matevip
82ed239b5b feat(shell-tool): honor user $SHELL on POSIX 2026-05-02 15:40:38 +08:00
matevip
2cd51743d1 feat(cron): distributed lock for multi-instance cron firing 2026-05-02 15:40:31 +08:00
matevip
92bd8e9b6e feat(agent): re-enable per-Agent model override 2026-05-02 15:40:24 +08:00
matevip
b0f5dadbe6 fix(feishu): default-on image download for vision pipelines 2026-05-02 15:40:17 +08:00
matevip
fcab47ffb9 fix(feishu): split long messages instead of silent truncate 2026-05-02 15:40:11 +08:00
matevip
eaacb3a78f fix(agent): include tools schema in context-window budget 2026-05-02 15:40:03 +08:00
matevip
c2ebe51f63 fix(plan): per-step wall-clock timeout (default 10 min) 2026-05-02 15:39:57 +08:00
matevip
c4f2117a23 fix(agent): tolerate LLM-mangled tool names 2026-05-02 15:39:49 +08:00
matevip
ba167e09f4 perf(skill): startup snapshot + builtin scan skip + prompt slim-down 2026-05-02 00:12:39 +08:00
matevip
f0fbca803c feat(skill): wizard multi-file bundle + secret store + starter library 2026-05-01 22:39:23 +08:00
matevip
28c3b0e62f feat(model3d): Tencent Hunyuan 3D provider — Pro/Rapid action routing + <model-viewer> preview 2026-05-01 22:39:13 +08:00
matevip
e3ab06d57c feat(generative): unified async pipeline + live SSE delivery for music/video/image 2026-05-01 20:15:20 +08:00
matevip
1f368336de fix(wecom): listener identity dedup + cancel ghost reconnect on self-initiated close 2026-05-01 20:15:13 +08:00
matevip
e5dff7acb1 fix(acp): detect keychain OAuth hijack on claude-code 'Request not allowed' 2026-05-01 20:15:01 +08:00
matevip
3d0797787b fix(agent): align skill tool whitelist with real @Tool method names + restore globally-promised tools 2026-05-01 20:14:56 +08:00
matevip
888200e1cd feat(acp): visual env editor with per-endpoint key suggestions 2026-05-01 20:14:49 +08:00
matevip
5e6764ecf1 fix(skill): tool-gate whitelist + markdown link host normalization
When an agent had any skill bound, the runtime tool gate was silently
hiding @Tool beans that aren't declared in any skill manifest, even
though the global system prompts (SOUL.md / "Web Search Capability" /
"File Reading Guidelines") explicitly tell the LLM these tools are
available. Result: the model would call search / renderDocx / read_file
/ etc., hit "Tool not found", then either give up or fall back to
unhelpful behaviour (e.g. dumping markdown text instead of producing a
.docx download).

This commit:

- Adds universally-promised, agent-wide tools to SYSTEM_LEVEL_TOOLS so
  they bypass the manifest restriction: document/media generation
  (renderDocx*, image_generate, music_generate, video_generate),
  global capability tools the system prompt mentions (search,
  browser_use, read_file / write_file / edit_file /
  execute_shell_command, detect_file_type, extract_*_text,
  readMateClawDoc), skill discovery siblings (listSkillFiles,
  listAvailableSkills), and the delegate triplet (delegateToAgent,
  delegateParallel, listAvailableAgents).

- Fixes 5 entries in the prior whitelist whose names did not match
  any real @Tool bean and were therefore silently dead:
    read_workspace_file   -> read_workspace_memory_file
    write_workspace_file  -> write_workspace_memory_file
    list_workspace_files  -> list_workspace_memory_files
    delegate_agent        -> delegateToAgent
    datetime              -> getCurrentDate / getCurrentDateTime / getCurrentTime
  Also adds the missing edit_workspace_memory_file.

- In the chat markdown renderer, strips any hallucinated
  https?://<host> prefix from /api/v1/files/generated/<id> download
  links before building the <a href>. Multiple LLMs have been
  observed prepending bogus hosts when echoing tool-returned download
  URLs back to the user, breaking the click. One-line defensive
  normalization independent of which model is in use.

Verified end-to-end on a previously-broken agent: search / browser_use
/ execute_shell_command / renderDocx all dispatch correctly now and
the final markdown link is a clean same-origin path. 36 whitelist
entries cross-checked against real @Tool method names.
AgentBindingServiceTest green.
2026-05-01 12:24:25 +08:00
matevip
efb91796fb feat(skill): pixelarticons icon library + picker component 2026-05-01 09:52:12 +08:00
matevip
f8069b1b5d fix(skill): /skills/counts includes virtual MCP rows in MCP and All badges 2026-05-01 09:51:58 +08:00
matevip
7dd70ecd2f feat(activity): real pagination + frosted-glass styling 2026-05-01 09:51:07 +08:00
matevip
b321d5792e fix: address review comments (4 items) 2026-05-01 09:50:53 +08:00
matevip
b759eb8719 feat(skill): MCP-Skill bridge + system tool dedup + Lessons i18n 2026-05-01 09:50:45 +08:00
matevip
f8524bf122 fix(skill): blank Tools / Features / Memory detail tabs 2026-05-01 09:50:32 +08:00
matevip
0b6d9faaf3 feat(skill): type=acp delegates to ACP endpoint 2026-05-01 09:50:18 +08:00
matevip
b8ce36f6cd feat(activity): three-source merged feed + detail drawer 2026-05-01 09:50:11 +08:00
matevip
e74f273ae2 feat(skill): card surface — Source / Used-by / Lessons count 2026-05-01 09:49:51 +08:00
matevip
442ffa9c9e fix(skill): clean separation of install / uninstall / hard-delete 2026-05-01 09:49:44 +08:00
matevip
7ca568c69b fix(skill): knowledge wrappers + provider routing + feature gates 2026-05-01 09:49:37 +08:00
matevip
38b66a2416 fix(cron): dedup scheduled jobs + connection pool guard (issue #50) 2026-05-01 09:49:30 +08:00
matevip
020a87ee7e feat(skill): ACP integration for external coding agents 2026-05-01 09:49:22 +08:00
matevip
f0991f543f feat(skill): skill template gallery + author wizard MVP 2026-05-01 09:49:14 +08:00
matevip
359600c77f feat(skill): per-skill LESSONS.md + self-evolution v1 2026-05-01 09:49:07 +08:00
matevip
d927521d51 feat(skill): install/uninstall split + Requirements API + provider router 2026-05-01 09:48:59 +08:00
matevip
688b37b652 feat(skill): features matrix + effective-tool expansion 2026-05-01 09:48:39 +08:00
matevip
323ba1b82e feat(skill): manifest schema + parser (additive) 2026-05-01 09:48:32 +08:00
matevip
4f3276b9e6 fix(skill): mark docs-only vs scripts+docs in Available Skills prompt (issue #49) 2026-04-30 18:04:11 +08:00
matevip
46ac58500c fix(skill): correct pagination total and sort order on SkillMarket (issue #48) 2026-04-30 17:45:02 +08:00
matevip
a0c6ed5a86 fix(agent): vision gate + history media drop + friendlier skip notice 2026-04-30 17:26:13 +08:00
matevip
47bdb97a3a fix(agent): per-model multimodal capability resolution (issue #44) 2026-04-30 17:25:51 +08:00
matevip
101aa3209e fix(skill): stop the LLM from calling skill names as tools (issue #46)
When a user-installed skill (e.g. RedisOps) was bound to an agent, the
model frequently called the skill name directly as a tool, hit
"Tool not found: RedisOps", and either gave up or fell back to shell
guessing. Two compounding causes:

1. The system prompt block injected by SkillRuntimeService listed each
   skill as `- **RedisOps** — desc`, which is the same format used for
   tool catalogs and primed the model to call the names directly. The
   "how to use" instructions referenced `read_skill_file` /
   `run_skill_script` — names that don't exist in the tool registry,
   so even a compliant LLM couldn't follow them.

2. ToolExecutionExecutor's `callback == null` branches returned a bare
   "Tool not found: <name>" string. The model had no recovery signal
   and no hint that the name it called was actually a skill.

Fix is two-layered:

- Prompt rewrite (SkillRuntimeService.buildSkillPromptEnhancement): lead
  with an explicit warning that skills are NOT directly callable, use the
  correct camelCase tool names (readSkillFile / runSkillScript), include
  a concrete worked example anchored to the first enabled skill, and
  render the listing as a markdown table so it stops looking like a
  callable tool list. listAvailableSkills tool description and output
  follow the same pattern.

- Runtime safety net (ToolExecutionExecutor): when toolCallbackMap.get
  misses, check if the requested name (case-insensitive) matches an
  active skill. If so, return a precise hint telling the LLM the right
  invocation pattern instead of the bare error. Wired through both the
  main execute path and the pre-approved replay path. SkillRuntimeService
  is attached via a setter from AgentGraphBuilder so the executor's many
  legacy constructors stay untouched, and it's nullable so isolated
  tests still work.

Adds 5 unit tests covering: skill match -> hint, case-insensitive match,
no-match -> bare error, no SkillRuntimeService wired -> bare error,
pre-approved replay path -> hint.

Reported and reproduced by @pipima9950-glitch in issue #46.
2026-04-30 16:36:30 +08:00
matevip
d20b440ce5 fix(skill): preserve skillContent/configJson on security scan write-back (issue #45)
SkillPackageResolver.persistScanOutcome built a fresh SkillEntity with only
id + scan fields, then called updateById. SkillEntity declares six columns
with @TableField(updateStrategy = FieldStrategy.ALWAYS) — name_zh, name_en,
config_json, source_code, skill_content, security_scan_result — so the
ALWAYS strategy emits UPDATE statements that write NULL to every one of
those columns not set on the partial entity.

Effect: every security re-scan that produced a status/findings change
silently wiped skill_content, config_json, source_code, name_zh, name_en
on the row. After importing a custom skill, the first scan tick destroyed
the imported content.

Fix: switch to LambdaUpdateWrapper so the UPDATE only touches the three
scan columns we actually want to change. Other skillMapper.updateById
call sites (SkillService, BuiltinSkillSeedService) pass DB-hydrated
existing entities and are unaffected.

Reported and diagnosed by @pipima9950-glitch in issue #45.
2026-04-30 15:28:56 +08:00
matevip
977e181949 feat(cron): unify output, add reminder task type, in-flight progress UI
Three layers landed together because they share the same routing /
lifecycle plumbing:

1. Cron output unification
   - New CronConversationResolver routes web-origin jobs to the per-workspace
     tasks_<wsId> conversation; IM-bound jobs go to the channel session
     conversation when one exists (matched by senderId then targetId);
     legacy cron_<id> remains as the fallback.
   - CronJobLifecycleService inserts a system-role header divider when a
     run starts so users browsing the unified tasks_<wsId> view can tell
     which job started a run. BaseAgent.sanitizeForLlm filters these
     headers so they never reach the model.
   - WorkspaceService seeds tasks_<wsId> on workspace creation; V65
     migration backfills existing workspaces.
   - DeliveryConfig gains a userId field so IM session lookup can match
     by senderId (replyToken-based targetId is not stable across runs).
   - ConversationVO recognizes tasks_/cron_ underscore prefix as cron
     source. MessageList renders the system header as a labeled divider.
   - ChatConsole pins tasks_* conversations and tracks per-conversation
     read state so new cron output gets a visible unread dot.

2. Reminder task type
   - New task_type='reminder' in CronJobEntity + service validation.
   - CronJobRunner short-circuits 'reminder' jobs: hands trigger_message
     to finishRunAndPublish verbatim, no LLM call. Fixes a regression
     where reminders were rephrased into echoed wrappers.
   - New create_reminder tool alongside create_cron_job, with descriptions
     tightened so the model picks the right one (verbatim push vs LLM
     query that needs computation).
   - CronJobs.vue gets a third radio option + dedicated reminder field.

3. In-flight progress placeholder
   - Cron uses non-streaming chat()/execute(); tool-heavy ReAct loops
     can run 1-5 minutes between start and finish with no visible
     state, looking hung.
   - New GET /api/v1/cron-jobs/active-runs returns runs in status=running
     for a conversation. ChatConsole polls it on the existing 4s tick
     (and on conversation switch) and shows a spinner bar with elapsed
     time. When run count drops to zero, it refetches messages so the
     assistant bubble appears within ~1s of finish.
2026-04-30 15:01:24 +08:00
matevip
efbc858868 fix(skill): align ClawHub client with actual marketplace API (issue #42) 2026-04-30 10:25:21 +08:00
matevip
b40cbfb0a1 fix(tool): clean up EXTERNAL_CDP profile dir + Chrome subprocesses on session stop 2026-04-30 10:25:00 +08:00
matevip
6390abdecc fix(llm): apply read timeout to streaming chat WebClient (openai-compat + anthropic) 2026-04-30 08:54:46 +08:00