Skip to content

Commit 7f271e7

Browse files
committed
Release v1.7.2
1 parent 485e5c6 commit 7f271e7

22 files changed

Lines changed: 640 additions & 428 deletions

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,16 @@ Operational docs: https://swarmclaw.ai/docs/observability
399399

400400
## Releases
401401

402+
### v1.7.2 Highlights
403+
404+
CLI provider usability follow-up for v1.7.0/v1.7.1. The expanded coding-agent roster is now easier to find, configure, and validate from onboarding and setup diagnostics.
405+
406+
- **Shared CLI provider registry.** Bespoke and generic CLI providers now share one metadata source for display names, binary names, capabilities, setup defaults, and provider-set behavior, reducing drift across onboarding, runtime routing, setup doctor, and capability prompts.
407+
- **Onboarding exposes the full CLI roster.** The setup wizard groups providers by CLI agents, gateways/local runtimes, API providers, and custom endpoints, with search so the 31 extended CLI providers added in v1.7 are usable without digging through settings.
408+
- **Connection checks for every CLI provider.** Bespoke CLIs keep auth-aware checks, while generic CLIs verify that the expected binary is on PATH and return actionable install guidance when missing.
409+
- **Update banner polish.** Source installs now show the target stable tag/version, remember dismissal per release target, and make the required restart after update explicit.
410+
- **macOS desktop note.** macOS builds remain ad-hoc signed and not notarized in this release, so the existing Gatekeeper/quarantine workaround still applies until Developer ID signing is available.
411+
402412
### v1.7.1 Highlights
403413

404414
Republish of v1.7.0 from the correct commit. The v1.7.0 tarball on npm was inadvertently published from a pre-rebase tree that did not include the v1.6.1 codex continuity fixes (PR #62) or the v1.6.2 plan doc. v1.7.1 ships the same coding-agent-roster expansion on top of the correct v1.6.1+ history.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@swarmclawai/swarmclaw",
3-
"version": "1.7.1",
3+
"version": "1.7.2",
44
"description": "Build and run autonomous AI agents with OpenClaw, Hermes, multiple model providers, orchestration, delegation, memory, skills, schedules, and chat connectors.",
55
"main": "electron-dist/main.js",
66
"license": "MIT",
@@ -87,7 +87,7 @@
8787
"test:cli": "node --test src/cli/*.test.js bin/*.test.js scripts/postinstall.test.mjs scripts/run-next-build.test.mjs scripts/run-next-typegen.test.mjs",
8888
"test:setup": "tsx --test src/app/api/setup/check-provider/route.test.ts src/lib/server/provider-model-discovery.test.ts src/components/auth/setup-wizard/utils.test.ts src/components/auth/setup-wizard/types.test.ts src/hooks/setup-done-detection.test.ts src/lib/setup-defaults.test.ts src/lib/server/storage-auth.test.ts src/lib/server/storage-auth-docker.test.ts",
8989
"test:openclaw": "tsx --test src/lib/openclaw/openclaw-agent-id.test.ts src/lib/openclaw/openclaw-endpoint.test.ts src/lib/server/agents/agent-runtime-config.test.ts src/lib/server/build-llm.test.ts src/lib/server/connectors/connector-routing.test.ts src/lib/server/connectors/openclaw.test.ts src/lib/server/connectors/swarmdock.test.ts src/lib/server/gateway/protocol.test.ts src/lib/server/llm-response-cache.test.ts src/lib/server/mcp-conformance.test.ts src/lib/server/openclaw/agent-resolver.test.ts src/lib/server/openclaw/deploy.test.ts src/lib/server/openclaw/skills-normalize.test.ts src/lib/server/session-tools/openclaw-nodes.test.ts src/lib/server/session-tools/swarmdock.test.ts src/lib/server/tasks/task-quality-gate.test.ts src/lib/server/tasks/task-validation.test.ts src/lib/server/tool-capability-policy.test.ts src/lib/providers/openai.test.ts src/lib/providers/openclaw-exports.test.ts src/app/api/openclaw/dashboard-url/route.test.ts",
90-
"test:runtime": "tsx --test src/lib/a2a/agent-card.test.ts src/lib/strip-internal-metadata.test.ts src/lib/providers/opencode-cli.test.ts src/lib/providers/cli-utils.test.ts src/lib/providers/generic-cli.test.ts src/lib/server/mcp-gateway-runtime.test.ts src/lib/server/mcp-connection-pool.test.ts src/lib/server/knowledge-sources.test.ts src/lib/server/chat-execution/chat-execution-grounding.test.ts src/lib/server/chat-execution/chat-turn-preparation.test.ts src/lib/server/chat-execution/iteration-timers.test.ts src/lib/server/chat-execution/post-stream-finalization.test.ts src/lib/server/chats/clear-undo-snapshots.test.ts src/lib/server/connectors/email.test.ts src/lib/server/protocols/protocol-service.test.ts src/lib/server/runtime/run-ledger.test.ts src/lib/server/observability/otel-config.test.ts src/lib/server/safe-parse-body.test.ts src/lib/server/missions/mission-templates.test.ts src/lib/app/view-constants.test.ts src/lib/quality/quality-summary.test.ts src/app/api/approvals/route.test.ts src/app/api/agents/agents-route.test.ts src/app/api/tasks/tasks-route.test.ts src/app/api/chats/chat-route.test.ts src/app/api/chats/clear-route.test.ts src/app/api/chats/compact-route.test.ts src/app/api/chats/context-status-route.test.ts src/app/api/connectors/connector-doctor-route.test.ts src/app/api/healthz/route.test.ts src/app/api/logs/route.test.ts src/app/api/providers/[id]/route.test.ts src/app/api/tts/route.test.ts",
90+
"test:runtime": "tsx --test src/lib/a2a/agent-card.test.ts src/lib/strip-internal-metadata.test.ts src/lib/provider-sets.test.ts src/lib/providers/opencode-cli.test.ts src/lib/providers/cli-provider-metadata.test.ts src/lib/providers/cli-utils.test.ts src/lib/providers/generic-cli.test.ts src/lib/server/cli-provider-readiness.test.ts src/lib/server/provider-health.test.ts src/lib/server/mcp-gateway-runtime.test.ts src/lib/server/mcp-connection-pool.test.ts src/lib/server/knowledge-sources.test.ts src/lib/server/chat-execution/chat-execution-grounding.test.ts src/lib/server/chat-execution/chat-turn-preparation.test.ts src/lib/server/chat-execution/iteration-timers.test.ts src/lib/server/chat-execution/post-stream-finalization.test.ts src/lib/server/chats/clear-undo-snapshots.test.ts src/lib/server/connectors/email.test.ts src/lib/server/protocols/protocol-service.test.ts src/lib/server/runtime/run-ledger.test.ts src/lib/server/observability/otel-config.test.ts src/lib/server/safe-parse-body.test.ts src/lib/server/missions/mission-templates.test.ts src/lib/app/view-constants.test.ts src/lib/quality/quality-summary.test.ts src/app/api/approvals/route.test.ts src/app/api/agents/agents-route.test.ts src/app/api/tasks/tasks-route.test.ts src/app/api/chats/chat-route.test.ts src/app/api/chats/clear-route.test.ts src/app/api/chats/compact-route.test.ts src/app/api/chats/context-status-route.test.ts src/app/api/connectors/connector-doctor-route.test.ts src/app/api/healthz/route.test.ts src/app/api/logs/route.test.ts src/app/api/providers/[id]/route.test.ts src/app/api/tts/route.test.ts",
9191
"test:builder": "tsx --test src/features/protocols/builder/utils/nodes-to-template.test.ts src/features/protocols/builder/utils/template-to-nodes.test.ts src/features/protocols/builder/validators/dag-validator.test.ts",
9292
"test:e2e": "node --import tsx scripts/browser-e2e-smoke.ts",
9393
"test:mcp:conformance": "node --import tsx ./scripts/mcp-conformance-check.ts",

scripts/run-next-build.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { ensureBuildBootstrapPaths } from './build-bootstrap-env.mjs'
1111

1212
const require = createRequire(import.meta.url)
1313

14-
export const DEFAULT_MAX_OLD_SPACE_SIZE_MB = '8192'
14+
export const DEFAULT_MAX_OLD_SPACE_SIZE_MB = '12288'
1515
export const MIN_MAX_OLD_SPACE_SIZE_MB = 1024
1616
export const FALLBACK_MIN_MAX_OLD_SPACE_SIZE_MB = 512
1717
export const RESERVED_BUILD_MEMORY_MB = 768

src/app/api/setup/check-provider/route.ts

Lines changed: 5 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,12 @@ import { NextResponse } from 'next/server'
22
import { loadCredentials, decryptKey, loadProviderConfigs } from '@/lib/server/storage'
33
import { listCredentialIdsByProvider } from '@/lib/server/credentials/credential-service'
44
import { getDeviceId, wsConnect, rpcOnConnectedGateway } from '@/lib/providers/openclaw'
5-
import { buildCliEnv, probeCliAuth, resolveCliBinary } from '@/lib/providers/cli-utils'
5+
import { isCliProviderId } from '@/lib/providers/cli-provider-metadata'
6+
import { checkCliProviderReady } from '@/lib/server/cli-provider-readiness'
67
import { OPENAI_COMPATIBLE_DEFAULTS } from '@/lib/server/provider-health'
78
import { resolveOllamaRuntimeConfig } from '@/lib/server/ollama-runtime'
89
import { normalizeOllamaSetupEndpoint, normalizeOpenClawUrl, parseErrorMessage } from './helpers'
910

10-
type SetupProvider =
11-
| 'claude-cli'
12-
| 'codex-cli'
13-
| 'opencode-cli'
14-
| 'gemini-cli'
15-
| 'copilot-cli'
16-
| 'droid-cli'
17-
| 'cursor-cli'
18-
| 'qwen-code-cli'
19-
| 'goose'
20-
| 'openai'
21-
| 'openrouter'
22-
| 'anthropic'
23-
| 'google'
24-
| 'deepseek'
25-
| 'groq'
26-
| 'together'
27-
| 'mistral'
28-
| 'xai'
29-
| 'fireworks'
30-
| 'nebius'
31-
| 'deepinfra'
32-
| 'ollama'
33-
| 'openclaw'
34-
| 'hermes'
35-
36-
type CliSetupProvider = 'claude-cli' | 'codex-cli' | 'opencode-cli' | 'gemini-cli' | 'copilot-cli' | 'droid-cli' | 'cursor-cli' | 'qwen-code-cli' | 'goose'
37-
3811
interface SetupCheckBody {
3912
provider?: string
4013
apiKey?: string
@@ -280,43 +253,13 @@ async function checkOpenClaw(apiKey: string, endpointRaw: string): Promise<{ ok:
280253
return { ok: true, message: 'Connected to OpenClaw gateway.', normalizedEndpoint, deviceId, recommendedModel }
281254
}
282255

283-
function checkCliProvider(provider: CliSetupProvider): { ok: boolean; message: string } {
284-
const env = buildCliEnv()
285-
const config = {
286-
'claude-cli': { binary: 'claude', backend: 'claude' as const, label: 'Claude Code CLI' },
287-
'codex-cli': { binary: 'codex', backend: 'codex' as const, label: 'OpenAI Codex CLI' },
288-
'opencode-cli': { binary: 'opencode', backend: 'opencode' as const, label: 'OpenCode CLI' },
289-
'gemini-cli': { binary: 'gemini', backend: 'gemini' as const, label: 'Gemini CLI' },
290-
'copilot-cli': { binary: 'copilot', backend: 'copilot' as const, label: 'GitHub Copilot CLI' },
291-
'droid-cli': { binary: 'droid', backend: 'droid' as const, label: 'Factory Droid CLI' },
292-
'cursor-cli': { binary: 'cursor-agent', backend: 'cursor' as const, label: 'Cursor Agent CLI' },
293-
'qwen-code-cli': { binary: 'qwen', backend: 'qwen' as const, label: 'Qwen Code CLI' },
294-
goose: { binary: 'goose', backend: 'goose' as const, label: 'Goose CLI' },
295-
}[provider]
296-
297-
if (!config) return { ok: false, message: 'Unknown CLI provider.' }
298-
const binary = resolveCliBinary(config.binary)
299-
if (!binary) {
300-
return {
301-
ok: false,
302-
message: `${config.label} is not installed. Install \`${config.binary}\` and ensure it is on your PATH.`,
303-
}
304-
}
305-
const auth = probeCliAuth(binary, config.backend, env, process.cwd())
306-
if (!auth.authenticated) {
307-
return { ok: false, message: auth.errorMessage || `${config.label} is not configured.` }
308-
}
309-
return { ok: true, message: `${config.label} is installed and ready.` }
310-
}
311-
312256
export async function POST(req: Request) {
313257
const body = parseBody(await req.json().catch(() => ({})))
314-
const provider = clean(body.provider) as SetupProvider
258+
const provider = clean(body.provider)
315259
let apiKey = clean(body.apiKey)
316260
const credentialId = clean(body.credentialId)
317261
let endpoint = clean(body.endpoint)
318262
const model = clean(body.model)
319-
const CLI_PROVIDERS = new Set<CliSetupProvider>(['claude-cli', 'codex-cli', 'opencode-cli', 'gemini-cli', 'copilot-cli', 'droid-cli', 'cursor-cli', 'qwen-code-cli', 'goose'])
320263

321264
// Resolve credentialId to an API key if no raw key was provided
322265
if (!apiKey && credentialId) {
@@ -355,8 +298,8 @@ export async function POST(req: Request) {
355298
} catch { /* best effort */ }
356299
}
357300

358-
if (CLI_PROVIDERS.has(provider as CliSetupProvider)) {
359-
const result = checkCliProvider(provider as CliSetupProvider)
301+
if (isCliProviderId(provider)) {
302+
const result = checkCliProviderReady(provider)
360303
return NextResponse.json(result)
361304
}
362305

src/app/api/setup/doctor/route.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { DATA_DIR } from '@/lib/server/data-dir'
66
import { loadAgents, loadCredentials, loadSettings, loadCollection } from '@/lib/server/storage'
77
import { dedup, errorMessage } from '@/lib/shared-utils'
88
import { detectDocker } from '@/lib/server/sandbox/docker-detect'
9+
import { BESPOKE_CLI_PROVIDER_METADATA, GENERIC_CLI_PROVIDER_METADATA } from '@/lib/providers/cli-provider-metadata'
910

1011
type CheckStatus = 'pass' | 'warn' | 'fail'
1112

@@ -198,15 +199,11 @@ export async function GET(req: Request) {
198199
} catch { /* best-effort */ }
199200

200201
const optionalBinaries: Array<{ id: string; label: string; command: string }> = [
201-
{ id: 'claude-cli', label: 'Claude Code CLI', command: 'claude' },
202-
{ id: 'codex-cli', label: 'OpenAI Codex CLI', command: 'codex' },
203-
{ id: 'opencode-cli', label: 'OpenCode CLI', command: 'opencode' },
204-
{ id: 'gemini-cli', label: 'Gemini CLI', command: 'gemini' },
205-
{ id: 'copilot-cli', label: 'GitHub Copilot CLI', command: 'copilot' },
206-
{ id: 'droid-cli', label: 'Factory Droid CLI', command: 'droid' },
207-
{ id: 'cursor-cli', label: 'Cursor Agent CLI', command: 'cursor-agent' },
208-
{ id: 'qwen-code-cli', label: 'Qwen Code CLI', command: 'qwen' },
209-
{ id: 'goose', label: 'Goose CLI', command: 'goose' },
202+
...BESPOKE_CLI_PROVIDER_METADATA.map((provider) => ({
203+
id: provider.id,
204+
label: provider.displayName,
205+
command: provider.binaryName,
206+
})),
210207
{ id: 'google-workspace-cli', label: 'Google Workspace CLI', command: 'gws' },
211208
]
212209

@@ -223,6 +220,19 @@ export async function GET(req: Request) {
223220
)
224221
}
225222

223+
const genericCliInstalled = GENERIC_CLI_PROVIDER_METADATA
224+
.filter((provider) => commandExists(provider.binaryName))
225+
.map((provider) => provider.displayName)
226+
pushCheck(
227+
checks,
228+
'extended-cli-providers',
229+
'Extended CLI provider roster',
230+
genericCliInstalled.length > 0 ? 'pass' : 'warn',
231+
genericCliInstalled.length > 0
232+
? `${genericCliInstalled.length} extended CLI provider(s) detected: ${genericCliInstalled.slice(0, 8).join(', ')}${genericCliInstalled.length > 8 ? ', ...' : ''}.`
233+
: `${GENERIC_CLI_PROVIDER_METADATA.length} optional extended CLI provider(s) are available in SwarmClaw; install any matching CLI when you want to use it.`,
234+
)
235+
226236
const extensionSettings = (settings?.extensionSettings && typeof settings.extensionSettings === 'object')
227237
? settings.extensionSettings as Record<string, Record<string, unknown>>
228238
: {}

0 commit comments

Comments
 (0)