@swarmclawai/swarmclaw 1.9.25 → 1.9.26

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
@@ -151,14 +151,14 @@ clawhub install swarmclaw
151
151
 
152
152
  [Browse on ClawHub](https://clawhub.ai/skills/swarmclaw)
153
153
 
154
- ## v1.9.25 Highlights
154
+ ## v1.9.26 Highlights
155
155
 
156
- Gateway lifecycle controls and Slack peer-agent collaboration are now safer for multi-agent operations.
156
+ Output hygiene follow-up: empty successful LLM turns now stay silent instead of being rewritten as user-visible errors.
157
157
 
158
- - **Gateway lifecycle controls.** Providers can activate, drain, cordon, or request restart for saved OpenClaw gateways.
159
- - **Routing guardrails.** New OpenClaw work skips draining or cordoned gateway profiles, and Operations Pulse flags unavailable gateways.
160
- - **CLI lifecycle access.** `swarmclaw gateways activate`, `drain`, `cordon`, and `restart` now reach the same lifecycle control endpoint as the provider UI.
161
- - **Slack peer messages.** Peer bot messages now reach the existing connector policy gates while self-loop messages are still blocked.
158
+ - **Silent empty completions.** Blank successful runs no longer become `Error: Run completed...` assistant messages.
159
+ - **Connector-safe final text.** Slack and other connectors no longer receive synthetic error text for intentional silence or quiet no-op turns.
160
+ - **Real errors preserved.** Explicit provider failures and streamed provider errors still surface as terminal errors.
161
+ - **Regression coverage.** Chat-execution tests now lock the distinction between empty success and real failure.
162
162
 
163
163
  ## Hosted Deploys
164
164
 
@@ -410,6 +410,15 @@ Operational docs: https://swarmclaw.ai/docs/observability
410
410
 
411
411
  ## Releases
412
412
 
413
+ ### v1.9.26 Highlights
414
+
415
+ Output hygiene follow-up: empty successful LLM turns now stay silent instead of being rewritten as user-visible errors.
416
+
417
+ - **Silent empty completions.** Blank successful runs no longer become `Error: Run completed...` assistant messages.
418
+ - **Connector-safe final text.** Slack and other connectors no longer receive synthetic error text for intentional silence or quiet no-op turns.
419
+ - **Real errors preserved.** Explicit provider failures and streamed provider errors still surface as terminal errors.
420
+ - **Regression coverage.** Chat-execution tests now lock the distinction between empty success and real failure.
421
+
413
422
  ### v1.9.25 Highlights
414
423
 
415
424
  Gateway lifecycle release: saved OpenClaw gateways now have explicit operator lifecycle controls, automatic routing avoids gateways that should not receive new work, and Slack peer-agent messages flow through the existing connector policy gates.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swarmclawai/swarmclaw",
3
- "version": "1.9.25",
3
+ "version": "1.9.26",
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",
@@ -240,15 +240,14 @@ describe('deriveTerminalRunError advanced', () => {
240
240
  assert.equal(err, undefined)
241
241
  })
242
242
 
243
- it('generates user-friendly error for empty everything (non-internal)', () => {
243
+ it('returns undefined for empty successful non-internal runs', () => {
244
244
  const err = deriveTerminalRunError({
245
245
  fullResponse: '',
246
246
  streamErrors: [],
247
247
  toolEvents: [],
248
248
  internal: false,
249
249
  })
250
- assert.ok(err)
251
- assert.ok(err.includes('Check the provider configuration'))
250
+ assert.equal(err, undefined)
252
251
  })
253
252
 
254
253
  it('uses errorMessage directly when provided', () => {
@@ -184,7 +184,7 @@ describe('deriveTerminalRunError', () => {
184
184
  )
185
185
  })
186
186
 
187
- it('converts empty successful runs into a visible assistant error', () => {
187
+ it('does not convert empty successful runs into a visible assistant error', () => {
188
188
  assert.equal(
189
189
  deriveTerminalRunError({
190
190
  errorMessage: undefined,
@@ -193,7 +193,7 @@ describe('deriveTerminalRunError', () => {
193
193
  toolEvents: [],
194
194
  internal: false,
195
195
  }),
196
- 'Run completed without any response text, tool calls, or explicit error details. Check the provider configuration and try again.',
196
+ undefined,
197
197
  )
198
198
  })
199
199
 
@@ -108,9 +108,5 @@ export function deriveTerminalRunError(params: {
108
108
  return params.streamErrors[params.streamErrors.length - 1]
109
109
  }
110
110
 
111
- if (!params.internal && !params.fullResponse.trim() && params.toolEvents.length === 0) {
112
- return 'Run completed without any response text, tool calls, or explicit error details. Check the provider configuration and try again.'
113
- }
114
-
115
111
  return undefined
116
112
  }