mirror of
https://github.com/Ryder-Sun/Meldwork.git
synced 2026-11-07 06:56:03 -10:00
Polish title editing and product README
Replace the double-outlined conversation title editor with a theme-aware inset focus treatment and add regression coverage. Rewrite the English and Chinese READMEs around user value, product differentiation, and local-first control, and track the Chinese README as public documentation. Checks: npm --prefix frontend test; npm --prefix frontend run build; npm --prefix frontend run build:desktop; npm --prefix desktop run pack; packaged Electron light/dark title-edit verification; git diff --check.
This commit is contained in:
1 parent
8c2c0afc85
commit
8fa65574fc
5 files changed
+186
-145
No files matched your search
@@ -21,7 +21,6 @@ release/
|
||||
latest*.yml
|
||||
|
||||
# Documentation is part of the public repository.
|
||||
README.zh-CN.md
|
||||
.github/brand/
|
||||
|
||||
# Test and coverage output
|
||||
|
||||
@@ -6,179 +6,90 @@
|
||||
<strong>English</strong> · <a href="README.zh-CN.md">简体中文</a>
|
||||
</p>
|
||||
|
||||
# Meldwork
|
||||
# Multiple agents. One body of work.
|
||||
|
||||
**Agents change. Work continues.**
|
||||
**Meldwork gives different AI agents one persistent local workspace: context stays intact, collaboration stays visible, and you stay in control.**
|
||||
|
||||
Meldwork is a local-first desktop workspace for general-purpose AI agents.
|
||||
The agent market is getting better and messier at the same time. One agent writes, another researches, another reviews. The hard part is no longer getting an answer. It is keeping the work coherent while the agents around it change.
|
||||
|
||||
AI agents are no longer one narrow product category. Tools that began with coding, research, personal assistance, or operations are converging into general-purpose systems that can reason, use tools, handle files, and carry multi-step work. People will use more than one of them. The work still needs one place to continue.
|
||||
Meldwork brings the agents you already use into direct conversations and working groups, without turning your work into another hosted service.
|
||||
|
||||
Meldwork is not another Agent, and it is not a coding-only Agent aggregator. It keeps conversations, compatible native sessions, collaboration state, and human control in one persistent workspace while work moves between different Agents.
|
||||
[PolyForm Noncommercial 1.0.0](LICENSE) · [Commercial use](COMMERCIAL_USE.md) · [Notice](NOTICE)
|
||||
|
||||
> **Current MVP:** Meldwork connects the supported local Agent CLIs listed below. The product direction is an open connector layer for local, cloud, custom, and channel-native Agents, but arbitrary Agent connectors are not shipped yet. This repository is published under a non-commercial software license; commercial use requires a separate written agreement.
|
||||
## Stop rebuilding context
|
||||
|
||||
> **License:** [PolyForm Noncommercial 1.0.0](LICENSE) · [Commercial use policy](COMMERCIAL_USE.md) · [Notice](NOTICE)
|
||||
Most multi-agent workflows are still tab switching with extra steps:
|
||||
|
||||
## Better Agents do not solve fragmented work
|
||||
- repeat the brief every time you change tools;
|
||||
- carry decisions and files between disconnected sessions;
|
||||
- manually decide who should answer, challenge, revise, or continue;
|
||||
- lose sight of what happened once a polished final response appears.
|
||||
|
||||
When real work moves between Agents, users still have to:
|
||||
**That is not collaboration. It is context tax.**
|
||||
|
||||
- rebuild context across disconnected sessions and interfaces;
|
||||
- collect decisions, files, and intermediate results from different places;
|
||||
- decide manually which Agent should answer, challenge, revise, or continue;
|
||||
- remember which Agent still holds which part of the task;
|
||||
- reconcile different Provider traffic, permissions, and tool behavior;
|
||||
- treat a fluent answer as completion because there is no durable work record.
|
||||
Meldwork keeps the task, conversation, participants, permissions, and run history together, so a different agent can join the work without forcing you to reconstruct it.
|
||||
|
||||
This affects research, planning, writing, operations, analysis, design, development, and review. Coding is one use case, not the product boundary.
|
||||
## One workspace, clear roles
|
||||
|
||||
## One workspace for the work
|
||||
|
||||
| Fragmented Agent use | With the current Meldwork MVP |
|
||||
| What you need | What Meldwork changes |
|
||||
| --- | --- |
|
||||
| Context trapped in separate sessions | Persistent direct and group conversations in one local workspace |
|
||||
| Re-explaining the task after every switch | Native-session continuity where the upstream Agent exposes a compatible resume mechanism |
|
||||
| Manually routing work across several interfaces | Direct responses or user-bounded multi-Agent discussions with visible run state |
|
||||
| Unclear write and Provider behavior | Explicit per-Agent Provider profiles and visible per-conversation write mode where enforceable |
|
||||
| A hosted orchestration account becomes the new dependency | Groups, messages, and orchestration state remain on the user's machine |
|
||||
| A fast answer from one agent | Start a focused direct conversation and keep it available for later |
|
||||
| A second opinion | Bring selected agents into the same working group |
|
||||
| Real critique, not polite agreement | Run a bounded multi-agent discussion and decide how many rounds it gets |
|
||||
| Confidence in what happened | See who is queued, working, complete, or failed, with the run trace attached to the conversation |
|
||||
| Control over your environment | Keep conversations and orchestration state local, with visible workspace write permissions |
|
||||
| Freedom to use different vendors | Connect supported agents without replacing their accounts, providers, or native strengths |
|
||||
|
||||
Local-first does not mean every model runs offline. Network traffic still follows the Agent and Provider configuration the user selects. Meldwork keeps its workspace and control state local.
|
||||
## What feels different
|
||||
|
||||
## General Agents, modeled by real capabilities
|
||||
### Start with one agent. Escalate only when the work deserves it.
|
||||
|
||||
Codex, Claude Code, Hermes, OpenClaw, and similar tools may have different origins, but their capabilities increasingly extend beyond a single coding workflow. Meldwork treats them as Agents and keeps their actual differences explicit: supported inputs, Skills, session behavior, Provider configuration, permissions, and output handling.
|
||||
Meldwork does not force every task through a committee. Use one agent when one is enough. Add another for a different capability, an independent attempt, or an adversarial review.
|
||||
|
||||
The name of an upstream tool does not define Meldwork's category. Continuity of work across Agents does.
|
||||
### Let agents challenge each other, with a limit.
|
||||
|
||||
## What works today
|
||||
Working groups can run automatic discussions across selected agents. You set the boundary, watch the run, and decide what is worth keeping.
|
||||
|
||||
### Discover supported local Agents
|
||||
### Keep the work, not just the final reply.
|
||||
|
||||
Refresh one catalog to find supported Agent CLIs already installed or available through an allowlisted installer recipe. Executable paths stay in the Electron main process.
|
||||
Persistent conversations, compatible native-session continuity, visible run state, Skills, images, and collected outputs stay connected to the task that produced them.
|
||||
|
||||
### Keep work in persistent conversations
|
||||
### Stay in charge of the machine.
|
||||
|
||||
Create multiple direct conversations for the same Agent, return later, or bring selected Agents into a group around the same body of work.
|
||||
Meldwork is local-first. Workspace access is explicit, sensitive credentials use operating-system-backed storage where supported, and agent execution stays behind the desktop application's controlled boundary.
|
||||
|
||||
### Continue native sessions where possible
|
||||
## Built for work that cannot rely on one answer
|
||||
|
||||
For compatible CLI versions, Meldwork keeps one logical native session per Agent and conversation. A resumed Agent receives only the group messages it has not already seen.
|
||||
- **Research:** one agent gathers evidence, another attacks the assumptions.
|
||||
- **Product and strategy:** one develops the proposal, another looks for the expensive mistake.
|
||||
- **Writing and content:** one creates, another edits for accuracy, structure, and tone.
|
||||
- **Development:** one implements, another reviews the code and the reasoning behind it.
|
||||
- **Operations:** different agents handle specialized parts while the full task remains visible in one place.
|
||||
|
||||
### Bring in another Agent without rebuilding the workflow
|
||||
The point is not to use more agents. The point is to use the right agent for each part of the job without breaking the job apart.
|
||||
|
||||
Run one response or a bounded automatic discussion from 1 to 10 rounds. Each Agent has a visible queued, running, completed, or failed state, and the user decides what to accept.
|
||||
## Agents you can bring in today
|
||||
|
||||
### Carry useful context and outputs
|
||||
|
||||
Reference validated local Skills with `@`, attach supported PNG or JPEG images, and collect supported image, audio, or video outputs from the authorized workspace's `.meldwork-output` directory. Capability checks remain Agent-specific.
|
||||
|
||||
### Keep execution boundaries explicit
|
||||
|
||||
Executable paths, attachment paths, session references, and child processes stay in the Electron main process. Compatible Provider credentials use operating-system-backed secure storage and are not returned to the renderer after saving.
|
||||
|
||||
## Any Agent is the direction, not the current claim
|
||||
|
||||
The product principle is simple:
|
||||
|
||||
> **If it can act as an Agent, it should be able to join Meldwork.**
|
||||
|
||||
The current MVP starts with fixed adapters for supported local CLIs. The next architecture milestone is a publicly documented Agent connector contract and capability manifest so new local runtimes, cloud Agents, and channel-native Agents can join without being hardcoded into the client.
|
||||
|
||||
| Horizon | Product outcome |
|
||||
| --- | --- |
|
||||
| **Now: local MVP** | Supported local Agent discovery, persistent direct/group conversations, compatible native-session resume, bounded discussions, Skills, images, and explicit local boundaries |
|
||||
| **Next: open connection layer** | Connector contract, capability manifest, structured tasks, comparable runs, artifacts, evidence, and explicit human acceptance |
|
||||
| **Later: after validation** | Cloud-Agent handoff, Meldwork Channels, typed workflows, team policy, cost controls, and enterprise governance |
|
||||
|
||||
These later capabilities are roadmap direction, not shipped behavior.
|
||||
|
||||
## Initial Agent connections
|
||||
|
||||
The current codebase contains adapters and allowlisted installer recipes for:
|
||||
Meldwork currently connects to:
|
||||
|
||||
**Codex · Hermes · OpenClaw · WorkBuddy · Kimi Code · MiMo Code · Claude Code · Gemini CLI · OpenCode · Qwen Code**
|
||||
|
||||
These are the first supported connections, not Meldwork's definition of what an Agent can be. An implemented adapter is also not the same as release-certified compatibility; availability depends on the upstream CLI, operating system, authentication, model configuration, and version.
|
||||
Each agent keeps its own capabilities, provider configuration, permission model, and session behavior. Availability depends on the installed agent, its version, and your configuration.
|
||||
|
||||
## A practical workflow
|
||||
## Local-first, without pretending the internet disappears
|
||||
|
||||
```text
|
||||
Start with one Agent
|
||||
↓
|
||||
Keep the work in one persistent conversation
|
||||
↓
|
||||
Bring in another Agent when a different capability or perspective helps
|
||||
↓
|
||||
Continue in the same workspace instead of rebuilding context
|
||||
↓
|
||||
Inspect the result and decide what to adopt
|
||||
```
|
||||
Conversations, groups, and orchestration state stay on your computer. Model requests still follow the agent and provider you choose. Meldwork keeps the workspace local; it does not make third-party models offline.
|
||||
|
||||
Use one Agent when one is enough. Add another when the value of a different capability, independent attempt, or adversarial review justifies the extra time and cost.
|
||||
## Run Meldwork locally
|
||||
|
||||
## Who Meldwork is for
|
||||
|
||||
- People who regularly move research, planning, creation, operations, development, or review work between multiple Agents.
|
||||
- AI-native teams whose members use different Agent vendors or specialized capabilities.
|
||||
- Work that benefits from a second perspective without losing the original context.
|
||||
- Users who want to preserve existing Agent accounts, Provider relationships, and a local workspace boundary.
|
||||
|
||||
Meldwork is not yet the right choice if you only use one Agent for isolated tasks, need a managed cloud execution queue today, or require audited enterprise controls and release-certified Windows support.
|
||||
|
||||
## Try the MVP locally
|
||||
|
||||
Prerequisites: Node.js 20.19 or newer, npm, and macOS for the currently configured desktop packaging target.
|
||||
Current desktop target: macOS. Requires Node.js 20.19 or newer and npm.
|
||||
|
||||
```bash
|
||||
npm --prefix frontend ci
|
||||
npm --prefix desktop ci
|
||||
|
||||
# Start the Electron desktop app
|
||||
npm --prefix desktop run dev
|
||||
```
|
||||
|
||||
For a renderer-only preview:
|
||||
## License
|
||||
|
||||
```bash
|
||||
npm --prefix frontend run dev
|
||||
```
|
||||
|
||||
The browser preview intentionally cannot execute local Agents because it has no Electron bridge.
|
||||
|
||||
<details>
|
||||
<summary><strong>Development checks</strong></summary>
|
||||
|
||||
```bash
|
||||
npm --prefix frontend test
|
||||
npm --prefix frontend run build
|
||||
npm --prefix frontend run build:desktop
|
||||
npm --prefix desktop test
|
||||
npm --prefix desktop run pack
|
||||
```
|
||||
|
||||
Generated packages are written to `desktop/dist/` and are not committed.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong>Architecture and security boundaries</strong></summary>
|
||||
|
||||
The Vue renderer reaches Agent functionality only through validated preload APIs. The Electron main process owns filesystem paths, child processes, Agent configuration, persistence, and secure credential storage. The renderer has no unrestricted shell API.
|
||||
|
||||
New conversations currently allow workspace writes by default; users can disable write mode per conversation. Adapter-level read-only modes reduce accidental writes where upstream CLIs can enforce them, but they are not an operating-system sandbox. Guided installers use fixed allowlisted recipes; upstream packages and scripts are not yet digest- or signature-pinned.
|
||||
|
||||
Internal identifiers such as `window.roundrelayDesktop`, existing storage filenames, and `com.roundrelay.desktop` are intentionally retained during the brand transition to preserve the current local-data and preload contracts.
|
||||
|
||||
</details>
|
||||
|
||||
## Project status
|
||||
|
||||
Meldwork is a market-validation MVP, not a finished platform. Before a public release, the project still needs:
|
||||
|
||||
- a release policy that matches the committed non-commercial license;
|
||||
- target-device compatibility tests for supported Agents;
|
||||
- a public connector contract before "any Agent" is presented as shipped capability;
|
||||
- signed and notarized macOS distribution;
|
||||
- real-device Windows validation before Windows support is marketed as production-ready;
|
||||
- product validation that persistent cross-Agent work creates enough value to justify a new workspace.
|
||||
Meldwork is source-available under the [PolyForm Noncommercial 1.0.0](LICENSE). Noncommercial use is permitted under the license terms. Commercial use requires a separate written agreement; see [COMMERCIAL_USE.md](COMMERCIAL_USE.md).
|
||||
@@ -0,0 +1,95 @@
|
||||
<p align="center">
|
||||
<img src="frontend/public/logos/meldwork-readme-banner-zh-CN.png" alt="Meldwork:Agent 可切换,工作不断线" width="100%">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.md">English</a> · <strong>简体中文</strong>
|
||||
</p>
|
||||
|
||||
# 多个 Agent,一项完整的工作
|
||||
|
||||
**Meldwork 把不同 AI Agent 放进一个持续的本地工作空间:上下文不重置,协作过程可见,最终决定权始终在人。**
|
||||
|
||||
Agent 越来越强,工作反而越来越碎。一个负责写作,一个擅长研究,另一个更适合审查。现在真正困难的已经不是得到一句回答,而是在工具不断切换时,让上下文、过程和决策保持完整。
|
||||
|
||||
Meldwork 把你已经在用的 Agent 带进单聊与工作群组,同时不把你的工作变成另一个托管在云端的孤岛。
|
||||
|
||||
[PolyForm 非商用许可证](LICENSE) · [商业使用](COMMERCIAL_USE.md) · [声明](NOTICE)
|
||||
|
||||
## 别再反复重建上下文
|
||||
|
||||
今天多数所谓的多 Agent 工作流,本质上仍然只是更复杂的窗口切换:
|
||||
|
||||
- 每换一个工具,就重新解释一次任务;
|
||||
- 在彼此割裂的会话之间搬运决策、文件和中间结果;
|
||||
- 手动判断谁该回答、质疑、修改或继续;
|
||||
- 最终回答一旦足够流畅,之前发生过什么反而无从追踪。
|
||||
|
||||
**这不是协作,只是上下文税。**
|
||||
|
||||
Meldwork 把任务、会话、参与者、权限和运行记录留在一起。换一个 Agent 加入,也不需要你从头拼回整项工作。
|
||||
|
||||
## 一个工作空间,角色各自清楚
|
||||
|
||||
| 你真正需要的 | Meldwork 带来的改变 |
|
||||
| --- | --- |
|
||||
| 让一个 Agent 快速回答 | 发起聚焦的单聊,并在之后继续同一项工作 |
|
||||
| 引入第二种判断 | 把选定的 Agent 放进同一个工作群组 |
|
||||
| 得到真正的质疑,而不是礼貌附和 | 启动有轮次上限的多 Agent 讨论,由你决定讨论边界 |
|
||||
| 确认过程里到底发生了什么 | 看清谁在排队、执行、完成或失败,并把运行轨迹留在会话中 |
|
||||
| 掌控自己的工作环境 | 会话与编排状态保留在本机,工作区写入权限明确可见 |
|
||||
| 自由选择不同厂商 | 连接已支持的 Agent,同时保留原有账号、Provider 与各自能力 |
|
||||
|
||||
## 真正不同的地方
|
||||
|
||||
### 一个 Agent 够用时,就只用一个
|
||||
|
||||
Meldwork 不会强迫每项任务都经过一场会议。只有当不同能力、独立尝试或对抗式审查确实有价值时,再加入另一个 Agent。
|
||||
|
||||
### 让 Agent 彼此交锋,但不给流程失控的机会
|
||||
|
||||
工作群组可以让选定的 Agent 自动进行多轮讨论。你设定边界,观察运行过程,并决定哪些结果值得留下。
|
||||
|
||||
### 留住的不只是最终回答
|
||||
|
||||
持续会话、兼容条件下的原生 Session 延续、可见的运行状态、Skill、图片与收集到的产出,都与产生它们的任务保持关联。
|
||||
|
||||
### 机器仍然由你掌控
|
||||
|
||||
Meldwork 坚持本地优先。工作区访问是明确的,兼容的敏感凭据使用操作系统安全存储,Agent 执行始终位于桌面应用的受控边界内。
|
||||
|
||||
## 适合这些不能只靠一次回答的工作
|
||||
|
||||
- **深度研究:** 一个 Agent 收集证据,另一个专门攻击假设。
|
||||
- **产品与战略:** 一个完善方案,另一个寻找代价最高的错误。
|
||||
- **写作与内容:** 一个创作,另一个检查事实、结构和语气。
|
||||
- **软件开发:** 一个实现,另一个审查代码以及代码背后的判断。
|
||||
- **复杂运营:** 不同 Agent 负责各自擅长的部分,完整任务仍然留在同一个地方。
|
||||
|
||||
重点从来不是使用更多 Agent,而是让每个环节使用更合适的 Agent,同时不把一项工作拆得支离破碎。
|
||||
|
||||
## 现在可以接入的 Agent
|
||||
|
||||
Meldwork 当前可连接:
|
||||
|
||||
**Codex · Hermes · OpenClaw · WorkBuddy · Kimi Code · MiMo Code · Claude Code · Gemini CLI · OpenCode · Qwen Code**
|
||||
|
||||
每个 Agent 仍然保留自己的能力、Provider 配置、权限模型和 Session 行为。实际可用性取决于已安装的 Agent、对应版本与用户配置。
|
||||
|
||||
## 本地优先,但不假装互联网消失了
|
||||
|
||||
会话、群组和编排状态保留在你的电脑上。模型请求仍然遵循你选择的 Agent 与 Provider。Meldwork 让工作空间留在本地,但不会把第三方模型伪装成离线服务。
|
||||
|
||||
## 在本地运行 Meldwork
|
||||
|
||||
当前桌面目标为 macOS,需要 Node.js 20.19 或更高版本以及 npm。
|
||||
|
||||
```bash
|
||||
npm --prefix frontend ci
|
||||
npm --prefix desktop ci
|
||||
npm --prefix desktop run dev
|
||||
```
|
||||
|
||||
## 许可证
|
||||
|
||||
Meldwork 以 [PolyForm Noncommercial 1.0.0](LICENSE) 许可证开放源代码。符合许可证条款的非商业使用无需额外授权;商业使用需要单独签署书面协议,详见 [COMMERCIAL_USE.md](COMMERCIAL_USE.md)。
|
||||
@@ -2264,6 +2264,14 @@ describe('RoundRelay workbench', () => {
|
||||
wrapper.unmount()
|
||||
})
|
||||
|
||||
it('keeps the inline title editor focused without an outer accent ring', () => {
|
||||
const source = readFileSync(resolve(process.cwd(), 'src/styles.css'), 'utf8')
|
||||
|
||||
expect(source).toMatch(/\.inline-title-form input\s*\{[^}]*border:\s*1px solid transparent;[^}]*outline:\s*none;[^}]*box-shadow:\s*inset 0 -1px 0 var\(--border-strong\);/s)
|
||||
expect(source).toMatch(/\.inline-title-form input:focus-visible\s*\{[^}]*outline:\s*none;[^}]*box-shadow:\s*inset 0 -2px 0 var\(--accent\);/s)
|
||||
expect(source).toMatch(/\.inline-title-form input::selection\s*\{[^}]*var\(--accent\) 28%/s)
|
||||
})
|
||||
|
||||
it('mentions one Agent, scopes its Skills, and sends only to that Agent', async () => {
|
||||
const { wrapper, bridge } = await mountApp(({ state, bridge: desktopBridge }) => {
|
||||
state.groups.push({
|
||||
|
||||
+37
-9
@@ -2796,30 +2796,50 @@ button svg {
|
||||
}
|
||||
|
||||
.inline-title-form {
|
||||
width: min(420px, 100%);
|
||||
width: min(520px, 100%);
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.inline-title-form input {
|
||||
width: auto;
|
||||
min-width: 0;
|
||||
height: 32px;
|
||||
height: 36px;
|
||||
flex: 1 1 auto;
|
||||
padding: 0 8px;
|
||||
border: 1px solid var(--accent);
|
||||
padding: 0 10px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--surface-raised);
|
||||
outline: none;
|
||||
background: color-mix(in srgb, var(--surface-raised) 76%, var(--surface-hover));
|
||||
color: var(--text);
|
||||
font-size: 17px;
|
||||
font-weight: 700;
|
||||
box-shadow: inset 0 -1px 0 var(--border-strong);
|
||||
transition:
|
||||
background 0.14s ease,
|
||||
box-shadow 0.14s ease;
|
||||
}
|
||||
|
||||
.inline-title-form input:hover {
|
||||
background: var(--surface-raised);
|
||||
}
|
||||
|
||||
.inline-title-form input:focus-visible {
|
||||
outline: none;
|
||||
background: var(--surface-raised);
|
||||
box-shadow: inset 0 -2px 0 var(--accent);
|
||||
}
|
||||
|
||||
.inline-title-form input::selection {
|
||||
background: color-mix(in srgb, var(--accent) 28%, transparent);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.inline-title-form button {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
flex: 0 0 auto;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@@ -2832,12 +2852,20 @@ button svg {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.inline-title-form button[type="submit"] {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.inline-title-form button:hover {
|
||||
border-color: var(--border);
|
||||
background: var(--surface-hover);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.inline-title-form button[type="submit"]:hover {
|
||||
background: var(--accent-soft);
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
.conversation-identity p {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
Reference in new issue
Block a user