@swarmclawai/swarmclaw 1.2.1 → 1.2.3

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.
Files changed (149) hide show
  1. package/README.md +16 -85
  2. package/bin/server-cmd.js +64 -1
  3. package/package.json +2 -2
  4. package/skills/coding-agent/SKILL.md +111 -0
  5. package/skills/github/SKILL.md +140 -0
  6. package/skills/nano-banana-pro/SKILL.md +62 -0
  7. package/skills/nano-banana-pro/scripts/generate_image.py +235 -0
  8. package/skills/nano-pdf/SKILL.md +53 -0
  9. package/skills/openai-image-gen/SKILL.md +78 -0
  10. package/skills/openai-image-gen/scripts/gen.py +328 -0
  11. package/skills/resourceful-problem-solving/SKILL.md +49 -0
  12. package/skills/skill-creator/SKILL.md +147 -0
  13. package/skills/skill-creator/scripts/init_skill.py +378 -0
  14. package/skills/skill-creator/scripts/quick_validate.py +159 -0
  15. package/skills/summarize/SKILL.md +77 -0
  16. package/src/app/api/auth/route.ts +20 -5
  17. package/src/app/api/chats/[id]/devserver/route.ts +13 -19
  18. package/src/app/api/chats/[id]/messages/route.ts +13 -15
  19. package/src/app/api/chats/[id]/route.ts +9 -10
  20. package/src/app/api/chats/[id]/stop/route.ts +5 -7
  21. package/src/app/api/chats/messages-route.test.ts +8 -6
  22. package/src/app/api/chats/route.ts +9 -10
  23. package/src/app/api/ip/route.ts +2 -2
  24. package/src/app/api/preview-server/route.ts +1 -1
  25. package/src/app/api/projects/[id]/route.ts +7 -46
  26. package/src/cli/server-cmd.test.js +74 -0
  27. package/src/components/chat/chat-area.tsx +45 -23
  28. package/src/components/chat/message-bubble.test.ts +35 -0
  29. package/src/components/chat/message-bubble.tsx +19 -9
  30. package/src/components/chat/message-list.tsx +37 -3
  31. package/src/components/input/chat-input.tsx +34 -14
  32. package/src/components/openclaw/openclaw-deploy-panel.tsx +4 -0
  33. package/src/instrumentation.ts +1 -1
  34. package/src/lib/chat/assistant-render-id.ts +3 -0
  35. package/src/lib/chat/chat-streaming-state.test.ts +42 -3
  36. package/src/lib/chat/chat-streaming-state.ts +20 -8
  37. package/src/lib/chat/queued-message-queue.test.ts +23 -1
  38. package/src/lib/chat/queued-message-queue.ts +11 -2
  39. package/src/lib/providers/cli-utils.test.ts +124 -0
  40. package/src/lib/server/activity/activity-log.ts +21 -0
  41. package/src/lib/server/agents/agent-availability.test.ts +10 -5
  42. package/src/lib/server/agents/agent-cascade.ts +79 -59
  43. package/src/lib/server/agents/agent-registry.ts +3 -1
  44. package/src/lib/server/agents/agent-repository.ts +90 -0
  45. package/src/lib/server/agents/delegation-job-repository.ts +53 -0
  46. package/src/lib/server/agents/delegation-jobs.ts +11 -4
  47. package/src/lib/server/agents/guardian-checkpoint-repository.ts +35 -0
  48. package/src/lib/server/agents/guardian.ts +2 -2
  49. package/src/lib/server/agents/main-agent-loop.ts +10 -3
  50. package/src/lib/server/agents/main-loop-state-repository.ts +38 -0
  51. package/src/lib/server/agents/subagent-runtime.ts +9 -6
  52. package/src/lib/server/agents/subagent-swarm.ts +3 -2
  53. package/src/lib/server/agents/task-session.ts +3 -4
  54. package/src/lib/server/approvals/approval-repository.ts +30 -0
  55. package/src/lib/server/autonomy/supervisor-incident-repository.ts +42 -0
  56. package/src/lib/server/chat-execution/chat-execution-types.ts +38 -0
  57. package/src/lib/server/chat-execution/chat-execution-utils.ts +1 -1
  58. package/src/lib/server/chat-execution/chat-execution.ts +84 -1926
  59. package/src/lib/server/chat-execution/chat-turn-finalization.ts +620 -0
  60. package/src/lib/server/chat-execution/chat-turn-partial-persistence.ts +221 -0
  61. package/src/lib/server/chat-execution/chat-turn-preflight.ts +133 -0
  62. package/src/lib/server/chat-execution/chat-turn-preparation.ts +817 -0
  63. package/src/lib/server/chat-execution/chat-turn-stream-execution.ts +296 -0
  64. package/src/lib/server/chat-execution/chat-turn-tool-routing.ts +5 -5
  65. package/src/lib/server/chat-execution/message-classifier.test.ts +329 -0
  66. package/src/lib/server/chat-execution/post-stream-finalization.ts +1 -1
  67. package/src/lib/server/chat-execution/prompt-builder.ts +11 -0
  68. package/src/lib/server/chat-execution/prompt-sections.ts +5 -6
  69. package/src/lib/server/chat-execution/situational-awareness.ts +12 -7
  70. package/src/lib/server/chat-execution/stream-agent-chat.ts +16 -13
  71. package/src/lib/server/chatrooms/chatroom-repository.ts +32 -0
  72. package/src/lib/server/connectors/connector-repository.ts +58 -0
  73. package/src/lib/server/connectors/runtime-state.test.ts +117 -0
  74. package/src/lib/server/credentials/credential-repository.ts +7 -0
  75. package/src/lib/server/gateways/gateway-profile-repository.ts +4 -0
  76. package/src/lib/server/memory/memory-abstract.test.ts +59 -0
  77. package/src/lib/server/missions/mission-repository.ts +74 -0
  78. package/src/lib/server/missions/mission-service/actions.ts +6 -0
  79. package/src/lib/server/missions/mission-service/bindings.ts +9 -0
  80. package/src/lib/server/missions/mission-service/context.ts +4 -0
  81. package/src/lib/server/missions/mission-service/core.ts +2269 -0
  82. package/src/lib/server/missions/mission-service/queries.ts +12 -0
  83. package/src/lib/server/missions/mission-service/recovery.ts +5 -0
  84. package/src/lib/server/missions/mission-service/ticks.ts +9 -0
  85. package/src/lib/server/missions/mission-service.test.ts +9 -2
  86. package/src/lib/server/missions/mission-service.ts +6 -2266
  87. package/src/lib/server/openclaw/deploy.test.ts +42 -3
  88. package/src/lib/server/openclaw/deploy.ts +26 -12
  89. package/src/lib/server/persistence/repository-utils.ts +154 -0
  90. package/src/lib/server/persistence/storage-context.ts +51 -0
  91. package/src/lib/server/persistence/transaction.ts +1 -0
  92. package/src/lib/server/projects/project-repository.ts +36 -0
  93. package/src/lib/server/projects/project-service.ts +79 -0
  94. package/src/lib/server/protocols/protocol-normalization.test.ts +6 -4
  95. package/src/lib/server/runtime/alert-dispatch.ts +1 -1
  96. package/src/lib/server/runtime/daemon-policy.ts +1 -1
  97. package/src/lib/server/runtime/daemon-state/core.ts +1570 -0
  98. package/src/lib/server/runtime/daemon-state/health.ts +6 -0
  99. package/src/lib/server/runtime/daemon-state/policy.ts +7 -0
  100. package/src/lib/server/runtime/daemon-state/supervisor.ts +6 -0
  101. package/src/lib/server/runtime/daemon-state.test.ts +48 -0
  102. package/src/lib/server/runtime/daemon-state.ts +3 -1470
  103. package/src/lib/server/runtime/estop-repository.ts +4 -0
  104. package/src/lib/server/runtime/estop.ts +3 -1
  105. package/src/lib/server/runtime/heartbeat-service.test.ts +2 -2
  106. package/src/lib/server/runtime/heartbeat-service.ts +55 -34
  107. package/src/lib/server/runtime/heartbeat-wake.ts +6 -4
  108. package/src/lib/server/runtime/idle-window.ts +2 -2
  109. package/src/lib/server/runtime/network.ts +11 -0
  110. package/src/lib/server/runtime/orchestrator-events.ts +2 -2
  111. package/src/lib/server/runtime/queue/claims.ts +4 -0
  112. package/src/lib/server/runtime/queue/core.ts +2079 -0
  113. package/src/lib/server/runtime/queue/execution.ts +7 -0
  114. package/src/lib/server/runtime/queue/followups.ts +4 -0
  115. package/src/lib/server/runtime/queue/queries.ts +12 -0
  116. package/src/lib/server/runtime/queue/recovery.ts +7 -0
  117. package/src/lib/server/runtime/queue-recovery.test.ts +48 -13
  118. package/src/lib/server/runtime/queue-repository.ts +17 -0
  119. package/src/lib/server/runtime/queue.ts +5 -2061
  120. package/src/lib/server/runtime/run-ledger.ts +6 -5
  121. package/src/lib/server/runtime/run-repository.ts +73 -0
  122. package/src/lib/server/runtime/runtime-lock-repository.ts +8 -0
  123. package/src/lib/server/runtime/runtime-settings.ts +1 -1
  124. package/src/lib/server/runtime/runtime-state.ts +99 -0
  125. package/src/lib/server/runtime/scheduler.ts +4 -2
  126. package/src/lib/server/runtime/session-run-manager/cancellation.ts +157 -0
  127. package/src/lib/server/runtime/session-run-manager/drain.ts +246 -0
  128. package/src/lib/server/runtime/session-run-manager/enqueue.ts +287 -0
  129. package/src/lib/server/runtime/session-run-manager/queries.ts +117 -0
  130. package/src/lib/server/runtime/session-run-manager/recovery.ts +238 -0
  131. package/src/lib/server/runtime/session-run-manager/state.ts +441 -0
  132. package/src/lib/server/runtime/session-run-manager/types.ts +74 -0
  133. package/src/lib/server/runtime/session-run-manager.ts +72 -1377
  134. package/src/lib/server/runtime/watch-job-repository.ts +35 -0
  135. package/src/lib/server/runtime/watch-jobs.ts +3 -1
  136. package/src/lib/server/schedules/schedule-repository.ts +42 -0
  137. package/src/lib/server/sessions/session-repository.ts +85 -0
  138. package/src/lib/server/settings/settings-repository.ts +25 -0
  139. package/src/lib/server/skills/skill-discovery.test.ts +2 -2
  140. package/src/lib/server/skills/skill-discovery.ts +2 -2
  141. package/src/lib/server/skills/skill-repository.ts +14 -0
  142. package/src/lib/server/storage.ts +13 -24
  143. package/src/lib/server/tasks/task-repository.ts +54 -0
  144. package/src/lib/server/usage/usage-repository.ts +30 -0
  145. package/src/lib/server/webhooks/webhook-repository.ts +10 -0
  146. package/src/lib/strip-internal-metadata.test.ts +42 -41
  147. package/src/stores/use-chat-store.test.ts +54 -0
  148. package/src/stores/use-chat-store.ts +21 -5
  149. /package/{bundled-skills → skills}/google-workspace/SKILL.md +0 -0
@@ -0,0 +1,7 @@
1
+ export {
2
+ cleanupFinishedTaskSessions,
3
+ dequeueNextRunnableTask,
4
+ disableSessionHeartbeat,
5
+ enqueueTask,
6
+ processNext,
7
+ } from './core'
@@ -0,0 +1,4 @@
1
+ export {
2
+ collectTaskConnectorFollowupTargets,
3
+ resolveTaskOriginConnectorFollowupTarget,
4
+ } from './core'
@@ -0,0 +1,12 @@
1
+ export type {
2
+ TaskResumeContext,
3
+ TaskResumeState,
4
+ } from './core'
5
+
6
+ export {
7
+ applyTaskResumeStateToSession,
8
+ extractSessionResumeState,
9
+ extractTaskResumeState,
10
+ resolveTaskResumeContext,
11
+ resolveReusableTaskSessionId,
12
+ } from './core'
@@ -0,0 +1,7 @@
1
+ export {
2
+ promoteDeferred,
3
+ reconcileFinishedRunningTasks,
4
+ recoverStalledRunningTasks,
5
+ resumeQueue,
6
+ validateCompletedTasksQueue,
7
+ } from './core'
@@ -7,7 +7,7 @@ import { describe, it } from 'node:test'
7
7
 
8
8
  const repoRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../..')
9
9
 
10
- function runWithTempDataDir(script: string) {
10
+ function runWithTempDataDir<T extends Record<string, unknown>>(script: string): T {
11
11
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'swarmclaw-queue-recovery-'))
12
12
  try {
13
13
  const result = spawnSync(process.execPath, ['--import', 'tsx', '--input-type=module', '--eval', script], {
@@ -28,7 +28,7 @@ function runWithTempDataDir(script: string) {
28
28
  .map((line) => line.trim())
29
29
  .filter(Boolean)
30
30
  const jsonLine = [...lines].reverse().find((line) => line.startsWith('{'))
31
- return JSON.parse(jsonLine || '{}') as Record<string, any>
31
+ return JSON.parse(jsonLine || '{}') as T
32
32
  } finally {
33
33
  fs.rmSync(tempDir, { recursive: true, force: true })
34
34
  }
@@ -36,7 +36,13 @@ function runWithTempDataDir(script: string) {
36
36
 
37
37
  describe('queue recovery', () => {
38
38
  it('processNext recovers orphaned queued tasks and defers them when the agent is disabled', () => {
39
- const output = runWithTempDataDir(`
39
+ const output = runWithTempDataDir<{
40
+ status: string | null
41
+ queued: string[]
42
+ retryDelayMs: number | null
43
+ error: string | null
44
+ deferredReason: string | null
45
+ }>(`
40
46
  const storageMod = await import('@/lib/server/storage')
41
47
  const queueMod = await import('@/lib/server/runtime/queue')
42
48
  const storage = storageMod.default || storageMod
@@ -76,18 +82,28 @@ describe('queue recovery', () => {
76
82
  queued: queueItems,
77
83
  retryDelayMs: typeof task?.retryScheduledAt === 'number' ? task.retryScheduledAt - now : null,
78
84
  error: task?.error ?? null,
85
+ deferredReason: task?.deferredReason ?? null,
79
86
  }))
80
87
  `)
81
88
 
82
- assert.equal(output.status, 'queued')
83
- assert.deepEqual(output.queued, ['orphaned'])
84
- assert.equal(typeof output.retryDelayMs, 'number')
85
- assert.ok(output.retryDelayMs >= 55_000 && output.retryDelayMs <= 65_000)
86
- assert.match(output.error, /disabled/i)
89
+ assert.equal(output.status, 'deferred')
90
+ assert.deepEqual(output.queued, [])
91
+ assert.equal(output.retryDelayMs, null)
92
+ assert.equal(output.error, null)
93
+ assert.ok(output.deferredReason)
94
+ assert.match(output.deferredReason, /disabled/i)
87
95
  })
88
96
 
89
97
  it('recoverStalledRunningTasks requeues tasks missing startedAt and records the recovery', () => {
90
- const output = runWithTempDataDir(`
98
+ const output = runWithTempDataDir<{
99
+ result: { recovered: number; deadLettered: number }
100
+ status: string | null
101
+ queued: string[]
102
+ retryDelayMs: number | null
103
+ error: string | null
104
+ comment: string | null
105
+ scheduledCalls: number
106
+ }>(`
91
107
  const storageMod = await import('@/lib/server/storage')
92
108
  const queueMod = await import('@/lib/server/runtime/queue')
93
109
  const storage = storageMod.default || storageMod
@@ -135,14 +151,26 @@ describe('queue recovery', () => {
135
151
  assert.equal(output.status, 'queued')
136
152
  assert.deepEqual(output.queued, ['broken'])
137
153
  assert.equal(typeof output.retryDelayMs, 'number')
154
+ assert.ok(output.retryDelayMs !== null)
138
155
  assert.ok(output.retryDelayMs >= 25_000 && output.retryDelayMs <= 35_000)
156
+ assert.ok(output.error)
139
157
  assert.match(output.error, /missing startedAt/i)
158
+ assert.ok(output.comment)
140
159
  assert.match(output.comment, /missing startedAt/i)
141
160
  assert.equal(output.scheduledCalls, 1)
142
161
  })
143
162
 
144
163
  it('recoverStalledRunningTasks preserves retry policy backoff for stalled tasks', () => {
145
- const output = runWithTempDataDir(`
164
+ const output = runWithTempDataDir<{
165
+ result: { recovered: number; deadLettered: number }
166
+ status: string | null
167
+ attempts: number | null
168
+ queued: string[]
169
+ retryDelayMs: number | null
170
+ error: string | null
171
+ heartbeatEnabled: boolean | null
172
+ scheduledCalls: number
173
+ }>(`
146
174
  const storageMod = await import('@/lib/server/storage')
147
175
  const queueMod = await import('@/lib/server/runtime/queue')
148
176
  const storage = storageMod.default || storageMod
@@ -212,14 +240,20 @@ describe('queue recovery', () => {
212
240
  assert.equal(output.attempts, 1)
213
241
  assert.deepEqual(output.queued, ['stalled'])
214
242
  assert.equal(typeof output.retryDelayMs, 'number')
215
- assert.ok(output.retryDelayMs >= 85_000 && output.retryDelayMs <= 95_000)
243
+ assert.ok(output.retryDelayMs !== null)
244
+ assert.ok(output.retryDelayMs >= 85_000 && output.retryDelayMs <= 100_000)
245
+ assert.ok(output.error)
216
246
  assert.match(output.error, /Retry scheduled after failure/i)
217
247
  assert.equal(output.heartbeatEnabled, false)
218
248
  assert.equal(output.scheduledCalls, 1)
219
249
  })
220
250
 
221
251
  it('resumeQueue restores blocked queued tasks without clobbering their queuedAt timestamp', () => {
222
- const output = runWithTempDataDir(`
252
+ const output = runWithTempDataDir<{
253
+ queued: string[]
254
+ queuedAt: number | null
255
+ status: string | null
256
+ }>(`
223
257
  const storageMod = await import('@/lib/server/storage')
224
258
  const queueMod = await import('@/lib/server/runtime/queue')
225
259
  const storage = storageMod.default || storageMod
@@ -261,9 +295,10 @@ describe('queue recovery', () => {
261
295
  }))
262
296
  `)
263
297
 
264
- assert.deepEqual(output.queued, ['blocked'])
298
+ assert.deepEqual(output.queued, ['blocked', 'dep'])
265
299
  assert.equal(output.status, 'queued')
266
300
  assert.equal(typeof output.queuedAt, 'number')
301
+ assert.ok(output.queuedAt !== null)
267
302
  assert.ok(output.queuedAt < Date.now() - 30_000)
268
303
  })
269
304
  })
@@ -0,0 +1,17 @@
1
+ import { loadQueue as loadStoredQueue, saveQueue as saveStoredQueue } from '@/lib/server/storage'
2
+ import { createSingletonRepository } from '@/lib/server/persistence/repository-utils'
3
+
4
+ export const queueRepository = createSingletonRepository<string[], string[]>(
5
+ 'queue',
6
+ {
7
+ get() {
8
+ return loadStoredQueue()
9
+ },
10
+ save(value) {
11
+ saveStoredQueue(value)
12
+ },
13
+ },
14
+ )
15
+
16
+ export const loadQueue = () => queueRepository.get()
17
+ export const saveQueue = (queue: string[]) => queueRepository.save(queue)