@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.
- package/README.md +16 -85
- package/bin/server-cmd.js +64 -1
- package/package.json +2 -2
- package/skills/coding-agent/SKILL.md +111 -0
- package/skills/github/SKILL.md +140 -0
- package/skills/nano-banana-pro/SKILL.md +62 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +235 -0
- package/skills/nano-pdf/SKILL.md +53 -0
- package/skills/openai-image-gen/SKILL.md +78 -0
- package/skills/openai-image-gen/scripts/gen.py +328 -0
- package/skills/resourceful-problem-solving/SKILL.md +49 -0
- package/skills/skill-creator/SKILL.md +147 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/quick_validate.py +159 -0
- package/skills/summarize/SKILL.md +77 -0
- package/src/app/api/auth/route.ts +20 -5
- package/src/app/api/chats/[id]/devserver/route.ts +13 -19
- package/src/app/api/chats/[id]/messages/route.ts +13 -15
- package/src/app/api/chats/[id]/route.ts +9 -10
- package/src/app/api/chats/[id]/stop/route.ts +5 -7
- package/src/app/api/chats/messages-route.test.ts +8 -6
- package/src/app/api/chats/route.ts +9 -10
- package/src/app/api/ip/route.ts +2 -2
- package/src/app/api/preview-server/route.ts +1 -1
- package/src/app/api/projects/[id]/route.ts +7 -46
- package/src/cli/server-cmd.test.js +74 -0
- package/src/components/chat/chat-area.tsx +45 -23
- package/src/components/chat/message-bubble.test.ts +35 -0
- package/src/components/chat/message-bubble.tsx +19 -9
- package/src/components/chat/message-list.tsx +37 -3
- package/src/components/input/chat-input.tsx +34 -14
- package/src/components/openclaw/openclaw-deploy-panel.tsx +4 -0
- package/src/instrumentation.ts +1 -1
- package/src/lib/chat/assistant-render-id.ts +3 -0
- package/src/lib/chat/chat-streaming-state.test.ts +42 -3
- package/src/lib/chat/chat-streaming-state.ts +20 -8
- package/src/lib/chat/queued-message-queue.test.ts +23 -1
- package/src/lib/chat/queued-message-queue.ts +11 -2
- package/src/lib/providers/cli-utils.test.ts +124 -0
- package/src/lib/server/activity/activity-log.ts +21 -0
- package/src/lib/server/agents/agent-availability.test.ts +10 -5
- package/src/lib/server/agents/agent-cascade.ts +79 -59
- package/src/lib/server/agents/agent-registry.ts +3 -1
- package/src/lib/server/agents/agent-repository.ts +90 -0
- package/src/lib/server/agents/delegation-job-repository.ts +53 -0
- package/src/lib/server/agents/delegation-jobs.ts +11 -4
- package/src/lib/server/agents/guardian-checkpoint-repository.ts +35 -0
- package/src/lib/server/agents/guardian.ts +2 -2
- package/src/lib/server/agents/main-agent-loop.ts +10 -3
- package/src/lib/server/agents/main-loop-state-repository.ts +38 -0
- package/src/lib/server/agents/subagent-runtime.ts +9 -6
- package/src/lib/server/agents/subagent-swarm.ts +3 -2
- package/src/lib/server/agents/task-session.ts +3 -4
- package/src/lib/server/approvals/approval-repository.ts +30 -0
- package/src/lib/server/autonomy/supervisor-incident-repository.ts +42 -0
- package/src/lib/server/chat-execution/chat-execution-types.ts +38 -0
- package/src/lib/server/chat-execution/chat-execution-utils.ts +1 -1
- package/src/lib/server/chat-execution/chat-execution.ts +84 -1926
- package/src/lib/server/chat-execution/chat-turn-finalization.ts +620 -0
- package/src/lib/server/chat-execution/chat-turn-partial-persistence.ts +221 -0
- package/src/lib/server/chat-execution/chat-turn-preflight.ts +133 -0
- package/src/lib/server/chat-execution/chat-turn-preparation.ts +817 -0
- package/src/lib/server/chat-execution/chat-turn-stream-execution.ts +296 -0
- package/src/lib/server/chat-execution/chat-turn-tool-routing.ts +5 -5
- package/src/lib/server/chat-execution/message-classifier.test.ts +329 -0
- package/src/lib/server/chat-execution/post-stream-finalization.ts +1 -1
- package/src/lib/server/chat-execution/prompt-builder.ts +11 -0
- package/src/lib/server/chat-execution/prompt-sections.ts +5 -6
- package/src/lib/server/chat-execution/situational-awareness.ts +12 -7
- package/src/lib/server/chat-execution/stream-agent-chat.ts +16 -13
- package/src/lib/server/chatrooms/chatroom-repository.ts +32 -0
- package/src/lib/server/connectors/connector-repository.ts +58 -0
- package/src/lib/server/connectors/runtime-state.test.ts +117 -0
- package/src/lib/server/credentials/credential-repository.ts +7 -0
- package/src/lib/server/gateways/gateway-profile-repository.ts +4 -0
- package/src/lib/server/memory/memory-abstract.test.ts +59 -0
- package/src/lib/server/missions/mission-repository.ts +74 -0
- package/src/lib/server/missions/mission-service/actions.ts +6 -0
- package/src/lib/server/missions/mission-service/bindings.ts +9 -0
- package/src/lib/server/missions/mission-service/context.ts +4 -0
- package/src/lib/server/missions/mission-service/core.ts +2269 -0
- package/src/lib/server/missions/mission-service/queries.ts +12 -0
- package/src/lib/server/missions/mission-service/recovery.ts +5 -0
- package/src/lib/server/missions/mission-service/ticks.ts +9 -0
- package/src/lib/server/missions/mission-service.test.ts +9 -2
- package/src/lib/server/missions/mission-service.ts +6 -2266
- package/src/lib/server/openclaw/deploy.test.ts +42 -3
- package/src/lib/server/openclaw/deploy.ts +26 -12
- package/src/lib/server/persistence/repository-utils.ts +154 -0
- package/src/lib/server/persistence/storage-context.ts +51 -0
- package/src/lib/server/persistence/transaction.ts +1 -0
- package/src/lib/server/projects/project-repository.ts +36 -0
- package/src/lib/server/projects/project-service.ts +79 -0
- package/src/lib/server/protocols/protocol-normalization.test.ts +6 -4
- package/src/lib/server/runtime/alert-dispatch.ts +1 -1
- package/src/lib/server/runtime/daemon-policy.ts +1 -1
- package/src/lib/server/runtime/daemon-state/core.ts +1570 -0
- package/src/lib/server/runtime/daemon-state/health.ts +6 -0
- package/src/lib/server/runtime/daemon-state/policy.ts +7 -0
- package/src/lib/server/runtime/daemon-state/supervisor.ts +6 -0
- package/src/lib/server/runtime/daemon-state.test.ts +48 -0
- package/src/lib/server/runtime/daemon-state.ts +3 -1470
- package/src/lib/server/runtime/estop-repository.ts +4 -0
- package/src/lib/server/runtime/estop.ts +3 -1
- package/src/lib/server/runtime/heartbeat-service.test.ts +2 -2
- package/src/lib/server/runtime/heartbeat-service.ts +55 -34
- package/src/lib/server/runtime/heartbeat-wake.ts +6 -4
- package/src/lib/server/runtime/idle-window.ts +2 -2
- package/src/lib/server/runtime/network.ts +11 -0
- package/src/lib/server/runtime/orchestrator-events.ts +2 -2
- package/src/lib/server/runtime/queue/claims.ts +4 -0
- package/src/lib/server/runtime/queue/core.ts +2079 -0
- package/src/lib/server/runtime/queue/execution.ts +7 -0
- package/src/lib/server/runtime/queue/followups.ts +4 -0
- package/src/lib/server/runtime/queue/queries.ts +12 -0
- package/src/lib/server/runtime/queue/recovery.ts +7 -0
- package/src/lib/server/runtime/queue-recovery.test.ts +48 -13
- package/src/lib/server/runtime/queue-repository.ts +17 -0
- package/src/lib/server/runtime/queue.ts +5 -2061
- package/src/lib/server/runtime/run-ledger.ts +6 -5
- package/src/lib/server/runtime/run-repository.ts +73 -0
- package/src/lib/server/runtime/runtime-lock-repository.ts +8 -0
- package/src/lib/server/runtime/runtime-settings.ts +1 -1
- package/src/lib/server/runtime/runtime-state.ts +99 -0
- package/src/lib/server/runtime/scheduler.ts +4 -2
- package/src/lib/server/runtime/session-run-manager/cancellation.ts +157 -0
- package/src/lib/server/runtime/session-run-manager/drain.ts +246 -0
- package/src/lib/server/runtime/session-run-manager/enqueue.ts +287 -0
- package/src/lib/server/runtime/session-run-manager/queries.ts +117 -0
- package/src/lib/server/runtime/session-run-manager/recovery.ts +238 -0
- package/src/lib/server/runtime/session-run-manager/state.ts +441 -0
- package/src/lib/server/runtime/session-run-manager/types.ts +74 -0
- package/src/lib/server/runtime/session-run-manager.ts +72 -1377
- package/src/lib/server/runtime/watch-job-repository.ts +35 -0
- package/src/lib/server/runtime/watch-jobs.ts +3 -1
- package/src/lib/server/schedules/schedule-repository.ts +42 -0
- package/src/lib/server/sessions/session-repository.ts +85 -0
- package/src/lib/server/settings/settings-repository.ts +25 -0
- package/src/lib/server/skills/skill-discovery.test.ts +2 -2
- package/src/lib/server/skills/skill-discovery.ts +2 -2
- package/src/lib/server/skills/skill-repository.ts +14 -0
- package/src/lib/server/storage.ts +13 -24
- package/src/lib/server/tasks/task-repository.ts +54 -0
- package/src/lib/server/usage/usage-repository.ts +30 -0
- package/src/lib/server/webhooks/webhook-repository.ts +10 -0
- package/src/lib/strip-internal-metadata.test.ts +42 -41
- package/src/stores/use-chat-store.test.ts +54 -0
- package/src/stores/use-chat-store.ts +21 -5
- /package/{bundled-skills → skills}/google-workspace/SKILL.md +0 -0
|
@@ -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
|
|
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, '
|
|
83
|
-
assert.deepEqual(output.queued, [
|
|
84
|
-
assert.equal(
|
|
85
|
-
assert.
|
|
86
|
-
assert.
|
|
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
|
|
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)
|