@clawops/cli 1.7.1 → 1.7.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 (41) hide show
  1. package/README.md +37 -92
  2. package/dist/{apply-BTZFFGAD.js → apply-PZ5IIU7Z.js} +5 -4
  3. package/dist/{aws-D7Y6LCGK.js → aws-L4RR2LSE.js} +1 -1
  4. package/dist/{azure-JQAMNVHN.js → azure-7OXQENQL.js} +1 -1
  5. package/dist/{bootstrap-RY4VOSDJ.js → bootstrap-HL4DNUNG.js} +13 -4
  6. package/dist/bootstrap.sh.tmpl +204 -0
  7. package/dist/chunk-2YOP6N7X.js +126 -0
  8. package/dist/{chunk-GJEF6UQA.js → chunk-3XK66DKK.js} +100 -16
  9. package/dist/{chunk-ISFHLA4G.js → chunk-5SPESD5N.js} +8 -6
  10. package/dist/{chunk-YTH4L2GN.js → chunk-6X45DDGH.js} +5 -4
  11. package/dist/{chunk-XKT42M34.js → chunk-C5X375RO.js} +14 -1
  12. package/dist/{chunk-LCKD7L7X.js → chunk-DQDAWNGB.js} +1 -1
  13. package/dist/{chunk-CG3Y7Y2R.js → chunk-FSUWPL7Q.js} +9 -9
  14. package/dist/{chunk-FQ4JXUCR.js → chunk-NESXDU5F.js} +7 -4
  15. package/dist/{chunk-ZFNPM2WG.js → chunk-O3F7OGH7.js} +40 -3
  16. package/dist/{chunk-3MFZ7E74.js → chunk-P5LKWRPL.js} +3 -3
  17. package/dist/chunk-PVUVI35Y.js +29 -0
  18. package/dist/cli.js +122 -68
  19. package/dist/{context-ALSJMTHE.js → context-5LCUG2QR.js} +1 -1
  20. package/dist/{gcp-6FT2A45S.js → gcp-UG6AWPIZ.js} +1 -1
  21. package/dist/{generate-SPT7PJKR.js → generate-6E7J6BTM.js} +4 -3
  22. package/dist/{harden-BDVYW567.js → harden-URPXLSVF.js} +2 -2
  23. package/dist/{mcp-wire-ZWIYMLEW.js → mcp-wire-SLL4TLSC.js} +1 -1
  24. package/dist/{package-OMPI6RMV.js → package-QE7V2JAT.js} +3 -2
  25. package/dist/{pool-JZGKPP6K.js → pool-QGFQRMGU.js} +2 -2
  26. package/dist/{remote-config-QF5TT7GU.js → remote-config-PFB66RPY.js} +3 -1
  27. package/dist/{server-RGLKKCCU.js → server-L22AJQZO.js} +19 -18
  28. package/dist/{ssh-E2AMBPZY.js → ssh-CNJNLM3E.js} +1 -1
  29. package/dist/{validate-T5M5EHSJ.js → validate-CFQ4FH2T.js} +2 -1
  30. package/dist/version-guard-MZAO4KHS.js +25 -0
  31. package/dist/versions-OEPAS2EL.js +24 -0
  32. package/package.json +3 -2
  33. package/spec/_gen-schemas.md +136 -0
  34. package/spec/deploy-plan.schema.json +193 -0
  35. package/spec/errors.yaml +175 -0
  36. package/spec/integrations.yaml +97 -0
  37. package/spec/invariants.yaml +81 -0
  38. package/spec/mcp-tools.yaml +532 -0
  39. package/spec/models.yaml +113 -0
  40. package/spec/openclaw-versions.yaml +67 -0
  41. package/spec/providers.schema.json +120 -0
@@ -0,0 +1,532 @@
1
+ # MCP Tool Catalog — Single source of truth for clawops's MCP server.
2
+ # Generates src/mcp/tools/_generated.ts via scripts/gen-schemas.ts.
3
+ # Every tool MUST follow R1–R25 (see DESIGN_RULES.md).
4
+ #
5
+ # Key rules enforced in this file:
6
+ # R1 — clawops_ prefix, toolset assignment, ≤30 tools total
7
+ # R3 — descriptions include "Use when" and "Do NOT use when"
8
+ # R5 — stackName optional with default; no hidden state
9
+ # R6 — no credentials in inputs
10
+ # R7 — paths are absolute
11
+ # R8 — enums for closed sets
12
+ # R10 — all four annotation hints set
13
+ # R11 — annotations bound to safety modes (--read-only, --no-destructive)
14
+
15
+ version: 1
16
+
17
+ toolsets:
18
+ - id: cli
19
+ description: 1:1 mappings of clawops CLI commands. Default toolset.
20
+ - id: workflow
21
+ description: Composite agent workflows (R2). Encode user intent.
22
+ - id: read
23
+ description: Read-only tools, the ONLY toolset enabled in --read-only mode (R18).
24
+ - id: admin
25
+ description: Stack management and multi-stack ops. Requires admin profile.
26
+
27
+ # ────────────────────────────────────────────────────────────────────────────
28
+ # READ-ONLY TOOLS
29
+ # ────────────────────────────────────────────────────────────────────────────
30
+
31
+ tools:
32
+ - name: clawops_status
33
+ toolset: [cli, read]
34
+ description: |
35
+ Get current status of a clawops-managed stack: gateway health, OpenClaw
36
+ version, agent count, uptime.
37
+
38
+ Use when: the user asks about the health of a deployed instance, whether
39
+ the gateway is responding, or wants a quick overview.
40
+
41
+ Do NOT use when: the user asks for live logs (use clawops_logs) or wants
42
+ to see specific configuration values (use clawops_config_get).
43
+ annotations:
44
+ title: Get Stack Status
45
+ readOnlyHint: true
46
+ destructiveHint: false
47
+ idempotentHint: true
48
+ openWorldHint: true
49
+ input:
50
+ stackName:
51
+ type: string
52
+ optional: true
53
+ description: Stack name. Defaults to active stack from config.
54
+ output:
55
+ health: { type: enum, values: [healthy, degraded, down, unknown] }
56
+ gatewayUrl: { type: string, format: uri }
57
+ uptimeSec: { type: integer }
58
+ openclawVersion: { type: string }
59
+ agentCount: { type: integer }
60
+ provider: { type: enum, values: [aws, gcp, azure, local] }
61
+ region: { type: string }
62
+
63
+ - name: clawops_logs_tail
64
+ toolset: [cli, read]
65
+ description: |
66
+ Tail recent gateway logs from a clawops-managed instance.
67
+
68
+ Use when: the user wants to investigate recent activity or errors, or
69
+ asks "what's been happening" on the gateway.
70
+
71
+ Do NOT use when: the user wants real-time streaming logs (those are not
72
+ well-suited to tool calls; suggest the user run `clawops logs -f` directly
73
+ in their terminal). Do NOT use for instance-level system logs (use
74
+ clawops_ssh with `journalctl`).
75
+ annotations:
76
+ title: Tail Gateway Logs
77
+ readOnlyHint: true
78
+ destructiveHint: false
79
+ idempotentHint: true
80
+ openWorldHint: true
81
+ input:
82
+ stackName: { type: string, optional: true }
83
+ tailLines: { type: integer, optional: true, default: 100, max: 1000 }
84
+ sinceMin: { type: integer, optional: true, description: "Lines since N minutes ago" }
85
+ output:
86
+ lines: { type: array, items: { type: string }, description: "Trimmed log lines (R14: hard cap 8KB)" }
87
+ truncated: { type: boolean }
88
+ fullLogResource: { type: string, format: uri, description: "clawops:// URI for full log" }
89
+
90
+ - name: clawops_monitor
91
+ toolset: [cli, read]
92
+ description: |
93
+ Take a live snapshot of a running clawops stack: gateway health, container
94
+ status, resource usage (CPU, memory, disk), and recent log lines.
95
+
96
+ Use when: the user wants to know if the gateway is running, how much
97
+ memory or CPU it is using, what recent log activity looks like, or
98
+ wants a quick health overview richer than clawops_status.
99
+
100
+ Do NOT use when: the user wants real-time streaming logs (use
101
+ clawops_logs_tail or suggest `clawops logs -f`). Do NOT use for
102
+ configuration queries (use clawops_config_get).
103
+ annotations:
104
+ title: Monitor Stack Health
105
+ readOnlyHint: true
106
+ destructiveHint: false
107
+ idempotentHint: true
108
+ openWorldHint: true
109
+ input:
110
+ stackName: { type: string, optional: true, description: "Stack name. Defaults to active stack." }
111
+ tailLines: { type: integer, optional: true, default: 5, description: "Log lines to include in snapshot." }
112
+ output:
113
+ gateway:
114
+ reachable: { type: boolean }
115
+ version: { type: string }
116
+ authMode: { type: string }
117
+ container:
118
+ status: { type: string }
119
+ image: { type: string }
120
+ restartCount: { type: integer }
121
+ memUsage: { type: string }
122
+ cpuPct: { type: string }
123
+ uptime: { type: string }
124
+ disk: { type: string }
125
+ logLines: { type: array, items: { type: string } }
126
+ capturedAt: { type: string, format: date-time }
127
+
128
+ - name: clawops_stacks_list
129
+ toolset: [admin, read]
130
+ description: |
131
+ List all clawops-managed stacks across all configured providers.
132
+
133
+ Use when: the user wants an overview of their deployments, asks "what
134
+ stacks do I have", or wants to compare stacks before an operation.
135
+
136
+ Do NOT use when: the user named a specific stack — use clawops_status
137
+ directly with that name.
138
+ annotations:
139
+ title: List Stacks
140
+ readOnlyHint: true
141
+ destructiveHint: false
142
+ idempotentHint: true
143
+ openWorldHint: false
144
+ input: {}
145
+ output:
146
+ stacks:
147
+ type: array
148
+ items:
149
+ type: object
150
+ properties:
151
+ name: { type: string }
152
+ provider: { type: enum, values: [aws, gcp, azure, local] }
153
+ region: { type: string }
154
+ health: { type: enum, values: [healthy, degraded, down, unknown] }
155
+
156
+ - name: clawops_config_get
157
+ toolset: [cli, read]
158
+ description: |
159
+ Read a configuration value from the remote OpenClaw gateway.
160
+
161
+ Use when: the user wants to inspect current OpenClaw config (e.g., which
162
+ model provider is active, which channels are enabled).
163
+
164
+ Do NOT use when: the user wants to change the config — use
165
+ clawops_config_set instead.
166
+ annotations:
167
+ title: Get OpenClaw Config Value
168
+ readOnlyHint: true
169
+ destructiveHint: false
170
+ idempotentHint: true
171
+ openWorldHint: true
172
+ input:
173
+ stackName: { type: string, optional: true }
174
+ key: { type: string, optional: true, description: "Dot-path config key, e.g., gateway.auth.mode. Omit to dump the full config." }
175
+ output:
176
+ value: { type: string, description: "Stringified value; complex objects are JSON-encoded" }
177
+
178
+ - name: clawops_agents_list
179
+ toolset: [cli, read]
180
+ description: |
181
+ List agents currently registered on the remote OpenClaw gateway.
182
+
183
+ Use when: the user wants to see which agents are running, debug agent
184
+ routing, or count active workspaces.
185
+
186
+ Do NOT use when: the user wants agent logs (use clawops_agents_logs).
187
+ annotations:
188
+ title: List OpenClaw Agents
189
+ readOnlyHint: true
190
+ destructiveHint: false
191
+ idempotentHint: true
192
+ openWorldHint: true
193
+ input:
194
+ stackName: { type: string, optional: true }
195
+ output:
196
+ agents:
197
+ type: array
198
+ items:
199
+ type: object
200
+ properties:
201
+ id: { type: string }
202
+ name: { type: string }
203
+ status: { type: enum, values: [running, paused, errored, stopped] }
204
+ channels: { type: array, items: { type: string } }
205
+
206
+ # ────────────────────────────────────────────────────────────────────────────
207
+ # MUTATING CLI TOOLS (destructive flagged per R10/R11; elicitation per R19)
208
+ # ────────────────────────────────────────────────────────────────────────────
209
+
210
+ - name: clawops_up
211
+ toolset: [cli]
212
+ description: |
213
+ Provision and deploy a clawops stack. Idempotent — re-running with no spec
214
+ change produces no diff. Long-running (median 3min, p99 8min) so emits
215
+ progress notifications per R12.
216
+
217
+ Use when: the user explicitly asks to deploy, provision, create, or "spin
218
+ up" a stack. Always after the user has reviewed a plan
219
+ (clawops_plan first when in doubt).
220
+
221
+ Do NOT use when: the user has not yet generated a plan and is in
222
+ exploratory/discovery mode — use clawops_plan first. Do NOT use for an
223
+ existing stack you only need to update; refresh first.
224
+ annotations:
225
+ title: Provision and Deploy Stack
226
+ readOnlyHint: false
227
+ destructiveHint: true
228
+ idempotentHint: true
229
+ openWorldHint: true
230
+ input:
231
+ stackName: { type: string, optional: true }
232
+ provider:
233
+ type: enum
234
+ values: [aws, gcp, azure, local]
235
+ optional: true
236
+ description: Defaults to provider configured for this stack
237
+ region: { type: string, optional: true }
238
+ instanceType:
239
+ type: enum
240
+ values: [micro, small, medium, large, gpu]
241
+ optional: true
242
+ default: small
243
+ openclawVersion: { type: string, optional: true, description: "semver or 'stable'/'dev'" }
244
+ dryRun: { type: boolean, optional: true, default: false }
245
+ output:
246
+ taskId: { type: string, description: "For >60s ops; poll clawops_task_status" }
247
+ stackName: { type: string }
248
+ gatewayUrl: { type: string, format: uri }
249
+ resourceCount: { type: integer }
250
+
251
+ - name: clawops_destroy
252
+ toolset: [cli]
253
+ description: |
254
+ Destroy a clawops stack. Removes ALL provisioned resources. Triggers
255
+ elicitation confirmation showing the resource diff before execution
256
+ (R19). Cannot be undone.
257
+
258
+ Use when: the user explicitly asks to destroy, tear down, delete, or
259
+ remove a stack. Always confirm the stack name.
260
+
261
+ Do NOT use when: the user wants to stop the gateway temporarily — use
262
+ clawops_gateway_stop instead. Do NOT use when in doubt about which stack;
263
+ list first with clawops_stacks_list.
264
+ annotations:
265
+ title: Destroy Stack (DESTRUCTIVE)
266
+ readOnlyHint: false
267
+ destructiveHint: true
268
+ idempotentHint: true
269
+ openWorldHint: true
270
+ input:
271
+ stackName: { type: string }
272
+ yes: { type: boolean, optional: true, default: false, description: "Skip elicitation; CI/scripted use only" }
273
+ output:
274
+ taskId: { type: string }
275
+ destroyedResourceCount: { type: integer }
276
+
277
+ - name: clawops_apply
278
+ toolset: [cli]
279
+ description: |
280
+ Apply a previously-generated Maker plan (deploy-plan.schema.json).
281
+ Deterministic — the plan describes exactly what will be created.
282
+
283
+ Use when: the user has a plan file path and wants to apply it. This is
284
+ the agent-friendly path for any deploy/destroy operation.
285
+
286
+ Do NOT use when: there's no plan file — generate one first with
287
+ clawops_plan.
288
+ annotations:
289
+ title: Apply Maker Plan
290
+ readOnlyHint: false
291
+ destructiveHint: true
292
+ idempotentHint: false
293
+ openWorldHint: true
294
+ input:
295
+ planPath: { type: string, description: "Absolute path to plan JSON (R7)" }
296
+ yes: { type: boolean, optional: true, default: false }
297
+ output:
298
+ taskId: { type: string }
299
+ summary: { type: string, description: "Trimmed; full output as resource (R14)" }
300
+
301
+ - name: clawops_plan
302
+ toolset: [cli, read]
303
+ description: |
304
+ Generate a Maker deploy plan (does NOT apply). Plan is JSON conforming to
305
+ deploy-plan.schema.json — review before applying.
306
+
307
+ Use when: the user wants to see what would be created before committing,
308
+ or you (the agent) need a reviewable artifact for the user to approve.
309
+
310
+ Do NOT use when: the user has explicitly asked to deploy and you already
311
+ have their approval — go directly to clawops_up.
312
+ annotations:
313
+ title: Generate Deploy Plan
314
+ readOnlyHint: true
315
+ destructiveHint: false
316
+ idempotentHint: true
317
+ openWorldHint: true
318
+ input:
319
+ stackName: { type: string, optional: true }
320
+ provider: { type: enum, values: [aws, gcp, azure, local], optional: true }
321
+ region: { type: string, optional: true }
322
+ instanceType: { type: enum, values: [micro, small, medium, large, gpu], optional: true }
323
+ outPath: { type: string, optional: true, description: "Absolute path to write plan; if omitted, plan returned inline" }
324
+ output:
325
+ planPath: { type: string, description: "Absolute path; only set if outPath provided" }
326
+ summary:
327
+ type: object
328
+ description: "Trimmed; full plan available at the planPath or inline"
329
+
330
+ - name: clawops_config_set
331
+ toolset: [cli]
332
+ description: |
333
+ Set a configuration value on the remote OpenClaw gateway. Optionally
334
+ restarts the gateway after.
335
+
336
+ Use when: the user wants to change OpenClaw configuration (model
337
+ provider, channel auth, gateway port).
338
+
339
+ Do NOT use when: the user is reading config — use clawops_config_get.
340
+ Do NOT bulk-edit; one key at a time so changes are auditable (R21).
341
+ annotations:
342
+ title: Set OpenClaw Config Value
343
+ readOnlyHint: false
344
+ destructiveHint: true
345
+ idempotentHint: true
346
+ openWorldHint: true
347
+ input:
348
+ stackName: { type: string, optional: true }
349
+ key: { type: string }
350
+ value: { type: string, description: "Stringified; JSON for complex values" }
351
+ restart: { type: boolean, optional: true, default: false }
352
+ output:
353
+ message: { type: string, description: "Confirmation of the change applied" }
354
+
355
+ - name: clawops_config_unset
356
+ toolset: [cli]
357
+ description: |
358
+ Remove a configuration key from the remote OpenClaw gateway config, reverting
359
+ it to the OpenClaw default.
360
+
361
+ Use when: the user wants to delete a config key entirely (e.g., remove a
362
+ channel, clear an override).
363
+
364
+ Do NOT use when: the user wants to set the key to a new value — use
365
+ clawops_config_set instead.
366
+ annotations:
367
+ title: Unset OpenClaw Config Key
368
+ readOnlyHint: false
369
+ destructiveHint: true
370
+ idempotentHint: true
371
+ openWorldHint: true
372
+ input:
373
+ stackName: { type: string, optional: true }
374
+ key: { type: string, description: "Dot-path config key to remove" }
375
+ restart: { type: boolean, optional: true, default: false }
376
+ output:
377
+ message: { type: string, description: "Confirmation of the key removed" }
378
+
379
+ - name: clawops_config_validate
380
+ toolset: [cli, read]
381
+ description: |
382
+ Validate the remote OpenClaw gateway config against the known schema. Checks
383
+ for structural errors (wrong types, unknown top-level keys) that would cause
384
+ OpenClaw to fail on startup.
385
+
386
+ Use when: the user wants to verify config before restarting the gateway, or
387
+ after editing openclaw.json manually.
388
+
389
+ Do NOT use when: the user wants to change config — use clawops_config_set.
390
+ annotations:
391
+ title: Validate OpenClaw Config
392
+ readOnlyHint: true
393
+ destructiveHint: false
394
+ idempotentHint: true
395
+ openWorldHint: true
396
+ input:
397
+ stackName: { type: string, optional: true }
398
+ output:
399
+ valid: { type: boolean }
400
+ issues: { type: array, items: { type: string } }
401
+
402
+ - name: clawops_agents_restart
403
+ toolset: [cli]
404
+ description: |
405
+ Restart a specific OpenClaw agent on the remote gateway.
406
+
407
+ Use when: the user reports an agent is stuck, errored, or unresponsive;
408
+ or after a config change that the agent needs to pick up.
409
+
410
+ Do NOT use when: the issue is gateway-wide — use clawops_gateway_restart.
411
+ annotations:
412
+ title: Restart OpenClaw Agent
413
+ readOnlyHint: false
414
+ destructiveHint: true
415
+ idempotentHint: true
416
+ openWorldHint: true
417
+ input:
418
+ stackName: { type: string, optional: true }
419
+ agentId: { type: string }
420
+ output:
421
+ previousStatus: { type: string }
422
+ newStatus: { type: string }
423
+
424
+ - name: clawops_gateway_restart
425
+ toolset: [cli]
426
+ description: |
427
+ Restart the OpenClaw gateway daemon on the remote instance.
428
+
429
+ Use when: a gateway-wide config change requires reload, or the gateway is
430
+ reported as unresponsive.
431
+
432
+ Do NOT use when: only a specific agent is affected — use
433
+ clawops_agents_restart. Brief downtime (~10s).
434
+ annotations:
435
+ title: Restart Gateway Daemon
436
+ readOnlyHint: false
437
+ destructiveHint: true
438
+ idempotentHint: true
439
+ openWorldHint: true
440
+ input:
441
+ stackName: { type: string, optional: true }
442
+ output:
443
+ restartedAt: { type: string, format: date-time }
444
+ previousUptimeSec: { type: integer }
445
+
446
+ # ────────────────────────────────────────────────────────────────────────────
447
+ # COMPOSITE WORKFLOW TOOLS (R2: encode user intent, not API sequences)
448
+ # ────────────────────────────────────────────────────────────────────────────
449
+
450
+ - name: clawops_workflow_deploy_app
451
+ toolset: [workflow]
452
+ description: |
453
+ Single-tool workflow that takes a user from "I want to deploy OpenClaw
454
+ to <provider>" to a verified, healthy gateway. Internally: plan → user
455
+ confirms (elicitation) → up → wait for healthy → return URL.
456
+
457
+ Use when: the user expresses end-to-end deployment intent ("deploy to
458
+ AWS", "spin up an OpenClaw on GCP for me").
459
+
460
+ Do NOT use when: the user is mid-deployment and only needs one step
461
+ (e.g., they already have a plan; use clawops_apply). Do NOT use for
462
+ destroying or updating — separate workflows.
463
+ annotations:
464
+ title: Deploy OpenClaw (End-to-End Workflow)
465
+ readOnlyHint: false
466
+ destructiveHint: true
467
+ idempotentHint: true
468
+ openWorldHint: true
469
+ input:
470
+ provider: { type: enum, values: [aws, gcp, azure, local] }
471
+ region: { type: string, optional: true }
472
+ stackName: { type: string, optional: true, default: "default" }
473
+ instanceType: { type: enum, values: [micro, small, medium, large, gpu], optional: true, default: small }
474
+ output:
475
+ taskId: { type: string }
476
+ gatewayUrl: { type: string, format: uri }
477
+ stackName: { type: string }
478
+
479
+ - name: clawops_workflow_recover
480
+ toolset: [workflow, read]
481
+ description: |
482
+ Diagnostic workflow for an unhealthy stack. Internally: status check →
483
+ gateway logs → agent logs → systemd service status → produces a structured
484
+ diagnostic report with suggested remediation.
485
+
486
+ Use when: the user reports any "not working" symptom and you don't know
487
+ where to start. Best entry point for troubleshooting.
488
+
489
+ Do NOT use when: the user has already identified the problem and asks for
490
+ a specific fix.
491
+ annotations:
492
+ title: Recover/Diagnose Stack
493
+ readOnlyHint: true
494
+ destructiveHint: false
495
+ idempotentHint: true
496
+ openWorldHint: true
497
+ input:
498
+ stackName: { type: string, optional: true }
499
+ output:
500
+ report:
501
+ type: object
502
+ properties:
503
+ gatewayHealth: { type: string }
504
+ gatewayLogsExcerpt: { type: array, items: { type: string } }
505
+ systemdStatus: { type: string }
506
+ suggestedActions: { type: array, items: { type: string } }
507
+
508
+ - name: clawops_task_status
509
+ toolset: [cli, read]
510
+ description: |
511
+ Poll the status of a long-running clawops task (returned by clawops_up,
512
+ clawops_destroy, clawops_apply, etc.). Per R12 streaming model.
513
+
514
+ Use when: the user is waiting on a long-running deploy/destroy and wants
515
+ progress, OR you need to check whether a previously-started operation
516
+ finished.
517
+
518
+ Do NOT use when: there is no active taskId — start the operation first.
519
+ annotations:
520
+ title: Get Task Status
521
+ readOnlyHint: true
522
+ destructiveHint: false
523
+ idempotentHint: true
524
+ openWorldHint: false
525
+ input:
526
+ taskId: { type: string }
527
+ output:
528
+ status: { type: enum, values: [working, input_required, completed, failed, cancelled] }
529
+ progress: { type: number, minimum: 0, maximum: 1 }
530
+ message: { type: string, optional: true }
531
+ result: { type: object, optional: true, description: "Present when status=completed" }
532
+ error: { type: string, optional: true, description: "Present when status=failed" }
@@ -0,0 +1,113 @@
1
+ # spec/models.yaml — LLM provider catalog for the clawops setup wizard.
2
+ # Read at runtime by src/cli/commands/setup.ts — not compiled or code-generated.
3
+ #
4
+ # credentialSource:
5
+ # api-key — wizard prompts for how the key is stored (env var, file, cloud SM)
6
+ # aws-profile — no key; uses AWS SDK credential chain (IAM role / IMDS / profile)
7
+ # none — no credentials (e.g. local Ollama)
8
+
9
+ providers:
10
+ - id: openai
11
+ displayName: OpenAI
12
+ credentialSource: api-key
13
+ envDefault: OPENAI_API_KEY
14
+ models:
15
+ - { id: gpt-4o, displayName: "GPT-4o" }
16
+ - { id: gpt-4o-mini, displayName: "GPT-4o Mini" }
17
+ - { id: gpt-4-turbo, displayName: "GPT-4 Turbo" }
18
+ - { id: gpt-3.5-turbo, displayName: "GPT-3.5 Turbo" }
19
+ defaultModel: gpt-4o
20
+ configPath: models.providers.openai
21
+
22
+ - id: anthropic
23
+ displayName: Anthropic
24
+ credentialSource: api-key
25
+ envDefault: ANTHROPIC_API_KEY
26
+ models:
27
+ - { id: claude-opus-4-7, displayName: "Claude Opus 4.7" }
28
+ - { id: claude-sonnet-4-6, displayName: "Claude Sonnet 4.6" }
29
+ - { id: claude-haiku-4-5-20251001, displayName: "Claude Haiku 4.5" }
30
+ defaultModel: claude-sonnet-4-6
31
+ configPath: models.providers.anthropic
32
+
33
+ - id: deepseek
34
+ displayName: DeepSeek
35
+ credentialSource: api-key
36
+ envDefault: DEEPSEEK_API_KEY
37
+ models:
38
+ - { id: deepseek-chat, displayName: "DeepSeek Chat (V3)" }
39
+ - { id: deepseek-reasoner, displayName: "DeepSeek Reasoner (R1)" }
40
+ defaultModel: deepseek-chat
41
+ configPath: models.providers.deepseek
42
+
43
+ - id: kimi
44
+ displayName: Kimi (Moonshot AI)
45
+ credentialSource: api-key
46
+ envDefault: MOONSHOT_API_KEY
47
+ models:
48
+ - { id: moonshot-v1-8k, displayName: "Moonshot v1 8K" }
49
+ - { id: moonshot-v1-32k, displayName: "Moonshot v1 32K" }
50
+ - { id: moonshot-v1-128k, displayName: "Moonshot v1 128K" }
51
+ defaultModel: moonshot-v1-8k
52
+ configPath: models.providers.kimi
53
+
54
+ - id: bedrock
55
+ displayName: AWS Bedrock
56
+ credentialSource: aws-profile
57
+ # No API key — uses EC2 instance role (AmazonBedrockFullAccess) via IMDS.
58
+ # The Pulumi program attaches AmazonBedrockFullAccess to the instance profile
59
+ # and passes AWS_PROFILE=default into the container via --env-file.
60
+ iamPolicy: AmazonBedrockFullAccess
61
+ iamNote: >
62
+ Credentials are provided by the EC2 instance role. clawops attaches
63
+ AmazonBedrockFullAccess to the instance profile automatically when you
64
+ select Bedrock. No API key is needed.
65
+ models:
66
+ # Anthropic Claude (recommended for agents)
67
+ - { id: claude-sonnet-46, displayName: "Claude Sonnet 4.6", modelId: "anthropic.claude-sonnet-4-6", family: Anthropic, recommended: true }
68
+ - { id: claude-haiku-45, displayName: "Claude Haiku 4.5", modelId: "anthropic.claude-haiku-4-5-20251001-v1:0", family: Anthropic }
69
+ - { id: claude-opus-46, displayName: "Claude Opus 4.6", modelId: "anthropic.claude-opus-4-6-v1", family: Anthropic }
70
+ # Amazon Nova
71
+ - { id: nova-pro, displayName: "Amazon Nova Pro", modelId: "amazon.nova-pro-v1:0", family: Amazon }
72
+ - { id: nova-lite, displayName: "Amazon Nova Lite", modelId: "amazon.nova-lite-v1:0", family: Amazon }
73
+ # Meta Llama
74
+ - { id: llama33-70b, displayName: "Llama 3.3 70B Instruct", modelId: "meta.llama3-3-70b-instruct-v1:0", family: Meta }
75
+ - { id: llama31-70b, displayName: "Llama 3.1 70B Instruct", modelId: "meta.llama3-1-70b-instruct-v1:0", family: Meta }
76
+ # Mistral
77
+ - { id: mistral-large-3, displayName: "Mistral Large 3 (675B)", modelId: "mistral.mistral-large-3-675b-instruct", family: Mistral }
78
+ - { id: mixtral-8x7b, displayName: "Mixtral 8x7B Instruct", modelId: "mistral.mixtral-8x7b-instruct-v0:1", family: Mistral }
79
+ # DeepSeek
80
+ - { id: deepseek-r1, displayName: "DeepSeek-R1", modelId: "deepseek.r1-v1:0", family: DeepSeek }
81
+ defaultModel: claude-sonnet-46
82
+ configPath: models.providers.amazon-bedrock
83
+
84
+ - id: ollama
85
+ displayName: Ollama (self-hosted)
86
+ credentialSource: none
87
+ # OpenClaw runs in a container, so `localhost` is the container, not the host.
88
+ # Reaching a host-side Ollama needs the host.docker.internal alias, which clawops
89
+ # provides via --add-host=host.docker.internal:host-gateway at every run site.
90
+ baseUrlDefault: http://host.docker.internal:11434
91
+ # Model ID is the string passed to `ollama pull <id>` and used in API calls.
92
+ # The model must be pulled on the instance before OpenClaw starts.
93
+ # Wizard outputs the pull command as a post-setup step.
94
+ models:
95
+ - { id: llama3.1, displayName: "Llama 3.1 (8B/70B/405B tags)", family: Meta, recommended: true, pullSuffix: ":8b" }
96
+ - { id: llama3.2, displayName: "Llama 3.2 (1B/3B tags)", family: Meta, pullSuffix: ":3b" }
97
+ - { id: qwen3, displayName: "Qwen 3 (0.6B–235B tags)", family: Alibaba, pullSuffix: ":8b" }
98
+ - { id: qwen2.5, displayName: "Qwen 2.5 (0.5B–72B tags)", family: Alibaba, pullSuffix: ":7b" }
99
+ - { id: deepseek-r1, displayName: "DeepSeek-R1 (reasoning)", family: DeepSeek, pullSuffix: ":7b" }
100
+ - { id: gemma3, displayName: "Gemma 3 (1B–27B tags)", family: Google, pullSuffix: ":9b" }
101
+ - { id: mistral, displayName: "Mistral 7B", family: Mistral, pullSuffix: "" }
102
+ - { id: phi4, displayName: "Phi-4 (14B)", family: Microsoft, pullSuffix: "" }
103
+ - { id: codellama, displayName: "CodeLlama (7B–70B tags)", family: Meta, pullSuffix: ":7b" }
104
+ defaultModel: llama3.1
105
+ configPath: models.providers.ollama
106
+ postSetupNote: >
107
+ Ollama runs on the host; OpenClaw runs in a container and reaches it at
108
+ http://host.docker.internal:11434. After deployment, SSH into the host and run:
109
+ ollama pull <model><tag>
110
+ e.g. ollama pull llama3.1:8b
111
+ Ollama must also listen on an address the container can reach:
112
+ OLLAMA_HOST=0.0.0.0:11434 ollama serve
113
+ OpenClaw will fail to start until the model is available.