@swarmclawai/swarmclaw 1.5.52 → 1.5.53
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
|
@@ -399,6 +399,14 @@ Operational docs: https://swarmclaw.ai/docs/observability
|
|
|
399
399
|
|
|
400
400
|
## Releases
|
|
401
401
|
|
|
402
|
+
### v1.5.53 Highlights
|
|
403
|
+
|
|
404
|
+
- **Mission templates library**: the `/missions` page now opens with a curated gallery of starter missions. Each template pre-wires a goal, success criteria, USD / token / turn / wallclock budgets, and a report cadence, so non-technical users can install a working autonomous run in one click. Initial lineup: Daily News Digest, Inbox Triage, Competitor Watch, Weekly Research Report, Social Listener, and Customer Support Triage. Setup notes flag any connector or permission prerequisites before installation. Power-user overrides (budget caps, success criteria, report cadence) live behind a collapsed **Advanced Settings** panel so the default install flow stays one click.
|
|
405
|
+
- **New API routes `GET /api/missions/templates` and `POST /api/missions/templates/:id/instantiate`** with matching CLI commands `swarmclaw missions templates` and `swarmclaw missions instantiate`. Installed missions persist a `templateId` so the origin is traceable for future template-update flows; legacy missions normalize to `templateId: null` on load, no data migration required.
|
|
406
|
+
- **Fix: switching a session's model now sticks in the UI** ([#50](https://github.com/swarmclawai/swarmclaw/pull/50)). The **Switch Model** panel in the agent inspector was reading from `agent.provider` / `agent.model` (the agent's defaults) instead of `session.provider` / `session.model`, so after saving a model switch the collapsed pill still showed the agent default, the combobox reset to the default when reopened, and `selectedProvider` reverted on every save. `ModelSwitcherInline` now uses `session.provider || agent.provider` and `session.model || agent.model` as the source of truth, and its `useEffect` syncs to `session.provider` changes so a successful save updates the panel immediately.
|
|
407
|
+
|
|
408
|
+
Thanks to [@borislavnnikolov](https://github.com/borislavnnikolov) for the contribution.
|
|
409
|
+
|
|
402
410
|
### v1.5.52 Highlights
|
|
403
411
|
|
|
404
412
|
- **Session X-Ray now surfaces the backend execution log** ([#48](https://github.com/swarmclawai/swarmclaw/pull/48), thanks to [@borislavnnikolov](https://github.com/borislavnnikolov)). The debug panel fetches entries from the SQLite execution log on open and merges them with in-memory message events, sorted by time. Expandable entries show provider, model, stream errors, duration, and token counts — the info that was previously invisible when Ollama or other local-model runs failed silently. A new **Tools** filter tab, an `exec` badge for log-sourced entries, an entry count in the stats bar, and a Refresh button round it out. New API route `GET /api/chats/:id/execution-log` with `limit`, `since`, and `category` query params, registered in the CLI manifest as `swarmclaw chats execution-log`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmclawai/swarmclaw",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.53",
|
|
4
4
|
"description": "Build and run autonomous AI agents with OpenClaw, Hermes, multiple model providers, orchestration, delegation, memory, skills, schedules, and chat connectors.",
|
|
5
5
|
"main": "electron-dist/main.js",
|
|
6
6
|
"license": "MIT",
|
|
@@ -73,22 +73,24 @@ function ModelSwitcherInline({ session, agent }: { session: Session; agent: Agen
|
|
|
73
73
|
const refreshSession = useAppStore((s) => s.refreshSession)
|
|
74
74
|
const streaming = useChatStore((s) => s.streaming)
|
|
75
75
|
const [expanded, setExpanded] = useState(false)
|
|
76
|
-
const [selectedProvider, setSelectedProvider] = useState(agent.provider)
|
|
76
|
+
const [selectedProvider, setSelectedProvider] = useState(session.provider || agent.provider)
|
|
77
77
|
const [saving, setSaving] = useState(false)
|
|
78
78
|
|
|
79
79
|
useEffect(() => {
|
|
80
80
|
void loadProviders()
|
|
81
81
|
void loadProviderConfigs()
|
|
82
82
|
}, [loadProviderConfigs, loadProviders])
|
|
83
|
-
|
|
83
|
+
// Sync selectedProvider when the session's provider changes (e.g. after a successful save)
|
|
84
|
+
useEffect(() => { setSelectedProvider(session.provider || agent.provider) }, [session.provider, agent.provider])
|
|
84
85
|
|
|
85
86
|
const agentSelectableProviders = useMemo(
|
|
86
87
|
() => buildAgentSelectableProviders(providers, providerConfigs),
|
|
87
88
|
[providerConfigs, providers],
|
|
88
89
|
)
|
|
89
90
|
const currentProviderInfo = agentSelectableProviders.find((p) => p.id === selectedProvider)
|
|
90
|
-
const
|
|
91
|
-
const
|
|
91
|
+
const activeSessionProvider = agentSelectableProviders.find((p) => p.id === (session.provider || agent.provider))
|
|
92
|
+
const effectiveProvider = session.provider || agent.provider
|
|
93
|
+
const providerLabel = PROVIDER_LABELS[effectiveProvider] || activeSessionProvider?.name || effectiveProvider.replace(/-/g, ' ')
|
|
92
94
|
|
|
93
95
|
const handleModelChange = async (model: string) => {
|
|
94
96
|
if (saving) return
|
|
@@ -117,7 +119,7 @@ function ModelSwitcherInline({ session, agent }: { session: Session; agent: Agen
|
|
|
117
119
|
{providerLabel}
|
|
118
120
|
</span>
|
|
119
121
|
<span className="inline-flex max-w-[180px] items-center rounded-[8px] border border-white/[0.06] bg-white/[0.03] px-2 py-1 text-[10px] font-mono text-text-3/70 truncate group-hover:border-white/[0.1] group-hover:text-text-2 transition-colors">
|
|
120
|
-
{agent.model || 'Default model'}
|
|
122
|
+
{session.model || agent.model || 'Default model'}
|
|
121
123
|
</span>
|
|
122
124
|
<svg width="8" height="8" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" className="text-text-3/30 group-hover:text-text-3/60 transition-colors ml-auto shrink-0">
|
|
123
125
|
<polyline points="6 9 12 15 18 9" />
|
|
@@ -157,7 +159,7 @@ function ModelSwitcherInline({ session, agent }: { session: Session; agent: Agen
|
|
|
157
159
|
{currentProviderInfo && (
|
|
158
160
|
<ModelCombobox
|
|
159
161
|
providerId={currentProviderInfo.id}
|
|
160
|
-
value={agent.model || currentProviderInfo.models[0] || ''}
|
|
162
|
+
value={session.model || agent.model || currentProviderInfo.models[0] || ''}
|
|
161
163
|
onChange={(m) => void handleModelChange(m)}
|
|
162
164
|
models={currentProviderInfo.models}
|
|
163
165
|
defaultModels={currentProviderInfo.defaultModels}
|