@wardby/cli 0.2.1 → 0.4.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 +53 -4
- package/README.md +52 -13
- package/dist/claude-coding-worker/driver.d.ts +6 -1
- package/dist/claude-coding-worker/driver.js +27 -1
- package/dist/claude-coding-worker/main.js +2 -0
- package/dist/claude-coding-worker/tool-socket.d.ts +9 -0
- package/dist/claude-coding-worker/tool-socket.js +26 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +14 -4
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +284 -36
- package/dist/coding/base-commit.d.ts +6 -0
- package/dist/coding/base-commit.js +12 -0
- package/dist/coding/collect-exclude.d.ts +25 -0
- package/dist/coding/collect-exclude.js +76 -0
- package/dist/coding/profile.d.ts +67 -22
- package/dist/coding/profile.js +58 -25
- package/dist/coding/protected-path-wording.d.ts +24 -0
- package/dist/coding/protected-path-wording.js +55 -0
- package/dist/coding/protected-paths.d.ts +31 -0
- package/dist/coding/protected-paths.js +48 -0
- package/dist/coding/protocol.d.ts +91 -4
- package/dist/coding/protocol.js +123 -12
- package/dist/coding/provider.d.ts +6 -1
- package/dist/coding/provider.js +16 -9
- package/dist/coding/registry/adapters.d.ts +2 -0
- package/dist/coding/registry/adapters.js +9 -0
- package/dist/coding/registry/allowlist.d.ts +9 -0
- package/dist/coding/registry/allowlist.js +28 -0
- package/dist/coding/registry/json-scan.d.ts +55 -0
- package/dist/coding/registry/json-scan.js +191 -0
- package/dist/coding/registry/lockfiles.d.ts +6 -0
- package/dist/coding/registry/lockfiles.js +89 -0
- package/dist/coding/registry/npm-lockfile.d.ts +9 -0
- package/dist/coding/registry/npm-lockfile.js +73 -0
- package/dist/coding/registry/npm-plan.d.ts +29 -0
- package/dist/coding/registry/npm-plan.js +289 -0
- package/dist/coding/registry/npm.d.ts +7 -0
- package/dist/coding/registry/npm.js +252 -0
- package/dist/coding/registry/pypi.d.ts +4 -0
- package/dist/coding/registry/pypi.js +210 -0
- package/dist/coding/registry/report.d.ts +37 -0
- package/dist/coding/registry/report.js +31 -0
- package/dist/coding/registry/token.d.ts +4 -0
- package/dist/coding/registry/token.js +7 -0
- package/dist/coding/registry/types.d.ts +286 -0
- package/dist/coding/registry/types.js +19 -0
- package/dist/coding/registry/worker-config.d.ts +14 -0
- package/dist/coding/registry/worker-config.js +31 -0
- package/dist/coding/services/builtins.d.ts +22 -0
- package/dist/coding/services/builtins.js +85 -0
- package/dist/coding/services/catalog.d.ts +443 -0
- package/dist/coding/services/catalog.js +159 -0
- package/dist/coding/services/declaration.d.ts +11 -0
- package/dist/coding/services/declaration.js +114 -0
- package/dist/coding/services/note.d.ts +8 -0
- package/dist/coding/services/note.js +15 -0
- package/dist/coding/services/resolve.d.ts +25 -0
- package/dist/coding/services/resolve.js +50 -0
- package/dist/coding/services/wording.d.ts +25 -0
- package/dist/coding/services/wording.js +70 -0
- package/dist/coding-proxy/main.js +24 -4
- package/dist/coding-worker/artifact.d.ts +6 -0
- package/dist/coding-worker/debug-trace.d.ts +37 -0
- package/dist/coding-worker/debug-trace.js +117 -0
- package/dist/coding-worker/driver.d.ts +13 -1
- package/dist/coding-worker/driver.js +102 -13
- package/dist/coding-worker/errors.js +8 -0
- package/dist/coding-worker/main.js +10 -2
- package/dist/coding-worker/sdk.d.ts +2 -2
- package/dist/coding-worker/sdk.js +7 -2
- package/dist/coding-worker/types.d.ts +3 -0
- package/dist/config/providers.d.ts +66 -0
- package/dist/config/providers.js +137 -0
- package/dist/core/attribution.d.ts +101 -0
- package/dist/core/attribution.js +208 -0
- package/dist/core/budget-groups.d.ts +120 -10
- package/dist/core/budget-groups.js +133 -24
- package/dist/core/budget-wording.d.ts +22 -0
- package/dist/core/budget-wording.js +55 -0
- package/dist/core/coding-queue.d.ts +3 -0
- package/dist/core/coding-queue.js +6 -2
- package/dist/core/coding-service-status.d.ts +11 -0
- package/dist/core/coding-service-status.js +17 -0
- package/dist/core/cost-report.d.ts +88 -0
- package/dist/core/cost-report.js +248 -0
- package/dist/core/datastores.js +18 -2
- package/dist/core/db.d.ts +5 -1
- package/dist/core/db.js +8 -2
- package/dist/core/dispatch.d.ts +74 -7
- package/dist/core/dispatch.js +382 -47
- package/dist/core/engine-native.js +44 -14
- package/dist/core/glob.d.ts +10 -0
- package/dist/core/glob.js +33 -0
- package/dist/core/grants.d.ts +86 -0
- package/dist/core/grants.js +126 -0
- package/dist/core/host-events.d.ts +72 -0
- package/dist/core/host-events.js +597 -0
- package/dist/core/host-identity-links.d.ts +54 -0
- package/dist/core/host-identity-links.js +189 -0
- package/dist/core/host-status.d.ts +78 -0
- package/dist/core/host-status.js +228 -0
- package/dist/core/in-flight-runs.d.ts +8 -0
- package/dist/core/in-flight-runs.js +56 -0
- package/dist/core/issue-bridge.d.ts +60 -0
- package/dist/core/issue-bridge.js +189 -0
- package/dist/core/issue-dedupe.d.ts +70 -0
- package/dist/core/issue-dedupe.js +255 -0
- package/dist/core/issue-events.d.ts +42 -0
- package/dist/core/issue-events.js +155 -0
- package/dist/core/issue-status.d.ts +29 -0
- package/dist/core/issue-status.js +241 -0
- package/dist/core/issue-tracker-tools.d.ts +64 -0
- package/dist/core/issue-tracker-tools.js +850 -0
- package/dist/core/model-usage.d.ts +10 -0
- package/dist/core/model-usage.js +24 -0
- package/dist/core/provider-wording.d.ts +12 -0
- package/dist/core/provider-wording.js +44 -0
- package/dist/core/reconciler.d.ts +42 -2
- package/dist/core/reconciler.js +97 -2
- package/dist/core/repo-access.d.ts +99 -0
- package/dist/core/repo-access.js +136 -0
- package/dist/core/review-host-checks.d.ts +11 -0
- package/dist/core/review-host-checks.js +41 -0
- package/dist/core/review-host-tools.d.ts +47 -0
- package/dist/core/review-host-tools.js +354 -0
- package/dist/core/run-heartbeat.d.ts +27 -0
- package/dist/core/run-heartbeat.js +54 -0
- package/dist/core/run-pricing.d.ts +61 -0
- package/dist/core/run-pricing.js +56 -0
- package/dist/core/runner.d.ts +33 -8
- package/dist/core/runner.js +410 -62
- package/dist/core/scheduler.d.ts +4 -1
- package/dist/core/scheduler.js +3 -2
- package/dist/core/secrets.d.ts +11 -2
- package/dist/core/secrets.js +25 -6
- package/dist/core/self-defects.d.ts +80 -0
- package/dist/core/self-defects.js +180 -0
- package/dist/core/subagent-memory-tools.d.ts +1 -1
- package/dist/core/subagent-memory-tools.js +16 -3
- package/dist/core/tool-admin.d.ts +81 -0
- package/dist/core/tool-admin.js +129 -0
- package/dist/core/tool-names.d.ts +42 -0
- package/dist/core/tool-names.js +67 -0
- package/dist/core/untrusted-content.d.ts +32 -0
- package/dist/core/untrusted-content.js +72 -0
- package/dist/core/webhooks.d.ts +17 -2
- package/dist/core/webhooks.js +42 -3
- package/dist/generated/prisma/browser.d.ts +166 -0
- package/dist/generated/prisma/client.d.ts +166 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +152 -52
- package/dist/generated/prisma/enums.d.ts +13 -0
- package/dist/generated/prisma/enums.js +12 -1
- package/dist/generated/prisma/internal/class.d.ts +242 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +2571 -577
- package/dist/generated/prisma/internal/prismaNamespace.js +312 -6
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +328 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +312 -6
- package/dist/generated/prisma/models/Agent.d.ts +682 -1
- package/dist/generated/prisma/models/AgentIssueProject.d.ts +1838 -0
- package/dist/generated/prisma/models/AgentIssueProject.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
- package/dist/generated/prisma/models/AgentRepository.js +1 -0
- package/dist/generated/prisma/models/AgentTool.d.ts +95 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +56 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +258 -7
- package/dist/generated/prisma/models/CodingProxySession.d.ts +195 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +1405 -95
- package/dist/generated/prisma/models/CodingRunServiceStatus.d.ts +1404 -0
- package/dist/generated/prisma/models/CodingRunServiceStatus.js +1 -0
- package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
- package/dist/generated/prisma/models/CodingService.js +1 -0
- package/dist/generated/prisma/models/HostEventDelivery.d.ts +946 -0
- package/dist/generated/prisma/models/HostEventDelivery.js +1 -0
- package/dist/generated/prisma/models/HostIdentity.d.ts +1232 -0
- package/dist/generated/prisma/models/HostIdentity.js +1 -0
- package/dist/generated/prisma/models/HostIdentityLinkRequest.d.ts +1473 -0
- package/dist/generated/prisma/models/HostIdentityLinkRequest.js +1 -0
- package/dist/generated/prisma/models/IssueFingerprint.d.ts +1183 -0
- package/dist/generated/prisma/models/IssueFingerprint.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +1255 -0
- package/dist/generated/prisma/models/IssuePullRequest.js +1 -0
- package/dist/generated/prisma/models/ModelCatalogEntry.d.ts +1322 -0
- package/dist/generated/prisma/models/ModelCatalogEntry.js +1 -0
- package/dist/generated/prisma/models/Principal.d.ts +455 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +1148 -0
- package/dist/generated/prisma/models/RegistryAllowance.js +1 -0
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +1219 -0
- package/dist/generated/prisma/models/RegistryApprovedVersion.js +1 -0
- package/dist/generated/prisma/models/RegistryFetch.d.ts +1428 -0
- package/dist/generated/prisma/models/RegistryFetch.js +1 -0
- package/dist/generated/prisma/models/RegistryPlanRefusal.d.ts +1294 -0
- package/dist/generated/prisma/models/RegistryPlanRefusal.js +1 -0
- package/dist/generated/prisma/models/RegistryVersionFact.d.ts +1085 -0
- package/dist/generated/prisma/models/RegistryVersionFact.js +1 -0
- package/dist/generated/prisma/models/ResourceGrant.d.ts +1437 -0
- package/dist/generated/prisma/models/ResourceGrant.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +1402 -82
- package/dist/generated/prisma/models/RunAttribution.d.ts +1259 -0
- package/dist/generated/prisma/models/RunAttribution.js +1 -0
- package/dist/generated/prisma/models/RunHostCheck.d.ts +1239 -0
- package/dist/generated/prisma/models/RunHostCheck.js +1 -0
- package/dist/generated/prisma/models/RunHostStatus.d.ts +1315 -0
- package/dist/generated/prisma/models/RunHostStatus.js +1 -0
- package/dist/generated/prisma/models/RunIssueStatus.d.ts +1199 -0
- package/dist/generated/prisma/models/RunIssueStatus.js +1 -0
- package/dist/generated/prisma/models/RunModelUsage.d.ts +1316 -0
- package/dist/generated/prisma/models/RunModelUsage.js +1 -0
- package/dist/generated/prisma/models/Tool.d.ts +15 -3
- package/dist/generated/prisma/models/WorkItem.d.ts +1408 -0
- package/dist/generated/prisma/models/WorkItem.js +1 -0
- package/dist/generated/prisma/models.d.ts +22 -0
- package/dist/help/build.d.ts +1 -0
- package/dist/help/build.js +9 -0
- package/dist/help/catalog.d.ts +24 -0
- package/dist/help/catalog.js +160 -0
- package/dist/help/cli.d.ts +2 -0
- package/dist/help/cli.js +65 -0
- package/dist/help/runtime.d.ts +3 -0
- package/dist/help/runtime.js +44 -0
- package/dist/help/search.d.ts +9 -0
- package/dist/help/search.js +104 -0
- package/dist/help-index.json +999 -0
- package/dist/import/cli-args.js +3 -2
- package/dist/import/create.d.ts +5 -0
- package/dist/import/create.js +67 -13
- package/dist/import/index.js +19 -9
- package/dist/import/neutral-schema.d.ts +18 -18
- package/dist/knowledge/check.d.ts +13 -0
- package/dist/knowledge/check.js +69 -0
- package/dist/knowledge/cli.d.ts +14 -0
- package/dist/knowledge/cli.js +67 -0
- package/dist/knowledge/concept.d.ts +54 -0
- package/dist/knowledge/concept.js +78 -0
- package/dist/knowledge/note.d.ts +11 -0
- package/dist/knowledge/note.js +39 -0
- package/dist/knowledge/relevance.d.ts +11 -0
- package/dist/knowledge/relevance.js +14 -0
- package/dist/knowledge/span-hash.d.ts +3 -0
- package/dist/knowledge/span-hash.js +16 -0
- package/dist/mcp/auth/access.d.ts +72 -0
- package/dist/mcp/auth/access.js +58 -0
- package/dist/mcp/auth/grants-cli.d.ts +149 -0
- package/dist/mcp/auth/grants-cli.js +518 -0
- package/dist/mcp/auth/host-account-cli.d.ts +2 -0
- package/dist/mcp/auth/host-account-cli.js +47 -0
- package/dist/mcp/auth/ownership.d.ts +25 -51
- package/dist/mcp/auth/ownership.js +19 -14
- package/dist/mcp/auth/repo-authorization.d.ts +22 -0
- package/dist/mcp/auth/repo-authorization.js +51 -0
- package/dist/mcp/auth/resource-server.d.ts +33 -2
- package/dist/mcp/auth/resource-server.js +99 -3
- package/dist/mcp/auth/self-hosted/browser.js +2 -2
- package/dist/mcp/auth/self-hosted/cli.js +47 -13
- package/dist/mcp/auth/self-hosted/credentials.d.ts +23 -5
- package/dist/mcp/auth/self-hosted/credentials.js +62 -4
- package/dist/mcp/auth/self-hosted/session.d.ts +7 -6
- package/dist/mcp/context.d.ts +30 -1
- package/dist/mcp/errors.d.ts +25 -6
- package/dist/mcp/errors.js +98 -0
- package/dist/mcp/host-events/deliveries.d.ts +9 -0
- package/dist/mcp/host-events/deliveries.js +17 -0
- package/dist/mcp/host-events/github-ingress.d.ts +38 -0
- package/dist/mcp/host-events/github-ingress.js +83 -0
- package/dist/mcp/host-events/github-user-callback.d.ts +18 -0
- package/dist/mcp/host-events/github-user-callback.js +50 -0
- package/dist/mcp/host-events/jira-ingress.d.ts +29 -0
- package/dist/mcp/host-events/jira-ingress.js +92 -0
- package/dist/mcp/index.d.ts +10 -1
- package/dist/mcp/index.js +187 -19
- package/dist/mcp/server.js +32 -11
- package/dist/mcp/tools/agents.js +519 -50
- package/dist/mcp/tools/budget-groups.js +3 -3
- package/dist/mcp/tools/cost-report.d.ts +8 -0
- package/dist/mcp/tools/cost-report.js +60 -0
- package/dist/mcp/tools/datastore.js +22 -15
- package/dist/mcp/tools/grants.d.ts +2 -0
- package/dist/mcp/tools/grants.js +239 -0
- package/dist/mcp/tools/help.d.ts +5 -0
- package/dist/mcp/tools/help.js +67 -0
- package/dist/mcp/tools/host-accounts.d.ts +2 -0
- package/dist/mcp/tools/host-accounts.js +114 -0
- package/dist/mcp/tools/issue-projects.d.ts +2 -0
- package/dist/mcp/tools/issue-projects.js +238 -0
- package/dist/mcp/tools/memory.d.ts +7 -1
- package/dist/mcp/tools/memory.js +5 -5
- package/dist/mcp/tools/model-catalog.d.ts +22 -0
- package/dist/mcp/tools/model-catalog.js +423 -0
- package/dist/mcp/tools/repositories.d.ts +2 -0
- package/dist/mcp/tools/repositories.js +182 -0
- package/dist/mcp/tools/runs.d.ts +6 -0
- package/dist/mcp/tools/runs.js +60 -6
- package/dist/mcp/tools/scheduling.js +3 -6
- package/dist/mcp/tools/secrets.js +18 -6
- package/dist/mcp/tools/services.d.ts +2 -0
- package/dist/mcp/tools/services.js +222 -0
- package/dist/mcp/tools/subagents.js +52 -16
- package/dist/mcp/tools/tools.d.ts +41 -0
- package/dist/mcp/tools/tools.js +201 -40
- package/dist/mcp/tools/trigger.js +65 -7
- package/dist/mcp/tools/webhooks.js +15 -4
- package/dist/mcp/transport/streamable-http.d.ts +15 -0
- package/dist/mcp/transport/streamable-http.js +55 -3
- package/dist/mcp/webhooks/ingress.d.ts +2 -1
- package/dist/mcp/webhooks/ingress.js +9 -2
- package/dist/providers/auth/delegating.d.ts +19 -0
- package/dist/providers/auth/delegating.js +71 -0
- package/dist/providers/auth/index.d.ts +2 -0
- package/dist/providers/auth/index.js +11 -0
- package/dist/providers/auth/self-hosted.d.ts +10 -2
- package/dist/providers/auth/self-hosted.js +55 -6
- package/dist/providers/auth/types.d.ts +6 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +4 -1
- package/dist/providers/coding-proxy/memory-ledger.js +31 -3
- package/dist/providers/coding-proxy/metering.d.ts +6 -1
- package/dist/providers/coding-proxy/metering.js +41 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +17 -0
- package/dist/providers/coding-proxy/prisma-ledger.js +106 -8
- package/dist/providers/coding-proxy/proxy.d.ts +25 -2
- package/dist/providers/coding-proxy/proxy.js +561 -38
- package/dist/providers/coding-proxy/registry/audit.d.ts +131 -0
- package/dist/providers/coding-proxy/registry/audit.js +380 -0
- package/dist/providers/coding-proxy/registry/bounded-fetch.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/bounded-fetch.js +77 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +58 -0
- package/dist/providers/coding-proxy/registry/plan.js +304 -0
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +34 -0
- package/dist/providers/coding-proxy/registry/prisma-store.js +151 -0
- package/dist/providers/coding-proxy/registry/service.d.ts +213 -0
- package/dist/providers/coding-proxy/registry/service.js +1137 -0
- package/dist/providers/coding-proxy/registry/store.d.ts +127 -0
- package/dist/providers/coding-proxy/registry/store.js +70 -0
- package/dist/providers/coding-proxy/runtime.d.ts +17 -0
- package/dist/providers/coding-proxy/runtime.js +63 -0
- package/dist/providers/coding-proxy/secure-fetch.js +0 -1
- package/dist/providers/coding-proxy/server.d.ts +11 -0
- package/dist/providers/coding-proxy/server.js +163 -0
- package/dist/providers/coding-proxy/types.d.ts +33 -1
- package/dist/providers/coding-proxy/types.js +12 -1
- package/dist/providers/engine/types.d.ts +29 -0
- package/dist/providers/executor/build.d.ts +2 -2
- package/dist/providers/executor/composition.d.ts +3 -0
- package/dist/providers/executor/composition.js +28 -1
- package/dist/providers/executor/container.d.ts +134 -4
- package/dist/providers/executor/container.js +394 -37
- package/dist/providers/executor/dbos.d.ts +4 -3
- package/dist/providers/executor/dbos.js +7 -5
- package/dist/providers/executor/in-process.d.ts +2 -3
- package/dist/providers/executor/routing.d.ts +13 -0
- package/dist/providers/executor/routing.js +18 -0
- package/dist/providers/executor/types.d.ts +34 -0
- package/dist/providers/issue-tracker/adf.d.ts +31 -0
- package/dist/providers/issue-tracker/adf.js +181 -0
- package/dist/providers/issue-tracker/index.d.ts +5 -0
- package/dist/providers/issue-tracker/index.js +12 -0
- package/dist/providers/issue-tracker/jira-client.d.ts +41 -0
- package/dist/providers/issue-tracker/jira-client.js +151 -0
- package/dist/providers/issue-tracker/jira-events.d.ts +3 -0
- package/dist/providers/issue-tracker/jira-events.js +98 -0
- package/dist/providers/issue-tracker/jira.d.ts +116 -0
- package/dist/providers/issue-tracker/jira.js +502 -0
- package/dist/providers/issue-tracker/types.d.ts +269 -0
- package/dist/providers/issue-tracker/types.js +16 -0
- package/dist/providers/jobs/claude-tool-setup.d.ts +23 -0
- package/dist/providers/jobs/claude-tool-setup.js +50 -0
- package/dist/providers/jobs/collect-prune.d.ts +7 -0
- package/dist/providers/jobs/collect-prune.js +27 -0
- package/dist/providers/jobs/docker-isolation.d.ts +48 -3
- package/dist/providers/jobs/docker-isolation.js +213 -22
- package/dist/providers/jobs/docker-services.d.ts +35 -0
- package/dist/providers/jobs/docker-services.js +191 -0
- package/dist/providers/jobs/docker.d.ts +53 -2
- package/dist/providers/jobs/docker.js +307 -32
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +1 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +12 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +17 -2
- package/dist/providers/jobs/kubernetes-isolation.js +238 -57
- package/dist/providers/jobs/kubernetes-platform.d.ts +10 -4
- package/dist/providers/jobs/kubernetes-platform.js +11 -5
- package/dist/providers/jobs/kubernetes-preflight.js +3 -0
- package/dist/providers/jobs/kubernetes.d.ts +24 -2
- package/dist/providers/jobs/kubernetes.js +153 -22
- package/dist/providers/jobs/service-state.d.ts +22 -0
- package/dist/providers/jobs/service-state.js +17 -0
- package/dist/providers/jobs/types.d.ts +18 -0
- package/dist/providers/llm/anthropic.d.ts +3 -3
- package/dist/providers/llm/anthropic.js +3 -5
- package/dist/providers/llm/bedrock.d.ts +3 -3
- package/dist/providers/llm/bedrock.js +3 -8
- package/dist/providers/llm/catalog-lookup.d.ts +10 -0
- package/dist/providers/llm/catalog-lookup.js +15 -0
- package/dist/providers/llm/catalog-shipped.d.ts +18 -0
- package/dist/providers/llm/catalog-shipped.js +197 -0
- package/dist/providers/llm/catalog-store.d.ts +58 -0
- package/dist/providers/llm/catalog-store.js +138 -0
- package/dist/providers/llm/catalog-types.d.ts +66 -0
- package/dist/providers/llm/catalog-types.js +64 -0
- package/dist/providers/llm/catalog.d.ts +61 -0
- package/dist/providers/llm/catalog.js +147 -0
- package/dist/providers/llm/claude-messages.d.ts +5 -1
- package/dist/providers/llm/claude-messages.js +1 -0
- package/dist/providers/llm/claude-provider.d.ts +10 -12
- package/dist/providers/llm/claude-provider.js +15 -6
- package/dist/providers/llm/index.d.ts +9 -6
- package/dist/providers/llm/index.js +8 -5
- package/dist/providers/llm/openai.d.ts +14 -5
- package/dist/providers/llm/openai.js +24 -14
- package/dist/providers/llm/pricing-core.d.ts +5 -3
- package/dist/providers/llm/registration.js +8 -12
- package/dist/providers/llm/routing.d.ts +21 -11
- package/dist/providers/llm/routing.js +47 -13
- package/dist/providers/llm/types.d.ts +12 -0
- package/dist/providers/llm/types.js +8 -1
- package/dist/providers/review-host/diff-lines.d.ts +16 -0
- package/dist/providers/review-host/diff-lines.js +59 -0
- package/dist/providers/review-host/github-events.d.ts +6 -0
- package/dist/providers/review-host/github-events.js +226 -0
- package/dist/providers/review-host/github-user-auth.d.ts +38 -0
- package/dist/providers/review-host/github-user-auth.js +128 -0
- package/dist/providers/review-host/github.d.ts +57 -0
- package/dist/providers/review-host/github.js +568 -0
- package/dist/providers/review-host/index.d.ts +12 -0
- package/dist/providers/review-host/index.js +30 -0
- package/dist/providers/review-host/review-format.d.ts +19 -0
- package/dist/providers/review-host/review-format.js +59 -0
- package/dist/providers/review-host/types.d.ts +309 -0
- package/dist/providers/review-host/types.js +24 -0
- package/dist/providers/vcs/git.d.ts +16 -6
- package/dist/providers/vcs/git.js +78 -34
- package/dist/providers/vcs/github.d.ts +94 -3
- package/dist/providers/vcs/github.js +223 -17
- package/dist/providers/vcs/types.d.ts +48 -4
- package/dist/quickstart/index.d.ts +2 -0
- package/dist/quickstart/index.js +36 -8
- package/dist/sandbox/fetch-policy.d.ts +20 -2
- package/dist/sandbox/fetch-policy.js +64 -3
- package/dist/sandbox/host-functions.d.ts +9 -1
- package/dist/sandbox/host-functions.js +12 -5
- package/dist/serve.js +8 -2
- package/dist/viewer/api-schema.d.ts +2757 -0
- package/dist/viewer/api-schema.js +165 -0
- package/dist/viewer/build-schemas.d.ts +2 -0
- package/dist/viewer/build-schemas.js +18 -0
- package/dist/viewer/event-bus.d.ts +38 -0
- package/dist/viewer/event-bus.js +232 -0
- package/dist/viewer/graph.d.ts +40 -0
- package/dist/viewer/graph.js +243 -0
- package/dist/viewer/http.d.ts +30 -0
- package/dist/viewer/http.js +133 -0
- package/dist/viewer/run-detail.d.ts +4 -0
- package/dist/viewer/run-detail.js +61 -0
- package/dist/wardby-bin.js +11 -0
- package/docs/README.md +40 -0
- package/docs/agent-recipes.md +383 -0
- package/docs/architecture-runtime.md +90 -0
- package/docs/assets/brand/wardby-icon-512.png +0 -0
- package/docs/assets/brand/wardby-icon.svg +16 -0
- package/docs/assets/brand/wardby-mascot-profile-512.png +0 -0
- package/docs/assets/brand/wardby-mascot.png +0 -0
- package/docs/assets/brand/wardby-mascot.svg +5 -0
- package/docs/assets/wardby-workflow.svg +106 -0
- package/docs/code-review-agents.md +508 -0
- package/docs/coding-agent-setup.md +175 -0
- package/docs/coding-packages.md +455 -0
- package/docs/coding-services.md +300 -0
- package/docs/coding-worker-byo-images.md +98 -0
- package/docs/coding-worker-isolation.md +1068 -0
- package/docs/getting-started-gke.md +632 -0
- package/docs/getting-started-identity-provider.md +319 -0
- package/docs/getting-started.md +147 -0
- package/docs/jira-agents.md +649 -0
- package/docs/knowledge.md +387 -0
- package/docs/models.md +221 -0
- package/docs/observability.md +53 -0
- package/docs/release-verification.md +66 -0
- package/docs/security-deployment.md +667 -0
- package/docs/viewer-api.md +142 -0
- package/help/admin-viewer.md +39 -0
- package/help/agent-recipes.md +173 -0
- package/help/architecture-agent.md +189 -0
- package/help/builder-agent.md +80 -0
- package/help/code-review-agents.md +37 -0
- package/help/coding-packages.md +31 -0
- package/help/coding-services.md +71 -0
- package/help/cost-attribution.md +67 -0
- package/help/creating-agents.md +90 -0
- package/help/deploy-gke.md +45 -0
- package/help/deployment-targets.md +39 -0
- package/help/errors/budget-group-exhausted.md +25 -0
- package/help/errors/docker-isolation-unsupported.md +26 -0
- package/help/errors/model-unavailable.md +63 -0
- package/help/errors/protected-path.md +45 -0
- package/help/errors/repo-access.md +27 -0
- package/help/errors/service-declaration-invalid.md +27 -0
- package/help/errors/service-declaration-unavailable.md +25 -0
- package/help/errors/service-launcher-unsupported.md +30 -0
- package/help/errors/service-not-allowed.md +27 -0
- package/help/errors/service-unknown.md +23 -0
- package/help/errors/service-unready.md +49 -0
- package/help/getting-started.md +32 -0
- package/help/github.md +48 -0
- package/help/identity-and-access.md +44 -0
- package/help/jira.md +135 -0
- package/help/knowledge.md +47 -0
- package/help/mcp.md +30 -0
- package/help/models.md +90 -0
- package/help/native-capabilities.md +30 -0
- package/help/observability.md +41 -0
- package/help/operating-agents.md +36 -0
- package/help/security.md +27 -0
- package/help/troubleshooting/budgets.md +32 -0
- package/help/troubleshooting/coding-workers.md +47 -0
- package/help/troubleshooting/repository-access.md +27 -0
- package/package.json +14 -3
- package/prisma/migrations/20260925010000_coding_collect_exclude/migration.sql +8 -0
- package/prisma/migrations/20260925015000_allowed_egress_default/migration.sql +8 -0
- package/prisma/migrations/20260925020000_coding_package_registry/migration.sql +55 -0
- package/prisma/migrations/20260925030000_tool_name_per_owner/migration.sql +11 -0
- package/prisma/migrations/20260926010000_run_trigger_host_event/migration.sql +7 -0
- package/prisma/migrations/20260926020000_code_review_hosts/migration.sql +53 -0
- package/prisma/migrations/20260926030000_auth_user_roles/migration.sql +9 -0
- package/prisma/migrations/20260926040000_agent_effort/migration.sql +6 -0
- package/prisma/migrations/20260926050000_registry_lockfile_plan/migration.sql +32 -0
- package/prisma/migrations/20260926050000_repo_access_authorization/migration.sql +82 -0
- package/prisma/migrations/20260926060000_registry_plan_refusal/migration.sql +19 -0
- package/prisma/migrations/20260926100000_registry_plan_refusal_published_at/migration.sql +5 -0
- package/prisma/migrations/20260926190000_run_host_status/migration.sql +18 -0
- package/prisma/migrations/20260926210000_run_host_status_at_dispatch/migration.sql +5 -0
- package/prisma/migrations/20260927010000_resource_grants/migration.sql +72 -0
- package/prisma/migrations/20260927020000_proxy_session_budget_exhausted/migration.sql +3 -0
- package/prisma/migrations/20260927030000_coding_debug_trace/migration.sql +4 -0
- package/prisma/migrations/20260927040000_proxy_session_upstream_failure/migration.sql +3 -0
- package/prisma/migrations/20260927050000_coding_run_services/migration.sql +74 -0
- package/prisma/migrations/20260928000000_coding_run_tool_image/migration.sql +5 -0
- package/prisma/migrations/20260930000000_jira_issue_projects/migration.sql +34 -0
- package/prisma/migrations/20261001000000_jira_phase2_allowlists/migration.sql +3 -0
- package/prisma/migrations/20261001010000_jira_link_types_allowlist/migration.sql +2 -0
- package/prisma/migrations/20261002000000_jira_coding_bridge/migration.sql +28 -0
- package/prisma/migrations/20261002010000_jira_issue_creation/migration.sql +25 -0
- package/prisma/migrations/20261003000000_issue_cost_attribution/migration.sql +56 -0
- package/prisma/migrations/20261003010000_coding_run_service_status/migration.sql +23 -0
- package/prisma/migrations/20261003020000_viewer_notify/migration.sql +54 -0
- package/prisma/migrations/20261003030000_viewer_notify_fixes/migration.sql +47 -0
- package/prisma/migrations/20261003040000_viewer_indexes/migration.sql +12 -0
- package/prisma/migrations/20261004000000_model_catalog/migration.sql +26 -0
- package/prisma/schema.prisma +663 -21
- package/dist/mcp/tools/models.d.ts +0 -8
- package/dist/mcp/tools/models.js +0 -15
- package/dist/providers/llm/pricing-anthropic.d.ts +0 -4
- package/dist/providers/llm/pricing-anthropic.js +0 -30
- package/dist/providers/llm/pricing-bedrock-claude.d.ts +0 -12
- package/dist/providers/llm/pricing-bedrock-claude.js +0 -37
- package/dist/providers/llm/pricing.d.ts +0 -30
- package/dist/providers/llm/pricing.js +0 -74
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentIssueProject CRUD — which Jira projects a native agent may act on,
|
|
3
|
+
* and which issue events trigger it. Linking is admin-approved: wardby cannot
|
|
4
|
+
* verify an agent owner's own Jira access (the integration is one service
|
|
5
|
+
* account, no per-user OAuth), so link/unlink need agents:admin with the
|
|
6
|
+
* admin role, and the approver is stamped on the link. Triggers that carry
|
|
7
|
+
* text from a person (mention/assigned) are gated by trustedAccountIds.
|
|
8
|
+
* See docs/private/2026-09-30-jira-issue-tracker-design.md.
|
|
9
|
+
*/
|
|
10
|
+
import { requireAgentAccess } from "../auth/access.js";
|
|
11
|
+
import { requireScope } from "../auth/resource-server.js";
|
|
12
|
+
import { McpError } from "../errors.js";
|
|
13
|
+
import { ISSUE_TRACKER_PROVIDERS, PROJECT_KEY } from "../../providers/issue-tracker/types.js";
|
|
14
|
+
import { textResult } from "./text-result.js";
|
|
15
|
+
const PROVIDERS = [...ISSUE_TRACKER_PROVIDERS];
|
|
16
|
+
const TRIGGERS = ["created", "transitioned", "labeled", "assigned", "mention"];
|
|
17
|
+
const ACCOUNT_ID = /^[A-Za-z0-9:_-]{1,128}$/;
|
|
18
|
+
const WRITABLE_FIELD = /^(labels|components|priority|customfield_\d{1,10})$/;
|
|
19
|
+
/** Trimmed names, 1-100 characters each, de-duplicated case-insensitively (first spelling kept). */
|
|
20
|
+
function nameList(field, raw) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const names = [];
|
|
23
|
+
for (const entry of raw ?? []) {
|
|
24
|
+
const name = entry.trim();
|
|
25
|
+
if (name.length === 0 || name.length > 100)
|
|
26
|
+
throw new McpError(400, `invalid ${field} entry (1-100 characters)`);
|
|
27
|
+
if (!seen.has(name.toLowerCase())) {
|
|
28
|
+
seen.add(name.toLowerCase());
|
|
29
|
+
names.push(name);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return names;
|
|
33
|
+
}
|
|
34
|
+
/** An optional single status name, trimmed, 1-100 characters; undefined/absent means none. */
|
|
35
|
+
function optionalStatus(field, raw) {
|
|
36
|
+
if (raw === undefined)
|
|
37
|
+
return null;
|
|
38
|
+
const name = raw.trim();
|
|
39
|
+
if (name.length === 0 || name.length > 100)
|
|
40
|
+
throw new McpError(400, `invalid ${field} (1-100 characters)`);
|
|
41
|
+
return name;
|
|
42
|
+
}
|
|
43
|
+
function normalizeProjectKey(projectKey) {
|
|
44
|
+
const key = projectKey.trim().toUpperCase();
|
|
45
|
+
if (!PROJECT_KEY.test(key))
|
|
46
|
+
throw new McpError(400, `invalid projectKey "${projectKey}"`);
|
|
47
|
+
return key;
|
|
48
|
+
}
|
|
49
|
+
export function registerIssueProjectTools(mcp) {
|
|
50
|
+
mcp.registerTool({
|
|
51
|
+
name: "link_issue_project",
|
|
52
|
+
scope: "agents:write",
|
|
53
|
+
description: "Links a native agent to a Jira project, with its access and issue-event triggers. A wardby admin approves Jira links " +
|
|
54
|
+
"(agents:admin with the admin role); the agent acts as the deployment's Jira service account, not as any person. " +
|
|
55
|
+
"triggers (write access only): created, transitioned (needs triggerStatuses), labeled (needs triggerLabels), assigned and " +
|
|
56
|
+
"mention (each needs trustedAccountIds). trustedAccountIds are Jira accountIds (from a Jira profile URL or jira_get_issue " +
|
|
57
|
+
"output) whose mentions/assignments may trigger the agent; triggered text from anyone else is treated as untrusted. " +
|
|
58
|
+
"jqlFilter optionally narrows which issues trigger; commentVisibilityRole restricts the agent's comments to a project role. " +
|
|
59
|
+
"Re-linking a project replaces its access, triggers, and filters (an omitted field is cleared, not kept) — always send " +
|
|
60
|
+
"the full desired state. " +
|
|
61
|
+
"allowedTransitions (write access only): the target status names jira_transition may move issues to (matched by target " +
|
|
62
|
+
"status name, case-insensitive). writableFields (write access only): the field ids jira_update_fields may change " +
|
|
63
|
+
"(labels, components, priority, or customfield_NNNNN). Both allowlists fail closed: empty or omitted means the agent " +
|
|
64
|
+
"cannot transition issues or edit fields at all. " +
|
|
65
|
+
'allowedLinkTypes (write access only): the issue link type names jira_link_issues may create (e.g. "Duplicate", ' +
|
|
66
|
+
"case-insensitive, at most 20); linking also needs write access to both issues' projects, each allowlisting the type. " +
|
|
67
|
+
"It fails closed too: empty or omitted means the agent cannot link issues. Issue properties (jira_set_property) are " +
|
|
68
|
+
"not allowlisted: any write link may set them. " +
|
|
69
|
+
"onPullRequestOpened / onPullRequestMerged (write access only, optional): the status name to move the issue to when a " +
|
|
70
|
+
"pull request wardby opened for it opens or merges. These are control-plane moves, not model actions, and are not gated " +
|
|
71
|
+
"by allowedTransitions; the name is matched in the Jira service account's language, and omitting one means no move. " +
|
|
72
|
+
"creatableIssueTypes (write access only): the issue type names (case-insensitive, at most 20) the agent may create issues " +
|
|
73
|
+
"of in this project; it fails closed too: empty or omitted means the agent cannot create issues here. " +
|
|
74
|
+
"maxNewIssuesPerRun (write access only, optional integer 1-1000): the most issues one run may create in this project; " +
|
|
75
|
+
"omitted means no cap. The cap is best-effort across resumed or concurrent attempts of the same run.",
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: "object",
|
|
78
|
+
additionalProperties: false,
|
|
79
|
+
properties: {
|
|
80
|
+
agentId: { type: "string" },
|
|
81
|
+
provider: { type: "string", enum: PROVIDERS },
|
|
82
|
+
projectKey: { type: "string", minLength: 1, maxLength: 255 },
|
|
83
|
+
access: { type: "string", enum: ["read", "write"] },
|
|
84
|
+
triggers: { type: "array", items: { type: "string", enum: [...TRIGGERS] }, uniqueItems: true },
|
|
85
|
+
triggerStatuses: { type: "array", items: { type: "string", minLength: 1, maxLength: 100 }, maxItems: 50 },
|
|
86
|
+
triggerLabels: { type: "array", items: { type: "string", minLength: 1, maxLength: 255 }, maxItems: 50 },
|
|
87
|
+
jqlFilter: { type: "string", minLength: 1, maxLength: 1000 },
|
|
88
|
+
trustedAccountIds: {
|
|
89
|
+
type: "array",
|
|
90
|
+
items: { type: "string", pattern: ACCOUNT_ID.source },
|
|
91
|
+
maxItems: 50,
|
|
92
|
+
},
|
|
93
|
+
commentVisibilityRole: { type: "string", minLength: 1, maxLength: 100 },
|
|
94
|
+
allowedTransitions: { type: "array", items: { type: "string", minLength: 1, maxLength: 100 }, maxItems: 50 },
|
|
95
|
+
writableFields: { type: "array", items: { type: "string", pattern: WRITABLE_FIELD.source }, maxItems: 50 },
|
|
96
|
+
allowedLinkTypes: { type: "array", items: { type: "string", minLength: 1, maxLength: 100 }, maxItems: 20 },
|
|
97
|
+
onPullRequestOpened: { type: "string", minLength: 1, maxLength: 100 },
|
|
98
|
+
onPullRequestMerged: { type: "string", minLength: 1, maxLength: 100 },
|
|
99
|
+
creatableIssueTypes: { type: "array", items: { type: "string", minLength: 1, maxLength: 100 }, maxItems: 20 },
|
|
100
|
+
maxNewIssuesPerRun: { type: "integer", minimum: 1, maximum: 1000 },
|
|
101
|
+
},
|
|
102
|
+
required: ["agentId", "projectKey", "access"],
|
|
103
|
+
},
|
|
104
|
+
handler: async (args, ctx) => {
|
|
105
|
+
requireScope(ctx, ctx.canonicalUri, "agents:admin");
|
|
106
|
+
const agent = await ctx.db.agent.findUnique({ where: { id: args.agentId } });
|
|
107
|
+
if (!agent)
|
|
108
|
+
throw new McpError(404, `Agent "${args.agentId}" not found.`);
|
|
109
|
+
if (agent.kind !== "native")
|
|
110
|
+
throw new McpError(400, "Issue-project links are for native agents only.");
|
|
111
|
+
if (agent.ownerId === null) {
|
|
112
|
+
throw new McpError(400, `Agent "${agent.id}" has no owner; assign one with make_owner before linking.`);
|
|
113
|
+
}
|
|
114
|
+
const provider = args.provider ?? "jira";
|
|
115
|
+
const projectKey = normalizeProjectKey(args.projectKey);
|
|
116
|
+
const triggers = [...new Set(args.triggers ?? [])];
|
|
117
|
+
const triggerStatuses = args.triggerStatuses ?? [];
|
|
118
|
+
const triggerLabels = args.triggerLabels ?? [];
|
|
119
|
+
const trustedAccountIds = [...new Set(args.trustedAccountIds ?? [])];
|
|
120
|
+
if (trustedAccountIds.some((id) => !ACCOUNT_ID.test(id))) {
|
|
121
|
+
throw new McpError(400, "invalid trustedAccountIds entry (letters, digits, ':', '_', '-'; up to 128 characters)");
|
|
122
|
+
}
|
|
123
|
+
const allowedTransitions = nameList("allowedTransitions", args.allowedTransitions);
|
|
124
|
+
const allowedLinkTypes = nameList("allowedLinkTypes", args.allowedLinkTypes);
|
|
125
|
+
if (allowedLinkTypes.length > 20)
|
|
126
|
+
throw new McpError(400, "allowedLinkTypes takes at most 20 entries");
|
|
127
|
+
const creatableIssueTypes = nameList("creatableIssueTypes", args.creatableIssueTypes);
|
|
128
|
+
if (creatableIssueTypes.length > 20)
|
|
129
|
+
throw new McpError(400, "creatableIssueTypes takes at most 20 entries");
|
|
130
|
+
const maxNewIssuesPerRun = args.maxNewIssuesPerRun ?? null;
|
|
131
|
+
if (maxNewIssuesPerRun !== null &&
|
|
132
|
+
(!Number.isInteger(maxNewIssuesPerRun) || maxNewIssuesPerRun < 1 || maxNewIssuesPerRun > 1000)) {
|
|
133
|
+
throw new McpError(400, "maxNewIssuesPerRun must be an integer from 1 to 1000");
|
|
134
|
+
}
|
|
135
|
+
if ((creatableIssueTypes.length > 0 || maxNewIssuesPerRun !== null) && args.access !== "write") {
|
|
136
|
+
throw new McpError(400, "creatableIssueTypes and maxNewIssuesPerRun need write access.");
|
|
137
|
+
}
|
|
138
|
+
const writableFields = [...new Set(args.writableFields ?? [])];
|
|
139
|
+
if (writableFields.some((f) => !WRITABLE_FIELD.test(f))) {
|
|
140
|
+
throw new McpError(400, "invalid writableFields entry (labels, components, priority, or customfield_NNNNN)");
|
|
141
|
+
}
|
|
142
|
+
const onPullRequestOpened = optionalStatus("onPullRequestOpened", args.onPullRequestOpened);
|
|
143
|
+
const onPullRequestMerged = optionalStatus("onPullRequestMerged", args.onPullRequestMerged);
|
|
144
|
+
if ((onPullRequestOpened !== null || onPullRequestMerged !== null) && args.access !== "write") {
|
|
145
|
+
throw new McpError(400, "onPullRequestOpened and onPullRequestMerged need write access.");
|
|
146
|
+
}
|
|
147
|
+
if ((allowedTransitions.length > 0 || writableFields.length > 0 || allowedLinkTypes.length > 0) &&
|
|
148
|
+
args.access !== "write") {
|
|
149
|
+
throw new McpError(400, "allowedTransitions, writableFields, and allowedLinkTypes need write access.");
|
|
150
|
+
}
|
|
151
|
+
if (triggers.length > 0 && args.access !== "write")
|
|
152
|
+
throw new McpError(400, "Event triggers need write access.");
|
|
153
|
+
if (triggers.includes("transitioned") && triggerStatuses.length === 0) {
|
|
154
|
+
throw new McpError(400, "The transitioned trigger needs a non-empty triggerStatuses.");
|
|
155
|
+
}
|
|
156
|
+
if (triggers.includes("labeled") && triggerLabels.length === 0) {
|
|
157
|
+
throw new McpError(400, "The labeled trigger needs a non-empty triggerLabels.");
|
|
158
|
+
}
|
|
159
|
+
if ((triggers.includes("mention") || triggers.includes("assigned")) && trustedAccountIds.length === 0) {
|
|
160
|
+
throw new McpError(400, "The mention and assigned triggers need a non-empty trustedAccountIds.");
|
|
161
|
+
}
|
|
162
|
+
if (!ctx.providers.issueTrackers?.[provider]) {
|
|
163
|
+
throw new McpError(503, "Jira is not configured on this deployment (see docs/jira-agents.md).");
|
|
164
|
+
}
|
|
165
|
+
const fields = {
|
|
166
|
+
access: args.access,
|
|
167
|
+
triggers,
|
|
168
|
+
triggerStatuses,
|
|
169
|
+
triggerLabels,
|
|
170
|
+
jqlFilter: args.jqlFilter ?? null,
|
|
171
|
+
trustedAccountIds,
|
|
172
|
+
commentVisibilityRole: args.commentVisibilityRole ?? null,
|
|
173
|
+
allowedTransitions,
|
|
174
|
+
writableFields,
|
|
175
|
+
allowedLinkTypes,
|
|
176
|
+
onPullRequestOpened,
|
|
177
|
+
onPullRequestMerged,
|
|
178
|
+
creatableIssueTypes,
|
|
179
|
+
maxNewIssuesPerRun,
|
|
180
|
+
authorizedById: ctx.principal.id,
|
|
181
|
+
authorizedAt: new Date(),
|
|
182
|
+
};
|
|
183
|
+
const link = await ctx.db.agentIssueProject.upsert({
|
|
184
|
+
where: { agentId_provider_projectKey: { agentId: args.agentId, provider, projectKey } },
|
|
185
|
+
create: { agentId: args.agentId, provider, projectKey, ...fields },
|
|
186
|
+
update: fields,
|
|
187
|
+
});
|
|
188
|
+
return textResult({ linked: true, link });
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
mcp.registerTool({
|
|
192
|
+
name: "unlink_issue_project",
|
|
193
|
+
scope: "agents:write",
|
|
194
|
+
description: "Removes a native agent's link to a Jira project. Admin only (agents:admin with the admin role).",
|
|
195
|
+
inputSchema: {
|
|
196
|
+
type: "object",
|
|
197
|
+
additionalProperties: false,
|
|
198
|
+
properties: {
|
|
199
|
+
agentId: { type: "string" },
|
|
200
|
+
provider: { type: "string", enum: PROVIDERS },
|
|
201
|
+
projectKey: { type: "string", minLength: 1, maxLength: 255 },
|
|
202
|
+
},
|
|
203
|
+
required: ["agentId", "projectKey"],
|
|
204
|
+
},
|
|
205
|
+
handler: async (args, ctx) => {
|
|
206
|
+
requireScope(ctx, ctx.canonicalUri, "agents:admin");
|
|
207
|
+
const agent = await ctx.db.agent.findUnique({ where: { id: args.agentId } });
|
|
208
|
+
if (!agent)
|
|
209
|
+
throw new McpError(404, `Agent "${args.agentId}" not found.`);
|
|
210
|
+
const { count } = await ctx.db.agentIssueProject.deleteMany({
|
|
211
|
+
where: {
|
|
212
|
+
agentId: args.agentId,
|
|
213
|
+
provider: args.provider ?? "jira",
|
|
214
|
+
projectKey: normalizeProjectKey(args.projectKey),
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
return textResult({ unlinked: count > 0 });
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
mcp.registerTool({
|
|
221
|
+
name: "list_issue_projects",
|
|
222
|
+
scope: "agents:read",
|
|
223
|
+
inputSchema: {
|
|
224
|
+
type: "object",
|
|
225
|
+
additionalProperties: false,
|
|
226
|
+
properties: { agentId: { type: "string" } },
|
|
227
|
+
required: ["agentId"],
|
|
228
|
+
},
|
|
229
|
+
handler: async (args, ctx) => {
|
|
230
|
+
await requireAgentAccess(ctx, args.agentId, "read");
|
|
231
|
+
const links = await ctx.db.agentIssueProject.findMany({
|
|
232
|
+
where: { agentId: args.agentId },
|
|
233
|
+
orderBy: { createdAt: "asc" },
|
|
234
|
+
});
|
|
235
|
+
return textResult({ issueProjects: links });
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Operator inspection of agent memory, mirroring the Datastore MCP tools
|
|
3
|
+
* (`./datastore.ts`). Memory is agent *data*, written by every triggerer's
|
|
4
|
+
* runs, so every tool here is owner-only whatever the grants (resource-
|
|
5
|
+
* sharing grants spec §3.4.6): showing it at read or execute would leak one
|
|
6
|
+
* triggerer's run output to another (A6 through memory).
|
|
7
|
+
*/
|
|
2
8
|
import type { WardbyMcpServer } from "../server.js";
|
|
3
9
|
export declare function registerMemoryTools(mcp: WardbyMcpServer): void;
|
package/dist/mcp/tools/memory.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { requireAgentAccess } from "../auth/access.js";
|
|
2
2
|
import { textResult } from "./text-result.js";
|
|
3
3
|
export function registerMemoryTools(mcp) {
|
|
4
4
|
mcp.registerTool({
|
|
@@ -10,7 +10,7 @@ export function registerMemoryTools(mcp) {
|
|
|
10
10
|
required: ["agentId", "key"],
|
|
11
11
|
},
|
|
12
12
|
handler: async (args, ctx) => {
|
|
13
|
-
await
|
|
13
|
+
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
14
14
|
const content = await ctx.providers.memory.get(args.agentId, args.key);
|
|
15
15
|
return textResult({ content: content ?? null });
|
|
16
16
|
},
|
|
@@ -24,7 +24,7 @@ export function registerMemoryTools(mcp) {
|
|
|
24
24
|
required: ["agentId"],
|
|
25
25
|
},
|
|
26
26
|
handler: async (args, ctx) => {
|
|
27
|
-
await
|
|
27
|
+
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
28
28
|
const keys = await ctx.providers.memory.list(args.agentId);
|
|
29
29
|
return textResult(keys);
|
|
30
30
|
},
|
|
@@ -38,7 +38,7 @@ export function registerMemoryTools(mcp) {
|
|
|
38
38
|
required: ["agentId", "key", "content"],
|
|
39
39
|
},
|
|
40
40
|
handler: async (args, ctx) => {
|
|
41
|
-
await
|
|
41
|
+
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
42
42
|
await ctx.providers.memory.set(args.agentId, args.key, args.content);
|
|
43
43
|
return textResult({ ok: true });
|
|
44
44
|
},
|
|
@@ -52,7 +52,7 @@ export function registerMemoryTools(mcp) {
|
|
|
52
52
|
required: ["agentId", "key"],
|
|
53
53
|
},
|
|
54
54
|
handler: async (args, ctx) => {
|
|
55
|
-
await
|
|
55
|
+
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
56
56
|
await ctx.providers.memory.delete(args.agentId, args.key);
|
|
57
57
|
return textResult({ ok: true });
|
|
58
58
|
},
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { McpError } from "../errors.js";
|
|
2
|
+
import type { WardbyMcpServer } from "../server.js";
|
|
3
|
+
export interface ModelCatalogToolDeps {
|
|
4
|
+
/** Rebuilds the process's installed CatalogStore after a write; omitted in contexts with no store. */
|
|
5
|
+
refresh?: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The post-write ownership-race error: our own row for `inputProvider` was
|
|
9
|
+
* written, but a refresh right after showed `nowOwner` winning the merge
|
|
10
|
+
* instead (the first-claim-wins rule — see `ownerOf` in catalog.ts). Named
|
|
11
|
+
* after the thing that actually fixes it (reset_model, which clears every
|
|
12
|
+
* row for the id, `nowOwner`'s included) rather than telling the caller to
|
|
13
|
+
* "retry set_model", which would just hit the pre-write conflict check again
|
|
14
|
+
* (or, if the race repeats, loop). Exported so its exact wording can be unit
|
|
15
|
+
* tested directly — forcing the genuine two-process write race that triggers
|
|
16
|
+
* this through the public tool-call surface isn't practical: it requires a
|
|
17
|
+
* competing write to land in the narrow window between this handler's own
|
|
18
|
+
* pre-write ownership check and its own write, which a single-process test
|
|
19
|
+
* harness has no way to inject mid-call.
|
|
20
|
+
*/
|
|
21
|
+
export declare function raceLostError(modelId: string, inputProvider: string, nowOwner: string): McpError;
|
|
22
|
+
export declare function registerModelCatalogTools(mcp: WardbyMcpServer, deps?: ModelCatalogToolDeps): void;
|