Commit Graph

52 Commits

Author SHA1 Message Date
matevip
b4ebab65c7 feat(tool): docx image embedding + multi-file render
Two follow-up improvements on top of renderDocxFromFile so the docx
pipeline can handle real long-form deliverables instead of just
prose-only memos.

Image embedding (P1).
MarkdownDocxRenderer now recognizes single-line ![alt](path) markdown
and embeds the referenced file via POI's XWPFRun.addPicture():
- PNG / JPG / GIF / BMP read straight from disk
- SVG rasterized via Apache Batik (PNGTranscoder, target width 1400px)
  before embedding — OOXML stores raster images, so any vector source
  needs conversion. Batik runs in-JVM, no rsvg-convert / cairo on host.
- Pictures are pinned to roughly the printable page width (≈ 5.77 in
  for A4 minus default 1800-twip margins) and given a 4:3 height
  fallback. Mixing images inline with other paragraph text is not
  supported by design — the markdown subset assumes one image per
  block paragraph. Inline images would require splitting paragraphs
  across runs with explicit positioning, well beyond what this
  renderer covers.
- Failure modes (missing file, unsupported format, Batik blowing up)
  emit an italicised "[image: alt — reason]" placeholder so the rest
  of the document still renders; the agent can read its own log to
  see why the picture didn't make it.
- Adds two transitive deps via pom: batik-transcoder + batik-codec at
  1.18, ~10 MB combined. Worth it given the alternative is shelling
  out to system tooling.

Multi-file render (P2-lite).
New tool renderDocxFromFiles(List<String> filePaths, filename, pageSize)
reads several markdown files in order and renders one combined docx.
Lets the agent split a 30-page proposal into cover.md / ch1.md /
ch2.md / appendix.md and produce a single deliverable in one tool
call. Each path goes through WorkspacePathGuard.validatePath; any
empty or unreadable file aborts with a typed error so the agent
fixes its file list before retrying. Files are joined with a blank
line — no separator markup is injected, headings carry over cleanly.

I deliberately did NOT build the heavier mutable-docx state
("appendDocxChapter / finalizeDocx") flavor of P2: the multi-file
form covers the same workflow with no per-conversation state to
clean up, and the agent can iterate by rewriting the chapter file
and re-running the tool. Stateful append can come later if a
streaming use case actually shows up.

renderDocx and renderDocxFromFile @Tool descriptions updated to point
the agent at renderDocxFromFile for >5 KB markdown and to advertise
the new image-embedding capability.
2026-04-27 08:42:03 +08:00
matevip
9ed9ee6ca7 feat(tool): add renderDocxFromFile to bypass LLM token cost on large markdown
renderDocx requires the markdown body to flow through the LLM as a
tool argument. For an 80 KB project proposal that's ≈ 20 K tokens of
streaming output spent just to repeat back content the model already
wrote to disk a turn earlier — multi-minute generation, real money.

renderDocxFromFile takes a file path instead. The agent uses
write_file / edit_file to assemble the markdown locally, then calls
this tool with just the path. JVM reads the file in one IO syscall
and feeds it to the existing MarkdownDocxRenderer. Token cost drops
from ≈ 20 K to ≈ 50 (the path string).

Behavior:
- Path resolution honors WorkspacePathGuard, same boundary as
  read_file / write_file. No path traversal.
- UTF-8 read; rejects empty / missing / non-regular paths with
  typed error messages so the agent can recover.
- Output cached in GeneratedFileCache and returned as a relative
  /api/v1/files/generated/{id} link, with the same anti-host-
  hallucination instruction renderDocx already carries.
- Same supported markdown subset (headings, bold, lists, tables).
  Image references (![alt](path)) still render as raw text — full
  image embedding (P1) and SVG → PNG conversion (also P1) need
  Apache Batik plus image-rendering plumbing in MarkdownDocxRenderer
  and is tracked separately. Chapter-mode merge (P2) likewise needs
  its own plumbing.

The @Tool description tells the agent to prefer this path when
markdown exceeds ~5 KB and shows the full write_file →
renderDocxFromFile workflow inline.
2026-04-27 08:36:37 +08:00
matevip
cc3c9a8618 fix(ux): preserve in-flight turn on tab switch + raise max_iterations cap to 100
Three small but high-impact fixes that all surfaced together while
verifying the long-form generation flow.

1. ChatConsole onBeforeUnmount no longer kills the backend turn.
   Previously, switching tabs / route navigation / any cause that
   unmounted the chat view called stopChatGeneration(), which POSTs
   /chat/{cid}/stop and aborts the in-flight LLM call. The user
   reported a turn dying mid-generation just from switching pages.
   Replaced with resetForNewConversation() — front-end SSE disconnect
   only, no /stop. Backend keeps running; pollActivity / status probe
   reconnects on return. Aligns with the existing comment in
   selectConversation: "let A's backend agent run continue running."

2. Agent max_iterations raised 25 → 100 with a hard ceiling.
   The previous 25-step ceiling caused LimitExceededNode to fire on
   substantive multi-tool tasks (document generation + image conversion
   + retry loops). 100 matches QwenPaw's _MAX_MAX_ITERATIONS upper
   bound. New plumbing:
   - BaseAgent.MAX_ITERATIONS_HARD_CEILING = 100 public constant
   - BaseAgent default field 25 → 100 (Java-side fallback)
   - AgentGraphBuilder clamps any per-agent DB override to the
     ceiling at runtime; if the row holds 200, runtime sees 100 and
     a WARN is logged with the original value.
   - V47 migration (h2 + mysql) idempotently bumps the three default
     seeded agents (1000000001, 1000000002, 1000000003) only if they
     still hold the old defaults (25 / 20). User-customized values
     are not touched.
   - data-en/zh/-mysql-en/-mysql-zh seed files updated to 100 for
     fresh installs.

3. DocxRenderTool tells the LLM not to prepend a host to the URL.
   DeepSeek and Claude have both been observed wrapping the
   /api/v1/files/generated/{id} relative path returned by renderDocx
   into an absolute URL with a hallucinated domain (e.g.
   https://ai-tools-system.com/...), breaking the download link in
   the rendered chat bubble. The tool's return string now appends an
   explicit "must use the relative path verbatim, do not add any
   https:// or http:// prefix" instruction, which Claude and
   DeepSeek both honor.
2026-04-27 08:17:17 +08:00
matevip
76956cf990 fix(tool): read_file falls back to chat-upload attachment by basename 2026-04-26 20:24:00 +08:00
matevip
4d7c6593c4 feat(minimax): expand video model catalog + add CN endpoint support 2026-04-26 08:34:35 +08:00
matevip
fac5ff2838 feat(image-gen): add gpt-image-2 to OpenAiImageProvider 2026-04-26 08:32:44 +08:00
matevip
4a95e7dfe4 feat(tool): tool returnDirect and sensitive-data quarantine 2026-04-25 19:02:35 +08:00
matevip
c13d9b4c88 feat(wiki): expose method=tika short-circuit on extract_document_text 2026-04-25 19:02:35 +08:00
matevip
c752c1f2ae feat(wiki): Tika as last-resort document extractor 2026-04-25 19:02:34 +08:00
matevip
7b038522aa fix(skill): also accept Spring bean names as tool-dep identifiers 2026-04-24 23:24:52 +08:00
matevip
4c861006dc fix(skill): resolve tool deps by runtime function name, not class/bean name 2026-04-24 23:24:34 +08:00
matevip
52a9a785c1 fix(search): bundled SearXNG sidecar actually works out of the box 2026-04-24 22:08:42 +08:00
matevip
d17b06f454 fix(browser): serialize diagnose findings manually; Hutool cannot reflect on records 2026-04-24 21:38:25 +08:00
matevip
83567e95f0 fix(browser): multi-strategy launcher + self-diagnostics for win/linux 2026-04-24 21:37:46 +08:00
matevip
4be867a3e6 feat(wiki): ingest optimization — BatchCreate, document analysis, retry 2026-04-24 06:55:20 +08:00
matevip
edaf762878 feat(tool): native Java DocxRender tool — eliminate Node.js subprocess 2026-04-23 16:31:13 +08:00
matevip
9740d46fbc fix(delegate): distinguish outcome/blank/rawLength in parallel delegation, translate all comments to English 2026-04-23 08:09:48 +08:00
matevip
2e15369465 fix(delegate): fix parallel timeout + add real-time per-child visibility 2026-04-23 08:09:48 +08:00
matevip
8762a79ec9 fix(delegate): reliability patches for multi-agent delegation 2026-04-22 05:08:08 +08:00
matevip
40bbde1278 feat(agent): runtime efficiency — spill oversized tool results, add tool concurrency registry, collect cache metrics 2026-04-19 08:28:45 +08:00
matevip
762218cd32 refactor(db): drop @TableLogic on all entities, purge soft-deleted rows 2026-04-18 23:31:48 +08:00
matevip
a6e9a17208 feat(skill): Agent-autonomous skill synthesis — create/edit/patch via @Tool with security scanning 2026-04-16 17:10:59 +08:00
matevip
0adb3dddf1 feat(plugin): Plugin SDK + UI layout improvements 2026-04-13 18:38:03 +08:00
matevip
80b7b8e126 feat(agent): multi-agent delegation with parallel execution (RFC-004) 2026-04-12 23:40:27 +08:00
matevip
379422101c refactor(ui): minimalist login redesign, MCP fixes, Flyway upgrade compatibility 2026-04-11 23:01:08 +08:00
matevip
b613a5de11 feat(tool): add CronJobTool for chat-based scheduled tasks + Flyway V2/V3 migrations 2026-04-11 19:51:28 +08:00
matevip
d3b72929c7 fix(security): login rate limiting, SQL injection fix, error boundary 2026-04-11 18:31:51 +08:00
matevip
408ad980dd feat(i18n): complete remaining i18n — DefaultToolGuard, LLM/Datasource services, Channels UI 2026-04-11 18:02:03 +08:00
matevip
af9addaaec feat(i18n): structured i18n keys for exceptions and auto-translate 100+ error messages 2026-04-11 17:52:25 +08:00
matevip
81ff1bf491 feat(i18n): complete backend i18n — guard rules, tool errors, response codes 2026-04-11 17:26:58 +08:00
matevip
aa09345403 feat(i18n): add backend internationalization — tool descriptions, error messages, guard rules, runtime context 2026-04-11 17:08:43 +08:00
matevip
cc28f665f1 feat(db): introduce Flyway migration framework and unify H2/MySQL schemas
- Add Flyway baseline migration (V1) for both H2 and MySQL
- Remove 5 legacy SchemaMigration ApplicationRunner classes
- Add WorkspacePathGuard for file tool sandbox enforcement
- Inject workspace basePath context into agent graph state and tool executor
- Add workspace basePath config UI in frontend
- Fix workspace slug preservation on update
2026-04-11 16:34:09 +08:00
matevip
f08581daa7 fix(guard): detect find -delete as dangerous shell command 2026-04-11 00:35:59 +08:00
matevip
367dd4bed0 fix(agent): preserve per-subtask results in multi-task answer synthesis, add listAvailableSkills tool 2026-04-10 17:10:02 +08:00
matevip
3d58a48eae feat(platform): add workspace foundation and channel execution upgrades 2026-04-09 10:29:16 +08:00
matevip
c568b4faa8 fix(db): unify schema and seed data across H2/MySQL, en/zh 2026-04-08 16:30:33 +08:00
matevip
7007ea844d feat: add TTS, STT, music generation, video providers (Runway/MiniMax), image providers (Google Imagen/MiniMax), and tool registry fix 2026-04-08 08:49:09 +08:00
matevip
43acd2bf94 feat(image,tts): add image generation with 4 providers and TTS with 3 providers 2026-04-07 22:14:31 +08:00
matevip
fe3a7f7b01 feat(video): add video generation capability with 4 providers and async task infrastructure 2026-04-07 19:14:27 +08:00
matevip
c3eeca7171 feat(search): add advanced params, caching, security wrapping, and dual-search coexistence 2026-04-07 18:00:04 +08:00
matevip
b750306028 feat(search): add SearchProvider chain with keyless fallback (DuckDuckGo + SearXNG) 2026-04-07 16:52:42 +08:00
matevip
d5f1d19306 feat(memory): add active retrieval tracking, multi-gate filtering, DREAMS.md diary and dreaming status API 2026-04-06 23:35:27 +08:00
matevip
3940cfd1ce feat(datasource): add auto ECharts visualization for SQL query results 2026-04-06 14:53:22 +08:00
matevip
10dfe35d49 feat(datasource): add SQL query skill for natural language database querying 2026-04-06 13:40:40 +08:00
matevip
647fa9ab94 fix(guard): check column existence before ALTER TABLE to suppress H2 duplicate column errors 2026-04-06 12:37:12 +08:00
matevip
4a99382004 fix(browser): fix idle watchdog leak on repeated start/stop cycles 2026-04-06 12:01:09 +08:00
matevip
6756577428 fix(browser): add Windows and Docker Chromium launch args 2026-04-06 11:47:10 +08:00
matevip
7bcdbf4523 fix(pdf,chat): fix OCR trigger misjudgment, false success, and duplicate image injection 2026-04-06 08:18:04 +08:00
matevip
d8cf5acf0f feat(chat,pdf): scanned PDF OCR fallback and authenticated attachment display 2026-04-06 07:48:28 +08:00
matevip
bcf37d95fe fix(guard): align tool guard rule names with runtime @Tool method names and add audit config 2026-04-05 12:00:50 +08:00