diff --git a/README.md b/README.md
index 719bbb9..6ac5921 100644
--- a/README.md
+++ b/README.md
@@ -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.
@@ -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.
-## 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.
@@ -111,6 +111,12 @@ npm --prefix frontend run build:desktop
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 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.
diff --git a/README.zh-CN.md b/README.zh-CN.md
index c8935b8..baea943 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -15,7 +15,7 @@ Meldwork 是一个本地优先的多 Agent 协作工作空间,用来连接你
你无需安排每一轮发言,但仍负责目标、权限和关键决策。遇到信息缺失、权限请求或需要取舍的问题时,任务可能等待你处理。工作区写入需要明确授权;协作过程、运行状态和产物保存在本地,方便回看和继续工作。
diff --git a/frontend/src/__tests__/meldwork/App.composer.spec.js b/frontend/src/__tests__/meldwork/App.composer.spec.js
index 151e4ec..798fb2d 100644
--- a/frontend/src/__tests__/meldwork/App.composer.spec.js
+++ b/frontend/src/__tests__/meldwork/App.composer.spec.js
@@ -878,13 +878,14 @@ describe('Meldwork workbench', () => {
await textarea.setValue('@ding')
await flushPromises()
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('Knowledge')
await option.trigger('click')
expect(wrapper.get('.selected-knowledge-base-avatar').attributes('title')).toBe('Remove knowledge base')
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 wrapper.get('.send-button').trigger('click')
diff --git a/frontend/src/__tests__/meldwork/App.spec.js b/frontend/src/__tests__/meldwork/App.spec.js
index ba540bf..21d3ab9 100644
--- a/frontend/src/__tests__/meldwork/App.spec.js
+++ b/frontend/src/__tests__/meldwork/App.spec.js
@@ -56,7 +56,9 @@ describe('Meldwork workbench', () => {
await flushPromises()
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.get('.agent-discovery-overlay').find('.wave-physics-loader').exists()).toBe(true)
expect(wrapper.get('.agent-discovery-overlay').findAll('.wave-physics-loader')).toHaveLength(1)
diff --git a/frontend/src/__tests__/meldwork/agentCatalog.spec.js b/frontend/src/__tests__/meldwork/agentCatalog.spec.js
index a8bea0f..5c68bef 100644
--- a/frontend/src/__tests__/meldwork/agentCatalog.spec.js
+++ b/frontend/src/__tests__/meldwork/agentCatalog.spec.js
@@ -18,6 +18,24 @@ function catalogFor(agent) {
}
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', () => {
const snapshot = ref({ agents: [
{ kind: 'hermes', installed: true, available: false, showInSidebar: false },
diff --git a/frontend/src/__tests__/meldwork/knowledgeBaseSettings.spec.js b/frontend/src/__tests__/meldwork/knowledgeBaseSettings.spec.js
index 70e4dfe..827edcb 100644
--- a/frontend/src/__tests__/meldwork/knowledgeBaseSettings.spec.js
+++ b/frontend/src/__tests__/meldwork/knowledgeBaseSettings.spec.js
@@ -26,6 +26,16 @@ function obsidianStatus(vaultPath) {
}
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 () => {
const full = deferred()
const targeted = deferred()
diff --git a/frontend/src/composables/useAgentCatalog.js b/frontend/src/composables/useAgentCatalog.js
index 113cbc1..2904caa 100644
--- a/frontend/src/composables/useAgentCatalog.js
+++ b/frontend/src/composables/useAgentCatalog.js
@@ -142,6 +142,10 @@ export function useAgentCatalog({
if (['workbuddy-desktop-locked', 'workbuddy-model-unavailable'].includes(agent.availabilitySource)) {
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.custom) return { label: t('customAgent.executableUnavailable'), tone: 'warning', icon: WarningOutline }
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).
function agentStateNote(agent) {
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-model-unavailable') return t('workbuddy.modelUnavailable')
const version = agent.resolvedVersion || agent.version || ''
diff --git a/frontend/src/composables/useKnowledgeBaseSettings.js b/frontend/src/composables/useKnowledgeBaseSettings.js
index 09f9bed..825c941 100644
--- a/frontend/src/composables/useKnowledgeBaseSettings.js
+++ b/frontend/src/composables/useKnowledgeBaseSettings.js
@@ -25,6 +25,7 @@ export function useKnowledgeBaseSettings({ knowledgeBase, showError }) {
...definition,
...definition.defaultState,
...(sourceMap.value.get(definition.kind) || {}),
+ logo: definition.logo,
})))
const localEntries = computed(() => entries.value.filter(source => !comingSoon(source)))
const plannedEntries = computed(() => entries.value.filter(comingSoon))
diff --git a/frontend/src/knowledgeBaseCatalog.js b/frontend/src/knowledgeBaseCatalog.js
index c824eb1..5f94144 100644
--- a/frontend/src/knowledgeBaseCatalog.js
+++ b/frontend/src/knowledgeBaseCatalog.js
@@ -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) {
if (accessMode === 'vault') {
@@ -41,43 +49,43 @@ export const KNOWLEDGE_BASE_CATALOG = Object.freeze([
{
kind: 'feishu',
accessMode: 'cli',
- logo: publicAsset('knowledge-base-logos/feishu.svg'),
+ logo: logo(feishuSvg),
defaultState: defaultState('cli'),
},
{
kind: 'dingtalk',
accessMode: 'cli',
- logo: publicAsset('knowledge-base-logos/dingtalk.svg'),
+ logo: logo(dingtalkSvg),
defaultState: defaultState('cli'),
},
{
kind: 'obsidian',
accessMode: 'vault',
- logo: publicAsset('knowledge-base-logos/obsidian.svg'),
+ logo: logo(obsidianSvg),
defaultState: defaultState('vault'),
},
{
kind: 'notion',
accessMode: 'oauth',
- logo: publicAsset('knowledge-base-logos/notion.svg'),
+ logo: logo(notionSvg),
defaultState: defaultState('oauth'),
},
{
kind: 'confluence',
accessMode: 'oauth',
- logo: publicAsset('knowledge-base-logos/confluence.svg'),
+ logo: logo(confluenceSvg),
defaultState: defaultState('oauth'),
},
{
kind: 'googledrive',
accessMode: 'oauth',
- logo: publicAsset('knowledge-base-logos/googledrive.svg'),
+ logo: logo(googleDriveSvg),
defaultState: defaultState('oauth'),
},
{
kind: 'sharepoint',
accessMode: 'oauth',
- logo: publicAsset('knowledge-base-logos/sharepoint.svg'),
+ logo: logo(sharepointSvg),
defaultState: defaultState('oauth'),
},
])
diff --git a/frontend/src/locales/en.js b/frontend/src/locales/en.js
index ac0e439..aad9517 100644
--- a/frontend/src/locales/en.js
+++ b/frontend/src/locales/en.js
@@ -46,8 +46,6 @@ export default {
'delivery.viewing': 'Viewing delivery; next message is regular chat',
'agentDiscovery.kicker': 'Local workspace startup',
'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.bound": "Next message runs this 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.verifiedRange': 'Verified versions: {range}.',
'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.needsLoginCloud': 'This is a cloud Agent: sign in to it on its server, then detect again.',
'agent.detectedVersion': 'Version {version}',
diff --git a/frontend/src/locales/zh.js b/frontend/src/locales/zh.js
index ed25818..f663383 100644
--- a/frontend/src/locales/zh.js
+++ b/frontend/src/locales/zh.js
@@ -46,8 +46,6 @@ export default {
'delivery.viewing': '查看交付中;下一次发送为普通聊天',
'agentDiscovery.kicker': '本地工作台启动中',
'agentDiscovery.title': '正在寻找本地 Agent',
- 'agentDiscovery.body': 'Meldwork 正在检查这台电脑上可用的 Agent CLI。',
- 'agentDiscovery.status': '正在准备工作台',
"delivery.title": "任务与交付",
"delivery.bound": "下一次发送用于此任务",
"delivery.select": "选择任务",
@@ -219,6 +217,7 @@ export default {
'agent.note.protocolUnavailable': '已安装的版本 {version} 不支持 Meldwork 需要的通信协议。',
'agent.note.verifiedRange': '已验证的版本:{range}。',
'agent.note.probeTimeout': '检测超时。请确认它能在终端里正常启动,然后重新检测。',
+ 'agent.note.nativeRuntimeUnavailable': 'Meldwork 无法准备原生运行环境;终端可能使用了不同的配置或 Gateway。',
'agent.note.needsLogin': '请先在终端运行它并完成登录,然后重新检测。',
'agent.note.needsLoginCloud': '这是云端 Agent:请到对应的服务器上完成登录,然后重新检测。',
'agent.detectedVersion': '版本 {version}',
diff --git a/frontend/src/styles/agent-discovery.css b/frontend/src/styles/agent-discovery.css
index 6ef2481..7b21f8f 100644
--- a/frontend/src/styles/agent-discovery.css
+++ b/frontend/src/styles/agent-discovery.css
@@ -60,30 +60,6 @@
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-leave-active {
transition: opacity 0.28s ease;
diff --git a/meldwork-landing/index.html b/meldwork-landing/index.html
index cfaa8c7..c67b3f8 100644
--- a/meldwork-landing/index.html
+++ b/meldwork-landing/index.html
@@ -28,13 +28,13 @@
"name": "Meldwork",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "macOS (Apple silicon)",
- "softwareVersion": "1.0.8",
+ "softwareVersion": "1.0.9",
"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.",
"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" },
"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)."
},
{
@@ -78,7 +78,7 @@
{
"@type": "Question",
"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 @@
How it differsFAQ
-
- Download V1.0.8
+
+ Download V1.0.9
-
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.
+
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.