@wardby/cli 0.7.0 → 0.8.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 +6 -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 +61 -0
- package/dist/claude-plugin/command.js +376 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +2 -1
- package/dist/cli.js +47 -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 +1 -1
- 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 +36 -11
- package/dist/core/error-code.js +1 -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/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/related-pull-requests.js +26 -10
- package/dist/core/review-fix.js +2 -2
- package/dist/core/review-host-tools.js +3 -1
- package/dist/core/runner.d.ts +66 -16
- package/dist/core/runner.js +281 -73
- 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 +31 -0
- package/dist/generated/prisma/client.d.ts +31 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +50 -50
- package/dist/generated/prisma/internal/class.d.ts +66 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +530 -1
- package/dist/generated/prisma/internal/prismaNamespace.js +75 -2
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +79 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +75 -2
- package/dist/generated/prisma/models/Agent.d.ts +271 -0
- 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 +119 -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/Secret.d.ts +387 -0
- package/dist/generated/prisma/models/Tool.d.ts +223 -1
- package/dist/generated/prisma/models.d.ts +6 -0
- package/dist/help/search.js +12 -3
- package/dist/help-index.json +719 -47
- 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/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 +3 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/tools/agents.js +100 -15
- 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/repositories.js +50 -10
- package/dist/mcp/tools/runs.js +178 -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 +14 -0
- package/dist/native-worker/gateway-server.js +28 -7
- package/dist/native-worker/gateway.d.ts +2 -0
- package/dist/native-worker/gateway.js +5 -1
- package/dist/native-worker/http-server.d.ts +4 -0
- package/dist/native-worker/http-server.js +51 -0
- 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 +15 -0
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +1 -0
- package/dist/providers/coding-proxy/prisma-ledger.js +30 -2
- package/dist/providers/coding-proxy/proxy.d.ts +7 -1
- package/dist/providers/coding-proxy/proxy.js +134 -34
- package/dist/providers/coding-proxy/runtime.d.ts +6 -0
- package/dist/providers/coding-proxy/runtime.js +32 -1
- 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 +13 -0
- package/dist/providers/executor/composition.js +5 -0
- package/dist/providers/executor/container.d.ts +33 -1
- package/dist/providers/executor/container.js +76 -7
- 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 +5 -0
- package/dist/providers/jobs/kubernetes.js +6 -1
- 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/viewer/graph.js +2 -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 +164 -0
- package/docs/code-review-agents.md +6 -0
- package/docs/coding-agent-setup.md +77 -1
- package/docs/coding-worker-byo-images.md +4 -2
- package/docs/coding-worker-isolation.md +78 -7
- package/docs/debugging-agent-runs.md +242 -0
- package/docs/getting-started-gke.md +5 -4
- 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 +254 -0
- package/docs/native-sandbox.md +25 -9
- package/docs/security-deployment.md +110 -31
- package/docs/tool-secrets.md +3 -0
- package/docs/viewer-api.md +6 -0
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +4 -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 +40 -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/mcp-servers.md +73 -0
- package/help/mcp.md +7 -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 +3 -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/schema.prisma +159 -14
- package/scripts/git-askpass.sh +1 -1
|
@@ -401,9 +401,10 @@ server answers `415`, because it checks the content type before the token.
|
|
|
401
401
|
Create the first self-hosted login credential. It is printed once.
|
|
402
402
|
`--role admin` makes this operator account an admin. Only admins can use all
|
|
403
403
|
the privileged operations: `make_owner`, BYO `workerImageRef`, package
|
|
404
|
-
approval, service catalog changes,
|
|
405
|
-
`package-approver` can approve packages only, a
|
|
406
|
-
the service catalog only,
|
|
404
|
+
approval, service catalog changes, model catalog changes, and host providers
|
|
405
|
+
(`hosts:admin`). A `package-approver` can approve packages only, a
|
|
406
|
+
`service-manager` can change the service catalog only, a `model-manager` can
|
|
407
|
+
change the model catalog only, and a `host-manager` can manage host providers
|
|
407
408
|
only. Users created without `--role` have no roles. See
|
|
408
409
|
[roles and privileged operations](security-deployment.md#roles-and-privileged-operations).
|
|
409
410
|
|
|
@@ -585,7 +586,7 @@ delete the class and re-run `up.sh` to change them.
|
|
|
585
586
|
|
|
586
587
|
### Native sandbox
|
|
587
588
|
|
|
588
|
-
Native sandbox requires Wardby 0.
|
|
589
|
+
Native sandbox requires Wardby 0.6.0 or later.
|
|
589
590
|
|
|
590
591
|
`up.sh` deploys everything the [native sandbox](native-sandbox.md) needs on
|
|
591
592
|
this cluster. It builds and pushes the `native-worker` image, checks it (Node is
|
|
@@ -54,26 +54,27 @@ access tokens for that audience.
|
|
|
54
54
|
|
|
55
55
|
Create these scopes in the provider:
|
|
56
56
|
|
|
57
|
-
| Scope | Capability
|
|
58
|
-
| --------------------- |
|
|
59
|
-
| `agents:read` | Inspect agents, models, runs, memory, and attached resources.
|
|
60
|
-
| `agents:write` | Create and modify agents, schedules, and sub-agent relationships.
|
|
61
|
-
| `runs:trigger` | Start agent runs.
|
|
62
|
-
| `tools:write` | Create, attach, and manage tools.
|
|
63
|
-
| `datastore:write` | Create, attach, query, and modify datastores.
|
|
64
|
-
| `secrets:write` | Create, attach, rotate, and remove secret bindings.
|
|
65
|
-
| `webhooks:write` | Create and manage webhook triggers.
|
|
66
|
-
| `budget_groups:write` | Create and manage shared budget groups.
|
|
67
|
-
| `packages:approve` | Approve coding agents' package allowlists.
|
|
68
|
-
| `services:manage` | Create, update and delete coding-run service catalog entries.
|
|
69
|
-
| `agents:admin` | Reassign agent ownership, BYO worker images; admins only.
|
|
70
|
-
| `memory:write` | Set and delete agent memory entries.
|
|
71
|
-
| `admin:view` | Read every owner's runs through the admin viewer API; admins only.
|
|
72
|
-
| `models:admin` | Add, override, disable and reset model catalog entries.
|
|
73
|
-
| `power:manage` | Read low-power state and sleep the proxy/gateway now; admins only.
|
|
57
|
+
| Scope | Capability |
|
|
58
|
+
| --------------------- | ------------------------------------------------------------------------------- |
|
|
59
|
+
| `agents:read` | Inspect agents, models, runs, memory, and attached resources. |
|
|
60
|
+
| `agents:write` | Create and modify agents, schedules, and sub-agent relationships. |
|
|
61
|
+
| `runs:trigger` | Start agent runs. |
|
|
62
|
+
| `tools:write` | Create, attach, and manage tools. |
|
|
63
|
+
| `datastore:write` | Create, attach, query, and modify datastores. |
|
|
64
|
+
| `secrets:write` | Create, attach, rotate, and remove secret bindings. |
|
|
65
|
+
| `webhooks:write` | Create and manage webhook triggers. |
|
|
66
|
+
| `budget_groups:write` | Create and manage shared budget groups. |
|
|
67
|
+
| `packages:approve` | Approve coding agents' package allowlists. |
|
|
68
|
+
| `services:manage` | Create, update and delete coding-run service catalog entries. |
|
|
69
|
+
| `agents:admin` | Reassign agent ownership, BYO worker images; admins only. |
|
|
70
|
+
| `memory:write` | Set and delete agent memory entries. |
|
|
71
|
+
| `admin:view` | Read every owner's runs through the admin viewer API; admins only. |
|
|
72
|
+
| `models:admin` | Add, override, disable and reset model catalog entries. |
|
|
73
|
+
| `power:manage` | Read low-power state and sleep the proxy/gateway now; admins only. |
|
|
74
|
+
| `hosts:admin` | Register host providers and approve their tools; admins and host managers only. |
|
|
74
75
|
|
|
75
76
|
MCP clients discover this list from Wardby's protected-resource metadata and
|
|
76
|
-
may request every advertised scope. Define all
|
|
77
|
+
may request every advertised scope. Define all sixteen in the provider even when
|
|
77
78
|
policy grants a particular client or user only a subset. Ensure granted scopes
|
|
78
79
|
are emitted in the access token's `scope` or `scp` claim; defining them only in
|
|
79
80
|
the provider UI is not sufficient.
|
|
@@ -97,24 +98,29 @@ every advertised scope fail with `invalid_scope`.
|
|
|
97
98
|
deployment, define it in the provider too and map it like `agents:admin`;
|
|
98
99
|
otherwise clients that request every advertised scope fail with `invalid_scope`.
|
|
99
100
|
|
|
101
|
+
`hosts:admin` was added after `power:manage`. When you upgrade an existing
|
|
102
|
+
deployment, define it in the provider too and map it like `agents:admin`;
|
|
103
|
+
otherwise clients that request every advertised scope fail with `invalid_scope`.
|
|
104
|
+
|
|
100
105
|
### Wardby roles
|
|
101
106
|
|
|
102
107
|
A scope only delegates. `agents:admin`, `packages:approve`, `services:manage`,
|
|
103
|
-
`admin:view`, `models:admin` and `
|
|
108
|
+
`admin:view`, `models:admin`, `power:manage` and `hosts:admin` take effect only for a caller who also holds a Wardby role that grants them:
|
|
104
109
|
|
|
105
|
-
| Wardby role | Grants
|
|
106
|
-
| ------------------ |
|
|
107
|
-
| `admin` | `agents:admin` (`make_owner`, BYO `workerImageRef`), `packages:approve`, `services:manage`, `admin:view` (read every owner's runs, see [viewer-api.md](viewer-api.md)), `models:admin` (model catalog) and `power:manage` (`power_status`, `power_sleep`; see [getting-started-gke.md](getting-started-gke.md#low-power-mode)) |
|
|
108
|
-
| `package-approver` | `packages:approve` (package allowlist and policy approval)
|
|
109
|
-
| `service-manager` | `services:manage` (coding-run service catalog changes)
|
|
110
|
-
| `model-manager` | `models:admin` (model catalog changes: `set_model`, `disable_model`, `reset_model`; see [models.md](models.md))
|
|
110
|
+
| Wardby role | Grants |
|
|
111
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
112
|
+
| `admin` | `agents:admin` (`make_owner`, BYO `workerImageRef`), `packages:approve`, `services:manage`, `admin:view` (read every owner's runs, see [viewer-api.md](viewer-api.md)), `models:admin` (model catalog), `hosts:admin` (host providers) and `power:manage` (`power_status`, `power_sleep`; see [getting-started-gke.md](getting-started-gke.md#low-power-mode)) |
|
|
113
|
+
| `package-approver` | `packages:approve` (package allowlist and policy approval) |
|
|
114
|
+
| `service-manager` | `services:manage` (coding-run service catalog changes) |
|
|
115
|
+
| `model-manager` | `models:admin` (model catalog changes: `set_model`, `disable_model`, `reset_model`; see [models.md](models.md)) |
|
|
116
|
+
| `host-manager` | `hosts:admin` (`register_host_provider`, `approve_host_provider_tools`, `test_host_provider`; see [host-providers.md](host-providers.md)) |
|
|
111
117
|
|
|
112
118
|
The roles come from a claim in the caller's **access token**, which you map to
|
|
113
119
|
Wardby roles:
|
|
114
120
|
|
|
115
121
|
```dotenv
|
|
116
122
|
AUTH_ROLE_CLAIM=groups # claim name or dotted path
|
|
117
|
-
AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager
|
|
123
|
+
AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager
|
|
118
124
|
```
|
|
119
125
|
|
|
120
126
|
Wardby looks up `AUTH_ROLE_CLAIM` in two steps:
|
|
@@ -162,20 +168,20 @@ their next token.
|
|
|
162
168
|
|
|
163
169
|
Provider examples:
|
|
164
170
|
|
|
165
|
-
- **Okta** (custom authorization server): create
|
|
166
|
-
`wardby-packages`, `wardby-services` and `wardby-
|
|
171
|
+
- **Okta** (custom authorization server): create five groups, `wardby-admin`,
|
|
172
|
+
`wardby-packages`, `wardby-services`, `wardby-models` and `wardby-hosts`. Add a `groups` claim
|
|
167
173
|
to the access token, filtered to those groups. Set `AUTH_ROLE_CLAIM=groups` and
|
|
168
|
-
`AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager`.
|
|
174
|
+
`AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager`.
|
|
169
175
|
Optionally, add access policy rules so only those groups can obtain
|
|
170
|
-
`agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin` and `
|
|
171
|
-
- **FusionAuth:** create
|
|
172
|
-
`package-approver`, `service-manager` and `
|
|
176
|
+
`agents:admin`, `packages:approve`, `services:manage`, `admin:view`, `models:admin`, `power:manage` and `hosts:admin`.
|
|
177
|
+
- **FusionAuth:** create five application roles, `admin`,
|
|
178
|
+
`package-approver`, `service-manager`, `model-manager` and `host-manager`. They appear in the
|
|
173
179
|
access token's top-level `roles` claim. Set `AUTH_ROLE_CLAIM=roles` and
|
|
174
|
-
`AUTH_ROLE_MAP=admin=admin,package-approver=package-approver,service-manager=service-manager,model-manager=model-manager`.
|
|
180
|
+
`AUTH_ROLE_MAP=admin=admin,package-approver=package-approver,service-manager=service-manager,model-manager=model-manager,host-manager=host-manager`.
|
|
175
181
|
- **Keycloak:** create realm roles such as `wardby-admin`, `wardby-packages`,
|
|
176
|
-
`wardby-services` and `wardby-
|
|
182
|
+
`wardby-services`, `wardby-models` and `wardby-hosts`. Realm roles appear under
|
|
177
183
|
`realm_access.roles`. Set `AUTH_ROLE_CLAIM=realm_access.roles` and
|
|
178
|
-
`AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager`.
|
|
184
|
+
`AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager`.
|
|
179
185
|
For client roles, use `resource_access.<client-id>.roles`. The
|
|
180
186
|
[local Keycloak harness](../deploy/keycloak-test/README.md) sets this up.
|
|
181
187
|
- **Auth0:** add the user's roles to the access token as a namespaced custom
|
|
@@ -236,7 +242,7 @@ AUTH_JWKS_URI=https://identity.example.com/your-tenant/.well-known/jwks.json
|
|
|
236
242
|
AUTH_AUDIENCE=https://wardby.example.com/mcp
|
|
237
243
|
# Optional: Wardby roles (see "Wardby roles" above).
|
|
238
244
|
AUTH_ROLE_CLAIM=groups
|
|
239
|
-
AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager
|
|
245
|
+
AUTH_ROLE_MAP=wardby-admin=admin,wardby-packages=package-approver,wardby-services=service-manager,wardby-models=model-manager,wardby-hosts=host-manager
|
|
240
246
|
```
|
|
241
247
|
|
|
242
248
|
Copy `AUTH_ISSUER` exactly from the token's `iss` claim or the provider's
|
|
@@ -272,7 +278,7 @@ Confirm that:
|
|
|
272
278
|
|
|
273
279
|
- `resource` is the canonical MCP URI;
|
|
274
280
|
- `authorization_servers` contains the external issuer; and
|
|
275
|
-
- `scopes_supported` contains all
|
|
281
|
+
- `scopes_supported` contains all sixteen Wardby scopes.
|
|
276
282
|
|
|
277
283
|
An unauthenticated MCP request must return `401` with a `WWW-Authenticate`
|
|
278
284
|
challenge pointing back to that metadata document.
|
package/docs/getting-started.md
CHANGED
|
@@ -238,6 +238,13 @@ After connecting, try:
|
|
|
238
238
|
> List my Wardby agents, show the latest run and its actual cost, then create a
|
|
239
239
|
> new agent with a maximum budget of $0.50. Do not run it yet.
|
|
240
240
|
|
|
241
|
+
From Wardby 0.8.0, Claude Code can also show your runs in a pane beside the
|
|
242
|
+
chat. With `--client claude` or `both`, quickstart offers to install it
|
|
243
|
+
(`--claude-plugin` installs it unattended, `--no-claude-plugin` skips the
|
|
244
|
+
question); otherwise run `npx @wardby/cli@latest claude-plugin install`, then
|
|
245
|
+
`/wardby-runs`. `wardby doctor` reports whether it is set up. See the
|
|
246
|
+
[Claude Code plugin](claude-code-plugin.md) guide.
|
|
247
|
+
|
|
241
248
|
### Reasoning effort
|
|
242
249
|
|
|
243
250
|
A native agent can set `effort` (`low`, `medium`, `high`, `xhigh`, or `max`)
|
|
@@ -464,6 +471,7 @@ help article.
|
|
|
464
471
|
## Next steps
|
|
465
472
|
|
|
466
473
|
- [Agent recipes](agent-recipes.md)
|
|
474
|
+
- [Claude Code plugin](claude-code-plugin.md): your runs beside the chat (0.8.0+)
|
|
467
475
|
- [Runtime architecture](architecture-runtime.md)
|
|
468
476
|
- [Coding-agent setup](coding-agent-setup.md) and its
|
|
469
477
|
[local repositories](coding-agent-setup.md#local-repositories) section
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# Host providers
|
|
2
|
+
|
|
3
|
+
A host provider adds a code host to Wardby using your own custom tools. You can add
|
|
4
|
+
a host, or fix one, without a Wardby release.
|
|
5
|
+
|
|
6
|
+
Host providers are being added in stages. **This release (0.8.0) lets you register a
|
|
7
|
+
provider, approve its tools and test them. Agents can't use a registered provider yet**,
|
|
8
|
+
and `link_repository` still refuses its repositories.
|
|
9
|
+
|
|
10
|
+
## Who can manage one
|
|
11
|
+
|
|
12
|
+
Every host provider tool (`register_host_provider`, `approve_host_provider_tools`,
|
|
13
|
+
`get_host_provider`, `test_host_provider`, `delete_host_provider`) needs the
|
|
14
|
+
`hosts:admin` scope and a role that grants it (`admin` or `host-manager`), or the local
|
|
15
|
+
stdio operator. Bound tools decide who has permission and who wrote a comment, so treat
|
|
16
|
+
this like `agents:admin`. See
|
|
17
|
+
[getting-started-identity-provider.md](getting-started-identity-provider.md#wardby-roles)
|
|
18
|
+
for defining the scope and mapping the role.
|
|
19
|
+
|
|
20
|
+
Providers are shared by every host manager: any host manager can read and re-register any
|
|
21
|
+
provider, including its tool code, whoever owns the tools it names.
|
|
22
|
+
|
|
23
|
+
## Register a provider
|
|
24
|
+
|
|
25
|
+
1. Create a tool for each operation with `create_tool`. Each does one host call. See
|
|
26
|
+
[Tool contract](#tool-contract).
|
|
27
|
+
2. Store each credential with `create_secret`, and broker it with `set_secret_broker`
|
|
28
|
+
([tool-secrets.md](tool-secrets.md)). Allow every API host and place it in a header or
|
|
29
|
+
query parameter. Repository credentials also allow the git host; the permission
|
|
30
|
+
credential needs only the API hosts.
|
|
31
|
+
3. Store a webhook secret of at least 16 characters. Don't attach it to any agent.
|
|
32
|
+
4. Call `register_host_provider`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"provider": "your-host",
|
|
37
|
+
"gitHost": "git.example.com",
|
|
38
|
+
"apiHosts": ["api.example.com"],
|
|
39
|
+
"gitUsername": "x-token-auth",
|
|
40
|
+
"pullRequestUrlTemplate": "https://git.example.com/{repository}/pull/{number}",
|
|
41
|
+
"repositoryApiPath": "/2.0/repositories/{repository}",
|
|
42
|
+
"webhook": {
|
|
43
|
+
"header": "X-Hub-Signature",
|
|
44
|
+
"algorithm": "sha256",
|
|
45
|
+
"deliveryHeader": "X-Request-UUID",
|
|
46
|
+
"eventHeader": "X-Event-Key",
|
|
47
|
+
"secret": "your-webhook-secret"
|
|
48
|
+
},
|
|
49
|
+
"credentials": [{ "repositories": "your-workspace/*", "secret": "your-token" }],
|
|
50
|
+
"trustedAccounts": ["<account id>"],
|
|
51
|
+
"tools": { "getPullRequest": "your_get_pr_tool" }
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Bind every required operation in `tools` (names here are placeholders), and any optional
|
|
56
|
+
ones you want. For example:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
"tools": {
|
|
60
|
+
"getPullRequest": "your_get_pr", "listPullRequestFiles": "your_list_files",
|
|
61
|
+
"getDiff": "your_get_diff", "readFile": "your_read_file", "listFiles": "your_list_dir",
|
|
62
|
+
"listComments": "your_list_comments", "createComment": "your_create_comment",
|
|
63
|
+
"submitVerdict": "your_submit_verdict", "findPullRequest": "your_find_pr",
|
|
64
|
+
"openPullRequest": "your_open_pr", "updatePullRequest": "your_update_pr"
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
5. No restart is needed in this release, because agents can't use a provider yet. Once they
|
|
69
|
+
can, a new provider will need a server restart; approvals won't.
|
|
70
|
+
|
|
71
|
+
The tools and secrets you name must be yours. Secret rules, each refused with a named code:
|
|
72
|
+
|
|
73
|
+
- Credentials and `permissionCredential` must be brokered, placed in a header or query
|
|
74
|
+
parameter, and allowed on the API hosts (credentials also on the git host; the permission credential needs only the API hosts).
|
|
75
|
+
- `permissionCredential` can't also be listed in `credentials`
|
|
76
|
+
(`host_provider_permission_secret_shared`), so no other operation can reach it.
|
|
77
|
+
- The webhook secret can't be a credential or permission secret of any provider, and can't
|
|
78
|
+
be attached to an agent (`host_provider_webhook_secret_shared`). `attach_secret` refuses
|
|
79
|
+
it too.
|
|
80
|
+
- The webhook secret needs at least 16 characters (`host_provider_webhook_secret_short`).
|
|
81
|
+
- A permission secret can't be a credential or permission secret of any other provider, and a
|
|
82
|
+
credential can't be another provider's permission secret
|
|
83
|
+
(`host_provider_permission_secret_shared`).
|
|
84
|
+
- `gitUsername` can't be a credential's value and can't contain "username".
|
|
85
|
+
- `pullRequestUrlTemplate` is an https URL on `gitHost`, with no username, password or port.
|
|
86
|
+
|
|
87
|
+
Keep provider credentials unattached. A brokered credential attached to one of its owner's agents
|
|
88
|
+
can be used by that agent's tools without the host provider path guard, which only applies to a
|
|
89
|
+
provider's bound tools.
|
|
90
|
+
|
|
91
|
+
See [the refusal codes](../help/errors/host-provider-error.md) for what each one means.
|
|
92
|
+
|
|
93
|
+
These provider names can't be used: `github`, `local`, `http`, `https`, `ssh`, `git`,
|
|
94
|
+
`file` and `constructor`. Names match `^[a-z][a-z0-9-]{1,30}$`.
|
|
95
|
+
|
|
96
|
+
These operations are required: `getPullRequest`, `listPullRequestFiles`, `getDiff`,
|
|
97
|
+
`readFile`, `listFiles`, `listComments`, `createComment`, `submitVerdict`,
|
|
98
|
+
`findPullRequest`, `openPullRequest` and `updatePullRequest`. These are optional:
|
|
99
|
+
`editComment`, `resolveThread`, `listCommitStatuses`, `setCommitStatus`,
|
|
100
|
+
`getRepositoryPermission` and `normalizeEvent`. `getRepositoryPermission` becomes required
|
|
101
|
+
when you set `permissionCredential`.
|
|
102
|
+
|
|
103
|
+
## Who may start a run
|
|
104
|
+
|
|
105
|
+
This is how it will work once agents can use a provider. Registering records your choice
|
|
106
|
+
now; nothing enforces it in this release.
|
|
107
|
+
|
|
108
|
+
| Setup | Situation | Result |
|
|
109
|
+
| ------------------------- | ---------------------------------------- | --------------------------------- |
|
|
110
|
+
| `permissionCredential` | The host says the user has enough access | Run starts |
|
|
111
|
+
| `permissionCredential` | The host says they don't | Refused, even if in the allowlist |
|
|
112
|
+
| `permissionCredential` | The lookup fails | Refused, with no fallback |
|
|
113
|
+
| No `permissionCredential` | The user is in `trustedAccounts` | Run starts, at `write` level |
|
|
114
|
+
| No `permissionCredential` | The user isn't in `trustedAccounts` | Refused |
|
|
115
|
+
|
|
116
|
+
`permissionCredential` needs `permissionApiPath` (with `{workspace}` and `{repo}`) and a
|
|
117
|
+
bound `getRepositoryPermission`.
|
|
118
|
+
|
|
119
|
+
## Change a tool
|
|
120
|
+
|
|
121
|
+
Registering copies each tool's code, schema and `timeoutMs` (its time limit), and only that
|
|
122
|
+
copy ever runs.
|
|
123
|
+
`update_tool` changes nothing until you approve it, so the last approved version keeps
|
|
124
|
+
working in the meantime.
|
|
125
|
+
|
|
126
|
+
1. Call `update_tool`.
|
|
127
|
+
2. Call `get_host_provider` with `includeCode: true`. Changed tools show `status: "changed"`.
|
|
128
|
+
Each operation has `approvedCode` and `approvedParamsZod`, and a changed one also has
|
|
129
|
+
`currentCode` and `currentParamsZod`, because a change can be to the schema alone. Every
|
|
130
|
+
operation also shows `approvedTimeoutMs` and `currentTimeoutMs` (`null` is the default
|
|
131
|
+
10 seconds), since a change can be to the time limit alone.
|
|
132
|
+
3. Read the change, then call `approve_host_provider_tools` with the operation names. It
|
|
133
|
+
applies from the next call.
|
|
134
|
+
|
|
135
|
+
Deleting a tool keeps its snapshot running, with `status: "tool_deleted"`. To change that
|
|
136
|
+
operation, bind a new tool by registering again. Registering again also approves every tool
|
|
137
|
+
at its current code.
|
|
138
|
+
|
|
139
|
+
## Rotate a secret
|
|
140
|
+
|
|
141
|
+
A secret a provider uses is replaced with `create_secret` under the same name, whether it's a
|
|
142
|
+
credential, the permission credential or the webhook secret. Change its broker config with
|
|
143
|
+
`set_secret_broker`. Both need `hosts:admin` with a role that grants it, as well as
|
|
144
|
+
`secrets:write`, and refuse before handing out a browser link. Without brokering a credential
|
|
145
|
+
stops working, so `set_secret_broker` with `broker: null` also breaks the provider.
|
|
146
|
+
|
|
147
|
+
Only the secret's owner can rotate it this way, because secret names belong to their owner. If
|
|
148
|
+
another host manager calls `create_secret` with the same name, they get a separate secret and the
|
|
149
|
+
provider keeps the old value. They must register the provider again with their own secret instead.
|
|
150
|
+
|
|
151
|
+
The new webhook value needs at least 16 characters, whether you pass it directly or enter it
|
|
152
|
+
in the browser (`host_provider_webhook_secret_short`). A browser link requested before the secret
|
|
153
|
+
joined a provider is refused (`host_provider_secret_link_stale`); request a new one.
|
|
154
|
+
|
|
155
|
+
Rotating needs no re-registration: the next call uses the new value. Update the webhook secret on
|
|
156
|
+
the host at the same time.
|
|
157
|
+
|
|
158
|
+
## Test a provider
|
|
159
|
+
|
|
160
|
+
`test_host_provider` runs each approved read-only tool against one repository, using the
|
|
161
|
+
real credential:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"provider": "your-host",
|
|
166
|
+
"repository": "your-host:your-workspace/your-repo",
|
|
167
|
+
"pullRequest": 4,
|
|
168
|
+
"headRef": "a-branch-with-a-pull-request",
|
|
169
|
+
"ref": "a-commit-or-branch",
|
|
170
|
+
"accountId": "<account id>"
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Only `provider` and `repository` are required. Each other field enables the checks that need it:
|
|
175
|
+
|
|
176
|
+
| Field | Checks it enables |
|
|
177
|
+
| ------------- | ----------------------------------------------------------------------------------- |
|
|
178
|
+
| `pullRequest` | `getPullRequest`, `listPullRequestFiles`, `getDiff`, `listComments` |
|
|
179
|
+
| `headRef` | `findPullRequest` |
|
|
180
|
+
| `ref` | `readFile`, `listFiles`, `listCommitStatuses` (defaults to the pull request's head) |
|
|
181
|
+
| `accountId` | `getRepositoryPermission` |
|
|
182
|
+
|
|
183
|
+
Each result is an `outcome` of `pass`, `fail` (with a fixed code, below) or `skipped`. A skip has
|
|
184
|
+
one of these codes: `not_bound` (no tool bound), `needs_pull_request`, `needs_head_ref`,
|
|
185
|
+
`needs_ref`, `needs_account` (the field above is missing), `allowlist_mode` (no
|
|
186
|
+
`permissionCredential`, so no permission lookup) and `not_read_only` (a write operation, never run).
|
|
187
|
+
|
|
188
|
+
Write operations are skipped. A read-only tool can only send GET requests. The report holds
|
|
189
|
+
an operation, an outcome and a fixed code for each, and no response data, so you can share it.
|
|
190
|
+
|
|
191
|
+
| Code | Meaning |
|
|
192
|
+
| --------------------------------------- | ---------------------------------------------------------------- |
|
|
193
|
+
| `host_unauthorized`, `host_forbidden` | The host refused the credential for this call. |
|
|
194
|
+
| `host_not_found` | The host doesn't have what was asked for. |
|
|
195
|
+
| `host_rate_limited`, `host_unavailable` | Try again later. |
|
|
196
|
+
| `host_conflict` | The host refused because of the current state. |
|
|
197
|
+
| `host_tool_invalid_result` | The tool's answer doesn't match its operation's shape. |
|
|
198
|
+
| `host_tool_invalid_params` | The tool's schema refused what Wardby sends it. |
|
|
199
|
+
| `host_tool_request_denied` | The tool went outside what a bound tool may request (see below). |
|
|
200
|
+
| `host_tool_no_credential` | See below. |
|
|
201
|
+
| `host_tool_failed` | The tool threw an error. Its message is dropped on purpose. |
|
|
202
|
+
| `host_tool_timeout` | The tool ran out of time or instructions. |
|
|
203
|
+
|
|
204
|
+
`host_tool_no_credential` has these causes: no credential's `repositories` covers this repository,
|
|
205
|
+
the secret can't be decrypted, or the secret is no longer brokered or no longer allows every API
|
|
206
|
+
host.
|
|
207
|
+
|
|
208
|
+
## Tool contract
|
|
209
|
+
|
|
210
|
+
Each tool receives `workspace`, `repo` and `repository` (`workspace/repo`), plus its
|
|
211
|
+
operation's input fields (below). Declare them in `paramsZod`.
|
|
212
|
+
|
|
213
|
+
A tool answers with its operation's result, or `{ "error": "<code>" }` when the host refused,
|
|
214
|
+
where the code is `unauthorized`, `forbidden`, `not_found`, `conflict`, `rate_limited` or
|
|
215
|
+
`unavailable`. Results are checked strictly: an extra key, a missing key or a wrong type fails the
|
|
216
|
+
call with `host_tool_invalid_result`.
|
|
217
|
+
|
|
218
|
+
A pull request object, as returned by `getPullRequest` and `findPullRequest`, has exactly:
|
|
219
|
+
`number` (positive integer), `title`, `body`, `author` (string or null), `state` (`open` or
|
|
220
|
+
`closed`; a merged pull request is `closed` with `merged` true, so map your host's own states),
|
|
221
|
+
`merged` (boolean), `draft` (boolean), `baseRef`, `headRef`, `headSha` (non-empty), `isFork` (boolean) and
|
|
222
|
+
`htmlUrl` (a URL).
|
|
223
|
+
|
|
224
|
+
Read operations (method GET):
|
|
225
|
+
|
|
226
|
+
| Operation | Input fields | Result |
|
|
227
|
+
| ------------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
228
|
+
| `getPullRequest` | `number` | A pull request object. |
|
|
229
|
+
| `findPullRequest` | `headRef` | `{ pullRequest }`: a pull request object, or null if none. |
|
|
230
|
+
| `listPullRequestFiles` | `number`, `page` | `{ files, nextPage }`. Each file: `filename`, `status` (`added`, `modified`, `removed` or `renamed`), `additions`, `deletions` (non-negative integers) and optionally `previousFilename`. |
|
|
231
|
+
| `getDiff` | `number` | `{ diff }`: the unified diff text. |
|
|
232
|
+
| `readFile` | `ref`, `path` | `{ kind: "file", content }`, `{ kind: "directory" }` or `{ kind: "not_found" }`. No other keys. |
|
|
233
|
+
| `listFiles` | `ref`, `path`, `page` | `{ entries, nextPage }`. Each entry: `path`, `type` (`file` or `directory`) and optionally `size` (non-negative integer). |
|
|
234
|
+
| `listComments` | `number`, `page` | `{ comments, nextPage }`. Each comment: `id` (non-empty), `author` and `authorId` (string or null), `body`, `createdAt`, `path` (string or null), `line` (positive integer or null), `parentId` (string or null), `resolved` (boolean). |
|
|
235
|
+
| `listCommitStatuses` | `ref`, `page` | `{ statuses, nextPage }`. Each status: `key`, `state` (`pending`, `success`, `failure` or `stopped`) and `url` (string or null). |
|
|
236
|
+
| `getRepositoryPermission` | `accountId` | `{ permission }`: `none`, `read`, `triage`, `write`, `maintain` or `admin`. Uses the permission credential and `permissionApiPath`. |
|
|
237
|
+
|
|
238
|
+
`listPullRequestFiles`, `listFiles`, `listComments` and `listCommitStatuses` page. Each returns
|
|
239
|
+
one page per call, with `nextPage`: a string to continue from, or null at the end. To get the next
|
|
240
|
+
page, Wardby passes that string back as the optional `page` input, and it leaves `page` out for the
|
|
241
|
+
first page. Declare `page` in `paramsZod`, because `z.object` drops keys it doesn't name, and a tool
|
|
242
|
+
without it would return the first page every time. `test_host_provider` reads the first page only.
|
|
243
|
+
|
|
244
|
+
`ref` is optional on `readFile` and `listFiles`, where leaving it out means the default branch, so
|
|
245
|
+
declare it as optional there. `listCommitStatuses` always needs one, because statuses belong to a
|
|
246
|
+
commit.
|
|
247
|
+
|
|
248
|
+
Keep a file's `status` to those four words: Wardby treats a `removed` file as having nothing to read
|
|
249
|
+
at the head.
|
|
250
|
+
|
|
251
|
+
Write operations:
|
|
252
|
+
|
|
253
|
+
| Operation | Method | Result |
|
|
254
|
+
| ------------------- | ------ | ---------------------------- |
|
|
255
|
+
| `openPullRequest` | POST | A pull request object. |
|
|
256
|
+
| `updatePullRequest` | PUT | A pull request object. |
|
|
257
|
+
| `createComment` | POST | `{ id }` (non-empty string). |
|
|
258
|
+
| `editComment` | PUT | `{ id }` (non-empty string). |
|
|
259
|
+
| `resolveThread` | POST | `{}` |
|
|
260
|
+
| `submitVerdict` | POST | `{}` |
|
|
261
|
+
| `setCommitStatus` | POST | `{}` |
|
|
262
|
+
|
|
263
|
+
The input fields of the write operations are defined when agents can use a provider, in a later
|
|
264
|
+
release, so tools for them may need changing then. `test_host_provider` never runs them.
|
|
265
|
+
|
|
266
|
+
`normalizeEvent` makes no requests and isn't called yet.
|
|
267
|
+
|
|
268
|
+
Use `fetch(url, { secrets: ["host"] })`. Wardby resolves `host` to the credential for this
|
|
269
|
+
call's repository. A bound tool:
|
|
270
|
+
|
|
271
|
+
- reaches only `apiHosts`, over https on the default port, with no embedded credentials;
|
|
272
|
+
- stays under `repositoryApiPath` for this repository. `getRepositoryPermission` stays under
|
|
273
|
+
`permissionApiPath` instead, and is the only operation that gets `permissionCredential`;
|
|
274
|
+
- uses its operation's method: GET for reads, and POST or PUT for writes;
|
|
275
|
+
- may set only the headers `accept`, `content-type`, `if-match` and `if-none-match`;
|
|
276
|
+
- makes at most three requests per call. No request follows a redirect, whether or not it
|
|
277
|
+
carries a secret: follow a `Location` yourself, which counts as a request and goes through
|
|
278
|
+
the same limits;
|
|
279
|
+
- can't send the query keys `_method` or any starting `x-http-method`, in any case, which some
|
|
280
|
+
frameworks read as the request's method;
|
|
281
|
+
- has its path judged by what a server could turn it into: dot-only segments after decoding
|
|
282
|
+
and encoded separators are refused. A few unusual file names can therefore be refused, and a
|
|
283
|
+
repository path must be sent literally, not percent-encoded;
|
|
284
|
+
- has no datastore, shared datastore or readable secrets, and its `console` output is dropped;
|
|
285
|
+
- runs under the usual sandbox limits: 10 s per call, 8 s per fetch, 8 MiB per response.
|
|
286
|
+
|
|
287
|
+
Anything outside these limits fails the call with `host_tool_request_denied`, even if the
|
|
288
|
+
tool catches the error.
|
|
289
|
+
|
|
290
|
+
## Remove a provider
|
|
291
|
+
|
|
292
|
+
`delete_host_provider` removes a provider and its snapshots. It's refused while an agent links
|
|
293
|
+
to one of its repositories. `delete_secret` is refused while a provider uses that secret, and
|
|
294
|
+
names the provider.
|