@wardby/cli 0.7.0 → 0.9.0
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/.env.example +5 -5
- package/README.md +6 -1
- package/deploy/local/docker-compose.quickstart-coding.yml +11 -0
- package/dist/claude-coding-worker/driver.d.ts +12 -0
- package/dist/claude-coding-worker/driver.js +29 -7
- package/dist/claude-coding-worker/main.js +5 -1
- package/dist/claude-coding-worker/sdk.js +17 -1
- package/dist/claude-plugin/command.d.ts +64 -0
- package/dist/claude-plugin/command.js +379 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +2 -1
- package/dist/cli.js +71 -3
- package/dist/coding/code-host.d.ts +16 -0
- package/dist/coding/code-host.js +60 -0
- package/dist/coding/mcp-token.d.ts +12 -0
- package/dist/coding/mcp-token.js +26 -0
- package/dist/coding/protocol.js +2 -0
- package/dist/coding/redact.js +6 -1
- package/dist/coding/transcript/recorder.d.ts +5 -4
- package/dist/coding/transcript/recorder.js +3 -9
- package/dist/coding-worker/debug-trace.d.ts +3 -1
- package/dist/coding-worker/debug-trace.js +4 -2
- package/dist/coding-worker/driver.js +8 -1
- package/dist/coding-worker/main.js +5 -1
- package/dist/coding-worker/mcp-config.d.ts +27 -0
- package/dist/coding-worker/mcp-config.js +32 -0
- package/dist/coding-worker/sdk.d.ts +36 -0
- package/dist/coding-worker/sdk.js +28 -1
- package/dist/coding-worker/types.d.ts +4 -0
- package/dist/config/mcp-call-limit.d.ts +8 -0
- package/dist/config/mcp-call-limit.js +18 -0
- package/dist/config/mcp-servers.d.ts +8 -0
- package/dist/config/mcp-servers.js +12 -0
- package/dist/config/test-simulators.d.ts +10 -0
- package/dist/config/test-simulators.js +28 -0
- package/dist/config/tool-timeout.d.ts +1 -0
- package/dist/config/tool-timeout.js +18 -0
- package/dist/core/coding-mcp.d.ts +36 -0
- package/dist/core/coding-mcp.js +253 -0
- package/dist/core/coding-repository.d.ts +46 -0
- package/dist/core/coding-repository.js +92 -0
- package/dist/core/delegation-slots.d.ts +27 -0
- package/dist/core/delegation-slots.js +44 -0
- package/dist/core/dispatch.d.ts +6 -2
- package/dist/core/dispatch.js +39 -11
- package/dist/core/engine-native.d.ts +2 -0
- package/dist/core/engine-native.js +13 -0
- package/dist/core/error-code.js +2 -0
- package/dist/core/grants.d.ts +28 -3
- package/dist/core/grants.js +46 -4
- package/dist/core/host-events.js +7 -3
- package/dist/core/host-status.js +2 -2
- package/dist/core/issue-status.js +4 -3
- package/dist/core/listen-address.d.ts +10 -0
- package/dist/core/listen-address.js +14 -0
- package/dist/core/mark-ready.d.ts +1 -1
- package/dist/core/mark-ready.js +1 -1
- package/dist/core/mcp-client/client.d.ts +47 -0
- package/dist/core/mcp-client/client.js +141 -0
- package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
- package/dist/core/mcp-client/jsonrpc.js +54 -0
- package/dist/core/mcp-client/results.d.ts +13 -0
- package/dist/core/mcp-client/results.js +42 -0
- package/dist/core/mcp-servers.d.ts +90 -0
- package/dist/core/mcp-servers.js +230 -0
- package/dist/core/mcp-tools.d.ts +108 -0
- package/dist/core/mcp-tools.js +287 -0
- package/dist/core/merge-order-check.js +38 -19
- package/dist/core/notification-dispatcher.js +2 -1
- package/dist/core/power-idle.d.ts +8 -2
- package/dist/core/power-idle.js +17 -3
- package/dist/core/power.d.ts +5 -0
- package/dist/core/power.js +5 -0
- package/dist/core/related-pull-requests.js +26 -10
- package/dist/core/retention-days.d.ts +5 -0
- package/dist/core/retention-days.js +14 -0
- package/dist/core/review-fix.js +2 -2
- package/dist/core/review-host-tools.js +3 -1
- package/dist/core/run-steps/config.d.ts +25 -0
- package/dist/core/run-steps/config.js +40 -0
- package/dist/core/run-steps/control-chars.d.ts +16 -0
- package/dist/core/run-steps/control-chars.js +26 -0
- package/dist/core/run-steps/detail.d.ts +32 -0
- package/dist/core/run-steps/detail.js +240 -0
- package/dist/core/run-steps/extract.d.ts +52 -0
- package/dist/core/run-steps/extract.js +467 -0
- package/dist/core/run-steps/ingress.d.ts +51 -0
- package/dist/core/run-steps/ingress.js +160 -0
- package/dist/core/run-steps/last-step.d.ts +15 -0
- package/dist/core/run-steps/last-step.js +35 -0
- package/dist/core/run-steps/native.d.ts +48 -0
- package/dist/core/run-steps/native.js +164 -0
- package/dist/core/run-steps/seen.d.ts +16 -0
- package/dist/core/run-steps/seen.js +35 -0
- package/dist/core/run-steps/summarize.d.ts +57 -0
- package/dist/core/run-steps/summarize.js +304 -0
- package/dist/core/run-steps/sweep.d.ts +21 -0
- package/dist/core/run-steps/sweep.js +41 -0
- package/dist/core/run-steps/types.d.ts +89 -0
- package/dist/core/run-steps/types.js +39 -0
- package/dist/core/run-steps/wire.d.ts +35 -0
- package/dist/core/run-steps/wire.js +47 -0
- package/dist/core/run-steps/writer.d.ts +49 -0
- package/dist/core/run-steps/writer.js +279 -0
- package/dist/core/runner.d.ts +70 -16
- package/dist/core/runner.js +296 -74
- package/dist/core/secret-broker-config.d.ts +2 -0
- package/dist/core/secret-broker-config.js +1 -1
- package/dist/core/secret-guard.d.ts +5 -2
- package/dist/core/secret-guard.js +22 -7
- package/dist/core/secrets.d.ts +11 -1
- package/dist/core/secrets.js +27 -1
- package/dist/core/serializable-retry.d.ts +18 -0
- package/dist/core/serializable-retry.js +43 -0
- package/dist/core/tool-admin.d.ts +5 -1
- package/dist/core/tool-admin.js +7 -2
- package/dist/core/tool-names.d.ts +13 -0
- package/dist/core/tool-names.js +20 -0
- package/dist/core/webhooks.d.ts +4 -0
- package/dist/core/webhooks.js +68 -49
- package/dist/core/workflow-run-events.js +2 -1
- package/dist/generated/prisma/browser.d.ts +39 -0
- package/dist/generated/prisma/client.d.ts +39 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +80 -50
- package/dist/generated/prisma/enums.d.ts +6 -0
- package/dist/generated/prisma/enums.js +5 -0
- package/dist/generated/prisma/internal/class.d.ts +77 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +632 -1
- package/dist/generated/prisma/internal/prismaNamespace.js +94 -3
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +98 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +94 -3
- package/dist/generated/prisma/models/Agent.d.ts +372 -1
- package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
- package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +40 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +0 -7
- package/dist/generated/prisma/models/CodingProxySession.d.ts +159 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +76 -1
- package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
- package/dist/generated/prisma/models/HostProvider.js +1 -0
- package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
- package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
- package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
- package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
- package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
- package/dist/generated/prisma/models/McpServer.js +1 -0
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
- package/dist/generated/prisma/models/Principal.d.ts +167 -0
- package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
- package/dist/generated/prisma/models/Run.d.ts +503 -1
- package/dist/generated/prisma/models/RunStep.d.ts +1453 -0
- package/dist/generated/prisma/models/RunStep.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +387 -0
- package/dist/generated/prisma/models/Tool.d.ts +223 -1
- package/dist/generated/prisma/models.d.ts +7 -0
- package/dist/help/search.js +12 -3
- package/dist/help-index.json +812 -52
- package/dist/import/create.js +16 -1
- package/dist/import/neutral-schema.d.ts +1 -0
- package/dist/import/neutral-schema.js +2 -0
- package/dist/mcp/auth/access.d.ts +1 -0
- package/dist/mcp/auth/grants-cli.d.ts +6 -4
- package/dist/mcp/auth/grants-cli.js +42 -3
- package/dist/mcp/auth/resource-server.d.ts +3 -1
- package/dist/mcp/auth/resource-server.js +17 -2
- package/dist/mcp/context.d.ts +6 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/tools/agents.js +135 -20
- package/dist/mcp/tools/grants.js +66 -28
- package/dist/mcp/tools/host-providers.d.ts +2 -0
- package/dist/mcp/tools/host-providers.js +215 -0
- package/dist/mcp/tools/mcp-servers.d.ts +26 -0
- package/dist/mcp/tools/mcp-servers.js +481 -0
- package/dist/mcp/tools/power.js +2 -2
- package/dist/mcp/tools/repositories.js +50 -10
- package/dist/mcp/tools/run-access.d.ts +7 -0
- package/dist/mcp/tools/run-access.js +14 -0
- package/dist/mcp/tools/run-steps.d.ts +16 -0
- package/dist/mcp/tools/run-steps.js +85 -0
- package/dist/mcp/tools/runs.js +186 -18
- package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
- package/dist/mcp/tools/secret-elicitation.js +25 -2
- package/dist/mcp/tools/secrets.js +38 -4
- package/dist/mcp/tools/tools.d.ts +6 -4
- package/dist/mcp/tools/tools.js +40 -8
- package/dist/mcp/tools/trigger.js +28 -6
- package/dist/mcp/transport/http-limits.d.ts +2 -0
- package/dist/mcp/transport/http-limits.js +6 -2
- package/dist/mcp/webhooks/ingress.js +10 -0
- package/dist/native-worker/gateway-server.d.ts +18 -1
- package/dist/native-worker/gateway-server.js +38 -9
- package/dist/native-worker/gateway.d.ts +5 -0
- package/dist/native-worker/gateway.js +13 -1
- package/dist/native-worker/http-server.d.ts +6 -4
- package/dist/native-worker/http-server.js +53 -8
- package/dist/native-worker/ledger.d.ts +6 -2
- package/dist/native-worker/ledger.js +5 -4
- package/dist/native-worker/protocol.d.ts +1 -0
- package/dist/native-worker/protocol.js +4 -1
- package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
- package/dist/providers/coding-proxy/capability-hash.js +5 -0
- package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
- package/dist/providers/coding-proxy/mcp-route.js +166 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +2 -0
- package/dist/providers/coding-proxy/memory-ledger.js +16 -0
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +1 -0
- package/dist/providers/coding-proxy/prisma-ledger.js +36 -2
- package/dist/providers/coding-proxy/proxy.d.ts +33 -1
- package/dist/providers/coding-proxy/proxy.js +266 -75
- package/dist/providers/coding-proxy/run-step-forwarder.d.ts +42 -0
- package/dist/providers/coding-proxy/run-step-forwarder.js +206 -0
- package/dist/providers/coding-proxy/runtime.d.ts +13 -0
- package/dist/providers/coding-proxy/runtime.js +87 -4
- package/dist/providers/coding-proxy/server.d.ts +3 -0
- package/dist/providers/coding-proxy/server.js +10 -0
- package/dist/providers/coding-proxy/types.d.ts +18 -0
- package/dist/providers/engine/types.d.ts +26 -0
- package/dist/providers/executor/composition.js +5 -0
- package/dist/providers/executor/container.d.ts +47 -1
- package/dist/providers/executor/container.js +84 -8
- package/dist/providers/host-tools/invoke.d.ts +37 -0
- package/dist/providers/host-tools/invoke.js +117 -0
- package/dist/providers/host-tools/operations.d.ts +65 -0
- package/dist/providers/host-tools/operations.js +149 -0
- package/dist/providers/host-tools/registry.d.ts +79 -0
- package/dist/providers/host-tools/registry.js +362 -0
- package/dist/providers/host-tools/request-guard.d.ts +17 -0
- package/dist/providers/host-tools/request-guard.js +99 -0
- package/dist/providers/host-tools/self-test.d.ts +64 -0
- package/dist/providers/host-tools/self-test.js +142 -0
- package/dist/providers/jobs/docker-isolation.d.ts +2 -2
- package/dist/providers/jobs/docker-isolation.js +30 -8
- package/dist/providers/jobs/docker.d.ts +8 -0
- package/dist/providers/jobs/docker.js +33 -9
- package/dist/providers/jobs/kubernetes-isolation.d.ts +3 -1
- package/dist/providers/jobs/kubernetes-isolation.js +15 -2
- package/dist/providers/jobs/kubernetes.d.ts +13 -0
- package/dist/providers/jobs/kubernetes.js +28 -5
- package/dist/providers/jobs/types.d.ts +6 -0
- package/dist/providers/review-host/types.d.ts +6 -4
- package/dist/providers/review-host/types.js +1 -1
- package/dist/providers/vcs/git.d.ts +6 -2
- package/dist/providers/vcs/git.js +15 -4
- package/dist/providers/vcs/github.d.ts +2 -71
- package/dist/providers/vcs/github.js +8 -11
- package/dist/providers/vcs/index.d.ts +1 -1
- package/dist/providers/vcs/index.js +1 -1
- package/dist/providers/vcs/remote.d.ts +4 -0
- package/dist/providers/vcs/remote.js +7 -1
- package/dist/providers/vcs/routing.d.ts +12 -6
- package/dist/providers/vcs/routing.js +21 -6
- package/dist/providers/vcs/types.d.ts +71 -3
- package/dist/quickstart/index.d.ts +5 -0
- package/dist/quickstart/index.js +21 -0
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/eval-core.d.ts +12 -2
- package/dist/sandbox/eval-core.js +20 -4
- package/dist/sandbox/host-functions.d.ts +4 -0
- package/dist/sandbox/host-functions.js +7 -2
- package/dist/sandbox/limits.d.ts +4 -1
- package/dist/sandbox/limits.js +4 -1
- package/dist/sandbox/run-in-sandbox.d.ts +6 -0
- package/dist/sandbox/run-in-sandbox.js +14 -2
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +1 -1
- package/dist/sandbox/secret-broker.d.ts +1 -0
- package/dist/sandbox/secret-broker.js +1 -1
- package/dist/sandbox/tool-timeout.d.ts +32 -0
- package/dist/sandbox/tool-timeout.js +52 -0
- package/dist/sandbox/user-tool.d.ts +8 -1
- package/dist/sandbox/user-tool.js +9 -3
- package/dist/serve.js +26 -18
- package/dist/viewer/api-schema.d.ts +66 -0
- package/dist/viewer/api-schema.js +31 -0
- package/dist/viewer/graph.js +2 -1
- package/dist/viewer/openapi.js +2 -1
- package/dist/viewer/run-detail.d.ts +2 -0
- package/dist/viewer/run-detail.js +26 -1
- package/dist/wardby-bin.js +5 -0
- package/docs/README.md +11 -1
- package/docs/agent-recipes.md +37 -4
- package/docs/architecture-runtime.md +1 -1
- package/docs/claude-code-plugin.md +208 -0
- package/docs/code-review-agents.md +6 -0
- package/docs/coding-agent-setup.md +94 -1
- package/docs/coding-worker-byo-images.md +4 -2
- package/docs/coding-worker-isolation.md +94 -7
- package/docs/debugging-agent-runs.md +354 -0
- package/docs/getting-started-gke.md +33 -11
- package/docs/getting-started-identity-provider.md +43 -37
- package/docs/getting-started.md +8 -0
- package/docs/host-providers.md +294 -0
- package/docs/mcp-servers.md +263 -0
- package/docs/native-sandbox.md +31 -9
- package/docs/security-deployment.md +161 -31
- package/docs/tool-secrets.md +3 -0
- package/docs/viewer-api.md +27 -12
- package/docs/viewer-api.openapi.yml +78 -2
- package/help/admin-viewer.md +5 -0
- package/help/agent-recipes.md +33 -2
- package/help/brokered-secrets.md +3 -0
- package/help/build-claude-code-image.md +1 -1
- package/help/claude-code-run-pane.md +63 -0
- package/help/deploy-gke.md +5 -0
- package/help/errors/coding-mcp-gateway-unavailable.md +46 -0
- package/help/errors/coding-mcp-pins-unavailable.md +35 -0
- package/help/errors/database-auth-invalid.md +1 -1
- package/help/errors/host-provider-error.md +40 -0
- package/help/errors/host-tool-failed.md +36 -0
- package/help/errors/mcp-call-limit.md +22 -0
- package/help/errors/mcp-call-timeout.md +22 -0
- package/help/errors/mcp-server-auth-failed.md +22 -0
- package/help/errors/mcp-server-credentials-unavailable.md +45 -0
- package/help/errors/mcp-server-error.md +28 -0
- package/help/errors/mcp-server-unreachable.md +22 -0
- package/help/errors/mcp-servers-off.md +21 -0
- package/help/errors/mcp-tool-not-allowed.md +26 -0
- package/help/errors/mcp-tool-removed.md +22 -0
- package/help/errors/mcp-unavailable.md +25 -0
- package/help/errors/native-sandbox-capacity.md +1 -1
- package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
- package/help/errors/native-sandbox-docker-failed.md +1 -1
- package/help/errors/native-sandbox-gateway-error.md +1 -1
- package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
- package/help/errors/native-sandbox-image-not-pinned.md +1 -1
- package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
- package/help/errors/native-sandbox-network-unenforced.md +1 -1
- package/help/errors/native-sandbox-requires-catalog.md +1 -1
- package/help/errors/native-sandbox-unavailable.md +1 -1
- package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
- package/help/errors/native-sandbox-worker-exited.md +1 -1
- package/help/errors/native-sandbox-worker-lost.md +1 -1
- package/help/errors/native-sandbox-worker-unready.md +1 -1
- package/help/errors/repository-not-listed.md +36 -0
- package/help/errors/repository-required.md +36 -0
- package/help/errors/tool-timeout.md +38 -0
- package/help/host-providers.md +40 -0
- package/help/identity-and-access.md +4 -1
- package/help/low-power-mode.md +19 -8
- package/help/mcp-servers.md +73 -0
- package/help/mcp.md +9 -2
- package/help/native-capabilities.md +27 -1
- package/help/native-sandbox.md +1 -1
- package/help/operating-agents.md +16 -0
- package/help/related-pull-requests.md +7 -3
- package/help/repo-instructions-and-skills.md +3 -1
- package/help/resume-runs-locally.md +7 -0
- package/help/run-steps.md +140 -0
- package/help/stop-run.md +1 -1
- package/help/troubleshooting/coding-workers.md +9 -1
- package/help/troubleshooting/debugging-agent-runs.md +29 -0
- package/package.json +2 -1
- package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
- package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
- package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
- package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
- package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
- package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
- package/prisma/migrations/20261110000000_run_steps/migration.sql +26 -0
- package/prisma/migrations/20261111000000_run_steps_viewer_notify/migration.sql +59 -0
- package/prisma/migrations/20261112000000_run_steps_detail/migration.sql +9 -0
- package/prisma/schema.prisma +211 -14
- package/scripts/git-askpass.sh +1 -1
|
@@ -79,15 +79,16 @@ Scopes and roles do different jobs:
|
|
|
79
79
|
- **Roles authorize.** A user has a set of roles. With no roles, the user is a
|
|
80
80
|
member:
|
|
81
81
|
|
|
82
|
-
| Role | Grants
|
|
83
|
-
| ------------------ |
|
|
84
|
-
| `admin` | `agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin` and `
|
|
85
|
-
| `package-approver` | `packages:approve`
|
|
86
|
-
| `service-manager` | `services:manage`
|
|
87
|
-
| `model-manager` | `models:admin`
|
|
88
|
-
|
|
|
82
|
+
| Role | Grants |
|
|
83
|
+
| ------------------ | --------------------------------------------------------------------------------------------------------------------- |
|
|
84
|
+
| `admin` | `agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin`, `power:manage` and `hosts:admin` |
|
|
85
|
+
| `package-approver` | `packages:approve` |
|
|
86
|
+
| `service-manager` | `services:manage` |
|
|
87
|
+
| `model-manager` | `models:admin` |
|
|
88
|
+
| `host-manager` | `hosts:admin` |
|
|
89
|
+
| (none) | nothing privileged; every other scope works as the token allows |
|
|
89
90
|
|
|
90
|
-
|
|
91
|
+
Nine kinds of operation are privileged:
|
|
91
92
|
|
|
92
93
|
- `make_owner`, which reassigns any agent's owner, including another
|
|
93
94
|
principal's private agent (see [Sharing agents](#sharing-agents) for what
|
|
@@ -107,7 +108,15 @@ Eight operations are privileged:
|
|
|
107
108
|
[viewer-api.md](viewer-api.md));
|
|
108
109
|
- reading low-power state and scaling the coding proxy and native gateway to
|
|
109
110
|
zero now (`power_status`, `power_sleep`; see
|
|
110
|
-
[Low-power mode](getting-started-gke.md#low-power-mode))
|
|
111
|
+
[Low-power mode](getting-started-gke.md#low-power-mode));
|
|
112
|
+
- registering, approving, testing and deleting host providers
|
|
113
|
+
(`register_host_provider`, `approve_host_provider_tools`,
|
|
114
|
+
`test_host_provider`, `delete_host_provider`; reading one with
|
|
115
|
+
`get_host_provider` needs the same permission). Approved tools run on the
|
|
116
|
+
control plane with the provider's credentials, so grant `hosts:admin` like
|
|
117
|
+
`agents:admin`. Any host manager can read and re-register any provider,
|
|
118
|
+
including its tool code, whoever owns the tools; see
|
|
119
|
+
[host-providers.md](host-providers.md).
|
|
111
120
|
|
|
112
121
|
Each needs **both** its scope on the token **and** a role that grants that
|
|
113
122
|
permission:
|
|
@@ -119,13 +128,16 @@ permission:
|
|
|
119
128
|
- The admin viewer API needs `admin:view`, which only the `admin` role grants.
|
|
120
129
|
- `power_status` and `power_sleep` need `power:manage`, which only the `admin`
|
|
121
130
|
role grants.
|
|
131
|
+
- Host provider tools need `hosts:admin`, which the `admin` and `host-manager`
|
|
132
|
+
roles grant.
|
|
122
133
|
|
|
123
134
|
In practice:
|
|
124
135
|
|
|
125
|
-
- an `admin` can do all
|
|
136
|
+
- an `admin` can do all of them;
|
|
126
137
|
- a `package-approver` can approve packages only;
|
|
127
138
|
- a `service-manager` can change the service catalog only;
|
|
128
139
|
- a `model-manager` can change the model catalog only;
|
|
140
|
+
- a `host-manager` can manage host providers only;
|
|
129
141
|
- a member can do none of them.
|
|
130
142
|
|
|
131
143
|
Callers who fail the check get `403`:
|
|
@@ -312,7 +324,7 @@ someone else's agent (it can adopt the agent first). An HTTP user whose
|
|
|
312
324
|
subject equals `LOCAL_PRINCIPAL` is not the operator. **Admins** get no
|
|
313
325
|
implicit access to others' agents: they can `list_access` any agent (incident
|
|
314
326
|
response) and reassign one with `make_owner`, which removes bindings the new
|
|
315
|
-
owner doesn't own, suspends tool capabilities the new owner never granted,
|
|
327
|
+
owner doesn't own (secrets, datastores and MCP server attachments), suspends tool capabilities the new owner never granted,
|
|
316
328
|
cuts sub-agent edges the new owner can't delegate, and, between two owners,
|
|
317
329
|
resets every grant. Adopting an owner-less agent keeps its grants but lowers
|
|
318
330
|
an everyone grant to `read` unless `keepEveryoneExecute` is set.
|
|
@@ -347,7 +359,7 @@ without their tools' capabilities. Operator runbook:
|
|
|
347
359
|
printed for review, with the `attach_tool` call that re-grants any
|
|
348
360
|
capabilities it had. The subject must already exist.
|
|
349
361
|
4. `wardby grants prune-bindings` removes, and prints, every remaining
|
|
350
|
-
binding of one owner's secret or
|
|
362
|
+
binding of one owner's secret, datastore or MCP server to another owner's agent
|
|
351
363
|
(already inert).
|
|
352
364
|
5. `wardby grants migration-report > after.txt`.
|
|
353
365
|
|
|
@@ -380,6 +392,15 @@ Trust assumptions:
|
|
|
380
392
|
owner enabled `allowWebhookTaskOverride`; the owner controls the tools,
|
|
381
393
|
secrets and repository. A repository is a binding: only the owner (or an
|
|
382
394
|
admin's explicit approval) sets it, never a `write`-grantee.
|
|
395
|
+
- **A task can steer a coding agent to any repository on its list.** A caller
|
|
396
|
+
who may pass `repository` (for `trigger_agent`, the owner, or anyone when
|
|
397
|
+
`allowWebhookTaskOverride` is on; for a webhook, whoever created it, and only
|
|
398
|
+
when `allowWebhookTaskOverride` is on), and a lead that delegates to the
|
|
399
|
+
agent, can pick any listed repository, and the agent's one toolchain,
|
|
400
|
+
services and package allowlist apply to all of them. Keep the list small, and keep
|
|
401
|
+
repositories with different trust levels on separate agents. Refusals never
|
|
402
|
+
repeat the requested value, and a lead sees a sub-agent's list only when it
|
|
403
|
+
has the same owner or may choose (execute access and the opt-in).
|
|
383
404
|
- **Owner-less agents never hold a repository**, even admin-approved: there is
|
|
384
405
|
no owner whose GitHub access can be checked. Assign an owner first.
|
|
385
406
|
- **Checked where it's used.** Every coding run (before its workspace is
|
|
@@ -522,22 +543,22 @@ records. Delete them (see pruning above) if you want the rollback to be final.
|
|
|
522
543
|
|
|
523
544
|
## Resource and networking limits
|
|
524
545
|
|
|
525
|
-
| Surface | Limit
|
|
526
|
-
| ------------------------------ |
|
|
527
|
-
| MCP/webhook bodies | 1 MiB raw bytes
|
|
528
|
-
| MCP tool-call arguments | 100,000 array elements and object members
|
|
529
|
-
| Auth bodies | 64 KiB raw bytes
|
|
530
|
-
| Request completion / headers | 15 seconds / 10 seconds
|
|
531
|
-
| Sandbox invocation | 32 MiB heap, 1 MiB stack, 10 seconds
|
|
532
|
-
| Sandbox fetch | 8 MiB encoded and decoded, 5 redirects
|
|
533
|
-
| Bridge input / output | 1 MiB / 12 MiB
|
|
534
|
-
| Parser input / console payload | 256 KiB / 16 KiB
|
|
535
|
-
| HTML links extracted | 1000, with incremental result-byte accounting
|
|
536
|
-
| Random bytes | 65,536 bytes
|
|
537
|
-
| Host calls | 256 per invocation, at most 8 pending
|
|
538
|
-
| Datastore value / keys listed | 1 MiB / 1000
|
|
539
|
-
| Datastore key / secret name | 1024 bytes
|
|
540
|
-
| New secret plaintext | 64 KiB
|
|
546
|
+
| Surface | Limit |
|
|
547
|
+
| ------------------------------ | ------------------------------------------------ |
|
|
548
|
+
| MCP/webhook bodies | 1 MiB raw bytes |
|
|
549
|
+
| MCP tool-call arguments | 100,000 array elements and object members |
|
|
550
|
+
| Auth bodies | 64 KiB raw bytes |
|
|
551
|
+
| Request completion / headers | 15 seconds / 10 seconds |
|
|
552
|
+
| Sandbox invocation | 32 MiB heap, 1 MiB stack, 10 seconds (see below) |
|
|
553
|
+
| Sandbox fetch | 8 MiB encoded and decoded, 5 redirects |
|
|
554
|
+
| Bridge input / output | 1 MiB / 12 MiB |
|
|
555
|
+
| Parser input / console payload | 256 KiB / 16 KiB |
|
|
556
|
+
| HTML links extracted | 1000, with incremental result-byte accounting |
|
|
557
|
+
| Random bytes | 65,536 bytes |
|
|
558
|
+
| Host calls | 256 per invocation, at most 8 pending |
|
|
559
|
+
| Datastore value / keys listed | 1 MiB / 1000 |
|
|
560
|
+
| Datastore key / secret name | 1024 bytes |
|
|
561
|
+
| New secret plaintext | 64 KiB |
|
|
541
562
|
|
|
542
563
|
Oversized or malformed input fails explicitly. Existing oversized datastore
|
|
543
564
|
values/keys and secret ciphertext fail instead of entering Node allocations.
|
|
@@ -551,8 +572,9 @@ call arguments against its `paramsZod`, runs in a fresh QuickJS runtime with the
|
|
|
551
572
|
heap, stack, and time limits above. One that hits a limit fails that tool call
|
|
552
573
|
only: the model receives a `validation_failed` or sandbox error result and the
|
|
553
574
|
run continues. The invocation runs on the thread of the process that hosts the
|
|
554
|
-
run (the server, or the run's worker with the native sandbox)
|
|
555
|
-
|
|
575
|
+
run (the server, or the run's worker with the native sandbox). Code that keeps
|
|
576
|
+
the thread busy is also stopped by the instruction budget, so a long time limit
|
|
577
|
+
mostly lets a call wait on slow requests.
|
|
556
578
|
|
|
557
579
|
For this release only, a custom tool's `paramsZod` is compiled with Zod 4's
|
|
558
580
|
built-in Zod 3 API (`zod/v3`) so that existing tools keep working; see
|
|
@@ -578,7 +600,7 @@ The network layer cannot back this up for the control plane on GKE, because
|
|
|
578
600
|
Workload Identity needs the metadata server.
|
|
579
601
|
Sandbox code can explicitly log secrets it has been given; log size limits do
|
|
580
602
|
not provide automatic redaction. Keep tool-authoring privileges restricted.
|
|
581
|
-
Public/non-owner tool listings expose only id/name/description; owners retain
|
|
603
|
+
Public/non-owner tool listings expose only id/name/description/timeoutMs; owners retain
|
|
582
604
|
their source and schema. Private agents are indistinguishable from missing IDs.
|
|
583
605
|
|
|
584
606
|
Cancellation stops bridge delivery, sleep timers, and in-flight network work.
|
|
@@ -591,6 +613,108 @@ bound connection pools and concurrent invocations, and review a cancellable
|
|
|
591
613
|
database adapter or isolated worker if strict immediate termination is required.
|
|
592
614
|
Do not claim these per-invocation caps establish a whole-process memory ceiling.
|
|
593
615
|
|
|
616
|
+
### Tool time limits
|
|
617
|
+
|
|
618
|
+
A tool call has 10 seconds unless the tool sets its own `timeoutMs`
|
|
619
|
+
(`create_tool`, `update_tool`, `dry_run_tool`, `wardby tool create|update
|
|
620
|
+
--timeout-ms`, or `timeoutMs` in a bundle's `config/tools.json`). The limit
|
|
621
|
+
covers the whole call: each `fetch` may run until it, and a timer can't be set
|
|
622
|
+
for longer. A call never outlasts its run: stopping the run aborts it, and a
|
|
623
|
+
sandboxed run's deadline cuts it off.
|
|
624
|
+
|
|
625
|
+
| Variable | Default | Meaning |
|
|
626
|
+
| ---------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
627
|
+
| `WARDBY_TOOL_MAX_TIMEOUT_MS` | `300000` | The longest `timeoutMs` a tool may set, in milliseconds (at least `10000`). A larger value is refused when the tool is saved. A run uses the lower of the tool's `timeoutMs` and this value, so lowering it also covers existing tools. |
|
|
628
|
+
|
|
629
|
+
Set it on every process that runs tools or serves the native sandbox gateway:
|
|
630
|
+
`wardby serve`, `wardby scheduler` and the gateway. An invalid value stops
|
|
631
|
+
start-up. On the native sandbox the gateway gives each of a tool's host calls
|
|
632
|
+
its limit plus 20 seconds, never past the run's deadline. A long limit lets one
|
|
633
|
+
call hold its run (and a sandboxed run's worker) for longer, so raise the
|
|
634
|
+
ceiling only as far as your tools need.
|
|
635
|
+
|
|
636
|
+
**Upgrading:** the release adds the nullable `Tool.timeoutMs` and
|
|
637
|
+
`HostProviderOperation.timeoutMs` columns; apply the migration with
|
|
638
|
+
`prisma migrate deploy` as with any upgrade. A sandboxed run passes a tool's
|
|
639
|
+
`timeoutMs` to its worker, so update the native worker image together with the
|
|
640
|
+
server: an older image refuses the run of an agent that has a tool with
|
|
641
|
+
`timeoutMs`. Tools without `timeoutMs` run on either image.
|
|
642
|
+
|
|
643
|
+
### Run steps
|
|
644
|
+
|
|
645
|
+
Runs record their steps (tool calls with a status, and what the model said, each
|
|
646
|
+
cut to one short line) for `get_run_steps`; see
|
|
647
|
+
[Run steps](debugging-agent-runs.md#run-steps). Only the control plane and the
|
|
648
|
+
native gateway write them, and only after removing every secret value of the
|
|
649
|
+
run's agent and every token-shaped value; a step whose agent secrets can't be
|
|
650
|
+
read is not stored. At `summary` tool output is never recorded. At `detail` (the instance and the
|
|
651
|
+
agent's owner must both choose it) the end of each tool's output is stored,
|
|
652
|
+
redacted as above; a secret that only exists in a file the run read, and that
|
|
653
|
+
matches no known shape, can remain. Detail is returned only to the agent's owner,
|
|
654
|
+
the run's starter and the stdio operator, never to the admin viewer. Set `WARDBY_RUN_STEPS=off` to
|
|
655
|
+
record nothing.
|
|
656
|
+
|
|
657
|
+
**Claude Code and Codex runs.** The coding proxy holds no secret values, so it
|
|
658
|
+
sends step text to the control plane's run-steps listener
|
|
659
|
+
(`WARDBY_RUN_STEPS_LISTEN` on `wardby serve`, `POST /internal/run-steps`)
|
|
660
|
+
unmasked. Neither side logs, stores or echoes that text or a request body; the
|
|
661
|
+
control plane redacts it by exact value (the same path as native runs) before
|
|
662
|
+
writing. The proxy sends nothing unless `WARDBY_RUN_STEPS_URL` is set and
|
|
663
|
+
`WARDBY_RUN_STEPS` is not `off`. It sends tool output (its last 4 KB) only for a
|
|
664
|
+
run at `detail`, and only when its own `WARDBY_RUN_STEPS` is `detail`; the same
|
|
665
|
+
listener conditions apply.
|
|
666
|
+
|
|
667
|
+
The listener is authenticated by the run's capability. The run's worker holds
|
|
668
|
+
that capability too (it is the worker's model API key), so it limits a caller to
|
|
669
|
+
its own run; it cannot tell the proxy from the worker. The network boundary keeps
|
|
670
|
+
workers off the port:
|
|
671
|
+
|
|
672
|
+
- **Kubernetes:** a NetworkPolicy admits ingress to port 8792 only from the
|
|
673
|
+
proxy's pods, and the listener has its own ClusterIP Service, off any load
|
|
674
|
+
balancer. Admit no worker pod to that port.
|
|
675
|
+
- **Docker backend:** the run's isolated network keeps run containers from
|
|
676
|
+
reaching the listener. A proxy container reaches a server on the host at
|
|
677
|
+
`host.docker.internal` (Docker Desktop). On Linux, add
|
|
678
|
+
`extra_hosts: ["host.docker.internal:host-gateway"]` to the proxy's service. A
|
|
679
|
+
`127.0.0.1` bind is unreachable from containers on Linux, and a `0.0.0.0` bind
|
|
680
|
+
exposes the listener to your LAN: bind to the Docker bridge address, or
|
|
681
|
+
firewall the port.
|
|
682
|
+
|
|
683
|
+
The proxy-to-listener hop is plain `http` on the cluster or host network by default; use `https`, or keep the listener on a trusted network, wherever the path leaves one.
|
|
684
|
+
|
|
685
|
+
Limits: a run's MCP token is masked only by its token shape. A write that times
|
|
686
|
+
out can still land, so a step's status can arrive before or after its step. A
|
|
687
|
+
cancelled run can post its last steps until its deadline.
|
|
688
|
+
|
|
689
|
+
| Variable | Read by | Default | Meaning |
|
|
690
|
+
| ------------------------- | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
691
|
+
| `WARDBY_RUN_STEPS_LISTEN` | `wardby serve` | unset | `host:port` or `:port` of the run-steps listener. Unset: none. `wardby serve` is the only process that runs it. |
|
|
692
|
+
| `WARDBY_RUN_STEPS_URL` | the coding proxy | unset | The listener's `http(s)` origin, without credentials or path. Unset: coding runs record no steps. Invalid: start-up stops. |
|
|
693
|
+
|
|
694
|
+
### Remote MCP servers
|
|
695
|
+
|
|
696
|
+
Owners can register a remote MCP server (Streamable HTTP, HTTPS only) and attach
|
|
697
|
+
an allowlisted subset of its tools to a native agent, which then calls them
|
|
698
|
+
through Wardby's control plane. `WARDBY_MCP_SERVERS` decides who may register
|
|
699
|
+
servers: `owners` (the default), `admins` (only `hosts:admin` holders), or `off`
|
|
700
|
+
to disable the feature. An agent can use a server only while its owner owns it or
|
|
701
|
+
holds `use` on it through a grant; revoking or lowering that grant detaches it. Secret values for a server are never sent to the model,
|
|
702
|
+
stored in run records, or returned by Wardby's MCP tools. See [Remote MCP servers](mcp-servers.md) for the
|
|
703
|
+
full guide.
|
|
704
|
+
|
|
705
|
+
Claude Code and Codex agents can use attached servers too. Their workers reach
|
|
706
|
+
the tools only through the coding proxy's `/mcp` route, which forwards to the
|
|
707
|
+
native sandbox gateway's `/coding-mcp` route; the proxy never sees a server's URL
|
|
708
|
+
or secrets. Codex agents get only tools the server marks `readOnlyHint: true`
|
|
709
|
+
(see [Coding worker isolation](coding-worker-isolation.md#remote-mcp-tools)).
|
|
710
|
+
|
|
711
|
+
| Variable | Read by | Default | Meaning |
|
|
712
|
+
| ------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
713
|
+
| `WARDBY_MCP_SERVERS` | the server processes and the gateway | `owners` | Who may register remote MCP servers: `owners` (the default: owners may register servers), `admins` (registering, updating and refreshing a server needs `hosts:admin`), or `off` (every MCP-server tool except `detach_mcp_server` and `delete_mcp_server` is refused with a 403 that names this variable, and attached servers' tools are left out of runs). Any other value stops start-up. |
|
|
714
|
+
| `WARDBY_MCP_MAX_CALLS_PER_RUN` | the native gateway, which counts calls; also checked at start-up by the server processes and the gateway | `100` | The most remote MCP tool calls one coding run (Claude Code or Codex) may make. Every call to one of the run's MCP tools counts, whatever its outcome; a call past the limit is refused with the [`mcp_call_limit`](../help/errors/mcp-call-limit.md) error, which the agent sees as the tool's result. A positive whole number; any other value stops start-up. |
|
|
715
|
+
| `WARDBY_MCP_GATEWAY_URL` | the coding proxy | unset | The native sandbox gateway's base URL, for example `http://<gateway host>:<port>`. The proxy's `/mcp` route, which a coding run's worker uses as its MCP server, forwards each request to the gateway's `/coding-mcp` route; the proxy never sees an MCP server's URL or credentials. Unset, coding runs get no MCP tools: `/mcp` answers `503` with [`mcp_unavailable`](../help/errors/mcp-unavailable.md). An `http` or `https` URL without credentials, query or fragment; any other value stops start-up. |
|
|
716
|
+
| `WARDBY_MCP_TOKEN` | the coding worker | set by Wardby | Don't set it. Wardby gives each coding run whose agent has MCP tools its own MCP token in this worker variable. It is valid only for the proxy's `/mcp` route, and only while the run is active and before its deadline; only its hash is stored, and it is never logged. |
|
|
717
|
+
|
|
594
718
|
## Slack workflow notifications
|
|
595
719
|
|
|
596
720
|
This integration requires Wardby 0.6.0 or later.
|
|
@@ -779,6 +903,12 @@ packages, both forced to patched versions by `overrides` in `package.json`:
|
|
|
779
903
|
re-run `prisma generate`, `prisma validate`, the `migrate diff` drift check,
|
|
780
904
|
and the migration image's `migrate deploy`.
|
|
781
905
|
|
|
906
|
+
ESLint and `typescript-eslint` still ask for `minimatch` 10, which is flagged
|
|
907
|
+
(GHSA-g3hv-75wg-m249, moderate, fixed in 11.0.1), so `overrides` also forces
|
|
908
|
+
`minimatch` to 11.0.3. It is development-only and never reaches a production
|
|
909
|
+
image. After changing it, confirm `npm run lint` checks the same files and
|
|
910
|
+
still reports problems.
|
|
911
|
+
|
|
782
912
|
`scripts/security-audit.mjs` carries no exceptions: with the overrides the full
|
|
783
913
|
and production audits are clean, and if a lockfile change ever dropped one, the
|
|
784
914
|
advisory would reappear and the security job would fail.
|
package/docs/tool-secrets.md
CHANGED
|
@@ -157,6 +157,9 @@ or that the tool is not granted, fails with
|
|
|
157
157
|
[`secret_brokered`](../help/errors/secret-brokered.md), so update tools that read
|
|
158
158
|
the value to use `fetch` instead.
|
|
159
159
|
|
|
160
|
+
A host provider's credentials must be brokered secrets, placed in a header or
|
|
161
|
+
query parameter. See [host-providers.md](host-providers.md).
|
|
162
|
+
|
|
160
163
|
## What the host enforces
|
|
161
164
|
|
|
162
165
|
- **https only**, to the default port. Any other scheme or port is refused with
|
package/docs/viewer-api.md
CHANGED
|
@@ -13,6 +13,12 @@ the `admin` role.
|
|
|
13
13
|
|
|
14
14
|
## Access
|
|
15
15
|
|
|
16
|
+
From an MCP client, an admin gets a deployment-wide listing without this API:
|
|
17
|
+
`list_agents` and `list_runs` with `all: true` (Wardby 0.8.0 and later) need the
|
|
18
|
+
same `admin:view` scope and `admin` role, and are refused otherwise. Their
|
|
19
|
+
`triggerInfo` and `outcomes` fields have the same shapes as a graph run's
|
|
20
|
+
`trigger` and `outcomes` here; `serviceReadiness` is `services` without `reason`.
|
|
21
|
+
|
|
16
22
|
A caller needs an access token for the Wardby MCP resource that carries the
|
|
17
23
|
`admin:view` scope, and the Wardby `admin` role. Send it as
|
|
18
24
|
`Authorization: Bearer <token>`.
|
|
@@ -97,9 +103,14 @@ check is still pending).
|
|
|
97
103
|
|
|
98
104
|
### `GET /admin/api/runs/<id>`
|
|
99
105
|
|
|
100
|
-
One run in full: the graph fields plus the run's final text and error
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
One run in full: the graph fields plus the run's final text and error, and its
|
|
107
|
+
newest steps (Wardby 0.9.0 and later). `steps` lists at most the newest 200, oldest first, each with
|
|
108
|
+
`seq`, `at`, `kind` (`tool` or `said`), `tool`, `summary` and `status`;
|
|
109
|
+
`stepsOmitted` counts earlier steps not listed and `stepsDropped` counts steps
|
|
110
|
+
past the per-run limit that were never recorded. A step's summary is redacted
|
|
111
|
+
when it is recorded; tool output is never included. For coding runs, services
|
|
112
|
+
report the **names** of their environment variables only, never values. An
|
|
113
|
+
unknown id returns `404`.
|
|
103
114
|
|
|
104
115
|
### `GET /admin/api/infra`
|
|
105
116
|
|
|
@@ -125,21 +136,25 @@ run claims them.
|
|
|
125
136
|
|
|
126
137
|
A Server-Sent Events stream (`text/event-stream`) of live changes. Frames:
|
|
127
138
|
|
|
128
|
-
| Frame
|
|
129
|
-
|
|
|
130
|
-
| `retry: 3000`
|
|
131
|
-
| `event: hello`
|
|
132
|
-
| `event: run`, `event: service`, `event: outcome` | A run, coding-run service, or
|
|
133
|
-
| `event: status`
|
|
134
|
-
| `event: resync`
|
|
135
|
-
| `: ping`
|
|
139
|
+
| Frame | Meaning |
|
|
140
|
+
| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
141
|
+
| `retry: 3000` | Suggested client reconnect delay in milliseconds. |
|
|
142
|
+
| `event: hello` | Sent first. Data is `{"connected": <bool>}`: whether the server's live-event connection is up. |
|
|
143
|
+
| `event: run`, `event: service`, `event: outcome`, `event: step` | A run, coding-run service, outcome or run step changed. Each carries an `id:` line. |
|
|
144
|
+
| `event: status` | The server's live-event connection changed. Data is `{"connected": <bool>}`. |
|
|
145
|
+
| `event: resync` | The live-event connection is up (again). Events may have been missed: refetch the graph. |
|
|
146
|
+
| `: ping` | Comment sent every 15 seconds to keep the connection open. |
|
|
136
147
|
|
|
137
|
-
Event payloads are small and never include final text; fetch
|
|
148
|
+
Event payloads are small and never include final text or tool output; fetch
|
|
138
149
|
`/admin/api/runs/<id>` for detail. A `run` event carries the run's status,
|
|
139
150
|
turn and token counts, cost and finish time. A `service` event carries the
|
|
140
151
|
service name, its state and the attempt count. An `outcome` event carries only
|
|
141
152
|
the run id and the outcome source (`pull_request`, `host_status`,
|
|
142
153
|
`issue_status` or `host_check`), so refetch the run to see what changed.
|
|
154
|
+
From Wardby 0.9.0, a `step` event carries the run id and the step's `seq`, `stepKind` (`tool` or
|
|
155
|
+
`said`), `tool`, `summary`, `status` and `at`. It is sent when a step is
|
|
156
|
+
recorded and again when its status arrives, so apply it by `seq`. Steps are
|
|
157
|
+
not in the graph: fetch the run to list them.
|
|
143
158
|
|
|
144
159
|
**There is no replay.** Open the event stream first, then load
|
|
145
160
|
`/admin/api/graph` and apply events on top of it. Refetch `/admin/api/graph` on
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
openapi: 3.1.0
|
|
3
3
|
info:
|
|
4
4
|
title: wardby admin viewer API
|
|
5
|
-
version: 0.
|
|
5
|
+
version: 0.9.0
|
|
6
6
|
description: "Read-only admin API behind the wardby viewer: graph, run detail, infrastructure info and a live event stream. Response objects may gain new fields in later releases; clients should ignore unknown fields. See docs/viewer-api.md for the prose contract."
|
|
7
7
|
servers:
|
|
8
8
|
- url: https://{host}
|
|
@@ -122,7 +122,7 @@ paths:
|
|
|
122
122
|
operationId: getRun
|
|
123
123
|
summary: Run detail
|
|
124
124
|
description: |-
|
|
125
|
-
Full detail for one run, including final text.
|
|
125
|
+
Full detail for one run, including final text and its newest steps.
|
|
126
126
|
|
|
127
127
|
Requires a bearer token with the `admin:view` scope, held by a caller with the admin role.
|
|
128
128
|
security:
|
|
@@ -297,6 +297,7 @@ paths:
|
|
|
297
297
|
- `retry: 3000`: suggested client reconnect delay in milliseconds.
|
|
298
298
|
- `event: hello`: sent first. Data is `{"connected": <bool>}`, whether the server's live-event connection is up.
|
|
299
299
|
- `event: run`, `event: service`, `event: outcome`: a run, coding-run service, or outcome changed. Each carries an `id:` line. Payloads match the `viewer-event` schema (see `x-event-schema`).
|
|
300
|
+
- `event: step`: a run recorded a step, or a step's status arrived. Carries an `id:` line. Data: the step's `seq`, `stepKind` (`tool` or `said`), `tool`, `summary` (redacted when it was recorded), `status` and `at`, never tool output.
|
|
300
301
|
- `event: status`: the server's live-event connection changed. Data is `{"connected": <bool>}`.
|
|
301
302
|
- `event: resync`: the live-event connection is up (again). Events may have been missed: refetch the graph.
|
|
302
303
|
- `: ping`: comment sent every 15 seconds to keep the connection open.
|
|
@@ -1107,6 +1108,42 @@ components:
|
|
|
1107
1108
|
type: array
|
|
1108
1109
|
items:
|
|
1109
1110
|
type: string
|
|
1111
|
+
steps:
|
|
1112
|
+
type: array
|
|
1113
|
+
items:
|
|
1114
|
+
type: object
|
|
1115
|
+
properties:
|
|
1116
|
+
seq:
|
|
1117
|
+
type: integer
|
|
1118
|
+
at:
|
|
1119
|
+
type: string
|
|
1120
|
+
kind:
|
|
1121
|
+
type: string
|
|
1122
|
+
enum:
|
|
1123
|
+
- tool
|
|
1124
|
+
- said
|
|
1125
|
+
tool:
|
|
1126
|
+
type:
|
|
1127
|
+
- string
|
|
1128
|
+
- "null"
|
|
1129
|
+
summary:
|
|
1130
|
+
type: string
|
|
1131
|
+
status:
|
|
1132
|
+
type:
|
|
1133
|
+
- string
|
|
1134
|
+
- "null"
|
|
1135
|
+
required:
|
|
1136
|
+
- seq
|
|
1137
|
+
- at
|
|
1138
|
+
- kind
|
|
1139
|
+
- tool
|
|
1140
|
+
- summary
|
|
1141
|
+
- status
|
|
1142
|
+
additionalProperties: false
|
|
1143
|
+
stepsOmitted:
|
|
1144
|
+
type: integer
|
|
1145
|
+
stepsDropped:
|
|
1146
|
+
type: integer
|
|
1110
1147
|
coding:
|
|
1111
1148
|
anyOf:
|
|
1112
1149
|
- type: object
|
|
@@ -1184,6 +1221,9 @@ components:
|
|
|
1184
1221
|
- error
|
|
1185
1222
|
- finalText
|
|
1186
1223
|
- childRunIds
|
|
1224
|
+
- steps
|
|
1225
|
+
- stepsOmitted
|
|
1226
|
+
- stepsDropped
|
|
1187
1227
|
- coding
|
|
1188
1228
|
additionalProperties: false
|
|
1189
1229
|
viewer-event:
|
|
@@ -1282,6 +1322,42 @@ components:
|
|
|
1282
1322
|
- runId
|
|
1283
1323
|
- source
|
|
1284
1324
|
additionalProperties: false
|
|
1325
|
+
- type: object
|
|
1326
|
+
properties:
|
|
1327
|
+
kind:
|
|
1328
|
+
type: string
|
|
1329
|
+
const: step
|
|
1330
|
+
runId:
|
|
1331
|
+
type: string
|
|
1332
|
+
seq:
|
|
1333
|
+
type: integer
|
|
1334
|
+
stepKind:
|
|
1335
|
+
type: string
|
|
1336
|
+
enum:
|
|
1337
|
+
- tool
|
|
1338
|
+
- said
|
|
1339
|
+
tool:
|
|
1340
|
+
type:
|
|
1341
|
+
- string
|
|
1342
|
+
- "null"
|
|
1343
|
+
summary:
|
|
1344
|
+
type: string
|
|
1345
|
+
status:
|
|
1346
|
+
type:
|
|
1347
|
+
- string
|
|
1348
|
+
- "null"
|
|
1349
|
+
at:
|
|
1350
|
+
type: string
|
|
1351
|
+
required:
|
|
1352
|
+
- kind
|
|
1353
|
+
- runId
|
|
1354
|
+
- seq
|
|
1355
|
+
- stepKind
|
|
1356
|
+
- tool
|
|
1357
|
+
- summary
|
|
1358
|
+
- status
|
|
1359
|
+
- at
|
|
1360
|
+
additionalProperties: false
|
|
1285
1361
|
infra-info:
|
|
1286
1362
|
type: object
|
|
1287
1363
|
properties:
|
package/help/admin-viewer.md
CHANGED
|
@@ -19,10 +19,15 @@ It requires the Wardby `admin` role and the `admin:view` scope, which only the
|
|
|
19
19
|
provider and map it like `agents:admin`. See
|
|
20
20
|
[Configure identity and privileged access](identity-and-access.md).
|
|
21
21
|
|
|
22
|
+
From an MCP client, an admin gets the same deployment-wide listing with
|
|
23
|
+
`list_agents` and `list_runs` and `all: true` (Wardby 0.8.0 and later; also
|
|
24
|
+
`admin:view`). Without the role the call is refused.
|
|
25
|
+
|
|
22
26
|
Endpoints, all `GET`:
|
|
23
27
|
|
|
24
28
|
- `/admin/api/graph?since=1h&limit=500`: a snapshot of runs in a time window.
|
|
25
29
|
- `/admin/api/runs/<id>`: one run in full, including its final text and error.
|
|
30
|
+
From Wardby 0.9.0 it also lists the run's newest 200 steps (see `run-steps`).
|
|
26
31
|
- `/admin/api/infra`: how this deployment runs coding jobs (launcher, Kubernetes namespace, platform, run labels).
|
|
27
32
|
- `/admin/api/events`: a Server-Sent Events stream of live changes.
|
|
28
33
|
|
package/help/agent-recipes.md
CHANGED
|
@@ -162,8 +162,8 @@ yourself.`
|
|
|
162
162
|
A router delegates once per run by default. For one native agent that splits a
|
|
163
163
|
request across several repositories, attach one builder per repository and set
|
|
164
164
|
the lead's `maxDelegationsPerRun` (1 to 20) with `create_agent` or
|
|
165
|
-
`update_agent`.
|
|
166
|
-
|
|
165
|
+
`update_agent`. A run delegates to each sub-agent and repository at most
|
|
166
|
+
once; the calls run one after another unless you also set
|
|
167
167
|
`parallelDelegations: true`, which starts only the **consecutive**
|
|
168
168
|
`delegate_to_*` calls of one turn together — a non-delegation call between
|
|
169
169
|
two delegations splits them, nothing is reordered, and results return to the
|
|
@@ -208,6 +208,37 @@ pull request in it also gets a `wardby merge order` check run showing
|
|
|
208
208
|
whether its earlier steps have merged yet; search help for "merge order
|
|
209
209
|
check" for its states and for requiring it in branch protection.
|
|
210
210
|
|
|
211
|
+
**One coding agent across several repositories.** Instead of one builder per
|
|
212
|
+
repository, give one coding builder a list: its default in
|
|
213
|
+
`codingProfile.repository`, and each other repository with `link_repository`
|
|
214
|
+
(`access: "write"`, no triggers). The lead then names the repository on each
|
|
215
|
+
call, and may delegate to the same builder once per repository:
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{ "task": "Add the /quotes endpoint the client will call.", "repository": "your-org/api", "mergeOrder": 1 }
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{ "task": "Add the quotes page that calls /quotes.", "repository": "your-org/web", "mergeOrder": 2 }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Set `maxDelegationsPerRun` (up to 20) for the number of calls, and use
|
|
226
|
+
`mergeOrder` where the pull requests must land in order. A call without
|
|
227
|
+
`repository` is refused with `repository_required` (unless it continues a prior
|
|
228
|
+
run with `continuePriorRun`), and a repository not on the list with
|
|
229
|
+
`repository_not_listed`. A native sub-agent refuses `repository` with
|
|
230
|
+
`repository_requires_coding_agent`. The lead sees the list in the tool
|
|
231
|
+
definition only when it has the same owner as the builder, or another owner
|
|
232
|
+
with execute access to a builder that sets `allowWebhookTaskOverride`. All
|
|
233
|
+
repositories share the builder's toolchain, budget and prompt.
|
|
234
|
+
|
|
235
|
+
Being on the list lets a run work in a repository; it starts nothing there. Link
|
|
236
|
+
the lead and the reviewer on each listed GitHub repository with the triggers
|
|
237
|
+
they need, or a pull request opened there gets no review, mention follow-up, fix
|
|
238
|
+
round or mark-ready.
|
|
239
|
+
|
|
240
|
+
Search help for `repository_required` or `repository_not_listed` for what to do about those refusals.
|
|
241
|
+
|
|
211
242
|
## Step 3: confirm
|
|
212
243
|
|
|
213
244
|
Summarize what you created: each agent's name and id, the sub-agent bindings,
|
package/help/brokered-secrets.md
CHANGED
|
@@ -67,6 +67,9 @@ alone never removes it. Every change is audited.
|
|
|
67
67
|
|
|
68
68
|
## Related
|
|
69
69
|
|
|
70
|
+
- [Host providers](../docs/host-providers.md): a provider's credentials must be brokered
|
|
71
|
+
secrets
|
|
72
|
+
- [Remote MCP servers](../docs/mcp-servers.md) (0.8.0+): a server's credentials are brokered secrets
|
|
70
73
|
- Full guide: [`docs/tool-secrets.md`](../docs/tool-secrets.md)
|
|
71
74
|
- [Use native agents, tools, and data](native-capabilities.md)
|
|
72
75
|
- Errors: [`secret_brokered`](errors/secret-brokered.md),
|
|
@@ -4,7 +4,7 @@ title: Build a tool runner image for a Claude Code agent
|
|
|
4
4
|
summary: A procedure an MCP assistant follows to build a custom image for a Claude Code coding agent (Ruby, Go, Java or another language) FROM the release's tool runner image, check it, and set it with workerImageRef.
|
|
5
5
|
audience: operator
|
|
6
6
|
tags: [claude-code, custom-image, workerImageRef, tool-runner, worker-image, other-language, ruby, toolchain]
|
|
7
|
-
appliesTo: ">=0.
|
|
7
|
+
appliesTo: ">=0.6.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Build a tool runner image for a Claude Code agent
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: claude-code-run-pane
|
|
3
|
+
title: See your runs in Claude Code (the wardby-runs plugin)
|
|
4
|
+
summary: Install the wardby-runs Claude Code plugin to see your runs beside the chat, grouped by pull request, with run details and Continue locally.
|
|
5
|
+
audience: operator
|
|
6
|
+
tags: [run steps, get_run_steps, claude code, plugin, wardby-runs, pane, claude-plugin, runs, auto mode, permissions]
|
|
7
|
+
appliesTo: >=0.8.0
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# See your runs in Claude Code
|
|
11
|
+
|
|
12
|
+
The `wardby-runs` plugin opens a pane in Claude Code that lists your wardby
|
|
13
|
+
runs, grouped by pull request, and shows each run's details. It uses the
|
|
14
|
+
`wardby` MCP server your session already has and only reads.
|
|
15
|
+
|
|
16
|
+
Install it, and allow its read-only tools for auto mode, with:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npx @wardby/cli@latest claude-plugin install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Add `--server-url https://<your wardby host>/mcp` if Claude Code has no MCP
|
|
23
|
+
server named `wardby` yet. Or install it yourself with
|
|
24
|
+
`/plugin install wardby-runs --marketplace wardby/wardby`. Then run
|
|
25
|
+
`/wardby-runs`.
|
|
26
|
+
|
|
27
|
+
If the pane says auto mode refused a call, allow `mcp__wardby__list_runs`,
|
|
28
|
+
`mcp__wardby__list_agents`, `mcp__wardby__get_run`,
|
|
29
|
+
`mcp__wardby__get_run_transcript` and `mcp__wardby__get_run_steps` in
|
|
30
|
+
`/permissions`. Run `wardby claude-plugin install` again to add a rule a newer
|
|
31
|
+
pane needs.
|
|
32
|
+
|
|
33
|
+
In the terminal, the pane takes clicks and sits beside the chat only in Claude
|
|
34
|
+
Code's fullscreen view (`"tui": "fullscreen"`); otherwise use ctrl+x tab and the
|
|
35
|
+
keys it shows. The desktop app needs no setting.
|
|
36
|
+
|
|
37
|
+
`wardby quickstart` offers the pane when it connects Claude Code, and
|
|
38
|
+
`wardby doctor` and `wardby claude-plugin status` check the setup; `wardby claude-plugin
|
|
39
|
+
uninstall` removes the plugin and the rules install added. To continue a run
|
|
40
|
+
from the pane, see `resume-runs-locally`.
|
|
41
|
+
|
|
42
|
+
A running run's detail shows its **Recent steps** (the last 8 tool calls and
|
|
43
|
+
messages: a ✓ or the exit code of a failed command, then the tool and its
|
|
44
|
+
command; what the model said wraps to about two lines); a finished run's shows all its
|
|
45
|
+
**Steps**, 200 at a time. In the list, a running or failed run shows its newest
|
|
46
|
+
step under its name. Against a server without `get_run_steps` the pane shows no
|
|
47
|
+
steps and checks again every few refreshes; with run steps off it says "Steps
|
|
48
|
+
are off on this server." See `run-steps`. Steps need Wardby 0.9.0 or later
|
|
49
|
+
on the server. From 0.9.0, a step with detail, or a longer message, has a ▸ at
|
|
50
|
+
its right that opens it; in the terminal, `j`/`k` also move between such steps
|
|
51
|
+
and `e` shows or hides one. An open command shows "$ command", its exit status
|
|
52
|
+
and its output, without Codex's framing lines. Detail appears only for the
|
|
53
|
+
agent's owner and the run's starter (and the stdio operator), on a server at
|
|
54
|
+
the detail level. An open detail shows its last 40 lines, with a count of the
|
|
55
|
+
lines above them.
|
|
56
|
+
|
|
57
|
+
Each section of a run's detail is a card, coloured by its kind (a bar on the
|
|
58
|
+
desktop, the border in the terminal). On the desktop each card, an error and an
|
|
59
|
+
open step's detail have a **Copy** button that copies the full text as the
|
|
60
|
+
server sent it, an open step's detail included in full; in the terminal, **Copy section** (`y`) copies the open
|
|
61
|
+
step's detail.
|
|
62
|
+
|
|
63
|
+
The full guide is [Claude Code plugin](../docs/claude-code-plugin.md).
|
package/help/deploy-gke.md
CHANGED
|
@@ -49,6 +49,11 @@ grants fail, `up.sh` stops before the rollout with a non-zero exit;
|
|
|
49
49
|
without changing anything. See
|
|
50
50
|
[Upgrading an existing deployment](../docs/getting-started-gke.md#upgrading-an-existing-deployment).
|
|
51
51
|
|
|
52
|
+
`up.sh` works from its own one-cluster copy of the cluster's
|
|
53
|
+
kubeconfig context, so switching contexts in another terminal mid-deploy can't
|
|
54
|
+
send a step to another cluster. Run one deploy of a cluster at a time: a second
|
|
55
|
+
stops with `another operation (install/upgrade/rollback) is in progress`.
|
|
56
|
+
|
|
52
57
|
The Kubernetes launcher runs Codex and Claude Code coding workers; a Claude
|
|
53
58
|
Code pod adds a tool-runner sidecar with its own image. Configure an identity
|
|
54
59
|
provider and GitHub App before allowing people to use the public endpoint.
|