mirror of
https://github.com/Ryder-Sun/Meldwork.git
synced 2026-11-07 06:56:03 -10:00
release: prepare 1.0.9 preview and clarify agent readiness
Bundle knowledge-base logos and report unverified or failed native authentication accurately. Update release metadata and document the six-agent discussion validation and known configuration limits. Checks: frontend tests (379), desktop tests (1700), landing tests (13), frontend builds, desktop pack and dist, DMG and ZIP integrity.
This commit is contained in:
1 parent
ef405bb721
commit
1ddf3fbdd7
22 files changed
+127
-68
No files matched your search
@@ -15,7 +15,7 @@ Meldwork is a local-first multi-Agent collaboration workspace for the Agent tool
|
|||||||
You do not need to direct every round, but you still set the goal, grant permissions, and make key decisions. Missing information, permission requests, or tradeoffs may require your input. Workspace writes are opt-in; collaboration history, run state, and deliverables stay local so you can revisit the work and continue it.
|
You do not need to direct every round, but you still set the goal, grant permissions, and make key decisions. Missing information, permission requests, or tradeoffs may require your input. Workspace writes are opt-in; collaboration history, run state, and deliverables stay local so you can revisit the work and continue it.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg"><strong>Download Meldwork V1.0.8 for Apple silicon macOS</strong></a>
|
<a href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg"><strong>Download Meldwork V1.0.9 for Apple silicon macOS</strong></a>
|
||||||
· <a href="architecture.md">Architecture</a>
|
· <a href="architecture.md">Architecture</a>
|
||||||
· <a href="LICENSE">License</a>
|
· <a href="LICENSE">License</a>
|
||||||
</p>
|
</p>
|
||||||
@@ -86,9 +86,9 @@ Meldwork runs as a local Electron application. Conversations, group configuratio
|
|||||||
|
|
||||||
Selected Agents may send prompts, attachments, or Skills to the model provider configured in their own CLI. Knowledge access is explicit and bounded: the current implementation supports local Obsidian retrieval and CLI-owned Feishu or DingTalk access modes. Local-first describes where Meldwork stores and coordinates work; it does not promise that an Agent's model provider is offline.
|
Selected Agents may send prompts, attachments, or Skills to the model provider configured in their own CLI. Knowledge access is explicit and bounded: the current implementation supports local Obsidian retrieval and CLI-owned Feishu or DingTalk access modes. Local-first describes where Meldwork stores and coordinates work; it does not promise that an Agent's model provider is offline.
|
||||||
|
|
||||||
## Download V1.0.8
|
## Download V1.0.9
|
||||||
|
|
||||||
For Apple silicon macOS, download the [Meldwork V1.0.8 prerelease](https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8) and choose [`Meldwork-1.0.8-arm64.dmg`](https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg). The release also includes a ZIP archive and SHA-256 manifest. Install at least one supported local Agent CLI before opening the app.
|
For Apple silicon macOS, download the [Meldwork V1.0.9 prerelease](https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9) and choose [`Meldwork-1.0.9-arm64.dmg`](https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg). The release also includes a ZIP archive and SHA-256 manifest. Install at least one supported local Agent CLI before opening the app.
|
||||||
|
|
||||||
The preview artifacts are ad-hoc signed and not notarized with an Apple Developer ID. macOS may require **Open Anyway** under **System Settings → Privacy & Security** on first launch.
|
The preview artifacts are ad-hoc signed and not notarized with an Apple Developer ID. macOS may require **Open Anyway** under **System Settings → Privacy & Security** on first launch.
|
||||||
|
|
||||||
@@ -111,6 +111,12 @@ npm --prefix frontend run build:desktop
|
|||||||
npm --prefix desktop test
|
npm --prefix desktop test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## V1.0.9
|
||||||
|
|
||||||
|
Auto Discussion can complete native Agent turns on explicit completion and requires each participant to approve the same delivery version. A real six-Agent unlimited discussion completed in nine rounds with matching delivery hashes. This preview also improves Agent authentication status, handles CLI authentication errors reported on stderr, and bundles knowledge-base logos.
|
||||||
|
|
||||||
|
Agent installation does not guarantee a working model connection: OpenClaw's isolated runtime may not support the native environment configuration, WorkBuddy's CLI may require its own login, and Zcode needs valid native provider credentials. Desktop and frontend regression checks passed 1,700 and 379 tests respectively.
|
||||||
|
|
||||||
## V1.0.8
|
## V1.0.8
|
||||||
|
|
||||||
V1.0.8 keeps Kimi read-only queries in manual approval mode instead of forcing a planning cycle, preserves MiMo's final text chunks, forwards supported native CLI configuration, and retains the selected Auto Discussion mode after sending. Repetitive native output is cancelled with partial replies preserved. Zcode remains before Pi Agent with its official logo and native default configuration; WorkBuddy can reuse a configured desktop model selected in Meldwork.
|
V1.0.8 keeps Kimi read-only queries in manual approval mode instead of forcing a planning cycle, preserves MiMo's final text chunks, forwards supported native CLI configuration, and retains the selected Auto Discussion mode after sending. Repetitive native output is cancelled with partial replies preserved. Zcode remains before Pi Agent with its official logo and native default configuration; WorkBuddy can reuse a configured desktop model selected in Meldwork.
|
||||||
|
|||||||
+9
-3
@@ -15,7 +15,7 @@ Meldwork 是一个本地优先的多 Agent 协作工作空间,用来连接你
|
|||||||
你无需安排每一轮发言,但仍负责目标、权限和关键决策。遇到信息缺失、权限请求或需要取舍的问题时,任务可能等待你处理。工作区写入需要明确授权;协作过程、运行状态和产物保存在本地,方便回看和继续工作。
|
你无需安排每一轮发言,但仍负责目标、权限和关键决策。遇到信息缺失、权限请求或需要取舍的问题时,任务可能等待你处理。工作区写入需要明确授权;协作过程、运行状态和产物保存在本地,方便回看和继续工作。
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg"><strong>下载 Meldwork V1.0.8 Apple 芯片 macOS 版</strong></a>
|
<a href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg"><strong>下载 Meldwork V1.0.9 Apple 芯片 macOS 版</strong></a>
|
||||||
· <a href="architecture.md">架构</a>
|
· <a href="architecture.md">架构</a>
|
||||||
· <a href="LICENSE">许可证</a>
|
· <a href="LICENSE">许可证</a>
|
||||||
</p>
|
</p>
|
||||||
@@ -86,9 +86,9 @@ Meldwork 作为本地 Electron 应用运行。对话、群组配置、运行记
|
|||||||
|
|
||||||
选定的 Agent 仍可能把 Prompt、附件或 Skill 发送到其自身 CLI 凭据对应的模型服务商。知识访问必须明确选择并受边界约束:当前实现支持本地 Obsidian 检索,以及由本地 CLI 管理的飞书或钉钉访问模式。Local-first 描述的是 Meldwork 的数据和协作位置,不代表 Agent 使用的模型服务商一定离线。
|
选定的 Agent 仍可能把 Prompt、附件或 Skill 发送到其自身 CLI 凭据对应的模型服务商。知识访问必须明确选择并受边界约束:当前实现支持本地 Obsidian 检索,以及由本地 CLI 管理的飞书或钉钉访问模式。Local-first 描述的是 Meldwork 的数据和协作位置,不代表 Agent 使用的模型服务商一定离线。
|
||||||
|
|
||||||
## 下载 V1.0.8
|
## 下载 V1.0.9
|
||||||
|
|
||||||
Apple 芯片 macOS 用户请前往 [Meldwork V1.0.8 预发布页](https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8),下载 [`Meldwork-1.0.8-arm64.dmg`](https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg)。发布页同时提供 ZIP 压缩包和 SHA-256 校验文件。启动应用前,请至少安装一个受支持的本地 Agent CLI。
|
Apple 芯片 macOS 用户请前往 [Meldwork V1.0.9 预发布页](https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9),下载 [`Meldwork-1.0.9-arm64.dmg`](https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg)。发布页同时提供 ZIP 压缩包和 SHA-256 校验文件。启动应用前,请至少安装一个受支持的本地 Agent CLI。
|
||||||
|
|
||||||
该预览版安装包使用 ad-hoc 临时签名,未使用 Apple Developer ID 签名,也未进行公证。macOS 首次启动时可能需要在“系统设置 → 隐私与安全性”中选择“仍要打开 / Open Anyway”。
|
该预览版安装包使用 ad-hoc 临时签名,未使用 Apple Developer ID 签名,也未进行公证。macOS 首次启动时可能需要在“系统设置 → 隐私与安全性”中选择“仍要打开 / Open Anyway”。
|
||||||
|
|
||||||
@@ -111,6 +111,12 @@ npm --prefix frontend run build:desktop
|
|||||||
npm --prefix desktop test
|
npm --prefix desktop test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## V1.0.9
|
||||||
|
|
||||||
|
自动讨论可根据原生 Agent 的明确完成信号结束发言,并要求所有参与者认可同一版交付物。一轮真实六 Agent 无限轮讨论在九轮后完成,交付物哈希一致。此预览版还改进了 Agent 认证状态、识别 CLI 在标准错误中报告的认证失败,并将知识库图标打包进应用。
|
||||||
|
|
||||||
|
已安装 Agent 不代表模型连接可用:OpenClaw 的隔离环境可能无法使用现有原生配置,WorkBuddy CLI 可能需要单独登录,Zcode 需要有效的原生提供方凭据。桌面端和前端回归测试分别通过 1,700 项和 379 项。
|
||||||
|
|
||||||
## V1.0.8
|
## V1.0.8
|
||||||
|
|
||||||
V1.0.8 将 Kimi 只读问答改为手动权限模式,避免强制进入计划流程;修复 MiMo 末尾文本丢失、原生 CLI 配置变量遗漏,以及发送后 Auto Discussion 模式重置。原生输出持续重复时会取消调用并保留已输出内容。Zcode 保持官方标志和 Pi Agent 前的位置,沿用原生默认配置;WorkBuddy 可以复用在 Meldwork 中选定的桌面已配置模型。
|
V1.0.8 将 Kimi 只读问答改为手动权限模式,避免强制进入计划流程;修复 MiMo 末尾文本丢失、原生 CLI 配置变量遗漏,以及发送后 Auto Discussion 模式重置。原生输出持续重复时会取消调用并保留已输出内容。Zcode 保持官方标志和 Pi Agent 前的位置,沿用原生默认配置;WorkBuddy 可以复用在 Meldwork 中选定的桌面已配置模型。
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "meldwork-desktop",
|
"name": "meldwork-desktop",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "meldwork-desktop",
|
"name": "meldwork-desktop",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@agentclientprotocol/sdk": "0.23.0",
|
"@agentclientprotocol/sdk": "0.23.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meldwork-desktop",
|
"name": "meldwork-desktop",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "A local-first desktop workspace for multi-Agent collaboration",
|
"description": "A local-first desktop workspace for multi-Agent collaboration",
|
||||||
"author": "Ryder-MHumble",
|
"author": "Ryder-MHumble",
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ const {
|
|||||||
failedAgentProcessError,
|
failedAgentProcessError,
|
||||||
} = require('./cli-process-support.cjs')
|
} = require('./cli-process-support.cjs')
|
||||||
const { createLegacyOutboundPayload } = require('../../collaboration/outbound-payload.cjs')
|
const { createLegacyOutboundPayload } = require('../../collaboration/outbound-payload.cjs')
|
||||||
|
const { authFailureCertainty } = require('../../runs/failure-signals.cjs')
|
||||||
|
|
||||||
const MAX_PROGRESS_STEPS = 8
|
const MAX_PROGRESS_STEPS = 8
|
||||||
const MAX_STDOUT_CAPTURE_BYTES = 10 * 1024 * 1024
|
const MAX_STDOUT_CAPTURE_BYTES = 10 * 1024 * 1024
|
||||||
@@ -462,6 +463,12 @@ async function runAgent(agent, prompt, workdir, options = {}) {
|
|||||||
})
|
})
|
||||||
const rawStdout = stdout.text()
|
const rawStdout = stdout.text()
|
||||||
const structuredDetail = structuredCliError(rawStdout)
|
const structuredDetail = structuredCliError(rawStdout)
|
||||||
|
if (!String(result?.text || '').trim() && authFailureCertainty(rawStderr) === 'definitive') {
|
||||||
|
rejectTerminal(failedAgentProcessError(redactChildSecrets(rawStderr, childEnv), {
|
||||||
|
sessionRef: failureSessionRef, kind: agent.kind, model: options.env?.CODEBUDDY_MODEL,
|
||||||
|
}))
|
||||||
|
return
|
||||||
|
}
|
||||||
const usableNonZeroResult = code !== 0
|
const usableNonZeroResult = code !== 0
|
||||||
&& result
|
&& result
|
||||||
&& typeof result.text === 'string'
|
&& typeof result.text === 'string'
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ class LocalWorkspaceAgentCatalog {
|
|||||||
else if (runtimeMissing) availabilitySource = 'runtime-auth-failure'
|
else if (runtimeMissing) availabilitySource = 'runtime-auth-failure'
|
||||||
else if (nativeState === 'missing') availabilitySource = native.source || 'none'
|
else if (nativeState === 'missing') availabilitySource = native.source || 'none'
|
||||||
else if (native?.source === 'native-probe-failed') availabilitySource = 'native-probe-failed'
|
else if (native?.source === 'native-probe-failed') availabilitySource = 'native-probe-failed'
|
||||||
|
else if (native?.source === 'native-runtime-unavailable') availabilitySource = 'native-runtime-unavailable'
|
||||||
else if (nativeReadySource) availabilitySource = nativeReadySource
|
else if (nativeReadySource) availabilitySource = nativeReadySource
|
||||||
else if (verifiedReady) availabilitySource = 'verified-run'
|
else if (verifiedReady) availabilitySource = 'verified-run'
|
||||||
else if (nativeConfigurationUnknown) availabilitySource = 'local-cli'
|
else if (nativeConfigurationUnknown) availabilitySource = 'local-cli'
|
||||||
|
|||||||
@@ -580,6 +580,30 @@ for (const exitCode of [0, 1]) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test('WorkBuddy reports authentication failure when the CLI exits successfully with only stderr', async (t) => {
|
||||||
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'meldwork-workbuddy-stderr-auth-'))
|
||||||
|
t.after(() => fs.rmSync(directory, { recursive: true, force: true }))
|
||||||
|
const cli = executable(directory, 'workbuddy-stderr-auth.cjs', `
|
||||||
|
process.stderr.write('Authentication required. Please use /login command to sign in to your account\\n')
|
||||||
|
`)
|
||||||
|
await assert.rejects(
|
||||||
|
runAgent({ kind: 'workbuddy', executable: cli }, 'hello', directory, {}),
|
||||||
|
error => error.code === 'LOCAL_AGENT_AUTH_REQUIRED',
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('a completed CLI answer is retained when stderr contains an authentication warning', async (t) => {
|
||||||
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'meldwork-workbuddy-warning-'))
|
||||||
|
t.after(() => fs.rmSync(directory, { recursive: true, force: true }))
|
||||||
|
const cli = executable(directory, 'workbuddy-warning.cjs', `
|
||||||
|
process.stderr.write('Authentication required for an optional service\\n')
|
||||||
|
process.stdout.write(JSON.stringify({ type: 'result', subtype: 'success', result: 'Done.' }) + '\\n')
|
||||||
|
`)
|
||||||
|
const result = await runAgent({ kind: 'workbuddy', executable: cli }, 'hello', directory, {})
|
||||||
|
assert.equal(result.text, 'Done.')
|
||||||
|
assert.equal(result.outcome, 'completed')
|
||||||
|
})
|
||||||
|
|
||||||
test('Gemini profile state retains one real tool lifecycle id and summary', async (t) => {
|
test('Gemini profile state retains one real tool lifecycle id and summary', async (t) => {
|
||||||
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'meldwork-gemini-profile-state-'))
|
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'meldwork-gemini-profile-state-'))
|
||||||
const cli = executable(directory, 'gemini-profile-state.cjs', `
|
const cli = executable(directory, 'gemini-profile-state.cjs', `
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ test('configured credentials do not make an Agent invocable when runtime prerequ
|
|||||||
recentlyVerified: false,
|
recentlyVerified: false,
|
||||||
available: false,
|
available: false,
|
||||||
})
|
})
|
||||||
|
assert.equal(agents()[0].availabilitySource, 'native-runtime-unavailable')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('unidentified product versions remain unavailable after credential validation', async () => {
|
test('unidentified product versions remain unavailable after credential validation', async () => {
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "meldwork-frontend",
|
"name": "meldwork-frontend",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "meldwork-frontend",
|
"name": "meldwork-frontend",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vicons/ionicons5": "^0.12.0",
|
"@vicons/ionicons5": "^0.12.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meldwork-frontend",
|
"name": "meldwork-frontend",
|
||||||
"version": "1.0.8",
|
"version": "1.0.9",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Meldwork local-first multi-Agent collaboration workspace",
|
"description": "Meldwork local-first multi-Agent collaboration workspace",
|
||||||
"author": "Ryder-MHumble",
|
"author": "Ryder-MHumble",
|
||||||
|
|||||||
@@ -40,11 +40,6 @@
|
|||||||
<div class="agent-discovery-copy">
|
<div class="agent-discovery-copy">
|
||||||
<p class="agent-discovery-kicker">{{ t('agentDiscovery.kicker') }}</p>
|
<p class="agent-discovery-kicker">{{ t('agentDiscovery.kicker') }}</p>
|
||||||
<h1>{{ t('agentDiscovery.title') }}</h1>
|
<h1>{{ t('agentDiscovery.title') }}</h1>
|
||||||
<p>{{ t('agentDiscovery.body') }}</p>
|
|
||||||
<div class="agent-discovery-status">
|
|
||||||
<span class="agent-discovery-status-dot" aria-hidden="true" />
|
|
||||||
<span>{{ t('agentDiscovery.status') }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<WavePhysicsLoader :theme="theme" />
|
<WavePhysicsLoader :theme="theme" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -878,13 +878,14 @@ describe('Meldwork workbench', () => {
|
|||||||
await textarea.setValue('@ding')
|
await textarea.setValue('@ding')
|
||||||
await flushPromises()
|
await flushPromises()
|
||||||
const option = wrapper.get('.knowledge-base-mention-option')
|
const option = wrapper.get('.knowledge-base-mention-option')
|
||||||
expect(option.get('img').attributes('src')).toBe('./knowledge-base-logos/dingtalk.svg')
|
const logoSrc = option.get('img').attributes('src')
|
||||||
|
expect(logoSrc).toMatch(/^data:image\/svg\+xml,/)
|
||||||
expect(option.text()).toContain('Search DingTalk documents through the configured dws connection')
|
expect(option.text()).toContain('Search DingTalk documents through the configured dws connection')
|
||||||
expect(option.text()).toContain('Knowledge')
|
expect(option.text()).toContain('Knowledge')
|
||||||
await option.trigger('click')
|
await option.trigger('click')
|
||||||
expect(wrapper.get('.selected-knowledge-base-avatar').attributes('title')).toBe('Remove knowledge base')
|
expect(wrapper.get('.selected-knowledge-base-avatar').attributes('title')).toBe('Remove knowledge base')
|
||||||
expect(wrapper.get('.selected-knowledge-base-avatar img').attributes('src'))
|
expect(wrapper.get('.selected-knowledge-base-avatar img').attributes('src'))
|
||||||
.toBe('./knowledge-base-logos/dingtalk.svg')
|
.toBe(logoSrc)
|
||||||
|
|
||||||
await textarea.setValue('Compare the internal references')
|
await textarea.setValue('Compare the internal references')
|
||||||
await wrapper.get('.send-button').trigger('click')
|
await wrapper.get('.send-button').trigger('click')
|
||||||
|
|||||||
@@ -56,7 +56,9 @@ describe('Meldwork workbench', () => {
|
|||||||
await flushPromises()
|
await flushPromises()
|
||||||
|
|
||||||
expect(wrapper.get('.agent-discovery-overlay').attributes('role')).toBe('status')
|
expect(wrapper.get('.agent-discovery-overlay').attributes('role')).toBe('status')
|
||||||
expect(wrapper.get('.agent-discovery-overlay').text()).toContain('Agent CLI')
|
expect(wrapper.get('.agent-discovery-overlay').text()).toContain('Finding your local Agents')
|
||||||
|
expect(wrapper.get('.agent-discovery-overlay').text()).not.toContain('Preparing your workspace')
|
||||||
|
expect(wrapper.get('.agent-discovery-overlay').text()).not.toContain('Meldwork is checking')
|
||||||
expect(wrapper.find('.pixel-blast-container').exists()).toBe(true)
|
expect(wrapper.find('.pixel-blast-container').exists()).toBe(true)
|
||||||
expect(wrapper.get('.agent-discovery-overlay').find('.wave-physics-loader').exists()).toBe(true)
|
expect(wrapper.get('.agent-discovery-overlay').find('.wave-physics-loader').exists()).toBe(true)
|
||||||
expect(wrapper.get('.agent-discovery-overlay').findAll('.wave-physics-loader')).toHaveLength(1)
|
expect(wrapper.get('.agent-discovery-overlay').findAll('.wave-physics-loader')).toHaveLength(1)
|
||||||
|
|||||||
@@ -18,6 +18,24 @@ function catalogFor(agent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('Agent compatibility state', () => {
|
describe('Agent compatibility state', () => {
|
||||||
|
it('shows an invocable local CLI as unverified until its credentials are confirmed', () => {
|
||||||
|
setLocale('en')
|
||||||
|
expect(catalogFor({ kind: 'zcode', installed: true, available: true,
|
||||||
|
credentialState: 'unknown', availabilitySource: 'local-cli' }).label).toBe('Sign-in not verified')
|
||||||
|
expect(catalogFor({ kind: 'zcode', installed: true, available: true,
|
||||||
|
credentialState: 'ready', availabilitySource: 'native-credential' }).label).toBe('Sign-in not verified')
|
||||||
|
expect(catalogFor({ kind: 'zcode', installed: true, available: true,
|
||||||
|
credentialState: 'ready', availabilitySource: 'verified-run', recentlyVerified: true }).label).toBe('Ready')
|
||||||
|
})
|
||||||
|
it('explains when the isolated native runtime could not be prepared', () => {
|
||||||
|
setLocale('en')
|
||||||
|
const catalog = useAgentCatalog({
|
||||||
|
activeGroup: ref(null), directGroupsFor: () => [], installCatalog: ref({ agents: [] }),
|
||||||
|
snapshot: ref({ agents: [] }), t, theme: ref('light'),
|
||||||
|
})
|
||||||
|
expect(catalog.agentStateNote({ kind: 'openclaw', installed: true, ready: false,
|
||||||
|
availabilitySource: 'native-runtime-unavailable' })).toContain('different configuration or Gateway')
|
||||||
|
})
|
||||||
it('honors explicit hiding despite history and excludes unavailable WorkBuddy until it becomes ready', () => {
|
it('honors explicit hiding despite history and excludes unavailable WorkBuddy until it becomes ready', () => {
|
||||||
const snapshot = ref({ agents: [
|
const snapshot = ref({ agents: [
|
||||||
{ kind: 'hermes', installed: true, available: false, showInSidebar: false },
|
{ kind: 'hermes', installed: true, available: false, showInSidebar: false },
|
||||||
|
|||||||
@@ -26,6 +26,16 @@ function obsidianStatus(vaultPath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('knowledge base status requests', () => {
|
describe('knowledge base status requests', () => {
|
||||||
|
it('keeps bundled logos when a status response contains a conflicting logo', async () => {
|
||||||
|
const settings = useKnowledgeBaseSettings({
|
||||||
|
knowledgeBase: ref({ status: vi.fn(async () => [{ ...obsidianStatus(''), logo: '' }]) }),
|
||||||
|
showError: vi.fn(),
|
||||||
|
})
|
||||||
|
await settings.loadKnowledgeBaseStatuses()
|
||||||
|
const entries = [...settings.localKnowledgeBaseEntries.value, ...settings.plannedKnowledgeBaseEntries.value]
|
||||||
|
expect(entries).toHaveLength(7)
|
||||||
|
expect(entries.every(source => source.logo.startsWith('data:image/svg+xml,'))).toBe(true)
|
||||||
|
})
|
||||||
it('does not let an older full refresh overwrite a newer targeted result', async () => {
|
it('does not let an older full refresh overwrite a newer targeted result', async () => {
|
||||||
const full = deferred()
|
const full = deferred()
|
||||||
const targeted = deferred()
|
const targeted = deferred()
|
||||||
|
|||||||
@@ -142,6 +142,10 @@ export function useAgentCatalog({
|
|||||||
if (['workbuddy-desktop-locked', 'workbuddy-model-unavailable'].includes(agent.availabilitySource)) {
|
if (['workbuddy-desktop-locked', 'workbuddy-model-unavailable'].includes(agent.availabilitySource)) {
|
||||||
return { label: t('workbuddy.configure'), tone: 'warning', icon: WarningOutline }
|
return { label: t('workbuddy.configure'), tone: 'warning', icon: WarningOutline }
|
||||||
}
|
}
|
||||||
|
if (agent.ready && !agent.recentlyVerified
|
||||||
|
&& ['local-cli', 'native-credential', 'native-shell'].includes(agent.availabilitySource)) {
|
||||||
|
return { label: t('agent.unverified'), tone: 'neutral', icon: WarningOutline }
|
||||||
|
}
|
||||||
if (agent.ready) return { label: t('agent.ready'), tone: 'ready', icon: CheckmarkCircleOutline }
|
if (agent.ready) return { label: t('agent.ready'), tone: 'ready', icon: CheckmarkCircleOutline }
|
||||||
if (agent.custom) return { label: t('customAgent.executableUnavailable'), tone: 'warning', icon: WarningOutline }
|
if (agent.custom) return { label: t('customAgent.executableUnavailable'), tone: 'warning', icon: WarningOutline }
|
||||||
if (!agent.installed) return { label: t('agent.notInstalled'), tone: 'off', icon: DownloadOutline }
|
if (!agent.installed) return { label: t('agent.notInstalled'), tone: 'off', icon: DownloadOutline }
|
||||||
@@ -164,6 +168,7 @@ export function useAgentCatalog({
|
|||||||
// next. Empty when there is nothing to explain (ready, or not installed).
|
// next. Empty when there is nothing to explain (ready, or not installed).
|
||||||
function agentStateNote(agent) {
|
function agentStateNote(agent) {
|
||||||
if (!agent || agent.ready || agent.custom || !agent.installed) return ''
|
if (!agent || agent.ready || agent.custom || !agent.installed) return ''
|
||||||
|
if (agent.availabilitySource === 'native-runtime-unavailable') return t('agent.note.nativeRuntimeUnavailable')
|
||||||
if (agent.availabilitySource === 'workbuddy-desktop-locked') return t('workbuddy.desktopLocked')
|
if (agent.availabilitySource === 'workbuddy-desktop-locked') return t('workbuddy.desktopLocked')
|
||||||
if (agent.availabilitySource === 'workbuddy-model-unavailable') return t('workbuddy.modelUnavailable')
|
if (agent.availabilitySource === 'workbuddy-model-unavailable') return t('workbuddy.modelUnavailable')
|
||||||
const version = agent.resolvedVersion || agent.version || ''
|
const version = agent.resolvedVersion || agent.version || ''
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export function useKnowledgeBaseSettings({ knowledgeBase, showError }) {
|
|||||||
...definition,
|
...definition,
|
||||||
...definition.defaultState,
|
...definition.defaultState,
|
||||||
...(sourceMap.value.get(definition.kind) || {}),
|
...(sourceMap.value.get(definition.kind) || {}),
|
||||||
|
logo: definition.logo,
|
||||||
})))
|
})))
|
||||||
const localEntries = computed(() => entries.value.filter(source => !comingSoon(source)))
|
const localEntries = computed(() => entries.value.filter(source => !comingSoon(source)))
|
||||||
const plannedEntries = computed(() => entries.value.filter(comingSoon))
|
const plannedEntries = computed(() => entries.value.filter(comingSoon))
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
import { publicAsset } from './catalog.js'
|
import feishuSvg from '../public/knowledge-base-logos/feishu.svg?raw'
|
||||||
|
import dingtalkSvg from '../public/knowledge-base-logos/dingtalk.svg?raw'
|
||||||
|
import obsidianSvg from '../public/knowledge-base-logos/obsidian.svg?raw'
|
||||||
|
import notionSvg from '../public/knowledge-base-logos/notion.svg?raw'
|
||||||
|
import confluenceSvg from '../public/knowledge-base-logos/confluence.svg?raw'
|
||||||
|
import googleDriveSvg from '../public/knowledge-base-logos/googledrive.svg?raw'
|
||||||
|
import sharepointSvg from '../public/knowledge-base-logos/sharepoint.svg?raw'
|
||||||
|
|
||||||
|
const logo = svg => `data:image/svg+xml,${encodeURIComponent(svg)}`
|
||||||
|
|
||||||
function defaultState(accessMode) {
|
function defaultState(accessMode) {
|
||||||
if (accessMode === 'vault') {
|
if (accessMode === 'vault') {
|
||||||
@@ -41,43 +49,43 @@ export const KNOWLEDGE_BASE_CATALOG = Object.freeze([
|
|||||||
{
|
{
|
||||||
kind: 'feishu',
|
kind: 'feishu',
|
||||||
accessMode: 'cli',
|
accessMode: 'cli',
|
||||||
logo: publicAsset('knowledge-base-logos/feishu.svg'),
|
logo: logo(feishuSvg),
|
||||||
defaultState: defaultState('cli'),
|
defaultState: defaultState('cli'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'dingtalk',
|
kind: 'dingtalk',
|
||||||
accessMode: 'cli',
|
accessMode: 'cli',
|
||||||
logo: publicAsset('knowledge-base-logos/dingtalk.svg'),
|
logo: logo(dingtalkSvg),
|
||||||
defaultState: defaultState('cli'),
|
defaultState: defaultState('cli'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'obsidian',
|
kind: 'obsidian',
|
||||||
accessMode: 'vault',
|
accessMode: 'vault',
|
||||||
logo: publicAsset('knowledge-base-logos/obsidian.svg'),
|
logo: logo(obsidianSvg),
|
||||||
defaultState: defaultState('vault'),
|
defaultState: defaultState('vault'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'notion',
|
kind: 'notion',
|
||||||
accessMode: 'oauth',
|
accessMode: 'oauth',
|
||||||
logo: publicAsset('knowledge-base-logos/notion.svg'),
|
logo: logo(notionSvg),
|
||||||
defaultState: defaultState('oauth'),
|
defaultState: defaultState('oauth'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'confluence',
|
kind: 'confluence',
|
||||||
accessMode: 'oauth',
|
accessMode: 'oauth',
|
||||||
logo: publicAsset('knowledge-base-logos/confluence.svg'),
|
logo: logo(confluenceSvg),
|
||||||
defaultState: defaultState('oauth'),
|
defaultState: defaultState('oauth'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'googledrive',
|
kind: 'googledrive',
|
||||||
accessMode: 'oauth',
|
accessMode: 'oauth',
|
||||||
logo: publicAsset('knowledge-base-logos/googledrive.svg'),
|
logo: logo(googleDriveSvg),
|
||||||
defaultState: defaultState('oauth'),
|
defaultState: defaultState('oauth'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kind: 'sharepoint',
|
kind: 'sharepoint',
|
||||||
accessMode: 'oauth',
|
accessMode: 'oauth',
|
||||||
logo: publicAsset('knowledge-base-logos/sharepoint.svg'),
|
logo: logo(sharepointSvg),
|
||||||
defaultState: defaultState('oauth'),
|
defaultState: defaultState('oauth'),
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
@@ -46,8 +46,6 @@ export default {
|
|||||||
'delivery.viewing': 'Viewing delivery; next message is regular chat',
|
'delivery.viewing': 'Viewing delivery; next message is regular chat',
|
||||||
'agentDiscovery.kicker': 'Local workspace startup',
|
'agentDiscovery.kicker': 'Local workspace startup',
|
||||||
'agentDiscovery.title': 'Finding your local Agents',
|
'agentDiscovery.title': 'Finding your local Agents',
|
||||||
'agentDiscovery.body': 'Meldwork is checking the Agent CLIs available on this computer.',
|
|
||||||
'agentDiscovery.status': 'Preparing your workspace',
|
|
||||||
"delivery.title": "Tasks & delivery",
|
"delivery.title": "Tasks & delivery",
|
||||||
"delivery.bound": "Next message runs this task",
|
"delivery.bound": "Next message runs this task",
|
||||||
"delivery.select": "Select task",
|
"delivery.select": "Select task",
|
||||||
@@ -219,6 +217,7 @@ export default {
|
|||||||
'agent.note.protocolUnavailable': 'The installed version ({version}) does not support a protocol Meldwork needs.',
|
'agent.note.protocolUnavailable': 'The installed version ({version}) does not support a protocol Meldwork needs.',
|
||||||
'agent.note.verifiedRange': 'Verified versions: {range}.',
|
'agent.note.verifiedRange': 'Verified versions: {range}.',
|
||||||
'agent.note.probeTimeout': 'Detection timed out. Make sure it starts normally in a terminal, then detect again.',
|
'agent.note.probeTimeout': 'Detection timed out. Make sure it starts normally in a terminal, then detect again.',
|
||||||
|
'agent.note.nativeRuntimeUnavailable': 'Meldwork could not prepare the native runtime. The terminal may use a different configuration or Gateway.',
|
||||||
'agent.note.needsLogin': 'Run it in a terminal and finish signing in, then detect again.',
|
'agent.note.needsLogin': 'Run it in a terminal and finish signing in, then detect again.',
|
||||||
'agent.note.needsLoginCloud': 'This is a cloud Agent: sign in to it on its server, then detect again.',
|
'agent.note.needsLoginCloud': 'This is a cloud Agent: sign in to it on its server, then detect again.',
|
||||||
'agent.detectedVersion': 'Version {version}',
|
'agent.detectedVersion': 'Version {version}',
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ export default {
|
|||||||
'delivery.viewing': '查看交付中;下一次发送为普通聊天',
|
'delivery.viewing': '查看交付中;下一次发送为普通聊天',
|
||||||
'agentDiscovery.kicker': '本地工作台启动中',
|
'agentDiscovery.kicker': '本地工作台启动中',
|
||||||
'agentDiscovery.title': '正在寻找本地 Agent',
|
'agentDiscovery.title': '正在寻找本地 Agent',
|
||||||
'agentDiscovery.body': 'Meldwork 正在检查这台电脑上可用的 Agent CLI。',
|
|
||||||
'agentDiscovery.status': '正在准备工作台',
|
|
||||||
"delivery.title": "任务与交付",
|
"delivery.title": "任务与交付",
|
||||||
"delivery.bound": "下一次发送用于此任务",
|
"delivery.bound": "下一次发送用于此任务",
|
||||||
"delivery.select": "选择任务",
|
"delivery.select": "选择任务",
|
||||||
@@ -219,6 +217,7 @@ export default {
|
|||||||
'agent.note.protocolUnavailable': '已安装的版本 {version} 不支持 Meldwork 需要的通信协议。',
|
'agent.note.protocolUnavailable': '已安装的版本 {version} 不支持 Meldwork 需要的通信协议。',
|
||||||
'agent.note.verifiedRange': '已验证的版本:{range}。',
|
'agent.note.verifiedRange': '已验证的版本:{range}。',
|
||||||
'agent.note.probeTimeout': '检测超时。请确认它能在终端里正常启动,然后重新检测。',
|
'agent.note.probeTimeout': '检测超时。请确认它能在终端里正常启动,然后重新检测。',
|
||||||
|
'agent.note.nativeRuntimeUnavailable': 'Meldwork 无法准备原生运行环境;终端可能使用了不同的配置或 Gateway。',
|
||||||
'agent.note.needsLogin': '请先在终端运行它并完成登录,然后重新检测。',
|
'agent.note.needsLogin': '请先在终端运行它并完成登录,然后重新检测。',
|
||||||
'agent.note.needsLoginCloud': '这是云端 Agent:请到对应的服务器上完成登录,然后重新检测。',
|
'agent.note.needsLoginCloud': '这是云端 Agent:请到对应的服务器上完成登录,然后重新检测。',
|
||||||
'agent.detectedVersion': '版本 {version}',
|
'agent.detectedVersion': '版本 {version}',
|
||||||
|
|||||||
@@ -60,30 +60,6 @@
|
|||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.agent-discovery-copy > p:not(.agent-discovery-kicker) {
|
|
||||||
max-width: 360px;
|
|
||||||
margin: 10px 0 0;
|
|
||||||
color: var(--muted);
|
|
||||||
line-height: 1.55;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agent-discovery-status {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 7px;
|
|
||||||
margin-top: 13px;
|
|
||||||
color: var(--muted);
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agent-discovery-status-dot {
|
|
||||||
width: 6px;
|
|
||||||
height: 6px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: var(--accent);
|
|
||||||
box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 12%, transparent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.agent-discovery-enter-active,
|
.agent-discovery-enter-active,
|
||||||
.agent-discovery-leave-active {
|
.agent-discovery-leave-active {
|
||||||
transition: opacity 0.28s ease;
|
transition: opacity 0.28s ease;
|
||||||
|
|||||||
+12
-12
@@ -28,13 +28,13 @@
|
|||||||
"name": "Meldwork",
|
"name": "Meldwork",
|
||||||
"applicationCategory": "DeveloperApplication",
|
"applicationCategory": "DeveloperApplication",
|
||||||
"operatingSystem": "macOS (Apple silicon)",
|
"operatingSystem": "macOS (Apple silicon)",
|
||||||
"softwareVersion": "1.0.8",
|
"softwareVersion": "1.0.9",
|
||||||
"license": "https://www.apache.org/licenses/LICENSE-2.0",
|
"license": "https://www.apache.org/licenses/LICENSE-2.0",
|
||||||
"description": "Meldwork is a local-first multi-Agent collaboration workspace for macOS. Selected Agents share context, discuss approaches, carry out authorized work, and check results with less manual coordination. Users set goals and permissions and step in when information or key decisions are needed.",
|
"description": "Meldwork is a local-first multi-Agent collaboration workspace for macOS. Selected Agents share context, discuss approaches, carry out authorized work, and check results with less manual coordination. Users set goals and permissions and step in when information or key decisions are needed.",
|
||||||
"featureList": "Autonomous Agent collaboration, shared task context, peer contributions and reviews, authorized task execution, Concurrent Responses, Auto Discussion, opt-in workspace writes, user decisions when needed, local collaboration history, multimodal attachments, selected knowledge sources",
|
"featureList": "Autonomous Agent collaboration, shared task context, peer contributions and reviews, authorized task execution, Concurrent Responses, Auto Discussion, opt-in workspace writes, user decisions when needed, local collaboration history, multimodal attachments, selected knowledge sources",
|
||||||
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
|
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
|
||||||
"author": { "@type": "Organization", "name": "Meldwork", "url": "https://github.com/Ryder-Sun/Meldwork" },
|
"author": { "@type": "Organization", "name": "Meldwork", "url": "https://github.com/Ryder-Sun/Meldwork" },
|
||||||
"downloadUrl": "https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8",
|
"downloadUrl": "https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9",
|
||||||
"softwareRequirements": "macOS with Apple silicon. At least one supported local Agent CLI installed (Codex, Claude Code, Gemini CLI, Hermes, OpenCode, or another listed Agent)."
|
"softwareRequirements": "macOS with Apple silicon. At least one supported local Agent CLI installed (Codex, Claude Code, Gemini CLI, Hermes, OpenCode, or another listed Agent)."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
{
|
{
|
||||||
"@type": "Question",
|
"@type": "Question",
|
||||||
"name": "Does Meldwork work on Intel macOS, Windows, or Linux?",
|
"name": "Does Meldwork work on Intel macOS, Windows, or Linux?",
|
||||||
"acceptedAnswer": { "@type": "Answer", "text": "The current V1.0.8 preview targets Apple silicon macOS (ad-hoc signed, not notarized — open Open Anyway in System Settings → Privacy & Security on first launch). Cross-platform builds are on the roadmap; the app is Electron so the same source compiles everywhere once those targets land." }
|
"acceptedAnswer": { "@type": "Answer", "text": "The current V1.0.9 preview targets Apple silicon macOS (ad-hoc signed, not notarized — open Open Anyway in System Settings → Privacy & Security on first launch). Cross-platform builds are on the roadmap; the app is Electron so the same source compiles everywhere once those targets land." }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -125,8 +125,8 @@
|
|||||||
<a href="#compare" class="nav-link" data-spy="compare"><span data-zh="产品特点">How it differs</span></a>
|
<a href="#compare" class="nav-link" data-spy="compare"><span data-zh="产品特点">How it differs</span></a>
|
||||||
<a href="#faq" class="nav-link" data-spy="faq"><span data-zh="常见问题">FAQ</span></a>
|
<a href="#faq" class="nav-link" data-spy="faq"><span data-zh="常见问题">FAQ</span></a>
|
||||||
</nav>
|
</nav>
|
||||||
<a class="cta-dark magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8" target="_blank" rel="noopener" data-zh="<span class="cta-status"></span> 下载 V1.0.8">
|
<a class="cta-dark magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9" target="_blank" rel="noopener" data-zh="<span class="cta-status"></span> 下载 V1.0.9">
|
||||||
<span class="cta-status"></span> Download V1.0.8
|
<span class="cta-status"></span> Download V1.0.9
|
||||||
</a>
|
</a>
|
||||||
<button type="button" class="language-toggle" id="languageToggle" aria-label="Switch to Chinese">中 / EN</button>
|
<button type="button" class="language-toggle" id="languageToggle" aria-label="Switch to Chinese">中 / EN</button>
|
||||||
<button type="button" class="theme-toggle" id="themeToggle" aria-label="Toggle theme">
|
<button type="button" class="theme-toggle" id="themeToggle" aria-label="Toggle theme">
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
<a href="#scenario" class="m-link"><span data-zh="真实协作">In a run</span></a>
|
<a href="#scenario" class="m-link"><span data-zh="真实协作">In a run</span></a>
|
||||||
<a href="#compare" class="m-link"><span data-zh="产品特点">How it differs</span></a>
|
<a href="#compare" class="m-link"><span data-zh="产品特点">How it differs</span></a>
|
||||||
<a href="#faq" class="m-link"><span data-zh="常见问题">FAQ</span></a>
|
<a href="#faq" class="m-link"><span data-zh="常见问题">FAQ</span></a>
|
||||||
<a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8" target="_blank" rel="noopener" class="m-link m-signin"><span data-zh="下载 V1.0.8">Download V1.0.8</span></a>
|
<a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9" target="_blank" rel="noopener" class="m-link m-signin"><span data-zh="下载 V1.0.9">Download V1.0.9</span></a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- ================= HERO ================= -->
|
<!-- ================= HERO ================= -->
|
||||||
@@ -174,9 +174,9 @@
|
|||||||
<p class="subhead" data-zh="Meldwork 是一个<strong>本地优先的多 Agent 协作工作空间</strong>。让你已有的 Agent 共享上下文、讨论方案、在授权范围内执行并检查成果,减少你在它们之间转述和协调的工作。设定目标和权限,在需要补充信息或关键决策时介入。">Meldwork is a <strong>local-first multi-Agent collaboration workspace</strong>. Your existing Agents share context, discuss approaches, carry out authorized work, and check results — with less relaying and coordinating from you. Set the goal and permissions, then step in when they need information or a key decision.</p>
|
<p class="subhead" data-zh="Meldwork 是一个<strong>本地优先的多 Agent 协作工作空间</strong>。让你已有的 Agent 共享上下文、讨论方案、在授权范围内执行并检查成果,减少你在它们之间转述和协调的工作。设定目标和权限,在需要补充信息或关键决策时介入。">Meldwork is a <strong>local-first multi-Agent collaboration workspace</strong>. Your existing Agents share context, discuss approaches, carry out authorized work, and check results — with less relaying and coordinating from you. Set the goal and permissions, then step in when they need information or a key decision.</p>
|
||||||
|
|
||||||
<div class="cta-row">
|
<div class="cta-row">
|
||||||
<a class="cta-primary magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg">
|
<a class="cta-primary magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg">
|
||||||
<span class="cta-label" data-zh="下载 macOS 版">Download for macOS</span>
|
<span class="cta-label" data-zh="下载 macOS 版">Download for macOS</span>
|
||||||
<span class="cta-meta" data-zh="V1.0.8 · Apple 芯片">V1.0.8 · Apple silicon</span>
|
<span class="cta-meta" data-zh="V1.0.9 · Apple 芯片">V1.0.9 · Apple silicon</span>
|
||||||
</a>
|
</a>
|
||||||
<a class="cta-ghost" href="https://github.com/Ryder-Sun/Meldwork" target="_blank" rel="noopener" data-zh="在 GitHub 查看 <span aria-hidden="true">↗</span>">View on GitHub <span aria-hidden="true">↗</span></a>
|
<a class="cta-ghost" href="https://github.com/Ryder-Sun/Meldwork" target="_blank" rel="noopener" data-zh="在 GitHub 查看 <span aria-hidden="true">↗</span>">View on GitHub <span aria-hidden="true">↗</span></a>
|
||||||
</div>
|
</div>
|
||||||
@@ -634,7 +634,7 @@
|
|||||||
<span class="acc-icon" aria-hidden="true"></span>
|
<span class="acc-icon" aria-hidden="true"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="acc-panel">
|
<div class="acc-panel">
|
||||||
<p data-zh="当前 V1.0.8 预览版面向 Apple 芯片 macOS,采用临时签名且未公证,首次启动可能需在<em>系统设置 → 隐私与安全性</em>选择<em>仍要打开</em>。跨平台构建已列入计划,应用基于 Electron,后续将逐步提供相应目标。">The current V1.0.8 preview targets Apple silicon macOS (ad-hoc signed, not notarized — open <em>Open Anyway</em> in <em>System Settings → Privacy & Security</em> on first launch). Cross-platform builds are on the roadmap; the app is Electron so the same source compiles everywhere once those targets land.</p>
|
<p data-zh="当前 V1.0.9 预览版面向 Apple 芯片 macOS,采用临时签名且未公证,首次启动可能需在<em>系统设置 → 隐私与安全性</em>选择<em>仍要打开</em>。跨平台构建已列入计划,应用基于 Electron,后续将逐步提供相应目标。">The current V1.0.9 preview targets Apple silicon macOS (ad-hoc signed, not notarized — open <em>Open Anyway</em> in <em>System Settings → Privacy & Security</em> on first launch). Cross-platform builds are on the roadmap; the app is Electron so the same source compiles everywhere once those targets land.</p>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -651,10 +651,10 @@
|
|||||||
<!-- ================= CTA / FOOTER ================= -->
|
<!-- ================= CTA / FOOTER ================= -->
|
||||||
<footer class="cta-final" id="download">
|
<footer class="cta-final" id="download">
|
||||||
<h2 class="final-title" data-split data-zh="提出目标,让 Agent 们协作完成。">Set the goal. Let Agents work together.</h2>
|
<h2 class="final-title" data-split data-zh="提出目标,让 Agent 们协作完成。">Set the goal. Let Agents work together.</h2>
|
||||||
<p class="final-sub" data-zh="V1.0.8 修复 Kimi 计划空转、MiMo 末尾文本丢失和 Auto 模式重置,并保留重复输出取消前的内容。CLI 仍需有效原生配置;Magpie 流式结束标记问题需单独修复,本安装包不会替换或重启网关。<a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8" target="_blank" rel="noopener">查看验证结果与已知限制 ↗</a>">V1.0.8 fixes Kimi planning loops, missing MiMo tail text, and Auto mode resets, preserving partial replies when repetitive output is cancelled. CLIs still need valid native configuration; Magpie's stream finish-reason defect requires a separate fix. This package does not replace or restart gateways. <a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.8" target="_blank" rel="noopener">Read validation results and known limits ↗</a></p>
|
<p class="final-sub" data-zh="V1.0.9 改进无限轮自动讨论的收尾和交付物认可,并修复认证状态及知识库图标。Agent 仍需有效的原生配置。<a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9" target="_blank" rel="noopener">查看验证结果与已知限制 ↗</a>">V1.0.9 improves unlimited discussion completion and delivery approval, Agent authentication status, and knowledge-base logos. Agents still need valid native configuration. <a href="https://github.com/Ryder-Sun/Meldwork/releases/tag/Meldwork-V1.0.9" target="_blank" rel="noopener">Read validation results and known limits ↗</a></p>
|
||||||
<div class="cta-row">
|
<div class="cta-row">
|
||||||
<a class="cta-primary magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.8/Meldwork-1.0.8-arm64.dmg">
|
<a class="cta-primary magnet" href="https://github.com/Ryder-Sun/Meldwork/releases/download/Meldwork-V1.0.9/Meldwork-1.0.9-arm64.dmg">
|
||||||
<span class="cta-label" data-zh="下载 V1.0.8">Download V1.0.8</span>
|
<span class="cta-label" data-zh="下载 V1.0.9">Download V1.0.9</span>
|
||||||
<span class="cta-meta" data-zh="DMG · Apple 芯片">DMG · Apple silicon</span>
|
<span class="cta-meta" data-zh="DMG · Apple 芯片">DMG · Apple silicon</span>
|
||||||
</a>
|
</a>
|
||||||
<a class="cta-ghost" href="https://github.com/Ryder-Sun/Meldwork#readme" target="_blank" rel="noopener" data-zh="阅读中文说明 <span aria-hidden="true">↗</span>">Read the README <span aria-hidden="true">↗</span></a>
|
<a class="cta-ghost" href="https://github.com/Ryder-Sun/Meldwork#readme" target="_blank" rel="noopener" data-zh="阅读中文说明 <span aria-hidden="true">↗</span>">Read the README <span aria-hidden="true">↗</span></a>
|
||||||
|
|||||||
Reference in new issue
Block a user