@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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: troubleshooting/debugging-agent-runs
|
|
3
|
+
title: Debug an agent run
|
|
4
|
+
summary: Triage a run that failed, opened no pull request, or missed what you expected, using the MCP tools and GitHub without server logs.
|
|
5
|
+
audience: operator
|
|
6
|
+
tags: [debugging, triage, get_run, list_runs, failureCategory, diagnosticId, get_run_transcript, no_changes]
|
|
7
|
+
appliesTo: >=0.7.0
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Debug an agent run
|
|
11
|
+
|
|
12
|
+
Find the run with `list_runs`, read it with `get_run`, then follow what you see.
|
|
13
|
+
Without an `agentId`, `list_runs` lists your runs across every agent (from
|
|
14
|
+
Wardby 0.8.0); add `active: true` or `since` to narrow it.
|
|
15
|
+
|
|
16
|
+
| What you see | What to check |
|
|
17
|
+
| ----------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| No run started | `list_repositories` on the router: is a link holding the trigger you used? |
|
|
19
|
+
| Failed or refused | `status`, `error`, `failureCategory` and the final text. Call `search_help` with the category |
|
|
20
|
+
| Lead ran, no coding run | The lead's final text, which should say why it didn't delegate |
|
|
21
|
+
| Succeeded, no pull request | `codingResult.outcome`: `no_changes`, `budget_exhausted`, or `branch_pushed` on a local repository |
|
|
22
|
+
| Pull request missed the point | The diff, the review, the original request, and `request` on `get_run` (from Wardby 0.8.0) |
|
|
23
|
+
|
|
24
|
+
A failed coding run's specific reason is only in the server log. Send an operator
|
|
25
|
+
the run ID and its `diagnosticId`. For Claude Code agents with `sessionResume` on,
|
|
26
|
+
`get_run_transcript` shows what the agent did; see
|
|
27
|
+
[Resume Claude Code runs locally](../resume-runs-locally.md).
|
|
28
|
+
|
|
29
|
+
The full guide is [Debugging an agent run](../../docs/debugging-agent-runs.md).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wardby/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Self-hosted control plane for budget-guarded AI agents.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/wardby/wardby#readme",
|
|
@@ -158,6 +158,7 @@
|
|
|
158
158
|
},
|
|
159
159
|
"overrides": {
|
|
160
160
|
"deepmerge-ts": "8.0.2",
|
|
161
|
+
"minimatch": "11.0.3",
|
|
161
162
|
"mysql2": "3.24.4",
|
|
162
163
|
"uuid": "11.1.1"
|
|
163
164
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
-- Tool-backed host providers: config and approved snapshots. No secret values.
|
|
2
|
+
CREATE TABLE "HostProvider" (
|
|
3
|
+
"name" TEXT NOT NULL,
|
|
4
|
+
"contractVersion" INTEGER NOT NULL,
|
|
5
|
+
"gitHost" TEXT NOT NULL,
|
|
6
|
+
"apiHosts" TEXT[],
|
|
7
|
+
"gitUsername" TEXT NOT NULL,
|
|
8
|
+
"pullRequestUrlTemplate" TEXT NOT NULL,
|
|
9
|
+
"repositoryApiPath" TEXT NOT NULL,
|
|
10
|
+
"permissionApiPath" TEXT,
|
|
11
|
+
"webhook" JSONB NOT NULL,
|
|
12
|
+
"webhookSecretId" TEXT NOT NULL,
|
|
13
|
+
"permissionSecretId" TEXT,
|
|
14
|
+
"createdById" TEXT NOT NULL,
|
|
15
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
16
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
17
|
+
CONSTRAINT "HostProvider_pkey" PRIMARY KEY ("name")
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE "HostProviderOperation" (
|
|
21
|
+
"provider" TEXT NOT NULL,
|
|
22
|
+
"operation" TEXT NOT NULL,
|
|
23
|
+
"toolId" TEXT,
|
|
24
|
+
"code" TEXT NOT NULL,
|
|
25
|
+
"paramsZod" TEXT NOT NULL,
|
|
26
|
+
"approvedById" TEXT NOT NULL,
|
|
27
|
+
"approvedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
28
|
+
CONSTRAINT "HostProviderOperation_pkey" PRIMARY KEY ("provider", "operation")
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE "HostProviderCredential" (
|
|
32
|
+
"id" TEXT NOT NULL,
|
|
33
|
+
"provider" TEXT NOT NULL,
|
|
34
|
+
"repositoryPattern" TEXT NOT NULL,
|
|
35
|
+
"secretId" TEXT NOT NULL,
|
|
36
|
+
"credentialKind" TEXT NOT NULL DEFAULT 'static',
|
|
37
|
+
CONSTRAINT "HostProviderCredential_pkey" PRIMARY KEY ("id")
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
CREATE TABLE "HostProviderTrustedAccount" (
|
|
41
|
+
"provider" TEXT NOT NULL,
|
|
42
|
+
"accountId" TEXT NOT NULL,
|
|
43
|
+
"addedById" TEXT NOT NULL,
|
|
44
|
+
"addedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
45
|
+
CONSTRAINT "HostProviderTrustedAccount_pkey" PRIMARY KEY ("provider", "accountId")
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE UNIQUE INDEX "HostProviderCredential_provider_repositoryPattern_key" ON "HostProviderCredential"("provider", "repositoryPattern");
|
|
49
|
+
|
|
50
|
+
ALTER TABLE "HostProvider" ADD CONSTRAINT "HostProvider_webhookSecretId_fkey" FOREIGN KEY ("webhookSecretId") REFERENCES "Secret"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
51
|
+
ALTER TABLE "HostProvider" ADD CONSTRAINT "HostProvider_permissionSecretId_fkey" FOREIGN KEY ("permissionSecretId") REFERENCES "Secret"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
52
|
+
ALTER TABLE "HostProviderOperation" ADD CONSTRAINT "HostProviderOperation_provider_fkey" FOREIGN KEY ("provider") REFERENCES "HostProvider"("name") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
53
|
+
ALTER TABLE "HostProviderOperation" ADD CONSTRAINT "HostProviderOperation_toolId_fkey" FOREIGN KEY ("toolId") REFERENCES "Tool"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
54
|
+
ALTER TABLE "HostProviderCredential" ADD CONSTRAINT "HostProviderCredential_provider_fkey" FOREIGN KEY ("provider") REFERENCES "HostProvider"("name") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
55
|
+
ALTER TABLE "HostProviderCredential" ADD CONSTRAINT "HostProviderCredential_secretId_fkey" FOREIGN KEY ("secretId") REFERENCES "Secret"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
56
|
+
ALTER TABLE "HostProviderTrustedAccount" ADD CONSTRAINT "HostProviderTrustedAccount_provider_fkey" FOREIGN KEY ("provider") REFERENCES "HostProvider"("name") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- A coding agent may work in several repositories: each link can name its own base
|
|
2
|
+
-- branch, and a run records that its repository came from a link.
|
|
3
|
+
ALTER TABLE "AgentRepository" ADD COLUMN "baseRef" TEXT;
|
|
4
|
+
ALTER TABLE "CodingRun" ADD COLUMN "viaRepositoryLink" BOOLEAN NOT NULL DEFAULT false;
|
|
5
|
+
ALTER TABLE "NativeGatewayCall" ADD COLUMN "childRepository" TEXT;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
-- A sandboxed tool may set its own time limit per call, in milliseconds. Null keeps the
|
|
2
|
+
-- default limit. A host provider's approved snapshot of a tool keeps the value it approved.
|
|
3
|
+
ALTER TABLE "Tool" ADD COLUMN "timeoutMs" INTEGER;
|
|
4
|
+
ALTER TABLE "HostProviderOperation" ADD COLUMN "timeoutMs" INTEGER;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- Remote MCP servers an owner registers, and their attachments to native agents.
|
|
2
|
+
CREATE TABLE "McpServer" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"ownerId" TEXT NOT NULL,
|
|
5
|
+
"name" TEXT NOT NULL,
|
|
6
|
+
"url" TEXT NOT NULL,
|
|
7
|
+
"secretNames" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
8
|
+
"toolSnapshot" JSONB NOT NULL DEFAULT '[]',
|
|
9
|
+
"snapshotAt" TIMESTAMP(3),
|
|
10
|
+
"serverInfo" JSONB,
|
|
11
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
13
|
+
CONSTRAINT "McpServer_pkey" PRIMARY KEY ("id")
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE TABLE "AgentMcpServer" (
|
|
17
|
+
"agentId" TEXT NOT NULL,
|
|
18
|
+
"serverId" TEXT NOT NULL,
|
|
19
|
+
"allowedTools" TEXT[],
|
|
20
|
+
"callTimeoutMs" INTEGER,
|
|
21
|
+
"attachedById" TEXT NOT NULL,
|
|
22
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
23
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
24
|
+
CONSTRAINT "AgentMcpServer_pkey" PRIMARY KEY ("agentId", "serverId")
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE UNIQUE INDEX "McpServer_ownerId_name_key" ON "McpServer"("ownerId", "name");
|
|
28
|
+
CREATE INDEX "McpServer_ownerId_idx" ON "McpServer"("ownerId");
|
|
29
|
+
CREATE INDEX "AgentMcpServer_serverId_idx" ON "AgentMcpServer"("serverId");
|
|
30
|
+
|
|
31
|
+
ALTER TABLE "McpServer" ADD CONSTRAINT "McpServer_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "Principal"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
32
|
+
ALTER TABLE "AgentMcpServer" ADD CONSTRAINT "AgentMcpServer_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
33
|
+
ALTER TABLE "AgentMcpServer" ADD CONSTRAINT "AgentMcpServer_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "McpServer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- Coding runs: pinned MCP tools, the MCP token's hash, and a call counter.
|
|
2
|
+
ALTER TABLE "CodingProxySession" ADD COLUMN "mcpTools" JSONB;
|
|
3
|
+
ALTER TABLE "CodingProxySession" ADD COLUMN "mcpTokenHash" TEXT;
|
|
4
|
+
ALTER TABLE "CodingProxySession" ADD COLUMN "mcpCallCount" INTEGER NOT NULL DEFAULT 0;
|
|
5
|
+
CREATE UNIQUE INDEX "CodingProxySession_mcpTokenHash_key" ON "CodingProxySession"("mcpTokenHash");
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
-- Run steps: one line per tool call or model message, and the count of steps past the per-run cap.
|
|
2
|
+
ALTER TABLE "Run" ADD COLUMN "stepsDropped" INTEGER NOT NULL DEFAULT 0;
|
|
3
|
+
|
|
4
|
+
CREATE TABLE "RunStep" (
|
|
5
|
+
"id" TEXT NOT NULL,
|
|
6
|
+
"runId" TEXT NOT NULL,
|
|
7
|
+
"seq" INTEGER NOT NULL,
|
|
8
|
+
"at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
+
"kind" TEXT NOT NULL,
|
|
10
|
+
"tool" TEXT,
|
|
11
|
+
"callId" TEXT,
|
|
12
|
+
"summary" TEXT NOT NULL,
|
|
13
|
+
"status" TEXT,
|
|
14
|
+
"detail" TEXT,
|
|
15
|
+
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
16
|
+
CONSTRAINT "RunStep_pkey" PRIMARY KEY ("id")
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
CREATE UNIQUE INDEX "RunStep_runId_seq_key" ON "RunStep"("runId", "seq");
|
|
20
|
+
|
|
21
|
+
CREATE INDEX "RunStep_runId_callId_idx" ON "RunStep"("runId", "callId");
|
|
22
|
+
|
|
23
|
+
CREATE INDEX "RunStep_expiresAt_idx" ON "RunStep"("expiresAt");
|
|
24
|
+
|
|
25
|
+
ALTER TABLE "RunStep" ADD CONSTRAINT "RunStep_runId_fkey"
|
|
26
|
+
FOREIGN KEY ("runId") REFERENCES "Run"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
-- Live run steps for the admin viewer (docs/viewer-api.md): a `step` event when a
|
|
2
|
+
-- step is recorded and when its status arrives. Only stored columns are sent:
|
|
3
|
+
-- the summary is already redacted when the row is written; the call id and the
|
|
4
|
+
-- detail text are never sent. Every other branch is unchanged.
|
|
5
|
+
CREATE OR REPLACE FUNCTION wardby_viewer_notify() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
6
|
+
DECLARE
|
|
7
|
+
payload jsonb;
|
|
8
|
+
BEGIN
|
|
9
|
+
IF TG_TABLE_NAME = 'Run' THEN
|
|
10
|
+
IF TG_OP = 'UPDATE'
|
|
11
|
+
AND NEW."status" IS NOT DISTINCT FROM OLD."status"
|
|
12
|
+
AND NEW."turns" IS NOT DISTINCT FROM OLD."turns"
|
|
13
|
+
AND NEW."costUsd" IS NOT DISTINCT FROM OLD."costUsd"
|
|
14
|
+
AND NEW."tokensIn" IS NOT DISTINCT FROM OLD."tokensIn"
|
|
15
|
+
AND NEW."tokensOut" IS NOT DISTINCT FROM OLD."tokensOut"
|
|
16
|
+
AND NEW."finishedAt" IS NOT DISTINCT FROM OLD."finishedAt"
|
|
17
|
+
AND NEW."parentRunId" IS NOT DISTINCT FROM OLD."parentRunId" THEN
|
|
18
|
+
RETURN NULL; -- heartbeat-only and other invisible updates
|
|
19
|
+
END IF;
|
|
20
|
+
payload := jsonb_build_object(
|
|
21
|
+
'kind', 'run', 'runId', NEW."id", 'parentRunId', NEW."parentRunId", 'agentId', NEW."agentId",
|
|
22
|
+
'status', NEW."status", 'turns', NEW."turns", 'tokensIn', NEW."tokensIn", 'tokensOut', NEW."tokensOut",
|
|
23
|
+
'costUsd', NEW."costUsd"::float8,
|
|
24
|
+
'finishedAt', to_char(NEW."finishedAt", 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'));
|
|
25
|
+
ELSIF TG_TABLE_NAME = 'CodingRunServiceStatus' THEN
|
|
26
|
+
payload := jsonb_build_object(
|
|
27
|
+
'kind', 'service', 'runId', NEW."runId", 'name', NEW."name", 'state', NEW."state", 'attempts', NEW."attempts");
|
|
28
|
+
ELSIF TG_TABLE_NAME = 'IssuePullRequest' THEN
|
|
29
|
+
payload := jsonb_build_object('kind', 'outcome', 'runId', NEW."openedByRunId", 'source', 'pull_request');
|
|
30
|
+
ELSIF TG_TABLE_NAME = 'RunHostStatus' THEN
|
|
31
|
+
payload := jsonb_build_object('kind', 'outcome', 'runId', NEW."runId", 'source', 'host_status');
|
|
32
|
+
ELSIF TG_TABLE_NAME = 'RunIssueStatus' THEN
|
|
33
|
+
payload := jsonb_build_object('kind', 'outcome', 'runId', NEW."runId", 'source', 'issue_status');
|
|
34
|
+
ELSIF TG_TABLE_NAME = 'RunHostCheck' THEN
|
|
35
|
+
payload := jsonb_build_object('kind', 'outcome', 'runId', NEW."runId", 'source', 'host_check');
|
|
36
|
+
ELSIF TG_TABLE_NAME = 'RunStep' THEN
|
|
37
|
+
IF TG_OP = 'UPDATE' AND NEW."status" IS NOT DISTINCT FROM OLD."status" THEN
|
|
38
|
+
RETURN NULL; -- only a step's status is shown as it changes
|
|
39
|
+
END IF;
|
|
40
|
+
payload := jsonb_build_object(
|
|
41
|
+
'kind', 'step', 'runId', NEW."runId", 'seq', NEW."seq", 'stepKind', NEW."kind", 'tool', NEW."tool",
|
|
42
|
+
'summary', NEW."summary", 'status', NEW."status",
|
|
43
|
+
'at', to_char(NEW."at", 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'));
|
|
44
|
+
ELSE
|
|
45
|
+
RETURN NULL;
|
|
46
|
+
END IF;
|
|
47
|
+
-- A viewer event must never fail the write that caused it (e.g. a payload
|
|
48
|
+
-- over NOTIFY's 8000-byte limit).
|
|
49
|
+
BEGIN
|
|
50
|
+
PERFORM pg_notify('wardby_viewer', payload::text);
|
|
51
|
+
EXCEPTION WHEN OTHERS THEN
|
|
52
|
+
NULL;
|
|
53
|
+
END;
|
|
54
|
+
RETURN NULL;
|
|
55
|
+
END;
|
|
56
|
+
$$;
|
|
57
|
+
|
|
58
|
+
CREATE TRIGGER "RunStep_viewer_notify" AFTER INSERT OR UPDATE ON "RunStep"
|
|
59
|
+
FOR EACH ROW EXECUTE FUNCTION wardby_viewer_notify();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- Run steps detail level: the owner's per-agent setting, the level fixed on each run at
|
|
2
|
+
-- dispatch, and the proxy session's copy of it. Additive, nullable: existing rows mean "unset".
|
|
3
|
+
CREATE TYPE "RunStepsLevel" AS ENUM ('off', 'summary', 'detail');
|
|
4
|
+
|
|
5
|
+
ALTER TABLE "Agent" ADD COLUMN "runSteps" "RunStepsLevel";
|
|
6
|
+
|
|
7
|
+
ALTER TABLE "Run" ADD COLUMN "runStepsLevel" "RunStepsLevel";
|
|
8
|
+
|
|
9
|
+
ALTER TABLE "CodingProxySession" ADD COLUMN "runStepsLevel" "RunStepsLevel";
|
package/prisma/schema.prisma
CHANGED
|
@@ -20,18 +20,18 @@ datasource db {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
model Agent {
|
|
23
|
-
id
|
|
24
|
-
name
|
|
25
|
-
systemPrompt
|
|
26
|
-
model
|
|
27
|
-
budgetUsd
|
|
23
|
+
id String @id @default(cuid())
|
|
24
|
+
name String @unique
|
|
25
|
+
systemPrompt String
|
|
26
|
+
model String
|
|
27
|
+
budgetUsd Decimal @db.Decimal(10, 4)
|
|
28
28
|
/// Percent above budgetUsd a run may spend: each coding run's limit, or (on a lead agent) its run tree's ceiling for coding sub-agents; native model calls are unaffected; group caps still apply.
|
|
29
|
-
allowedOverrunPercent Int
|
|
30
|
-
createdAt
|
|
31
|
-
updatedAt
|
|
32
|
-
runs
|
|
33
|
-
kind
|
|
34
|
-
codingProfile
|
|
29
|
+
allowedOverrunPercent Int @default(0)
|
|
30
|
+
createdAt DateTime @default(now())
|
|
31
|
+
updatedAt DateTime @updatedAt
|
|
32
|
+
runs Run[]
|
|
33
|
+
kind AgentKind @default(native)
|
|
34
|
+
codingProfile CodingAgentProfile?
|
|
35
35
|
|
|
36
36
|
// Phase 2: scheduling. `schedule` is a cron expression; null = manual-only.
|
|
37
37
|
schedule String?
|
|
@@ -60,6 +60,7 @@ model Agent {
|
|
|
60
60
|
repositories AgentRepository[]
|
|
61
61
|
deferredReviews DeferredReview[]
|
|
62
62
|
issueProjects AgentIssueProject[]
|
|
63
|
+
mcpServers AgentMcpServer[]
|
|
63
64
|
notificationChannels NotificationChannel[]
|
|
64
65
|
|
|
65
66
|
/// Self-defects opt-in: the Jira project and issue type wardby files the agent's own failures into. Both or neither.
|
|
@@ -86,6 +87,9 @@ model Agent {
|
|
|
86
87
|
/// single-use worker container/pod. Each Run snapshots this at creation
|
|
87
88
|
/// (Run.nativeExecutionMode), so a change reaches only later runs.
|
|
88
89
|
nativeExecutionMode NativeExecutionMode @default(control_plane)
|
|
90
|
+
/// The owner's run steps level for this agent's runs; null = unset (summary). A run records
|
|
91
|
+
/// min(WARDBY_RUN_STEPS, this), fixed at dispatch (Run.runStepsLevel). Owner-only.
|
|
92
|
+
runSteps RunStepsLevel?
|
|
89
93
|
|
|
90
94
|
/// Un-phased: sub-agent composition edges (see AgentSubAgent below). An
|
|
91
95
|
/// agent can be a parent (has children it can delegate to) and/or a
|
|
@@ -143,6 +147,15 @@ enum AgentKind {
|
|
|
143
147
|
coding
|
|
144
148
|
}
|
|
145
149
|
|
|
150
|
+
/// Run steps level (docs/debugging-agent-runs.md#run-steps): off records nothing, summary one
|
|
151
|
+
/// redacted line per step, detail also a redacted detail text (tool input, the tail of tool
|
|
152
|
+
/// output, model text).
|
|
153
|
+
enum RunStepsLevel {
|
|
154
|
+
off
|
|
155
|
+
summary
|
|
156
|
+
detail
|
|
157
|
+
}
|
|
158
|
+
|
|
146
159
|
/// Where a native agent's runs execute (Agent.nativeExecutionMode).
|
|
147
160
|
enum NativeExecutionMode {
|
|
148
161
|
control_plane @map("control-plane")
|
|
@@ -186,6 +199,10 @@ model Tool {
|
|
|
186
199
|
jsonSchema Json
|
|
187
200
|
/// Tool body source; run inside the sandbox with the validated params.
|
|
188
201
|
code String
|
|
202
|
+
/// The tool's own time limit per call (ms). Null = the default (10 s). A
|
|
203
|
+
/// run uses the lower of this and WARDBY_TOOL_MAX_TIMEOUT_MS, and pins the
|
|
204
|
+
/// value its load step read, like the code.
|
|
205
|
+
timeoutMs Int?
|
|
189
206
|
createdAt DateTime @default(now())
|
|
190
207
|
updatedAt DateTime @updatedAt
|
|
191
208
|
agents AgentTool[]
|
|
@@ -195,6 +212,8 @@ model Tool {
|
|
|
195
212
|
ownerId String?
|
|
196
213
|
owner Principal? @relation(fields: [ownerId], references: [id])
|
|
197
214
|
|
|
215
|
+
hostProviderOperations HostProviderOperation[]
|
|
216
|
+
|
|
198
217
|
@@unique([ownerId, name])
|
|
199
218
|
}
|
|
200
219
|
|
|
@@ -393,6 +412,12 @@ model Run {
|
|
|
393
412
|
/// run through the server's executor and clears this.
|
|
394
413
|
stopRequestedAt DateTime?
|
|
395
414
|
stopRequestReason String?
|
|
415
|
+
/// Run steps (RunStep) not recorded because the run already had MAX_RUN_STEPS (2,000).
|
|
416
|
+
stepsDropped Int @default(0)
|
|
417
|
+
/// The run steps level this run records, fixed at dispatch: min(WARDBY_RUN_STEPS, Agent.runSteps
|
|
418
|
+
/// or summary). Null on runs from before the field (they record at most summary).
|
|
419
|
+
runStepsLevel RunStepsLevel?
|
|
420
|
+
steps RunStep[]
|
|
396
421
|
|
|
397
422
|
/// Un-phased: sub-agent dispatch (see AgentSubAgent). Null for a
|
|
398
423
|
/// top-level run; set when this run was created by a parent run's
|
|
@@ -425,6 +450,7 @@ model Run {
|
|
|
425
450
|
/// text, no FK.
|
|
426
451
|
triggeredById String?
|
|
427
452
|
|
|
453
|
+
@@unique([parentRunId, parentCallId])
|
|
428
454
|
@@index([agentId, triggeredById])
|
|
429
455
|
/// The admin viewer's graph window (runs started since a time, or still
|
|
430
456
|
/// pending/running) and its ancestor/children walks (docs/viewer-api.md).
|
|
@@ -433,7 +459,6 @@ model Run {
|
|
|
433
459
|
@@index([parentRunId])
|
|
434
460
|
@@index([startDeferredAt])
|
|
435
461
|
@@index([stopRequestedAt])
|
|
436
|
-
@@unique([parentRunId, parentCallId])
|
|
437
462
|
}
|
|
438
463
|
|
|
439
464
|
/// Phase 5: owner-configured coding behavior. Runtime credentials and opaque
|
|
@@ -572,6 +597,9 @@ model CodingRun {
|
|
|
572
597
|
baseSha String?
|
|
573
598
|
/// Step in the request's merge order set by the delegating agent (1 = first); null = no order.
|
|
574
599
|
mergeOrder Int?
|
|
600
|
+
/// Fixed at dispatch: this run's repository came from an AgentRepository link, not the
|
|
601
|
+
/// profile, so that link must still exist whenever the run uses the repository.
|
|
602
|
+
viaRepositoryLink Boolean @default(false)
|
|
575
603
|
/// When Wardby marked this run's pull request ready for review (at most once;
|
|
576
604
|
/// a person moving it back to draft is final). Only set on a root coding run.
|
|
577
605
|
markedReadyAt DateTime?
|
|
@@ -642,6 +670,37 @@ model RunTranscript {
|
|
|
642
670
|
@@index([expiresAt])
|
|
643
671
|
}
|
|
644
672
|
|
|
673
|
+
/// One line of what a run did: a tool call (with its status once the result is back) or what the
|
|
674
|
+
/// model said. Derived by trusted code from model traffic and written only by the control plane's
|
|
675
|
+
/// RunStepWriter, after exact-value redaction against the run's secret values
|
|
676
|
+
/// (docs/debugging-agent-runs.md#run-steps). Never tool output at the summary level.
|
|
677
|
+
model RunStep {
|
|
678
|
+
id String @id @default(cuid())
|
|
679
|
+
runId String
|
|
680
|
+
run Run @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
681
|
+
/// Order within the run, from 1.
|
|
682
|
+
seq Int
|
|
683
|
+
at DateTime @default(now())
|
|
684
|
+
/// "tool" | "said"
|
|
685
|
+
kind String
|
|
686
|
+
/// The tool's display name (Bash for every agent's shell tool, mcp:<name>, Edit, ...); null for "said".
|
|
687
|
+
tool String?
|
|
688
|
+
/// The provider's call id (to attach the result), or a said:<key> id; never returned by MCP.
|
|
689
|
+
callId String?
|
|
690
|
+
/// Redacted, at most 300 characters.
|
|
691
|
+
summary String
|
|
692
|
+
/// ok | error | exit N, set when the result arrives.
|
|
693
|
+
status String?
|
|
694
|
+
/// The detail level's text: redacted tool input (~4 KB), then the last ~2 KB of its output once
|
|
695
|
+
/// the result is back, or the model's text (~8 KB). At most 16,384 characters. Null below detail.
|
|
696
|
+
detail String?
|
|
697
|
+
expiresAt DateTime
|
|
698
|
+
|
|
699
|
+
@@unique([runId, seq])
|
|
700
|
+
@@index([runId, callId])
|
|
701
|
+
@@index([expiresAt])
|
|
702
|
+
}
|
|
703
|
+
|
|
645
704
|
/// Coding-run services (docs/coding-services.md): the catalog a repository's
|
|
646
705
|
/// .wardby/services.yaml names entries from. Admin-managed over MCP
|
|
647
706
|
/// (list/get_service: agents:read; create/update/delete_service:
|
|
@@ -846,6 +905,8 @@ model NativeGatewayCall {
|
|
|
846
905
|
childRunId String?
|
|
847
906
|
/// A delegation's sub-agent, recorded at admission (it holds a place while waiting for budget).
|
|
848
907
|
childAgentId String?
|
|
908
|
+
/// A coding delegation's repository, recorded with childAgentId. Null = the child's default.
|
|
909
|
+
childRepository String?
|
|
849
910
|
createdAt DateTime @default(now())
|
|
850
911
|
updatedAt DateTime @updatedAt
|
|
851
912
|
completedAt DateTime?
|
|
@@ -893,6 +954,15 @@ model CodingProxySession {
|
|
|
893
954
|
dependencyCacheLockHashes String[] @default([])
|
|
894
955
|
/// Set when the run's dependency step is over; after it the cache refuses this session.
|
|
895
956
|
dependencyCacheSealedAt DateTime?
|
|
957
|
+
/// Phase 2 of remote MCP servers: the run's pinned MCP tools (no URLs or secrets), or null.
|
|
958
|
+
mcpTools Json?
|
|
959
|
+
/// SHA-256 (base64url) of the run's MCP token; null when the run has no MCP tools.
|
|
960
|
+
mcpTokenHash String? @unique
|
|
961
|
+
/// The run's Run.runStepsLevel, copied at session creation: the proxy sends a tool result's
|
|
962
|
+
/// output tail to the run-steps listener only at detail. Null on older sessions (= summary).
|
|
963
|
+
runStepsLevel RunStepsLevel?
|
|
964
|
+
/// MCP tools/call count for this run (capped by WARDBY_MCP_MAX_CALLS_PER_RUN).
|
|
965
|
+
mcpCallCount Int @default(0)
|
|
896
966
|
|
|
897
967
|
@@index([deadlineAt])
|
|
898
968
|
}
|
|
@@ -1121,6 +1191,7 @@ model Principal {
|
|
|
1121
1191
|
webhooks Webhook[]
|
|
1122
1192
|
authUser AuthUser?
|
|
1123
1193
|
budgetGroups BudgetGroup[]
|
|
1194
|
+
mcpServers McpServer[]
|
|
1124
1195
|
|
|
1125
1196
|
hostIdentities HostIdentity[]
|
|
1126
1197
|
hostIdentityLinkRequests HostIdentityLinkRequest[]
|
|
@@ -1135,7 +1206,7 @@ model Principal {
|
|
|
1135
1206
|
/// AgentRepository.provider, so a new type or level needs no enum migration.
|
|
1136
1207
|
model ResourceGrant {
|
|
1137
1208
|
id String @id @default(cuid())
|
|
1138
|
-
/// "agent" | "tool" | "budget_group" (later "secret" | "datastore").
|
|
1209
|
+
/// "agent" | "tool" | "budget_group" | "mcp_server" (later "secret" | "datastore").
|
|
1139
1210
|
resourceType String
|
|
1140
1211
|
resourceId String
|
|
1141
1212
|
/// "principal" | "everyone" (later "group").
|
|
@@ -1193,6 +1264,9 @@ model Task {
|
|
|
1193
1264
|
ttlAt DateTime
|
|
1194
1265
|
createdAt DateTime @default(now())
|
|
1195
1266
|
updatedAt DateTime @updatedAt
|
|
1267
|
+
|
|
1268
|
+
/// The run-drivability and cancelled-task lookups: findFirst({ runId, status: "cancelled" }).
|
|
1269
|
+
@@index([runId, status])
|
|
1196
1270
|
}
|
|
1197
1271
|
|
|
1198
1272
|
/// Phase 4: a secret value, encrypted at rest via the SecretCipher seam.
|
|
@@ -1211,6 +1285,10 @@ model Secret {
|
|
|
1211
1285
|
updatedAt DateTime @updatedAt
|
|
1212
1286
|
agents AgentSecret[]
|
|
1213
1287
|
|
|
1288
|
+
hostProviderWebhooks HostProvider[] @relation("HostProviderWebhookSecret")
|
|
1289
|
+
hostProviderPermissions HostProvider[] @relation("HostProviderPermissionSecret")
|
|
1290
|
+
hostProviderCredentials HostProviderCredential[] @relation("HostProviderCredentialSecret")
|
|
1291
|
+
|
|
1214
1292
|
@@unique([ownerId, name])
|
|
1215
1293
|
}
|
|
1216
1294
|
|
|
@@ -1320,7 +1398,7 @@ model AuthUser {
|
|
|
1320
1398
|
displayName String?
|
|
1321
1399
|
status String @default("enabled")
|
|
1322
1400
|
/// wardby roles (src/mcp/auth/resource-server.ts ROLE_PERMISSIONS: admin,
|
|
1323
|
-
/// package-approver, service-manager, model-manager), set with `wardby auth user grant`. Empty = member.
|
|
1401
|
+
/// package-approver, service-manager, model-manager, host-manager), set with `wardby auth user grant`. Empty = member.
|
|
1324
1402
|
/// A privileged operation needs its scope on the token AND a role here
|
|
1325
1403
|
/// that grants it; unknown values grant nothing.
|
|
1326
1404
|
roles String[] @default([])
|
|
@@ -1466,6 +1544,9 @@ model AgentRepository {
|
|
|
1466
1544
|
/// review check passed, CI is green and the merge order check (if any) is
|
|
1467
1545
|
/// success. Default off.
|
|
1468
1546
|
markReadyWhenPassing Boolean @default(false)
|
|
1547
|
+
/// Only on a coding agent's link: the base branch for runs in this repository.
|
|
1548
|
+
/// Null = the coding profile's baseRef.
|
|
1549
|
+
baseRef String?
|
|
1469
1550
|
createdAt DateTime @default(now())
|
|
1470
1551
|
|
|
1471
1552
|
/// How this link was authorized: "host_permission" (the agent owner's
|
|
@@ -1671,6 +1752,48 @@ model AgentIssueProject {
|
|
|
1671
1752
|
@@index([provider, projectKey])
|
|
1672
1753
|
}
|
|
1673
1754
|
|
|
1755
|
+
/// A remote MCP server an owner registered (Streamable HTTP, HTTPS only).
|
|
1756
|
+
model McpServer {
|
|
1757
|
+
id String @id @default(cuid())
|
|
1758
|
+
ownerId String
|
|
1759
|
+
owner Principal @relation(fields: [ownerId], references: [id], onDelete: Cascade)
|
|
1760
|
+
/// Unique per owner; the prefix of the tool names the model sees.
|
|
1761
|
+
name String
|
|
1762
|
+
/// https only; no userinfo, no fragment; the query string is kept.
|
|
1763
|
+
url String
|
|
1764
|
+
/// The owner's brokered secrets sent on every request (each brokered to the URL's host).
|
|
1765
|
+
secretNames String[] @default([])
|
|
1766
|
+
/// Last tools/list result, redacted: [{ name, description, inputSchema, annotations? }].
|
|
1767
|
+
toolSnapshot Json @default("[]")
|
|
1768
|
+
snapshotAt DateTime?
|
|
1769
|
+
/// From initialize: { name?, version?, protocolVersion }.
|
|
1770
|
+
serverInfo Json?
|
|
1771
|
+
createdAt DateTime @default(now())
|
|
1772
|
+
updatedAt DateTime @updatedAt
|
|
1773
|
+
agents AgentMcpServer[]
|
|
1774
|
+
|
|
1775
|
+
@@unique([ownerId, name])
|
|
1776
|
+
@@index([ownerId])
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
/// An MCP server attached to an agent, with the server tools it may call.
|
|
1780
|
+
model AgentMcpServer {
|
|
1781
|
+
agentId String
|
|
1782
|
+
agent Agent @relation(fields: [agentId], references: [id], onDelete: Cascade)
|
|
1783
|
+
serverId String
|
|
1784
|
+
server McpServer @relation(fields: [serverId], references: [id], onDelete: Cascade)
|
|
1785
|
+
/// Exact tool names from the server's saved list. Never empty.
|
|
1786
|
+
allowedTools String[]
|
|
1787
|
+
/// Per call; null = 30000. Capped by WARDBY_TOOL_MAX_TIMEOUT_MS at call time.
|
|
1788
|
+
callTimeoutMs Int?
|
|
1789
|
+
attachedById String
|
|
1790
|
+
createdAt DateTime @default(now())
|
|
1791
|
+
updatedAt DateTime @updatedAt
|
|
1792
|
+
|
|
1793
|
+
@@id([agentId, serverId])
|
|
1794
|
+
@@index([serverId])
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1674
1797
|
/// Dedupe record: an issue wardby created for a fingerprint (several over time — regressions).
|
|
1675
1798
|
model IssueFingerprint {
|
|
1676
1799
|
id String @id @default(cuid())
|
|
@@ -1953,3 +2076,77 @@ model NotificationThread {
|
|
|
1953
2076
|
|
|
1954
2077
|
@@unique([provider, channelId, threadKey])
|
|
1955
2078
|
}
|
|
2079
|
+
|
|
2080
|
+
/// A code host implemented by operator-approved custom tools (docs/host-providers.md).
|
|
2081
|
+
/// `name` is the prefix of its repository ids: `<name>:<workspace>/<repo>`. Holds no secret values.
|
|
2082
|
+
model HostProvider {
|
|
2083
|
+
name String @id
|
|
2084
|
+
contractVersion Int
|
|
2085
|
+
gitHost String
|
|
2086
|
+
apiHosts String[]
|
|
2087
|
+
gitUsername String
|
|
2088
|
+
pullRequestUrlTemplate String
|
|
2089
|
+
/// Where one repository lives on the API, with `{repository}`: a repository-scoped tool's requests stay under it.
|
|
2090
|
+
repositoryApiPath String
|
|
2091
|
+
/// The effective-permission endpoint, with `{workspace}` and `{repo}`. Set with a permission secret.
|
|
2092
|
+
permissionApiPath String?
|
|
2093
|
+
/// How to verify and read a webhook: header names and algorithm, never the secret.
|
|
2094
|
+
webhook Json
|
|
2095
|
+
webhookSecretId String
|
|
2096
|
+
webhookSecret Secret @relation("HostProviderWebhookSecret", fields: [webhookSecretId], references: [id], onDelete: Restrict)
|
|
2097
|
+
/// Set: ask the host who has access. Unset: trustedAccounts decides.
|
|
2098
|
+
permissionSecretId String?
|
|
2099
|
+
permissionSecret Secret? @relation("HostProviderPermissionSecret", fields: [permissionSecretId], references: [id], onDelete: Restrict)
|
|
2100
|
+
createdById String
|
|
2101
|
+
createdAt DateTime @default(now())
|
|
2102
|
+
updatedAt DateTime @updatedAt
|
|
2103
|
+
|
|
2104
|
+
operations HostProviderOperation[]
|
|
2105
|
+
credentials HostProviderCredential[]
|
|
2106
|
+
trustedAccounts HostProviderTrustedAccount[]
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
/// One approved snapshot: the code Wardby runs. `update_tool` changes nothing here until approved again.
|
|
2110
|
+
model HostProviderOperation {
|
|
2111
|
+
provider String
|
|
2112
|
+
operation String
|
|
2113
|
+
/// The tool it was copied from. Null once that tool is deleted; the snapshot keeps working.
|
|
2114
|
+
toolId String?
|
|
2115
|
+
code String
|
|
2116
|
+
paramsZod String
|
|
2117
|
+
/// The tool's timeoutMs when it was approved; null = the default limit.
|
|
2118
|
+
timeoutMs Int?
|
|
2119
|
+
approvedById String
|
|
2120
|
+
approvedAt DateTime @default(now())
|
|
2121
|
+
|
|
2122
|
+
hostProvider HostProvider @relation(fields: [provider], references: [name], onDelete: Cascade)
|
|
2123
|
+
tool Tool? @relation(fields: [toolId], references: [id], onDelete: SetNull)
|
|
2124
|
+
|
|
2125
|
+
@@id([provider, operation])
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
/// Which brokered secret serves which repositories. `credentialKind` is `static` only in v1.
|
|
2129
|
+
model HostProviderCredential {
|
|
2130
|
+
id String @id @default(cuid())
|
|
2131
|
+
provider String
|
|
2132
|
+
repositoryPattern String
|
|
2133
|
+
secretId String
|
|
2134
|
+
credentialKind String @default("static")
|
|
2135
|
+
|
|
2136
|
+
hostProvider HostProvider @relation(fields: [provider], references: [name], onDelete: Cascade)
|
|
2137
|
+
secret Secret @relation("HostProviderCredentialSecret", fields: [secretId], references: [id], onDelete: Restrict)
|
|
2138
|
+
|
|
2139
|
+
@@unique([provider, repositoryPattern])
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
/// Host accounts allowed to start runs when the provider has no permission secret.
|
|
2143
|
+
model HostProviderTrustedAccount {
|
|
2144
|
+
provider String
|
|
2145
|
+
accountId String
|
|
2146
|
+
addedById String
|
|
2147
|
+
addedAt DateTime @default(now())
|
|
2148
|
+
|
|
2149
|
+
hostProvider HostProvider @relation(fields: [provider], references: [name], onDelete: Cascade)
|
|
2150
|
+
|
|
2151
|
+
@@id([provider, accountId])
|
|
2152
|
+
}
|