mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-13 19:23:42 +08:00
release: v1.7.0
This commit is contained in:
parent
9dfdae0aec
commit
6252dfb81a
18
README.md
18
README.md
@ -217,16 +217,18 @@ Full docs at **[claw.mate.vip/docs](https://claw.mate.vip/docs)** — setup, arc
|
|||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
**v1.6.0 (shipped 2026-06-22)** — make the autonomous employee *fast, sharp-eyed, and embeddable*:
|
**v1.7.0 (shipped 2026-07-04)** — a *productionization pass*: once it's in real collaboration, close every loop you can't see, gather, reach, fit, or connect:
|
||||||
|
|
||||||
- **Faster first token** — two-stage skill loading (base skills resident, scenario skills retrieved on demand by a relevance scorer) plus prefix compression, cutting the cold-start payload that used to blow past a million characters
|
- **All three approval paths close the loop** — workflow `await_approval` actually pushes to channels and resolves → resumes, the WebChat (API-key) channel can approve/deny and replay, and Feishu/WeCom card clicks resolve workflow approvals directly
|
||||||
- **Native code execution** — `execute_code` lets an employee write and run sandboxed code to compute, transform data, and assemble multi-format reports, all JVM-side
|
- **Long tasks are visible** — an always-on Run Overview rail + a per-turn token breakdown (cache hit/miss/write + reasoning split) + sub-agent cost rolled up + one-click generated-file download
|
||||||
- **Vision that persists** — images stay in context across turns; `image_analyze` re-reads an attachment on demand, so "zoom into that chart" follow-ups work without re-uploading
|
- **Fits the real model window** — local-model context-window probing, a unified token budget for prefix injection, small-context degradation, and tool-schema budget gating — no more "guess 32K" pre-flight rejections or silent truncation
|
||||||
- **Embeddable & headless** — the webchat widget becomes a Web/API surface with multi-session support and per-end-user identity (`endUserId`), isolating memory per end user
|
- **Opens up** — a knowledge-base + Deep Research open API (API-key + rate limit + SSE), a pluggable search Provider SPI, and MCP identity forwarding (carry the authenticated user's identity into a STDIO MCP)
|
||||||
- **A Wiki you actually read** — reading split from management, a unified Sources tab with per-KB auto-sync, and clickable cross-KB `[[wikilinks]]`
|
- **Reaches further** — desktop local-embedded / remote-centralized dual mode (with `mateclaw-desktop` source opened) + a LAN deployment mode for controlled intranet access
|
||||||
- **Steadier under load** — self-healing MCP connections · tool-call recovery on interleaved-thinking models · evidence-gated plan execution
|
- **One-click operational data export** — Dashboard 9-sheet Excel + a CLI for offline export
|
||||||
|
|
||||||
Full story in the [v1.6.0 release notes](https://claw.mate.vip/docs/en/releases/1.6.0).
|
Full story in the [v1.7.0 release notes](https://claw.mate.vip/docs/en/releases/1.7.0).
|
||||||
|
|
||||||
|
**v1.6.0 (shipped 2026-06-22)** — make the autonomous employee *fast, sharp-eyed, and embeddable*: two-stage skill loading + prefix compression (faster first token) · `execute_code` native sandboxed code execution · vision that persists across turns + `image_analyze` · embeddable/headless webchat with per-`endUserId` memory · a Wiki you actually read (reading split from management · unified Sources tab · clickable `[[wikilinks]]`) · steadier under load (self-healing MCP · tool-call recovery · evidence-gated plans). Full story in the [v1.6.0 release notes](https://claw.mate.vip/docs/en/releases/1.6.0).
|
||||||
|
|
||||||
**v1.5.0 (shipped 2026-06-04)** — Goal checklists (fuzzy score → ticked boxes) · self-maintaining Wiki (`[[wikilinks]]` · fact/experience layers · pageType profiles & permissions · KB pipelines · local-directory ingest) · per-owner memory isolation (`owner_key` + visibility scope + `endUserId` passthrough) · per-agent primary knowledge base · provider-preference model routing. Full story in the [v1.5.0 release notes](https://claw.mate.vip/docs/en/releases/1.5.0).
|
**v1.5.0 (shipped 2026-06-04)** — Goal checklists (fuzzy score → ticked boxes) · self-maintaining Wiki (`[[wikilinks]]` · fact/experience layers · pageType profiles & permissions · KB pipelines · local-directory ingest) · per-owner memory isolation (`owner_key` + visibility scope + `endUserId` passthrough) · per-agent primary knowledge base · provider-preference model routing. Full story in the [v1.5.0 release notes](https://claw.mate.vip/docs/en/releases/1.5.0).
|
||||||
|
|
||||||
|
|||||||
18
README_zh.md
18
README_zh.md
@ -217,16 +217,18 @@ mateclaw/
|
|||||||
|
|
||||||
## 路线图
|
## 路线图
|
||||||
|
|
||||||
**v1.6.0(2026-06-22 发布)** — 让自驱的数字员工*更快、更会看、更易嵌入*:
|
**v1.7.0(2026-07-04 发布)** — 一次*生产化加固*:把它放进真正的协作里之后,那些看不见、收不拢、够不着、装不下、连不通的地方全补上:
|
||||||
|
|
||||||
- **首字节更快** — 技能两段式载入(基础技能常驻,场景技能由相关性评分器按需检索)+ prefix 压缩,砍掉过去单请求动辄上百万字符的冷启动负载
|
- **审批三条链路彻底闭环** — 工作流 `await_approval` 真的推到渠道并 resolve→恢复执行、WebChat(API-Key)渠道能批准/拒绝并重放、飞书/企微点卡片直接 resolve 工作流审批
|
||||||
- **原生代码执行** — `execute_code` 让员工自己写、自己跑沙箱代码,完成计算、数据加工与多格式报告生成,全程在 JVM 内
|
- **长任务看得见** — 常驻「运行总览」侧栏 + 本轮 Token 明细(缓存命中/未命中/写入 + 推理拆分)+ 子 Agent 成本向上滚加 + 生成文件一键下载
|
||||||
- **能记住图的视觉** — 图片跨轮次保留在上下文里;`image_analyze` 按需重新解析某张附件,"放大看那张图表"这类追问无需重新上传
|
- **装得下真实模型窗口** — 本地模型上下文窗口探测、prefix 注入统一 Token 预算、小上下文降级、工具 schema 预算门——不再被"猜个 32K"坑到预检拒绝或悄悄截断
|
||||||
- **可嵌入、可无头** — webchat 组件升级为 Web/API 接入面,支持多会话与按终端用户身份(`endUserId`)隔离记忆
|
- **开放出去** — 知识库 / Deep Research 开放 API(API-Key + 限流 + SSE)、插件化搜索 Provider SPI、MCP 身份透传(把认证用户身份带给 STDIO MCP)
|
||||||
- **真正可读的 Wiki** — 阅读与管理分离、统一的 Sources 标签页(按知识库自动同步)、可点击的跨库 `[[wikilinks]]`
|
- **够得着更远** — 桌面端本地内嵌 / 远程集中部署双模式(`mateclaw-desktop` 源码开放)+ 局域网部署模式放开受控内网访问
|
||||||
- **高负载更稳** — MCP 连接自愈 · interleaved-thinking 模型的工具调用恢复 · 计划执行的证据闸门
|
- **运营数据一键导出** — Dashboard 9 表 Excel + CLI 命令行离线导出
|
||||||
|
|
||||||
完整故事见 [v1.6.0 release notes](https://claw.mate.vip/docs/zh/releases/1.6.0)。
|
完整故事见 [v1.7.0 release notes](https://claw.mate.vip/docs/zh/releases/1.7.0)。
|
||||||
|
|
||||||
|
**v1.6.0(2026-06-22 发布)** — 让自驱的数字员工*更快、更会看、更易嵌入*:技能两段式载入 + prefix 压缩(首字节更快)· `execute_code` 原生沙箱代码执行 · 图片跨轮次留存 + `image_analyze` · 可嵌入/无头 webchat 按 `endUserId` 隔离记忆 · 真正可读的 Wiki(阅读与管理分离 · 统一 Sources 标签 · 可点击 `[[wikilinks]]`)· 高负载更稳(MCP 自愈 · 工具调用恢复 · 计划证据闸门)。完整故事见 [v1.6.0 release notes](https://claw.mate.vip/docs/zh/releases/1.6.0)。
|
||||||
|
|
||||||
**v1.5.0(2026-06-04 发布)** — Goal 可勾选清单(模糊评分 → 逐项打勾)· Wiki 自维护(`[[wikilinks]]` · 事实层/经验层 · pageType 模板与权限 · 知识库流水线 · 本地目录接入)· 按拥有者隔离记忆(`owner_key` + 可见域 + `endUserId` 透传)· 每员工绑定主知识库 · 偏好 provider 驱动选型。完整故事见 [v1.5.0 release notes](https://claw.mate.vip/docs/zh/releases/1.5.0)。
|
**v1.5.0(2026-06-04 发布)** — Goal 可勾选清单(模糊评分 → 逐项打勾)· Wiki 自维护(`[[wikilinks]]` · 事实层/经验层 · pageType 模板与权限 · 知识库流水线 · 本地目录接入)· 按拥有者隔离记忆(`owner_key` + 可见域 + `endUserId` 透传)· 每员工绑定主知识库 · 偏好 provider 驱动选型。完整故事见 [v1.5.0 release notes](https://claw.mate.vip/docs/zh/releases/1.5.0)。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mateclaw-desktop",
|
"name": "mateclaw-desktop",
|
||||||
"version": "1.7.0-SNAPSHOT",
|
"version": "1.7.0",
|
||||||
"description": "MateClaw Desktop - AI Assistant powered by Spring AI Alibaba",
|
"description": "MateClaw Desktop - AI Assistant powered by Spring AI Alibaba",
|
||||||
"author": "MateClaw Team",
|
"author": "MateClaw Team",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|||||||
@ -10,7 +10,7 @@ For historical diffs, check the corresponding git tag. For the "why" behind a fe
|
|||||||
|
|
||||||
| Version | Date | Highlights |
|
| Version | Date | Highlights |
|
||||||
|---------|------|------------|
|
|---------|------|------------|
|
||||||
| [v1.7.0](./releases/1.7.0) | 2026-06-25 | All three approval paths close the loop (workflow approval channel notify + resolve→resume bridge · WebChat/API-Key channel approve+replay · Feishu/WeCom card-click resolves workflow approvals) · In-chat "Run Overview" rail (plan progress + live sub-agent status · narrow-screen drawer) · One-click operational data export (Dashboard 9-sheet Excel + CLI + project-level CLI framework) · Desktop remote-server connection + `mateclaw-desktop` source open-sourced · Debuggable OpenAPI/Swagger · Chat back-to-bottom floating button |
|
| [v1.7.0](./releases/1.7.0) | 2026-07-04 | Productionization pass — all three approval paths close the loop (workflow approval channel notify + resolve→resume bridge · WebChat/API-Key channel approve+replay · Feishu/WeCom card-click resolves workflow approvals) · Long tasks are visible ("Run Overview" rail + per-turn token breakdown incl. cache hit/miss/write + sub-agent cost rolled up + one-click generated-file download) · Fits the real model window (local-model context-window probing + unified token budget for prefix injection + small-context degradation + tool-schema budget gate) · Opens up (KB / Deep Research open API with API-key+rate-limit+SSE · pluggable search Provider SPI · MCP identity forwarding) · Desktop remote-server connection + `mateclaw-desktop` source open-sourced + LAN deployment mode · One-click operational data export (Dashboard 9-sheet Excel + CLI) · Wiki processing-failure visibility · Per-employee model chain · Debuggable OpenAPI/Swagger |
|
||||||
| [v1.6.0](./releases/1.6.0) | 2026-06-22 | Runs on domestic databases — KingbaseES (人大金仓) + PostgreSQL (one shared PostgreSQL-family migration tree · opt-in Kingbase driver · least-privilege Docker roles) · New senses & hands (image kept in context across turns + `image_analyze` · `execute_code` runs agent-authored code) · You shape the employee (AGENTS.md editor + About You identity + runtime model identity + KB-scope binding + roster tags) · Wiki Sources tab (raw materials + watcher unified, per-KB auto-sync, multi-path/glob, pageType form editor) · Global outbound HTTP/SOCKS proxy · Deterministic Markdown answers · Claude Fable 5 |
|
| [v1.6.0](./releases/1.6.0) | 2026-06-22 | Runs on domestic databases — KingbaseES (人大金仓) + PostgreSQL (one shared PostgreSQL-family migration tree · opt-in Kingbase driver · least-privilege Docker roles) · New senses & hands (image kept in context across turns + `image_analyze` · `execute_code` runs agent-authored code) · You shape the employee (AGENTS.md editor + About You identity + runtime model identity + KB-scope binding + roster tags) · Wiki Sources tab (raw materials + watcher unified, per-KB auto-sync, multi-path/glob, pageType form editor) · Global outbound HTTP/SOCKS proxy · Deterministic Markdown answers · Claude Fable 5 |
|
||||||
| [v1.5.0](./releases/1.5.0) | 2026-06-04 | Goals grew a checklist — from "a score" to "ticked boxes" (checklist + Evaluator SPI + deterministic completion) · The Wiki learned to maintain itself (`[[wikilinks]]` + cascade rename/delete link-fix + broken-link lint · fact/experience layers + staleness propagation · pageType profiles & per-agent permissions · processing pipelines · local-directory knowledge source with scheduled incremental sync) · Per-owner memory isolation (owner_key + personal/team/global scopes + third-party endUserId passthrough) · Each employee binds a primary KB · Preferred provider drives the primary model + Claude Opus 4.8 |
|
| [v1.5.0](./releases/1.5.0) | 2026-06-04 | Goals grew a checklist — from "a score" to "ticked boxes" (checklist + Evaluator SPI + deterministic completion) · The Wiki learned to maintain itself (`[[wikilinks]]` + cascade rename/delete link-fix + broken-link lint · fact/experience layers + staleness propagation · pageType profiles & per-agent permissions · processing pipelines · local-directory knowledge source with scheduled incremental sync) · Per-owner memory isolation (owner_key + personal/team/global scopes + third-party endUserId passthrough) · Each employee binds a primary KB · Preferred provider drives the primary model + Claude Opus 4.8 |
|
||||||
| [v1.4.0](./releases/1.4.0) | 2026-05-23 | Persistent Goals — an employee locks a goal and follows it to done on its own · Subagent delegation became a tree (recursive 3 levels + async + digital-employee builder) · Progressive tool/skill disclosure (`enable_tool` + `load_skill`) · Workspace RBAC (4 roles + capability gating) · Feishu as a first-class citizen (interactive / approval / streaming cards + voice / file / audio / video + channel-native tools) |
|
| [v1.4.0](./releases/1.4.0) | 2026-05-23 | Persistent Goals — an employee locks a goal and follows it to done on its own · Subagent delegation became a tree (recursive 3 levels + async + digital-employee builder) · Progressive tool/skill disclosure (`enable_tool` + `load_skill`) · Workspace RBAC (4 roles + capability gating) · Feishu as a first-class citizen (interactive / approval / streaming cards + voice / file / audio / video + channel-native tools) |
|
||||||
|
|||||||
@ -35,7 +35,6 @@ Make an AI assistant a coworker who uses tools, not a chat box.
|
|||||||
Move AI out of the chat box on a webpage and into every IM your team actually uses.
|
Move AI out of the chat box on a webpage and into every IM your team actually uses.
|
||||||
|
|
||||||
- **8 channels**: Web / DingTalk / Feishu / WeCom / Telegram / Discord / QQ / WeChat Personal / Slack
|
- **8 channels**: Web / DingTalk / Feishu / WeCom / Telegram / Discord / QQ / WeChat Personal / Slack
|
||||||
- Session source tracking: every message knows which channel it came from
|
|
||||||
- 4-layer memory: session context + workspace memory + post-chat extraction + 2 AM consolidation
|
- 4-layer memory: session context + workspace memory + post-chat extraction + 2 AM consolidation
|
||||||
- DREAMS.md consolidation diary: human-readable audit of memory changes
|
- DREAMS.md consolidation diary: human-readable audit of memory changes
|
||||||
- Workspace isolation: every agent / skill / wiki / conversation / memory belongs to a workspace
|
- Workspace isolation: every agent / skill / wiki / conversation / memory belongs to a workspace
|
||||||
@ -47,111 +46,136 @@ Move AI out of the chat box on a webpage and into every IM your team actually us
|
|||||||
Renamed "agents" to **digital employees** — not vocabulary purism, a worldview shift.
|
Renamed "agents" to **digital employees** — not vocabulary purism, a worldview shift.
|
||||||
|
|
||||||
- **Digital employees** with Role / Goal / Backstory — not a cold system prompt
|
- **Digital employees** with Role / Goal / Backstory — not a cold system prompt
|
||||||
- **5 career templates**: product researcher / customer support / knowledge curator / data analyst / executive assistant — open one, it works
|
- **5 career templates**: product researcher / customer support / knowledge curator / data analyst / executive assistant
|
||||||
- **Skills are no longer aliases for tools** — each skill is a backbone with its own SKILL.md + LESSONS.md + workspace filesystem
|
- **Skills are backbones**: each skill has its own SKILL.md + LESSONS.md + workspace filesystem
|
||||||
- **ACP bridge**: Claude Code, Codex, Gemini CLI plug in as employees
|
- **ACP bridge**: Claude Code, Codex, Gemini CLI plug in as employees
|
||||||
- **Backstage runtime console**: for the first time you can **see what each employee is doing right now** — who's running, on which step, how many tokens, kill them in one click
|
- **Backstage runtime console**: for the first time you can **see what each employee is doing right now**
|
||||||
- **Onboarding wizard**: first-login four-step flow from zero to first message
|
- Onboarding wizard + Dashboard + Doctor
|
||||||
- **Dashboard**: daily usage trend + top agents/tools
|
|
||||||
- **Doctor**: system health checks + one-click fix
|
|
||||||
|
|
||||||
Full story: [v1.2.0 release notes](./releases/1.2.0.md).
|
Full story: [v1.2.0 release notes](./releases/1.2.0.md).
|
||||||
|
|
||||||
---
|
### v1.3 — It orchestrates business flows ✅ Released (2026-05-13)
|
||||||
|
|
||||||
## v1.3 — The workflow year ✅ Shipped (2026-05-13)
|
Graduating from a chatbot framework to a business-process OS — a flow is no longer several employees chatting separately, but a publishable, triggerable, replayable **linear-step DSL**.
|
||||||
|
|
||||||
> "Focus is about saying no to the hundred other good ideas that there are."
|
- **Workflow**: 7 step modes (sequential / fan_out / collect / conditional / await_approval / dispatch_channel / write_memory) + Pebble expressions + JSON-first authoring + integer revisions + run history
|
||||||
|
- **Natural language → workflow draft**: describe the flow, an agent emits graph_json, a human reviews before publish
|
||||||
Each digital employee being able to do work is just the beginning. **Real collaboration needs orchestration.**
|
- **Triggers**: 6 pattern types (cron / webhook / channel_message / agent_lifecycle / content_match / workflow_completion), event governance on by default (dedup / rate limit / recursion guard)
|
||||||
|
- **Persistent `await_approval` pause**: survives service restarts
|
||||||
The v1.3 line is **graduating MateClaw from a chatbot framework to a business-process OS** — a flow is no longer the sum of several employees chatting separately, but a publishable, triggerable, replayable **linear-step DSL**.
|
- Image editing, 4 document-generation tools (Docx/Xlsx/Pptx/Pdf), MCP per-agent tool binding, multimodal sidecar routing
|
||||||
|
|
||||||
Full story: [v1.3.0 release notes](./releases/1.3.0.md).
|
Full story: [v1.3.0 release notes](./releases/1.3.0.md).
|
||||||
|
|
||||||
### Workflow
|
### v1.4 — It's more autonomous and leads teams ✅ Released (2026-05-23)
|
||||||
|
|
||||||
- [x] **7 step modes**: sequential / fan_out / collect / conditional / await_approval / dispatch_channel / write_memory
|
Flows were scripted by you, but the employee itself still "answered one round and stopped." This release puts the focus back on the employee.
|
||||||
- [x] **Pebble expression subset** for conditionals + variable references (no side effects, no code execution)
|
|
||||||
- [x] **JSON-first authoring**: Monaco + JSON-schema validation + static Pebble checking + template dropdown
|
|
||||||
- [x] **Natural language → workflow draft** (`POST /workflows/draft/generate`): a user describes the flow, an agent emits `graph_json` + compile diagnostics; never publishes directly — a human still reviews
|
|
||||||
- [x] **Integer revisions**: publish writes a new immutable row; draft is split from published version
|
|
||||||
- [x] **Run history**: every step's input / output / duration / token / failure chain is recorded
|
|
||||||
- [x] **Internal payload storage**: large I/O goes through `payload://` URIs — doesn't blow out the DB
|
|
||||||
- [x] **Cross-workspace ACL**: publish-time validation rejects agent / channel / employeeId references outside the workspace
|
|
||||||
- [x] **Persistent `await_approval` pause**: survives service restarts
|
|
||||||
|
|
||||||
### Triggers
|
- **Persistent goals**: say it once — the employee locks the goal, self-checks every round, and keeps itself going until done or out of budget
|
||||||
|
- **Sub-employee delegation tree**: recursive delegation up to 3 levels deep, with sync / parallel fan-out / async delegation tools; the Employee Builder spins up a whole team from one sentence
|
||||||
|
- **Progressive tool/skill disclosure**: core tier always visible, extension tier activated on demand via `enable_tool` / `load_skill` — pile on tools without blowing the context
|
||||||
|
- **Workspace RBAC**: Owner / Admin / Member / Viewer roles + capability gates — MateClaw is usable by a team for the first time
|
||||||
|
- **Feishu as a first-class citizen**: interactive cards, approval cards, streaming cards, voice transcription, file/audio/video I/O, channel-native tools
|
||||||
|
- Native Gemini, xAI / Grok, per-conversation model pinning, structured context compaction, rate-limit failover
|
||||||
|
|
||||||
- [x] **6 pattern types**: cron / webhook / channel_message / agent_lifecycle / content_match / workflow_completion
|
Full story: [v1.4.0 release notes](./releases/1.4.0.md).
|
||||||
- [x] **Event governance on by default**: dedup (60s window), per-trigger rate limit, bot-self-msg filter, A→B→A recursion guard
|
|
||||||
- [x] **CronDelegationPort**: shares ShedLock + Spring TaskScheduler with the legacy cron module without writing into mate_cron_job
|
|
||||||
- [x] **Cross-instance consistency**: `pattern_version` self-cancellation + periodic syncFromDatabase
|
|
||||||
- [x] **Structured forms**: each of the 6 pattern types has its own field UI — no need to hand-write patternJson
|
|
||||||
|
|
||||||
### Existing experience upgrades
|
### v1.5 — It's verifiable, knowledge self-maintains, memory knows its owner ✅ Released (2026-06-04)
|
||||||
|
|
||||||
- [x] **Image editing** (issue #75): `image_generate` gains `image` / `images` parameters with 5 reference forms (including `msg:<id>:<idx>` for in-conversation attachments)
|
Make autonomy **verifiable**, knowledge **self-maintaining**, and memory **owner-aware**.
|
||||||
- [x] **DashScope OpenAI-compatible variant**: same sk- key, reaches the dot-versioned families (qwen3.5-plus / qwen3.6-plus / qwen3-vl-plus etc.)
|
|
||||||
- [x] **New Wanxiang / Qwen-Image families**: 14 new image models, 3 new video models (including happyhorse-1.0-t2v)
|
|
||||||
- [x] **4 document-generation tools**: DocxRenderTool / XlsxRenderTool / PptxRenderTool / PdfRenderTool — Markdown rendered directly into Office files, no subprocess fork, no npm dependency
|
|
||||||
- [x] **MCP per-agent tool binding**: every employee binds MCP tools individually + status badges (connected / stale / unavailable / orphan) + namespace collisions auto-prefixed + server renames auto-followed
|
|
||||||
- [x] **Xiaomi MiMo provider**: MiMo V2.5 Pro / V2.5 / V2 Pro / V2 Omni / V2 Flash
|
|
||||||
- [x] **Multimodal sidecar routing** (issue #87): when a text-only primary model meets an image attachment, the configured vision model captions it first so the primary chat stays cheap; the old "do not call any tools" hard ban is gone, so user-built tools are no longer suppressed; routing badge on the bubble and a hint above the input box make every decision visible
|
|
||||||
|
|
||||||
### Still to do in v1.3
|
- **Goal checklists**: goals decompose into independently verifiable criteria; the evaluator checks them off one by one — **all checked or it's not done**. No "95% is close enough"
|
||||||
|
- **Self-maintaining Wiki**: `[[wikilink]]` page interlinking + rename/delete cascade rewrites + broken-link lint; fact vs. experience knowledge layers with staleness propagation; pageType profiles + per-agent permissions; event-triggered processing pipelines; local directories mounted as knowledge sources with incremental sync
|
||||||
|
- **Per-owner memory isolation**: every memory carries an owner_key and visibility scope (personal / team / global) — one employee serves a whole group without cross-talk; APIs pass through `endUserId`
|
||||||
|
- Primary KB per employee, preferred-provider routing that actually applies, generated files persisted to disk
|
||||||
|
|
||||||
- [ ] **Canvas editor (v1)**: today's canvas is read-only chain rendering; the goal is `@vue-flow/core` drag-to-edit
|
Full story: [v1.5.0 release notes](./releases/1.5.0.md).
|
||||||
- [ ] **Run replay view**: trace timeline + hover any node to diff input/output
|
|
||||||
- [ ] **`loop` mode**: iterate N times or per-item over an array
|
### v1.6 — It meets you where you are ✅ Released (2026-06-22)
|
||||||
- [ ] **`invoke_skill` mode**: call a skill directly without going through an employee
|
|
||||||
- [ ] **Inter-trigger priority / dependency**: serial / parallel control when an event hits multiple triggers
|
Where it can run, what it can do with hands and eyes, and how directly you shape who it is.
|
||||||
- [ ] **Event replay**: a "redispatch" button on `mate_trigger_event` rows
|
|
||||||
|
- **KingbaseES + PostgreSQL as first-class citizens**: the PostgreSQL family shares one migration tree; regulated / domestic-procurement environments covered; MySQL and desktop H2 untouched
|
||||||
|
- **Images persist across turns**: the screenshot you sent three messages ago is still visible on follow-up; `image_analyze` re-reads on demand
|
||||||
|
- **`execute_code`**: the employee writes code and runs it — arithmetic, file conversion, verification become real actions instead of guesses
|
||||||
|
- **Shape the employee's identity**: a real editor for AGENTS.md and other context files (modal + section reorder); an About You identity block; the employee knows which model it runs on
|
||||||
|
- **Scoped KB access** + Wiki Sources tab (multi-path + glob + per-KB auto-sync)
|
||||||
|
- Global outbound proxy, deterministic Markdown normalization of final answers
|
||||||
|
|
||||||
|
Full story: [v1.6.0 release notes](./releases/1.6.0.md).
|
||||||
|
|
||||||
|
### v1.7 — It's ready for production ✅ Released (2026-07-04)
|
||||||
|
|
||||||
|
A **productionization pass**: once you put it into real collaboration, the places that go invisible, un-closable, out of reach, oversized for the window, and walled off — all fixed.
|
||||||
|
|
||||||
|
- **All three approval paths closed end-to-end**: workflow `await_approval` actually pushes to channels and resolves → resumes execution; the WebChat (API-key) channel can approve/deny and replay; Feishu/WeCom card buttons directly resolve workflow approvals
|
||||||
|
- **Long tasks are visible**: an always-on Run Overview rail (step progress + live delegated sub-agent tree) + a per-turn token breakdown (cache hit/miss/write + reasoning split) + sub-agent cost rolled up + one-click generated-file download
|
||||||
|
- **Fits the real model window**: local-model context-window probing, a unified token budget for prefix injection, small-context degradation, and tool-schema budget gating — no more "guess 32K" pre-flight rejections or silent truncation
|
||||||
|
- **Opens up**: a knowledge-base + Deep Research open API (API-key + rate limit + SSE), a pluggable search Provider SPI, and MCP identity forwarding (carry the authenticated user's identity into a STDIO MCP)
|
||||||
|
- **Reaches further**: desktop local-embedded / remote-centralized dual mode + multi-server switching + the `mateclaw-desktop` source opened; a LAN deployment mode opens controlled intranet access
|
||||||
|
- **One-click operational data export**: 9-sheet Excel from the Dashboard + a CLI for offline export
|
||||||
|
- Wiki processing-failure visibility, per-employee model chains, OpenAPI / Swagger directly debuggable, chat back-to-bottom floating button
|
||||||
|
|
||||||
|
Full story: [v1.7.0 release notes](./releases/1.7.0.md).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Next: v1.4 — The scenario-application year
|
## Next: v1.8 — Agent Team & Agent Loop
|
||||||
|
|
||||||
> "When the tools are good enough, hide the tools and put the scenarios in front."
|
> "Great things in business are never done by one person. They're done by a team of people."
|
||||||
|
|
||||||
v1.0 → v1.3 builds out the infrastructure: employees, memory, knowledge bases, tools, skills, workflows, triggers, multimodal, channels. **The next move isn't another bolt** — it's assembling these parts into **scenarios users can drop in and use**.
|
Look back along the line: v1.2 gave employees an identity, v1.3 made flows orchestratable, v1.4 made employees follow goals and spin up delegation trees, v1.5 made autonomy verifiable, v1.7 made long tasks visible.
|
||||||
|
|
||||||
The v1.4 keyword is **scenario applications**. Not "more features" — **letting normal users get value without learning 7 step modes and 6 trigger pattern types**.
|
But today's MateClaw still has two "stops":
|
||||||
|
|
||||||
### Industry scenario templates (workflow + trigger combos)
|
**Collaboration is one-shot.** The v1.4 delegation tree is powerful, but it's **task-scoped** — parent delegates child, the task ends, the tree dissolves. The next task starts from zero. Teams have no name, no roster, no accumulated experience — like hiring a fresh batch of temps for every project.
|
||||||
|
|
||||||
Each one is **a one-click-importable workflow template + trigger config + recommended employee bindings + recommended KB structure**:
|
**Employees are reactive.** Goal auto-followup only lives **within a single run**; cron and triggers can wake an employee up, but every wake-up is an isolated response. No employee is truly **on duty** — continuously watching its area of responsibility and deciding for itself when to act.
|
||||||
|
|
||||||
- [ ] **Customer ticket triage**: WeCom / Feishu entry → digital-employee classification → route / escalate / auto-reply → write to customer record
|
v1.8 turns both stops into continuity.
|
||||||
- [ ] **Morning / weekly report automation**: cron trigger → multi-employee parallel data collection → data analyst summarizes → generate PDF/PPTX → multi-channel dispatch
|
|
||||||
- [ ] **Contract approval flow**: contract upload → legal-employee first review → approval wait → legal-employee revision suggestions → write to archived memory
|
|
||||||
- [ ] **Market intel monitoring**: webhook trigger (site change) → content_match filtering → business analyst summary → Feishu bot push
|
|
||||||
- [ ] **New employee onboarding**: webhook (HRIS hire event) → executive assistant pulls doc checklist → training-KB onboarding → multi-day follow-up triggers
|
|
||||||
- [ ] **Code PR review**: GitHub webhook → code-reviewer employee runs review → comments back to PR → flag critical changes through await_approval
|
|
||||||
|
|
||||||
### Scenario marketplace
|
### Agent Team — from "temp hires" to "standing roster"
|
||||||
|
|
||||||
- [ ] **Scenario package format**: one scenario = `workflow.json` + `triggers.json` + `agents/*.md` + `knowledge/*.md` + `README.md`, shareable / installable
|
A team is no longer a tree that sprouts at delegation time and vanishes when the task ends. It becomes a **persistent organizational unit**:
|
||||||
- [ ] **Scenario marketplace UI**: browse / try-run / one-click install / ratings + reviews
|
|
||||||
- [ ] **Scenario package versioning**: upgrade prompts + diff preview + rollback
|
|
||||||
|
|
||||||
### Cross-scenario employee collaboration
|
- [ ] **Team entity**: a team = name + leader + member roster + charter — persisted, reusable, exportable and shareable
|
||||||
|
- [ ] **Team charter (TEAM.md)**: division of labor, collaboration rules, escalation paths — shapes the team the way AGENTS.md shapes an individual
|
||||||
|
- [ ] **Leader dispatch**: tasks come in, the leader decomposes, assigns to the best-fit member, and reviews the result; what it can't handle gets escalated instead of improvised
|
||||||
|
- [ ] **Peer review**: critical deliverables can require another member's sign-off before shipping
|
||||||
|
- [ ] **Shared team memory**: built on v1.5's TEAM scope — members share team memory and a team file space while personal memories stay isolated
|
||||||
|
- [ ] **Team-level goals**: one goal decomposes into member sub-goals; the checklist aggregates across members — hover the leader's avatar to see what the whole team still owes
|
||||||
|
- [ ] **Team-to-channel binding**: bind a Feishu / DingTalk group to a team; @ the team in the group, the leader decides who takes it
|
||||||
|
- [ ] **Team retrospectives**: task wrap-up auto-generates a retrospective into the team's LESSONS.md — this team does better next time
|
||||||
|
- [ ] **Employee Builder upgrade**: v1.4 builds a batch of employees from one sentence; v1.8 makes it emit a **standing team with a charter**
|
||||||
|
- [ ] **Run Overview becomes a team view**: each member on-duty / busy / idle at a glance; click through to see what it's working on
|
||||||
|
|
||||||
- [ ] **Employee directory profile**: each employee auto-gains "good at / weak at" tags (based on history + skills + tool set)
|
### Agent Loop — from "answers then stops" to "on duty"
|
||||||
- [ ] **Scenario suggestions**: user describes "I want a flow that does X" → recommend the closest scenario template + existing employees
|
|
||||||
- [ ] **Cross-scenario memory sharing**: customer ticket triage and contract approval see the same customer record
|
|
||||||
|
|
||||||
### Hide the infrastructure further
|
A new state for employees: **on duty**. Not waiting for you to speak, but cycling autonomously on a heartbeat — **wake → check inbox and goals → decide whether to act → act → journal → sleep**:
|
||||||
|
|
||||||
- [ ] **Natural language → full scenario package**: v1.3 already does "NL → workflow draft"; v1.4 extends it to **the whole scenario** — one sentence yields a draft of workflow + triggers + recommended employees + recommended KB structure
|
- [ ] **Resident loop runtime**: an employee can be set "on duty," waking on a configurable heartbeat (minutes to days) to check its area of responsibility
|
||||||
- [ ] **Self-diagnosis wizards**: typical issues like "my workflow stuck waiting on approval" become self-serve diagnostics
|
- [ ] **Task inbox**: channel messages, trigger events, delegations from other employees, to-dos you toss over — one queue, consumed by priority on each wake-up
|
||||||
- [ ] **Scenario-level dashboards**: not "tokens spent today" but "average customer-ticket handling time today"
|
- [ ] **Cross-session goal continuation**: v1.4/v1.5 auto-followup lives inside a single run; the loop carries goals across sessions and across days until every criterion is checked
|
||||||
|
- [ ] **Budgets and circuit breakers**: per-loop token / cost / turn budgets; consecutive failures trip the breaker into sleep pending your decision; ToolGuard approval gates still intercept sensitive actions — autonomy is not loss of control
|
||||||
|
- [ ] **Loop journal**: what it did each wake-up, why it chose not to act, what it spent — human-readable and replayable, what DREAMS.md is to memory
|
||||||
|
- [ ] **Pause / resume / clock-out**: controllable from the UI and from channel commands; the Run Overview sidebar shows every on-duty employee's loop state
|
||||||
|
- [ ] **Quiet hours and interruption policy**: silent accumulation at night, proactive reporting for what matters — integrated with the nudge system, it knows what's worth waking you for
|
||||||
|
|
||||||
### Foundational capabilities advancing in parallel
|
### Where they converge: a department that runs itself
|
||||||
|
|
||||||
- [ ] **Scenario-level ACL**: installing a scenario package atomically configures the required channel / agent / KB / tool allowlists
|
A leader on a loop, members summoned on demand — that's a **self-running digital department**:
|
||||||
- [ ] **Cross-workspace scenario sharing**: scenario templates reusable across workspaces (clone + override)
|
|
||||||
- [ ] **Scenario cost estimation**: see expected tokens / API calls / trigger frequency before installing
|
- Morning-report department: the leader wakes at 7:00, dispatches data collection, analysis, and writing to members, peer-reviews, posts to the group — you wake up to results
|
||||||
|
- Support department: a ticket lands in the inbox, the leader classifies, assigns the right member, escalates to you what it can't handle
|
||||||
|
- Intelligence department: a monitoring employee loops over sources, wakes the analyst only when something changed, notifies you only when it's worth interrupting
|
||||||
|
|
||||||
|
**Workflows own the deterministic processes; teams + loops own the unpredictable everyday.** They complement each other — none replaces another.
|
||||||
|
|
||||||
|
### Advancing in parallel
|
||||||
|
|
||||||
|
- [ ] **Workflow `loop` / `invoke_skill` step modes**: per-item array iteration / call a skill without going through an employee
|
||||||
|
- [ ] **Workflow canvas editing**: from read-only chain rendering to drag-to-edit
|
||||||
|
- [ ] **Run replay view**: trace timeline + input/output diff on any node
|
||||||
|
- [ ] **Scenario templates and marketplace**: package "employees + team + workflow + triggers + KB structure" into one-click-importable scenario bundles
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -161,12 +185,13 @@ Each one is **a one-click-importable workflow template + trigger config + recomm
|
|||||||
|
|
||||||
| Cut | Why | When it might return |
|
| Cut | Why | When it might return |
|
||||||
|-----|-----|---------------------|
|
|-----|-----|---------------------|
|
||||||
| **Full RBAC permission model** | MateClaw is a digital-employee system, not an enterprise management platform. A single team doesn't need 100 permission combinations | When real multi-team SaaS customers need fine-grained permissions |
|
| **Fine-grained RBAC beyond four roles** | v1.4's Owner / Admin / Member / Viewer + capability gates cover real team needs. Button-level permissions and custom role composition belong to enterprise management platforms | When real multi-team SaaS customers need fine-grained permissions |
|
||||||
| **Multi-tenancy** | Same as above. Premature multi-tenancy is architectural cancer | When there's a clear SaaS commercialization path |
|
| **Multi-tenancy** | Premature multi-tenancy is architectural cancer. Workspace isolation already covers multiple teams in one org | When there's a clear SaaS commercialization path |
|
||||||
| **SSO / LDAP / SAML** | Enterprise integration is a bottomless pit | When paying enterprise customers explicitly ask |
|
| **SSO / LDAP / SAML** | Enterprise integration is a bottomless pit | When paying enterprise customers explicitly ask |
|
||||||
| **30+ node visual workflow editor** | Most users won't reach for it. **v1.3's 7 step modes already cover 90% of real-world scenarios**; the rest is pushed to LLM natural-language generation | When a user case actually needs 30+ nodes (rare) |
|
| **30+ node visual workflow editor** | 7 step modes already cover 90% of real-world scenarios; the rest is pushed to natural-language generation | When a user case actually needs 30+ nodes (rare) |
|
||||||
| **Native mobile app** | 8 IM channels + desktop + Web already cover it. On your phone, you use MateClaw via DingTalk / Feishu / Telegram | When Web / IM channels can't deliver an irreplaceable mobile-only feature |
|
| **Native mobile app** | 8 IM channels + desktop (now with remote connect) + Web already cover it. On your phone, you use MateClaw via DingTalk / Feishu / Telegram | When Web / IM channels can't deliver an irreplaceable mobile-only feature |
|
||||||
| **Replacing ReAct / Plan-Execute** | Workflow and those two engines **collaborate**, not replace — single-agent multi-turn reasoning still lives there | Never replaces |
|
| **Replacing ReAct / Plan-Execute** | Workflows, teams, and loops **collaborate** with those two engines, not replace them — single-agent multi-turn reasoning still lives there | Never replaces |
|
||||||
|
| **Unbudgeted full autonomy** | Agent Loop always ships with budgets, circuit breakers, and approval gates. "Run until the money's gone" isn't autonomy, it's loss of control | Never |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -176,9 +201,13 @@ Each one is **a one-click-importable workflow template + trigger config + recomm
|
|||||||
|---------|----------|----------------------|--------|
|
|---------|----------|----------------------|--------|
|
||||||
| **v1.0** | It thinks and acts | An AI assistant that uses tools to solve problems | ✅ Released |
|
| **v1.0** | It thinks and acts | An AI assistant that uses tools to solve problems | ✅ Released |
|
||||||
| **v1.1** | It's everywhere | 8 channels + 4-layer memory + workspaces + LLM Wiki | ✅ Released |
|
| **v1.1** | It's everywhere | 8 channels + 4-layer memory + workspaces + LLM Wiki | ✅ Released |
|
||||||
| **v1.2** | It's your coworker | Digital employees + 5 career templates + backbone-style skills + ACP bridge + Backstage runtime | ✅ Released |
|
| **v1.2** | It's your coworker | Digital employees + career templates + backbone skills + ACP bridge + Backstage | ✅ Released |
|
||||||
| **v1.3** | It orchestrates business flows | Workflow + triggers + image editing + document generation + per-agent tool binding | ✅ Released |
|
| **v1.3** | It orchestrates business flows | Workflow + triggers + document generation + per-agent tool binding | ✅ Released |
|
||||||
| **v1.4** | **It lands real scenarios** | **Industry scenario templates + scenario marketplace + NL → workflow + cross-scenario employee profiling** | 📋 Planned |
|
| **v1.4** | It's more autonomous and leads teams | Persistent goals + delegation tree + progressive disclosure + RBAC + first-class Feishu | ✅ Released |
|
||||||
|
| **v1.5** | It's verifiable | Goal checklists + self-maintaining Wiki + owner-aware memory | ✅ Released |
|
||||||
|
| **v1.6** | It meets you where you are | Domestic databases + persistent vision + code execution + identity shaping | ✅ Released |
|
||||||
|
| **v1.7** | It's ready for production | Approval paths closed + Run Overview & cost visibility + context/token budgeting + open API/Deep Research + desktop remote/LAN + operational export | ✅ Released |
|
||||||
|
| **v1.8** | **It's on duty** | **Agent Team standing rosters + Agent Loop resident cycles = a department that runs itself** | 📋 Planned |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -190,7 +219,7 @@ We're building it because we believe one thing:
|
|||||||
|
|
||||||
**AI shouldn't be a chat box on a webpage. It should be your second brain.**
|
**AI shouldn't be a chat box on a webpage. It should be your second brain.**
|
||||||
|
|
||||||
It lives in your DingTalk, your Feishu, your Telegram. It's read every document you have. It remembers what you said three months ago. It uses your company's internal tools. It consolidates memory while you sleep. **It runs an entire business flow on your behalf.**
|
It lives in your DingTalk, your Feishu, your Telegram. It's read every document you have. It remembers what you said three months ago. It uses your company's internal tools. It consolidates memory while you sleep. It runs an entire business flow on your behalf. **Soon it will lead a standing team, stay on duty, and watch over the things you can't get to.**
|
||||||
|
|
||||||
Someday, you'll forget it's a program.
|
Someday, you'll forget it's a program.
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
| 版本 | 日期 | 亮点 |
|
| 版本 | 日期 | 亮点 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| [v1.7.0](./releases/1.7.0) | 2026-06-25 | 审批体系打通三条链路(工作流审批渠道通知 + resolve→resume 桥接 · WebChat/API-Key 渠道审批 resolve+replay · 飞书/企微卡片点击 resolve 工作流审批) · 长任务「运行总览」侧栏(计划进度 + 子 Agent 实时状态 · 窄屏抽屉) · 运营数据一键导出(Dashboard 9 表 Excel + CLI 命令行 + 项目级 CLI 框架) · 桌面端远程 Server 连接 + `mateclaw-desktop` 源码开源 · OpenAPI/Swagger 可调试 · 聊天回到底部浮动按钮 |
|
| [v1.7.0](./releases/1.7.0) | 2026-07-04 | 生产化加固 —— 审批体系打通三条链路(工作流审批渠道通知 + resolve→resume 桥接 · WebChat/API-Key 渠道审批 resolve+replay · 飞书/企微卡片点击 resolve 工作流审批) · 长任务看得见(「运行总览」侧栏 + 本轮 Token 明细含缓存命中/未命中/写入 + 子 Agent 成本向上滚加 + 生成文件一键下载) · 装得下真实模型窗口(本地模型上下文窗口探测 + prefix 注入统一 Token 预算 + 小上下文降级 + 工具 schema 预算门) · 开放出去(知识库 / Deep Research 开放 API 含 API-Key+限流+SSE · 插件化搜索 Provider SPI · MCP 身份透传) · 桌面端远程 Server 连接 + `mateclaw-desktop` 源码开源 + 局域网部署模式 · 运营数据一键导出(Dashboard 9 表 Excel + CLI 命令行) · Wiki 处理失败可视化 · 按员工模型链 · OpenAPI/Swagger 可调试 |
|
||||||
| [v1.6.0](./releases/1.6.0) | 2026-06-22 | 跑在国产数据库上 —— KingbaseES(人大金仓)+ PostgreSQL(共用一套 PostgreSQL 家族迁移树 · 按需金仓驱动 · Docker 最小权限角色) · 新感官与双手(图片跨轮次留在上下文 + `image_analyze` · `execute_code` 运行员工编写的代码) · 你来塑造员工(AGENTS.md 编辑器 + About You 身份 + 运行时模型身份 + KB 范围绑定 + 花名册标签) · Wiki Sources 标签(素材与监听合并、按 KB 自动同步、多路径/glob、pageType 表单编辑器) · 全局出站 HTTP/SOCKS 代理 · 确定性 Markdown 回答 · Claude Fable 5 |
|
| [v1.6.0](./releases/1.6.0) | 2026-06-22 | 跑在国产数据库上 —— KingbaseES(人大金仓)+ PostgreSQL(共用一套 PostgreSQL 家族迁移树 · 按需金仓驱动 · Docker 最小权限角色) · 新感官与双手(图片跨轮次留在上下文 + `image_analyze` · `execute_code` 运行员工编写的代码) · 你来塑造员工(AGENTS.md 编辑器 + About You 身份 + 运行时模型身份 + KB 范围绑定 + 花名册标签) · Wiki Sources 标签(素材与监听合并、按 KB 自动同步、多路径/glob、pageType 表单编辑器) · 全局出站 HTTP/SOCKS 代理 · 确定性 Markdown 回答 · Claude Fable 5 |
|
||||||
| [v1.5.0](./releases/1.5.0) | 2026-06-04 | 目标长出清单——从"打个分"到"逐条勾"(checklist + Evaluator SPI + 确定性完成判定) · Wiki 学会自维护(`[[wikilink]]` 互联 + 改名/删页级联修链 + 坏链体检 · 事实/经验分层 + 失效传播 · pageType 档案与 per-agent 权限 · 处理流水线 · 本地目录知识源定时增量同步) · 记忆按主人隔离(owner_key + 个人/团队/全局可见性 + 第三方 endUserId 透传) · 每个员工绑主知识库 · 偏好提供商决定主模型 + Claude Opus 4.8 |
|
| [v1.5.0](./releases/1.5.0) | 2026-06-04 | 目标长出清单——从"打个分"到"逐条勾"(checklist + Evaluator SPI + 确定性完成判定) · Wiki 学会自维护(`[[wikilink]]` 互联 + 改名/删页级联修链 + 坏链体检 · 事实/经验分层 + 失效传播 · pageType 档案与 per-agent 权限 · 处理流水线 · 本地目录知识源定时增量同步) · 记忆按主人隔离(owner_key + 个人/团队/全局可见性 + 第三方 endUserId 透传) · 每个员工绑主知识库 · 偏好提供商决定主模型 + Claude Opus 4.8 |
|
||||||
| [v1.4.0](./releases/1.4.0) | 2026-05-23 | 持久化目标——员工锁住目标自己跟到完成 · 子员工委派变成一棵树(递归 3 层 + 异步 + 数字员工构建器) · 渐进式工具/技能披露(`enable_tool` + `load_skill`) · 工作空间 RBAC(四级角色 + 能力门禁) · 飞书做成一等公民(互动/审批/流式卡片 + 语音/文件音视频 + 渠道原生工具) |
|
| [v1.4.0](./releases/1.4.0) | 2026-05-23 | 持久化目标——员工锁住目标自己跟到完成 · 子员工委派变成一棵树(递归 3 层 + 异步 + 数字员工构建器) · 渐进式工具/技能披露(`enable_tool` + `load_skill`) · 工作空间 RBAC(四级角色 + 能力门禁) · 飞书做成一等公民(互动/审批/流式卡片 + 语音/文件音视频 + 渠道原生工具) |
|
||||||
|
|||||||
@ -35,7 +35,6 @@ MateClaw 就是这个东西。
|
|||||||
把 AI 从"网页上的对话框"搬进你团队真正在用的每一个 IM。
|
把 AI 从"网页上的对话框"搬进你团队真正在用的每一个 IM。
|
||||||
|
|
||||||
- **8 个渠道**:Web / 钉钉 / 飞书 / 企业微信 / Telegram / Discord / QQ / 微信个人 / Slack
|
- **8 个渠道**:Web / 钉钉 / 飞书 / 企业微信 / Telegram / Discord / QQ / 微信个人 / Slack
|
||||||
- 会话来源追踪:每条消息都知道来自哪个渠道
|
|
||||||
- 4 层记忆:会话上下文 + 工作空间记忆 + 对话后提取 + 每天凌晨 2:00 自动整合
|
- 4 层记忆:会话上下文 + 工作空间记忆 + 对话后提取 + 每天凌晨 2:00 自动整合
|
||||||
- DREAMS.md 整合日记:人类可读的记忆变更审计
|
- DREAMS.md 整合日记:人类可读的记忆变更审计
|
||||||
- 工作空间隔离:每个 agent / skill / wiki / conversation / memory 都属于一个工作空间
|
- 工作空间隔离:每个 agent / skill / wiki / conversation / memory 都属于一个工作空间
|
||||||
@ -48,110 +47,135 @@ MateClaw 就是这个东西。
|
|||||||
|
|
||||||
- **数字员工**:每位有角色(Role)、目标(Goal)、背景故事(Backstory),不是冰冷的 system prompt
|
- **数字员工**:每位有角色(Role)、目标(Goal)、背景故事(Backstory),不是冰冷的 system prompt
|
||||||
- **5 个职业模板**:产品研究员 / 客户支持 / 知识管理员 / 数据分析师 / 行政助理——开箱即用
|
- **5 个职业模板**:产品研究员 / 客户支持 / 知识管理员 / 数据分析师 / 行政助理——开箱即用
|
||||||
- **技能不再是工具的别名,是骨架**:每个技能有自己的 SKILL.md + LESSONS.md + workspace 文件空间
|
- **技能是骨架**:每个技能有自己的 SKILL.md + LESSONS.md + workspace 文件空间
|
||||||
- **ACP 桥接**:Claude Code、Codex、Gemini CLI 这些顶级编码 Agent 以"员工"身份接入
|
- **ACP 桥接**:Claude Code、Codex、Gemini CLI 这些顶级编码 Agent 以"员工"身份接入
|
||||||
- **Backstage 运行时控制台**:你第一次能**看见每个员工正在干什么**——谁在跑、跑到哪一步、占多少 token、卡住了一键回收
|
- **Backstage 运行时控制台**:第一次能**看见每个员工正在干什么**
|
||||||
- **Onboarding wizard**:首次登录四步从零到第一条消息
|
- Onboarding wizard + Dashboard + Doctor
|
||||||
- **Dashboard**:日维度 usage 趋势 + 头部 agent / tool 排行
|
|
||||||
- **Doctor**:系统健康检查 + 一键修复
|
|
||||||
|
|
||||||
完整故事:[v1.2.0 Release Notes](./releases/1.2.0.md)。
|
完整故事:[v1.2.0 Release Notes](./releases/1.2.0.md)。
|
||||||
|
|
||||||
---
|
### v1.3 —— 它能编排业务流 ✅ 已发布(2026-05-13)
|
||||||
|
|
||||||
## v1.3 —— 工作流元年 ✅ 已发布(2026-05-13)
|
从"chatbot 框架"升级为"业务流程 OS"——一条业务流不再是几个员工各自聊天的总和,而是一份可发布、可触发、可重放的**线性 step DSL**。
|
||||||
|
|
||||||
> "聚焦不是对要关注的事情说 Yes。而是对其他一百个好点子说 No。"
|
- **工作流**:7 种 step mode(sequential / fan_out / collect / conditional / await_approval / dispatch_channel / write_memory)+ Pebble 表达式 + JSON-first 编辑 + 整数 revision + 运行历史
|
||||||
|
- **自然语言 → 工作流草稿**:描述需求,agent 生成 graph_json,人工审阅后发布
|
||||||
数字员工各自能干活只是起点。**真正的协作需要编排**。
|
- **触发器**:6 种 pattern type(cron / webhook / channel_message / agent_lifecycle / content_match / workflow_completion),事件治理默认开(去重 / 限速 / 递归切断)
|
||||||
|
- **`await_approval` 持久化暂停**:服务重启不丢
|
||||||
v1.3 的主线是**让 MateClaw 从"chatbot 框架"升级为"业务流程 OS"**——一条业务流不再是几个员工各自聊天的总和,而是一份可发布、可触发、可重放的**线性 step DSL**。
|
- 图像编辑、4 个文档生成工具(Docx/Xlsx/Pptx/Pdf)、MCP per-agent 工具绑定、多模态旁路路由
|
||||||
|
|
||||||
完整故事:[v1.3.0 Release Notes](./releases/1.3.0.md)。
|
完整故事:[v1.3.0 Release Notes](./releases/1.3.0.md)。
|
||||||
|
|
||||||
### 工作流(Workflow)
|
### v1.4 —— 它更自主、能带团队 ✅ 已发布(2026-05-23)
|
||||||
|
|
||||||
- [x] **7 种 step mode**:sequential / fan_out / collect / conditional / await_approval / dispatch_channel / write_memory
|
流程是你写死的,员工本身还是"答完一轮就停"。这一版把焦点放回员工自己身上。
|
||||||
- [x] **Pebble 表达式子集**作为条件判断 + 变量引用语言(不带副作用、不能跑代码)
|
|
||||||
- [x] **JSON-first 编辑**:Monaco + JSON schema 校验 + Pebble 静态检查 + 模板下拉
|
|
||||||
- [x] **自然语言 → 工作流草稿**(`POST /workflows/draft/generate`):用户描述需求,agent 生成 graph_json + 编译诊断;不直接发布,仍要人工审阅
|
|
||||||
- [x] **整数 revision**:发布写新行不可变;草稿与已发布版本分离
|
|
||||||
- [x] **运行历史**:每个 step 的 input / output / 耗时 / token / 失败链路都被记录
|
|
||||||
- [x] **payload 内置存储**:大输入输出走 `payload://` URI,不撑库
|
|
||||||
- [x] **跨 workspace ACL**:发布期校验 agent / channel / employeeId 引用都在当前 workspace 内
|
|
||||||
- [x] **`await_approval` 持久化暂停**:服务重启不丢
|
|
||||||
|
|
||||||
### 触发器(Trigger)
|
- **持久化目标(Goal)**:你说一次目标,员工锁住它、每轮自检、自己续命,直到完成或耗尽预算
|
||||||
|
- **子员工委派树**:递归委派最深 3 层,同步 / 并行扇出 / 异步三种委派工具;「数字员工构建器」一句话拉起一支团队
|
||||||
|
- **渐进式工具/技能披露**:核心层始终可见,扩展层按需 `enable_tool` / `load_skill`——工具再多,上下文不爆
|
||||||
|
- **工作空间 RBAC**:Owner / Admin / Member / Viewer 四级角色 + 能力门禁,MateClaw 第一次能给团队用
|
||||||
|
- **飞书一等公民**:互动卡片、审批卡片、流式卡片、语音转写、文件音视频收发、渠道原生工具
|
||||||
|
- 原生 Gemini、xAI / Grok、按会话选模型、结构化上下文压缩、限流自动故障转移
|
||||||
|
|
||||||
- [x] **6 种 pattern type**:cron / webhook / channel_message / agent_lifecycle / content_match / workflow_completion
|
完整故事:[v1.4.0 Release Notes](./releases/1.4.0.md)。
|
||||||
- [x] **事件治理默认开**:去重(60s 窗口)、per-trigger 限速、bot self-msg 过滤、A→B→A 递归切断
|
|
||||||
- [x] **CronDelegationPort**:和老 cron 模块共享 ShedLock + Spring TaskScheduler,不写 mate_cron_job
|
|
||||||
- [x] **跨实例一致性**:`pattern_version` 自取消机制 + 周期 syncFromDatabase
|
|
||||||
- [x] **结构化表单**:6 种 pattern 各自有专属字段输入,不需要手写 patternJson
|
|
||||||
|
|
||||||
### 升级现有体验
|
### v1.5 —— 它可验证、知识会自维护、记忆认人 ✅ 已发布(2026-06-04)
|
||||||
|
|
||||||
- [x] **图像编辑**(issue #75):`image_generate` 工具新增 `image` / `images` 参数,支持 5 种引用形式(含 `msg:<id>:<idx>` 引用会话内附件)
|
让"自主"变得**可验证**,让"知识"变得**会自维护**,让"记忆"变得**认人**。
|
||||||
- [x] **DashScope 兼容模式**:复用同一把 sk- Key 接通点号版本号系列(qwen3.5-plus / qwen3.6-plus / qwen3-vl-plus 等)
|
|
||||||
- [x] **新万相 / qwen-image 系列**:14 个新图像模型,3 个新视频模型(含 happyhorse-1.0-t2v)
|
|
||||||
- [x] **4 个文档生成工具**:DocxRenderTool / XlsxRenderTool / PptxRenderTool / PdfRenderTool —— Markdown 直接渲染为 Office 文件,不 fork 子进程不依赖 npm
|
|
||||||
- [x] **MCP per-agent 工具绑定**:每个员工独立绑定 MCP 工具 + 状态徽标(connected / stale / unavailable / orphan)+ 命名空间冲突自动前缀化 + server 改名自动跟随
|
|
||||||
- [x] **小米 MiMo provider**:MiMo V2.5 Pro / V2.5 / V2 Pro / V2 Omni / V2 Flash
|
|
||||||
- [x] **多模态旁路路由**(issue #87):纯文本主模型遇到图片附件时自动调用配置好的视觉模型转描述,主对话保持便宜;硬禁令拆掉后用户自定义工具不再被压制;路由徽章 + 输入框提示让决策全程可见
|
|
||||||
|
|
||||||
### v1.3 还要做的
|
- **目标清单(checklist)**:目标拆成可逐条验证的准则,evaluator 一条条勾,**全勾完才算完成**——没有"差不多 95% 就放过"
|
||||||
|
- **Wiki 自维护**:`[[wikilink]]` 页面互联 + 改名/删页自动级联修链 + 坏链体检;知识分事实层 / 经验层,事实一改依赖它的经验页自动标"待复核";pageType 档案 + per-agent 权限;页面事件触发的处理流水线;本地目录挂成知识源定时增量同步
|
||||||
|
- **记忆 per-owner 隔离**:每条记忆带 owner_key 和可见范围(个人 / 团队 / 全局),一个员工服务一群人互不串台;API 透传 `endUserId`
|
||||||
|
- 员工绑主知识库、偏好提供商真正生效、生成文件落盘持久化
|
||||||
|
|
||||||
- [ ] **画布编辑器(v1)**:当前画布是只读链式渲染,目标是 `@vue-flow/core` 的可拖拉编辑
|
完整故事:[v1.5.0 Release Notes](./releases/1.5.0.md)。
|
||||||
- [ ] **运行回放视图**:trace timeline + 任意节点 hover 看 input/output diff
|
|
||||||
- [ ] **`loop` mode**:迭代 N 次或对数组逐项处理
|
### v1.6 —— 它来到你所在的地方 ✅ 已发布(2026-06-22)
|
||||||
- [ ] **`invoke_skill` mode**:直接调 skill 不经过员工
|
|
||||||
- [ ] **trigger 间优先级 / 依赖**:同一事件命中多 trigger 时的串行 / 并行控制
|
它能跑在哪、能用手和眼睛做什么、以及你能多直接地塑造它是谁。
|
||||||
- [ ] **事件回放**:`mate_trigger_event` 加 "重新派发"按钮
|
|
||||||
|
- **KingbaseES(人大金仓)+ PostgreSQL 一等公民**:PostgreSQL 家族共用一套迁移树,国产化 / 受监管环境可用;MySQL 和桌面 H2 完全不动
|
||||||
|
- **图片跨轮次留在上下文**:三条消息之前发的截图,追问还看得见;`image_analyze` 按需重读
|
||||||
|
- **`execute_code`**:员工写代码并运行——算术、文件转换、核对,从猜测变成真实动作
|
||||||
|
- **塑造员工身份**:AGENTS.md 等上下文文件有了真正的编辑器(模态 + 章节重排);About You 身份块;员工知道自己跑在哪个模型上
|
||||||
|
- **知识库访问限定范围** + Wiki Sources 标签(多路径 + glob + 按 KB 自动同步)
|
||||||
|
- 全局出站代理、最终回答确定性 Markdown 规范化
|
||||||
|
|
||||||
|
完整故事:[v1.6.0 Release Notes](./releases/1.6.0.md)。
|
||||||
|
|
||||||
|
### v1.7 —— 它敢放进生产 ✅ 已发布(2026-07-04)
|
||||||
|
|
||||||
|
一次**生产化加固**:把它放进真正的协作里之后,那些看不见、收不拢、够不着、装不下、连不通的地方,这一版全补上。
|
||||||
|
|
||||||
|
- **审批三条链路彻底闭环**:工作流 `await_approval` 真的推到渠道并能 resolve→恢复执行;WebChat(API-Key)渠道能批准/拒绝并重放;飞书/企微点卡片按钮直接 resolve 工作流审批
|
||||||
|
- **长任务看得见**:常驻「运行总览」侧栏(步骤进度 + 委派子 Agent 树状实时状态)+ 本轮 Token 明细(缓存命中/未命中/写入 + 推理拆分)+ 子 Agent 成本向上滚加 + 生成文件一键下载
|
||||||
|
- **装得下真实模型窗口**:本地模型上下文窗口探测、prefix 注入统一 Token 预算、小上下文自动降级、工具 schema 超预算按频度降级——不再被"猜个 32K"坑到预检拒绝或悄悄截断
|
||||||
|
- **开放出去**:知识库与 Deep Research 开放 API(API-Key + 限流 + SSE)、插件化搜索 Provider SPI、MCP 身份透传(把认证用户身份带给 STDIO MCP)
|
||||||
|
- **够得着更远**:桌面端本地内嵌 / 远程集中部署双模式 + 多服务器切换 + `mateclaw-desktop` 源码开放;局域网部署模式放开受控内网访问
|
||||||
|
- **运营数据一键导出**:Dashboard 9 表 Excel + CLI 命令行离线导出
|
||||||
|
- Wiki 处理失败可视化、按员工模型链偏好、OpenAPI / Swagger 可直接调试、聊天回到底部浮动按钮
|
||||||
|
|
||||||
|
完整故事:[v1.7.0 Release Notes](./releases/1.7.0.md)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 下一站:v1.4 —— 场景应用元年
|
## 下一站:v1.8 —— Agent Team 与 Agent Loop
|
||||||
|
|
||||||
> "当工具足够好,就把工具藏起来,把场景推到前面。"
|
> "伟大的事业不是一个人做成的,是一个团队做成的。"
|
||||||
|
|
||||||
v1.0 → v1.3 把基础设施做齐了:员工、记忆、知识库、工具、技能、工作流、触发器、多模态、多渠道。**下一步不是再造一颗螺丝**,是把这些零件组装成**用户一打开就能落地的场景**。
|
回头看这条线:v1.2 员工有了身份,v1.3 流程能编排,v1.4 员工会自主跟目标、能临时拉起委派树,v1.5 自主变得可验证,v1.7 长任务看得见。
|
||||||
|
|
||||||
v1.4 的关键词是**场景应用**。不是"加更多功能",是**让普通用户不用学 7 种 step mode、6 种 trigger pattern 就能直接用**。
|
但今天的 MateClaw 还有两个"停":
|
||||||
|
|
||||||
### 行业场景模板(Workflow + Trigger 联动)
|
**协作是一次性的。** v1.4 的委派树很强,但它是**任务级**的——parent 委派 child,任务结束,树就散了。下一个任务再从零拉起。团队没有名字、没有编制、没有沉淀——像每个项目都重新招一批临时工。
|
||||||
|
|
||||||
每一个都是一份**可一键导入的工作流模板 + 触发器配置 + 推荐员工绑定 + 推荐知识库结构**:
|
**员工是被动的。** 目标的自动延续只活在**单次运行内**;cron 和触发器能定时叫醒它,但每次醒来都是一次孤立的响应。没有一个员工真正"在岗"——持续盯着自己的职责范围,自己决定什么时候该干什么。
|
||||||
|
|
||||||
- [ ] **客户工单分流**:企业微信 / 飞书入口 → 数字员工分类 → 路由 / 升级 / 自动回复 → 写进客户档案
|
v1.8 要把这两个"停"变成"续"。
|
||||||
- [ ] **晨报 / 周报自动化**:cron trigger → 多员工并行采数 → 数据分析员工汇总 → 生成 PDF/PPTX → 多渠道分发
|
|
||||||
- [ ] **合同审批流**:上传合同 → 法务员工初审 → 审批等待 → 法务员工修订建议 → 写归档记忆
|
|
||||||
- [ ] **市场情报监控**:webhook trigger(站点变更)→ 内容判断(content_match)→ 商业分析员工总结 → 飞书机器人推送
|
|
||||||
- [ ] **新员工 onboarding**:webhook(HRIS 入职事件)→ 行政助理拉文档清单 → 培训知识库引导 → 多日跟进 trigger
|
|
||||||
- [ ] **代码 PR 审查**:GitHub webhook → 代码审查员工跑 review → 评论回写 PR → 关键改动转 await_approval
|
|
||||||
|
|
||||||
### 场景市场(Scenario Marketplace)
|
### Agent Team(智能体团队)—— 从"临时拉人"到"常设编制"
|
||||||
|
|
||||||
- [ ] **场景包格式**:一个场景 = `workflow.json` + `triggers.json` + `agents/*.md` + `knowledge/*.md` + `README.md`,可分享 / 安装
|
一个团队不再是委派时临时长出来、任务结束就消失的树,而是一个**持久化的组织单元**:
|
||||||
- [ ] **场景市场 UI**:浏览 / 试运行 / 一键安装 / 评分评论
|
|
||||||
- [ ] **场景包版本管理**:升级提示 + diff 预览 + 回滚
|
|
||||||
|
|
||||||
### 让数字员工跨场景协作
|
- [ ] **团队实体**:一个团队 = 名字 + 队长(Leader)+ 成员编制 + 章程,持久化、可复用、可导出分享
|
||||||
|
- [ ] **团队章程(TEAM.md)**:分工、协作规则、升级路径——像 AGENTS.md 塑造个人一样塑造团队
|
||||||
|
- [ ] **队长调度**:任务进来队长拆解、指派给最合适的成员、验收结果;干不了的向上汇报而不是硬编
|
||||||
|
- [ ] **成员互审(peer review)**:关键产出可以配置"另一个成员复核后才交付"
|
||||||
|
- [ ] **团队共享记忆**:基于 v1.5 的 TEAM scope——团队成员共享一份团队记忆和团队文件空间,个人记忆仍然互不串台
|
||||||
|
- [ ] **团队级目标**:一个 goal 拆成成员子目标,清单跨成员汇总——hover 队长头像,看到整个团队还差哪几条
|
||||||
|
- [ ] **团队绑渠道**:一个飞书群 / 钉钉群绑一个团队,群里 @ 团队,队长决定谁接
|
||||||
|
- [ ] **团队复盘**:任务收尾自动生成 retrospective,沉淀进团队的 LESSONS.md——这个团队下次会做得更好
|
||||||
|
- [ ] **「数字员工构建器」升级**:v1.4 已经能一句话建一批员工,v1.8 让它直接产出一个**带章程的常设团队**
|
||||||
|
- [ ] **运行总览升级为团队视图**:每个成员在岗 / 忙碌 / 空闲一眼看清,点进去看它正在干的事
|
||||||
|
|
||||||
- [ ] **员工目录画像**:每位员工自动生成"擅长 / 不擅长"标签(基于历史交互 + 技能 + 工具集)
|
### Agent Loop(智能体循环)—— 从"答完就停"到"长期在岗"
|
||||||
- [ ] **场景智能推荐**:用户描述"我想要 X 流程" → 推荐最适合的场景模板 + 已有员工
|
|
||||||
- [ ] **跨场景记忆共享**:客户工单分流和合同审批流见到的都是同一个客户档案
|
|
||||||
|
|
||||||
### 把基础设施进一步藏起来
|
让员工进入一种新状态:**在岗**。不是等你说话才动,而是按心跳周期自主循环——**醒来 → 看收件箱和目标 → 决定做不做 → 行动 → 记日志 → 休眠**:
|
||||||
|
|
||||||
- [ ] **自然语言 → 完整场景包**:v1.3 已有"自然语言 → 工作流草稿",v1.4 把它扩展到**整个场景**——一句话描述出 workflow + trigger + 推荐员工 + 推荐 KB 结构的完整草案
|
- [ ] **常驻循环运行时**:员工可以被设为"在岗",按可配置的心跳(分钟级到天级)自主醒来检查职责范围
|
||||||
- [ ] **典型问题向导**:把"我的工作流卡在审批没人审"这种问题做成自助诊断
|
- [ ] **任务收件箱(Inbox)**:渠道消息、触发器事件、其他员工的委派、你随手丢的待办——统一进一个队列,循环醒来按优先级消化
|
||||||
- [ ] **场景级仪表盘**:不是"今天 token 用了多少",是"今天客户工单平均处理多久"
|
- [ ] **跨会话目标延续**:v1.4 / v1.5 的自动延续只活在单次运行内;loop 让目标跨会话、跨天持续推进,直到清单全勾完
|
||||||
|
- [ ] **预算与熔断**:每循环有 token / 成本 / 轮次预算,连续失败自动熔断进入休眠等你处置;ToolGuard 审批门禁照常拦截敏感操作——自主不等于失控
|
||||||
|
- [ ] **循环日志(Loop Journal)**:每次醒来干了什么、为什么决定不干、花了多少——人类可读、可回放,像 DREAMS.md 之于记忆
|
||||||
|
- [ ] **暂停 / 恢复 / 一键下班**:UI 和渠道命令都能控制;运行总览侧栏显示每个在岗员工的循环状态
|
||||||
|
- [ ] **安静时段与打扰策略**:夜间静默积攒、重要事项主动汇报——和 nudge 体系结合,它知道什么值得叫醒你
|
||||||
|
|
||||||
### 同步推进的基础能力
|
### 两者合流:会自己运转的部门
|
||||||
|
|
||||||
- [ ] **场景级 ACL**:场景包安装时一次性把所需的 channel / agent / KB / 工具的 allowlist 都配好
|
队长在岗循环,成员按需唤起——这就是一个**会自己运转的数字部门**:
|
||||||
- [ ] **跨 workspace 场景共享**:场景模板能在多个工作空间间复用(克隆 + 覆盖配置)
|
|
||||||
- [ ] **场景运行成本预估**:安装前看见预期 token / API 调用 / 触发频率
|
- 晨报部门:队长每天 7:00 醒来,派数据员工采数、分析员工汇总、写作员工成稿,互审后发进群——你睡醒看结果
|
||||||
|
- 客服部门:收件箱进一条工单,队长判断类型,指派对应成员处理,处理不了的升级给你
|
||||||
|
- 情报部门:监控员工循环盯着信息源,发现值得关注的变化才唤醒分析员工,分析完值得打扰才通知你
|
||||||
|
|
||||||
|
**工作流负责"确定的流程",团队 + 循环负责"不确定的日常"。** 三者互补,不互相替代。
|
||||||
|
|
||||||
|
### 同步推进的事
|
||||||
|
|
||||||
|
- [ ] **工作流 `loop` / `invoke_skill` step mode**:迭代处理数组 / 直接调技能不经过员工
|
||||||
|
- [ ] **工作流画布编辑**:从只读链式渲染到拖拉编辑
|
||||||
|
- [ ] **运行回放视图**:trace timeline + 任意节点看 input/output diff
|
||||||
|
- [ ] **场景模板与场景市场**:把"员工 + 团队 + 工作流 + 触发器 + 知识库结构"打包成可一键导入的场景包
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -161,12 +185,13 @@ v1.4 的关键词是**场景应用**。不是"加更多功能",是**让普通
|
|||||||
|
|
||||||
| 砍掉的功能 | 为什么 | 什么时候才该做 |
|
| 砍掉的功能 | 为什么 | 什么时候才该做 |
|
||||||
|-----------|--------|--------------|
|
|-----------|--------|--------------|
|
||||||
| **完整 RBAC 权限模型** | MateClaw 是数字员工系统,不是企业管理平台。单团队不需要管理 100 种权限组合 | 当真正出现需要细粒度权限的多团队 SaaS 客户时 |
|
| **超出四级角色的细粒度 RBAC** | v1.4 的 Owner / Admin / Member / Viewer + 能力门禁已覆盖真实团队需要。按钮级权限、自定义角色组合是企业管理平台的事 | 当真正出现需要细粒度权限的多团队 SaaS 客户时 |
|
||||||
| **多租户** | 同上。过早的多租户是架构癌症 | 当有明确的 SaaS 商业化路径时 |
|
| **多租户** | 过早的多租户是架构癌症。工作空间隔离已覆盖单组织多团队 | 当有明确的 SaaS 商业化路径时 |
|
||||||
| **SSO / LDAP / SAML** | 企业集成是个无底洞 | 当付费企业客户明确要求时 |
|
| **SSO / LDAP / SAML** | 企业集成是个无底洞 | 当付费企业客户明确要求时 |
|
||||||
| **30+ 节点的可视化工作流编辑器** | 用户大多用不上。**v1.3 的 7 种 step mode 已经覆盖 90% 实际场景**,剩下的复杂度推到 LLM 自然语言生成 | 真有用户场景需要 30+ 节点时(很少) |
|
| **30+ 节点的可视化工作流编辑器** | 7 种 step mode 已覆盖 90% 实际场景,剩下的复杂度推给自然语言生成 | 真有用户场景需要 30+ 节点时(很少) |
|
||||||
| **移动端原生 App** | 8 个 IM 渠道 + 桌面端 + Web 已经覆盖。你在手机上用钉钉 / 飞书 / Telegram 就在用 MateClaw | 当 Web / IM 渠道有不可替代的移动专属能力时 |
|
| **移动端原生 App** | 8 个 IM 渠道 + 桌面端(现已支持连远程)+ Web 已经覆盖。你在手机上用钉钉 / 飞书 / Telegram 就在用 MateClaw | 当 Web / IM 渠道有不可替代的移动专属能力时 |
|
||||||
| **替代 ReAct / Plan-Execute** | 工作流和这两条引擎**是协作关系**,不是替代——单 agent 多轮推理仍在那两条引擎里 | 永远不替代 |
|
| **替代 ReAct / Plan-Execute** | 工作流、团队、循环和这两条引擎**是协作关系**,不是替代——单 agent 多轮推理仍在那两条引擎里 | 永远不替代 |
|
||||||
|
| **无预算的全自主 Agent** | Agent Loop 永远带预算、熔断和审批门禁。"跑到没钱为止"不是自主,是失控 | 永远不做 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -176,9 +201,13 @@ v1.4 的关键词是**场景应用**。不是"加更多功能",是**让普通
|
|||||||
|------|--------|-------------|------|
|
|------|--------|-------------|------|
|
||||||
| **v1.0** | 它能思考和行动 | 一个能用工具解决问题的 AI 助手 | ✅ 已发布 |
|
| **v1.0** | 它能思考和行动 | 一个能用工具解决问题的 AI 助手 | ✅ 已发布 |
|
||||||
| **v1.1** | 它无处不在 | 8 个渠道 + 4 层记忆 + 工作空间 + LLM Wiki | ✅ 已发布 |
|
| **v1.1** | 它无处不在 | 8 个渠道 + 4 层记忆 + 工作空间 + LLM Wiki | ✅ 已发布 |
|
||||||
| **v1.2** | 它是你的同事 | 数字员工 + 5 个职业模板 + 骨架式技能 + ACP 桥接 + Backstage 运行时 | ✅ 已发布 |
|
| **v1.2** | 它是你的同事 | 数字员工 + 职业模板 + 骨架式技能 + ACP 桥接 + Backstage | ✅ 已发布 |
|
||||||
| **v1.3** | 它能编排业务流 | 工作流 + 触发器 + 图像编辑 + 文档生成 + per-agent 工具绑定 | ✅ 已发布 |
|
| **v1.3** | 它能编排业务流 | 工作流 + 触发器 + 文档生成 + per-agent 工具绑定 | ✅ 已发布 |
|
||||||
| **v1.4** | **它能落地场景** | **行业场景模板 + 场景市场 + 自然语言生成工作流 + 跨场景员工画像** | 📋 规划中 |
|
| **v1.4** | 它更自主、能带团队 | 持久化目标 + 委派树 + 渐进披露 + RBAC + 飞书一等公民 | ✅ 已发布 |
|
||||||
|
| **v1.5** | 它可验证 | 目标清单 + Wiki 自维护 + 记忆认人 | ✅ 已发布 |
|
||||||
|
| **v1.6** | 它来到你所在的地方 | 国产数据库 + 视觉留存 + 代码执行 + 身份塑造 | ✅ 已发布 |
|
||||||
|
| **v1.7** | 它敢放进生产 | 审批三链路闭环 + 运行总览与成本可见 + 上下文/Token 预算 + 开放 API/Deep Research + 桌面远程/局域网 + 运营导出 | ✅ 已发布 |
|
||||||
|
| **v1.8** | **它长期在岗** | **Agent Team 常设团队 + Agent Loop 常驻循环 = 会自己运转的数字部门** | 📋 规划中 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -190,7 +219,7 @@ v1.4 的关键词是**场景应用**。不是"加更多功能",是**让普通
|
|||||||
|
|
||||||
**AI 不应该是一个网页上的对话框。它应该是你的第二个大脑。**
|
**AI 不应该是一个网页上的对话框。它应该是你的第二个大脑。**
|
||||||
|
|
||||||
它住在你的钉钉里、你的飞书里、你的 Telegram 里。它读过你所有的文档。它记得你三个月前说过的话。它会用你公司的内部工具。它在你睡觉的时候整理记忆。**它能替你跑一整条业务流程**。
|
它住在你的钉钉里、你的飞书里、你的 Telegram 里。它读过你所有的文档。它记得你三个月前说过的话。它会用你公司的内部工具。它在你睡觉的时候整理记忆。它能替你跑一整条业务流程。**很快,它还会带着一支常设团队,长期在岗,替你盯着那些你顾不上的事。**
|
||||||
|
|
||||||
总有一天,你会忘记它是一个程序。
|
总有一天,你会忘记它是一个程序。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mateclaw-ui",
|
"name": "mateclaw-ui",
|
||||||
"version": "1.7.0-SNAPSHOT",
|
"version": "1.7.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "MateClaw - Personal AI Assistant Web Console",
|
"description": "MateClaw - Personal AI Assistant Web Console",
|
||||||
|
|||||||
@ -204,18 +204,12 @@ const selectedAgent = computed<PickableAgent | null>(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
/** modelValue is set but resolves to no known agent — the referenced
|
/** modelValue is set but resolves to no known agent — the referenced
|
||||||
* employee was likely renamed or removed.
|
* employee was likely renamed or removed. */
|
||||||
* Requires agents to have loaded first: while the list is still empty
|
const isUnknown = computed(() => hasValue.value && !selectedAgent.value)
|
||||||
* (component just rebuilt, /agents in flight) we must NOT treat a missing
|
|
||||||
* match as "unknown" — otherwise the trigger flashes the raw numeric id
|
|
||||||
* until the list lands. Falling through to the placeholder during that
|
|
||||||
* window keeps the trigger readable and self-heals once agents arrive. */
|
|
||||||
const isUnknown = computed(() =>
|
|
||||||
hasValue.value && !selectedAgent.value && props.agents.length > 0)
|
|
||||||
|
|
||||||
const triggerLabel = computed(() => {
|
const triggerLabel = computed(() => {
|
||||||
if (selectedAgent.value) return selectedAgent.value.name
|
if (selectedAgent.value) return selectedAgent.value.name
|
||||||
if (isUnknown.value) return props.unknownLabel || t('agentContext.unknownAgent')
|
if (isUnknown.value) return props.unknownLabel || String(props.modelValue)
|
||||||
return props.placeholder || t('agentContext.selectAgent')
|
return props.placeholder || t('agentContext.selectAgent')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -1,125 +0,0 @@
|
|||||||
// @vitest-environment happy-dom
|
|
||||||
import { describe, it, expect } from 'vitest'
|
|
||||||
import type { PickableAgent } from '../AgentPickerDialog.vue'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 提取 AgentPickerDialog 中 isUnknown / triggerLabel 的核心判定逻辑做纯函数测试。
|
|
||||||
* 这些 computed 的判定决定了触发器在「列表未加载」「员工被删除」等边界下显示什么,
|
|
||||||
* 历史上因为缺少 agents.length > 0 的守卫,组件重建瞬间会闪现原始数字 ID(Bug 1)。
|
|
||||||
*/
|
|
||||||
|
|
||||||
const AGENTS: PickableAgent[] = [
|
|
||||||
{ id: 1000000001, name: '通用助手' },
|
|
||||||
{ id: 1000000002, name: '代码助手' },
|
|
||||||
]
|
|
||||||
|
|
||||||
// hasValue:复刻组件中的判定
|
|
||||||
function hasValue(modelValue: string | number | null | undefined): boolean {
|
|
||||||
return modelValue !== '' && modelValue !== null && modelValue !== undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
// selectedAgent:复刻组件中的查找
|
|
||||||
function findSelected(
|
|
||||||
modelValue: string | number | null | undefined,
|
|
||||||
agents: PickableAgent[],
|
|
||||||
): PickableAgent | null {
|
|
||||||
if (!hasValue(modelValue)) return null
|
|
||||||
return agents.find(a => String(a.id) === String(modelValue)) || null
|
|
||||||
}
|
|
||||||
|
|
||||||
// isUnknown:复刻组件中的 computed —— 关键修复点
|
|
||||||
// hasValue && !selectedAgent && agents.length > 0
|
|
||||||
function computeIsUnknown(
|
|
||||||
modelValue: string | number | null | undefined,
|
|
||||||
agents: PickableAgent[],
|
|
||||||
): boolean {
|
|
||||||
const selected = findSelected(modelValue, agents)
|
|
||||||
return hasValue(modelValue) && !selected && agents.length > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// triggerLabel:复刻组件中的优先级链
|
|
||||||
function computeTriggerLabel(
|
|
||||||
modelValue: string | number | null | undefined,
|
|
||||||
agents: PickableAgent[],
|
|
||||||
placeholder: string,
|
|
||||||
unknownLabel: string,
|
|
||||||
): string {
|
|
||||||
const selected = findSelected(modelValue, agents)
|
|
||||||
if (selected) return selected.name
|
|
||||||
if (computeIsUnknown(modelValue, agents)) return unknownLabel
|
|
||||||
return placeholder
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('AgentPickerDialog isUnknown 判定', () => {
|
|
||||||
describe('空值场景', () => {
|
|
||||||
it('modelValue 为 null 时不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(null, AGENTS)).toBe(false)
|
|
||||||
})
|
|
||||||
it('modelValue 为空字符串时不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown('', AGENTS)).toBe(false)
|
|
||||||
})
|
|
||||||
it('modelValue 为 undefined 时不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(undefined, AGENTS)).toBe(false)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('正常匹配场景', () => {
|
|
||||||
it('数字 id 匹配到员工时不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(1000000001, AGENTS)).toBe(false)
|
|
||||||
})
|
|
||||||
it('字符串 id 匹配到员工时不判定为未知(Snowflake 精度场景)', () => {
|
|
||||||
expect(computeIsUnknown('1000000001', AGENTS)).toBe(false)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('列表为空场景(Bug 1 核心修复点)', () => {
|
|
||||||
// 组件被 keepAlive 重建后 /agents 尚在飞行中,此时 agents=[]
|
|
||||||
// 旧逻辑:hasValue && !selectedAgent → true → 显示原始 ID
|
|
||||||
// 新逻辑:追加 agents.length > 0 → false → 走 placeholder
|
|
||||||
it('modelValue 有值但员工列表为空时不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(1000000001, [])).toBe(false)
|
|
||||||
expect(computeIsUnknown('1000000001', [])).toBe(false)
|
|
||||||
})
|
|
||||||
it('modelValue 为无效值且列表为空时也不判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(9999999999, [])).toBe(false)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('员工被删除/改名场景', () => {
|
|
||||||
it('modelValue 有值、列表非空但无匹配时判定为未知', () => {
|
|
||||||
expect(computeIsUnknown(9999999999, AGENTS)).toBe(true)
|
|
||||||
expect(computeIsUnknown('9999999999', AGENTS)).toBe(true)
|
|
||||||
})
|
|
||||||
it('被删除的员工在恢复列表后仍显示未知标记,直到用户重新选择', () => {
|
|
||||||
// 模拟:员工 1000000001 被从列表移除
|
|
||||||
const reduced = AGENTS.filter(a => a.id !== 1000000001)
|
|
||||||
expect(computeIsUnknown(1000000001, reduced)).toBe(true)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('AgentPickerDialog triggerLabel 优先级链', () => {
|
|
||||||
const PLACEHOLDER = '请选择员工'
|
|
||||||
const UNKNOWN_LABEL = '未知员工'
|
|
||||||
|
|
||||||
it('选中员工时显示员工名称(最高优先级)', () => {
|
|
||||||
expect(computeTriggerLabel(1000000001, AGENTS, PLACEHOLDER, UNKNOWN_LABEL))
|
|
||||||
.toBe('通用助手')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('列表为空 + modelValue 有值时显示 placeholder(Bug 1 修复核心)', () => {
|
|
||||||
// 旧逻辑会显示 "1000000001",新逻辑走 placeholder
|
|
||||||
expect(computeTriggerLabel(1000000001, [], PLACEHOLDER, UNKNOWN_LABEL))
|
|
||||||
.toBe(PLACEHOLDER)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('列表非空但无匹配时显示 unknownLabel', () => {
|
|
||||||
expect(computeTriggerLabel(9999999999, AGENTS, PLACEHOLDER, UNKNOWN_LABEL))
|
|
||||||
.toBe(UNKNOWN_LABEL)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('未选择时显示 placeholder', () => {
|
|
||||||
expect(computeTriggerLabel(null, AGENTS, PLACEHOLDER, UNKNOWN_LABEL))
|
|
||||||
.toBe(PLACEHOLDER)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@ -1218,7 +1218,6 @@ export default {
|
|||||||
title: 'Agent Context',
|
title: 'Agent Context',
|
||||||
desc: 'Manage prompt files and memory for agents',
|
desc: 'Manage prompt files and memory for agents',
|
||||||
selectAgent: 'Select Employee',
|
selectAgent: 'Select Employee',
|
||||||
unknownAgent: 'Unknown employee',
|
|
||||||
noAgent: 'Please select an agent first',
|
noAgent: 'Please select an agent first',
|
||||||
files: 'Files',
|
files: 'Files',
|
||||||
coreFiles: 'Core Files',
|
coreFiles: 'Core Files',
|
||||||
|
|||||||
@ -1092,7 +1092,6 @@ export default {
|
|||||||
title: '智能体上下文',
|
title: '智能体上下文',
|
||||||
desc: '管理智能体的提示文件和记忆',
|
desc: '管理智能体的提示文件和记忆',
|
||||||
selectAgent: '选择员工',
|
selectAgent: '选择员工',
|
||||||
unknownAgent: '未知员工',
|
|
||||||
noAgent: '请先选择一个智能体',
|
noAgent: '请先选择一个智能体',
|
||||||
files: '文件列表',
|
files: '文件列表',
|
||||||
coreFiles: '核心文件',
|
coreFiles: '核心文件',
|
||||||
|
|||||||
@ -25,7 +25,7 @@ const router = createRouter({
|
|||||||
path: 'chat',
|
path: 'chat',
|
||||||
name: 'Chat',
|
name: 'Chat',
|
||||||
component: () => import('@/views/ChatConsole.vue'),
|
component: () => import('@/views/ChatConsole.vue'),
|
||||||
meta: { title: 'Chat', requiredCapability: 'chat', keepAlive: true },
|
meta: { title: 'Chat', requiredCapability: 'chat' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'dashboard',
|
path: 'dashboard',
|
||||||
|
|||||||
@ -1,112 +0,0 @@
|
|||||||
// @vitest-environment happy-dom
|
|
||||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
||||||
import { createPinia, setActivePinia } from 'pinia'
|
|
||||||
|
|
||||||
// vi.mock 在顶层会被提升,工厂内部不能引用外部变量,所以直接返回固定
|
|
||||||
// 的 mock 实现,具体的返回数据在测试用例中通过 mockResolvedValue 设置。
|
|
||||||
vi.mock('@/api/index', () => ({
|
|
||||||
wikiApi: {
|
|
||||||
listKBs: vi.fn(),
|
|
||||||
listRaw: vi.fn().mockResolvedValue({ data: [] }),
|
|
||||||
listPages: vi.fn().mockResolvedValue({ data: [] }),
|
|
||||||
listPageRefs: vi.fn().mockResolvedValue({ data: { items: [] } }),
|
|
||||||
getBrokenLinksReport: vi.fn().mockRejectedValue({ code: 404 }),
|
|
||||||
getPageTypeProfile: vi.fn().mockRejectedValue(new Error('no profile')),
|
|
||||||
},
|
|
||||||
}))
|
|
||||||
|
|
||||||
// 必须在 mock 之后导入,否则 store 初始化时拿到的是真实 wikiApi
|
|
||||||
import { useWikiStore } from '../useWikiStore'
|
|
||||||
import { wikiApi } from '@/api/index'
|
|
||||||
|
|
||||||
const KB_WS_A = { id: 100, name: 'WS-A-Wiki' }
|
|
||||||
const KB_WS_B = { id: 200, name: 'WS-B-Wiki' }
|
|
||||||
|
|
||||||
describe('useWikiStore 工作区切换 KB 清理', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
setActivePinia(createPinia())
|
|
||||||
vi.clearAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('切换工作区后 currentKB 不在新列表中时清理旧 KB 上下文', async () => {
|
|
||||||
const store = useWikiStore()
|
|
||||||
// 模拟工作区 A:已选中 KB 并加载了 pages / pageRefs
|
|
||||||
store.currentKB = KB_WS_A as any
|
|
||||||
store.pages = [{ id: 1, title: 'page-A' }] as any
|
|
||||||
store.pageRefs = [{ slug: 'page-a', title: 'Page A', archived: false }] as any
|
|
||||||
|
|
||||||
// 切到工作区 B:listKBs 返回的列表不含 id=100
|
|
||||||
;(wikiApi.listKBs as any).mockResolvedValue({ data: [KB_WS_B] })
|
|
||||||
|
|
||||||
await store.fetchKnowledgeBases()
|
|
||||||
|
|
||||||
// backToLibrary 应被触发:currentKB / pages / pageRefs 全部归零
|
|
||||||
expect(store.currentKB).toBeNull()
|
|
||||||
expect(store.pages).toEqual([])
|
|
||||||
expect(store.pageRefs).toEqual([])
|
|
||||||
// 新列表已写入
|
|
||||||
expect(store.knowledgeBases).toEqual([KB_WS_B])
|
|
||||||
expect(store.loading).toBe(false)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('同一工作区刷新 KB 列表时保留当前 currentKB', async () => {
|
|
||||||
const store = useWikiStore()
|
|
||||||
store.currentKB = KB_WS_A as any
|
|
||||||
store.pages = [{ id: 1, title: 'page-A' }] as any
|
|
||||||
|
|
||||||
// 同一工作区:listKBs 返回的列表包含 id=100
|
|
||||||
;(wikiApi.listKBs as any).mockResolvedValue({
|
|
||||||
data: [KB_WS_A, { id: 101, name: 'WS-A-Wiki-2' }],
|
|
||||||
})
|
|
||||||
|
|
||||||
await store.fetchKnowledgeBases()
|
|
||||||
|
|
||||||
// currentKB 保留,pages 保留(不误清理)
|
|
||||||
expect(store.currentKB).not.toBeNull()
|
|
||||||
expect(store.currentKB?.id).toBe(100)
|
|
||||||
expect(store.pages).toEqual([{ id: 1, title: 'page-A' }])
|
|
||||||
})
|
|
||||||
|
|
||||||
it('首次进入(无 currentKB)时不触发 backToLibrary', async () => {
|
|
||||||
const store = useWikiStore()
|
|
||||||
// currentKB 初始为 null
|
|
||||||
expect(store.currentKB).toBeNull()
|
|
||||||
|
|
||||||
;(wikiApi.listKBs as any).mockResolvedValue({ data: [KB_WS_A, KB_WS_B] })
|
|
||||||
|
|
||||||
await store.fetchKnowledgeBases()
|
|
||||||
|
|
||||||
expect(store.knowledgeBases).toHaveLength(2)
|
|
||||||
expect(store.loading).toBe(false)
|
|
||||||
// 无异常即可,backToLibrary 对 null currentKB 本身也是安全空操作
|
|
||||||
})
|
|
||||||
|
|
||||||
it('listKBs 接口异常时不崩溃且 loading 复位', async () => {
|
|
||||||
const store = useWikiStore()
|
|
||||||
store.currentKB = KB_WS_A as any
|
|
||||||
|
|
||||||
;(wikiApi.listKBs as any).mockRejectedValue(new Error('network down'))
|
|
||||||
|
|
||||||
await store.fetchKnowledgeBases()
|
|
||||||
|
|
||||||
// 异常路径:catch 吞错,knowledgeBases 不变,loading 复位
|
|
||||||
expect(store.loading).toBe(false)
|
|
||||||
expect(store.currentKB?.id).toBe(100)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('selectKB 后切换工作区触发 fetchKnowledgeBases 能正确清理', async () => {
|
|
||||||
// 验证 selectKB → fetchKnowledgeBases 的组合路径
|
|
||||||
const store = useWikiStore()
|
|
||||||
;(wikiApi.listKBs as any).mockResolvedValue({ data: [KB_WS_B] })
|
|
||||||
|
|
||||||
// 先在工作区 A 选了 KB
|
|
||||||
store.currentKB = KB_WS_A as any
|
|
||||||
store.pages = [{ id: 1, title: 'page-A' }] as any
|
|
||||||
|
|
||||||
await store.fetchKnowledgeBases()
|
|
||||||
|
|
||||||
// 旧 KB 上下文被清理
|
|
||||||
expect(store.currentKB).toBeNull()
|
|
||||||
expect(store.pages).toEqual([])
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@ -177,13 +177,7 @@ export const useWikiStore = defineStore('wiki', () => {
|
|||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const res: any = await wikiApi.listKBs()
|
const res: any = await wikiApi.listKBs()
|
||||||
const next: WikiKB[] = res.data || []
|
knowledgeBases.value = res.data || []
|
||||||
// 工作区切换时清理上一个工作区的 KB 上下文,避免显示其内容。
|
|
||||||
// backToLibrary 已清理 pages/pageRefs/rawMaterials 等关联状态,这里复用。
|
|
||||||
if (currentKB.value && !next.some(kb => kb.id === currentKB.value!.id)) {
|
|
||||||
backToLibrary()
|
|
||||||
}
|
|
||||||
knowledgeBases.value = next
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Failed to fetch knowledge bases', e)
|
console.error('Failed to fetch knowledge bases', e)
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@ -263,12 +263,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
let cachedAgents: import('@/types').Agent[] = []
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, onMounted, onBeforeUnmount, onActivated, onDeactivated, watch, nextTick } from 'vue'
|
import { ref, computed, onMounted, onBeforeUnmount, watch, nextTick } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { mcToast } from '@/composables/useMcToast'
|
import { mcToast } from '@/composables/useMcToast'
|
||||||
@ -363,7 +359,7 @@ const router = useRouter()
|
|||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
const agents = ref<Agent[]>(cachedAgents.length > 0 ? [...cachedAgents] : [])
|
const agents = ref<Agent[]>([])
|
||||||
const conversations = ref<Conversation[]>([])
|
const conversations = ref<Conversation[]>([])
|
||||||
const selectedAgentId = ref<string | number>('')
|
const selectedAgentId = ref<string | number>('')
|
||||||
const currentConversationId = ref<string>('')
|
const currentConversationId = ref<string>('')
|
||||||
@ -1166,45 +1162,6 @@ onBeforeUnmount(() => {
|
|||||||
revokeAllPreviewUrls()
|
revokeAllPreviewUrls()
|
||||||
})
|
})
|
||||||
|
|
||||||
onDeactivated(() => {
|
|
||||||
if (activityPollTimer !== null) {
|
|
||||||
clearInterval(activityPollTimer)
|
|
||||||
activityPollTimer = null
|
|
||||||
}
|
|
||||||
if (elapsedTickTimer !== null) {
|
|
||||||
clearInterval(elapsedTickTimer)
|
|
||||||
elapsedTickTimer = null
|
|
||||||
}
|
|
||||||
document.removeEventListener('click', handleCodeCopy)
|
|
||||||
disposeECharts()
|
|
||||||
disposeKatex()
|
|
||||||
disposeMermaid()
|
|
||||||
revokeAllPreviewUrls()
|
|
||||||
resetForNewConversation()
|
|
||||||
})
|
|
||||||
|
|
||||||
onActivated(async () => {
|
|
||||||
document.addEventListener('click', handleCodeCopy)
|
|
||||||
startECharts()
|
|
||||||
startKatex()
|
|
||||||
startMermaid()
|
|
||||||
activityPollTimer = window.setInterval(pollActivity, ACTIVITY_POLL_MS)
|
|
||||||
elapsedTickTimer = window.setInterval(() => {
|
|
||||||
if (activeCronRuns.value.length > 0) elapsedNow.value = Date.now()
|
|
||||||
}, 1000)
|
|
||||||
// 登出已改为 window.location.href(刷新页面),所以切回时不会有跨用户残留
|
|
||||||
if (currentConversationId.value && !isEphemeralConversation(currentConversationId.value)) {
|
|
||||||
try {
|
|
||||||
const statusRes: any = await conversationApi.getStatus(currentConversationId.value)
|
|
||||||
if (currentConversationId.value && statusRes.data?.streamStatus === 'running') {
|
|
||||||
await reconnectStream(currentConversationId.value)
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// 忽略
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
watch(() => route.query, () => {
|
watch(() => route.query, () => {
|
||||||
// If a fresh action arrives (e.g. user re-fires Ctrl+K via the URL while
|
// If a fresh action arrives (e.g. user re-fires Ctrl+K via the URL while
|
||||||
// the view is already alive), pick it up immediately.
|
// the view is already alive), pick it up immediately.
|
||||||
@ -1374,7 +1331,6 @@ async function loadAgents() {
|
|||||||
// a confusing failure path. The admin Agents view passes no filter.
|
// a confusing failure path. The admin Agents view passes no filter.
|
||||||
const res: any = await agentApi.list({ enabled: true })
|
const res: any = await agentApi.list({ enabled: true })
|
||||||
agents.value = res.data || []
|
agents.value = res.data || []
|
||||||
if (agents.value.length > 0) cachedAgents = [...agents.value]
|
|
||||||
// 只有在 URL 没有指定 agentId 且当前无选中时,才默认选第一个
|
// 只有在 URL 没有指定 agentId 且当前无选中时,才默认选第一个
|
||||||
if (agents.value.length > 0 && !selectedAgentId.value && !route.query.agentId) {
|
if (agents.value.length > 0 && !selectedAgentId.value && !route.query.agentId) {
|
||||||
selectedAgentId.value = agents.value[0].id
|
selectedAgentId.value = agents.value[0].id
|
||||||
|
|||||||
@ -578,9 +578,7 @@ function logout() {
|
|||||||
localStorage.removeItem('token')
|
localStorage.removeItem('token')
|
||||||
localStorage.removeItem('username')
|
localStorage.removeItem('username')
|
||||||
localStorage.removeItem('role')
|
localStorage.removeItem('role')
|
||||||
// 刷新页面而非 router.push:确保 keepAlive 缓存的 ChatConsole、
|
router.push('/login')
|
||||||
// 模块级变量(cachedAgents 等)全部清空,杜绝跨用户数据泄漏。
|
|
||||||
window.location.href = '/login'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function changeLocale(locale: AppLocale) {
|
async function changeLocale(locale: AppLocale) {
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<!-- MateClaw release version shared by all Maven modules. -->
|
<!-- MateClaw release version shared by all Maven modules. -->
|
||||||
<revision>1.7.0-SNAPSHOT</revision>
|
<revision>1.7.0</revision>
|
||||||
|
|
||||||
<!-- Java -->
|
<!-- Java -->
|
||||||
<java.version>21</java.version>
|
<java.version>21</java.version>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user