@paybond/kit 0.9.8 → 0.11.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/completion-presets/catalog.json +1187 -0
- package/completion-presets/catalog.sha256 +1 -0
- package/dev/trace-ui/dashboard.html +617 -0
- package/dist/agent/adapter.d.ts +51 -0
- package/dist/agent/adapter.js +66 -0
- package/dist/agent/attach-bundle.d.ts +37 -0
- package/dist/agent/attach-bundle.js +118 -0
- package/dist/agent/authorization-cache.d.ts +22 -0
- package/dist/agent/authorization-cache.js +36 -0
- package/dist/agent/deferred-tools.d.ts +11 -0
- package/dist/agent/deferred-tools.js +62 -0
- package/dist/agent/discover.d.ts +41 -0
- package/dist/agent/discover.js +147 -0
- package/dist/agent/evidence.d.ts +9 -0
- package/dist/agent/evidence.js +28 -0
- package/dist/agent/facade.d.ts +48 -0
- package/dist/agent/facade.js +112 -0
- package/dist/agent/gateway-trace-reporter.d.ts +28 -0
- package/dist/agent/gateway-trace-reporter.js +49 -0
- package/dist/agent/generic-runner.d.ts +14 -0
- package/dist/agent/generic-runner.js +49 -0
- package/dist/agent/generic-sandbox-demo.d.ts +36 -0
- package/dist/agent/generic-sandbox-demo.js +82 -0
- package/dist/agent/guarded-agent.d.ts +49 -0
- package/dist/agent/guarded-agent.js +100 -0
- package/dist/agent/index.d.ts +13 -0
- package/dist/agent/index.js +13 -0
- package/dist/agent/instrument.d.ts +156 -0
- package/dist/agent/instrument.js +442 -0
- package/dist/agent/interceptor.d.ts +24 -0
- package/dist/agent/interceptor.js +440 -0
- package/dist/agent/lazy-context-tools.d.ts +15 -0
- package/dist/agent/lazy-context-tools.js +81 -0
- package/dist/agent/registry-file.d.ts +39 -0
- package/dist/agent/registry-file.js +219 -0
- package/dist/agent/registry.d.ts +37 -0
- package/dist/agent/registry.js +128 -0
- package/dist/agent/run.d.ts +124 -0
- package/dist/agent/run.js +301 -0
- package/dist/agent/types.d.ts +318 -0
- package/dist/agent/types.js +42 -0
- package/dist/agent-recognition.d.ts +72 -0
- package/dist/agent-recognition.js +165 -0
- package/dist/bincode-wire.d.ts +18 -0
- package/dist/bincode-wire.js +93 -0
- package/dist/claude-agents/config.d.ts +21 -0
- package/dist/claude-agents/config.js +145 -0
- package/dist/claude-agents/index.d.ts +2 -0
- package/dist/claude-agents/index.js +2 -0
- package/dist/claude-agents/sandbox-demo.d.ts +30 -0
- package/dist/claude-agents/sandbox-demo.js +91 -0
- package/dist/cli/agent/env-quote.d.ts +1 -0
- package/dist/cli/agent/env-quote.js +6 -0
- package/dist/cli/agent/env-write.d.ts +8 -0
- package/dist/cli/agent/env-write.js +47 -0
- package/dist/cli/agent/paybond.d.ts +16 -0
- package/dist/cli/agent/paybond.js +55 -0
- package/dist/cli/agent/policy-file.d.ts +29 -0
- package/dist/cli/agent/policy-file.js +61 -0
- package/dist/cli/agent/production-evidence.d.ts +24 -0
- package/dist/cli/agent/production-evidence.js +98 -0
- package/dist/cli/agent/run-store.d.ts +30 -0
- package/dist/cli/agent/run-store.js +42 -0
- package/dist/cli/agent/run-trace-store.d.ts +39 -0
- package/dist/cli/agent/run-trace-store.js +143 -0
- package/dist/cli/agent-run-trace-table.d.ts +9 -0
- package/dist/cli/agent-run-trace-table.js +24 -0
- package/dist/cli/agent-sandbox-smoke-checklist.d.ts +9 -0
- package/dist/cli/agent-sandbox-smoke-checklist.js +50 -0
- package/dist/cli/audit-export.d.ts +7 -0
- package/dist/cli/audit-export.js +120 -0
- package/dist/cli/automation.d.ts +25 -0
- package/dist/cli/automation.js +297 -0
- package/dist/cli/body.d.ts +7 -0
- package/dist/cli/body.js +22 -0
- package/dist/cli/color.d.ts +15 -0
- package/dist/cli/color.js +39 -0
- package/dist/cli/command-spec.d.ts +13 -0
- package/dist/cli/command-spec.js +611 -0
- package/dist/cli/commands/agent.d.ts +16 -0
- package/dist/cli/commands/agent.js +1135 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.js +348 -0
- package/dist/cli/commands/discovery.d.ts +8 -0
- package/dist/cli/commands/discovery.js +194 -0
- package/dist/cli/commands/policy.d.ts +13 -0
- package/dist/cli/commands/policy.js +769 -0
- package/dist/cli/commands/setup.d.ts +18 -0
- package/dist/cli/commands/setup.js +513 -0
- package/dist/cli/commands/workflows.d.ts +7 -0
- package/dist/cli/commands/workflows.js +214 -0
- package/dist/cli/config.d.ts +16 -0
- package/dist/cli/config.js +98 -0
- package/dist/cli/context.d.ts +22 -0
- package/dist/cli/context.js +110 -0
- package/dist/cli/credentials.d.ts +21 -0
- package/dist/cli/credentials.js +141 -0
- package/dist/cli/doctor-agent-middleware.d.ts +5 -0
- package/dist/cli/doctor-agent-middleware.js +49 -0
- package/dist/cli/doctor-agent.d.ts +15 -0
- package/dist/cli/doctor-agent.js +311 -0
- package/dist/cli/envelope.d.ts +14 -0
- package/dist/cli/envelope.js +46 -0
- package/dist/cli/globals.d.ts +23 -0
- package/dist/cli/globals.js +248 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +83 -0
- package/dist/cli/mcp-install.d.ts +41 -0
- package/dist/cli/mcp-install.js +95 -0
- package/dist/cli/mcp-policy.d.ts +26 -0
- package/dist/cli/mcp-policy.js +110 -0
- package/dist/cli/mcp-verify-config.d.ts +37 -0
- package/dist/cli/mcp-verify-config.js +172 -0
- package/dist/cli/redact.d.ts +4 -0
- package/dist/cli/redact.js +88 -0
- package/dist/cli/request-id.d.ts +2 -0
- package/dist/cli/request-id.js +5 -0
- package/dist/cli/router.d.ts +2 -0
- package/dist/cli/router.js +378 -0
- package/dist/cli/smoke-deep-links.d.ts +15 -0
- package/dist/cli/smoke-deep-links.js +63 -0
- package/dist/cli/suggest.d.ts +4 -0
- package/dist/cli/suggest.js +58 -0
- package/dist/cli/support-diagnostics.d.ts +19 -0
- package/dist/cli/support-diagnostics.js +47 -0
- package/dist/cli/telemetry.d.ts +17 -0
- package/dist/cli/telemetry.js +94 -0
- package/dist/cli/types.d.ts +72 -0
- package/dist/cli/types.js +60 -0
- package/dist/cli/ux.d.ts +8 -0
- package/dist/cli/ux.js +164 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +38 -0
- package/dist/completion-catalog-digest.d.ts +2 -0
- package/dist/completion-catalog-digest.js +2 -0
- package/dist/completion-catalog-integrity.d.ts +2 -0
- package/dist/completion-catalog-integrity.js +17 -0
- package/dist/completion-catalog.d.ts +49 -0
- package/dist/completion-catalog.js +62 -0
- package/dist/completion-contract-digest.d.ts +37 -0
- package/dist/completion-contract-digest.js +73 -0
- package/dist/completion-forbidden-fields.d.ts +5 -0
- package/dist/completion-forbidden-fields.js +26 -0
- package/dist/completion-init.d.ts +8 -0
- package/dist/completion-init.js +334 -0
- package/dist/completion-resolve.d.ts +21 -0
- package/dist/completion-resolve.js +86 -0
- package/dist/completion-validate-evidence.d.ts +24 -0
- package/dist/completion-validate-evidence.js +145 -0
- package/dist/dev/offline-gateway.d.ts +24 -0
- package/dist/dev/offline-gateway.js +102 -0
- package/dist/dev/trace-buffer.d.ts +61 -0
- package/dist/dev/trace-buffer.js +330 -0
- package/dist/dev/trace-security-headers.d.ts +11 -0
- package/dist/dev/trace-security-headers.js +16 -0
- package/dist/dev/trace-server.d.ts +8 -0
- package/dist/dev/trace-server.js +38 -0
- package/dist/dev/trace-ui.d.ts +4 -0
- package/dist/dev/trace-ui.js +25 -0
- package/dist/dev/wiremock-up.d.ts +15 -0
- package/dist/dev/wiremock-up.js +118 -0
- package/dist/doctor-completion.d.ts +17 -0
- package/dist/doctor-completion.js +428 -0
- package/dist/gateway-url.d.ts +7 -0
- package/dist/gateway-url.js +69 -0
- package/dist/index.d.ts +119 -2
- package/dist/index.js +267 -6
- package/dist/init.js +380 -68
- package/dist/langgraph/awrap-tool-call.d.ts +25 -0
- package/dist/langgraph/awrap-tool-call.js +81 -0
- package/dist/langgraph/config.d.ts +13 -0
- package/dist/langgraph/config.js +11 -0
- package/dist/langgraph/index.d.ts +4 -0
- package/dist/langgraph/index.js +4 -0
- package/dist/langgraph/sandbox-demo.d.ts +40 -0
- package/dist/langgraph/sandbox-demo.js +96 -0
- package/dist/langgraph/tool-node.d.ts +10 -0
- package/dist/langgraph/tool-node.js +38 -0
- package/dist/login.d.ts +14 -1
- package/dist/login.js +130 -63
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/tool-surface.d.ts +25 -0
- package/dist/mcp/tool-surface.js +17 -0
- package/dist/mcp-capability-token-cache.d.ts +24 -0
- package/dist/mcp-capability-token-cache.js +101 -0
- package/dist/mcp-evidence-policy.d.ts +48 -0
- package/dist/mcp-evidence-policy.js +117 -0
- package/dist/mcp-policy-reload.d.ts +79 -0
- package/dist/mcp-policy-reload.js +200 -0
- package/dist/mcp-sep2828-evidence.d.ts +36 -0
- package/dist/mcp-sep2828-evidence.js +65 -0
- package/dist/mcp-server.d.ts +10 -0
- package/dist/mcp-server.js +423 -115
- package/dist/openai-agents/index.d.ts +40 -0
- package/dist/openai-agents/index.js +151 -0
- package/dist/openai-agents/sandbox-demo.d.ts +34 -0
- package/dist/openai-agents/sandbox-demo.js +118 -0
- package/dist/payee-evidence.js +2 -29
- package/dist/policy/catalog.d.ts +31 -0
- package/dist/policy/catalog.js +48 -0
- package/dist/policy/compose-utils.d.ts +3 -0
- package/dist/policy/compose-utils.js +4 -0
- package/dist/policy/compose.d.ts +20 -0
- package/dist/policy/compose.js +240 -0
- package/dist/policy/digest.d.ts +7 -0
- package/dist/policy/digest.js +75 -0
- package/dist/policy/domain.d.ts +15 -0
- package/dist/policy/domain.js +28 -0
- package/dist/policy/guardrail-spec.d.ts +17 -0
- package/dist/policy/guardrail-spec.js +140 -0
- package/dist/policy/guardrails.d.ts +48 -0
- package/dist/policy/guardrails.js +72 -0
- package/dist/policy/index.d.ts +21 -0
- package/dist/policy/index.js +21 -0
- package/dist/policy/init.d.ts +102 -0
- package/dist/policy/init.js +351 -0
- package/dist/policy/intent-spec.d.ts +52 -0
- package/dist/policy/intent-spec.js +176 -0
- package/dist/policy/json-path.d.ts +4 -0
- package/dist/policy/json-path.js +23 -0
- package/dist/policy/layers-io.d.ts +7 -0
- package/dist/policy/layers-io.js +28 -0
- package/dist/policy/load-effective.d.ts +22 -0
- package/dist/policy/load-effective.js +77 -0
- package/dist/policy/load.d.ts +85 -0
- package/dist/policy/load.js +164 -0
- package/dist/policy/merge.d.ts +29 -0
- package/dist/policy/merge.js +297 -0
- package/dist/policy/parse-text.d.ts +2 -0
- package/dist/policy/parse-text.js +126 -0
- package/dist/policy/policy-api.d.ts +45 -0
- package/dist/policy/policy-api.js +61 -0
- package/dist/policy/presets.d.ts +19 -0
- package/dist/policy/presets.js +66 -0
- package/dist/policy/registry.d.ts +7 -0
- package/dist/policy/registry.js +33 -0
- package/dist/policy/reload.d.ts +86 -0
- package/dist/policy/reload.js +233 -0
- package/dist/policy/render-yaml.d.ts +3 -0
- package/dist/policy/render-yaml.js +69 -0
- package/dist/policy/sandbox-bootstrap.d.ts +19 -0
- package/dist/policy/sandbox-bootstrap.js +66 -0
- package/dist/policy/schema.d.ts +204 -0
- package/dist/policy/schema.js +255 -0
- package/dist/policy/snapshot.d.ts +33 -0
- package/dist/policy/snapshot.js +23 -0
- package/dist/policy/validate-remote.d.ts +43 -0
- package/dist/policy/validate-remote.js +104 -0
- package/dist/policy/validate.d.ts +36 -0
- package/dist/policy/validate.js +150 -0
- package/dist/policy/watcher.d.ts +29 -0
- package/dist/policy/watcher.js +112 -0
- package/dist/principal-intent.d.ts +52 -0
- package/dist/principal-intent.js +193 -37
- package/dist/project-init.d.ts +34 -0
- package/dist/project-init.js +898 -0
- package/dist/sep2828-signature.d.ts +10 -0
- package/dist/sep2828-signature.js +134 -0
- package/dist/solutions/api.d.ts +22 -0
- package/dist/solutions/api.js +40 -0
- package/dist/solutions/catalog.d.ts +34 -0
- package/dist/solutions/catalog.js +129 -0
- package/dist/solutions/index.d.ts +2 -0
- package/dist/solutions/index.js +2 -0
- package/dist/template-init.d.ts +54 -0
- package/dist/template-init.js +203 -0
- package/dist/vercel-ai/config.d.ts +15 -0
- package/dist/vercel-ai/config.js +13 -0
- package/dist/vercel-ai/index.d.ts +4 -0
- package/dist/vercel-ai/index.js +4 -0
- package/dist/vercel-ai/sandbox-demo.d.ts +44 -0
- package/dist/vercel-ai/sandbox-demo.js +153 -0
- package/dist/vercel-ai/tool-approval.d.ts +16 -0
- package/dist/vercel-ai/tool-approval.js +41 -0
- package/dist/vercel-ai/wrap-tools.d.ts +9 -0
- package/dist/vercel-ai/wrap-tools.js +40 -0
- package/dist/x402-receipt-evidence.d.ts +29 -0
- package/dist/x402-receipt-evidence.js +97 -0
- package/dist/x402-receipt-signature.d.ts +12 -0
- package/dist/x402-receipt-signature.js +211 -0
- package/package.json +79 -4
- package/solutions/aws.json +17 -0
- package/solutions/saas.json +17 -0
- package/solutions/shopping.json +17 -0
- package/solutions/travel.json +18 -0
- package/templates/manifest.json +169 -0
- package/templates/openai-shopping-agent/.env.example +3 -0
- package/templates/openai-shopping-agent/.github/workflows/smoke.yml +20 -0
- package/templates/openai-shopping-agent/LICENSE +201 -0
- package/templates/openai-shopping-agent/README.md +29 -0
- package/templates/openai-shopping-agent/package.json +22 -0
- package/templates/openai-shopping-agent/paybond.policy.yaml +22 -0
- package/templates/openai-shopping-agent/src/index.ts +22 -0
- package/templates/openai-shopping-agent/src/paybond.config.ts +51 -0
- package/templates/openai-shopping-agent/tsconfig.json +13 -0
- package/templates/paybond-aws-operator/.env.example +3 -0
- package/templates/paybond-aws-operator/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-aws-operator/LICENSE +201 -0
- package/templates/paybond-aws-operator/README.md +29 -0
- package/templates/paybond-aws-operator/package.json +20 -0
- package/templates/paybond-aws-operator/paybond.policy.yaml +22 -0
- package/templates/paybond-aws-operator/src/index.ts +54 -0
- package/templates/paybond-aws-operator/src/paybond.config.ts +51 -0
- package/templates/paybond-aws-operator/tsconfig.json +13 -0
- package/templates/paybond-claude-agents-demo/.env.example +3 -0
- package/templates/paybond-claude-agents-demo/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-claude-agents-demo/LICENSE +201 -0
- package/templates/paybond-claude-agents-demo/README.md +29 -0
- package/templates/paybond-claude-agents-demo/package.json +22 -0
- package/templates/paybond-claude-agents-demo/paybond.policy.yaml +22 -0
- package/templates/paybond-claude-agents-demo/src/index.ts +22 -0
- package/templates/paybond-claude-agents-demo/src/paybond.config.ts +51 -0
- package/templates/paybond-claude-agents-demo/tsconfig.json +13 -0
- package/templates/paybond-invoice-agent/.env.example +3 -0
- package/templates/paybond-invoice-agent/.github/workflows/smoke.yml +19 -0
- package/templates/paybond-invoice-agent/LICENSE +201 -0
- package/templates/paybond-invoice-agent/README.md +29 -0
- package/templates/paybond-invoice-agent/app.py +27 -0
- package/templates/paybond-invoice-agent/package.json +6 -0
- package/templates/paybond-invoice-agent/paybond.policy.yaml +22 -0
- package/templates/paybond-invoice-agent/paybond_config.py +45 -0
- package/templates/paybond-invoice-agent/requirements.txt +2 -0
- package/templates/paybond-mcp-coding-agent/.env.example +3 -0
- package/templates/paybond-mcp-coding-agent/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-mcp-coding-agent/LICENSE +201 -0
- package/templates/paybond-mcp-coding-agent/README.md +39 -0
- package/templates/paybond-mcp-coding-agent/package.json +20 -0
- package/templates/paybond-mcp-coding-agent/paybond.policy.yaml +25 -0
- package/templates/paybond-mcp-coding-agent/src/index.ts +40 -0
- package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +51 -0
- package/templates/paybond-mcp-coding-agent/tsconfig.json +13 -0
- package/templates/paybond-openai-agents-demo/.env.example +3 -0
- package/templates/paybond-openai-agents-demo/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-openai-agents-demo/LICENSE +201 -0
- package/templates/paybond-openai-agents-demo/README.md +29 -0
- package/templates/paybond-openai-agents-demo/package.json +22 -0
- package/templates/paybond-openai-agents-demo/paybond.policy.yaml +22 -0
- package/templates/paybond-openai-agents-demo/src/index.ts +22 -0
- package/templates/paybond-openai-agents-demo/src/paybond.config.ts +51 -0
- package/templates/paybond-openai-agents-demo/tsconfig.json +13 -0
- package/templates/paybond-procurement-agent/.env.example +3 -0
- package/templates/paybond-procurement-agent/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-procurement-agent/LICENSE +201 -0
- package/templates/paybond-procurement-agent/README.md +29 -0
- package/templates/paybond-procurement-agent/package.json +20 -0
- package/templates/paybond-procurement-agent/paybond.policy.yaml +25 -0
- package/templates/paybond-procurement-agent/src/index.ts +54 -0
- package/templates/paybond-procurement-agent/src/paybond.config.ts +51 -0
- package/templates/paybond-procurement-agent/tsconfig.json +13 -0
- package/templates/paybond-travel-agent/.env.example +3 -0
- package/templates/paybond-travel-agent/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-travel-agent/LICENSE +201 -0
- package/templates/paybond-travel-agent/README.md +29 -0
- package/templates/paybond-travel-agent/package.json +23 -0
- package/templates/paybond-travel-agent/paybond.policy.yaml +22 -0
- package/templates/paybond-travel-agent/src/index.ts +22 -0
- package/templates/paybond-travel-agent/src/paybond.config.ts +51 -0
- package/templates/paybond-travel-agent/tsconfig.json +13 -0
- package/templates/paybond-vercel-shopping-agent/.env.example +3 -0
- package/templates/paybond-vercel-shopping-agent/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-vercel-shopping-agent/LICENSE +201 -0
- package/templates/paybond-vercel-shopping-agent/README.md +29 -0
- package/templates/paybond-vercel-shopping-agent/package.json +22 -0
- package/templates/paybond-vercel-shopping-agent/paybond.policy.yaml +22 -0
- package/templates/paybond-vercel-shopping-agent/src/index.ts +22 -0
- package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +51 -0
- package/templates/paybond-vercel-shopping-agent/tsconfig.json +13 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { commandPath, type CliContext } from "../context.js";
|
|
2
|
+
import { type CommandResult } from "../types.js";
|
|
3
|
+
declare function readJsonFile(filePath: string): Promise<Record<string, unknown>>;
|
|
4
|
+
export declare function handleLogin(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
5
|
+
export declare function handleInitWizard(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
6
|
+
export declare function handleInitGuardrail(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
7
|
+
export declare function handleInitAgentMiddleware(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
8
|
+
export declare function handleInitCompletion(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
9
|
+
export declare function handleMcpServe(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
10
|
+
export declare function handleMcpTools(ctx: CliContext): Promise<CommandResult>;
|
|
11
|
+
export declare function handleMcpInstall(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
12
|
+
export declare function handleMcpVerifyConfig(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
13
|
+
export declare function handleDoctor(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
14
|
+
export declare function handleConfig(ctx: CliContext, subcommand: string, argv: string[]): Promise<CommandResult>;
|
|
15
|
+
export declare function handleWhoami(ctx: CliContext): Promise<CommandResult>;
|
|
16
|
+
export declare function handleVersion(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
17
|
+
export declare function handleDiagnose(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
18
|
+
export { readJsonFile, commandPath };
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { mkdir, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readJsonBody } from "../automation.js";
|
|
4
|
+
import { listConfigEntries, resolveConfigValue, setConfigValue, unsetConfigValue } from "../config.js";
|
|
5
|
+
import { commandPath, withGateway } from "../context.js";
|
|
6
|
+
import { assertApiKeyShape, resolveApiKey, resolvedDefaultsForDoctor } from "../credentials.js";
|
|
7
|
+
import { runAgentMiddlewareDoctorCheck } from "../doctor-agent-middleware.js";
|
|
8
|
+
import { packageVersion, runAgentMcpChecks } from "../doctor-agent.js";
|
|
9
|
+
import { runCompletionCatalogDoctorChecks } from "../../doctor-completion.js";
|
|
10
|
+
import { consumeBooleanFlag, consumeFlag } from "../globals.js";
|
|
11
|
+
import { maskApiKey, redactConfigValue } from "../redact.js";
|
|
12
|
+
import { mergeMcpToolPolicy, parseMcpToolAllowlist, parseMcpToolPolicy, resolveMcpToolPolicy, } from "../mcp-policy.js";
|
|
13
|
+
import { parseMcpInstallFormat, parseMcpInstallHost, parseMcpInstallScope, planMcpInstall, } from "../mcp-install.js";
|
|
14
|
+
import { verifyMcpInstallPlan } from "../mcp-verify-config.js";
|
|
15
|
+
import { buildSupportDiagnostics, formatSupportDiagnosticsTable } from "../support-diagnostics.js";
|
|
16
|
+
import { CliError } from "../types.js";
|
|
17
|
+
import { main as runInitMain } from "../../init.js";
|
|
18
|
+
import { parseCompletionInitArgs, scaffoldCompletionInit } from "../../completion-init.js";
|
|
19
|
+
import { parseProjectInitArgv, runProjectInit } from "../../project-init.js";
|
|
20
|
+
import { copyTemplateToDirectory, normalizeTemplateId, templateInitUsage, } from "../../template-init.js";
|
|
21
|
+
import { parseArgs as parseLoginArgs, runLogin } from "../../login.js";
|
|
22
|
+
import { main as runMcpServerMain } from "../../mcp-server.js";
|
|
23
|
+
import { PaybondMCPServer } from "../../mcp-server.js";
|
|
24
|
+
async function readJsonFile(filePath) {
|
|
25
|
+
return readJsonBody(filePath, process.stdin);
|
|
26
|
+
}
|
|
27
|
+
function loginResultData(result) {
|
|
28
|
+
const data = {
|
|
29
|
+
env_file: result.envPath,
|
|
30
|
+
key_masked: result.keyMasked,
|
|
31
|
+
key_written: result.keyWritten,
|
|
32
|
+
environment: result.environment,
|
|
33
|
+
tenant_id: result.tenantId,
|
|
34
|
+
tenant_uuid: result.tenantUuid,
|
|
35
|
+
verification_uri: result.verificationUri,
|
|
36
|
+
user_code: result.userCode,
|
|
37
|
+
};
|
|
38
|
+
if (result.expiresAt) {
|
|
39
|
+
data.expires_at = result.expiresAt;
|
|
40
|
+
}
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
export async function handleLogin(ctx, argv) {
|
|
44
|
+
if (argv[0] === "--help" || argv[0] === "-h") {
|
|
45
|
+
throw new CliError("help", { category: "usage", code: "cli.help" });
|
|
46
|
+
}
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = parseLoginArgs(["login", ...argv]);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
53
|
+
category: "validation",
|
|
54
|
+
code: "cli.login.rejected",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (parsed === "help") {
|
|
58
|
+
throw new CliError("help", { category: "usage", code: "cli.help" });
|
|
59
|
+
}
|
|
60
|
+
const options = {
|
|
61
|
+
...parsed,
|
|
62
|
+
gateway: ctx.globals.gateway,
|
|
63
|
+
envFile: ctx.globals.envFile,
|
|
64
|
+
noOpen: ctx.globals.noOpen,
|
|
65
|
+
};
|
|
66
|
+
let result;
|
|
67
|
+
try {
|
|
68
|
+
result = await runLogin(options, {
|
|
69
|
+
cwd: ctx.cwd,
|
|
70
|
+
fetch: ctx.fetch,
|
|
71
|
+
humanOutput: ctx.globals.format !== "json",
|
|
72
|
+
stdout: {
|
|
73
|
+
write(chunk) {
|
|
74
|
+
ctx.stdout.write(chunk);
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
stderr: {
|
|
79
|
+
write(chunk) {
|
|
80
|
+
ctx.stderr.write(chunk);
|
|
81
|
+
return true;
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
sleep: ctx.deps.sleep,
|
|
85
|
+
openBrowser: ctx.deps.openBrowser,
|
|
86
|
+
now: ctx.deps.now,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
91
|
+
category: "validation",
|
|
92
|
+
code: "cli.login.failed",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return { data: loginResultData(result) };
|
|
96
|
+
}
|
|
97
|
+
export async function handleInitWizard(ctx, argv) {
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = parseProjectInitArgv(argv);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
104
|
+
category: "usage",
|
|
105
|
+
code: "cli.usage.invalid_init",
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (parsed === "help") {
|
|
109
|
+
throw new CliError(templateInitUsage(), { category: "usage", code: "cli.help" });
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
if (parsed.template) {
|
|
113
|
+
const result = await copyTemplateToDirectory({
|
|
114
|
+
cwd: ctx.cwd,
|
|
115
|
+
templateId: normalizeTemplateId(parsed.template),
|
|
116
|
+
framework: parsed.framework,
|
|
117
|
+
force: parsed.force,
|
|
118
|
+
writeStdout(line) {
|
|
119
|
+
if (ctx.globals.format !== "json") {
|
|
120
|
+
ctx.stdout.write(`${line}\n`);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
return { data: result };
|
|
125
|
+
}
|
|
126
|
+
const { template: _template, ...wizardOptions } = parsed;
|
|
127
|
+
const result = await runProjectInit({
|
|
128
|
+
cwd: ctx.cwd,
|
|
129
|
+
...wizardOptions,
|
|
130
|
+
writeStdout(line) {
|
|
131
|
+
if (ctx.globals.format !== "json") {
|
|
132
|
+
ctx.stdout.write(`${line}\n`);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
return { data: result };
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
140
|
+
category: "validation",
|
|
141
|
+
code: "cli.init.failed",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function handleInitGuardrail(ctx, argv) {
|
|
146
|
+
return handleInitScaffold(ctx, argv, "paid-tool-guard", "paybond-paid-tool-guard.ts");
|
|
147
|
+
}
|
|
148
|
+
export async function handleInitAgentMiddleware(ctx, argv) {
|
|
149
|
+
return handleInitScaffold(ctx, argv, "agent-middleware", "paybond-agent-middleware.ts");
|
|
150
|
+
}
|
|
151
|
+
async function handleInitScaffold(ctx, argv, defaultPreset, defaultOut) {
|
|
152
|
+
const code = await runInitMain(["--preset", defaultPreset, ...argv]);
|
|
153
|
+
if (code !== 0) {
|
|
154
|
+
throw new CliError(`init ${defaultPreset} failed`, { category: "validation", code: "cli.init.failed", exitCode: code });
|
|
155
|
+
}
|
|
156
|
+
const outFlag = consumeFlag(argv, "--out");
|
|
157
|
+
const frameworkFlag = consumeFlag(argv, "--framework");
|
|
158
|
+
return {
|
|
159
|
+
data: {
|
|
160
|
+
out: outFlag.value ?? defaultOut,
|
|
161
|
+
preset: defaultPreset,
|
|
162
|
+
framework: frameworkFlag.value ?? (defaultPreset === "agent-middleware" ? "generic" : "provider-agnostic"),
|
|
163
|
+
bytes_written: true,
|
|
164
|
+
completion_preset: "cost_and_completion",
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export async function handleInitCompletion(ctx, argv) {
|
|
169
|
+
let parsed;
|
|
170
|
+
try {
|
|
171
|
+
const result = parseCompletionInitArgs(argv);
|
|
172
|
+
if (result === "help") {
|
|
173
|
+
throw new CliError("help", { category: "usage", code: "cli.help" });
|
|
174
|
+
}
|
|
175
|
+
parsed = result;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
179
|
+
category: "usage",
|
|
180
|
+
code: "cli.usage.invalid_init_completion",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
await scaffoldCompletionInit(parsed);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
188
|
+
category: "validation",
|
|
189
|
+
code: "cli.init.failed",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
data: {
|
|
194
|
+
out: parsed.out,
|
|
195
|
+
preset: parsed.preset,
|
|
196
|
+
bytes_written: true,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export async function handleMcpServe(ctx, argv) {
|
|
201
|
+
if (argv.length > 0 && argv[0] !== "--help" && argv[0] !== "-h") {
|
|
202
|
+
throw new CliError(`unexpected arguments: ${argv.join(" ")}`, { category: "usage", code: "cli.usage.unexpected_args" });
|
|
203
|
+
}
|
|
204
|
+
ctx.stderr.write("Starting Paybond MCP stdio server (stdout is reserved for MCP JSON-RPC).\n");
|
|
205
|
+
const code = runMcpServerMain([]);
|
|
206
|
+
if (code !== 0) {
|
|
207
|
+
throw new CliError("mcp serve failed", { category: "internal", code: "cli.mcp.serve_failed", exitCode: code });
|
|
208
|
+
}
|
|
209
|
+
return { data: { started: true } };
|
|
210
|
+
}
|
|
211
|
+
export async function handleMcpTools(ctx) {
|
|
212
|
+
const server = new PaybondMCPServer({ gatewayBaseUrl: ctx.globals.gateway, apiKey: "paybond_sk_sandbox_redacted_redacted_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" });
|
|
213
|
+
const tools = server.listTools().map((tool) => ({
|
|
214
|
+
name: tool.name,
|
|
215
|
+
title: tool.title ?? tool.name,
|
|
216
|
+
description: tool.description,
|
|
217
|
+
}));
|
|
218
|
+
return { data: { tools } };
|
|
219
|
+
}
|
|
220
|
+
export async function handleMcpInstall(ctx, argv) {
|
|
221
|
+
const hostFlag = consumeFlag(argv, "--host");
|
|
222
|
+
const formatFlag = consumeFlag(argv, "--format");
|
|
223
|
+
const scopeFlag = consumeFlag(argv, "--scope");
|
|
224
|
+
const outFlag = consumeFlag(argv, "--out");
|
|
225
|
+
const envFileFlag = consumeFlag(argv, "--env-file");
|
|
226
|
+
const toolPolicyFlag = consumeFlag(argv, "--tool-policy");
|
|
227
|
+
const toolAllowlistFlag = consumeFlag(argv, "--tool-allowlist");
|
|
228
|
+
let format;
|
|
229
|
+
let scope;
|
|
230
|
+
let installHost;
|
|
231
|
+
let toolPolicy;
|
|
232
|
+
try {
|
|
233
|
+
installHost = parseMcpInstallHost(hostFlag.value);
|
|
234
|
+
format = parseMcpInstallFormat(formatFlag.value, installHost);
|
|
235
|
+
scope = parseMcpInstallScope(scopeFlag.value);
|
|
236
|
+
toolPolicy = mergeMcpToolPolicy(parseMcpToolPolicy(toolPolicyFlag.value), parseMcpToolAllowlist(toolAllowlistFlag.value));
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
240
|
+
category: "usage",
|
|
241
|
+
code: "cli.usage.invalid_mcp_install",
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const plan = planMcpInstall({
|
|
245
|
+
host: installHost,
|
|
246
|
+
scope,
|
|
247
|
+
format,
|
|
248
|
+
envFile: envFileFlag.value ?? ctx.globals.envFile,
|
|
249
|
+
out: outFlag.value,
|
|
250
|
+
cwd: ctx.cwd,
|
|
251
|
+
home: process.env.HOME ?? process.env.USERPROFILE ?? ctx.cwd,
|
|
252
|
+
toolPolicy: resolveMcpToolPolicy(toolPolicy),
|
|
253
|
+
});
|
|
254
|
+
if (plan.printed) {
|
|
255
|
+
if (ctx.globals.format !== "json") {
|
|
256
|
+
ctx.stdout.write(plan.payload);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const configPath = plan.configPath;
|
|
261
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
262
|
+
const { writeAtomicFileAsync } = await import("../automation.js");
|
|
263
|
+
await writeAtomicFileAsync(configPath, plan.payload, 0o600);
|
|
264
|
+
}
|
|
265
|
+
const data = {
|
|
266
|
+
host: plan.host,
|
|
267
|
+
scope: plan.scope,
|
|
268
|
+
format: plan.format,
|
|
269
|
+
config_path: plan.configPath,
|
|
270
|
+
server_command: plan.serverCommand.join(" "),
|
|
271
|
+
printed: plan.printed,
|
|
272
|
+
};
|
|
273
|
+
if (plan.toolPolicy?.policy) {
|
|
274
|
+
data.tool_policy = plan.toolPolicy.policy;
|
|
275
|
+
if (plan.toolPolicy.allowlist.length > 0) {
|
|
276
|
+
data.tool_allowlist = [...plan.toolPolicy.allowlist];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (plan.printed && ctx.globals.format === "json") {
|
|
280
|
+
data.payload = plan.payload;
|
|
281
|
+
}
|
|
282
|
+
return { data };
|
|
283
|
+
}
|
|
284
|
+
export async function handleMcpVerifyConfig(ctx, argv) {
|
|
285
|
+
const hostFlag = consumeFlag(argv, "--host");
|
|
286
|
+
const formatFlag = consumeFlag(argv, "--format");
|
|
287
|
+
const envFileFlag = consumeFlag(argv, "--env-file");
|
|
288
|
+
const configFlag = consumeFlag(argv, "--config");
|
|
289
|
+
let installHost;
|
|
290
|
+
let format;
|
|
291
|
+
try {
|
|
292
|
+
installHost = parseMcpInstallHost(hostFlag.value);
|
|
293
|
+
format = parseMcpInstallFormat(formatFlag.value, installHost);
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
throw new CliError(err instanceof Error ? err.message : String(err), {
|
|
297
|
+
category: "usage",
|
|
298
|
+
code: "cli.usage.invalid_mcp_verify_config",
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
const result = await verifyMcpInstallPlan({
|
|
302
|
+
host: installHost,
|
|
303
|
+
format,
|
|
304
|
+
envFile: envFileFlag.value ?? ctx.globals.envFile,
|
|
305
|
+
cwd: ctx.cwd,
|
|
306
|
+
home: process.env.HOME ?? process.env.USERPROFILE ?? ctx.cwd,
|
|
307
|
+
configPath: configFlag.value,
|
|
308
|
+
});
|
|
309
|
+
return {
|
|
310
|
+
data: {
|
|
311
|
+
ok: result.ok,
|
|
312
|
+
host: result.host,
|
|
313
|
+
source: result.source,
|
|
314
|
+
config_path: result.configPath,
|
|
315
|
+
message: result.message,
|
|
316
|
+
issues: result.issues,
|
|
317
|
+
tool_policy: result.toolPolicy?.policy ?? null,
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
export async function handleDoctor(ctx, argv) {
|
|
322
|
+
const agentFlag = consumeBooleanFlag(argv, "--agent");
|
|
323
|
+
const hostFlag = consumeFlag(agentFlag.rest, "--host");
|
|
324
|
+
const checks = [];
|
|
325
|
+
const defaults = resolvedDefaultsForDoctor(ctx.globals);
|
|
326
|
+
checks.push({
|
|
327
|
+
name: "runtime",
|
|
328
|
+
ok: true,
|
|
329
|
+
message: `node ${process.version}`,
|
|
330
|
+
});
|
|
331
|
+
checks.push({
|
|
332
|
+
name: "package",
|
|
333
|
+
ok: true,
|
|
334
|
+
message: "@paybond/kit",
|
|
335
|
+
details: { version: packageVersion() },
|
|
336
|
+
});
|
|
337
|
+
const envPath = path.isAbsolute(defaults.envFile)
|
|
338
|
+
? path.resolve(defaults.envFile)
|
|
339
|
+
: path.resolve(ctx.cwd, defaults.envFile);
|
|
340
|
+
try {
|
|
341
|
+
await readFile(envPath, "utf8");
|
|
342
|
+
checks.push({ name: "env_file", ok: true, message: envPath });
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
checks.push({ name: "env_file", ok: false, message: `env file not found: ${envPath}` });
|
|
346
|
+
}
|
|
347
|
+
let apiKey = "";
|
|
348
|
+
try {
|
|
349
|
+
apiKey = await resolveApiKey(ctx.globals, ctx.cwd);
|
|
350
|
+
assertApiKeyShape(apiKey);
|
|
351
|
+
checks.push({ name: "key_shape", ok: true, message: maskApiKey(apiKey) });
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
355
|
+
checks.push({ name: "key_shape", ok: false, message });
|
|
356
|
+
}
|
|
357
|
+
if (apiKey) {
|
|
358
|
+
try {
|
|
359
|
+
await withGateway(ctx, async (gateway) => {
|
|
360
|
+
await gateway.getJson("/v1/auth/principal");
|
|
361
|
+
return { data: {} };
|
|
362
|
+
});
|
|
363
|
+
checks.push({ name: "principal", ok: true, message: "principal lookup succeeded" });
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
checks.push({
|
|
367
|
+
name: "principal",
|
|
368
|
+
ok: false,
|
|
369
|
+
message: err instanceof Error ? err.message : String(err),
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (agentFlag.present) {
|
|
374
|
+
if (!apiKey) {
|
|
375
|
+
for (const name of [
|
|
376
|
+
"mcp_host_config",
|
|
377
|
+
"mcp_env_resolution",
|
|
378
|
+
"mcp_launch",
|
|
379
|
+
"mcp_initialize",
|
|
380
|
+
"mcp_tools_list",
|
|
381
|
+
"mcp_tool_schemas",
|
|
382
|
+
"mcp_stdout_purity",
|
|
383
|
+
]) {
|
|
384
|
+
checks.push({ name, ok: false, message: "skipped MCP probe (missing API key)" });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
const agentChecks = await runAgentMcpChecks({
|
|
389
|
+
envFile: defaults.envFile,
|
|
390
|
+
cwd: ctx.cwd,
|
|
391
|
+
host: hostFlag.value ?? "generic",
|
|
392
|
+
});
|
|
393
|
+
checks.push(...agentChecks);
|
|
394
|
+
}
|
|
395
|
+
if (apiKey) {
|
|
396
|
+
checks.push(await runAgentMiddlewareDoctorCheck(ctx, apiKey));
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
checks.push({
|
|
400
|
+
name: "agent_middleware_smoke",
|
|
401
|
+
ok: false,
|
|
402
|
+
message: "skipped (missing API key)",
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const completionChecks = await runCompletionCatalogDoctorChecks({
|
|
407
|
+
cwd: ctx.cwd,
|
|
408
|
+
gateway: apiKey
|
|
409
|
+
? {
|
|
410
|
+
async getJson(path) {
|
|
411
|
+
const result = await withGateway(ctx, async (gateway) => {
|
|
412
|
+
const body = await gateway.getJson(path);
|
|
413
|
+
return { data: body };
|
|
414
|
+
});
|
|
415
|
+
return result.data;
|
|
416
|
+
},
|
|
417
|
+
}
|
|
418
|
+
: undefined,
|
|
419
|
+
});
|
|
420
|
+
checks.push(...completionChecks);
|
|
421
|
+
const summary = checks.every((check) => check.ok) ? "pass" : "fail";
|
|
422
|
+
return { data: { checks, summary } };
|
|
423
|
+
}
|
|
424
|
+
export async function handleConfig(ctx, subcommand, argv) {
|
|
425
|
+
if (subcommand === "list") {
|
|
426
|
+
const entries = await listConfigEntries(ctx.globals.profile);
|
|
427
|
+
return { data: { entries } };
|
|
428
|
+
}
|
|
429
|
+
if (subcommand === "get") {
|
|
430
|
+
const key = argv[0];
|
|
431
|
+
if (!key) {
|
|
432
|
+
throw new CliError("config get requires <key>", { category: "usage", code: "cli.usage.missing_key" });
|
|
433
|
+
}
|
|
434
|
+
const value = await resolveConfigValue(key, ctx.globals.profile);
|
|
435
|
+
if (value === undefined) {
|
|
436
|
+
throw new CliError(`config key not found: ${key}`, { category: "not_found", code: "cli.config.not_found" });
|
|
437
|
+
}
|
|
438
|
+
return { data: { key, value: redactConfigValue(key, value) } };
|
|
439
|
+
}
|
|
440
|
+
if (subcommand === "set") {
|
|
441
|
+
const key = argv[0];
|
|
442
|
+
const value = argv[1];
|
|
443
|
+
if (!key || value === undefined) {
|
|
444
|
+
throw new CliError("config set requires <key> <value>", { category: "usage", code: "cli.usage.missing_args" });
|
|
445
|
+
}
|
|
446
|
+
await setConfigValue(key, value, ctx.globals.profile);
|
|
447
|
+
return { data: { key, set: true } };
|
|
448
|
+
}
|
|
449
|
+
if (subcommand === "unset") {
|
|
450
|
+
const key = argv[0];
|
|
451
|
+
if (!key) {
|
|
452
|
+
throw new CliError("config unset requires <key>", { category: "usage", code: "cli.usage.missing_key" });
|
|
453
|
+
}
|
|
454
|
+
const removed = await unsetConfigValue(key, ctx.globals.profile);
|
|
455
|
+
return { data: { key, removed } };
|
|
456
|
+
}
|
|
457
|
+
throw new CliError(`unknown config subcommand: ${subcommand}`, { category: "usage", code: "cli.usage.unknown_command" });
|
|
458
|
+
}
|
|
459
|
+
export async function handleWhoami(ctx) {
|
|
460
|
+
return withGateway(ctx, async (gateway) => {
|
|
461
|
+
const principal = await gateway.getJson("/v1/auth/principal");
|
|
462
|
+
const stripped = { ...principal };
|
|
463
|
+
delete stripped.access_token;
|
|
464
|
+
delete stripped.refresh_token;
|
|
465
|
+
return {
|
|
466
|
+
data: {
|
|
467
|
+
tenant_id: String(principal.tenant_id ?? ""),
|
|
468
|
+
tenant_uuid: String(principal.tenant_uuid ?? ""),
|
|
469
|
+
environment: String(principal.environment ?? ""),
|
|
470
|
+
service_account_role: String(principal.service_account_role ?? ""),
|
|
471
|
+
principal: stripped,
|
|
472
|
+
},
|
|
473
|
+
};
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
export async function handleVersion(ctx, argv) {
|
|
477
|
+
const verboseFlag = consumeBooleanFlag(argv, "--verbose");
|
|
478
|
+
if (verboseFlag.rest.length > 0) {
|
|
479
|
+
throw new CliError(`unexpected arguments: ${verboseFlag.rest.join(" ")}`, {
|
|
480
|
+
category: "usage",
|
|
481
|
+
code: "cli.usage.unexpected_args",
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
if (verboseFlag.present) {
|
|
485
|
+
const diagnostics = await buildSupportDiagnostics(ctx);
|
|
486
|
+
return { data: diagnostics };
|
|
487
|
+
}
|
|
488
|
+
return { data: { version: packageVersion() } };
|
|
489
|
+
}
|
|
490
|
+
export async function handleDiagnose(ctx, argv) {
|
|
491
|
+
const redactedFlag = consumeBooleanFlag(argv, "--redacted");
|
|
492
|
+
if (redactedFlag.rest.length > 0) {
|
|
493
|
+
throw new CliError(`unexpected arguments: ${redactedFlag.rest.join(" ")}`, {
|
|
494
|
+
category: "usage",
|
|
495
|
+
code: "cli.usage.unexpected_args",
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
if (!redactedFlag.present) {
|
|
499
|
+
throw new CliError("paybond diagnose requires --redacted for support bundles", {
|
|
500
|
+
category: "usage",
|
|
501
|
+
code: "cli.diagnose.redacted_required",
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
const diagnostics = await buildSupportDiagnostics(ctx);
|
|
505
|
+
return {
|
|
506
|
+
data: {
|
|
507
|
+
redacted: true,
|
|
508
|
+
diagnostics,
|
|
509
|
+
lines: formatSupportDiagnosticsTable(diagnostics),
|
|
510
|
+
},
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
export { readJsonFile, commandPath };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { commandPath, type CliContext } from "../context.js";
|
|
2
|
+
import { type CommandResult } from "../types.js";
|
|
3
|
+
export declare function handleKeys(ctx: CliContext, subcommand: string, argv: string[]): Promise<CommandResult>;
|
|
4
|
+
export declare function handleIntents(ctx: CliContext, subcommand: string, argv: string[]): Promise<CommandResult>;
|
|
5
|
+
export declare function handleGuardrails(ctx: CliContext, subcommand: string, argv: string[]): Promise<CommandResult>;
|
|
6
|
+
export declare function handleSpendAuthorize(ctx: CliContext, argv: string[]): Promise<CommandResult>;
|
|
7
|
+
export { commandPath };
|