@swarmclawai/swarmclaw 1.5.35 → 1.5.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -69,6 +69,19 @@ Extension tutorial: https://swarmclaw.ai/docs/extension-tutorial
|
|
|
69
69
|
|
|
70
70
|
## Quick Start
|
|
71
71
|
|
|
72
|
+
### Desktop app (recommended for non-technical users)
|
|
73
|
+
|
|
74
|
+
Download the one-click installer from [swarmclaw.ai/downloads](https://swarmclaw.ai/downloads).
|
|
75
|
+
Available for macOS (Apple Silicon & Intel), Windows, and Linux (AppImage + .deb).
|
|
76
|
+
|
|
77
|
+
Current builds are unsigned, so on first launch:
|
|
78
|
+
- **macOS:** right-click the app in Finder → **Open** → **Open** to bypass Gatekeeper.
|
|
79
|
+
- **Windows:** if SmartScreen appears, click **More info** → **Run anyway**.
|
|
80
|
+
- **Linux (AppImage):** `chmod +x` the downloaded file, then run it.
|
|
81
|
+
|
|
82
|
+
Data lives in your OS app-data directory (`~/Library/Application Support/SwarmClaw`,
|
|
83
|
+
`%APPDATA%\SwarmClaw`, or `~/.config/SwarmClaw`), separate from any CLI or Docker install.
|
|
84
|
+
|
|
72
85
|
### Global install
|
|
73
86
|
|
|
74
87
|
```bash
|
|
@@ -375,6 +388,12 @@ Operational docs: https://swarmclaw.ai/docs/observability
|
|
|
375
388
|
|
|
376
389
|
## Releases
|
|
377
390
|
|
|
391
|
+
### v1.5.36 Highlights
|
|
392
|
+
|
|
393
|
+
- **Desktop app (Electron)**: SwarmClaw now ships as a native desktop app for macOS (Apple Silicon + Intel), Windows, and Linux (AppImage + .deb). Download from [swarmclaw.ai/downloads](https://swarmclaw.ai/downloads). The app wraps the existing standalone server inside an Electron shell, stores data in the OS app-data directory, and auto-updates via GitHub Releases (notify-only on unsigned macOS builds).
|
|
394
|
+
- **Desktop release CI**: new `desktop-release.yml` workflow builds and publishes installers for all three platforms to GitHub Releases on every version tag.
|
|
395
|
+
- **UI cleanup**: removed sibling-product navigation links from the in-app sidebar rail and login gate so the open-source app focuses on SwarmClaw itself. Those links remain in the project README and on swarmclaw.ai.
|
|
396
|
+
|
|
378
397
|
### v1.5.35 Highlights
|
|
379
398
|
|
|
380
399
|
- **Update safety: prevent DB corruption on Linux**: `npm run update:easy`, `swarmclaw update`, and the in-app update endpoint now stop the running server (or checkpoint the SQLite WAL) before rebuilding native modules, preventing the WAL journal corruption that forced some Linux users back to the setup wizard.
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmclawai/swarmclaw",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.36",
|
|
4
4
|
"description": "Build and run autonomous AI agents with OpenClaw, Hermes, multiple model providers, orchestration, delegation, memory, skills, schedules, and chat connectors.",
|
|
5
|
+
"main": "electron-dist/main.js",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"publishConfig": {
|
|
7
8
|
"access": "public",
|
|
@@ -78,6 +79,13 @@
|
|
|
78
79
|
"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",
|
|
79
80
|
"test:e2e": "tsx .workbench/browser-e2e/run.ts",
|
|
80
81
|
"test:mcp:conformance": "node --import tsx ./scripts/mcp-conformance-check.ts",
|
|
82
|
+
"electron:compile": "tsc -p electron/tsconfig.json",
|
|
83
|
+
"electron:dev": "npm run electron:compile && electron electron-dist/main.js",
|
|
84
|
+
"electron:build": "node ./scripts/build-electron.mjs",
|
|
85
|
+
"electron:build:mac": "node ./scripts/build-electron.mjs --mac",
|
|
86
|
+
"electron:build:win": "node ./scripts/build-electron.mjs --win",
|
|
87
|
+
"electron:build:linux": "node ./scripts/build-electron.mjs --linux",
|
|
88
|
+
"electron:build:publish": "node ./scripts/build-electron.mjs --publish",
|
|
81
89
|
"prepack": "npm run build:ci",
|
|
82
90
|
"postinstall": "node ./scripts/postinstall.mjs"
|
|
83
91
|
},
|
|
@@ -114,6 +122,7 @@
|
|
|
114
122
|
"class-variance-authority": "^0.7.1",
|
|
115
123
|
"clsx": "^2.1.1",
|
|
116
124
|
"commander": "^13.1.0",
|
|
125
|
+
"electron-updater": "^6.3.9",
|
|
117
126
|
"cron-parser": "^5.5.0",
|
|
118
127
|
"cronstrue": "^3.12.0",
|
|
119
128
|
"dagre": "^0.8.5",
|
|
@@ -156,7 +165,10 @@
|
|
|
156
165
|
"zustand": "^5.0.11"
|
|
157
166
|
},
|
|
158
167
|
"devDependencies": {
|
|
168
|
+
"@electron/rebuild": "^3.7.2",
|
|
159
169
|
"@types/dagre": "^0.7.54",
|
|
170
|
+
"electron": "^33.3.0",
|
|
171
|
+
"electron-builder": "^25.1.8",
|
|
160
172
|
"eslint": "^9",
|
|
161
173
|
"eslint-config-next": "16.1.7"
|
|
162
174
|
},
|
|
@@ -9,11 +9,6 @@ interface AccessKeyGateProps {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
const AUTH_CHECK_TIMEOUT_MS = 8_000
|
|
12
|
-
const NETWORK_LINKS = [
|
|
13
|
-
{ href: 'https://www.swarmdock.ai', label: 'SwarmDock' },
|
|
14
|
-
{ href: 'https://swarmrecall.ai', label: 'SwarmRecall' },
|
|
15
|
-
{ href: 'https://swarmrelay.ai', label: 'SwarmRelay' },
|
|
16
|
-
]
|
|
17
12
|
|
|
18
13
|
function isExpectedAuthCheckError(err: unknown): boolean {
|
|
19
14
|
return isAbortError(err) || isTimeoutError(err)
|
|
@@ -427,25 +422,6 @@ export function AccessKeyGate({ onAuthenticated }: AccessKeyGateProps) {
|
|
|
427
422
|
</>
|
|
428
423
|
)}
|
|
429
424
|
|
|
430
|
-
<div className="mt-10 border-t border-white/[0.06] pt-5" style={{ animation: 'fade-up 0.6s var(--ease-spring) 0.35s both' }}>
|
|
431
|
-
<p className="text-[10px] font-700 uppercase tracking-[0.18em] text-text-3/55">
|
|
432
|
-
Network
|
|
433
|
-
</p>
|
|
434
|
-
<div className="mt-3 flex flex-wrap items-center justify-center gap-2.5">
|
|
435
|
-
{NETWORK_LINKS.map((link) => (
|
|
436
|
-
<a
|
|
437
|
-
key={link.href}
|
|
438
|
-
href={link.href}
|
|
439
|
-
target="_blank"
|
|
440
|
-
rel="noopener noreferrer"
|
|
441
|
-
className="rounded-full border border-white/[0.08] bg-white/[0.03] px-3 py-1.5 text-[12px] text-text-3
|
|
442
|
-
no-underline transition-all duration-200 hover:border-white/[0.14] hover:bg-white/[0.06] hover:text-text"
|
|
443
|
-
>
|
|
444
|
-
{link.label}
|
|
445
|
-
</a>
|
|
446
|
-
))}
|
|
447
|
-
</div>
|
|
448
|
-
</div>
|
|
449
425
|
</div>
|
|
450
426
|
</div>
|
|
451
427
|
)
|
|
@@ -17,11 +17,6 @@ import type { AppView } from '@/types'
|
|
|
17
17
|
const RAIL_EXPANDED_KEY = 'sc_rail_expanded'
|
|
18
18
|
const GITHUB_REPO_URL = 'https://github.com/swarmclawai/swarmclaw'
|
|
19
19
|
const DISCORD_URL = 'https://discord.gg/sbEavS8cPV'
|
|
20
|
-
const NETWORK_LINKS = [
|
|
21
|
-
{ href: 'https://www.swarmdock.ai', label: 'SwarmDock', abbr: 'DO' },
|
|
22
|
-
{ href: 'https://swarmrecall.ai', label: 'SwarmRecall', abbr: 'RE' },
|
|
23
|
-
{ href: 'https://swarmrelay.ai', label: 'SwarmRelay', abbr: 'RL' },
|
|
24
|
-
]
|
|
25
20
|
|
|
26
21
|
export function SidebarRail({
|
|
27
22
|
onSwitchUser,
|
|
@@ -394,48 +389,6 @@ export function SidebarRail({
|
|
|
394
389
|
|
|
395
390
|
{/* Bottom: Docs + Daemon + Settings + User */}
|
|
396
391
|
<div className={`flex flex-col gap-1 ${railExpanded ? 'px-3' : 'items-center'}`}>
|
|
397
|
-
{railExpanded ? (
|
|
398
|
-
<div className="mb-1">
|
|
399
|
-
<div className="px-3 pb-1 text-[10px] font-700 uppercase tracking-[0.12em] text-text-3/45">Network</div>
|
|
400
|
-
<div className="flex flex-col gap-1">
|
|
401
|
-
{NETWORK_LINKS.map((link) => (
|
|
402
|
-
<a
|
|
403
|
-
key={link.href}
|
|
404
|
-
href={link.href}
|
|
405
|
-
target="_blank"
|
|
406
|
-
rel="noopener noreferrer"
|
|
407
|
-
className="w-full flex items-center gap-2.5 px-3 py-2 rounded-[10px] text-[13px] font-500 cursor-pointer transition-all
|
|
408
|
-
bg-transparent text-text-3 hover:text-text hover:bg-white/[0.04] no-underline"
|
|
409
|
-
style={{ fontFamily: 'inherit' }}
|
|
410
|
-
>
|
|
411
|
-
<span className="flex h-5 w-5 shrink-0 items-center justify-center rounded-[6px] border border-white/[0.08] bg-white/[0.03] text-[10px] font-700 uppercase tracking-[0.08em] text-text-3/80">
|
|
412
|
-
{link.abbr}
|
|
413
|
-
</span>
|
|
414
|
-
{link.label}
|
|
415
|
-
<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" className="ml-auto opacity-40">
|
|
416
|
-
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" /><polyline points="15 3 21 3 21 9" /><line x1="10" y1="14" x2="21" y2="3" />
|
|
417
|
-
</svg>
|
|
418
|
-
</a>
|
|
419
|
-
))}
|
|
420
|
-
</div>
|
|
421
|
-
</div>
|
|
422
|
-
) : (
|
|
423
|
-
<>
|
|
424
|
-
<div className="my-1 h-px w-6 bg-white/[0.06]" />
|
|
425
|
-
{NETWORK_LINKS.map((link) => (
|
|
426
|
-
<RailTooltip key={link.href} label={link.label} description="Open product site in a new tab">
|
|
427
|
-
<a
|
|
428
|
-
href={link.href}
|
|
429
|
-
target="_blank"
|
|
430
|
-
rel="noopener noreferrer"
|
|
431
|
-
className="rail-btn text-[10px] font-700 uppercase tracking-[0.08em] no-underline"
|
|
432
|
-
>
|
|
433
|
-
{link.abbr}
|
|
434
|
-
</a>
|
|
435
|
-
</RailTooltip>
|
|
436
|
-
))}
|
|
437
|
-
</>
|
|
438
|
-
)}
|
|
439
392
|
{railExpanded ? (
|
|
440
393
|
<a
|
|
441
394
|
href="https://swarmclaw.ai/docs"
|