diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd6d808..a9ebd3d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: run: go test ./... - name: Build CLI - run: go build ./cmd/metorial + run: go build ./cmd/metorial && go build ./cmd/metorial-admin - name: Install npm workspace dependencies run: bun install --frozen-lockfile diff --git a/.goreleaser.yml b/.goreleaser.yml index 6f10081..7fc794f 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -35,11 +35,40 @@ builds: - amd64 - arm64 + - id: metorial-admin + main: ./cmd/metorial-admin + binary: metorial-admin + env: + - CGO_ENABLED=0 + ldflags: + - -s -w + - -X github.com/metorial/cli/internal/version.Version={{ .Version }} + - -X github.com/metorial/cli/internal/version.Commit={{ .Commit }} + - -X github.com/metorial/cli/internal/version.Date={{ .Date }} + goos: + - darwin + - linux + - windows + goarch: + - amd64 + - arm64 + archives: - - id: default + - id: metorial builds: - metorial - name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}' + name_template: 'metorial_{{ .Version }}_{{ .Os }}_{{ .Arch }}' + formats: + - tar.gz + format_overrides: + - goos: windows + formats: + - zip + + - id: metorial-admin + builds: + - metorial-admin + name_template: 'metorial-admin_{{ .Version }}_{{ .Os }}_{{ .Arch }}' formats: - tar.gz format_overrides: @@ -52,6 +81,8 @@ checksum: brews: - name: metorial + ids: + - metorial repository: owner: metorial name: homebrew-tap @@ -61,7 +92,7 @@ brews: enabled: true directory: Formula homepage: https://metorial.com - description: Official CLI for the Metorial platform + description: Official CLI for Metorial integrations and MCP tools license: MIT commit_author: name: metorial-bot @@ -71,8 +102,32 @@ brews: install: | bin.install "metorial" + - name: metorial-admin + ids: + - metorial-admin + repository: + owner: metorial + name: homebrew-tap + token: '{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}' + branch: goreleaser-homebrew-admin-{{ .Version }} + pull_request: + enabled: true + directory: Formula + homepage: https://metorial.com + description: Official admin CLI for the Metorial Magnetar API + license: MIT + commit_author: + name: metorial-bot + email: hey@metorial.com + test: | + system "#{bin}/metorial-admin", "version" + install: | + bin.install "metorial-admin" + scoops: - name: metorial + ids: + - metorial repository: owner: metorial name: scoop-bucket @@ -81,29 +136,28 @@ scoops: pull_request: enabled: true homepage: https://metorial.com - description: Official CLI for the Metorial platform + description: Official CLI for Metorial integrations and MCP tools license: MIT commit_author: name: metorial-bot email: hey@metorial.com -# chocolateys: -# - name: metorial -# title: Metorial CLI -# authors: Metorial Inc. -# project_url: https://metorial.com -# url_template: 'https://github.com/metorial/cli/releases/download/{{ .Tag }}/{{ .ArtifactName }}' -# copyright: 2026 Metorial Inc. -# license_url: https://github.com/metorial/cli/blob/main/LICENSE -# project_source_url: https://github.com/metorial/cli -# docs_url: https://metorial.com/docs -# bug_tracker_url: https://github.com/metorial/cli/issues -# release_notes: https://github.com/metorial/cli/releases/tag/{{ .Tag }} -# summary: Official CLI for the Metorial platform -# description: The Metorial CLI lets you authenticate, inspect resources, and work with the Metorial platform from your terminal. -# tags: metorial cli ai mcp -# api_key: '{{ .Env.CHOCOLATEY_API_KEY }}' -# source_repo: https://push.chocolatey.org/ + - name: metorial-admin + ids: + - metorial-admin + repository: + owner: metorial + name: scoop-bucket + token: '{{ .Env.SCOOP_BUCKET_GITHUB_TOKEN }}' + branch: goreleaser-scoop-admin-{{ .Version }} + pull_request: + enabled: true + homepage: https://metorial.com + description: Official admin CLI for the Metorial Magnetar API + license: MIT + commit_author: + name: metorial-bot + email: hey@metorial.com changelog: sort: asc diff --git a/Makefile b/Makefile index bb022e8..6cda9d1 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,24 @@ CLI_NAME := metorial +ADMIN_NAME := metorial-admin BIN_DIR := bin BIN := $(BIN_DIR)/$(CLI_NAME) +ADMIN_BIN := $(BIN_DIR)/$(ADMIN_NAME) PKG := ./cmd/metorial +ADMIN_PKG := ./cmd/metorial-admin -.PHONY: help build run fmt test tidy check install clean completion-bash completion-zsh completion-fish completion-powershell release snapshot public +.PHONY: help build run fmt test tidy check install clean completion-bash completion-zsh completion-fish completion-powershell generate release snapshot public help: @printf "%s\n" \ "Available targets:" \ - " make build Build the CLI into ./bin/metorial" \ - " make run Run the CLI locally" \ + " make build Build both CLIs into ./bin" \ + " make run Run the consumer CLI locally" \ + " make generate Generate admin commands from Magnetar introspect" \ " make fmt Format all Go code" \ " make test Run CLI tests" \ " make tidy Sync go.mod and go.sum" \ " make check Run fmt, tidy, and tests" \ - " make install Install the CLI into GOPATH/bin" \ + " make install Install both CLIs into GOPATH/bin" \ " make clean Remove local build output" \ " make completion-bash Print bash completions" \ " make completion-zsh Print zsh completions" \ @@ -27,10 +31,14 @@ help: build: mkdir -p $(BIN_DIR) go build -o $(BIN) $(PKG) + go build -o $(ADMIN_BIN) $(ADMIN_PKG) run: go run $(PKG) +generate: + cd generator && bun run generate $${API_URL:-http://metorial-root.localhost:4310} + fmt: gofmt -w $$(find . -name '*.go' -print) @@ -44,6 +52,7 @@ check: fmt tidy test install: go install $(PKG) + go install $(ADMIN_PKG) clean: rm -rf $(BIN_DIR) diff --git a/README.md b/README.md index 9d9144b..135e0f9 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,29 @@ # Metorial CLI -Metorial CLI is the command line interface for Metorial. This CLI is built agent-first, meaning it is designed to be used both by developers directly and by agents that need to interact with Metorial resources and integrations. +Metorial ships two command line tools: -## Install +- **`metorial`** — consumer / agent CLI for discovering integrations and calling MCP tools +- **`metorial-admin`** — generated admin CLI for Magnetar API resources, raw requests, and examples -Choose the install method that matches how you normally manage tools. +Both are agent-first: they are meant to be used by developers and by agents. -### npm +## Install -Best if you already use Node.js and want `metorial` available globally. +### npm ```bash npm install -g @metorial/cli +npm install -g @metorial/admin ``` ### npx -Best for one-off usage or quick checks without a global install. - ```bash npx @metorial/cli@latest +npx @metorial/admin@latest ``` -### Bash Installer - -Best on macOS and Linux if you want the standalone CLI without depending on Node.js. +### Bash installer ```bash curl -fsSL https://cli.metorial.com/install.sh | bash @@ -32,172 +31,72 @@ curl -fsSL https://cli.metorial.com/install.sh | bash ### Homebrew -Best if you already manage command line tools with Homebrew. - ```bash brew install metorial/tap/metorial +brew install metorial/tap/metorial-admin ``` ### Scoop -Best for Windows setups that prefer Scoop. - ```powershell scoop bucket add metorial https://github.com/metorial/scoop-bucket scoop install metorial +scoop install metorial-admin ``` -### Start From An Example - -If you want to browse or create an official example project first: +### Start from an example ```bash npm create metorial@latest npm create metorial@latest [path] ``` -## Which Install Option Should I Use? +`create-metorial` delegates to `metorial-admin example`. -- Use `npm` if you want a standard global install in a Node.js environment. -- Use `npx` if you only need the CLI occasionally. -- Use the bash installer if you want a simple standalone install on macOS or Linux. -- Use `brew`, `choco`, or `scoop` if you already manage tools through that package manager. -- Use `npm create metorial@latest` if your main goal is to begin with an official sample project. +## Consumer CLI (`metorial`) -## Quick Start - -Install the CLI, then start here: +Sign in, then work with integrations and MCP tools: ```bash metorial login -metorial providers list -metorial deployments list -metorial sessions list -metorial integrations list -metorial example list -``` - -If you want the dashboard as well: - -```bash -metorial open -``` - -## Core Concepts In The CLI - -### Organizations, Projects, And Instances - -Metorial organizes work by organization, then project, then instance. In practice, an instance is usually the environment you are working against, such as development or production. - -When you browse resources in the CLI, you are usually looking at resources available in the current authenticated context and selected instance. - -### Providers - -Providers are the integrations you connect to Metorial. They define the tools, authentication methods, and configuration options available for a given integration. - -The CLI lets you inspect providers and related resources directly: - -```bash -metorial providers list -metorial providers get -``` - -### Deployments - -Deployments are the configured, ready-to-use instances of your providers. They are the core building blocks your applications use. - -Common commands: - -```bash -metorial deployments list -metorial deployments get -``` - -### Sessions - -Sessions are the runtime layer that connects your application to one or more providers. A session exposes the tools from the attached providers and is useful for testing, debugging, and understanding how your runtime setup behaves. - -Common commands: - -```bash -metorial sessions list -metorial sessions get -``` - -### Integrations - -Integrations help you discover, set up, and manage the providers available through Metorial. - -Common commands: - -```bash -metorial integrations list -metorial integrations catalog list -metorial integrations get -``` - -## Main Commands - -### Sign In - -```bash -metorial login -``` - -Starts the sign-in flow and saves your profile locally so the CLI can act on your behalf. - -### Explore Your Resources - -```bash -metorial providers list -metorial deployments list -metorial sessions list -metorial instance list -``` - -This is the fastest way to understand what is available in your account and environment. - -### Work With Integrations - -```bash metorial integrations list metorial integrations catalog list metorial integrations tools +metorial integrations call -d '{"query":"..."}' +metorial open ``` -Use these commands to review connected integrations, browse the catalog, and inspect the tools exposed by an integration. - -### Start From Official Examples - -```bash -metorial example list -metorial example create -``` - -Use examples when you want a working starting point instead of beginning from scratch. +Resource administration, `fetch`/`curl`, and `example` moved to `metorial-admin`. -Examples are also available through `npm create`. +## Admin CLI (`metorial-admin`) ```bash -npm create metorial@latest -npm create metorial@latest [path] +metorial-admin login +metorial-admin providers list +metorial-admin providers deployments list +metorial-admin sessions list +metorial-admin magic-mcp servers list +metorial-admin integrations setup +metorial-admin outposts credentials create --name laptop +metorial-admin fetch /providers +metorial-admin example list ``` -### Send Authenticated API Requests +Admin commands are generated from the Magnetar API. To regenerate them (requires a running API): ```bash -metorial fetch +make generate ``` -Useful when you want to inspect an API response directly from the terminal while keeping the same authenticated context. +The generator reads `manifest/admin.yaml` and writes `internal/generated/admin/catalog.go`. ## Help -Use built-in help to discover commands as you go: - ```bash metorial --help +metorial-admin --help metorial --help +metorial-admin --help ``` ## Learn More diff --git a/bun.lock b/bun.lock index e18c645..1bf8bd9 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "@metorial/cli-workspace", @@ -30,6 +31,16 @@ "@metorial/cli-core": "workspace:*", }, }, + "npm/cli-admin": { + "name": "@metorial/admin", + "version": "0.0.0-dev", + "bin": { + "metorial-admin": "./dist/bin.cjs", + }, + "dependencies": { + "@metorial/cli-core": "workspace:*", + }, + }, "npm/cli-core": { "name": "@metorial/cli-core", "version": "0.0.0-dev", @@ -142,6 +153,8 @@ "@metorial/cli": ["@metorial/cli@workspace:npm/cli"], + "@metorial/admin": ["@metorial/admin@workspace:npm/cli-admin"], + "@metorial/cli-core": ["@metorial/cli-core@workspace:npm/cli-core"], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="], diff --git a/cmd/metorial-admin/main.go b/cmd/metorial-admin/main.go new file mode 100644 index 0000000..dca834a --- /dev/null +++ b/cmd/metorial-admin/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "os" + + "github.com/metorial/cli/internal/cli" +) + +func main() { + os.Exit(cli.RunAdmin()) +} diff --git a/generator/package.json b/generator/package.json new file mode 100644 index 0000000..ca988ea --- /dev/null +++ b/generator/package.json @@ -0,0 +1,12 @@ +{ + "name": "@metorial/cli-generator", + "private": true, + "type": "module", + "scripts": { + "generate": "bun ./src/index.ts", + "start": "bun ./src/index.ts" + }, + "devDependencies": { + "@types/bun": "latest" + } +} diff --git a/generator/src/case.ts b/generator/src/case.ts new file mode 100644 index 0000000..fa233ad --- /dev/null +++ b/generator/src/case.ts @@ -0,0 +1,44 @@ +export let camelToKebab = (value: string) => { + return value + .replace(/_/g, '-') + .replace(/([a-z0-9])([A-Z])/g, '$1-$2') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2') + .toLowerCase(); +}; + +export let kebabToCamel = (value: string) => { + return value.replace(/[-_]([a-z0-9])/g, (_, char: string) => char.toUpperCase()); +}; + +export let toKebab = (value: string) => camelToKebab(value); + +export let normalizeSdkPath = (sdkPath: string) => + sdkPath + .split('.') + .map(part => camelToKebab(part)) + .join('.'); + +export let stripSdkPath = (sdkPath: string) => { + let path = sdkPath; + if (path.startsWith('management.instance.')) { + path = path.slice('management.instance.'.length); + } else if (path.startsWith('management.organization.')) { + path = path.slice('management.organization.'.length); + } + return path; +}; + +export let splitResourceMethod = (sdkPath: string) => { + let parts = sdkPath.split('.'); + let method = parts.pop() || ''; + return { + resource: parts.join('.'), + method + }; +}; + +export let pathPlaceholders = (path: string) => + path + .split('/') + .filter(part => part.startsWith(':') && part.length > 1) + .map(part => part.slice(1)); diff --git a/generator/src/emit/catalog.go.ts b/generator/src/emit/catalog.go.ts new file mode 100644 index 0000000..9d91a96 --- /dev/null +++ b/generator/src/emit/catalog.go.ts @@ -0,0 +1,110 @@ +import type { MappedArg, MappedFlag, MappedOperation, MappedResource } from './join'; + +let flagTypeName: Record = { + string: 'resourcecmd.FlagString', + bool: 'resourcecmd.FlagBool', + int: 'resourcecmd.FlagInt', + float: 'resourcecmd.FlagFloat', + 'string-slice': 'resourcecmd.FlagStringSlice', + json: 'resourcecmd.FlagJSON', + 'json-file': 'resourcecmd.FlagJSONFile' +}; + +export let emitCatalogGo = (resources: MappedResource[]) => { + let body = resources.map(resource => emitResource(resource, 1)).join(',\n'); + + return `// Code generated by oss/cli/generator. DO NOT EDIT. + +package admin + +import "github.com/metorial/cli/internal/resourcecmd" + +func Catalog() []resourcecmd.ResourceSpec { + return []resourcecmd.ResourceSpec{ +${body}, + } +} +`; +}; + +let emitResource = (resource: MappedResource, indent: number): string => { + let pad = '\t'.repeat(indent); + let inner = '\t'.repeat(indent + 1); + let lines = [ + `${pad}{`, + `${inner}Plural: ${goString(resource.plural)},`, + `${inner}Singular: ${goString(resource.singular)},`, + `${inner}Short: ${goString(resource.short)},`, + `${inner}Long: ${goString(resource.long)},` + ]; + + if (resource.aliases.length) { + lines.push(`${inner}Aliases: []string{${resource.aliases.map(goString).join(', ')}},`); + } + + lines.push(`${inner}Operations: []resourcecmd.OperationSpec{`); + if (resource.operations.length) { + lines.push(resource.operations.map(operation => emitOperation(operation, indent + 2)).join(',\n') + ','); + } + lines.push(`${inner}},`); + + if (resource.shortcuts.length) { + lines.push(`${inner}Shortcuts: []resourcecmd.ShortcutSpec{`); + for (let shortcut of resource.shortcuts) { + lines.push( + `${inner}\t{Path: []string{${shortcut.path.map(goString).join(', ')}}, Method: ${goString(shortcut.method)}},` + ); + } + lines.push(`${inner}},`); + } + + if (resource.children.length) { + lines.push(`${inner}Children: []resourcecmd.ResourceSpec{`); + lines.push(resource.children.map(child => emitResource(child, indent + 2)).join(',\n') + ','); + lines.push(`${inner}},`); + } + + lines.push(`${pad}}`); + return lines.join('\n'); +}; + +let emitOperation = (operation: MappedOperation, indent: number) => { + let pad = '\t'.repeat(indent); + let inner = '\t'.repeat(indent + 1); + let lines = [ + `${pad}{`, + `${inner}Name: ${goString(operation.name)},`, + `${inner}Method: ${goString(operation.method)},`, + `${inner}Path: ${goString(operation.path)},`, + `${inner}Short: ${goString(operation.short)},`, + `${inner}Long: ${goString(operation.long)},`, + `${inner}SDKMapping: ${goString(operation.sdkMapping)},` + ]; + + if (operation.args.length) { + lines.push(`${inner}Args: []resourcecmd.ArgumentSpec{`); + for (let arg of operation.args) { + lines.push(`${inner}\t${emitArg(arg)},`); + } + lines.push(`${inner}},`); + } + + if (operation.flags.length) { + lines.push(`${inner}Flags: []resourcecmd.FlagSpec{`); + for (let flag of operation.flags) { + lines.push(`${inner}\t${emitFlag(flag)},`); + } + lines.push(`${inner}},`); + } + + lines.push(`${pad}}`); + return lines.join('\n'); +}; + +let emitArg = (arg: MappedArg) => + `{Name: ${goString(arg.name)}, Target: ${goString(arg.target)}, Required: ${arg.required}, Description: ${goString(arg.description)}}`; + +let emitFlag = (flag: MappedFlag) => + `{Name: ${goString(flag.name)}, Type: ${flagTypeName[flag.type]}, Target: ${goString(flag.target)}, Usage: ${goString(flag.usage)}, Required: ${flag.required}, Repeated: ${flag.repeated}}`; + +let goString = (value: string) => JSON.stringify(value || ''); diff --git a/generator/src/fetch.ts b/generator/src/fetch.ts new file mode 100644 index 0000000..3952c15 --- /dev/null +++ b/generator/src/fetch.ts @@ -0,0 +1,48 @@ +export type IntrospectedType = { + examples: any[]; + items?: IntrospectedType[]; + properties?: Record; + type: string; + name?: string; + description?: string; + optional: boolean; + nullable: boolean; +}; + +export type Endpoint = { + method: string; + name: string; + description: string; + allPaths: { path: string; sdkPath: string }[]; + queryId?: string | null; + bodyId?: string | null; + outputId: string; + controllerId: string; +}; + +export type Controller = { + id: string; + name: string; + description: string; +}; + +export type IntrospectPayload = { + endpoints: Endpoint[]; + controllers: Controller[]; + types: { + id: string; + name: string; + type: IntrospectedType; + }[]; +}; + +export let getEndpointVersions = async (url: string) => + (await fetch(new URL('/metorial/introspect/versions', url)).then(res => res.json())) as { + versions: { version: string; displayVersion: string; isCurrent: boolean }[]; + }; + +export let getEndpoints = async (url: string, version: string) => { + return (await fetch( + new URL(`/metorial/introspect/endpoints?version=${version}`, url) + ).then(res => res.json())) as IntrospectPayload; +}; diff --git a/generator/src/index.ts b/generator/src/index.ts new file mode 100644 index 0000000..ee6b120 --- /dev/null +++ b/generator/src/index.ts @@ -0,0 +1,57 @@ +import path from 'node:path'; +import { $ } from 'bun'; +import { emitCatalogGo } from './emit/catalog.go'; +import { getEndpoints, getEndpointVersions } from './fetch'; +import { joinManifest } from './join'; +import { loadManifest } from './manifest'; + +let repoRoot = path.resolve(import.meta.dir, '../..'); +let defaultUrls = [ + process.env.API_URL, + 'http://metorial-root.localhost:4310', + 'http://localhost:4310' +].filter(Boolean) as string[]; + +let args = process.argv.slice(2); +let urlArg = args.find(arg => !arg.startsWith('-')); +let urls = urlArg ? urlArg.split(',') : defaultUrls; + +let workingUrl = await resolveUrl(urls); +if (!workingUrl) { + throw new Error(`None of the API URLs are reachable: ${urls.join(', ')}`); +} + +let manifestPath = path.join(repoRoot, 'manifest/admin.yaml'); +let manifest = await loadManifest(manifestPath); +let versions = await getEndpointVersions(workingUrl); +let version = + versions.versions.find(item => item.version === manifest.apiVersion) || + versions.versions.find(item => item.version.includes('magnetar')); + +if (!version) { + throw new Error(`API at ${workingUrl} does not expose ${manifest.apiVersion}`); +} + +let payload = await getEndpoints(workingUrl, version.version); +let catalog = joinManifest({ + manifest, + endpoints: payload.endpoints, + controllers: payload.controllers, + types: payload.types +}); + +let outputPath = path.join(repoRoot, 'internal/generated/admin/catalog.go'); +await Bun.write(outputPath, emitCatalogGo(catalog)); +await $`gofmt -w ${outputPath}`; + +console.log(`Wrote ${outputPath} from ${workingUrl} (${version.version})`); + +async function resolveUrl(candidates: string[]) { + for (let url of candidates) { + try { + let response = await fetch(new URL('/metorial/introspect/versions', url)); + if (response.ok) return url; + } catch {} + } + return null; +} diff --git a/generator/src/join.ts b/generator/src/join.ts new file mode 100644 index 0000000..8599267 --- /dev/null +++ b/generator/src/join.ts @@ -0,0 +1,416 @@ +import type { ArgOverride, CommandEntry, Manifest } from './manifest'; +import type { Controller, Endpoint, IntrospectedType } from './fetch'; +import { + camelToKebab, + normalizeSdkPath, + pathPlaceholders, + splitResourceMethod, + stripSdkPath +} from './case'; + +export type FlagKind = 'string' | 'bool' | 'int' | 'float' | 'string-slice' | 'json' | 'json-file'; + +export type MappedArg = { + name: string; + target: string; + required: boolean; + description: string; +}; + +export type MappedFlag = { + name: string; + type: FlagKind; + target: string; + usage: string; + required: boolean; + repeated: boolean; +}; + +export type MappedOperation = { + name: string; + method: string; + path: string; + short: string; + long: string; + args: MappedArg[]; + flags: MappedFlag[]; + sdkMapping: string; +}; + +export type MappedResource = { + path: string[]; + plural: string; + singular: string; + short: string; + long: string; + aliases: string[]; + operations: MappedOperation[]; + shortcuts: { path: string[]; method: string }[]; + children: MappedResource[]; +}; + +type PublicEndpoint = Endpoint & { + sdkPath: string; + httpPath: string; +}; + +let paginationFields = new Set(['limit', 'after', 'before', 'cursor', 'order']); + +export let joinManifest = (input: { + manifest: Manifest; + endpoints: Endpoint[]; + controllers: Controller[]; + types: { id: string; type: IntrospectedType }[]; +}): MappedResource[] => { + let publicEndpoints = collectPublicEndpoints(input.endpoints, input.manifest); + let types = new Map(input.types.map(type => [type.id, type.type])); + let controllers = new Map(input.controllers.map(controller => [controller.id, controller])); + + let mapped: { entry: CommandEntry; resource: MappedResource }[] = []; + + for (let entry of input.manifest.commands) { + if (entry.group) { + mapped.push({ + entry, + resource: { + path: entry.path, + plural: entry.path[entry.path.length - 1], + singular: entry.path[entry.path.length - 1], + short: entry.short || entry.path.join(' '), + long: entry.long || '', + aliases: entry.aliases || [], + operations: [], + shortcuts: [], + children: [] + } + }); + continue; + } + + if (!entry.resource) { + throw new Error(`manifest command ${entry.path.join(' ')} is missing resource`); + } + + let wanted = normalizeSdkPath(entry.resource); + let matches = publicEndpoints.filter(endpoint => { + let { resource, method } = splitResourceMethod(normalizeSdkPath(endpoint.sdkPath)); + if (resource !== wanted) return false; + if (!entry.include?.length) return true; + return entry.include.some(name => camelToKebab(name) === camelToKebab(method)); + }); + + if (matches.length === 0) { + throw new Error( + `manifest command ${entry.path.join(' ')} did not match any Magnetar endpoints for resource ${entry.resource}` + ); + } + + if (entry.include?.length) { + for (let name of entry.include) { + let found = matches.some( + endpoint => + camelToKebab(splitResourceMethod(endpoint.sdkPath).method) === camelToKebab(name) + ); + if (!found) { + throw new Error( + `manifest command ${entry.path.join(' ')} is missing Magnetar method ${name} on ${entry.resource}` + ); + } + } + } + + let controller = controllers.get(matches[0].controllerId); + let operations = matches + .map(endpoint => + mapOperation({ + endpoint, + entry, + type: types, + skipPathParams: input.manifest.globals.skipPathParams || [], + pagination: input.manifest.globals.pagination !== false + }) + ) + .sort((a, b) => a.name.localeCompare(b.name)); + + mapped.push({ + entry, + resource: { + path: entry.path, + plural: entry.path[entry.path.length - 1], + singular: entry.path[entry.path.length - 1], + short: entry.short || controller?.name || entry.path.join(' '), + long: entry.long || controller?.description || '', + aliases: entry.aliases || [], + operations, + shortcuts: (entry.shortcuts || []).map(shortcut => ({ + path: shortcut.path, + method: camelToKebab(shortcut.method) + })), + children: [] + } + }); + } + + return buildTree(mapped); +}; + +let collectPublicEndpoints = (endpoints: Endpoint[], manifest: Manifest): PublicEndpoint[] => { + let prefixes = (manifest.exclude?.sdkPathPrefixes || []).map(normalizeSdkPath); + let excludedResources = new Set( + (manifest.exclude?.resources || []).map(resource => normalizeSdkPath(resource)) + ); + let collected: PublicEndpoint[] = []; + + for (let endpoint of endpoints) { + for (let item of endpoint.allPaths) { + if (item.sdkPath.startsWith('dashboard.') || item.sdkPath.startsWith('consumer.')) { + continue; + } + if (prefixes.some(prefix => normalizeSdkPath(item.sdkPath).startsWith(prefix))) { + continue; + } + + let sdkPath = stripSdkPath(item.sdkPath); + let { resource } = splitResourceMethod(normalizeSdkPath(sdkPath)); + if (excludedResources.has(resource)) continue; + + collected.push({ + ...endpoint, + sdkPath, + httpPath: item.path.startsWith('/') ? item.path : `/${item.path}` + }); + } + } + + let bySdk = new Map(); + for (let endpoint of collected) { + let key = `${endpoint.method}:${normalizeSdkPath(endpoint.sdkPath)}`; + let existing = bySdk.get(key); + if (!existing) { + bySdk.set(key, endpoint); + continue; + } + if (scorePath(endpoint.httpPath) < scorePath(existing.httpPath)) { + bySdk.set(key, endpoint); + } + } + + return [...bySdk.values()]; +}; + +let scorePath = (path: string) => { + let score = path.length; + if (path.includes('/dashboard/')) score += 1000; + if (path.includes(':instanceId')) score += 100; + if (path.includes(':organizationId')) score += 50; + return score; +}; + +let mapOperation = (input: { + endpoint: PublicEndpoint; + entry: CommandEntry; + type: Map; + skipPathParams: string[]; + pagination: boolean; +}): MappedOperation => { + let methodName = camelToKebab(splitResourceMethod(input.endpoint.sdkPath).method); + let overrides = input.entry.args?.[methodName] || input.entry.args?.[splitResourceMethod(input.endpoint.sdkPath).method] || {}; + let skip = new Set(input.skipPathParams.map(camelToKebab)); + let args: MappedArg[] = []; + let flags: MappedFlag[] = []; + let pathParts = input.endpoint.httpPath.split('/').filter(part => part.length > 0); + let lastSegment = pathParts[pathParts.length - 1] || ''; + + for (let placeholder of pathPlaceholders(input.endpoint.httpPath)) { + let listed = + skip.has(camelToKebab(placeholder)) || input.skipPathParams.includes(placeholder); + if (listed && lastSegment !== `:${placeholder}`) { + continue; + } + + let override = findOverride(overrides, placeholder); + if (override?.skip) continue; + + args.push({ + name: override?.name || camelToKebab(placeholder).replace(/-id$/, '-id'), + target: `path.${placeholder}`, + required: override?.required ?? true, + description: override?.name + ? `${override.name}` + : `${camelToKebab(placeholder).replace(/-/g, ' ')}` + }); + } + + let queryType = input.endpoint.queryId ? input.type.get(input.endpoint.queryId) : undefined; + for (let [key, schema] of Object.entries(extractProperties(queryType))) { + let override = findOverride(overrides, key); + if (override?.skip) continue; + if (override?.positional) { + args.push({ + name: override.name || camelToKebab(key), + target: `query.${key}`, + required: override.required ?? !schema.optional, + description: schema.description || key + }); + continue; + } + + if (!input.pagination && paginationFields.has(key)) continue; + + let flagType = override?.type || inferFlagType(schema); + if (!flagType) continue; + + flags.push({ + name: override?.flag || camelToKebab(key), + type: flagType, + target: `query.${key}`, + usage: schema.description || key, + required: override?.required ?? false, + repeated: flagType === 'string-slice' + }); + } + + let bodyType = input.endpoint.bodyId ? input.type.get(input.endpoint.bodyId) : undefined; + for (let [key, schema] of Object.entries(extractProperties(bodyType))) { + let override = findOverride(overrides, key); + if (override?.skip) continue; + if (override?.positional) { + args.push({ + name: override.name || camelToKebab(key), + target: `body.${key}`, + required: override.required ?? !schema.optional, + description: schema.description || key + }); + continue; + } + + let flagType = override?.type || inferFlagType(schema); + if (!flagType) continue; + + flags.push({ + name: override?.flag || camelToKebab(key), + type: flagType, + target: `body.${key}`, + usage: schema.description || key, + required: override?.required ?? !schema.optional, + repeated: flagType === 'string-slice' + }); + + if (flagType === 'json') { + flags.push({ + name: `${override?.flag || camelToKebab(key)}-file`, + type: 'json-file', + target: `body.${key}`, + usage: `Read ${key} JSON from a file`, + required: false, + repeated: false + }); + } + } + + return { + name: methodName, + method: input.endpoint.method.toUpperCase(), + path: input.endpoint.httpPath, + short: input.endpoint.name, + long: input.endpoint.description || input.endpoint.name, + args, + flags, + sdkMapping: input.endpoint.sdkPath + }; +}; + +let findOverride = (overrides: Record, key: string) => { + if (overrides[key]) return overrides[key]; + let kebab = camelToKebab(key); + if (overrides[kebab]) return overrides[kebab]; + let camelKey = kebab.replace(/-([a-z])/g, (_, char: string) => char.toUpperCase()); + return overrides[camelKey]; +}; + +let inferFlagType = (schema: IntrospectedType): FlagKind | undefined => { + switch (schema.type) { + case 'string': + case 'enum': + case 'literal': + case 'date': + return 'string'; + case 'boolean': + return 'bool'; + case 'number': + return 'float'; + case 'array': { + let item = schema.items?.[0]; + if (!item || item.type === 'string' || item.type === 'enum' || item.type === 'literal') { + return 'string-slice'; + } + return 'json'; + } + case 'object': + case 'record': + case 'intersection': + return 'json'; + case 'union': { + let items = schema.items || []; + if (items.every(item => ['string', 'enum', 'literal'].includes(item.type))) { + return 'string'; + } + if (items.some(item => item.type === 'array')) return 'string-slice'; + return undefined; + } + default: + return undefined; + } +}; + +export let extractProperties = ( + typeDef?: IntrospectedType +): Record => { + let props: Record = {}; + if (!typeDef) return props; + + if (typeDef.type === 'object' && typeDef.properties) { + Object.assign(props, typeDef.properties); + } else if (typeDef.type === 'intersection' && typeDef.items) { + for (let item of typeDef.items) { + Object.assign(props, extractProperties(item)); + } + } else if (typeDef.type === 'union' && typeDef.items) { + for (let item of typeDef.items) { + for (let [key, prop] of Object.entries(extractProperties(item))) { + if (!props[key]) { + props[key] = { ...prop, optional: true }; + } + } + } + } + + return props; +}; + +let buildTree = (mapped: { entry: CommandEntry; resource: MappedResource }[]) => { + let byPath = new Map(); + let sorted = [...mapped].sort((a, b) => a.entry.path.length - b.entry.path.length); + + for (let item of sorted) { + byPath.set(item.entry.path.join('\0'), item.resource); + } + + let roots: MappedResource[] = []; + for (let item of sorted) { + if (item.entry.path.length === 1) { + roots.push(item.resource); + continue; + } + + let parent = byPath.get(item.entry.path.slice(0, -1).join('\0')); + if (!parent) { + throw new Error( + `manifest command ${item.entry.path.join(' ')} is missing parent ${item.entry.path.slice(0, -1).join(' ')}` + ); + } + parent.children.push(item.resource); + } + + return roots; +}; diff --git a/generator/src/manifest.ts b/generator/src/manifest.ts new file mode 100644 index 0000000..8953356 --- /dev/null +++ b/generator/src/manifest.ts @@ -0,0 +1,68 @@ +export type ArgOverride = { + flag?: string; + positional?: boolean; + name?: string; + required?: boolean; + type?: 'string' | 'bool' | 'int' | 'float' | 'string-slice' | 'json'; + target?: 'path' | 'query' | 'body'; + skip?: boolean; +}; + +export type ShortcutEntry = { + path: string[]; + method: string; +}; + +export type CommandEntry = { + path: string[]; + resource?: string; + group?: boolean; + include?: string[]; + aliases?: string[]; + short?: string; + long?: string; + args?: Record>; + shortcuts?: ShortcutEntry[]; +}; + +export type Manifest = { + apiVersion: string; + binary: string; + globals: { + skipPathParams: string[]; + pagination: boolean; + bodyEscapeHatches: boolean; + pathStrategy: 'public'; + }; + exclude: { + sdkPathPrefixes: string[]; + resources: string[]; + }; + commands: CommandEntry[]; +}; + +export let loadManifest = async (filePath: string): Promise => { + let text = await Bun.file(filePath).text(); + let parsed = Bun.YAML.parse(text) as Manifest; + + if (!parsed?.apiVersion) { + throw new Error('manifest is missing apiVersion'); + } + if (!parsed.binary) { + throw new Error('manifest is missing binary'); + } + if (!Array.isArray(parsed.commands) || parsed.commands.length === 0) { + throw new Error('manifest must define at least one command'); + } + + for (let command of parsed.commands) { + if (!command.path?.length) { + throw new Error('manifest command is missing path'); + } + if (!command.group && !command.resource) { + throw new Error(`manifest command ${command.path.join(' ')} is missing resource`); + } + } + + return parsed; +}; diff --git a/generator/tsconfig.json b/generator/tsconfig.json new file mode 100644 index 0000000..f18487f --- /dev/null +++ b/generator/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "types": ["bun-types"] + }, + "include": ["src/**/*.ts"] +} diff --git a/internal/cli/admin.go b/internal/cli/admin.go new file mode 100644 index 0000000..a270c8d --- /dev/null +++ b/internal/cli/admin.go @@ -0,0 +1,50 @@ +package cli + +import ( + "github.com/metorial/cli/internal/app" + authcmd "github.com/metorial/cli/internal/commands/auth" + completioncmd "github.com/metorial/cli/internal/commands/completion" + examplecmd "github.com/metorial/cli/internal/commands/example" + fetchcmd "github.com/metorial/cli/internal/commands/fetch" + instancecmd "github.com/metorial/cli/internal/commands/instance" + resourcescmd "github.com/metorial/cli/internal/commands/resources" + settingscmd "github.com/metorial/cli/internal/commands/settings" + systemcmd "github.com/metorial/cli/internal/commands/system" + "github.com/metorial/cli/internal/commandutil" + "github.com/spf13/cobra" +) + +func newAdminRoot(application *app.App) (*cobra.Command, error) { + command, _, ctx, err := newBaseRoot(application, rootDefinition{ + kind: rootKindAdmin, + use: "metorial-admin", + short: "Admin CLI for the Metorial Magnetar API", + long: commandutil.AdminRootLongDescription(), + }) + if err != nil { + return nil, err + } + + command.AddCommand(systemcmd.NewVersionCommand()) + command.AddCommand(systemcmd.NewFeedbackCommand()) + command.AddCommand(fetchcmd.NewCommand(ctx)) + + if !commandutil.BrowserShellEnabled() { + command.AddCommand(systemcmd.NewUpgradeCommand(application)) + command.AddCommand(systemcmd.NewOpenCommand()) + command.AddCommand(authcmd.NewCommand(ctx)) + command.AddCommand(authcmd.NewLoginCommand(ctx)) + command.AddCommand(authcmd.NewLogoutCommand()) + command.AddCommand(instancecmd.NewCommand(ctx)) + command.AddCommand(authcmd.NewProfileCommand(ctx)) + command.AddCommand(examplecmd.NewCommand(ctx)) + command.AddCommand(settingscmd.NewCommand(ctx)) + command.AddCommand(completioncmd.NewCommand(command.OutOrStdout())) + } + + if err := resourcescmd.AddGeneratedCommands(command, ctx); err != nil { + return nil, err + } + + return command, nil +} diff --git a/internal/cli/consumer.go b/internal/cli/consumer.go new file mode 100644 index 0000000..8806522 --- /dev/null +++ b/internal/cli/consumer.go @@ -0,0 +1,45 @@ +package cli + +import ( + "github.com/metorial/cli/internal/app" + authcmd "github.com/metorial/cli/internal/commands/auth" + completioncmd "github.com/metorial/cli/internal/commands/completion" + instancecmd "github.com/metorial/cli/internal/commands/instance" + integrationscmd "github.com/metorial/cli/internal/commands/integrations" + settingscmd "github.com/metorial/cli/internal/commands/settings" + systemcmd "github.com/metorial/cli/internal/commands/system" + "github.com/metorial/cli/internal/commandutil" + "github.com/spf13/cobra" +) + +func newConsumerRoot(application *app.App) (*cobra.Command, error) { + command, _, ctx, err := newBaseRoot(application, rootDefinition{ + kind: rootKindConsumer, + use: "metorial", + short: "CLI for Metorial integrations and MCP tools", + long: commandutil.ConsumerRootLongDescription(), + }) + if err != nil { + return nil, err + } + + command.AddCommand(systemcmd.NewVersionCommand()) + command.AddCommand(systemcmd.NewFeedbackCommand()) + command.AddCommand(integrationscmd.NewCommand(ctx)) + + if !commandutil.BrowserShellEnabled() { + command.AddCommand(systemcmd.NewUpgradeCommand(application)) + command.AddCommand(systemcmd.NewOpenCommand()) + command.AddCommand(authcmd.NewCommand(ctx)) + command.AddCommand(authcmd.NewLoginCommand(ctx)) + command.AddCommand(authcmd.NewLogoutCommand()) + command.AddCommand(instancecmd.NewCommand(ctx)) + command.AddCommand(authcmd.NewProfileCommand(ctx)) + command.AddCommand(settingscmd.NewCommand(ctx)) + command.AddCommand(completioncmd.NewCommand(command.OutOrStdout())) + } + + addMovedCommands(command) + + return command, nil +} diff --git a/internal/cli/moved.go b/internal/cli/moved.go new file mode 100644 index 0000000..a09face --- /dev/null +++ b/internal/cli/moved.go @@ -0,0 +1,61 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +type movedError struct { + Command string +} + +func (e *movedError) Error() string { + return fmt.Sprintf("metorial: `%s` moved to `metorial-admin %s`", e.Command, e.Command) +} + +func isMovedError(err error) bool { + _, ok := asMovedError(err) + return ok +} + +func asMovedError(err error) (*movedError, bool) { + if err == nil { + return nil, false + } + + moved, ok := err.(*movedError) + return moved, ok +} + +func addMovedCommands(root *cobra.Command) { + names := []string{ + "providers", + "deployments", + "configs", + "auth-configs", + "identities", + "actors", + "identity-credentials", + "sessions", + "session-templates", + "fetch", + "curl", + "example", + } + + for _, name := range names { + commandName := name + command := &cobra.Command{ + Use: commandName, + Short: fmt.Sprintf("Moved to metorial-admin %s", commandName), + Args: cobra.ArbitraryArgs, + DisableFlagParsing: true, + FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, + RunE: func(command *cobra.Command, args []string) error { + return &movedError{Command: commandName} + }, + } + root.AddCommand(command) + } +} diff --git a/internal/cli/root.go b/internal/cli/root.go index cee83ff..e9eee74 100644 --- a/internal/cli/root.go +++ b/internal/cli/root.go @@ -5,15 +5,6 @@ import ( "strings" "github.com/metorial/cli/internal/app" - authcmd "github.com/metorial/cli/internal/commands/auth" - completioncmd "github.com/metorial/cli/internal/commands/completion" - examplecmd "github.com/metorial/cli/internal/commands/example" - fetchcmd "github.com/metorial/cli/internal/commands/fetch" - instancecmd "github.com/metorial/cli/internal/commands/instance" - integrationscmd "github.com/metorial/cli/internal/commands/integrations" - resourcescmd "github.com/metorial/cli/internal/commands/resources" - settingscmd "github.com/metorial/cli/internal/commands/settings" - systemcmd "github.com/metorial/cli/internal/commands/system" "github.com/metorial/cli/internal/commandutil" "github.com/metorial/cli/internal/config" "github.com/metorial/cli/internal/output" @@ -23,13 +14,56 @@ import ( "github.com/spf13/cobra" ) +type rootKind string + +const ( + rootKindConsumer rootKind = "consumer" + rootKindAdmin rootKind = "admin" +) + +type rootDefinition struct { + kind rootKind + use string + short string + long string +} + func Run() int { application := app.New() return RunArgs(application, nil) } func RunArgs(application *app.App, args []string) int { - command, err := NewRootCommand(application) + return runRoot(application, args, newConsumerRoot) +} + +func RunAdmin() int { + application := app.New() + return RunAdminArgs(application, nil) +} + +func RunAdminArgs(application *app.App, args []string) int { + return runRoot(application, args, newAdminRoot) +} + +func NewRootCommand(application *app.App) (*cobra.Command, error) { + return newConsumerRoot(application) +} + +func NewAdminRootCommand(application *app.App) (*cobra.Command, error) { + return newAdminRoot(application) +} + +func newRootCommand(application *app.App) (*cobra.Command, error) { + return NewRootCommand(application) +} + +func runRoot( + application *app.App, + args []string, + build func(*app.App) (*cobra.Command, error), +) int { + command, err := build(application) if err != nil { renderCLIError(application, err) return 1 @@ -41,25 +75,28 @@ func RunArgs(application *app.App, args []string) int { if err := command.Execute(); err != nil { renderCLIError(application, err) + if isMovedError(err) { + return 2 + } return 1 } return 0 } -func NewRootCommand(application *app.App) (*cobra.Command, error) { +func newBaseRoot(application *app.App, definition rootDefinition) (*cobra.Command, *commandutil.RootOptions, commandutil.Context, error) { options := &commandutil.RootOptions{} commandutil.RegisterTemplateFuncs() store, err := config.OpenStore() if err != nil { - return nil, err + return nil, nil, commandutil.Context{}, err } defaultFormat, err := resolveDefaultOutputFormat(store.Settings().DefaultFormat) if err != nil { - return nil, err + return nil, nil, commandutil.Context{}, err } options.Format = defaultFormat @@ -67,9 +104,9 @@ func NewRootCommand(application *app.App) (*cobra.Command, error) { ctx := commandutil.NewContext(application, options) command := &cobra.Command{ - Use: "metorial", - Short: "CLI for the Metorial API and platform", - Long: commandutil.RootLongDescription(), + Use: definition.use, + Short: definition.short, + Long: definition.long, SilenceErrors: true, SilenceUsage: true, Version: version.Version, @@ -89,36 +126,13 @@ func NewRootCommand(application *app.App) (*cobra.Command, error) { return []string{"yaml", "toml", "json", "structured"}, cobra.ShellCompDirectiveNoFileComp }) - command.AddCommand(systemcmd.NewVersionCommand()) - command.AddCommand(systemcmd.NewFeedbackCommand()) - command.AddCommand(integrationscmd.NewCommand(ctx)) - command.AddCommand(fetchcmd.NewCommand(ctx)) - - if !commandutil.BrowserShellEnabled() { - command.AddCommand(systemcmd.NewUpgradeCommand(application)) - command.AddCommand(systemcmd.NewOpenCommand()) - command.AddCommand(authcmd.NewCommand(ctx)) - command.AddCommand(authcmd.NewLoginCommand(ctx)) - command.AddCommand(authcmd.NewLogoutCommand()) - command.AddCommand(instancecmd.NewCommand(ctx)) - command.AddCommand(authcmd.NewProfileCommand(ctx)) - command.AddCommand(examplecmd.NewCommand(ctx)) - command.AddCommand(settingscmd.NewCommand(ctx)) - command.AddCommand(completioncmd.NewCommand(command.OutOrStdout())) - } else { + if commandutil.BrowserShellEnabled() { _ = command.PersistentFlags().MarkHidden("api-key") _ = command.PersistentFlags().MarkHidden("api-host") _ = command.PersistentFlags().MarkHidden("instance") _ = command.PersistentFlags().MarkHidden("profile") } - if err := resourcescmd.AddPublicCommands(command, ctx); err != nil { - return nil, err - } - if err := resourcescmd.AddSessionCommands(command, ctx); err != nil { - return nil, err - } - command.PersistentPreRunE = func(command *cobra.Command, args []string) error { if shouldSkipUpgradeNotice(command) { return nil @@ -127,11 +141,7 @@ func NewRootCommand(application *app.App) (*cobra.Command, error) { return update.MaybePrintUpgradeNotice(application.Stderr, application.StderrFeatures()) } - return command, nil -} - -func newRootCommand(application *app.App) (*cobra.Command, error) { - return NewRootCommand(application) + return command, options, ctx, nil } func newHelpCommand(root *cobra.Command) *cobra.Command { @@ -160,6 +170,18 @@ func resolveDefaultOutputFormat(raw string) (string, error) { } func renderCLIError(application *app.App, err error) { + if moved, ok := asMovedError(err); ok { + features := application.StderrFeatures() + colors := terminal.NewColorizer(features) + _, _ = fmt.Fprintln(application.Stderr, colors.Warning("Command Moved")) + _, _ = fmt.Fprintln(application.Stderr) + _, _ = fmt.Fprintln(application.Stderr, colors.Muted(moved.Error())) + _, _ = fmt.Fprintln(application.Stderr) + _, _ = fmt.Fprintln(application.Stderr, colors.Notice("Next step")) + _, _ = fmt.Fprintln(application.Stderr, colors.Muted(fmt.Sprintf("Install and run `metorial-admin %s` instead.", moved.Command))) + return + } + message := strings.TrimSpace(err.Error()) if message == "" { return diff --git a/internal/commands/example/command.go b/internal/commands/example/command.go index e63d34c..9e1eff1 100644 --- a/internal/commands/example/command.go +++ b/internal/commands/example/command.go @@ -158,8 +158,8 @@ func NewCommand(ctx commandutil.Context) *cobra.Command { Browse official Metorial examples from the public CLI manifest and clone one into a local directory. -Use "metorial example list" to see available examples. Use -"metorial example create [path]" to download an example, prepare +Use "metorial-admin example list" to see available examples. Use +"metorial-admin example create [path]" to download an example, prepare the target folder, copy .env.example to .env when available, and install dependencies when a supported package manager is present. `), @@ -189,7 +189,7 @@ dependencies when a supported package manager is present. colors := terminal.NewColorizer(application.StdoutFeatures()) _, _ = fmt.Fprintln(command.OutOrStdout(), colors.Bold("Available Examples")) - _, _ = fmt.Fprintln(command.OutOrStdout(), colors.Muted("Use one of these identifiers with `metorial example create `.")) + _, _ = fmt.Fprintln(command.OutOrStdout(), colors.Muted("Use one of these identifiers with `metorial-admin example create `.")) _, _ = fmt.Fprintln(command.OutOrStdout()) table := output.Table{ @@ -216,7 +216,7 @@ dependencies when a supported package manager is present. if len(records) > 0 { _, _ = fmt.Fprintln(command.OutOrStdout()) - _, _ = fmt.Fprintf(command.OutOrStdout(), "%s `metorial example create %s`\n", colors.Notice("Clone an example with"), records[0].Identifier) + _, _ = fmt.Fprintf(command.OutOrStdout(), "%s `metorial-admin example create %s`\n", colors.Notice("Clone an example with"), records[0].Identifier) } return nil @@ -483,7 +483,7 @@ func findExampleRecord(records []exampleRecord, identifier string) (*exampleReco } } - return nil, fmt.Errorf("metorial: example %q was not found.\nRun \"metorial example list\" to see available examples.", identifier) + return nil, fmt.Errorf("metorial: example %q was not found.\nRun \"metorial-admin example list\" to see available examples.", identifier) } func parseExampleRepositoryTarget(value string) (string, string, bool) { diff --git a/internal/commands/fetch/command.go b/internal/commands/fetch/command.go index 1e347d8..3314941 100644 --- a/internal/commands/fetch/command.go +++ b/internal/commands/fetch/command.go @@ -26,10 +26,10 @@ Use --profile to override the selected saved profile for this command. Use the global --format flag to switch between YAML, TOML, JSON, and structured output. Examples: - metorial fetch /provider-listings - metorial fetch /provider-listings -H 'X-Debug: true' - metorial fetch /provider-listings -X POST -d '{"name":"demo"}' - metorial curl https://api.metorial.com/provider-listings -i + metorial-admin fetch /provider-listings + metorial-admin fetch /provider-listings -H 'X-Debug: true' + metorial-admin fetch /provider-listings -X POST -d '{"name":"demo"}' + metorial-admin curl https://api.metorial.com/provider-listings -i `), Args: cobra.ExactArgs(1), RunE: func(command *cobra.Command, args []string) error { diff --git a/internal/commands/resources/command_test.go b/internal/commands/resources/command_test.go index 89ae807..a35e85d 100644 --- a/internal/commands/resources/command_test.go +++ b/internal/commands/resources/command_test.go @@ -11,24 +11,42 @@ import ( "github.com/spf13/cobra" ) -func TestNewRootCommandRegistersProvidersResource(t *testing.T) { - t.Parallel() - - command, err := newTestRootCommand(&app.App{}) - if err != nil { - t.Fatalf("newTestRootCommand() error = %v", err) +func sampleListOperation() resourcecmd.OperationSpec { + return resourcecmd.OperationSpec{ + Name: resourcecmd.OperationList, + Method: "GET", + Path: "/providers", + Short: "List providers", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "Limit"}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by id", Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagString, Target: "query.provider_auth_method_id", Usage: "Filter by auth method"}, + }, } +} - found := false - for _, child := range command.Commands() { - if child.Name() == "providers" { - found = true - break - } +func sampleCreateOperation() resourcecmd.OperationSpec { + return resourcecmd.OperationSpec{ + Name: resourcecmd.OperationCreate, + Method: "POST", + Path: "/provider-deployments", + Short: "Create a deployment", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-id", Target: "body.provider_id", Required: true, Description: "Provider ID"}, + {Name: "name", Target: "body.name", Required: false, Description: "Name"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "locked-provider-version-id", Type: resourcecmd.FlagString, Target: "body.locked_provider_version_id", Usage: "Pin a version"}, + }, } +} - if !found { - t.Fatalf("root command did not register providers resource command") +func sampleResource() resourcecmd.ResourceSpec { + return resourcecmd.ResourceSpec{ + Plural: "providers", + Singular: "providers", + Short: "Browse providers", + Operations: []resourcecmd.OperationSpec{sampleListOperation()}, } } @@ -57,7 +75,13 @@ func TestRootHelpSeparatesResourceCommands(t *testing.T) { if !strings.Contains(output, "Resource Admin Commands:\n") { t.Fatalf("help output missing Resource Admin Commands section:\n%s", output) } - if strings.Contains(output, "Commands:\n providers") { + if !strings.Contains(output, "Resource Admin Commands:\n providers") && + !strings.Contains(output, "Resource Admin Commands:\n providers") { + if !strings.Contains(output, "providers") { + t.Fatalf("help output missing providers resource:\n%s", output) + } + } + if strings.Contains(output, "\nCommands:\n providers") { t.Fatalf("providers unexpectedly listed in general Commands section:\n%s", output) } } @@ -68,19 +92,25 @@ func newTestRootCommand(application *app.App) (*cobra.Command, error) { ctx := commandutil.NewContext(application, &commandutil.RootOptions{Format: "structured"}) command := &cobra.Command{ - Use: "metorial", - Short: "CLI for the Metorial API and platform", + Use: "metorial-admin", + Short: "Admin CLI for the Metorial Magnetar API", } command.SetOut(application.Stdout) command.SetErr(application.Stderr) commandutil.ConfigureCommand(command) - if err := AddPublicCommands(command, ctx); err != nil { - return nil, err + builder := func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { + return newPublicResourceAction(application, newRootOptionsView(ctx.Options), resource, operation) } - if err := AddSessionCommands(command, ctx); err != nil { + + resource := sampleResource() + resourceCommand, err := resourcecmd.NewResourceCommand(resource, builder) + if err != nil { return nil, err } + commandutil.SetCommandCategory(resourceCommand, commandutil.CommandCategoryResource) + commandutil.ConfigureCommand(resourceCommand) + command.AddCommand(resourceCommand) return command, nil } @@ -88,7 +118,9 @@ func newTestRootCommand(application *app.App) (*cobra.Command, error) { func TestBuildResourceTargetIncludesRepeatedQueryValues(t *testing.T) { t.Parallel() - command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resourcecmd.ProvidersResource(), resourcecmd.ProvidersResource().Operations[0]) + resource := sampleResource() + operation := sampleListOperation() + command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resource, operation) if err != nil { t.Fatalf("newPublicResourceAction() error = %v", err) } @@ -100,12 +132,12 @@ func TestBuildResourceTargetIncludesRepeatedQueryValues(t *testing.T) { t.Fatalf("Set(id) error = %v", err) } - target, err := buildResourceTarget(command, resourcecmd.ProvidersResource(), resourcecmd.ProvidersResource().Operations[0], nil) + target, err := buildResourceTarget(command, resource, operation, nil) if err != nil { t.Fatalf("buildResourceTarget() error = %v", err) } - if target != "/provider-listings?id=prov_1&id=prov_2&limit=10" { + if target != "/providers?id=prov_1&id=prov_2&limit=10" { t.Fatalf("buildResourceTarget() = %q", target) } } @@ -113,17 +145,19 @@ func TestBuildResourceTargetIncludesRepeatedQueryValues(t *testing.T) { func TestBuildResourceTargetAppliesDefaultListLimit(t *testing.T) { t.Parallel() - command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resourcecmd.ProvidersResource(), resourcecmd.ProvidersResource().Operations[0]) + resource := sampleResource() + operation := sampleListOperation() + command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resource, operation) if err != nil { t.Fatalf("newPublicResourceAction() error = %v", err) } - target, err := buildResourceTarget(command, resourcecmd.ProvidersResource(), resourcecmd.ProvidersResource().Operations[0], nil) + target, err := buildResourceTarget(command, resource, operation, nil) if err != nil { t.Fatalf("buildResourceTarget() error = %v", err) } - if target != "/provider-listings?limit=15" { + if target != "/providers?limit=15" { t.Fatalf("buildResourceTarget() = %q", target) } } @@ -131,11 +165,8 @@ func TestBuildResourceTargetAppliesDefaultListLimit(t *testing.T) { func TestBuildResourceBodyMergesExplicitJSONAndFlags(t *testing.T) { t.Parallel() - resource := resourcecmd.DeploymentsResource() - operation, ok := resource.Operation(resourcecmd.OperationCreate) - if !ok { - t.Fatalf("DeploymentsResource() missing create operation") - } + resource := resourcecmd.ResourceSpec{Plural: "deployments", Singular: "deployments"} + operation := sampleCreateOperation() command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resource, operation) if err != nil { @@ -168,6 +199,27 @@ func TestBuildResourceBodyMergesExplicitJSONAndFlags(t *testing.T) { } } +func TestApplyOperationPathSubstitutesPathParams(t *testing.T) { + t.Parallel() + + operation := resourcecmd.OperationSpec{ + Name: resourcecmd.OperationGet, + Method: "GET", + Path: "/magic-mcp-servers/:magicMcpServerId/tools", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true}, + }, + } + + path, err := applyOperationPath(operation, []string{"mcp_123"}) + if err != nil { + t.Fatalf("applyOperationPath() error = %v", err) + } + if path != "/magic-mcp-servers/mcp_123/tools" { + t.Fatalf("applyOperationPath() = %q", path) + } +} + func TestCamelToSnakeHandlesSDKFieldNames(t *testing.T) { t.Parallel() @@ -192,43 +244,11 @@ func TestResourceOperationArgsRejectsExtraArguments(t *testing.T) { } } -func TestResourceOperationArgsRendersHelpOnMissingArgs(t *testing.T) { - t.Parallel() - - stdout := &bytes.Buffer{} - command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resourcecmd.ActorsResource(), resourcecmd.ActorsResource().Operations[2]) - if err != nil { - t.Fatalf("newPublicResourceAction() error = %v", err) - } - command.SetOut(stdout) - command.SetErr(&bytes.Buffer{}) - - err = command.Args(command, nil) - if err == nil { - t.Fatal("expected missing args error") - } - - rendered := stdout.String() - if !strings.Contains(rendered, "Usage:\n") { - t.Fatalf("help output missing usage:\n%s", rendered) - } - if !strings.Contains(rendered, "Arguments:\n") { - t.Fatalf("help output missing arguments:\n%s", rendered) - } - if !strings.Contains(rendered, "type") || !strings.Contains(rendered, "name") { - t.Fatalf("help output missing expected args:\n%s", rendered) - } -} - func TestBuildResourceTargetUsesSnakeCaseQueryKeys(t *testing.T) { t.Parallel() - resource := resourcecmd.AuthConfigsResource() - operation, ok := resource.Operation(resourcecmd.OperationList) - if !ok { - t.Fatalf("AuthConfigsResource() missing list operation") - } - + resource := sampleResource() + operation := sampleListOperation() command, err := newPublicResourceAction(&app.App{}, &rootOptionsView{}, resource, operation) if err != nil { t.Fatalf("newPublicResourceAction() error = %v", err) @@ -265,7 +285,17 @@ func TestResourceCommandHelpIncludesArgumentsSection(t *testing.T) { t.Parallel() stdout := &bytes.Buffer{} - command, err := newPublicResourceAction(&app.App{Stdout: stdout, Stderr: &bytes.Buffer{}}, &rootOptionsView{}, resourcecmd.IdentitiesResource(), resourcecmd.IdentitiesResource().Operations[2]) + resource := resourcecmd.ResourceSpec{Plural: "identities", Singular: "identities"} + operation := resourcecmd.OperationSpec{ + Name: resourcecmd.OperationCreate, + Method: "POST", + Path: "/identities", + Short: "Create an identity", + Args: []resourcecmd.ArgumentSpec{ + {Name: "actor-id", Target: "body.actor_id", Required: true, Description: "Actor ID"}, + }, + } + command, err := newPublicResourceAction(&app.App{Stdout: stdout, Stderr: &bytes.Buffer{}}, &rootOptionsView{}, resource, operation) if err != nil { t.Fatalf("newPublicResourceAction() error = %v", err) } diff --git a/internal/commands/resources/public.go b/internal/commands/resources/public.go index 160cd15..4bdd06d 100644 --- a/internal/commands/resources/public.go +++ b/internal/commands/resources/public.go @@ -12,6 +12,7 @@ import ( "github.com/metorial/cli/internal/app" "github.com/metorial/cli/internal/commandutil" "github.com/metorial/cli/internal/fetch" + generatedadmin "github.com/metorial/cli/internal/generated/admin" "github.com/metorial/cli/internal/output" "github.com/metorial/cli/internal/resourcecmd" "github.com/spf13/cobra" @@ -60,30 +61,55 @@ func (v *rootOptionsView) format() string { return v.options.Format } -func AddPublicCommands( +func AddGeneratedCommands( root *cobra.Command, ctx commandutil.Context, ) error { application := ctx.App rootOptions := newRootOptionsView(ctx.Options) - plan := resourcecmd.PublicResourcePlan() + builder := func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { + return newPublicResourceAction(application, rootOptions, resource, operation) + } - for _, group := range plan { - for _, resource := range group.Resources { - if resource.Plural == "instance" { - continue - } + for _, resource := range generatedadmin.Catalog() { + if existingGeneratedCommand(root, resource) != nil { + continue + } - command, err := resourcecmd.NewResourceCommand(resource, func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { - return newPublicResourceAction(application, rootOptions, resource, operation) - }) - if err != nil { - return err - } + command, err := resourcecmd.NewResourceCommand(resource, builder) + if err != nil { + return err + } + + commandutil.SetCommandCategory(command, commandutil.CommandCategoryResource) + commandutil.ConfigureCommand(command) + root.AddCommand(command) + } + + for _, resource := range generatedadmin.Catalog() { + if err := resourcecmd.AddShortcuts(root, resource, builder); err != nil { + return err + } + } + + return nil +} + +func AddPublicCommands( + root *cobra.Command, + ctx commandutil.Context, +) error { + return AddGeneratedCommands(root, ctx) +} - commandutil.SetCommandCategory(command, commandutil.CommandCategoryResource) - commandutil.ConfigureCommand(command) - root.AddCommand(command) +func existingGeneratedCommand(root *cobra.Command, resource resourcecmd.ResourceSpec) *cobra.Command { + if found := resourcecmd.CommandByName(root, resource.Plural); found != nil { + return found + } + + for _, alias := range resource.Aliases { + if found := resourcecmd.CommandByName(root, alias); found != nil { + return found } } @@ -196,7 +222,7 @@ func buildResourceFetchOptions( operation resourcecmd.OperationSpec, args []string, ) (fetch.Options, error) { - method, err := resourceOperationMethod(operation.Name) + method, err := resourceOperationMethod(operation) if err != nil { return fetch.Options{}, err } @@ -240,7 +266,7 @@ func buildResourceTarget( } values := url.Values{} - if resource.Plural == "providers" && operation.Name == resourcecmd.OperationGet { + if strings.TrimSpace(operation.Path) == "" && resource.Plural == "providers" && operation.Name == resourcecmd.OperationGet { if len(args) == 0 { return "", fmt.Errorf("metorial: missing required provider identifier") } @@ -249,18 +275,18 @@ func buildResourceTarget( } for index, arg := range operation.Args { - if !strings.HasPrefix(arg.Target, "params.") { + if !isQueryTarget(arg.Target) { continue } if index >= len(args) { continue } - values.Add(paramFlagKey(arg.Target), args[index]) + values.Add(queryFlagKey(arg.Target), args[index]) } for _, flag := range operation.Flags { - if !strings.HasPrefix(flag.Target, "params.") { + if !isQueryTarget(flag.Target) { continue } if !command.Flags().Changed(flag.Name) { @@ -273,32 +299,32 @@ func buildResourceTarget( if err != nil { return "", err } - values.Add(paramFlagKey(flag.Target), value) + values.Add(queryFlagKey(flag.Target), value) case resourcecmd.FlagBool: value, err := command.Flags().GetBool(flag.Name) if err != nil { return "", err } - values.Add(paramFlagKey(flag.Target), strconv.FormatBool(value)) + values.Add(queryFlagKey(flag.Target), strconv.FormatBool(value)) case resourcecmd.FlagInt: value, err := command.Flags().GetInt(flag.Name) if err != nil { return "", err } - values.Add(paramFlagKey(flag.Target), strconv.Itoa(value)) + values.Add(queryFlagKey(flag.Target), strconv.Itoa(value)) case resourcecmd.FlagFloat: value, err := command.Flags().GetFloat64(flag.Name) if err != nil { return "", err } - values.Add(paramFlagKey(flag.Target), strconv.FormatFloat(value, 'f', -1, 64)) + values.Add(queryFlagKey(flag.Target), strconv.FormatFloat(value, 'f', -1, 64)) case resourcecmd.FlagStringSlice: valuesSlice, err := command.Flags().GetStringSlice(flag.Name) if err != nil { return "", err } for _, value := range valuesSlice { - values.Add(paramFlagKey(flag.Target), value) + values.Add(queryFlagKey(flag.Target), value) } } } @@ -388,12 +414,12 @@ func buildResourceBody(command *cobra.Command, resource resourcecmd.ResourceSpec } func applyDefaultListLimit(command *cobra.Command, operation resourcecmd.OperationSpec, values url.Values) error { - if operation.Name != resourcecmd.OperationList { + if operation.Name != resourcecmd.OperationList && strings.ToLower(string(operation.Name)) != "list" { return nil } for _, flag := range operation.Flags { - if flag.Name != "limit" || flag.Target != "params.Limit" { + if flag.Name != "limit" || (flag.Target != "params.Limit" && flag.Target != "query.limit" && flag.Target != "params.limit") { continue } if command.Flags().Changed("limit") { @@ -453,19 +479,35 @@ func bodyFlagKey(target string) string { if field == target { return target } + return jsonFieldName(field) +} + +func isQueryTarget(target string) bool { + return strings.HasPrefix(target, "params.") || strings.HasPrefix(target, "query.") +} + +func jsonFieldName(field string) string { + if strings.Contains(field, "_") || field == strings.ToLower(field) { + return field + } return camelToSnake(field) } -func paramFlagKey(target string) string { +func queryFlagKey(target string) string { field := strings.TrimPrefix(target, "params.") + field = strings.TrimPrefix(field, "query.") if field == target { return target } - return camelToSnake(field) + return jsonFieldName(field) } func resourceOperationPath(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec, args []string) (string, error) { + if strings.TrimSpace(operation.Path) != "" { + return applyOperationPath(operation, args) + } + if resource.Plural == "providers" { return providerOperationPath(operation, args) } @@ -482,7 +524,7 @@ func resourceOperationPath(resource resourcecmd.ResourceSpec, operation resource if len(args) == 0 { return "", fmt.Errorf("metorial: missing required resource identifier") } - return "/" + pathPlural + "/" + args[0], nil + return "/" + pathPlural + "/" + url.PathEscape(args[0]), nil case resourcecmd.OperationGetSchema: if pathPlural == "provider-configs" { return "/provider-config-schema", nil @@ -492,6 +534,81 @@ func resourceOperationPath(resource resourcecmd.ResourceSpec, operation resource return "", fmt.Errorf("metorial: %s %s is not implemented yet", resource.Plural, operation.Name) } +func applyOperationPath(operation resourcecmd.OperationSpec, args []string) (string, error) { + path := operation.Path + placeholders := pathPlaceholders(path) + values := map[string]string{} + + for index, arg := range operation.Args { + name := pathTargetName(arg.Target) + if name == "" { + continue + } + if index >= len(args) { + if arg.Required { + return "", fmt.Errorf("metorial: missing required %s", arg.Name) + } + continue + } + values[name] = args[index] + } + + unusedArgs := make([]string, 0, len(args)) + used := map[int]bool{} + for index, arg := range operation.Args { + if pathTargetName(arg.Target) == "" { + continue + } + if index < len(args) { + used[index] = true + } + } + for index, arg := range args { + if !used[index] { + unusedArgs = append(unusedArgs, arg) + } + } + + unusedIndex := 0 + for _, placeholder := range placeholders { + if _, ok := values[placeholder]; ok { + continue + } + if unusedIndex >= len(unusedArgs) { + return "", fmt.Errorf("metorial: missing required path parameter %s", placeholder) + } + values[placeholder] = unusedArgs[unusedIndex] + unusedIndex++ + } + + for _, placeholder := range placeholders { + value, ok := values[placeholder] + if !ok { + return "", fmt.Errorf("metorial: missing required path parameter %s", placeholder) + } + path = strings.Replace(path, ":"+placeholder, url.PathEscape(value), 1) + } + + return path, nil +} + +func pathPlaceholders(path string) []string { + placeholders := []string{} + for _, part := range strings.Split(path, "/") { + if strings.HasPrefix(part, ":") && len(part) > 1 { + placeholders = append(placeholders, part[1:]) + } + } + return placeholders +} + +func pathTargetName(target string) string { + if strings.HasPrefix(target, "path.") { + return strings.TrimPrefix(target, "path.") + } + return "" +} + func providerOperationPath(operation resourcecmd.OperationSpec, args []string) (string, error) { switch operation.Name { case resourcecmd.OperationList: @@ -506,8 +623,12 @@ func providerOperationPath(operation resourcecmd.OperationSpec, args []string) ( } } -func resourceOperationMethod(name resourcecmd.OperationName) (string, error) { - switch name { +func resourceOperationMethod(operation resourcecmd.OperationSpec) (string, error) { + if method := strings.ToUpper(strings.TrimSpace(operation.Method)); method != "" { + return method, nil + } + + switch operation.Name { case resourcecmd.OperationList, resourcecmd.OperationGet, resourcecmd.OperationGetSchema: return "GET", nil case resourcecmd.OperationCreate: @@ -517,11 +638,15 @@ func resourceOperationMethod(name resourcecmd.OperationName) (string, error) { case resourcecmd.OperationDelete: return "DELETE", nil default: - return "", fmt.Errorf("metorial: operation %q is not implemented yet", name) + return "", fmt.Errorf("metorial: operation %q is not implemented yet", operation.Name) } } func operationUsesBody(operation resourcecmd.OperationSpec) bool { + if method := strings.ToUpper(strings.TrimSpace(operation.Method)); method != "" { + return method == "POST" || method == "PUT" || method == "PATCH" + } + switch operation.Name { case resourcecmd.OperationCreate, resourcecmd.OperationUpdate: return true diff --git a/internal/commands/resources/sessions.go b/internal/commands/resources/sessions.go deleted file mode 100644 index 6f77cf1..0000000 --- a/internal/commands/resources/sessions.go +++ /dev/null @@ -1,503 +0,0 @@ -package resources - -import ( - "github.com/metorial/cli/internal/commandutil" - "github.com/metorial/cli/internal/resourcecmd" - "github.com/spf13/cobra" -) - -func AddSessionCommands(root *cobra.Command, ctx commandutil.Context) error { - application := ctx.App - rootOptions := newRootOptionsView(ctx.Options) - - sessionsCommand, err := resourcecmd.NewResourceCommand(sessionResourceSpec(), func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { - return newPublicResourceAction(application, rootOptions, resource, operation) - }) - if err != nil { - return err - } - commandutil.SetCommandCategory(sessionsCommand, commandutil.CommandCategoryResource) - commandutil.ConfigureCommand(sessionsCommand) - - for _, resource := range []resourcecmd.ResourceSpec{ - sessionMessagesResourceSpec(), - sessionParticipantsResourceSpec(), - sessionConnectionsResourceSpec(), - sessionEventsResourceSpec(), - sessionProvidersResourceSpec(), - sessionErrorsResourceSpec(), - } { - command, err := resourcecmd.NewResourceCommand(resource, func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { - return newPublicResourceAction(application, rootOptions, resource, operation) - }) - if err != nil { - return err - } - commandutil.ConfigureCommand(command) - sessionsCommand.AddCommand(command) - } - - root.AddCommand(sessionsCommand) - - sessionTemplatesCommand, err := resourcecmd.NewResourceCommand(sessionTemplatesResourceSpec(), func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { - return newPublicResourceAction(application, rootOptions, resource, operation) - }) - if err != nil { - return err - } - commandutil.SetCommandCategory(sessionTemplatesCommand, commandutil.CommandCategoryResource) - commandutil.ConfigureCommand(sessionTemplatesCommand) - - templateProvidersCommand, err := resourcecmd.NewResourceCommand(sessionTemplateProvidersResourceSpec(), func(resource resourcecmd.ResourceSpec, operation resourcecmd.OperationSpec) (*cobra.Command, error) { - return newPublicResourceAction(application, rootOptions, resource, operation) - }) - if err != nil { - return err - } - commandutil.ConfigureCommand(templateProvidersCommand) - sessionTemplatesCommand.AddCommand(templateProvidersCommand) - root.AddCommand(sessionTemplatesCommand) - - return nil -} - -func sessionResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "sessions", - Singular: "session", - Short: "Manage sessions", - Long: "Create and inspect sessions and their related resources.", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List sessions", - Long: "List sessions for the selected instance.", - Flags: append(resourcecmdPaginationFlags("sessions"), - resourcecmdStringSliceFlag("status", "params.Status", "Filter by session status"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session ID"), - resourcecmdStringSliceFlag("session-template-id", "params.SessionTemplateId", "Filter by session template ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - resourcecmdStringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - resourcecmdStringSliceFlag("provider-config-id", "params.ProviderConfigId", "Filter by provider config ID"), - resourcecmdStringSliceFlag("provider-auth-config-id", "params.ProviderAuthConfigId", "Filter by provider auth config ID"), - ), - Examples: []string{"metorial sessions list"}, - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session", - Long: "Get a single session by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "", "Session ID. Find one with `metorial sessions list`.", true)}, - Examples: []string{"metorial sessions get ses_123"}, - }, - { - Name: resourcecmd.OperationCreate, - Short: "Create a session", - Long: "Create a session. Use repeatable `--provider` flags or `--provider-file` to define the providers included in the session.", - Flags: []resourcecmd.FlagSpec{ - resourcecmdStringFlag("name", "body.Name", "Optional display name", false), - resourcecmdStringFlag("description", "body.Description", "Optional description", false), - resourcecmdJSONFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - resourcecmdJSONFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - resourcecmdProviderFlag(), - resourcecmdProviderFileFlag(), - }, - Examples: []string{ - "metorial sessions create --provider deployment=dep_123", - "metorial sessions create --provider deployment=dep_123,config=cfg_123,auth-config=acf_123", - }, - }, - { - Name: resourcecmd.OperationUpdate, - Short: "Update a session", - Long: "Update mutable fields on a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdStringFlag("name", "body.Name", "Updated display name", false), - resourcecmdStringFlag("description", "body.Description", "Updated description", false), - resourcecmdJSONFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - resourcecmdJSONFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - Examples: []string{"metorial sessions update ses_123 --description \"Updated description\""}, - }, - }, - } -} - -func sessionMessagesResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "messages", - Singular: "message", - Short: "Inspect session messages", - PathPlural: "session-messages", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List messages for a session", - Long: "List messages for a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("messages"), - resourcecmdStringSliceFlag("type", "params.Type", "Filter by message type"), - resourcecmdStringSliceFlag("source", "params.Source", "Filter by message source"), - resourcecmdStringSliceFlag("hierarchy", "params.Hierarchy", "Filter by message hierarchy"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by message ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("session-connection-id", "params.SessionConnectionId", "Filter by session connection ID"), - resourcecmdStringSliceFlag("provider-run-id", "params.ProviderRunId", "Filter by provider run ID"), - resourcecmdStringSliceFlag("error-id", "params.ErrorId", "Filter by error ID"), - resourcecmdStringSliceFlag("participant-id", "params.ParticipantId", "Filter by participant ID"), - resourcecmdStringSliceFlag("parent-message-id", "params.ParentMessageId", "Filter by parent message ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session message", - Long: "Get a single session message by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-message-id", "", "Session message ID.", true)}, - }, - }, - } -} - -func sessionParticipantsResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "participants", - Singular: "participant", - Short: "Inspect session participants", - PathPlural: "session-participants", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List participants for a session", - Long: "List participants for a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("participants"), - resourcecmdStringSliceFlag("type", "params.Type", "Filter by participant type"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by participant ID"), - resourcecmdStringSliceFlag("session-connection-id", "params.SessionConnectionId", "Filter by session connection ID"), - resourcecmdStringSliceFlag("session-message-id", "params.SessionMessageId", "Filter by session message ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session participant", - Long: "Get a single session participant by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-participant-id", "", "Session participant ID.", true)}, - }, - }, - } -} - -func sessionConnectionsResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "connections", - Singular: "connection", - Short: "Inspect session connections", - PathPlural: "session-connections", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List connections for a session", - Long: "List connections for a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("connections"), - resourcecmdStringSliceFlag("status", "params.Status", "Filter by connection status"), - resourcecmdStringSliceFlag("connection-state", "params.ConnectionState", "Filter by connection state"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session connection ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("participant-id", "params.ParticipantId", "Filter by participant ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session connection", - Long: "Get a single session connection by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-connection-id", "", "Session connection ID.", true)}, - }, - }, - } -} - -func sessionEventsResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "events", - Singular: "event", - Short: "Inspect session events", - PathPlural: "session-events", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List events for a session", - Long: "List events for a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("events"), - resourcecmdStringSliceFlag("type", "params.Type", "Filter by event type"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by event ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("session-connection-id", "params.SessionConnectionId", "Filter by session connection ID"), - resourcecmdStringSliceFlag("provider-run-id", "params.ProviderRunId", "Filter by provider run ID"), - resourcecmdStringSliceFlag("session-message-id", "params.SessionMessageId", "Filter by session message ID"), - resourcecmdStringSliceFlag("session-error-id", "params.SessionErrorId", "Filter by session error ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session event", - Long: "Get a single session event by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-event-id", "", "Session event ID.", true)}, - }, - }, - } -} - -func sessionProvidersResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "providers", - Singular: "provider", - Short: "Manage session providers", - PathPlural: "session-providers", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List providers for a session", - Long: "List providers connected to a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("session providers"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session provider ID"), - resourcecmdStringSliceFlag("session-template-id", "params.SessionTemplateId", "Filter by session template ID"), - resourcecmdStringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - resourcecmdStringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - resourcecmdStringSliceFlag("provider-config-id", "params.ProviderConfigId", "Filter by provider config ID"), - resourcecmdStringSliceFlag("provider-auth-config-id", "params.ProviderAuthConfigId", "Filter by provider auth config ID"), - resourcecmdStringSliceFlag("status", "params.Status", "Filter by provider status"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session provider", - Long: "Get a single session provider by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-provider-id", "", "Session provider ID.", true)}, - }, - { - Name: resourcecmd.OperationCreate, - Short: "Create a session provider", - Long: "Add a provider to a session using the currently supported API shape.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "body.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdJSONFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - resourcecmdJSONFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - }, - { - Name: resourcecmd.OperationUpdate, - Short: "Update a session provider", - Long: "Update tool filters on a session provider.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-provider-id", "", "Session provider ID.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdJSONFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - resourcecmdJSONFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - }, - { - Name: resourcecmd.OperationDelete, - Short: "Delete a session provider", - Long: "Remove a provider from a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-provider-id", "", "Session provider ID.", true)}, - }, - }, - } -} - -func sessionErrorsResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "errors", - Singular: "error", - Short: "Inspect session errors", - PathPlural: "session-errors", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List errors for a session", - Long: "List errors for a session.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-id", "params.SessionId", "Session ID. Find one with `metorial sessions list`.", true)}, - Flags: append(resourcecmdPaginationFlags("errors"), - resourcecmdStringSliceFlag("type", "params.Type", "Filter by error type"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session error ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("session-connection-id", "params.SessionConnectionId", "Filter by session connection ID"), - resourcecmdStringSliceFlag("provider-run-id", "params.ProviderRunId", "Filter by provider run ID"), - resourcecmdStringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - resourcecmdStringSliceFlag("session-message-id", "params.SessionMessageId", "Filter by session message ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session error", - Long: "Get a single session error by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-error-id", "", "Session error ID.", true)}, - }, - }, - } -} - -func sessionTemplatesResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "session-templates", - Singular: "session-template", - Short: "Manage session templates", - Long: "Create and inspect reusable session templates.", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List session templates", - Long: "List session templates for the selected instance.", - Flags: append(resourcecmdPaginationFlags("session templates"), - resourcecmdStringSliceFlag("status", "params.Status", "Filter by template status"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session template ID"), - resourcecmdStringSliceFlag("session-id", "params.SessionId", "Filter by session ID"), - resourcecmdStringSliceFlag("session-provider-id", "params.SessionProviderId", "Filter by session provider ID"), - resourcecmdStringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - resourcecmdStringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - resourcecmdStringSliceFlag("provider-config-id", "params.ProviderConfigId", "Filter by provider config ID"), - resourcecmdStringSliceFlag("provider-auth-config-id", "params.ProviderAuthConfigId", "Filter by provider auth config ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session template", - Long: "Get a single session template by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-id", "", "Session template ID. Find one with `metorial session-templates list`.", true)}, - }, - { - Name: resourcecmd.OperationCreate, - Short: "Create a session template", - Long: "Create a session template. Use repeatable `--provider` flags or `--provider-file` to define template providers.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("name", "body.Name", "Template name.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdStringFlag("description", "body.Description", "Optional description", false), - resourcecmdJSONFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - resourcecmdJSONFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - resourcecmdProviderFlag(), - resourcecmdProviderFileFlag(), - }, - Examples: []string{ - `metorial session-templates create "Default GitHub session" --provider deployment=dep_123`, - }, - }, - { - Name: resourcecmd.OperationUpdate, - Short: "Update a session template", - Long: "Update mutable fields on a session template.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-id", "", "Session template ID. Find one with `metorial session-templates list`.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdStringFlag("name", "body.Name", "Updated template name", false), - resourcecmdStringFlag("description", "body.Description", "Updated description", false), - resourcecmdJSONFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - resourcecmdJSONFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - }, - }, - } -} - -func sessionTemplateProvidersResourceSpec() resourcecmd.ResourceSpec { - return resourcecmd.ResourceSpec{ - Plural: "providers", - Singular: "provider", - Short: "Manage session template providers", - PathPlural: "session-template-providers", - Operations: []resourcecmd.OperationSpec{ - { - Name: resourcecmd.OperationList, - Short: "List providers for a session template", - Long: "List provider configurations attached to a session template.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-id", "params.SessionTemplateId", "Session template ID. Find one with `metorial session-templates list`.", true)}, - Flags: append(resourcecmdPaginationFlags("session template providers"), - resourcecmdStringSliceFlag("status", "params.Status", "Filter by provider status"), - resourcecmdStringSliceFlag("id", "params.Id", "Filter by session template provider ID"), - resourcecmdStringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - resourcecmdStringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - resourcecmdStringSliceFlag("provider-config-id", "params.ProviderConfigId", "Filter by provider config ID"), - resourcecmdStringSliceFlag("provider-auth-config-id", "params.ProviderAuthConfigId", "Filter by provider auth config ID"), - ), - }, - { - Name: resourcecmd.OperationGet, - Short: "Get a session template provider", - Long: "Get a single session template provider by ID.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-provider-id", "", "Session template provider ID.", true)}, - }, - { - Name: resourcecmd.OperationCreate, - Short: "Create a session template provider", - Long: "Add a provider configuration to a session template.", - Args: []resourcecmd.ArgumentSpec{ - resourcecmdArg("session-template-id", "body.SessionTemplateId", "Session template ID. Find one with `metorial session-templates list`.", true), - resourcecmdArg("provider-deployment-id", "body.ProviderDeploymentId", "Provider deployment ID. Find one with `metorial deployments list`.", true), - }, - Flags: []resourcecmd.FlagSpec{ - resourcecmdStringFlag("provider-config-id", "body.ProviderConfigId", "Optional provider config ID", false), - resourcecmdStringFlag("provider-config-vault-id", "body.ProviderConfigVaultId", "Optional provider config vault ID", false), - resourcecmdStringFlag("provider-auth-config-id", "body.ProviderAuthConfigId", "Optional provider auth config ID", false), - resourcecmdJSONFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - resourcecmdJSONFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - }, - { - Name: resourcecmd.OperationUpdate, - Short: "Update a session template provider", - Long: "Update tool filters on a session template provider.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-provider-id", "", "Session template provider ID.", true)}, - Flags: []resourcecmd.FlagSpec{ - resourcecmdJSONFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - resourcecmdJSONFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - }, - { - Name: resourcecmd.OperationDelete, - Short: "Delete a session template provider", - Long: "Remove a provider configuration from a session template.", - Args: []resourcecmd.ArgumentSpec{resourcecmdArg("session-template-provider-id", "", "Session template provider ID.", true)}, - }, - }, - } -} - -func resourcecmdArg(name, target, description string, required bool) resourcecmd.ArgumentSpec { - return resourcecmd.ArgumentSpec{Name: name, Target: target, Description: description, Required: required} -} - -func resourcecmdStringFlag(name, target, usage string, required bool) resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: name, Type: resourcecmd.FlagString, Target: target, Usage: usage, Required: required} -} - -func resourcecmdStringSliceFlag(name, target, usage string) resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: name, Type: resourcecmd.FlagStringSlice, Target: target, Usage: usage, Repeated: true} -} - -func resourcecmdJSONFlag(name, target, usage string) resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: name, Type: resourcecmd.FlagJSON, Target: target, Usage: usage} -} - -func resourcecmdJSONFileFlag(name, target, usage string) resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: name, Type: resourcecmd.FlagJSONFile, Target: target, Usage: usage} -} - -func resourcecmdPaginationFlags(label string) []resourcecmd.FlagSpec { - return []resourcecmd.FlagSpec{ - {Name: "limit", Type: resourcecmd.FlagFloat, Target: "params.Limit", Usage: "Limit the number of " + label}, - {Name: "after", Type: resourcecmd.FlagString, Target: "params.After", Usage: "Fetch " + label + " after this cursor"}, - {Name: "before", Type: resourcecmd.FlagString, Target: "params.Before", Usage: "Fetch " + label + " before this cursor"}, - {Name: "cursor", Type: resourcecmd.FlagString, Target: "params.Cursor", Usage: "Fetch " + label + " using an opaque cursor"}, - {Name: "order", Type: resourcecmd.FlagString, Target: "params.Order", Usage: "Sort order"}, - } -} - -func resourcecmdProviderFlag() resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: "provider", Type: resourcecmd.FlagStringSlice, Usage: "Provider spec in key=value form. Supported keys: deployment, config, config-vault, auth-config", Repeated: true} -} - -func resourcecmdProviderFileFlag() resourcecmd.FlagSpec { - return resourcecmd.FlagSpec{Name: "provider-file", Type: resourcecmd.FlagString, Usage: "Read a JSON array of provider specs from a file"} -} diff --git a/internal/commandutil/help.go b/internal/commandutil/help.go index fc1e035..2b9451a 100644 --- a/internal/commandutil/help.go +++ b/internal/commandutil/help.go @@ -61,30 +61,40 @@ func SetCommandAnnotation(command *cobra.Command, key, value string) { } func RootLongDescription() string { + return ConsumerRootLongDescription() +} + +func ConsumerRootLongDescription() string { if BrowserShellEnabled() { return helpColors.Bold(METORIAL_2) + "\n\n" + strings.TrimSpace(` -Welcome to the Metorial browser shell. Use it to browse providers, manage -deployments, configs, identities, sessions, integrations, MCP tools, and send -raw API requests from the browser. - -Start with "metorial providers list" or "metorial deployments list" to explore -core resources, "metorial sessions list" to inspect active sessions, -"metorial integrations list" or "metorial integrations catalog list" to work -with integrations, and "metorial fetch" for raw authenticated API requests. +Welcome to the Metorial browser shell. Use it to discover, set up, and call +integration tools over MCP. + +Start with "metorial integrations list" or "metorial integrations catalog list" +to work with integrations, and "metorial integrations call" to invoke a tool. `) } return helpColors.Bold(METORIAL_2) + "\n\n" + strings.TrimSpace(` -Welcome to the Metorial CLI! Use it to browse providers, manage deployments, -configs, identities, and sessions, work with integrations and MCP tools, send -raw API requests, and bootstrap example projects. - -Start with "metorial login" to sign in, "metorial providers list" or -"metorial deployments list" to explore core resources, "metorial sessions list" -to inspect active sessions, "metorial integrations list" or -"metorial integrations catalog list" to work with integrations, "metorial fetch" -for raw authenticated API requests, "metorial example list" to clone official -examples, and "metorial open" to launch the dashboard in a browser. +Welcome to the Metorial CLI! Use it to discover, set up, and call integration +tools over MCP. + +Start with "metorial login" to sign in, "metorial integrations list" or +"metorial integrations catalog list" to work with integrations, and +"metorial open" to launch the dashboard in a browser. + +Resource administration, raw API requests, and examples live in metorial-admin. +`) +} + +func AdminRootLongDescription() string { + return helpColors.Bold(METORIAL_2) + "\n\n" + strings.TrimSpace(` +Welcome to the Metorial Admin CLI! Use it to manage Magnetar resources, send +raw API requests, and bootstrap official example projects. + +Start with "metorial-admin login" to sign in, "metorial-admin providers list" +to explore resources, "metorial-admin fetch" for raw authenticated API +requests, and "metorial-admin example list" to clone official examples. `) } diff --git a/internal/generated/admin/catalog.go b/internal/generated/admin/catalog.go new file mode 100644 index 0000000..d08792f --- /dev/null +++ b/internal/generated/admin/catalog.go @@ -0,0 +1,6758 @@ +// Code generated by oss/cli/generator. DO NOT EDIT. + +package admin + +import "github.com/metorial/cli/internal/resourcecmd" + +func Catalog() []resourcecmd.ResourceSpec { + return []resourcecmd.ResourceSpec{ + { + Plural: "instance", + Singular: "instance", + Short: "Instances", + Long: "Endpoints for listing and retrieving instances. An instance is an isolated environment within a Metorial project. Instances are created via the dashboard (since API keys are scoped to instances). Common setups include production, staging, and development instances.", + Aliases: []string{"instances"}, + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/instances/:instanceId", + Short: "Get instance details", + Long: "Retrieves metadata and configuration details for a specific instance.", + SDKMapping: "instances.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "instance-id", Target: "path.instanceId", Required: true, Description: "instance id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/instances", + Short: "List instances", + Long: "Lists all instances within the organization that the authenticated actor has access to.", + SDKMapping: "instances.list", + }, + }, + }, + { + Plural: "providers", + Singular: "providers", + Short: "Providers", + Long: "A provider is a read-only template for an MCP server integration (like GitHub or Slack). To use a provider, create a deployment from it.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/providers/:providerId", + Short: "Get provider", + Long: "Retrieves a specific provider by ID.", + SDKMapping: "providers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-id", Target: "path.providerId", Required: true, Description: "provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/providers", + Short: "List providers", + Long: "Returns a paginated list of providers.", + SDKMapping: "providers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search providers by name, description, or readme", Required: false, Repeated: false}, + {Name: "auth-method", Type: resourcecmd.FlagStringSlice, Target: "query.auth_method", Usage: "Filter by auth method — matches an auth method ID, auth method global ID, key, name, or type (oauth, token, service_account, custom)", Required: false, Repeated: true}, + {Name: "auth-setup", Type: resourcecmd.FlagStringSlice, Target: "query.auth_setup", Usage: "Filter by auth setup status. \"configured\" matches providers with a token or custom auth method, or with auth credentials already configured. \"not_configured\" matches providers with only OAuth auth methods and no auth credentials configured.", Required: false, Repeated: true}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "listings", + Singular: "listings", + Short: "Provider Listings", + Long: "A listing is a provider enriched with marketplace metadata.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-listings/:providerListingId", + Short: "Get provider listing", + Long: "Retrieves a specific provider listing by ID.", + SDKMapping: "providerListings.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-listing-id", Target: "path.providerListingId", Required: true, Description: "provider listing id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-listings", + Short: "List provider listings", + Long: "Returns a paginated list of provider listings.", + SDKMapping: "providerListings.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "provider-category-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_category_id", Usage: "provider_category_id", Required: false, Repeated: true}, + {Name: "provider-collection-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_collection_id", Usage: "provider_collection_id", Required: false, Repeated: true}, + {Name: "provider-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_group_id", Usage: "provider_group_id", Required: false, Repeated: true}, + {Name: "publisher-id", Type: resourcecmd.FlagStringSlice, Target: "query.publisher_id", Usage: "publisher_id", Required: false, Repeated: true}, + {Name: "is-owner", Type: resourcecmd.FlagBool, Target: "query.is_owner", Usage: "is_owner", Required: false, Repeated: false}, + {Name: "is-public", Type: resourcecmd.FlagBool, Target: "query.is_public", Usage: "is_public", Required: false, Repeated: false}, + {Name: "is-verified", Type: resourcecmd.FlagBool, Target: "query.is_verified", Usage: "is_verified", Required: false, Repeated: false}, + {Name: "is-official", Type: resourcecmd.FlagBool, Target: "query.is_official", Usage: "is_official", Required: false, Repeated: false}, + {Name: "is-metorial", Type: resourcecmd.FlagBool, Target: "query.is_metorial", Usage: "is_metorial", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider listing creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider listing last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "versions", + Singular: "versions", + Short: "Provider Versions", + Long: "A version is a specific release of a provider (e.g., v1.2.0). Each version has its own tools, auth methods, and config schema. Deployments are pinned to a version for security reasons.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-versions/:providerVersionId", + Short: "Get provider version", + Long: "Retrieves a specific provider version by ID.", + SDKMapping: "providers.versions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-version-id", Target: "path.providerVersionId", Required: true, Description: "provider version id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-versions", + Short: "List provider versions", + Long: "Returns a paginated list of provider versions.", + SDKMapping: "providers.versions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by version ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider version creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider version last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "specifications", + Singular: "specifications", + Short: "Provider Specifications", + Long: "A specification defines what a provider version can do: its tools, auth methods, and required configuration fields.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-specifications/:providerSpecificationId", + Short: "Get provider specification", + Long: "Retrieves a specific provider specification by ID.", + SDKMapping: "providers.specifications.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-specification-id", Target: "path.providerSpecificationId", Required: true, Description: "provider specification id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-specifications", + Short: "List provider specifications", + Long: "Returns a paginated list of provider specifications.", + SDKMapping: "providers.specifications.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by specification ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_version_id", Usage: "Filter by provider version ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider specification creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider specification last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "tools", + Singular: "tools", + Short: "Provider Tools", + Long: "A tool is a single action a provider can perform like 'search_issues' or 'send_message'. Tools are what AI agents call via MCP. By default, tools from the latest provider version are returned. Use the optional version filter to get tools for a specific version.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-tools/:providerToolId", + Short: "Get provider tool", + Long: "Retrieves a specific provider tool by ID.", + SDKMapping: "providers.tools.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-tool-id", Target: "path.providerToolId", Required: true, Description: "provider tool id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-tools", + Short: "List provider tools", + Long: "Returns a paginated list of provider tools. By default returns tools from the latest version. Use optional filters to get tools for a specific version.", + SDKMapping: "providers.tools.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "provider-version-id", Type: resourcecmd.FlagString, Target: "query.provider_version_id", Usage: "provider_version_id", Required: false, Repeated: false}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_method_id", Usage: "Filter to tools compatible with one auth method ID, or the common compatible subset for multiple auth method IDs.", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "triggers", + Singular: "triggers", + Short: "Provider Triggers", + Long: "A provider trigger describes an event source a provider can emit for callbacks. Use triggers to discover which callback subscriptions a provider version supports.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-triggers/:providerTriggerId", + Short: "Get provider trigger", + Long: "Retrieves a specific provider trigger by ID.", + SDKMapping: "providers.triggers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-trigger-id", Target: "path.providerTriggerId", Required: true, Description: "provider trigger id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-triggers", + Short: "List provider triggers", + Long: "Returns a paginated list of provider triggers for a specific provider version.", + SDKMapping: "providers.triggers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "provider-version-id", Type: resourcecmd.FlagString, Target: "query.provider_version_id", Usage: "Provider version to list triggers for", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "categories", + Singular: "categories", + Short: "Provider Categories", + Long: "A category groups providers by function like 'Developer Tools' or 'ERPs'.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-categories/:providerCategoryId", + Short: "Get provider category", + Long: "Retrieves a specific provider category by ID.", + SDKMapping: "providerCategories.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-category-id", Target: "path.providerCategoryId", Required: true, Description: "provider category id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-categories", + Short: "List provider categories", + Long: "Returns a paginated list of provider categories.", + SDKMapping: "providerCategories.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by category ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-listing-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_listing_id", Usage: "Filter by provider listing ID(s)", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "collections", + Singular: "collections", + Short: "Provider Collections", + Long: "A collection is a curated set of providers like 'Featured', 'Most Popular', or 'New Arrivals'.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-collections/:providerCollectionId", + Short: "Get provider collection", + Long: "Retrieves a specific provider collection by ID.", + SDKMapping: "providerCollections.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-collection-id", Target: "path.providerCollectionId", Required: true, Description: "provider collection id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-collections", + Short: "List provider collections", + Long: "Returns a paginated list of provider collections.", + SDKMapping: "providerCollections.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by collection ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-listing-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_listing_id", Usage: "Filter by provider listing ID(s)", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "groups", + Singular: "groups", + Short: "Provider Groups", + Long: "A group is a user-defined custom folder for organizing providers in your instance like 'Sales Tools' or 'Engineering'.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "add-listing", + Method: "POST", + Path: "/provider-groups/:providerGroupId/listings", + Short: "Add listing to group", + Long: "Adds a provider listing to a group.", + SDKMapping: "providerGroups.addListing", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-group-id", Target: "path.providerGroupId", Required: true, Description: "provider group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-listing-id", Type: resourcecmd.FlagString, Target: "body.provider_listing_id", Usage: "provider_listing_id", Required: true, Repeated: false}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/provider-groups", + Short: "Create provider group", + Long: "Creates a new custom provider group.", + SDKMapping: "providerGroups.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-groups/:providerGroupId", + Short: "Get provider group", + Long: "Retrieves a specific provider group by ID.", + SDKMapping: "providerGroups.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-group-id", Target: "path.providerGroupId", Required: true, Description: "provider group id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-groups", + Short: "List provider groups", + Long: "Returns a paginated list of provider groups.", + SDKMapping: "providerGroups.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by group ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-listing-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_listing_id", Usage: "Filter by provider listing ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider group creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider group last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "remove-listing", + Method: "DELETE", + Path: "/provider-groups/:providerGroupId/listings/:providerListingId", + Short: "Remove listing from group", + Long: "Removes a provider listing from a group.", + SDKMapping: "providerGroups.removeListing", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-group-id", Target: "path.providerGroupId", Required: true, Description: "provider group id"}, + {Name: "provider-listing-id", Target: "path.providerListingId", Required: true, Description: "provider listing id"}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-groups/:providerGroupId", + Short: "Update provider group", + Long: "Updates an existing provider group.", + SDKMapping: "providerGroups.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-group-id", Target: "path.providerGroupId", Required: true, Description: "provider group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "publishers", + Singular: "publishers", + Short: "Publishers", + Long: "A publisher is the organization or individual who created and maintains a provider.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/publishers/:publisherId", + Short: "Get publisher", + Long: "Retrieves a specific publisher by ID.", + SDKMapping: "publishers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "publisher-id", Target: "path.publisherId", Required: true, Description: "publisher id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/publishers", + Short: "List publishers", + Long: "Returns a paginated list of publishers.", + SDKMapping: "publishers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "auth-methods", + Singular: "auth-methods", + Short: "Provider Auth Methods", + Long: "An auth method defines one way to authenticate with a provider (OAuth, API token, or custom credentials). A provider version may support multiple auth methods.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-auth-methods/:providerAuthMethodId", + Short: "Get provider auth method", + Long: "Retrieves a specific provider auth method by ID.", + SDKMapping: "providers.authMethods.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-method-id", Target: "path.providerAuthMethodId", Required: true, Description: "provider auth method id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-auth-methods", + Short: "List provider auth methods", + Long: "Returns a paginated list of provider auth methods.", + SDKMapping: "providers.authMethods.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "provider-version-id", Type: resourcecmd.FlagString, Target: "query.provider_version_id", Usage: "provider_version_id", Required: false, Repeated: false}, + {Name: "adapter", Type: resourcecmd.FlagString, Target: "query.adapter", Usage: "adapter", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "deployments", + Singular: "deployments", + Short: "Provider Deployments", + Long: "A deployment is a running instance of a provider, pinned to a specific version. Deployments support custom configuration values and user authentication.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-deployments", + Short: "Create provider deployment", + Long: "Creates a new provider deployment.", + SDKMapping: "providerDeployments.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "The provider to deploy", Required: true, Repeated: false}, + {Name: "locked-provider-version-id", Type: resourcecmd.FlagString, Target: "body.locked_provider_version_id", Usage: "Pin this deployment to a specific provider version", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "Existing provider config ID", Required: false, Repeated: false}, + {Name: "config", Type: resourcecmd.FlagJSON, Target: "body.provider_config", Usage: "provider_config", Required: false, Repeated: false}, + {Name: "config-file", Type: resourcecmd.FlagJSONFile, Target: "body.provider_config", Usage: "Read provider_config JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-deployments/:providerDeploymentId", + Short: "Get provider deployment", + Long: "Retrieves a specific provider deployment by ID.", + SDKMapping: "providerDeployments.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-deployment-id", Target: "path.providerDeploymentId", Required: true, Description: "provider deployment id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-deployments", + Short: "List provider deployments", + Long: "Returns a paginated list of provider deployments.", + SDKMapping: "providerDeployments.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_version_id", Usage: "Filter by version ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID(s)", Required: false, Repeated: true}, + {Name: "identity-credential-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_credential_id", Usage: "Filter by identity credential ID(s)", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider deployment creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider deployment last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-deployments/:providerDeploymentId", + Short: "Update provider deployment", + Long: "Updates a specific provider deployment.", + SDKMapping: "providerDeployments.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-deployment-id", Target: "path.providerDeploymentId", Required: true, Description: "provider deployment id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "locked-provider-version-id", Type: resourcecmd.FlagString, Target: "body.locked_provider_version_id", Usage: "Pin this deployment to a specific provider version, or null to follow latest", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "configs", + Singular: "configs", + Short: "Provider Configs", + Long: "A config holds settings for a deployment, like API endpoints or feature flags. Create configs with values directly, or from a saved config vault with pre-saved values.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-configs", + Short: "Create provider config", + Long: "Creates a new provider config.", + SDKMapping: "providerDeployments.configs.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "Provider ID", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "Optional provider deployment ID", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "value", Type: resourcecmd.FlagJSON, Target: "body.value", Usage: "Provider-specific configuration values", Required: false, Repeated: false}, + {Name: "value-file", Type: resourcecmd.FlagJSONFile, Target: "body.value", Usage: "Read value JSON from a file", Required: false, Repeated: false}, + {Name: "provider-config-vault-id", Type: resourcecmd.FlagString, Target: "body.provider_config_vault_id", Usage: "Config vault ID to use as template", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/provider-configs/:providerConfigId", + Short: "Delete provider config", + Long: "Permanently deletes a provider config.", + SDKMapping: "providerDeployments.configs.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-id", Target: "path.providerConfigId", Required: true, Description: "provider config id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-configs/:providerConfigId", + Short: "Get provider config", + Long: "Retrieves a specific provider config by ID.", + SDKMapping: "providerDeployments.configs.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-id", Target: "path.providerConfigId", Required: true, Description: "provider config id"}, + }, + }, + { + Name: "get-config-schema", + Method: "GET", + Path: "/provider-config-schema", + Short: "Get config schema", + Long: "Retrieves the JSON Schema for configuration of this provider deployment.", + SDKMapping: "providerDeployments.configs.getConfigSchema", + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "query.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "provider-version-id", Type: resourcecmd.FlagString, Target: "query.provider_version_id", Usage: "provider_version_id", Required: false, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "query.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: false}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-configs", + Short: "List provider configs", + Long: "Returns a paginated list of provider configs.", + SDKMapping: "providerDeployments.configs.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by config ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-specification-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_specification_id", Usage: "Filter by provider specification ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "available-for-use", Type: resourcecmd.FlagBool, Target: "query.available_for_use", Usage: "Only return configs that are not owned by another integration instance provider.", Required: false, Repeated: false}, + {Name: "available-for-provider-deployment-id", Type: resourcecmd.FlagString, Target: "query.available_for_provider_deployment_id", Usage: "Only return configs that are not locked to a different provider deployment.", Required: false, Repeated: false}, + {Name: "provider-config-vault-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_vault_id", Usage: "Filter by config vault ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID(s)", Required: false, Repeated: true}, + {Name: "identity-credential-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_credential_id", Usage: "Filter by identity credential ID(s)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider config creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider config last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-configs/:providerConfigId", + Short: "Update provider config", + Long: "Updates a specific provider config.", + SDKMapping: "providerDeployments.configs.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-id", Target: "path.providerConfigId", Required: true, Description: "provider config id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "vaults", + Singular: "vaults", + Short: "Provider Config Vaults", + Long: "A config vault is a saved, reusable set of configuration values. Use vaults to store credentials once and apply them to multiple deployments without re-entering.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-config-vaults", + Short: "Create provider config vault", + Long: "Creates a new provider config vault.", + SDKMapping: "providerDeployments.configVaults.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "Provider ID", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "Provider deployment ID", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "value", Type: resourcecmd.FlagJSON, Target: "body.value", Usage: "Secure configuration values to store in the vault", Required: true, Repeated: false}, + {Name: "value-file", Type: resourcecmd.FlagJSONFile, Target: "body.value", Usage: "Read value JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/provider-config-vaults/:providerConfigVaultId", + Short: "Delete provider config vault", + Long: "Permanently deletes a provider config vault.", + SDKMapping: "providerDeployments.configVaults.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-vault-id", Target: "path.providerConfigVaultId", Required: true, Description: "provider config vault id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-config-vaults/:providerConfigVaultId", + Short: "Get provider config vault", + Long: "Retrieves a specific provider config vault by ID.", + SDKMapping: "providerDeployments.configVaults.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-vault-id", Target: "path.providerConfigVaultId", Required: true, Description: "provider config vault id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-config-vaults", + Short: "List provider config vaults", + Long: "Returns a paginated list of provider config vaults.", + SDKMapping: "providerDeployments.configVaults.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by config vault ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-vault-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_vault_id", Usage: "Filter by config vault ID(s)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider config vault creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider config vault last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-config-vaults/:providerConfigVaultId", + Short: "Update provider config vault", + Long: "Updates a specific provider config vault.", + SDKMapping: "providerDeployments.configVaults.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-config-vault-id", Target: "path.providerConfigVaultId", Required: true, Description: "provider config vault id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "auth-configs", + Singular: "auth-configs", + Short: "Provider Auth Configs", + Long: "An auth config is a user's authenticated connection to a provider. Created when a user completes OAuth or manually enters an API token.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-auth-configs", + Short: "Create provider auth config", + Long: "Creates a new provider auth config.", + SDKMapping: "providerDeployments.authConfigs.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_method_id", Usage: "The authentication method this config uses (e.g., OAuth, API key)", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "The provider deployment this auth config is associated with (if applicable)", Required: false, Repeated: false}, + {Name: "value", Type: resourcecmd.FlagJSON, Target: "body.value", Usage: "Authentication config payload", Required: true, Repeated: false}, + {Name: "value-file", Type: resourcecmd.FlagJSONFile, Target: "body.value", Usage: "Read value JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/provider-auth-configs/:providerAuthConfigId", + Short: "Delete provider auth config", + Long: "Permanently deletes a provider auth config.", + SDKMapping: "providerDeployments.authConfigs.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-config-id", Target: "path.providerAuthConfigId", Required: true, Description: "provider auth config id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-auth-configs/:providerAuthConfigId", + Short: "Get provider auth config", + Long: "Retrieves a specific provider auth config by ID.", + SDKMapping: "providerDeployments.authConfigs.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-config-id", Target: "path.providerAuthConfigId", Required: true, Description: "provider auth config id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-auth-configs", + Short: "List provider auth configs", + Long: "Returns a paginated list of provider auth configs.", + SDKMapping: "providerDeployments.authConfigs.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by auth config ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "available-for-use", Type: resourcecmd.FlagBool, Target: "query.available_for_use", Usage: "Only return auth configs that are not owned by another integration instance provider.", Required: false, Repeated: false}, + {Name: "available-for-provider-deployment-id", Type: resourcecmd.FlagString, Target: "query.available_for_provider_deployment_id", Usage: "Only return auth configs that are not locked to a different provider deployment.", Required: false, Repeated: false}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_credentials_id", Usage: "Filter by auth credentials ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_method_id", Usage: "Filter by auth method ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID(s)", Required: false, Repeated: true}, + {Name: "identity-credential-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_credential_id", Usage: "Filter by identity credential ID(s)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider auth config creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider auth config last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-auth-configs/:providerAuthConfigId", + Short: "Update provider auth config", + Long: "Updates a specific provider auth config.", + SDKMapping: "providerDeployments.authConfigs.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-config-id", Target: "path.providerAuthConfigId", Required: true, Description: "provider auth config id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "credentials", + Singular: "credentials", + Short: "Provider Auth Credentials", + Long: "Auth credentials store your OAuth app registration (client ID, client secret, and scopes). These are the app-level credentials you get from a service like GitHub or Slack.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-auth-credentials", + Short: "Create provider auth credentials", + Long: "Creates new provider auth credentials.", + SDKMapping: "providerDeployments.authCredentials.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "Provider ID", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "config", Type: resourcecmd.FlagJSON, Target: "body.config", Usage: "config", Required: true, Repeated: false}, + {Name: "config-file", Type: resourcecmd.FlagJSONFile, Target: "body.config", Usage: "Read config JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/provider-auth-credentials/:providerAuthCredentialsId", + Short: "Delete provider auth credentials", + Long: "Permanently deletes provider auth credentials.", + SDKMapping: "providerDeployments.authCredentials.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-credentials-id", Target: "path.providerAuthCredentialsId", Required: true, Description: "provider auth credentials id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-auth-credentials/:providerAuthCredentialsId", + Short: "Get provider auth credentials", + Long: "Retrieves specific provider auth credentials by ID.", + SDKMapping: "providerDeployments.authCredentials.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-credentials-id", Target: "path.providerAuthCredentialsId", Required: true, Description: "provider auth credentials id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-auth-credentials", + Short: "List provider auth credentials", + Long: "Returns a paginated list of provider auth credentials.", + SDKMapping: "providerDeployments.authCredentials.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by credential ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_method_id", Usage: "Filter by provider auth method ID(s)", Required: false, Repeated: true}, + {Name: "origin", Type: resourcecmd.FlagStringSlice, Target: "query.origin", Usage: "Filter by credential origin (custom, managed)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider auth credentials creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider auth credentials last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-auth-credentials/:providerAuthCredentialsId", + Short: "Update provider auth credentials", + Long: "Updates specific provider auth credentials.", + SDKMapping: "providerDeployments.authCredentials.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-auth-credentials-id", Target: "path.providerAuthCredentialsId", Required: true, Description: "provider auth credentials id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "client-id", Type: resourcecmd.FlagString, Target: "body.client_id", Usage: "client_id", Required: false, Repeated: false}, + {Name: "client-secret", Type: resourcecmd.FlagString, Target: "body.client_secret", Usage: "client_secret", Required: false, Repeated: false}, + {Name: "scopes", Type: resourcecmd.FlagStringSlice, Target: "body.scopes", Usage: "scopes", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "setup-sessions", + Singular: "setup-sessions", + Short: "Provider Setup Sessions", + Long: "A setup session tracks an in-progress OAuth flow, storing state during the redirect. On success, it creates an auth config with the user's access token.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/provider-setup-sessions", + Short: "Create provider setup session", + Long: "Creates a new provider setup session for OAuth authentication.", + SDKMapping: "providerDeployments.setupSessions.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "The provider ID", Required: false, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "Optional provider deployment ID", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_method_id", Usage: "The authentication method to use (e.g., OAuth flow)", Required: false, Repeated: false}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_credentials_id", Usage: "Optional OAuth app credentials to use instead of defaults", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Optional identity to link this setup session to", Required: false, Repeated: false}, + {Name: "consumer-id", Type: resourcecmd.FlagString, Target: "body.consumer_id", Usage: "Optional consumer to link this setup session to", Required: false, Repeated: false}, + {Name: "redirect-url", Type: resourcecmd.FlagString, Target: "body.redirect_url", Usage: "redirect_url", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "The type of setup session, determining the flow and outcome of the session", Required: false, Repeated: false}, + {Name: "configuration", Type: resourcecmd.FlagJSON, Target: "body.configuration", Usage: "configuration", Required: false, Repeated: false}, + {Name: "configuration-file", Type: resourcecmd.FlagJSONFile, Target: "body.configuration", Usage: "Read configuration JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/provider-setup-sessions/:providerSetupSessionId", + Short: "Delete provider setup session", + Long: "Deletes a provider setup session.", + SDKMapping: "providerDeployments.setupSessions.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-setup-session-id", Target: "path.providerSetupSessionId", Required: true, Description: "provider setup session id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/provider-setup-sessions/:providerSetupSessionId", + Short: "Get provider setup session", + Long: "Retrieves a specific provider setup session by ID.", + SDKMapping: "providerDeployments.setupSessions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-setup-session-id", Target: "path.providerSetupSessionId", Required: true, Description: "provider setup session id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-setup-sessions", + Short: "List provider setup sessions", + Long: "Returns a paginated list of provider setup sessions.", + SDKMapping: "providerDeployments.setupSessions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by setup session ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_method_id", Usage: "Filter by auth method ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_credentials_id", Usage: "Filter by provider auth credentials ID(s)", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by session status (archived, failed, completed, expired, pending)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider setup session creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider setup session last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/provider-setup-sessions/:providerSetupSessionId", + Short: "Update provider setup session", + Long: "Updates a specific provider setup session.", + SDKMapping: "providerDeployments.setupSessions.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-setup-session-id", Target: "path.providerSetupSessionId", Required: true, Description: "provider setup session id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Optional identity to link this setup session to", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "custom-providers", + Singular: "custom-providers", + Short: "Custom Providers", + Long: "Custom providers allow you to deploy your own MCP servers. Create providers from container images, remote URLs, or serverless functions.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "archive", + Method: "POST", + Path: "/custom-providers/:customProviderId/archive", + Short: "Archive custom provider", + Long: "Archives a specific custom provider and disables new connections to it.", + SDKMapping: "customProviders.archive", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-id", Target: "path.customProviderId", Required: true, Description: "custom provider id"}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/custom-providers", + Short: "Create custom provider", + Long: "Creates a new custom provider.", + SDKMapping: "customProviders.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "config", Type: resourcecmd.FlagJSON, Target: "body.config", Usage: "config", Required: false, Repeated: false}, + {Name: "config-file", Type: resourcecmd.FlagJSONFile, Target: "body.config", Usage: "Read config JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/custom-providers/:customProviderId", + Short: "Get custom provider", + Long: "Retrieves a specific custom provider by ID.", + SDKMapping: "customProviders.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-id", Target: "path.customProviderId", Required: true, Description: "custom provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/custom-providers", + Short: "List custom providers", + Long: "Returns a paginated list of custom providers.", + SDKMapping: "customProviders.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by type (container, function, remote)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by custom provider IDs", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter custom provider creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter custom provider last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/custom-providers/:customProviderId", + Short: "Update custom provider", + Long: "Updates a specific custom provider.", + SDKMapping: "customProviders.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-id", Target: "path.customProviderId", Required: true, Description: "custom provider id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "readme", Type: resourcecmd.FlagString, Target: "body.readme", Usage: "README content in markdown format", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "versions", + Singular: "versions", + Short: "Custom Provider Versions", + Long: "Versions represent different releases of a custom provider. Each version can be deployed to environments.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/custom-provider-versions", + Short: "Create custom provider version", + Long: "Creates a new version for a custom provider.", + SDKMapping: "customProviders.versions.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "custom-provider-id", Type: resourcecmd.FlagString, Target: "body.custom_provider_id", Usage: "Custom provider ID", Required: true, Repeated: false}, + {Name: "config", Type: resourcecmd.FlagJSON, Target: "body.config", Usage: "config", Required: false, Repeated: false}, + {Name: "config-file", Type: resourcecmd.FlagJSONFile, Target: "body.config", Usage: "Read config JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/custom-provider-versions/:customProviderVersionId", + Short: "Get custom provider version", + Long: "Retrieves a specific version of a custom provider.", + SDKMapping: "customProviders.versions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-version-id", Target: "path.customProviderVersionId", Required: true, Description: "custom provider version id"}, + }, + }, + { + Name: "get-env", + Method: "GET", + Path: "/custom-provider-versions/:customProviderVersionId/env", + Short: "Get custom provider version environment", + Long: "Retrieves the environment variables for a specific version of a custom provider.", + SDKMapping: "customProviders.versions.getEnv", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-version-id", Target: "path.customProviderVersionId", Required: true, Description: "custom provider version id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/custom-provider-versions", + Short: "List custom provider versions", + Long: "Returns a paginated list of versions for a custom provider.", + SDKMapping: "customProviders.versions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by deployment status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by version ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_version_id", Usage: "Filter by provider version IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "custom-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_id", Usage: "Filter by custom provider IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "custom-provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_deployment_id", Usage: "Filter by custom provider deployment IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "custom-provider-environment-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_environment_id", Usage: "Filter by custom provider environment IDs (matches providers connected to sessions)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter custom provider version creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter custom provider version last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "deployments", + Singular: "deployments", + Short: "Custom Provider Deployments", + Long: "Deployments track the build and deployment process of custom provider versions. View deployment status and logs.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/custom-provider-deployments/:customProviderDeploymentId", + Short: "Get custom provider deployment", + Long: "Retrieves a specific deployment.", + SDKMapping: "customProviders.deployments.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-deployment-id", Target: "path.customProviderDeploymentId", Required: true, Description: "custom provider deployment id"}, + }, + }, + { + Name: "get-logs", + Method: "GET", + Path: "/custom-provider-deployments/:customProviderDeploymentId/logs", + Short: "Get deployment logs", + Long: "Retrieves the build and deployment logs for a deployment.", + SDKMapping: "customProviders.deployments.getLogs", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-deployment-id", Target: "path.customProviderDeploymentId", Required: true, Description: "custom provider deployment id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/custom-provider-deployments", + Short: "List custom provider deployments", + Long: "Returns a paginated list of deployments for a custom provider.", + SDKMapping: "customProviders.deployments.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (queued, deploying, succeeded, failed)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by deployment IDs", Required: false, Repeated: true}, + {Name: "custom-provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_version_id", Usage: "Filter by version IDs", Required: false, Repeated: true}, + {Name: "custom-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_id", Usage: "Filter by custom provider IDs", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter custom provider deployment creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter custom provider deployment last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "commits", + Singular: "commits", + Short: "Custom Provider Commits", + Long: "Commits represent version promotions between environments. Merge versions from one environment to another or rollback to a previous version.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/custom-provider-commits", + Short: "Create custom provider commit", + Long: "Creates a new commit to promote or rollback a version in an environment.", + SDKMapping: "customProviders.commits.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "message", Type: resourcecmd.FlagString, Target: "body.message", Usage: "Commit message", Required: true, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/custom-provider-commits/:customProviderCommitId", + Short: "Get custom provider commit", + Long: "Retrieves a specific commit.", + SDKMapping: "customProviders.commits.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-commit-id", Target: "path.customProviderCommitId", Required: true, Description: "custom provider commit id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/custom-provider-commits", + Short: "List custom provider commits", + Long: "Returns a paginated list of commits for a custom provider.", + SDKMapping: "customProviders.commits.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by commit IDs", Required: false, Repeated: true}, + {Name: "custom-provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_version_id", Usage: "Filter by version IDs", Required: false, Repeated: true}, + {Name: "custom-provider-environment-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_environment_id", Usage: "Filter by environment IDs", Required: false, Repeated: true}, + {Name: "custom-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_id", Usage: "Filter by custom provider IDs", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter custom provider commit creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter custom provider commit last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "environments", + Singular: "environments", + Short: "Custom Provider Environments", + Long: "Environments represent deployment targets for custom provider versions (e.g., staging, production).", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/custom-provider-environments/:customProviderEnvironmentId", + Short: "Get custom provider environment", + Long: "Retrieves a specific environment.", + SDKMapping: "customProviders.environments.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "custom-provider-environment-id", Target: "path.customProviderEnvironmentId", Required: true, Description: "custom provider environment id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/custom-provider-environments", + Short: "List custom provider environments", + Long: "Returns a paginated list of environments for a custom provider.", + SDKMapping: "customProviders.environments.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by environment IDs", Required: false, Repeated: true}, + {Name: "custom-provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_version_id", Usage: "Filter by version IDs", Required: false, Repeated: true}, + {Name: "custom-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.custom_provider_id", Usage: "Filter by custom provider IDs", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter custom provider environment creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter custom provider environment last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "identity", + Singular: "identity", + Short: "Identities", + Long: "Identities bundle credentials under a single owner actor so provider access can be managed and delegated consistently.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/identities", + Short: "Create identity", + Long: "Creates a new identity owned by an existing identity actor.", + SDKMapping: "identities.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "actor-id", Type: resourcecmd.FlagString, Target: "body.actor_id", Usage: "Identity actor that will own the new identity.", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Optional display name for the identity.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Optional description of the identity.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Additional metadata to store on the identity.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "credentials", Type: resourcecmd.FlagJSON, Target: "body.credentials", Usage: "Credentials to create and attach as part of identity creation.", Required: false, Repeated: false}, + {Name: "credentials-file", Type: resourcecmd.FlagJSONFile, Target: "body.credentials", Usage: "Read credentials JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/identities/:identityId", + Short: "Delete identity", + Long: "Archives an identity.", + SDKMapping: "identities.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-id", Target: "path.identityId", Required: true, Description: "identity id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identities/:identityId", + Short: "Get identity", + Long: "Retrieves a specific identity by ID.", + SDKMapping: "identities.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-id", Target: "path.identityId", Required: true, Description: "identity id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identities", + Short: "List identities", + Long: "Returns a paginated list of identities for the instance.", + SDKMapping: "identities.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Filter identities by name or description.", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more identity statuses.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by identity ID or IDs.", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by owner agent ID or IDs.", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by owner identity actor ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/identities/:identityId", + Short: "Update identity", + Long: "Updates mutable fields on an existing identity.", + SDKMapping: "identities.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-id", Target: "path.identityId", Required: true, Description: "identity id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Updated display name for the identity.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Updated description for the identity.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Updated metadata for the identity.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "actors", + Singular: "actors", + Short: "Identity Actors", + Long: "Identity actors represent people or agents that can own identities and participate in delegations.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/identity-actors", + Short: "Create identity actor", + Long: "Creates a new identity actor.", + SDKMapping: "identityActors.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "Whether this actor is a person or an agent.", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Human-readable display name for the actor.", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Optional description of the actor.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Additional metadata to store on the actor.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/identity-actors/:identityActorId", + Short: "Delete identity actor", + Long: "Archives an identity actor.", + SDKMapping: "identityActors.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-actor-id", Target: "path.identityActorId", Required: true, Description: "identity actor id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identity-actors/:identityActorId", + Short: "Get identity actor", + Long: "Retrieves a specific identity actor by ID.", + SDKMapping: "identityActors.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-actor-id", Target: "path.identityActorId", Required: true, Description: "identity actor id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identity-actors", + Short: "List identity actors", + Long: "Returns a paginated list of identity actors for the instance.", + SDKMapping: "identityActors.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Filter actors by name or description.", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more actor statuses.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by identity actor ID or IDs.", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by linked agent ID or IDs.", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by linked consumer ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity actor creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity actor last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/identity-actors/:identityActorId", + Short: "Update identity actor", + Long: "Updates mutable fields on an existing identity actor.", + SDKMapping: "identityActors.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-actor-id", Target: "path.identityActorId", Required: true, Description: "identity actor id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Updated display name for the actor.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Updated description for the actor.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Updated metadata for the actor.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "credentials", + Singular: "credentials", + Short: "Identity Credentials", + Long: "Identity credentials bind an identity to concrete provider deployment, config, and auth resources.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/identity-credentials", + Short: "Create identity credential", + Long: "Creates a new credential and attaches it to an identity.", + SDKMapping: "identities.credentials.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Identity that will own the new credential.", Required: true, Repeated: false}, + {Name: "deployment-id", Type: resourcecmd.FlagString, Target: "body.deployment_id", Usage: "Provider deployment to attach to the credential.", Required: false, Repeated: false}, + {Name: "config-id", Type: resourcecmd.FlagString, Target: "body.config_id", Usage: "Provider config to attach to the credential.", Required: false, Repeated: false}, + {Name: "auth-config-id", Type: resourcecmd.FlagString, Target: "body.auth_config_id", Usage: "Provider auth config to attach to the credential.", Required: false, Repeated: false}, + {Name: "delegation-config-id", Type: resourcecmd.FlagString, Target: "body.delegation_config_id", Usage: "Delegation config to apply to the credential.", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/identity-credentials/:identityCredentialId", + Short: "Delete identity credential", + Long: "Archives an identity credential.", + SDKMapping: "identities.credentials.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-credential-id", Target: "path.identityCredentialId", Required: true, Description: "identity credential id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identity-credentials/:identityCredentialId", + Short: "Get identity credential", + Long: "Retrieves a specific identity credential by ID.", + SDKMapping: "identities.credentials.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-credential-id", Target: "path.identityCredentialId", Required: true, Description: "identity credential id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identity-credentials", + Short: "List identity credentials", + Long: "Returns a paginated list of identity credentials for the instance.", + SDKMapping: "identities.credentials.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more credential statuses.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by identity credential ID or IDs.", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by owner agent ID or IDs.", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by owner actor ID or IDs.", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID or IDs.", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID or IDs.", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID or IDs.", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID or IDs.", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity credential creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity credential last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/identity-credentials/:identityCredentialId", + Short: "Update identity credential", + Long: "Updates the delegation config attached to an identity credential.", + SDKMapping: "identities.credentials.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-credential-id", Target: "path.identityCredentialId", Required: true, Description: "identity credential id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "delegation-config-id", Type: resourcecmd.FlagString, Target: "body.delegation_config_id", Usage: "Delegation config to apply to the credential.", Required: true, Repeated: false}, + }, + }, + }, + }, + { + Plural: "agents", + Singular: "agents", + Short: "Agents", + Long: "Inspect agents and their linked clients and instances.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/agents/:agentId", + Short: "Get agent", + Long: "Retrieves a specific agent by ID.", + SDKMapping: "agents.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "agent-id", Target: "path.agentId", Required: true, Description: "agent id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/agents", + Short: "List agents", + Long: "Returns a paginated list of agents for the instance.", + SDKMapping: "agents.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "type", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter agent creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter agent last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "delegations", + Singular: "delegations", + Short: "Identity Delegations", + Long: "Identity delegations grant provider permissions from one identity owner to another actor, with optional per-credential overrides.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/identity-delegations", + Short: "Create identity delegation", + Long: "Creates a new identity delegation.", + SDKMapping: "identities.delegations.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Identity to delegate.", Required: true, Repeated: false}, + {Name: "delegator-actor-id", Type: resourcecmd.FlagString, Target: "body.delegator_actor_id", Usage: "Actor initiating the delegation, if different from the owner.", Required: false, Repeated: false}, + {Name: "delegatee-actor-id", Type: resourcecmd.FlagString, Target: "body.delegatee_actor_id", Usage: "Actor receiving the delegation.", Required: true, Repeated: false}, + {Name: "permissions", Type: resourcecmd.FlagStringSlice, Target: "body.permissions", Usage: "Permissions to grant as part of the delegation.", Required: false, Repeated: true}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "Optional expiration timestamp for the delegation.", Required: false, Repeated: false}, + {Name: "delegation-config-id", Type: resourcecmd.FlagString, Target: "body.delegation_config_id", Usage: "Delegation config to use for this delegation.", Required: false, Repeated: false}, + {Name: "credential-overrides", Type: resourcecmd.FlagJSON, Target: "body.credential_overrides", Usage: "Optional per-credential permission overrides.", Required: false, Repeated: false}, + {Name: "credential-overrides-file", Type: resourcecmd.FlagJSONFile, Target: "body.credential_overrides", Usage: "Read credential_overrides JSON from a file", Required: false, Repeated: false}, + {Name: "note", Type: resourcecmd.FlagString, Target: "body.note", Usage: "Optional human-readable note for the delegation.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Additional metadata to store on the delegation.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identity-delegations/:identityDelegationId", + Short: "Get identity delegation", + Long: "Retrieves a specific identity delegation by ID.", + SDKMapping: "identities.delegations.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-id", Target: "path.identityDelegationId", Required: true, Description: "identity delegation id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identity-delegations", + Short: "List identity delegations", + Long: "Returns a paginated list of identity delegations for the instance.", + SDKMapping: "identities.delegations.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more delegation statuses.", Required: false, Repeated: true}, + {Name: "permissions", Type: resourcecmd.FlagStringSlice, Target: "query.permissions", Usage: "Filter by one or more granted permissions.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by delegation ID or IDs.", Required: false, Repeated: true}, + {Name: "owner-actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.owner_actor_id", Usage: "Filter by owner actor ID or IDs.", Required: false, Repeated: true}, + {Name: "delegator-actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.delegator_actor_id", Usage: "Filter by delegator actor ID or IDs.", Required: false, Repeated: true}, + {Name: "delegatee-actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.delegatee_actor_id", Usage: "Filter by delegatee actor ID or IDs.", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity delegation creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity delegation last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "revoke", + Method: "POST", + Path: "/identity-delegations/:identityDelegationId/revoke", + Short: "Revoke identity delegation", + Long: "Revokes an existing identity delegation.", + SDKMapping: "identities.delegations.revoke", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-id", Target: "path.identityDelegationId", Required: true, Description: "identity delegation id"}, + }, + }, + }, + }, + { + Plural: "delegation-configs", + Singular: "delegation-configs", + Short: "Identity Delegation Configs", + Long: "Delegation configs define the default policy for sub-delegation behavior and delegation depth.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/identity-delegation-configs", + Short: "Create identity delegation config", + Long: "Creates a new identity delegation config.", + SDKMapping: "identities.delegationConfigs.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Optional display name for the delegation config.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Optional description of the delegation policy.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Additional metadata to store on the delegation config.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "sub-delegation-behavior", Type: resourcecmd.FlagString, Target: "body.sub_delegation_behavior", Usage: "How sub-delegations should be handled.", Required: true, Repeated: false}, + {Name: "sub-delegation-depth", Type: resourcecmd.FlagFloat, Target: "body.sub_delegation_depth", Usage: "Maximum allowed sub-delegation depth.", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/identity-delegation-configs/:identityDelegationConfigId", + Short: "Delete identity delegation config", + Long: "Archives an identity delegation config.", + SDKMapping: "identities.delegationConfigs.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-config-id", Target: "path.identityDelegationConfigId", Required: true, Description: "identity delegation config id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identity-delegation-configs/:identityDelegationConfigId", + Short: "Get identity delegation config", + Long: "Retrieves a specific identity delegation config by ID.", + SDKMapping: "identities.delegationConfigs.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-config-id", Target: "path.identityDelegationConfigId", Required: true, Description: "identity delegation config id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identity-delegation-configs", + Short: "List identity delegation configs", + Long: "Returns a paginated list of identity delegation configs.", + SDKMapping: "identities.delegationConfigs.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Filter configs by name or description.", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more config statuses.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by config ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity delegation config creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity delegation config last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/identity-delegation-configs/:identityDelegationConfigId", + Short: "Update identity delegation config", + Long: "Updates mutable fields on an existing identity delegation config.", + SDKMapping: "identities.delegationConfigs.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-config-id", Target: "path.identityDelegationConfigId", Required: true, Description: "identity delegation config id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Updated display name for the delegation config.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Updated description for the delegation config.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Updated metadata for the delegation config.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "sub-delegation-behavior", Type: resourcecmd.FlagString, Target: "body.sub_delegation_behavior", Usage: "How sub-delegations should be handled.", Required: false, Repeated: false}, + {Name: "sub-delegation-depth", Type: resourcecmd.FlagFloat, Target: "body.sub_delegation_depth", Usage: "Maximum allowed sub-delegation depth.", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "delegation-requests", + Singular: "delegation-requests", + Short: "Identity Delegation Requests", + Long: "Identity delegation requests represent approval workflows for creating delegations that require consent.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "approve", + Method: "POST", + Path: "/identity-delegation-requests/:identityDelegationRequestId/approve", + Short: "Approve identity delegation request", + Long: "Approves an existing identity delegation request.", + SDKMapping: "identities.delegationRequests.approve", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-request-id", Target: "path.identityDelegationRequestId", Required: true, Description: "identity delegation request id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "allow-deleted", Type: resourcecmd.FlagBool, Target: "query.allow_deleted", Usage: "Allow approving a request that is already deleted.", Required: false, Repeated: false}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/identity-delegation-requests", + Short: "Create identity delegation request", + Long: "Creates a new identity delegation request.", + SDKMapping: "identities.delegationRequests.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Identity to request delegation for.", Required: true, Repeated: false}, + {Name: "requester-actor-id", Type: resourcecmd.FlagString, Target: "body.requester_actor_id", Usage: "Actor requesting the delegation.", Required: true, Repeated: false}, + {Name: "delegator-actor-id", Type: resourcecmd.FlagString, Target: "body.delegator_actor_id", Usage: "Actor submitting the request on behalf of the requester.", Required: false, Repeated: false}, + {Name: "permissions", Type: resourcecmd.FlagStringSlice, Target: "body.permissions", Usage: "Permissions being requested.", Required: false, Repeated: true}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "Timestamp when the request should expire.", Required: true, Repeated: false}, + {Name: "delegation-config-id", Type: resourcecmd.FlagString, Target: "body.delegation_config_id", Usage: "Delegation config to use for the resulting delegation.", Required: false, Repeated: false}, + {Name: "credential-overrides", Type: resourcecmd.FlagJSON, Target: "body.credential_overrides", Usage: "Optional per-credential permission overrides.", Required: false, Repeated: false}, + {Name: "credential-overrides-file", Type: resourcecmd.FlagJSONFile, Target: "body.credential_overrides", Usage: "Read credential_overrides JSON from a file", Required: false, Repeated: false}, + {Name: "note", Type: resourcecmd.FlagString, Target: "body.note", Usage: "Optional human-readable note for the request.", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Additional metadata to store on the request.", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "deny", + Method: "POST", + Path: "/identity-delegation-requests/:identityDelegationRequestId/deny", + Short: "Deny identity delegation request", + Long: "Denies an existing identity delegation request.", + SDKMapping: "identities.delegationRequests.deny", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-request-id", Target: "path.identityDelegationRequestId", Required: true, Description: "identity delegation request id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "allow-deleted", Type: resourcecmd.FlagBool, Target: "query.allow_deleted", Usage: "Allow denying a request that is already deleted.", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/identity-delegation-requests/:identityDelegationRequestId", + Short: "Get identity delegation request", + Long: "Retrieves a specific identity delegation request by ID.", + SDKMapping: "identities.delegationRequests.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "identity-delegation-request-id", Target: "path.identityDelegationRequestId", Required: true, Description: "identity delegation request id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "allow-deleted", Type: resourcecmd.FlagBool, Target: "query.allow_deleted", Usage: "Return the request even if it has been deleted.", Required: false, Repeated: false}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/identity-delegation-requests", + Short: "List identity delegation requests", + Long: "Returns a paginated list of identity delegation requests.", + SDKMapping: "identities.delegationRequests.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by one or more delegation request statuses.", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by delegation request ID or IDs.", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by requester actor ID or IDs.", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID or IDs.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter identity delegation request creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter identity delegation request last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "sessions", + Singular: "sessions", + Short: "Sessions", + Long: "Sessions are connections to providers that allow clients to interact with MCP servers. Each session can include one or more provider deployments.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/sessions", + Short: "Create session", + Long: "Creates a new session with provider deployments.", + SDKMapping: "sessions.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "providers", Type: resourcecmd.FlagJSON, Target: "body.providers", Usage: "providers", Required: true, Repeated: false}, + {Name: "providers-file", Type: resourcecmd.FlagJSONFile, Target: "body.providers", Usage: "Read providers JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/sessions/:sessionId", + Short: "Get session", + Long: "Retrieves a specific session by ID.", + SDKMapping: "sessions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-id", Target: "path.sessionId", Required: true, Description: "session id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/sessions", + Short: "List sessions", + Long: "Returns a paginated list of sessions.", + SDKMapping: "sessions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by connected agent ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by connected identity actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by connected consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by connected identity ID(s)", Required: false, Repeated: true}, + {Name: "session-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_template_id", Usage: "Filter by session template ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/sessions/:sessionId", + Short: "Update session", + Long: "Updates a session.", + SDKMapping: "sessions.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-id", Target: "path.sessionId", Required: true, Description: "session id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "messages", + Singular: "messages", + Short: "Session Messages", + Long: "Session messages represent the MCP protocol messages exchanged during a session. This read-only resource provides visibility into the communication between clients and providers.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-messages/:sessionMessageId", + Short: "Get session message", + Long: "Retrieves a specific message from a session.", + SDKMapping: "sessions.messages.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-message-id", Target: "path.sessionMessageId", Required: true, Description: "session message id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-messages", + Short: "List session messages", + Long: "Returns a paginated list of messages for a session.", + SDKMapping: "sessions.messages.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-id", Target: "query.session_id", Required: false, Description: "Filter by session ID(s)"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by message type(s)", Required: false, Repeated: true}, + {Name: "source", Type: resourcecmd.FlagStringSlice, Target: "query.source", Usage: "Filter by message source(s)", Required: false, Repeated: true}, + {Name: "hierarchy", Type: resourcecmd.FlagStringSlice, Target: "query.hierarchy", Usage: "Filter by message hierarchy", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by message ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "provider-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_run_id", Usage: "Filter by provider run ID(s)", Required: false, Repeated: true}, + {Name: "error-id", Type: resourcecmd.FlagStringSlice, Target: "query.error_id", Usage: "Filter by error ID(s)", Required: false, Repeated: true}, + {Name: "participant-id", Type: resourcecmd.FlagStringSlice, Target: "query.participant_id", Usage: "Filter by participant ID(s)", Required: false, Repeated: true}, + {Name: "parent-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.parent_message_id", Usage: "Filter by parent message ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session message creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session message last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "participants", + Singular: "participants", + Short: "Session Participants", + Long: "Session participants represent the clients and other entities that are connected to a session. This read-only resource tracks who is participating in a session.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-participants/:sessionParticipantId", + Short: "Get session participant", + Long: "Retrieves a specific participant in a session.", + SDKMapping: "sessions.participants.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-participant-id", Target: "path.sessionParticipantId", Required: true, Description: "session participant id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-participants", + Short: "List session participants", + Long: "Returns a paginated list of participants in a session.", + SDKMapping: "sessions.participants.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by participant type(s)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by participant ID(s)", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by connected agent ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by connected identity actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by connected consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by connected identity ID(s)", Required: false, Repeated: true}, + {Name: "agent-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_instance_id", Usage: "Filter by connected agent instance ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "session-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_message_id", Usage: "Filter by session message ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session participant creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session participant last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "connections", + Singular: "connections", + Short: "Session Connections", + Long: "Session connections represent the MCP connections established within a session. This read-only resource provides visibility into the connection state and capabilities.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-connections/:sessionConnectionId", + Short: "Get session connection", + Long: "Retrieves a specific connection from a session.", + SDKMapping: "sessions.connections.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-connection-id", Target: "path.sessionConnectionId", Required: true, Description: "session connection id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-connections", + Short: "List session connections", + Long: "Returns a paginated list of connections for a session.", + SDKMapping: "sessions.connections.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by connection status", Required: false, Repeated: true}, + {Name: "connection-state", Type: resourcecmd.FlagStringSlice, Target: "query.connection_state", Usage: "Filter by connection state", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by connected agent ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by connected identity actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by connected consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by connected identity ID(s)", Required: false, Repeated: true}, + {Name: "agent-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_instance_id", Usage: "Filter by connected agent instance ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "participant-id", Type: resourcecmd.FlagStringSlice, Target: "query.participant_id", Usage: "Filter by participant ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session connection creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session connection last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "events", + Singular: "events", + Short: "Session Events", + Long: "Session events represent significant occurrences during a session, such as errors or state changes. This read-only resource provides visibility into session activity.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-events/:sessionEventId", + Short: "Get session event", + Long: "Retrieves a specific event from a session.", + SDKMapping: "sessions.events.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-event-id", Target: "path.sessionEventId", Required: true, Description: "session event id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-events", + Short: "List session events", + Long: "Returns a paginated list of events for a session.", + SDKMapping: "sessions.events.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by event type(s)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session event ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "provider-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_run_id", Usage: "Filter by provider run ID(s)", Required: false, Repeated: true}, + {Name: "session-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_message_id", Usage: "Filter by session message ID(s)", Required: false, Repeated: true}, + {Name: "session-error-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_error_id", Usage: "Filter by session error ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session event creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session event last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "providers", + Singular: "providers", + Short: "Session Providers", + Long: "Session providers represent the providers that are actively connected to a session. Each session can have multiple providers, and providers can be added or removed during the session lifecycle.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/session-providers", + Short: "Create session provider", + Long: "Adds a new provider to an active session.", + SDKMapping: "sessions.providers.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "session-id", Type: resourcecmd.FlagString, Target: "body.session_id", Usage: "session_id", Required: true, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "Existing provider deployment ID", Required: false, Repeated: false}, + {Name: "provider-deployment", Type: resourcecmd.FlagJSON, Target: "body.provider_deployment", Usage: "provider_deployment", Required: false, Repeated: false}, + {Name: "provider-deployment-file", Type: resourcecmd.FlagJSONFile, Target: "body.provider_deployment", Usage: "Read provider_deployment JSON from a file", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "Existing provider config ID", Required: false, Repeated: false}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_config_id", Usage: "Existing provider auth config ID", Required: false, Repeated: false}, + {Name: "provider-auth-config", Type: resourcecmd.FlagJSON, Target: "body.provider_auth_config", Usage: "provider_auth_config", Required: false, Repeated: false}, + {Name: "provider-auth-config-file", Type: resourcecmd.FlagJSONFile, Target: "body.provider_auth_config", Usage: "Read provider_auth_config JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/session-providers/:sessionProviderId", + Short: "Delete session provider", + Long: "Removes a provider from a session.", + SDKMapping: "sessions.providers.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-provider-id", Target: "path.sessionProviderId", Required: true, Description: "session provider id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/session-providers/:sessionProviderId", + Short: "Get session provider", + Long: "Retrieves a specific provider connected to a session.", + SDKMapping: "sessions.providers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-provider-id", Target: "path.sessionProviderId", Required: true, Description: "session provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-providers", + Short: "List session providers", + Long: "Returns a paginated list of providers connected to a session.", + SDKMapping: "sessions.providers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_template_id", Usage: "Filter by session template ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID(s)", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by provider status", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session provider creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session provider last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/session-providers/:sessionProviderId", + Short: "Update session provider", + Long: "Updates a provider connected to a session.", + SDKMapping: "sessions.providers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-provider-id", Target: "path.sessionProviderId", Required: true, Description: "session provider id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "errors", + Singular: "errors", + Short: "Session Errors", + Long: "Session errors track errors that occurred during a session. This read-only resource provides visibility into issues that happened during provider execution.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-errors/:sessionErrorId", + Short: "Get session error", + Long: "Retrieves a specific error that occurred in a session.", + SDKMapping: "sessions.errors.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-error-id", Target: "path.sessionErrorId", Required: true, Description: "session error id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-errors", + Short: "List all session errors", + Long: "Returns a paginated list of errors across all sessions.", + SDKMapping: "sessions.errors.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by error type(s)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session error ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "session-error-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_error_group_id", Usage: "Filter by error group ID(s)", Required: false, Repeated: true}, + {Name: "provider-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_run_id", Usage: "Filter by provider run ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "session-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_message_id", Usage: "Filter by session message ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session error creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session error last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "error-groups", + Singular: "error-groups", + Short: "Session Error Groups", + Long: "Session error groups aggregate similar errors that occurred during a session. This read-only resource helps identify patterns in errors.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/session-error-groups/:sessionErrorGroupId", + Short: "Get session error group", + Long: "Retrieves a specific error group by ID across all sessions.", + SDKMapping: "sessions.errorGroups.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-error-group-id", Target: "path.sessionErrorGroupId", Required: true, Description: "session error group id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-error-groups", + Short: "List all session error groups", + Long: "Returns a paginated list of error groups across all sessions.", + SDKMapping: "sessions.errorGroups.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by error type(s)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by error group ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "tool-calls", + Singular: "tool-calls", + Short: "Tool Calls", + Long: "Tool calls represent individual tool invocations within a session. They track the input, output, and status of each tool execution.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/tool-calls", + Short: "Create tool call", + Long: "Creates a new tool call in a session by invoking a specific tool.", + SDKMapping: "toolCalls.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "tool-id", Type: resourcecmd.FlagString, Target: "body.tool_id", Usage: "The ID of the tool to call", Required: true, Repeated: false}, + {Name: "input", Type: resourcecmd.FlagJSON, Target: "body.input", Usage: "Input data to pass to the tool", Required: true, Repeated: false}, + {Name: "input-file", Type: resourcecmd.FlagJSONFile, Target: "body.input", Usage: "Read input JSON from a file", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Optional metadata for the tool call", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "session-id", Type: resourcecmd.FlagString, Target: "body.session_id", Usage: "The ID of the session to which this tool call belongs", Required: true, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/tool-calls/:toolCallId", + Short: "Get tool call", + Long: "Retrieves a specific tool call by ID.", + SDKMapping: "toolCalls.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "tool-call-id", Target: "path.toolCallId", Required: true, Description: "tool call id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/tool-calls", + Short: "List all tool calls", + Long: "Returns a paginated list of tool calls across all sessions.", + SDKMapping: "toolCalls.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "session-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_template_id", Usage: "Filter by session template ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID(s)", Required: false, Repeated: true}, + {Name: "agent-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_id", Usage: "Filter by agent ID(s)", Required: false, Repeated: true}, + {Name: "actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.actor_id", Usage: "Filter by identity actor ID(s)", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "Filter by consumer ID(s)", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "Filter by identity ID(s)", Required: false, Repeated: true}, + {Name: "agent-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.agent_instance_id", Usage: "Filter by agent instance ID(s)", Required: false, Repeated: true}, + {Name: "tool-id", Type: resourcecmd.FlagStringSlice, Target: "query.tool_id", Usage: "Filter by tool ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter tool call creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter tool call last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "runs", + Singular: "runs", + Short: "Provider Runs", + Long: "Provider runs track the execution of provider operations within a session. This read-only resource provides visibility into provider activity.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/provider-runs/:providerRunId", + Short: "Get provider run", + Long: "Retrieves a specific provider run by ID.", + SDKMapping: "providerRuns.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-run-id", Target: "path.providerRunId", Required: true, Description: "provider run id"}, + }, + }, + { + Name: "get-logs", + Method: "GET", + Path: "/provider-runs/:providerRunId/logs", + Short: "Get provider run logs", + Long: "Retrieves the logs for a specific provider run.", + SDKMapping: "providerRuns.getLogs", + Args: []resourcecmd.ArgumentSpec{ + {Name: "provider-run-id", Target: "path.providerRunId", Required: true, Description: "provider run id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/provider-runs", + Short: "List all provider runs", + Long: "Returns a paginated list of provider runs across all sessions.", + SDKMapping: "providerRuns.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by run status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by provider run ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter by session ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter by session provider ID(s)", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "Filter by session connection ID(s)", Required: false, Repeated: true}, + {Name: "provider-version-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_version_id", Usage: "Filter by provider version ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter provider run creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter provider run last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "templates", + Singular: "templates", + Short: "Session Templates", + Long: "Session templates define reusable configurations for sessions, including which providers to include. Templates can be used to quickly create new sessions with consistent settings.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/session-templates", + Short: "Create session template", + Long: "Creates a new session template.", + SDKMapping: "sessionTemplates.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "providers", Type: resourcecmd.FlagJSON, Target: "body.providers", Usage: "Optional list of providers to include in the template", Required: false, Repeated: false}, + {Name: "providers-file", Type: resourcecmd.FlagJSONFile, Target: "body.providers", Usage: "Read providers JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/session-templates/:sessionTemplateId", + Short: "Delete session template", + Long: "Deletes a specific session template.", + SDKMapping: "sessionTemplates.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-id", Target: "path.sessionTemplateId", Required: true, Description: "session template id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/session-templates/:sessionTemplateId", + Short: "Get session template", + Long: "Retrieves a specific session template by ID.", + SDKMapping: "sessionTemplates.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-id", Target: "path.sessionTemplateId", Required: true, Description: "session template id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-templates", + Short: "List session templates", + Long: "Returns a paginated list of session templates.", + SDKMapping: "sessionTemplates.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status (active, archived)", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session template ID(s)", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "Filter templates that include sessions with these IDs", Required: false, Repeated: true}, + {Name: "session-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_provider_id", Usage: "Filter templates that include session providers with these IDs", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter templates that include providers with these IDs", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter templates that include provider deployments with these IDs", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter templates that include provider configs with these IDs", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter templates that include provider auth configs with these IDs", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session template creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session template last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "list-tools", + Method: "GET", + Path: "/session-templates/:sessionTemplateId/tools", + Short: "List session template tools", + Long: "Returns the effective set of tools available through the providers in a session template, filtered by the tool filters of each provider, deployment, config, and auth config.", + SDKMapping: "sessionTemplates.listTools", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-id", Target: "path.sessionTemplateId", Required: true, Description: "session template id"}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/session-templates/:sessionTemplateId", + Short: "Update session template", + Long: "Updates a specific session template.", + SDKMapping: "sessionTemplates.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-id", Target: "path.sessionTemplateId", Required: true, Description: "session template id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Custom key-value pairs for storing additional information", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "providers", + Singular: "providers", + Short: "Session Template Providers", + Long: "Session template providers define which providers should be included when a session is created from a template.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/session-template-providers", + Short: "Create session template provider", + Long: "Adds a new provider configuration to a session template.", + SDKMapping: "sessionTemplates.providers.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "session-template-id", Type: resourcecmd.FlagString, Target: "body.session_template_id", Usage: "session_template_id", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "provider-config-vault-id", Type: resourcecmd.FlagString, Target: "body.provider_config_vault_id", Usage: "provider_config_vault_id", Required: false, Repeated: false}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_config_id", Usage: "provider_auth_config_id", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/session-template-providers/:sessionTemplateProviderId", + Short: "Delete session template provider", + Long: "Removes a provider configuration from a session template.", + SDKMapping: "sessionTemplates.providers.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-provider-id", Target: "path.sessionTemplateProviderId", Required: true, Description: "session template provider id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/session-template-providers/:sessionTemplateProviderId", + Short: "Get session template provider", + Long: "Retrieves a specific provider configuration from a session template.", + SDKMapping: "sessionTemplates.providers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-provider-id", Target: "path.sessionTemplateProviderId", Required: true, Description: "session template provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/session-template-providers", + Short: "List session template providers", + Long: "Returns a paginated list of providers configured for a session template.", + SDKMapping: "sessionTemplates.providers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by session template provider ID(s)", Required: false, Repeated: true}, + {Name: "session-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_template_id", Usage: "Filter by session template ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "Filter by provider deployment ID(s)", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "Filter by provider config ID(s)", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "Filter by provider auth config ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter session template provider creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter session template provider last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/session-template-providers/:sessionTemplateProviderId", + Short: "Update session template provider", + Long: "Updates a provider configuration in a session template.", + SDKMapping: "sessionTemplates.providers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "session-template-provider-id", Target: "path.sessionTemplateProviderId", Required: true, Description: "session template provider id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + }, + }, + }, + }, + { + Plural: "magic-mcp", + Singular: "magic-mcp", + Short: "Magic MCP", + Long: "", + Operations: []resourcecmd.OperationSpec{}, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "servers", + Singular: "servers", + Short: "Magic MCP Servers", + Long: "Magic MCP servers are stable MCP entrypoints backed by one Subspace session template.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/magic-mcp-servers", + Short: "Create magic MCP server", + Long: "Creates a magic MCP server with a new session template. A Subspace session is created automatically on first connection and then reused.", + SDKMapping: "magicMcpServers.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "provider-template-id", Type: resourcecmd.FlagString, Target: "body.provider_template_id", Usage: "provider_template_id", Required: false, Repeated: false}, + {Name: "integration-instance-id", Type: resourcecmd.FlagString, Target: "body.integration_instance_id", Usage: "integration_instance_id", Required: false, Repeated: false}, + {Name: "consumer-profile-id", Type: resourcecmd.FlagString, Target: "body.consumer_profile_id", Usage: "consumer_profile_id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/magic-mcp-servers/:magicMcpServerId", + Short: "Delete magic MCP server", + Long: "Archives a magic MCP server.", + SDKMapping: "magicMcpServers.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true, Description: "server-id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-servers/:magicMcpServerId", + Short: "Get magic MCP server", + Long: "Retrieves a specific magic MCP server.", + SDKMapping: "magicMcpServers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true, Description: "server-id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-servers", + Short: "List magic MCP servers", + Long: "Returns a paginated list of magic MCP servers.", + SDKMapping: "magicMcpServers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "magic-mcp-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_group_id", Usage: "magic_mcp_group_id", Required: false, Repeated: true}, + {Name: "provider-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_template_id", Usage: "provider_template_id", Required: false, Repeated: true}, + {Name: "integration-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_instance_id", Usage: "integration_instance_id", Required: false, Repeated: true}, + {Name: "owner", Type: resourcecmd.FlagStringSlice, Target: "query.owner", Usage: "owner", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "consumer-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_id", Usage: "consumer_id", Required: false, Repeated: true}, + {Name: "consumer-profile-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_profile_id", Usage: "consumer_profile_id", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "preconfigured-only", Type: resourcecmd.FlagBool, Target: "query.preconfigured_only", Usage: "preconfigured_only", Required: false, Repeated: false}, + }, + }, + { + Name: "tools", + Method: "GET", + Path: "/magic-mcp-servers/:magicMcpServerId/tools", + Short: "List magic MCP server tools", + Long: "Returns the effective set of tools available through the providers backing a magic MCP server.", + SDKMapping: "magicMcpServers.tools", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true, Description: "server-id"}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/magic-mcp-servers/:magicMcpServerId", + Short: "Update magic MCP server", + Long: "Updates a magic MCP server.", + SDKMapping: "magicMcpServers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true, Description: "server-id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "aliases", Type: resourcecmd.FlagStringSlice, Target: "body.aliases", Usage: "aliases", Required: false, Repeated: true}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "providers", + Singular: "providers", + Short: "Magic MCP Servers", + Long: "Magic MCP servers are stable MCP entrypoints backed by one Subspace session template.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/magic-mcp-servers/:magicMcpServerId/providers", + Short: "Create magic MCP server provider", + Long: "Creates a configurable provider row for a magic MCP server.", + SDKMapping: "magicMcpServers.providers.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-server-id", Target: "path.magicMcpServerId", Required: true, Description: "magic mcp server id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "provider_id", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_config_id", Usage: "provider_auth_config_id", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/magic-mcp-servers/:magicMcpServerId/providers/:magicMcpServerProviderId", + Short: "Delete magic MCP server provider", + Long: "Archives a backing integration instance provider from a magic MCP server and removes the shared integration provider when unused.", + SDKMapping: "magicMcpServers.providers.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-server-id", Target: "path.magicMcpServerId", Required: true, Description: "magic mcp server id"}, + {Name: "magic-mcp-server-provider-id", Target: "path.magicMcpServerProviderId", Required: true, Description: "magic mcp server provider id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-servers/:magicMcpServerId/providers/:magicMcpServerProviderId", + Short: "Get magic MCP server provider", + Long: "Retrieves a specific backing integration instance provider for a magic MCP server.", + SDKMapping: "magicMcpServers.providers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-server-id", Target: "path.magicMcpServerId", Required: true, Description: "magic mcp server id"}, + {Name: "magic-mcp-server-provider-id", Target: "path.magicMcpServerProviderId", Required: true, Description: "magic mcp server provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-servers/:magicMcpServerId/providers", + Short: "List magic MCP server providers", + Long: "Returns the backing integration instance providers configured for a magic MCP server.", + SDKMapping: "magicMcpServers.providers.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "server-id", Target: "path.magicMcpServerId", Required: true, Description: "server-id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "integration-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_provider_id", Usage: "integration_provider_id", Required: false, Repeated: true}, + {Name: "integration-instance-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_instance_provider_id", Usage: "integration_instance_provider_id", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "provider_auth_config_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter magic MCP server provider creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter magic MCP server provider last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/magic-mcp-servers/:magicMcpServerId/providers/:magicMcpServerProviderId", + Short: "Update magic MCP server provider", + Long: "Updates a backing integration provider and then sets the corresponding integration instance provider for a magic MCP server.", + SDKMapping: "magicMcpServers.providers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-server-id", Target: "path.magicMcpServerId", Required: true, Description: "magic mcp server id"}, + {Name: "magic-mcp-server-provider-id", Target: "path.magicMcpServerProviderId", Required: true, Description: "magic mcp server provider id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_config_id", Usage: "provider_auth_config_id", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + }, + }, + { + Plural: "groups", + Singular: "groups", + Short: "Magic MCP Groups", + Long: "Magic MCP groups categorize servers and can be bound to token access.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "add-servers", + Method: "POST", + Path: "/magic-mcp-groups/:magicMcpGroupId/add-servers", + Short: "Add servers to magic MCP group", + Long: "Adds magic MCP servers to a group.", + SDKMapping: "magicMcpGroups.addServers", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-group-id", Target: "path.magicMcpGroupId", Required: true, Description: "magic mcp group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-server-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_server_ids", Usage: "magic_mcp_server_ids", Required: true, Repeated: true}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/magic-mcp-groups", + Short: "Create magic MCP group", + Long: "Creates a magic MCP group.", + SDKMapping: "magicMcpGroups.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/magic-mcp-groups/:magicMcpGroupId", + Short: "Delete magic MCP group", + Long: "Deletes a magic MCP group.", + SDKMapping: "magicMcpGroups.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-group-id", Target: "path.magicMcpGroupId", Required: true, Description: "magic mcp group id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-groups/:magicMcpGroupId", + Short: "Get magic MCP group", + Long: "Retrieves a specific magic MCP group.", + SDKMapping: "magicMcpGroups.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-group-id", Target: "path.magicMcpGroupId", Required: true, Description: "magic mcp group id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-groups", + Short: "List magic MCP groups", + Long: "Returns a paginated list of magic MCP groups.", + SDKMapping: "magicMcpGroups.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + }, + }, + { + Name: "remove-servers", + Method: "POST", + Path: "/magic-mcp-groups/:magicMcpGroupId/remove-servers", + Short: "Remove servers from magic MCP group", + Long: "Removes magic MCP servers from a group.", + SDKMapping: "magicMcpGroups.removeServers", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-group-id", Target: "path.magicMcpGroupId", Required: true, Description: "magic mcp group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-server-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_server_ids", Usage: "magic_mcp_server_ids", Required: true, Repeated: true}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/magic-mcp-groups/:magicMcpGroupId", + Short: "Update magic MCP group", + Long: "Updates a magic MCP group.", + SDKMapping: "magicMcpGroups.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-group-id", Target: "path.magicMcpGroupId", Required: true, Description: "magic mcp group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "endpoints", + Singular: "endpoints", + Short: "Magic MCP Endpoints", + Long: "Magic MCP endpoints combine multiple Magic MCP servers behind one routed connection target.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "add-servers", + Method: "POST", + Path: "/magic-mcp-endpoints/:magicMcpEndpointId/add-servers", + Short: "Add servers to magic MCP endpoint", + Long: "Adds magic MCP servers to a magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.addServers", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-endpoint-id", Target: "path.magicMcpEndpointId", Required: true, Description: "magic mcp endpoint id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-servers", Type: resourcecmd.FlagJSON, Target: "body.magic_mcp_servers", Usage: "magic_mcp_servers", Required: false, Repeated: false}, + {Name: "magic-mcp-servers-file", Type: resourcecmd.FlagJSONFile, Target: "body.magic_mcp_servers", Usage: "Read magic_mcp_servers JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/magic-mcp-endpoints", + Short: "Create magic MCP endpoint", + Long: "Creates a magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "consumer-profile-id", Type: resourcecmd.FlagString, Target: "body.consumer_profile_id", Usage: "consumer_profile_id", Required: false, Repeated: false}, + {Name: "skill-plugin-id", Type: resourcecmd.FlagString, Target: "body.skill_plugin_id", Usage: "skill_plugin_id", Required: false, Repeated: false}, + {Name: "magic-mcp-servers", Type: resourcecmd.FlagJSON, Target: "body.magic_mcp_servers", Usage: "magic_mcp_servers", Required: false, Repeated: false}, + {Name: "magic-mcp-servers-file", Type: resourcecmd.FlagJSONFile, Target: "body.magic_mcp_servers", Usage: "Read magic_mcp_servers JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/magic-mcp-endpoints/:magicMcpEndpointId", + Short: "Delete magic MCP endpoint", + Long: "Archives a magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-endpoint-id", Target: "path.magicMcpEndpointId", Required: true, Description: "magic mcp endpoint id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-endpoints/:magicMcpEndpointId", + Short: "Get magic MCP endpoint", + Long: "Retrieves a specific magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-endpoint-id", Target: "path.magicMcpEndpointId", Required: true, Description: "magic mcp endpoint id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-endpoints", + Short: "List magic MCP endpoints", + Long: "Returns a paginated list of magic MCP endpoints.", + SDKMapping: "magicMcpEndpoints.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "magic-mcp-server-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_server_id", Usage: "magic_mcp_server_id", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + }, + }, + { + Name: "remove-servers", + Method: "POST", + Path: "/magic-mcp-endpoints/:magicMcpEndpointId/remove-servers", + Short: "Remove servers from magic MCP endpoint", + Long: "Removes magic MCP servers from a magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.removeServers", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-endpoint-id", Target: "path.magicMcpEndpointId", Required: true, Description: "magic mcp endpoint id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-server-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_server_ids", Usage: "magic_mcp_server_ids", Required: true, Repeated: true}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/magic-mcp-endpoints/:magicMcpEndpointId", + Short: "Update magic MCP endpoint", + Long: "Updates a magic MCP endpoint.", + SDKMapping: "magicMcpEndpoints.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-endpoint-id", Target: "path.magicMcpEndpointId", Required: true, Description: "magic mcp endpoint id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "tokens", + Singular: "tokens", + Short: "Magic MCP Tokens", + Long: "Magic MCP tokens authorize access to Magic MCP servers via the /magic connection API.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "add-groups", + Method: "POST", + Path: "/magic-mcp-tokens/:magicMcpTokenId/add-groups", + Short: "Add magic MCP groups to token", + Long: "Adds groups to a magic MCP token.", + SDKMapping: "magicMcpTokens.addGroups", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-token-id", Target: "path.magicMcpTokenId", Required: true, Description: "magic mcp token id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-group-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_group_ids", Usage: "magic_mcp_group_ids", Required: true, Repeated: true}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/magic-mcp-tokens", + Short: "Create magic MCP token", + Long: "Creates a new magic MCP token.", + SDKMapping: "magicMcpTokens.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "magic-mcp-group-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_group_ids", Usage: "magic_mcp_group_ids", Required: false, Repeated: true}, + {Name: "magic-mcp-server-id", Type: resourcecmd.FlagString, Target: "body.magic_mcp_server_id", Usage: "magic_mcp_server_id", Required: false, Repeated: false}, + {Name: "magic-mcp-endpoint-id", Type: resourcecmd.FlagString, Target: "body.magic_mcp_endpoint_id", Usage: "magic_mcp_endpoint_id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/magic-mcp-tokens/:magicMcpTokenId", + Short: "Delete magic MCP token", + Long: "Deletes a magic MCP token.", + SDKMapping: "magicMcpTokens.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-token-id", Target: "path.magicMcpTokenId", Required: true, Description: "magic mcp token id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-tokens/:magicMcpTokenId", + Short: "Get magic MCP token", + Long: "Retrieves a specific magic MCP token.", + SDKMapping: "magicMcpTokens.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-token-id", Target: "path.magicMcpTokenId", Required: true, Description: "magic mcp token id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-tokens", + Short: "List magic MCP tokens", + Long: "Returns a paginated list of magic MCP tokens.", + SDKMapping: "magicMcpTokens.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "magic-mcp-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_group_id", Usage: "magic_mcp_group_id", Required: false, Repeated: true}, + {Name: "magic-mcp-server-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_server_id", Usage: "magic_mcp_server_id", Required: false, Repeated: true}, + {Name: "magic-mcp-endpoint-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_endpoint_id", Usage: "magic_mcp_endpoint_id", Required: false, Repeated: true}, + }, + }, + { + Name: "remove-groups", + Method: "POST", + Path: "/magic-mcp-tokens/:magicMcpTokenId/remove-groups", + Short: "Remove magic MCP groups from token", + Long: "Removes groups from a magic MCP token.", + SDKMapping: "magicMcpTokens.removeGroups", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-token-id", Target: "path.magicMcpTokenId", Required: true, Description: "magic mcp token id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "magic-mcp-group-ids", Type: resourcecmd.FlagStringSlice, Target: "body.magic_mcp_group_ids", Usage: "magic_mcp_group_ids", Required: true, Repeated: true}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/magic-mcp-tokens/:magicMcpTokenId", + Short: "Update magic MCP token", + Long: "Updates a magic MCP token.", + SDKMapping: "magicMcpTokens.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-token-id", Target: "path.magicMcpTokenId", Required: true, Description: "magic mcp token id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "sessions", + Singular: "sessions", + Short: "Magic MCP Sessions", + Long: "Magic MCP sessions map a Magic MCP server to one Subspace session and are created on demand by the MCP connection API.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/magic-mcp-sessions/:magicMcpSessionId", + Short: "Get magic MCP session", + Long: "Retrieves a specific magic MCP session.", + SDKMapping: "magicMcpSessions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "magic-mcp-session-id", Target: "path.magicMcpSessionId", Required: true, Description: "magic mcp session id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/magic-mcp-sessions", + Short: "List magic MCP sessions", + Long: "Returns a paginated list of magic MCP sessions.", + SDKMapping: "magicMcpSessions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "magic-mcp-server-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_server_id", Usage: "magic_mcp_server_id", Required: false, Repeated: true}, + }, + }, + }, + }, + }, + }, + { + Plural: "skills", + Singular: "skills", + Short: "Skills", + Long: "Skills group provider and integration capabilities into reusable, owned compositions.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skills", + Short: "Create skill", + Long: "Creates a new skill.", + SDKMapping: "skills.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "client-name", Type: resourcecmd.FlagString, Target: "body.client_name", Usage: "client_name", Required: false, Repeated: false}, + {Name: "client-description", Type: resourcecmd.FlagString, Target: "body.client_description", Usage: "client_description", Required: false, Repeated: false}, + {Name: "license", Type: resourcecmd.FlagString, Target: "body.license", Usage: "license", Required: false, Repeated: false}, + {Name: "compatibility", Type: resourcecmd.FlagString, Target: "body.compatibility", Usage: "compatibility", Required: false, Repeated: false}, + {Name: "client-metadata", Type: resourcecmd.FlagJSON, Target: "body.client_metadata", Usage: "client_metadata", Required: false, Repeated: false}, + {Name: "client-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.client_metadata", Usage: "Read client_metadata JSON from a file", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + {Name: "template-id", Type: resourcecmd.FlagString, Target: "body.template_id", Usage: "template_id", Required: false, Repeated: false}, + {Name: "skill-group-id", Type: resourcecmd.FlagString, Target: "body.skill_group_id", Usage: "skill_group_id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skills/:skillId", + Short: "Delete skill", + Long: "Archives a specific skill.", + SDKMapping: "skills.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skills/:skillId", + Short: "Get skill", + Long: "Retrieves a specific skill.", + SDKMapping: "skills.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills", + Short: "List skills", + Long: "Returns a paginated list of skills.", + SDKMapping: "skills.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "skill-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_group_id", Usage: "skill_group_id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter skill last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skills/:skillId", + Short: "Update skill", + Long: "Updates a specific skill.", + SDKMapping: "skills.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "client-name", Type: resourcecmd.FlagString, Target: "body.client_name", Usage: "client_name", Required: false, Repeated: false}, + {Name: "client-description", Type: resourcecmd.FlagString, Target: "body.client_description", Usage: "client_description", Required: false, Repeated: false}, + {Name: "license", Type: resourcecmd.FlagString, Target: "body.license", Usage: "license", Required: false, Repeated: false}, + {Name: "compatibility", Type: resourcecmd.FlagString, Target: "body.compatibility", Usage: "compatibility", Required: false, Repeated: false}, + {Name: "client-metadata", Type: resourcecmd.FlagJSON, Target: "body.client_metadata", Usage: "client_metadata", Required: false, Repeated: false}, + {Name: "client-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.client_metadata", Usage: "Read client_metadata JSON from a file", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "versions", + Singular: "versions", + Short: "Skill Versions", + Long: "Inspect version history and snapshots for a skill.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/skills/:skillId/versions/:skillVersionId", + Short: "Get skill version by ID", + Long: "Retrieves a specific skill version by its ID.", + SDKMapping: "skills.versions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-version-id", Target: "path.skillVersionId", Required: true, Description: "skill version id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills/:skillId/versions", + Short: "List skill versions", + Long: "Returns a paginated list of versions for a specific skill.", + SDKMapping: "skills.versions.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "items", + Singular: "items", + Short: "Skill Items", + Long: "Skill items attach integrations and providers to skills.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skills/:skillId/items", + Short: "Create skill item", + Long: "Creates a new item on a skill.", + SDKMapping: "skills.items.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "type", Required: false, Repeated: false}, + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "provider_id", Required: false, Repeated: false}, + {Name: "integration-id", Type: resourcecmd.FlagString, Target: "body.integration_id", Usage: "integration_id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skills/:skillId/items/:skillItemId", + Short: "Delete skill item", + Long: "Archives a skill item.", + SDKMapping: "skills.items.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-item-id", Target: "path.skillItemId", Required: true, Description: "skill item id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skills/:skillId/items/:skillItemId", + Short: "Get skill item", + Long: "Retrieves a specific skill item.", + SDKMapping: "skills.items.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-item-id", Target: "path.skillItemId", Required: true, Description: "skill item id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills/:skillId/items", + Short: "List skill items", + Long: "Returns a paginated list of items for a skill.", + SDKMapping: "skills.items.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "type", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill item creation time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "agents", + Singular: "agents", + Short: "Skill Agents", + Long: "Manage sub-agents attached to a skill.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skills/:skillId/agents", + Short: "Create skill agent", + Long: "Creates a new agent document in the skill agents directory.", + SDKMapping: "skills.agents.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "content", Type: resourcecmd.FlagString, Target: "body.content", Usage: "content", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skills/:skillId/agents/:skillAgentId", + Short: "Delete skill agent", + Long: "Archives a specific skill agent and removes its linked store item.", + SDKMapping: "skills.agents.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-agent-id", Target: "path.skillAgentId", Required: true, Description: "skill agent id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skills/:skillId/agents/:skillAgentId", + Short: "Get skill agent by ID", + Long: "Retrieves a specific agent within a skill.", + SDKMapping: "skills.agents.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-agent-id", Target: "path.skillAgentId", Required: true, Description: "skill agent id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills/:skillId/agents", + Short: "List skill agents", + Long: "Returns a paginated list of agents for a specific skill.", + SDKMapping: "skills.agents.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "include-archived", Type: resourcecmd.FlagBool, Target: "query.include_archived", Usage: "include_archived", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skills/:skillId/agents/:skillAgentId", + Short: "Update skill agent", + Long: "Updates the name or description for a specific skill agent.", + SDKMapping: "skills.agents.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-agent-id", Target: "path.skillAgentId", Required: true, Description: "skill agent id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "participants", + Singular: "participants", + Short: "Skill Participants", + Long: "Inspect participants associated with an instance skill.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/skills/:skillId/participants/:skillParticipantId", + Short: "Get skill participant by ID", + Long: "Retrieves a specific participant within a skill.", + SDKMapping: "skills.participants.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + {Name: "skill-participant-id", Target: "path.skillParticipantId", Required: true, Description: "skill participant id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills/:skillId/participants", + Short: "List skill participants", + Long: "Returns a paginated list of participants for a specific skill.", + SDKMapping: "skills.participants.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-id", Target: "path.skillId", Required: true, Description: "skill id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "groups", + Singular: "groups", + Short: "Skill Groups", + Long: "Skill groups organize skills into reusable collections.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skill-groups", + Short: "Create skill group", + Long: "Creates a skill group.", + SDKMapping: "skills.groups.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "skill-ids", Type: resourcecmd.FlagStringSlice, Target: "body.skill_ids", Usage: "skill_ids", Required: false, Repeated: true}, + {Name: "allow-consumer-skill-assignment", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_assignment", Usage: "allow_consumer_skill_assignment", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skill-groups/:skillGroupId", + Short: "Delete skill group", + Long: "Archives a skill group.", + SDKMapping: "skills.groups.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-group-id", Target: "path.skillGroupId", Required: true, Description: "skill group id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-groups/:skillGroupId", + Short: "Get skill group", + Long: "Retrieves a specific skill group.", + SDKMapping: "skills.groups.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-group-id", Target: "path.skillGroupId", Required: true, Description: "skill group id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-groups", + Short: "List skill groups", + Long: "Returns a paginated list of skill groups.", + SDKMapping: "skills.groups.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "skill-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_id", Usage: "skill_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill group creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter skill group last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skill-groups/:skillGroupId", + Short: "Update skill group", + Long: "Updates a skill group.", + SDKMapping: "skills.groups.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-group-id", Target: "path.skillGroupId", Required: true, Description: "skill group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "skill-ids", Type: resourcecmd.FlagStringSlice, Target: "body.skill_ids", Usage: "skill_ids", Required: false, Repeated: true}, + {Name: "allow-consumer-skill-assignment", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_assignment", Usage: "allow_consumer_skill_assignment", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "configurations", + Singular: "configurations", + Short: "Skill Configurations", + Long: "Manage configuration profiles for skill execution.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skills/configurations", + Short: "Create skill configuration", + Long: "Creates a new non-default skill configuration.", + SDKMapping: "skills.configurations.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "allow-scripts", Type: resourcecmd.FlagBool, Target: "body.allow_scripts", Usage: "allow_scripts", Required: false, Repeated: false}, + {Name: "allowed-file-extensions", Type: resourcecmd.FlagStringSlice, Target: "body.allowed_file_extensions", Usage: "allowed_file_extensions", Required: false, Repeated: true}, + {Name: "allow-non-standard-directories", Type: resourcecmd.FlagBool, Target: "body.allow_non_standard_directories", Usage: "allow_non_standard_directories", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skills/configurations/:skillConfigurationId", + Short: "Delete skill configuration", + Long: "Soft deletes a specific non-internal skill configuration.", + SDKMapping: "skills.configurations.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-configuration-id", Target: "path.skillConfigurationId", Required: true, Description: "skill configuration id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skills/configurations/:skillConfigurationId", + Short: "Get skill configuration", + Long: "Retrieves a specific skill configuration by ID, or the default.", + SDKMapping: "skills.configurations.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-configuration-id", Target: "path.skillConfigurationId", Required: true, Description: "skill configuration id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skills/configurations", + Short: "List skill configurations", + Long: "Returns a paginated list of visible skill configurations.", + SDKMapping: "skills.configurations.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skills/configurations/:skillConfigurationId", + Short: "Update skill configuration", + Long: "Updates a specific skill configuration. Updating default creates it first if needed.", + SDKMapping: "skills.configurations.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-configuration-id", Target: "path.skillConfigurationId", Required: true, Description: "skill configuration id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "allow-scripts", Type: resourcecmd.FlagBool, Target: "body.allow_scripts", Usage: "allow_scripts", Required: false, Repeated: false}, + {Name: "allowed-file-extensions", Type: resourcecmd.FlagStringSlice, Target: "body.allowed_file_extensions", Usage: "allowed_file_extensions", Required: false, Repeated: true}, + {Name: "allow-non-standard-directories", Type: resourcecmd.FlagBool, Target: "body.allow_non_standard_directories", Usage: "allow_non_standard_directories", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "templates", + Singular: "templates", + Short: "Skill Templates", + Long: "Skill templates define reusable starting points for skills.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skill-templates", + Short: "Create skill template", + Long: "Creates a skill template.", + SDKMapping: "skills.templates.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "from-skill-id", Type: resourcecmd.FlagString, Target: "body.from_skill_Id", Usage: "from_skill_Id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/skill-templates/:skillTemplateId", + Short: "Delete skill template", + Long: "Archives a skill template.", + SDKMapping: "skills.templates.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-template-id", Target: "path.skillTemplateId", Required: true, Description: "skill template id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-templates/:skillTemplateId", + Short: "Get skill template", + Long: "Retrieves a specific skill template.", + SDKMapping: "skills.templates.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-template-id", Target: "path.skillTemplateId", Required: true, Description: "skill template id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-templates", + Short: "List skill templates", + Long: "Returns a paginated list of skill templates.", + SDKMapping: "skills.templates.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "owner", Type: resourcecmd.FlagStringSlice, Target: "query.owner", Usage: "owner", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill template creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter skill template last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skill-templates/:skillTemplateId", + Short: "Update skill template", + Long: "Updates a skill template.", + SDKMapping: "skills.templates.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-template-id", Target: "path.skillTemplateId", Required: true, Description: "skill template id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "imports", + Singular: "imports", + Short: "Skill Imports", + Long: "Import skills from public repositories or uploaded files.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skill-imports", + Short: "Create skill import", + Long: "Queues a skill import from a repository or uploaded file.", + SDKMapping: "skills.imports.create", + }, + { + Name: "get", + Method: "GET", + Path: "/skill-imports/:skillImportId", + Short: "Get skill import", + Long: "Retrieves an individual skill import and its results.", + SDKMapping: "skills.imports.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-import-id", Target: "path.skillImportId", Required: true, Description: "skill import id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-imports", + Short: "List skill imports", + Long: "Returns a paginated list of skill imports.", + SDKMapping: "skills.imports.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "exports", + Singular: "exports", + Short: "Skill Exports", + Long: "Export skills, skill plugins, and skill marketplaces as zip files.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/skill-exports", + Short: "Create skill export", + Long: "Creates a skill, plugin, or marketplace export.", + SDKMapping: "skills.exports.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "target", Type: resourcecmd.FlagString, Target: "body.target", Usage: "target", Required: true, Repeated: false}, + {Name: "skill-id", Type: resourcecmd.FlagString, Target: "body.skill_id", Usage: "skill_id", Required: false, Repeated: false}, + {Name: "skill-plugin-id", Type: resourcecmd.FlagString, Target: "body.skill_plugin_id", Usage: "skill_plugin_id", Required: false, Repeated: false}, + {Name: "skill-marketplace-id", Type: resourcecmd.FlagString, Target: "body.skill_marketplace_id", Usage: "skill_marketplace_id", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-exports/:skillExportId", + Short: "Get skill export", + Long: "Retrieves a skill export.", + SDKMapping: "skills.exports.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-export-id", Target: "path.skillExportId", Required: true, Description: "skill export id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-exports", + Short: "List skill exports", + Long: "Returns a paginated list of skill exports.", + SDKMapping: "skills.exports.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "target", Type: resourcecmd.FlagStringSlice, Target: "query.target", Usage: "target", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "merge-requests", + Singular: "merge-requests", + Short: "Skill Merge Requests", + Long: "Review, resolve, and apply changes between skills.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "close", + Method: "POST", + Path: "/skill-merge-requests/:skillMergeRequestId/close", + Short: "Close skill merge request", + Long: "Closes an open skill merge request without applying it.", + SDKMapping: "skills.mergeRequests.close", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-merge-request-id", Target: "path.skillMergeRequestId", Required: true, Description: "skill merge request id"}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/skill-merge-requests", + Short: "Create skill merge request", + Long: "Creates a merge request from one skill into another.", + SDKMapping: "skills.mergeRequests.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "source-skill-id", Type: resourcecmd.FlagString, Target: "body.source_skill_id", Usage: "source_skill_id", Required: true, Repeated: false}, + {Name: "target-skill-id", Type: resourcecmd.FlagString, Target: "body.target_skill_id", Usage: "target_skill_id", Required: false, Repeated: false}, + {Name: "title", Type: resourcecmd.FlagString, Target: "body.title", Usage: "title", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-merge-requests/:skillMergeRequestId", + Short: "Get skill merge request", + Long: "Retrieves a skill merge request.", + SDKMapping: "skills.mergeRequests.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-merge-request-id", Target: "path.skillMergeRequestId", Required: true, Description: "skill merge request id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-merge-requests", + Short: "List skill merge requests", + Long: "Returns a paginated list of skill merge requests.", + SDKMapping: "skills.mergeRequests.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "source-skill-id", Type: resourcecmd.FlagStringSlice, Target: "query.source_skill_id", Usage: "source_skill_id", Required: false, Repeated: true}, + {Name: "target-skill-id", Type: resourcecmd.FlagStringSlice, Target: "query.target_skill_id", Usage: "target_skill_id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "created-by-actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.created_by_actor_id", Usage: "created_by_actor_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill merge request creation time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "perform", + Method: "POST", + Path: "/skill-merge-requests/:skillMergeRequestId/perform", + Short: "Perform skill merge request", + Long: "Queues application of a resolved skill merge request.", + SDKMapping: "skills.mergeRequests.perform", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-merge-request-id", Target: "path.skillMergeRequestId", Required: true, Description: "skill merge request id"}, + }, + }, + { + Name: "rollback", + Method: "POST", + Path: "/skill-merge-requests/:skillMergeRequestId/rollback", + Short: "Rollback skill merge request", + Long: "Restores the target skill to its state before a completed merge.", + SDKMapping: "skills.mergeRequests.rollback", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-merge-request-id", Target: "path.skillMergeRequestId", Required: true, Description: "skill merge request id"}, + }, + }, + }, + }, + { + Plural: "plugins", + Singular: "plugins", + Short: "Skill Plugins", + Long: "Manage skill plugins for an instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "archive", + Method: "DELETE", + Path: "/skill-plugins/:skillPluginId", + Short: "Archive skill plugin", + Long: "Archives a skill plugin.", + SDKMapping: "skills.plugins.archive", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-plugin-id", Target: "path.skillPluginId", Required: true, Description: "skill plugin id"}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/skill-plugins", + Short: "Create skill plugin", + Long: "Creates a skill plugin.", + SDKMapping: "skills.plugins.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "long-description", Type: resourcecmd.FlagString, Target: "body.long_description", Usage: "long_description", Required: false, Repeated: false}, + {Name: "category", Type: resourcecmd.FlagString, Target: "body.category", Usage: "category", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagString, Target: "body.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: false}, + {Name: "skill-marketplace-id", Type: resourcecmd.FlagString, Target: "body.skill_marketplace_id", Usage: "skill_marketplace_id", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-plugins/:skillPluginId", + Short: "Get skill plugin", + Long: "Retrieves a skill plugin.", + SDKMapping: "skills.plugins.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-plugin-id", Target: "path.skillPluginId", Required: true, Description: "skill plugin id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-plugins", + Short: "List skill plugins", + Long: "Returns a paginated list of skill plugins.", + SDKMapping: "skills.plugins.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "skill-marketplace-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_marketplace_id", Usage: "skill_marketplace_id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "category", Type: resourcecmd.FlagString, Target: "query.category", Usage: "category", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill plugin creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter skill plugin last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skill-plugins/:skillPluginId", + Short: "Update skill plugin", + Long: "Updates a skill plugin.", + SDKMapping: "skills.plugins.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-plugin-id", Target: "path.skillPluginId", Required: true, Description: "skill plugin id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "long-description", Type: resourcecmd.FlagString, Target: "body.long_description", Usage: "long_description", Required: false, Repeated: false}, + {Name: "category", Type: resourcecmd.FlagString, Target: "body.category", Usage: "category", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagString, Target: "body.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "marketplaces", + Singular: "marketplaces", + Short: "Skill Marketplaces", + Long: "Manage skill marketplaces for an instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "archive", + Method: "DELETE", + Path: "/skill-marketplaces/:skillMarketplaceId", + Short: "Archive skill marketplace", + Long: "Archives a skill marketplace.", + SDKMapping: "skills.marketplaces.archive", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-marketplace-id", Target: "path.skillMarketplaceId", Required: true, Description: "skill marketplace id"}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/skill-marketplaces", + Short: "Create skill marketplace", + Long: "Creates a skill marketplace.", + SDKMapping: "skills.marketplaces.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagString, Target: "body.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: false}, + {Name: "repository-access-mode", Type: resourcecmd.FlagString, Target: "body.repository_access_mode", Usage: "repository_access_mode", Required: false, Repeated: false}, + {Name: "force-merge-or-push", Type: resourcecmd.FlagBool, Target: "body.force_merge_or_push", Usage: "force_merge_or_push", Required: false, Repeated: false}, + {Name: "merge-before-checks-pass", Type: resourcecmd.FlagBool, Target: "body.merge_before_checks_pass", Usage: "merge_before_checks_pass", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/skill-marketplaces/:skillMarketplaceId", + Short: "Get skill marketplace", + Long: "Retrieves a skill marketplace.", + SDKMapping: "skills.marketplaces.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-marketplace-id", Target: "path.skillMarketplaceId", Required: true, Description: "skill marketplace id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/skill-marketplaces", + Short: "List skill marketplaces", + Long: "Returns a paginated list of skill marketplaces.", + SDKMapping: "skills.marketplaces.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter skill marketplace creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter skill marketplace last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "sync", + Method: "POST", + Path: "/skill-marketplaces/:skillMarketplaceId/sync", + Short: "Sync skill marketplace", + Long: "Forces a skill marketplace sync.", + SDKMapping: "skills.marketplaces.sync", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-marketplace-id", Target: "path.skillMarketplaceId", Required: true, Description: "skill marketplace id"}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/skill-marketplaces/:skillMarketplaceId", + Short: "Update skill marketplace", + Long: "Updates a skill marketplace.", + SDKMapping: "skills.marketplaces.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "skill-marketplace-id", Target: "path.skillMarketplaceId", Required: true, Description: "skill marketplace id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "image-file-id", Type: resourcecmd.FlagString, Target: "body.image_file_id", Usage: "image_file_id", Required: false, Repeated: false}, + {Name: "skill-configuration-id", Type: resourcecmd.FlagString, Target: "body.skill_configuration_id", Usage: "skill_configuration_id", Required: false, Repeated: false}, + {Name: "repository-access-mode", Type: resourcecmd.FlagString, Target: "body.repository_access_mode", Usage: "repository_access_mode", Required: false, Repeated: false}, + {Name: "force-merge-or-push", Type: resourcecmd.FlagBool, Target: "body.force_merge_or_push", Usage: "force_merge_or_push", Required: false, Repeated: false}, + {Name: "merge-before-checks-pass", Type: resourcecmd.FlagBool, Target: "body.merge_before_checks_pass", Usage: "merge_before_checks_pass", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "files", + Singular: "files", + Short: "Files", + Long: "Represents files that you have uploaded to Metorial. Files can be linked to various resources based on their purpose. Metorial can also automatically extract files for you, for example for data exports.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "delete", + Method: "DELETE", + Path: "/files/:fileId", + Short: "Delete file by ID", + Long: "Deletes a specific file by its ID.", + SDKMapping: "files.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "file-id", Target: "path.fileId", Required: true, Description: "file id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/files/:fileId", + Short: "Get file by ID", + Long: "Retrieves details for a specific file by its ID.", + SDKMapping: "files.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "file-id", Target: "path.fileId", Required: true, Description: "file id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/files", + Short: "List instance files", + Long: "Returns a paginated list of files owned by the instance.", + SDKMapping: "files.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by file ID", Required: false, Repeated: true}, + {Name: "purpose", Type: resourcecmd.FlagStringSlice, Target: "query.purpose", Usage: "Filter by file purpose", Required: false, Repeated: true}, + {Name: "store-id", Type: resourcecmd.FlagStringSlice, Target: "query.store_id", Usage: "Filter by store ID", Required: false, Repeated: true}, + {Name: "document-id", Type: resourcecmd.FlagStringSlice, Target: "query.document_id", Usage: "Filter by document ID", Required: false, Repeated: true}, + {Name: "file-link-id", Type: resourcecmd.FlagStringSlice, Target: "query.file_link_id", Usage: "Filter by file link ID", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter Filter by creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter Filter by update time by date range", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "links", + Singular: "links", + Short: "File Links", + Long: "Files are private by default. If you want to share a file, you can create a link for it. Links are public and do not require authentication to access, so be careful with what you share.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/file-links", + Short: "Create file link", + Long: "Creates a new link for a specific file.", + SDKMapping: "files.links.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "file-id", Type: resourcecmd.FlagString, Target: "body.file_id", Usage: "file_id", Required: true, Repeated: false}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "expires_at", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/file-links/:linkId", + Short: "Delete file link by ID", + Long: "Deletes a specific file link by its ID.", + SDKMapping: "files.links.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "link-id", Target: "path.linkId", Required: true, Description: "link id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/file-links/:linkId", + Short: "Get file link by ID", + Long: "Retrieves the details of a specific file link by its ID.", + SDKMapping: "files.links.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "link-id", Target: "path.linkId", Required: true, Description: "link id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/file-links", + Short: "List file links", + Long: "Returns a paginated list of file links owned by the instance organization.", + SDKMapping: "files.links.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "file-id", Type: resourcecmd.FlagString, Target: "query.file_id", Usage: "Filter by file ID", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "documents", + Singular: "documents", + Short: "Documents", + Long: "Create and manage instance documents backed by Cargo.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/documents", + Short: "Create document", + Long: "Creates a new document for the instance.", + SDKMapping: "documents.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "title", Type: resourcecmd.FlagString, Target: "body.title", Usage: "title", Required: true, Repeated: false}, + {Name: "content", Type: resourcecmd.FlagString, Target: "body.content", Usage: "content", Required: true, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/documents/:documentId", + Short: "Delete document by ID", + Long: "Deletes a specific document.", + SDKMapping: "documents.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "document-id", Target: "path.documentId", Required: true, Description: "document id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/documents/:documentId", + Short: "Get document by ID", + Long: "Retrieves a document by its ID.", + SDKMapping: "documents.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "document-id", Target: "path.documentId", Required: true, Description: "document id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/documents", + Short: "List documents", + Long: "Returns a paginated list of documents owned by the instance.", + SDKMapping: "documents.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by document ID", Required: false, Repeated: true}, + {Name: "file-id", Type: resourcecmd.FlagStringSlice, Target: "query.file_id", Usage: "Filter by file ID", Required: false, Repeated: true}, + {Name: "store-id", Type: resourcecmd.FlagStringSlice, Target: "query.store_id", Usage: "Filter by store ID", Required: false, Repeated: true}, + {Name: "parent-document-id", Type: resourcecmd.FlagStringSlice, Target: "query.parent_document_id", Usage: "Filter by parent document ID", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter Filter by creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter Filter by update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/documents/:documentId", + Short: "Update document by ID", + Long: "Updates a specific document.", + SDKMapping: "documents.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "document-id", Target: "path.documentId", Required: true, Description: "document id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "title", Type: resourcecmd.FlagString, Target: "body.title", Usage: "title", Required: false, Repeated: false}, + {Name: "content", Type: resourcecmd.FlagString, Target: "body.content", Usage: "content", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "versions", + Singular: "versions", + Short: "Document Versions", + Long: "Inspect document version history for an instance document.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/documents/:documentId/versions/:documentVersionId", + Short: "Get document version by ID", + Long: "Retrieves a specific document version by its ID.", + SDKMapping: "documents.versions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "document-id", Target: "path.documentId", Required: true, Description: "document id"}, + {Name: "document-version-id", Target: "path.documentVersionId", Required: true, Description: "document version id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/documents/:documentId/versions", + Short: "List document versions", + Long: "Returns a paginated list of versions for a specific document.", + SDKMapping: "documents.versions.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "document-id", Target: "path.documentId", Required: true, Description: "document id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by document version ID", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter Filter by creation time by date range", Required: false, Repeated: false}, + {Name: "last-edited-at", Type: resourcecmd.FlagJSON, Target: "query.last_edited_at", Usage: "Filter Filter by last edit time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "stores", + Singular: "stores", + Short: "Stores", + Long: "Create and manage instance stores backed by Cargo.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/stores", + Short: "Create store", + Long: "Creates a new store for the instance.", + SDKMapping: "stores.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "access", Type: resourcecmd.FlagString, Target: "body.access", Usage: "access", Required: false, Repeated: false}, + {Name: "template-id", Type: resourcecmd.FlagString, Target: "body.template_id", Usage: "template_id", Required: false, Repeated: false}, + {Name: "parent-id", Type: resourcecmd.FlagString, Target: "body.parent_id", Usage: "parent_id", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/stores/:storeId", + Short: "Delete store by ID", + Long: "Deletes a specific store.", + SDKMapping: "stores.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/stores/:storeId", + Short: "Get store by ID", + Long: "Retrieves a store by its ID.", + SDKMapping: "stores.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/stores", + Short: "List stores", + Long: "Returns a paginated list of stores owned by the instance.", + SDKMapping: "stores.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by store ID", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter Filter by creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter Filter by update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/stores/:storeId", + Short: "Update store by ID", + Long: "Updates a specific store.", + SDKMapping: "stores.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "access", Type: resourcecmd.FlagString, Target: "body.access", Usage: "access", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "items", + Singular: "items", + Short: "Stores", + Long: "Create and manage instance stores backed by Cargo.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/stores/:storeId/items/:itemId", + Short: "Get store item by ID", + Long: "Retrieves a specific item within a store.", + SDKMapping: "stores.items.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + {Name: "item-id", Target: "path.itemId", Required: true, Description: "item id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/stores/:storeId/items", + Short: "List store items", + Long: "Returns a paginated list of items for a specific store.", + SDKMapping: "stores.items.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by store item ID", Required: false, Repeated: true}, + {Name: "file-id", Type: resourcecmd.FlagStringSlice, Target: "query.file_id", Usage: "Filter by file ID", Required: false, Repeated: true}, + {Name: "document-id", Type: resourcecmd.FlagStringSlice, Target: "query.document_id", Usage: "Filter by document ID", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by store item type. Repeat `type` to include multiple values. Defaults to `file` and `document`.", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter Filter by creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter Filter by update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "modify", + Method: "PATCH", + Path: "/stores/:storeId/items", + Short: "Modify store items", + Long: "Applies bulk item operations to a specific store.", + SDKMapping: "stores.items.modify", + Args: []resourcecmd.ArgumentSpec{ + {Name: "store-id", Target: "path.storeId", Required: true, Description: "store id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "operations", Type: resourcecmd.FlagJSON, Target: "body.operations", Usage: "operations", Required: true, Repeated: false}, + {Name: "operations-file", Type: resourcecmd.FlagJSONFile, Target: "body.operations", Usage: "Read operations JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "chat", + Singular: "chat", + Short: "Chat", + Long: "", + Operations: []resourcecmd.OperationSpec{}, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "connections", + Singular: "connections", + Short: "Chat Connections", + Long: "Chat connections link a chat provider, such as Slack or Microsoft Teams, to your instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/chat/connections", + Short: "Create chat connection", + Long: "Creates a new chat connection, together with the single provider it is linked to.", + SDKMapping: "chat.connections.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name of the chat connection", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Description of the connection", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Metadata for the connection", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "private-metadata", Type: resourcecmd.FlagJSON, Target: "body.private_metadata", Usage: "Private metadata for the connection", Required: false, Repeated: false}, + {Name: "private-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.private_metadata", Usage: "Read private_metadata JSON from a file", Required: false, Repeated: false}, + {Name: "provider", Type: resourcecmd.FlagJSON, Target: "body.provider", Usage: "provider", Required: true, Repeated: false}, + {Name: "provider-file", Type: resourcecmd.FlagJSONFile, Target: "body.provider", Usage: "Read provider JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/chat/connections/:chatConnectionId", + Short: "Delete chat connection", + Long: "Archives a specific chat connection.", + SDKMapping: "chat.connections.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-connection-id", Target: "path.chatConnectionId", Required: true, Description: "chat connection id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/chat/connections/:chatConnectionId", + Short: "Get chat connection", + Long: "Retrieves a specific chat connection.", + SDKMapping: "chat.connections.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-connection-id", Target: "path.chatConnectionId", Required: true, Description: "chat connection id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/chat/connections", + Short: "List chat connections", + Long: "Returns a paginated list of chat connections.", + SDKMapping: "chat.connections.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by chat connection ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter chat connection creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter chat connection last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/chat/connections/:chatConnectionId", + Short: "Update chat connection", + Long: "Updates a specific chat connection.", + SDKMapping: "chat.connections.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-connection-id", Target: "path.chatConnectionId", Required: true, Description: "chat connection id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name of the chat connection", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Description of the connection", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "private-metadata", Type: resourcecmd.FlagJSON, Target: "body.private_metadata", Usage: "Private metadata", Required: false, Repeated: false}, + {Name: "private-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.private_metadata", Usage: "Read private_metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "instances", + Singular: "instances", + Short: "Chat Instances", + Long: "Chat instances materialize a chat connection for a specific runtime configuration.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/chat/instances", + Short: "Create chat instance", + Long: "Creates a new chat instance for a chat connection.", + SDKMapping: "chat.instances.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "chat-connection-id", Type: resourcecmd.FlagString, Target: "body.chat_connection_id", Usage: "The chat connection to create this instance for", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name of the chat instance", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Description of the instance", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Metadata for the instance", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "private-metadata", Type: resourcecmd.FlagJSON, Target: "body.private_metadata", Usage: "Private metadata for the instance", Required: false, Repeated: false}, + {Name: "private-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.private_metadata", Usage: "Read private_metadata JSON from a file", Required: false, Repeated: false}, + {Name: "identity-actor-id", Type: resourcecmd.FlagString, Target: "body.identity_actor_id", Usage: "Identity actor to run this instance as", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "Identity to run this instance as", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/chat/instances/:chatInstanceId", + Short: "Delete chat instance", + Long: "Archives a specific chat instance.", + SDKMapping: "chat.instances.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-instance-id", Target: "path.chatInstanceId", Required: true, Description: "chat instance id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/chat/instances/:chatInstanceId", + Short: "Get chat instance", + Long: "Retrieves a specific chat instance.", + SDKMapping: "chat.instances.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-instance-id", Target: "path.chatInstanceId", Required: true, Description: "chat instance id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/chat/instances", + Short: "List chat instances", + Long: "Returns a paginated list of chat instances.", + SDKMapping: "chat.instances.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by chat instance ID(s)", Required: false, Repeated: true}, + {Name: "chat-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_connection_id", Usage: "Filter by chat connection ID(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter chat instance creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter chat instance last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/chat/instances/:chatInstanceId", + Short: "Update chat instance", + Long: "Updates a specific chat instance.", + SDKMapping: "chat.instances.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-instance-id", Target: "path.chatInstanceId", Required: true, Description: "chat instance id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name of the chat instance", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Description of the instance", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "private-metadata", Type: resourcecmd.FlagJSON, Target: "body.private_metadata", Usage: "Private metadata", Required: false, Repeated: false}, + {Name: "private-metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.private_metadata", Usage: "Read private_metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "workspaces", + Singular: "workspaces", + Short: "Chat Workspaces", + Long: "Chat workspaces group channels together, for chat providers that organize conversations that way.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/chat/workspaces/:chatWorkspaceId", + Short: "Get chat workspace", + Long: "Retrieves a specific chat workspace.", + SDKMapping: "chat.workspaces.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-workspace-id", Target: "path.chatWorkspaceId", Required: true, Description: "chat workspace id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "chat-instance-id", Type: resourcecmd.FlagString, Target: "query.chat_instance_id", Usage: "The chat instance this workspace belongs to", Required: false, Repeated: false}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/chat/workspaces", + Short: "List chat workspaces", + Long: "Returns a paginated list of workspaces for a chat instance.", + SDKMapping: "chat.workspaces.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "chat-instance-id", Type: resourcecmd.FlagString, Target: "query.chat_instance_id", Usage: "The chat instance to list workspaces for", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by workspace name", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "events", + Singular: "events", + Short: "Chat Events", + Long: "Chat events record what happened on a chat, such as a new message, reaction, or membership change.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/chat/events/:chatEventId", + Short: "Get chat event", + Long: "Retrieves a specific chat event.", + SDKMapping: "chat.events.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "chat-event-id", Target: "path.chatEventId", Required: true, Description: "chat event id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/chat/events", + Short: "List chat events", + Long: "Returns a paginated list of chat events.", + SDKMapping: "chat.events.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "chat-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_id", Usage: "Filter by chat ID(s)", Required: false, Repeated: true}, + {Name: "chat-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_connection_id", Usage: "Filter by chat connection ID(s)", Required: false, Repeated: true}, + {Name: "chat-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_instance_id", Usage: "Filter by chat instance ID(s)", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by event type(s)", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter chat event creation time by date range", Required: false, Repeated: false}, + {Name: "occurred-at", Type: resourcecmd.FlagJSON, Target: "query.occurred_at", Usage: "Filter chat event occurrence time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "callbacks", + Singular: "callbacks", + Short: "Callbacks", + Long: "A callback is what receives provider events for an integration provider. Creating one enables callbacks on the integration provider, and Metorial then registers the callback against every matching integration instance. Setting `callbacks.status` on the integration provider itself does the same thing.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/callbacks", + Short: "Create callback", + Long: "Enables callbacks for an integration provider and returns the callback it created. Only providers whose type reports `triggers.status` as `enabled` support this. Callback instances are then registered for every matching integration instance in the background.", + SDKMapping: "callbacks.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "integration-id", Type: resourcecmd.FlagString, Target: "body.integration_id", Usage: "Integration the integration provider belongs to", Required: true, Repeated: false}, + {Name: "integration-provider-id", Type: resourcecmd.FlagString, Target: "body.integration_provider_id", Usage: "Integration provider to enable callbacks for", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name for the callback. Defaults to the name of the integration provider.", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Description for the callback. Defaults to the description of the integration provider.", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/callbacks/:callbackId", + Short: "Delete callback", + Long: "Disables callbacks on the underlying integration provider, tearing down this callback and every callback instance registered for it.", + SDKMapping: "callbacks.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "callback-id", Target: "path.callbackId", Required: true, Description: "callback id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/callbacks/:callbackId", + Short: "Get callback", + Long: "Retrieves a specific callback by ID.", + SDKMapping: "callbacks.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "callback-id", Target: "path.callbackId", Required: true, Description: "callback id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/callbacks", + Short: "List callbacks", + Long: "Returns a paginated list of callbacks.", + SDKMapping: "callbacks.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by callback ID(s)", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "Filter by integration ID(s)", Required: false, Repeated: true}, + {Name: "integration-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_provider_id", Usage: "Filter by integration provider ID(s)", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by provider ID(s)", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by callback lifecycle status", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter callback creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter callback last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/callbacks/:callbackId", + Short: "Update callback", + Long: "Updates the name, description or metadata of a callback. Everything else about a callback is derived from its integration provider - set `callbacks.status` to `disabled` there to tear it down.", + SDKMapping: "callbacks.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "callback-id", Target: "path.callbackId", Required: true, Description: "callback id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Updated display name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Updated description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "Updated custom metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "events", + Singular: "events", + Short: "Callback Events", + Long: "A callback event is recorded every time a provider trigger behind one of your callbacks fires. Listing returns the events themselves; fetch a single event to enrich it with the payload the provider produced, and the inbound webhook behind it, if any.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/callback-events/:callbackEventId", + Short: "Get callback event", + Long: "Retrieves a specific callback event by ID, enriched with the payload the provider produced for it and, if it came from a webhook, the inbound request behind it.", + SDKMapping: "callbackEvents.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "callback-event-id", Target: "path.callbackEventId", Required: true, Description: "callback event id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/callback-events", + Short: "List callback events", + Long: "Returns a paginated list of callback events.", + SDKMapping: "callbackEvents.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "callback-id", Type: resourcecmd.FlagStringSlice, Target: "query.callback_id", Usage: "Filter by callback ID(s)", Required: false, Repeated: true}, + {Name: "callback-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.callback_instance_id", Usage: "Filter by callback instance ID(s)", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "Filter by the integration the callback belongs to", Required: false, Repeated: true}, + {Name: "integration-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_provider_id", Usage: "Filter by the integration provider the callback belongs to", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "Filter by the provider the callback belongs to", Required: false, Repeated: true}, + {Name: "provider-trigger-key", Type: resourcecmd.FlagStringSlice, Target: "query.provider_trigger_key", Usage: "Filter by the provider trigger key that produced the event", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by callback event processing status", Required: false, Repeated: true}, + {Name: "source", Type: resourcecmd.FlagStringSlice, Target: "query.source", Usage: "Filter by callback event source", Required: false, Repeated: true}, + {Name: "occurred-at", Type: resourcecmd.FlagJSON, Target: "query.occurred_at", Usage: "Filter when the underlying provider event occurred by date range", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter callback event creation time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "instances", + Singular: "instances", + Short: "Callback Instances", + Long: "A callback instance is a callback as it applies to one integration instance provider. Metorial reconciles one for every matching integration instance, so these are read-only.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/callback-instances/:callbackInstanceId", + Short: "Get callback instance", + Long: "Retrieves a specific callback instance by ID.", + SDKMapping: "callbackInstances.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "callback-instance-id", Target: "path.callbackInstanceId", Required: true, Description: "callback instance id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/callback-instances", + Short: "List callback instances", + Long: "Returns a paginated list of callback instances.", + SDKMapping: "callbackInstances.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by callback instance ID(s)", Required: false, Repeated: true}, + {Name: "callback-id", Type: resourcecmd.FlagStringSlice, Target: "query.callback_id", Usage: "Filter by callback ID(s)", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "Filter by the integration the callback belongs to", Required: false, Repeated: true}, + {Name: "integration-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_instance_id", Usage: "Filter by integration instance ID(s)", Required: false, Repeated: true}, + {Name: "integration-instance-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_instance_provider_id", Usage: "Filter by integration instance provider ID(s)", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by callback instance lifecycle status", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter callback instance creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter callback instance last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "events", + Singular: "events", + Short: "Events", + Long: "Events are the record of everything Metorial delivers to your event destinations — normal resource events, callback occurrences, and chat integration events.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/organization/events/:eventId", + Short: "Get event", + Long: "Get a specific event recorded for the organization", + SDKMapping: "events.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-id", Target: "path.eventId", Required: true, Description: "event id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/events", + Short: "List events", + Long: "List events recorded for the organization", + SDKMapping: "events.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "instance-id", Type: resourcecmd.FlagString, Target: "query.instance_id", Usage: "Filter by instance", Required: false, Repeated: false}, + {Name: "event-type", Type: resourcecmd.FlagStringSlice, Target: "query.event_type", Usage: "Filter by event type (e.g. \"organization.created\")", Required: false, Repeated: true}, + {Name: "source", Type: resourcecmd.FlagStringSlice, Target: "query.source", Usage: "Filter by event source", Required: false, Repeated: true}, + {Name: "callback-id", Type: resourcecmd.FlagStringSlice, Target: "query.callback_id", Usage: "Filter by callback ID(s), for events whose source is `callback`", Required: false, Repeated: true}, + {Name: "callback-trigger-key", Type: resourcecmd.FlagStringSlice, Target: "query.callback_trigger_key", Usage: "Filter by callback trigger key(s), for events whose source is `callback`", Required: false, Repeated: true}, + {Name: "chat-integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_integration_id", Usage: "Filter by chat integration ID(s), for events whose source is `chat`", Required: false, Repeated: true}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "destinations", + Singular: "destinations", + Short: "Event destinations", + Long: "Event destinations are where Metorial delivers system events for your organization. Webhooks are currently the only supported delivery type.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "archive", + Method: "POST", + Path: "/organization/event-destinations/:eventDestinationId/archive", + Short: "Archive event destination", + Long: "Archives an event destination. Listeners pointed at it stop being delivered to.", + SDKMapping: "event_destinations.archive", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-id", Target: "path.eventDestinationId", Required: true, Description: "event destination id"}, + }, + }, + { + Name: "create", + Method: "POST", + Path: "/organization/event-destinations", + Short: "Create event destination", + Long: "Create an event destination for the organization", + SDKMapping: "event_destinations.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Display name for the event destination", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Optional description of what this event destination is used for", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "The delivery mechanism to use for this event destination. Only \"webhook\" is currently supported.", Required: true, Repeated: false}, + {Name: "webhook", Type: resourcecmd.FlagJSON, Target: "body.webhook", Usage: "webhook", Required: true, Repeated: false}, + {Name: "webhook-file", Type: resourcecmd.FlagJSONFile, Target: "body.webhook", Usage: "Read webhook JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/organization/event-destinations/:eventDestinationId", + Short: "Get event destination", + Long: "Get a specific event destination configured for the organization", + SDKMapping: "event_destinations.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-id", Target: "path.eventDestinationId", Required: true, Description: "event destination id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/event-destinations", + Short: "List event destinations", + Long: "List all event destinations configured for the organization", + SDKMapping: "event_destinations.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "Filter by event destination lifecycle status", Required: false, Repeated: true}, + }, + }, + { + Name: "rotate-webhook-secret", + Method: "POST", + Path: "/organization/event-destinations/:eventDestinationId/rotate-webhook-secret", + Short: "Rotate event destination webhook secret", + Long: "Generates a new signing secret for this event destination's webhook, invalidating the previous one. The new secret is only returned in this response.", + SDKMapping: "event_destinations.rotate_webhook_secret", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-id", Target: "path.eventDestinationId", Required: true, Description: "event destination id"}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/organization/event-destinations/:eventDestinationId", + Short: "Update event destination", + Long: "Update an event destination configured for the organization", + SDKMapping: "event_destinations.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-id", Target: "path.eventDestinationId", Required: true, Description: "event destination id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "Updated display name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "Updated description", Required: false, Repeated: false}, + {Name: "webhook", Type: resourcecmd.FlagJSON, Target: "body.webhook", Usage: "webhook", Required: false, Repeated: false}, + {Name: "webhook-file", Type: resourcecmd.FlagJSONFile, Target: "body.webhook", Usage: "Read webhook JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "listeners", + Singular: "listeners", + Short: "Event destination listeners", + Long: "Event destination listeners subscribe an event destination to events for a specific instance — generic resource events, a callback's trigger events, or a chat integration's events.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/organization/event-destination-listeners", + Short: "Create event destination listener", + Long: "Subscribes an event destination to events for this instance — generic resource events, a callback's trigger events, or a chat integration's events.", + SDKMapping: "eventDestinationListeners.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "instance-id", Type: resourcecmd.FlagString, Target: "body.instance_id", Usage: "Instance that receives the matching events", Required: false, Repeated: false}, + {Name: "event-destination-id", Type: resourcecmd.FlagString, Target: "body.event_destination_id", Usage: "Event destination to deliver matching events to", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "Listen for generic resource lifecycle events", Required: false, Repeated: false}, + {Name: "event-types", Type: resourcecmd.FlagStringSlice, Target: "body.event_types", Usage: "Resource event types to deliver, e.g. `session.created`", Required: false, Repeated: true}, + {Name: "callback-id", Type: resourcecmd.FlagString, Target: "body.callback_id", Usage: "Callback whose trigger events should be delivered", Required: false, Repeated: false}, + {Name: "triggers", Type: resourcecmd.FlagStringSlice, Target: "body.triggers", Usage: "Callback trigger keys to deliver", Required: false, Repeated: true}, + {Name: "chat-integration-id", Type: resourcecmd.FlagString, Target: "body.chat_integration_id", Usage: "Chat integration whose events should be delivered", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/organization/event-destination-listeners/:eventDestinationListenerId", + Short: "Delete event destination listener", + Long: "Removes an event destination listener.", + SDKMapping: "eventDestinationListeners.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-listener-id", Target: "path.eventDestinationListenerId", Required: true, Description: "event destination listener id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/organization/event-destination-listeners/:eventDestinationListenerId", + Short: "Get event destination listener", + Long: "Retrieves a specific event destination listener by ID.", + SDKMapping: "eventDestinationListeners.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "event-destination-listener-id", Target: "path.eventDestinationListenerId", Required: true, Description: "event destination listener id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/event-destination-listeners", + Short: "List event destination listeners", + Long: "Returns a paginated list of event destination listeners for the organization.", + SDKMapping: "eventDestinationListeners.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "event-destination-id", Type: resourcecmd.FlagStringSlice, Target: "query.event_destination_id", Usage: "Filter by event destination ID(s)", Required: false, Repeated: true}, + {Name: "instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.instance_id", Usage: "Filter by instance ID(s)", Required: false, Repeated: true}, + {Name: "callback-id", Type: resourcecmd.FlagStringSlice, Target: "query.callback_id", Usage: "Filter by callback ID(s), for listeners whose `type` is `callback`", Required: false, Repeated: true}, + {Name: "chat-integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.chat_integration_id", Usage: "Filter by chat integration ID(s), for listeners whose `type` is `chat`", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "Filter by listener type", Required: false, Repeated: true}, + }, + }, + }, + }, + }, + }, + { + Plural: "network", + Singular: "network", + Short: "Networks", + Long: "Read network records for an instance environment.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/networks/:networkId", + Short: "Get network", + Long: "Retrieves a specific network by ID.", + SDKMapping: "networks.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "network-id", Target: "path.networkId", Required: true, Description: "network id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/networks", + Short: "List networks", + Long: "Returns a paginated list of networks.", + SDKMapping: "networks.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "firewall-id", Type: resourcecmd.FlagStringSlice, Target: "query.firewall_id", Usage: "firewall_id", Required: false, Repeated: true}, + {Name: "enclave-id", Type: resourcecmd.FlagStringSlice, Target: "query.enclave_id", Usage: "enclave_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter network creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter network last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "list-network-logs", + Method: "GET", + Path: "/network-logs", + Short: "List network logs", + Long: "Returns ingress or egress network logs for enclaves in the instance environment.", + SDKMapping: "networks.listNetworkLogs", + Flags: []resourcecmd.FlagSpec{ + {Name: "direction", Type: resourcecmd.FlagString, Target: "query.direction", Usage: "direction", Required: false, Repeated: false}, + {Name: "enclave-id", Type: resourcecmd.FlagStringSlice, Target: "query.enclave_id", Usage: "enclave_id", Required: false, Repeated: true}, + {Name: "hostname", Type: resourcecmd.FlagStringSlice, Target: "query.hostname", Usage: "hostname", Required: false, Repeated: true}, + {Name: "ip", Type: resourcecmd.FlagStringSlice, Target: "query.ip", Usage: "ip", Required: false, Repeated: true}, + {Name: "from", Type: resourcecmd.FlagString, Target: "query.from", Usage: "from", Required: false, Repeated: false}, + {Name: "to", Type: resourcecmd.FlagString, Target: "query.to", Usage: "to", Required: false, Repeated: false}, + {Name: "interval-minutes", Type: resourcecmd.FlagFloat, Target: "query.interval_minutes", Usage: "interval_minutes", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "enclaves", + Singular: "enclaves", + Short: "Enclaves", + Long: "Read enclave records for provider deployments in an instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/enclaves/:enclaveId", + Short: "Get enclave", + Long: "Retrieves a specific enclave by ID.", + SDKMapping: "enclaves.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "enclave-id", Target: "path.enclaveId", Required: true, Description: "enclave id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/enclaves", + Short: "List enclaves", + Long: "Returns a paginated list of enclaves.", + SDKMapping: "enclaves.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "slug", Type: resourcecmd.FlagStringSlice, Target: "query.slug", Usage: "slug", Required: false, Repeated: true}, + {Name: "network-id", Type: resourcecmd.FlagStringSlice, Target: "query.network_id", Usage: "network_id", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "firewall-id", Type: resourcecmd.FlagStringSlice, Target: "query.firewall_id", Usage: "firewall_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter enclave creation time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "firewalls", + Singular: "firewalls", + Short: "Firewalls", + Long: "Manage firewalls and their attached network policies.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/firewalls", + Short: "Create firewall", + Long: "Creates a new firewall.", + SDKMapping: "firewalls.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "slug", Type: resourcecmd.FlagString, Target: "body.slug", Usage: "slug", Required: false, Repeated: false}, + {Name: "network-id", Type: resourcecmd.FlagString, Target: "body.network_id", Usage: "network_id", Required: true, Repeated: false}, + {Name: "bindings", Type: resourcecmd.FlagJSON, Target: "body.bindings", Usage: "bindings", Required: false, Repeated: false}, + {Name: "bindings-file", Type: resourcecmd.FlagJSONFile, Target: "body.bindings", Usage: "Read bindings JSON from a file", Required: false, Repeated: false}, + {Name: "network-policy-ids", Type: resourcecmd.FlagStringSlice, Target: "body.network_policy_ids", Usage: "network_policy_ids", Required: false, Repeated: true}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/firewalls/:firewallId", + Short: "Delete firewall", + Long: "Archives a firewall.", + SDKMapping: "firewalls.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "firewall-id", Target: "path.firewallId", Required: true, Description: "firewall id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/firewalls/:firewallId", + Short: "Get firewall", + Long: "Retrieves a specific firewall by ID.", + SDKMapping: "firewalls.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "firewall-id", Target: "path.firewallId", Required: true, Description: "firewall id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/firewalls", + Short: "List firewalls", + Long: "Returns a paginated list of firewalls.", + SDKMapping: "firewalls.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "slug", Type: resourcecmd.FlagStringSlice, Target: "query.slug", Usage: "slug", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "network-id", Type: resourcecmd.FlagStringSlice, Target: "query.network_id", Usage: "network_id", Required: false, Repeated: true}, + {Name: "enclave-id", Type: resourcecmd.FlagStringSlice, Target: "query.enclave_id", Usage: "enclave_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "network-policy-id", Type: resourcecmd.FlagStringSlice, Target: "query.network_policy_id", Usage: "network_policy_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter firewall creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter firewall last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/firewalls/:firewallId", + Short: "Update firewall", + Long: "Updates a firewall definition.", + SDKMapping: "firewalls.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "firewall-id", Target: "path.firewallId", Required: true, Description: "firewall id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "slug", Type: resourcecmd.FlagString, Target: "body.slug", Usage: "slug", Required: false, Repeated: false}, + {Name: "network-policy-ids", Type: resourcecmd.FlagStringSlice, Target: "body.network_policy_ids", Usage: "network_policy_ids", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "policies", + Singular: "policies", + Short: "Network Policies", + Long: "Manage reusable network policy definitions and their rules.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/network-policies", + Short: "Create network policy", + Long: "Creates a new network policy.", + SDKMapping: "networkPolicies.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "rules", Type: resourcecmd.FlagJSON, Target: "body.rules", Usage: "rules", Required: false, Repeated: false}, + {Name: "rules-file", Type: resourcecmd.FlagJSONFile, Target: "body.rules", Usage: "Read rules JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/network-policies/:networkPolicyId", + Short: "Delete network policy", + Long: "Archives a network policy.", + SDKMapping: "networkPolicies.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "network-policy-id", Target: "path.networkPolicyId", Required: true, Description: "network policy id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/network-policies/:networkPolicyId", + Short: "Get network policy", + Long: "Retrieves a specific network policy by ID.", + SDKMapping: "networkPolicies.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "network-policy-id", Target: "path.networkPolicyId", Required: true, Description: "network policy id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/network-policies", + Short: "List network policies", + Long: "Returns a paginated list of network policies.", + SDKMapping: "networkPolicies.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "firewall-id", Type: resourcecmd.FlagStringSlice, Target: "query.firewall_id", Usage: "firewall_id", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter network policy creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter network policy last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/network-policies/:networkPolicyId", + Short: "Update network policy", + Long: "Updates a network policy definition.", + SDKMapping: "networkPolicies.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "network-policy-id", Target: "path.networkPolicyId", Required: true, Description: "network policy id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "rules", Type: resourcecmd.FlagJSON, Target: "body.rules", Usage: "rules", Required: false, Repeated: false}, + {Name: "rules-file", Type: resourcecmd.FlagJSONFile, Target: "body.rules", Usage: "Read rules JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "monitoring", + Singular: "monitoring", + Short: "Monitoring", + Long: "", + Operations: []resourcecmd.OperationSpec{}, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "monitors", + Singular: "monitors", + Short: "Monitors", + Long: "Monitors track automated observability checks for this instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/monitors/:monitorId", + Short: "Get monitor", + Long: "Retrieves a monitor by ID.", + SDKMapping: "monitors.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "monitor-id", Target: "path.monitorId", Required: true, Description: "monitor id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/monitors", + Short: "List monitors", + Long: "Returns a paginated list of monitors for this instance.", + SDKMapping: "monitors.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "Filter by monitor ID(s)", Required: false, Repeated: true}, + {Name: "target", Type: resourcecmd.FlagStringSlice, Target: "query.target", Usage: "target", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "proto-guard-filter-id", Type: resourcecmd.FlagStringSlice, Target: "query.proto_guard_filter_id", Usage: "proto_guard_filter_id", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter monitor creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter monitor last update time by date range", Required: false, Repeated: false}, + {Name: "first-alert-at", Type: resourcecmd.FlagJSON, Target: "query.first_alert_at", Usage: "Filter first monitor alert time by date range", Required: false, Repeated: false}, + {Name: "last-alert-at", Type: resourcecmd.FlagJSON, Target: "query.last_alert_at", Usage: "Filter last monitor alert time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "alerts", + Singular: "alerts", + Short: "Monitor Alerts", + Long: "Monitor alerts represent detected prompt-injection or schema-change events.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/monitor-alerts/:monitorAlertId", + Short: "Get monitor alert", + Long: "Retrieves a monitor alert by ID.", + SDKMapping: "monitorAlerts.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "monitor-alert-id", Target: "path.monitorAlertId", Required: true, Description: "monitor alert id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/monitor-alerts", + Short: "List monitor alerts", + Long: "Returns a paginated list of monitor alerts for this instance.", + SDKMapping: "monitorAlerts.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "monitor-id", Type: resourcecmd.FlagStringSlice, Target: "query.monitor_id", Usage: "monitor_id", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "target", Type: resourcecmd.FlagStringSlice, Target: "query.target", Usage: "target", Required: false, Repeated: true}, + {Name: "source", Type: resourcecmd.FlagStringSlice, Target: "query.source", Usage: "source", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "proto-guard-alert-id", Type: resourcecmd.FlagStringSlice, Target: "query.proto_guard_alert_id", Usage: "proto_guard_alert_id", Required: false, Repeated: true}, + {Name: "proto-guard-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.proto_guard_run_id", Usage: "proto_guard_run_id", Required: false, Repeated: true}, + {Name: "proto-guard-filter-id", Type: resourcecmd.FlagStringSlice, Target: "query.proto_guard_filter_id", Usage: "proto_guard_filter_id", Required: false, Repeated: true}, + {Name: "specification-change-notification-id", Type: resourcecmd.FlagStringSlice, Target: "query.specification_change_notification_id", Usage: "specification_change_notification_id", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "session_id", Required: false, Repeated: true}, + {Name: "session-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_message_id", Usage: "session_message_id", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "session_connection_id", Required: false, Repeated: true}, + {Name: "provider-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_run_id", Usage: "provider_run_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter monitor alert creation time by date range", Required: false, Repeated: false}, + {Name: "resolved-at", Type: resourcecmd.FlagJSON, Target: "query.resolved_at", Usage: "Filter monitor alert resolution time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "resolve", + Method: "POST", + Path: "/monitor-alerts/:monitorAlertId/resolve", + Short: "Resolve monitor alert", + Long: "Marks a monitor alert as resolved.", + SDKMapping: "monitorAlerts.resolve", + Args: []resourcecmd.ArgumentSpec{ + {Name: "monitor-alert-id", Target: "path.monitorAlertId", Required: true, Description: "monitor alert id"}, + }, + }, + { + Name: "unresolve", + Method: "POST", + Path: "/monitor-alerts/:monitorAlertId/unresolve", + Short: "Unresolve monitor alert", + Long: "Reopens a resolved monitor alert.", + SDKMapping: "monitorAlerts.unresolve", + Args: []resourcecmd.ArgumentSpec{ + {Name: "monitor-alert-id", Target: "path.monitorAlertId", Required: true, Description: "monitor alert id"}, + }, + }, + { + Name: "viewed", + Method: "POST", + Path: "/monitor-alerts/:monitorAlertId/viewed", + Short: "Mark monitor alert viewed", + Long: "Marks a monitor alert as viewed by the current actor.", + SDKMapping: "monitorAlerts.viewed", + Args: []resourcecmd.ArgumentSpec{ + {Name: "monitor-alert-id", Target: "path.monitorAlertId", Required: true, Description: "monitor alert id"}, + }, + }, + }, + }, + { + Plural: "protoguard", + Singular: "protoguard", + Short: "ProtoGuard Alerts", + Long: "ProtoGuard alerts describe prompt-injection detections.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/protoguard-alerts/:protoGuardAlertId", + Short: "Get ProtoGuard alert", + Long: "Retrieves a ProtoGuard alert by ID.", + SDKMapping: "protoGuardAlerts.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "proto-guard-alert-id", Target: "path.protoGuardAlertId", Required: true, Description: "proto guard alert id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/protoguard-alerts", + Short: "List ProtoGuard alerts", + Long: "Returns a paginated list of ProtoGuard alerts for this instance.", + SDKMapping: "protoGuardAlerts.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "run-id", Type: resourcecmd.FlagStringSlice, Target: "query.run_id", Usage: "run_id", Required: false, Repeated: true}, + {Name: "filter-id", Type: resourcecmd.FlagStringSlice, Target: "query.filter_id", Usage: "filter_id", Required: false, Repeated: true}, + {Name: "session-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_id", Usage: "session_id", Required: false, Repeated: true}, + {Name: "session-message-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_message_id", Usage: "session_message_id", Required: false, Repeated: true}, + {Name: "session-connection-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_connection_id", Usage: "session_connection_id", Required: false, Repeated: true}, + {Name: "provider-run-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_run_id", Usage: "provider_run_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter ProtoGuard alert creation time by date range", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "portals", + Singular: "portals", + Short: "Portal", + Long: "Use Portals to create custom branded MCP server marketplaces for your organization.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/portals", + Short: "Create portal", + Long: "Creates a new portal for the instance.", + SDKMapping: "portals.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "allowed-redirect-url-filters", Type: resourcecmd.FlagJSON, Target: "body.allowed_redirect_url_filters", Usage: "allowed_redirect_url_filters", Required: false, Repeated: false}, + {Name: "allowed-redirect-url-filters-file", Type: resourcecmd.FlagJSONFile, Target: "body.allowed_redirect_url_filters", Usage: "Read allowed_redirect_url_filters JSON from a file", Required: false, Repeated: false}, + {Name: "session-expiry-time-in-seconds", Type: resourcecmd.FlagFloat, Target: "body.session_expiry_time_in_seconds", Usage: "session_expiry_time_in_seconds", Required: false, Repeated: false}, + {Name: "allow-consumer-skill-authoring", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_authoring", Usage: "allow_consumer_skill_authoring", Required: false, Repeated: false}, + {Name: "allow-consumer-skill-publishing", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_publishing", Usage: "allow_consumer_skill_publishing", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/portals/:portalId", + Short: "Get portal", + Long: "Retrieves details for a specific portal.", + SDKMapping: "portals.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/portals", + Short: "List portals", + Long: "Returns a paginated list of portals.", + SDKMapping: "portals.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "Search by name or description", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/portals/:portalId", + Short: "Update portal", + Long: "Updates an existing portal for the instance.", + SDKMapping: "portals.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "allowed-redirect-url-filters", Type: resourcecmd.FlagJSON, Target: "body.allowed_redirect_url_filters", Usage: "allowed_redirect_url_filters", Required: false, Repeated: false}, + {Name: "allowed-redirect-url-filters-file", Type: resourcecmd.FlagJSONFile, Target: "body.allowed_redirect_url_filters", Usage: "Read allowed_redirect_url_filters JSON from a file", Required: false, Repeated: false}, + {Name: "session-expiry-time-in-seconds", Type: resourcecmd.FlagFloat, Target: "body.session_expiry_time_in_seconds", Usage: "session_expiry_time_in_seconds", Required: false, Repeated: false}, + {Name: "allow-consumer-skill-authoring", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_authoring", Usage: "allow_consumer_skill_authoring", Required: false, Repeated: false}, + {Name: "allow-consumer-skill-publishing", Type: resourcecmd.FlagBool, Target: "body.allow_consumer_skill_publishing", Usage: "allow_consumer_skill_publishing", Required: false, Repeated: false}, + {Name: "skill-configuration", Type: resourcecmd.FlagJSON, Target: "body.skill_configuration", Usage: "skill_configuration", Required: false, Repeated: false}, + {Name: "skill-configuration-file", Type: resourcecmd.FlagJSONFile, Target: "body.skill_configuration", Usage: "Read skill_configuration JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "groups", + Singular: "groups", + Short: "Portal Consumer Groups", + Long: "Manage the consumer groups that drive portal visibility and access rules.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/portals/:portalId/consumer-groups", + Short: "Create portal consumer group", + Long: "Creates a new consumer group for the portal.", + SDKMapping: "portals.consumerGroups.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "is-default", Type: resourcecmd.FlagBool, Target: "body.is_default", Usage: "is_default", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/portals/:portalId/consumer-groups/:consumerGroupId", + Short: "Delete portal consumer group", + Long: "Archives a consumer group for the portal.", + SDKMapping: "portals.consumerGroups.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "consumer-group-id", Target: "path.consumerGroupId", Required: true, Description: "consumer group id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/portals/:portalId/consumer-groups/:consumerGroupId", + Short: "Get portal consumer group", + Long: "Retrieves a portal consumer group by ID.", + SDKMapping: "portals.consumerGroups.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "consumer-group-id", Target: "path.consumerGroupId", Required: true, Description: "consumer group id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/portals/:portalId/consumer-groups", + Short: "List portal consumer groups", + Long: "Returns a paginated list of consumer groups for a portal.", + SDKMapping: "portals.consumerGroups.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/portals/:portalId/consumer-groups/:consumerGroupId", + Short: "Update portal consumer group", + Long: "Updates a consumer group for the portal.", + SDKMapping: "portals.consumerGroups.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "consumer-group-id", Target: "path.consumerGroupId", Required: true, Description: "consumer group id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "is-default", Type: resourcecmd.FlagBool, Target: "body.is_default", Usage: "is_default", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "invites", + Singular: "invites", + Short: "Portal Consumer Invites", + Long: "List and inspect consumer invites for a portal.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/portals/:portalId/consumer-invites", + Short: "Create portal consumer invite", + Long: "Invites a consumer to a portal.", + SDKMapping: "portals.consumerInvites.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "email", Type: resourcecmd.FlagString, Target: "body.email", Usage: "email", Required: true, Repeated: false}, + {Name: "message", Type: resourcecmd.FlagString, Target: "body.message", Usage: "message", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/portals/:portalId/consumer-invites/:consumerInviteId", + Short: "Get portal consumer invite", + Long: "Retrieves a portal consumer invite by ID.", + SDKMapping: "portals.consumerInvites.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "consumer-invite-id", Target: "path.consumerInviteId", Required: true, Description: "consumer invite id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/portals/:portalId/consumer-invites", + Short: "List portal consumer invites", + Long: "Returns a paginated list of invites for a portal.", + SDKMapping: "portals.consumerInvites.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "email", Type: resourcecmd.FlagStringSlice, Target: "query.email", Usage: "email", Required: false, Repeated: true}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "access", + Singular: "access", + Short: "Portal Access", + Long: "Manage which consumer groups can access portal provider templates and MCP servers.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/portals/:portalId/access", + Short: "Create portal access", + Long: "Creates a new consumer access rule for the portal.", + SDKMapping: "portals.access.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "consumer-group-id", Type: resourcecmd.FlagString, Target: "body.consumer_group_id", Usage: "consumer_group_id", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "readme", Type: resourcecmd.FlagString, Target: "body.readme", Usage: "readme", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/portals/:portalId/access/:accessId", + Short: "Delete portal access", + Long: "Deletes a consumer access rule from the portal.", + SDKMapping: "portals.access.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "access-id", Target: "path.accessId", Required: true, Description: "access id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/portals/:portalId/access/:accessId", + Short: "Get portal access", + Long: "Retrieves a portal access rule by ID.", + SDKMapping: "portals.access.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "access-id", Target: "path.accessId", Required: true, Description: "access id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/portals/:portalId/access", + Short: "List portal access", + Long: "Returns a paginated list of consumer access rules for a portal.", + SDKMapping: "portals.access.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "consumer-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_group_id", Usage: "consumer_group_id", Required: false, Repeated: true}, + {Name: "provider-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_template_id", Usage: "provider_template_id", Required: false, Repeated: true}, + {Name: "magic-mcp-server-id", Type: resourcecmd.FlagStringSlice, Target: "query.magic_mcp_server_id", Usage: "magic_mcp_server_id", Required: false, Repeated: true}, + {Name: "skill-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_id", Usage: "skill_id", Required: false, Repeated: true}, + {Name: "skill-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_template_id", Usage: "skill_template_id", Required: false, Repeated: true}, + {Name: "skill-group-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_group_id", Usage: "skill_group_id", Required: false, Repeated: true}, + {Name: "skill-marketplace-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_marketplace_id", Usage: "skill_marketplace_id", Required: false, Repeated: true}, + {Name: "skill-plugin-id", Type: resourcecmd.FlagStringSlice, Target: "query.skill_plugin_id", Usage: "skill_plugin_id", Required: false, Repeated: true}, + {Name: "consumer-access-listing-id", Type: resourcecmd.FlagStringSlice, Target: "query.consumer_access_listing_id", Usage: "consumer_access_listing_id", Required: false, Repeated: true}, + {Name: "type", Type: resourcecmd.FlagStringSlice, Target: "query.type", Usage: "type", Required: false, Repeated: true}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/portals/:portalId/access/:accessId", + Short: "Update portal access", + Long: "Updates the shared listing fields for a portal access rule.", + SDKMapping: "portals.access.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "portal-id", Target: "path.portalId", Required: true, Description: "portal id"}, + {Name: "access-id", Target: "path.accessId", Required: true, Description: "access id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "readme", Type: resourcecmd.FlagString, Target: "body.readme", Usage: "readme", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "consumers", + Singular: "consumers", + Short: "Consumers", + Long: "Manage instance consumers independently from portals and inspect the profiles linked to each consumer.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/consumers", + Short: "Create consumer", + Long: "Creates or links a consumer for an instance.", + SDKMapping: "consumers.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "email", Type: resourcecmd.FlagString, Target: "body.email", Usage: "email", Required: true, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/consumers/:consumerId", + Short: "Get consumer", + Long: "Retrieves a consumer by ID.", + SDKMapping: "consumers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "consumer-id", Target: "path.consumerId", Required: true, Description: "consumer id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/consumers", + Short: "List consumers", + Long: "Returns a paginated list of consumers for an instance.", + SDKMapping: "consumers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "email", Type: resourcecmd.FlagStringSlice, Target: "query.email", Usage: "email", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagString, Target: "query.id", Usage: "id", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/consumers/:consumerId", + Short: "Update consumer", + Long: "Updates a consumer for an instance.", + SDKMapping: "consumers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "consumer-id", Target: "path.consumerId", Required: true, Description: "consumer id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "email", Type: resourcecmd.FlagString, Target: "body.email", Usage: "email", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "surfaces", + Singular: "surfaces", + Short: "Consumer Surfaces", + Long: "List and retrieve consumer surfaces for an instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "get", + Method: "GET", + Path: "/consumer-surfaces/:consumerSurfaceId", + Short: "Get consumer surface", + Long: "Retrieves a consumer surface by ID.", + SDKMapping: "consumerSurfaces.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "consumer-surface-id", Target: "path.consumerSurfaceId", Required: true, Description: "consumer surface id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/consumer-surfaces", + Short: "List consumer surfaces", + Long: "Returns a paginated list of consumer surfaces for an instance.", + SDKMapping: "consumerSurfaces.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + { + Plural: "integrations", + Singular: "integrations", + Short: "Integrations", + Long: "Integrations define reusable provider contracts that can then be materialized into integration instances.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/integrations", + Short: "Create integration", + Long: "Creates a new integration.", + SDKMapping: "integrations.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "use-integration-name-in-tool-names", Type: resourcecmd.FlagBool, Target: "body.use_integration_name_in_tool_names", Usage: "use_integration_name_in_tool_names", Required: false, Repeated: false}, + {Name: "can-attach-custom-tool-filters", Type: resourcecmd.FlagBool, Target: "body.can_attach_custom_tool_filters", Usage: "can_attach_custom_tool_filters", Required: false, Repeated: false}, + {Name: "can-attach-custom-provider-config", Type: resourcecmd.FlagBool, Target: "body.can_attach_custom_provider_config", Usage: "can_attach_custom_provider_config", Required: false, Repeated: false}, + {Name: "can-override-tool-filters", Type: resourcecmd.FlagBool, Target: "body.can_override_tool_filters", Usage: "can_override_tool_filters", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/integrations/:integrationId", + Short: "Get integration", + Long: "Retrieves a specific integration.", + SDKMapping: "integrations.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-id", Target: "path.integrationId", Required: true, Description: "integration id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/integrations", + Short: "List integrations", + Long: "Returns a paginated list of integrations.", + SDKMapping: "integrations.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "integration-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_provider_id", Usage: "integration_provider_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter integration creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter integration last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/integrations/:integrationId", + Short: "Update integration", + Long: "Updates a specific integration.", + SDKMapping: "integrations.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-id", Target: "path.integrationId", Required: true, Description: "integration id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "use-integration-name-in-tool-names", Type: resourcecmd.FlagBool, Target: "body.use_integration_name_in_tool_names", Usage: "use_integration_name_in_tool_names", Required: false, Repeated: false}, + {Name: "can-attach-custom-tool-filters", Type: resourcecmd.FlagBool, Target: "body.can_attach_custom_tool_filters", Usage: "can_attach_custom_tool_filters", Required: false, Repeated: false}, + {Name: "can-attach-custom-provider-config", Type: resourcecmd.FlagBool, Target: "body.can_attach_custom_provider_config", Usage: "can_attach_custom_provider_config", Required: false, Repeated: false}, + {Name: "can-override-tool-filters", Type: resourcecmd.FlagBool, Target: "body.can_override_tool_filters", Usage: "can_override_tool_filters", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "providers", + Singular: "providers", + Short: "Integration Providers", + Long: "Integration providers define the shared provider-level contract for a given integration.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/integration-providers", + Short: "Create integration provider", + Long: "Creates a new integration provider.", + SDKMapping: "integrations.providers.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "integration-id", Type: resourcecmd.FlagString, Target: "body.integration_id", Usage: "integration_id", Required: true, Repeated: false}, + {Name: "provider-id", Type: resourcecmd.FlagString, Target: "body.provider_id", Usage: "provider_id", Required: true, Repeated: false}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "provider_deployment_id", Required: true, Repeated: false}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_method_id", Usage: "provider_auth_method_id", Required: false, Repeated: false}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_credentials_id", Usage: "provider_auth_credentials_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "callbacks", Type: resourcecmd.FlagJSON, Target: "body.callbacks", Usage: "Provider callback state for this integration provider", Required: false, Repeated: false}, + {Name: "callbacks-file", Type: resourcecmd.FlagJSONFile, Target: "body.callbacks", Usage: "Read callbacks JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/integration-providers/:integrationProviderId", + Short: "Delete integration provider", + Long: "Archives a specific integration provider.", + SDKMapping: "integrations.providers.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-provider-id", Target: "path.integrationProviderId", Required: true, Description: "integration provider id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/integration-providers/:integrationProviderId", + Short: "Get integration provider", + Long: "Retrieves a specific integration provider.", + SDKMapping: "integrations.providers.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-provider-id", Target: "path.integrationProviderId", Required: true, Description: "integration provider id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/integration-providers", + Short: "List integration providers", + Long: "Returns a paginated list of integration providers.", + SDKMapping: "integrations.providers.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: true}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_method_id", Usage: "provider_auth_method_id", Required: false, Repeated: true}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_credentials_id", Usage: "provider_auth_credentials_id", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter integration provider creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter integration provider last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/integration-providers/:integrationProviderId", + Short: "Update integration provider", + Long: "Updates a specific integration provider.", + SDKMapping: "integrations.providers.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-provider-id", Target: "path.integrationProviderId", Required: true, Description: "integration provider id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "provider-deployment-id", Type: resourcecmd.FlagString, Target: "body.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: false}, + {Name: "provider-auth-method-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_method_id", Usage: "provider_auth_method_id", Required: false, Repeated: false}, + {Name: "provider-auth-credentials-id", Type: resourcecmd.FlagString, Target: "body.provider_auth_credentials_id", Usage: "provider_auth_credentials_id", Required: false, Repeated: false}, + {Name: "provider-config-id", Type: resourcecmd.FlagString, Target: "body.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "tool-filters", Type: resourcecmd.FlagStringSlice, Target: "body.tool_filters", Usage: "tool_filters", Required: false, Repeated: true}, + {Name: "callbacks", Type: resourcecmd.FlagJSON, Target: "body.callbacks", Usage: "Provider callback state for this integration provider", Required: false, Repeated: false}, + {Name: "callbacks-file", Type: resourcecmd.FlagJSONFile, Target: "body.callbacks", Usage: "Read callbacks JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "instances", + Singular: "instances", + Short: "Integration Instances", + Long: "Integration instances materialize an integration for a specific actor, identity, or runtime configuration.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/integration-instances", + Short: "Create integration instance", + Long: "Creates a new integration instance.", + SDKMapping: "integrations.instances.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "integration-id", Type: resourcecmd.FlagString, Target: "body.integration_id", Usage: "integration_id", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "identity-actor-id", Type: resourcecmd.FlagString, Target: "body.identity_actor_id", Usage: "identity_actor_id", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "identity_id", Required: false, Repeated: false}, + {Name: "providers", Type: resourcecmd.FlagJSON, Target: "body.providers", Usage: "providers", Required: false, Repeated: false}, + {Name: "providers-file", Type: resourcecmd.FlagJSONFile, Target: "body.providers", Usage: "Read providers JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "create-session", + Method: "POST", + Path: "/integration-instances/:integrationInstanceId/session", + Short: "Create integration instance session", + Long: "Creates a session from the shared session template of a specific integration instance.", + SDKMapping: "integrations.instances.createSession", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-instance-id", Target: "path.integrationInstanceId", Required: true, Description: "integration instance id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "create-session-template", + Method: "POST", + Path: "/integration-instances/:integrationInstanceId/session-template", + Short: "Create integration instance session template", + Long: "Creates or updates the shared session template for a specific integration instance.", + SDKMapping: "integrations.instances.createSessionTemplate", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-instance-id", Target: "path.integrationInstanceId", Required: true, Description: "integration instance id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/integration-instances/:integrationInstanceId", + Short: "Delete integration instance", + Long: "Archives a specific integration instance.", + SDKMapping: "integrations.instances.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-instance-id", Target: "path.integrationInstanceId", Required: true, Description: "integration instance id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/integration-instances/:integrationInstanceId", + Short: "Get integration instance", + Long: "Retrieves a specific integration instance.", + SDKMapping: "integrations.instances.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-instance-id", Target: "path.integrationInstanceId", Required: true, Description: "integration instance id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/integration-instances", + Short: "List integration instances", + Long: "Returns a paginated list of integration instances.", + SDKMapping: "integrations.instances.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "search", Type: resourcecmd.FlagString, Target: "query.search", Usage: "search", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_id", Usage: "provider_id", Required: false, Repeated: true}, + {Name: "integration-provider-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_provider_id", Usage: "integration_provider_id", Required: false, Repeated: true}, + {Name: "identity-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_id", Usage: "identity_id", Required: false, Repeated: true}, + {Name: "identity-credential-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_credential_id", Usage: "identity_credential_id", Required: false, Repeated: true}, + {Name: "identity-actor-id", Type: resourcecmd.FlagStringSlice, Target: "query.identity_actor_id", Usage: "identity_actor_id", Required: false, Repeated: true}, + {Name: "provider-deployment-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_deployment_id", Usage: "provider_deployment_id", Required: false, Repeated: true}, + {Name: "provider-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_config_id", Usage: "provider_config_id", Required: false, Repeated: true}, + {Name: "provider-auth-config-id", Type: resourcecmd.FlagStringSlice, Target: "query.provider_auth_config_id", Usage: "provider_auth_config_id", Required: false, Repeated: true}, + {Name: "session-template-id", Type: resourcecmd.FlagStringSlice, Target: "query.session_template_id", Usage: "session_template_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter integration instance creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter integration instance last update time by date range", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "PATCH", + Path: "/integration-instances/:integrationInstanceId", + Short: "Update integration instance", + Long: "Updates a specific integration instance.", + SDKMapping: "integrations.instances.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-instance-id", Target: "path.integrationInstanceId", Required: true, Description: "integration instance id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "identity-actor-id", Type: resourcecmd.FlagString, Target: "body.identity_actor_id", Usage: "identity_actor_id", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "identity_id", Required: false, Repeated: false}, + {Name: "providers", Type: resourcecmd.FlagJSON, Target: "body.providers", Usage: "providers", Required: false, Repeated: false}, + {Name: "providers-file", Type: resourcecmd.FlagJSONFile, Target: "body.providers", Usage: "Read providers JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "setup-sessions", + Singular: "setup-sessions", + Short: "Integration Setup Sessions", + Long: "Integration setup sessions orchestrate configuring every provider required by an integration instance.", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/integration-setup-sessions", + Short: "Create integration setup session", + Long: "Creates a new integration setup session and draft integration instance.", + SDKMapping: "integrations.setupSessions.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "integration-id", Type: resourcecmd.FlagString, Target: "body.integration_id", Usage: "integration_id", Required: true, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "metadata", Type: resourcecmd.FlagJSON, Target: "body.metadata", Usage: "metadata", Required: false, Repeated: false}, + {Name: "metadata-file", Type: resourcecmd.FlagJSONFile, Target: "body.metadata", Usage: "Read metadata JSON from a file", Required: false, Repeated: false}, + {Name: "identity-actor-id", Type: resourcecmd.FlagString, Target: "body.identity_actor_id", Usage: "identity_actor_id", Required: false, Repeated: false}, + {Name: "identity-id", Type: resourcecmd.FlagString, Target: "body.identity_id", Usage: "identity_id", Required: false, Repeated: false}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "expires_at", Required: false, Repeated: false}, + {Name: "redirect-url", Type: resourcecmd.FlagString, Target: "body.redirect_url", Usage: "redirect_url", Required: false, Repeated: false}, + {Name: "configuration", Type: resourcecmd.FlagJSON, Target: "body.configuration", Usage: "configuration", Required: false, Repeated: false}, + {Name: "configuration-file", Type: resourcecmd.FlagJSONFile, Target: "body.configuration", Usage: "Read configuration JSON from a file", Required: false, Repeated: false}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/integration-setup-sessions/:integrationSetupSessionId", + Short: "Get integration setup session", + Long: "Retrieves a specific integration setup session.", + SDKMapping: "integrations.setupSessions.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "integration-setup-session-id", Target: "path.integrationSetupSessionId", Required: true, Description: "integration setup session id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/integration-setup-sessions", + Short: "List integration setup sessions", + Long: "Returns a paginated list of integration setup sessions.", + SDKMapping: "integrations.setupSessions.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "status", Type: resourcecmd.FlagStringSlice, Target: "query.status", Usage: "status", Required: false, Repeated: true}, + {Name: "id", Type: resourcecmd.FlagStringSlice, Target: "query.id", Usage: "id", Required: false, Repeated: true}, + {Name: "integration-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_id", Usage: "integration_id", Required: false, Repeated: true}, + {Name: "integration-instance-id", Type: resourcecmd.FlagStringSlice, Target: "query.integration_instance_id", Usage: "integration_instance_id", Required: false, Repeated: true}, + {Name: "created-at", Type: resourcecmd.FlagJSON, Target: "query.created_at", Usage: "Filter integration setup session creation time by date range", Required: false, Repeated: false}, + {Name: "updated-at", Type: resourcecmd.FlagJSON, Target: "query.updated_at", Usage: "Filter integration setup session last update time by date range", Required: false, Repeated: false}, + }, + }, + }, + Shortcuts: []resourcecmd.ShortcutSpec{ + {Path: []string{"integrations", "setup"}, Method: "create"}, + }, + }, + }, + }, + { + Plural: "api-keys", + Singular: "api-keys", + Short: "API Key", + Long: "Read and write API key information", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/organization/api-keys", + Short: "Create API key", + Long: "Create a new API key", + SDKMapping: "apiKeys.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "type", Type: resourcecmd.FlagString, Target: "body.type", Usage: "type", Required: false, Repeated: false}, + {Name: "instance-id", Type: resourcecmd.FlagString, Target: "body.instance_id", Usage: "instance_id", Required: false, Repeated: false}, + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "expires_at", Required: false, Repeated: false}, + {Name: "ip-filters", Type: resourcecmd.FlagStringSlice, Target: "body.ip_filters", Usage: "ip_filters", Required: false, Repeated: true}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/organization/api-keys/:apiKeyId", + Short: "Get API key", + Long: "Get the information of a specific API key", + SDKMapping: "apiKeys.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "api-key-id", Target: "path.apiKeyId", Required: true, Description: "api key id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/api-keys", + Short: "Get user", + Long: "Get the current user information", + SDKMapping: "apiKeys.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "type", Type: resourcecmd.FlagString, Target: "query.type", Usage: "List organization management tokens", Required: false, Repeated: false}, + {Name: "instance-id", Type: resourcecmd.FlagString, Target: "query.instance_id", Usage: "Instance ID for the access token", Required: false, Repeated: false}, + }, + }, + { + Name: "reveal", + Method: "POST", + Path: "/organization/api-keys/:apiKeyId/reveal", + Short: "Reveal API key", + Long: "Reveal a specific API key", + SDKMapping: "apiKeys.reveal", + Args: []resourcecmd.ArgumentSpec{ + {Name: "api-key-id", Target: "path.apiKeyId", Required: true, Description: "api key id"}, + }, + }, + { + Name: "revoke", + Method: "DELETE", + Path: "/organization/api-keys/:apiKeyId", + Short: "Revoke API key", + Long: "Revoke a specific API key", + SDKMapping: "apiKeys.revoke", + Args: []resourcecmd.ArgumentSpec{ + {Name: "api-key-id", Target: "path.apiKeyId", Required: true, Description: "api key id"}, + }, + }, + { + Name: "rotate", + Method: "POST", + Path: "/organization/api-keys/:apiKeyId/rotate", + Short: "Rotate API key", + Long: "Rotate a specific API key", + SDKMapping: "apiKeys.rotate", + Args: []resourcecmd.ArgumentSpec{ + {Name: "api-key-id", Target: "path.apiKeyId", Required: true, Description: "api key id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "current-expires-at", Type: resourcecmd.FlagString, Target: "body.current_expires_at", Usage: "current_expires_at", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "POST", + Path: "/organization/api-keys/:apiKeyId", + Short: "Update API key", + Long: "Update the information of a specific API key", + SDKMapping: "apiKeys.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "api-key-id", Target: "path.apiKeyId", Required: true, Description: "api key id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "expires_at", Required: false, Repeated: false}, + {Name: "ip-filters", Type: resourcecmd.FlagStringSlice, Target: "body.ip_filters", Usage: "ip_filters", Required: false, Repeated: true}, + }, + }, + }, + }, + { + Plural: "outposts", + Singular: "outposts", + Short: "Outpost", + Long: "Read and write outposts, their access grants, and credentials", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/organization/outposts", + Short: "Create outpost", + Long: "Create a new outpost owned by this organization", + SDKMapping: "outposts.create", + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/organization/outposts/:outpostId", + Short: "Delete outpost", + Long: "Delete a disabled outpost owned by this organization", + SDKMapping: "outposts.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + }, + { + Name: "disable", + Method: "POST", + Path: "/organization/outposts/:outpostId/disable", + Short: "Disable outpost", + Long: "Disable an outpost owned by this organization. An outpost must be disabled before it can be deleted.", + SDKMapping: "outposts.disable", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + }, + { + Name: "enable", + Method: "POST", + Path: "/organization/outposts/:outpostId/enable", + Short: "Enable outpost", + Long: "Enable a disabled outpost owned by this organization", + SDKMapping: "outposts.enable", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/organization/outposts/:outpostId", + Short: "Get outpost", + Long: "Get any outpost in the organization's account family", + SDKMapping: "outposts.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/outposts", + Short: "List outposts", + Long: "List every outpost in the organization's account family", + SDKMapping: "outposts.list", + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + { + Name: "update", + Method: "POST", + Path: "/organization/outposts/:outpostId", + Short: "Update outpost", + Long: "Update the information of an outpost owned by this organization", + SDKMapping: "outposts.update", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: false, Repeated: false}, + {Name: "description", Type: resourcecmd.FlagString, Target: "body.description", Usage: "description", Required: false, Repeated: false}, + }, + }, + }, + Children: []resourcecmd.ResourceSpec{ + { + Plural: "access", + Singular: "access", + Short: "Outpost", + Long: "Read and write outposts, their access grants, and credentials", + Operations: []resourcecmd.OperationSpec{ + { + Name: "list", + Method: "GET", + Path: "/organization/outposts/:outpostId/access", + Short: "List outpost access", + Long: "List the access grants on an outpost, optionally filtered by organization or instance", + SDKMapping: "outposts.access.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + {Name: "organization-id", Type: resourcecmd.FlagString, Target: "query.organization_id", Usage: "organization_id", Required: false, Repeated: false}, + {Name: "instance-id", Type: resourcecmd.FlagString, Target: "query.instance_id", Usage: "instance_id", Required: false, Repeated: false}, + }, + }, + { + Name: "set", + Method: "POST", + Path: "/organization/outposts/:outpostId/access", + Short: "Set outpost access", + Long: "Replace this organization's access grants on an outpost with the given list of instance/service grants", + SDKMapping: "outposts.access.set", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "grants", Type: resourcecmd.FlagJSON, Target: "body.grants", Usage: "grants", Required: true, Repeated: false}, + {Name: "grants-file", Type: resourcecmd.FlagJSONFile, Target: "body.grants", Usage: "Read grants JSON from a file", Required: false, Repeated: false}, + }, + }, + }, + }, + { + Plural: "credentials", + Singular: "credentials", + Short: "Outpost", + Long: "Read and write outposts, their access grants, and credentials", + Operations: []resourcecmd.OperationSpec{ + { + Name: "create", + Method: "POST", + Path: "/organization/outposts/:outpostId/credentials", + Short: "Create outpost credential", + Long: "Create a new enrollment credential for an outpost owned by this organization", + SDKMapping: "outposts.credentials.create", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "name", Type: resourcecmd.FlagString, Target: "body.name", Usage: "name", Required: true, Repeated: false}, + {Name: "expires-at", Type: resourcecmd.FlagString, Target: "body.expires_at", Usage: "expires_at", Required: false, Repeated: false}, + }, + }, + { + Name: "delete", + Method: "DELETE", + Path: "/organization/outposts/:outpostId/credentials/:credentialId", + Short: "Delete outpost credential", + Long: "Delete a disabled credential for an outpost owned by this organization", + SDKMapping: "outposts.credentials.delete", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + {Name: "credential-id", Target: "path.credentialId", Required: true, Description: "credential id"}, + }, + }, + { + Name: "disable", + Method: "POST", + Path: "/organization/outposts/:outpostId/credentials/:credentialId/disable", + Short: "Disable outpost credential", + Long: "Disable a credential for an outpost owned by this organization. A credential must be disabled before it can be deleted.", + SDKMapping: "outposts.credentials.disable", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + {Name: "credential-id", Target: "path.credentialId", Required: true, Description: "credential id"}, + }, + }, + { + Name: "get", + Method: "GET", + Path: "/organization/outposts/:outpostId/credentials/:credentialId", + Short: "Get outpost credential", + Long: "Get a credential for an outpost owned by this organization", + SDKMapping: "outposts.credentials.get", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + {Name: "credential-id", Target: "path.credentialId", Required: true, Description: "credential id"}, + }, + }, + { + Name: "list", + Method: "GET", + Path: "/organization/outposts/:outpostId/credentials", + Short: "List outpost credentials", + Long: "List the credentials for an outpost owned by this organization", + SDKMapping: "outposts.credentials.list", + Args: []resourcecmd.ArgumentSpec{ + {Name: "outpost-id", Target: "path.outpostId", Required: true, Description: "outpost id"}, + }, + Flags: []resourcecmd.FlagSpec{ + {Name: "limit", Type: resourcecmd.FlagFloat, Target: "query.limit", Usage: "limit", Required: false, Repeated: false}, + {Name: "after", Type: resourcecmd.FlagString, Target: "query.after", Usage: "after", Required: false, Repeated: false}, + {Name: "before", Type: resourcecmd.FlagString, Target: "query.before", Usage: "before", Required: false, Repeated: false}, + {Name: "cursor", Type: resourcecmd.FlagString, Target: "query.cursor", Usage: "cursor", Required: false, Repeated: false}, + {Name: "order", Type: resourcecmd.FlagString, Target: "query.order", Usage: "order", Required: false, Repeated: false}, + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/generated/admin/catalog_test.go b/internal/generated/admin/catalog_test.go new file mode 100644 index 0000000..810b76c --- /dev/null +++ b/internal/generated/admin/catalog_test.go @@ -0,0 +1,55 @@ +package admin + +import "testing" + +func TestCatalogIncludesCoreResources(t *testing.T) { + t.Parallel() + + catalog := Catalog() + if len(catalog) == 0 { + t.Fatal("generated catalog is empty; run `make generate`") + } + + foundProviders := false + hasCredentials := false + hasSetupShortcut := false + + for _, resource := range catalog { + if resource.Plural == "providers" { + foundProviders = true + } + + if resource.Plural == "outposts" { + for _, child := range resource.Children { + if child.Plural != "credentials" { + continue + } + for _, operation := range child.Operations { + if operation.Name == "create" && operation.SDKMapping == "outposts.credentials.create" { + hasCredentials = true + } + } + } + } + + if resource.Plural == "integrations" { + for _, child := range resource.Children { + for _, shortcut := range child.Shortcuts { + if len(shortcut.Path) == 2 && shortcut.Path[0] == "integrations" && shortcut.Path[1] == "setup" && string(shortcut.Method) == "create" { + hasSetupShortcut = true + } + } + } + } + } + + if !foundProviders { + t.Fatal("catalog missing providers") + } + if !hasCredentials { + t.Fatal("catalog missing outposts credentials create") + } + if !hasSetupShortcut { + t.Fatal("catalog missing integrations setup shortcut") + } +} diff --git a/internal/resourcecmd/catalog.go b/internal/resourcecmd/catalog.go deleted file mode 100644 index 0c892fe..0000000 --- a/internal/resourcecmd/catalog.go +++ /dev/null @@ -1,20 +0,0 @@ -package resourcecmd - -// PublicCatalog returns the resource groups exposed as top-level public CLI resources. -func PublicCatalog() []ResourceGroup { - return []ResourceGroup{ - { - Title: "Core Resources", - Resources: []ResourceSpec{ - InstanceResource(), - ProvidersResource(), - DeploymentsResource(), - ConfigsResource(), - AuthConfigsResource(), - IdentitiesResource(), - ActorsResource(), - IdentityCredentialsResource(), - }, - }, - } -} diff --git a/internal/resourcecmd/cobra.go b/internal/resourcecmd/cobra.go index d19083e..b6cd52b 100644 --- a/internal/resourcecmd/cobra.go +++ b/internal/resourcecmd/cobra.go @@ -29,9 +29,74 @@ func NewResourceCommand(resource ResourceSpec, builder OperationBuilder) (*cobra command.AddCommand(actionCommand) } + for _, child := range resource.Children { + childCommand, err := NewResourceCommand(child, builder) + if err != nil { + return nil, err + } + command.AddCommand(childCommand) + } + return command, nil } +func AddShortcuts(root *cobra.Command, resource ResourceSpec, builder OperationBuilder) error { + for _, shortcut := range resource.Shortcuts { + operation, ok := resource.Operation(shortcut.Method) + if !ok { + return fmt.Errorf("resource command %q: shortcut method %q not found", resource.Plural, shortcut.Method) + } + + parent := root + for _, part := range shortcut.Path[:len(shortcut.Path)-1] { + found := findDirectCommand(parent, part) + if found == nil { + return fmt.Errorf("resource command %q: shortcut parent %q not found", resource.Plural, strings.Join(shortcut.Path, " ")) + } + parent = found + } + + shortcutOperation := operation + shortcutOperation.Name = OperationName(shortcut.Path[len(shortcut.Path)-1]) + shortcutOperation.Use = defaultOperationUse(shortcutOperation) + if shortcutOperation.Short == "" { + shortcutOperation.Short = operation.Short + } + + action, err := builder(resource, shortcutOperation) + if err != nil { + return fmt.Errorf("resource command %q: shortcut %q: %w", resource.Plural, strings.Join(shortcut.Path, " "), err) + } + parent.AddCommand(action) + } + + for _, child := range resource.Children { + if err := AddShortcuts(root, child, builder); err != nil { + return err + } + } + + return nil +} + +func CommandByName(parent *cobra.Command, name string) *cobra.Command { + return findDirectCommand(parent, name) +} + +func findDirectCommand(parent *cobra.Command, name string) *cobra.Command { + for _, command := range parent.Commands() { + if command.Name() == name { + return command + } + for _, alias := range command.Aliases { + if alias == name { + return command + } + } + } + return nil +} + func NewPlaceholderAction(resource ResourceSpec, operation OperationSpec) *cobra.Command { use := operation.Use if use == "" { diff --git a/internal/resourcecmd/plan_public.go b/internal/resourcecmd/plan_public.go deleted file mode 100644 index 0991e9e..0000000 --- a/internal/resourcecmd/plan_public.go +++ /dev/null @@ -1,5 +0,0 @@ -package resourcecmd - -func PublicResourcePlan() []ResourceGroup { - return PublicCatalog() -} diff --git a/internal/resourcecmd/resource.go b/internal/resourcecmd/resource.go index 8732035..816e7fc 100644 --- a/internal/resourcecmd/resource.go +++ b/internal/resourcecmd/resource.go @@ -39,6 +39,21 @@ func (r ResourceSpec) Validate() error { } } + for _, child := range r.Children { + if err := child.Validate(); err != nil { + return err + } + } + + for _, shortcut := range r.Shortcuts { + if len(shortcut.Path) == 0 { + return fmt.Errorf("resource command: shortcut on %q is missing a path", r.Plural) + } + if strings.TrimSpace(string(shortcut.Method)) == "" { + return fmt.Errorf("resource command: shortcut on %q is missing a method", r.Plural) + } + } + return nil } diff --git a/internal/resourcecmd/resourcecmd_test.go b/internal/resourcecmd/resourcecmd_test.go index 3d14613..4b9e56e 100644 --- a/internal/resourcecmd/resourcecmd_test.go +++ b/internal/resourcecmd/resourcecmd_test.go @@ -1,6 +1,10 @@ package resourcecmd -import "testing" +import ( + "testing" + + "github.com/spf13/cobra" +) func TestResourceSpecNames(t *testing.T) { t.Parallel() @@ -20,40 +24,81 @@ func TestResourceSpecNames(t *testing.T) { } } -func TestPublicResourcePlanContainsConfigs(t *testing.T) { +func TestNewResourceCommandNestsChildren(t *testing.T) { t.Parallel() - found := false - for _, group := range PublicResourcePlan() { - for _, resource := range group.Resources { - if resource.Plural == "configs" && resource.Singular == "config" && resource.PathPlural == "provider-configs" { - found = true - } - } + spec := ResourceSpec{ + Plural: "sessions", + Singular: "sessions", + Short: "Manage sessions", + Operations: []OperationSpec{ + {Name: OperationList, Method: "GET", Path: "/sessions", Short: "List sessions"}, + }, + Children: []ResourceSpec{ + { + Plural: "messages", + Singular: "messages", + Short: "Session messages", + Operations: []OperationSpec{ + {Name: OperationList, Method: "GET", Path: "/session-messages", Short: "List messages"}, + }, + }, + }, + } + + command, err := NewResourceCommand(spec, func(resource ResourceSpec, operation OperationSpec) (*cobra.Command, error) { + return NewPlaceholderAction(resource, operation), nil + }) + if err != nil { + t.Fatalf("NewResourceCommand() error = %v", err) } - if !found { - t.Fatalf("PublicResourcePlan() missing configs resource") + if findDirectCommand(command, "list") == nil { + t.Fatalf("missing list command") + } + if findDirectCommand(command, "messages") == nil { + t.Fatalf("missing nested messages command") } } -func TestProvidersResourceHasExplicitFlagMapping(t *testing.T) { +func TestAddShortcutsRegistersSiblingCommand(t *testing.T) { t.Parallel() - resource := ProvidersResource() - operation, ok := resource.Operation(OperationList) - if !ok { - t.Fatalf("ProvidersResource() missing list operation") + root := &cobra.Command{Use: "metorial-admin"} + spec := ResourceSpec{ + Plural: "integrations", + Singular: "integrations", + Short: "Integrations", + Children: []ResourceSpec{ + { + Plural: "setup-sessions", + Singular: "setup-sessions", + Short: "Setup sessions", + Operations: []OperationSpec{ + {Name: OperationCreate, Method: "POST", Path: "/integration-setup-sessions", Short: "Create setup session"}, + }, + Shortcuts: []ShortcutSpec{ + {Path: []string{"integrations", "setup"}, Method: OperationCreate}, + }, + }, + }, + } + + command, err := NewResourceCommand(spec, func(resource ResourceSpec, operation OperationSpec) (*cobra.Command, error) { + return NewPlaceholderAction(resource, operation), nil + }) + if err != nil { + t.Fatalf("NewResourceCommand() error = %v", err) } + root.AddCommand(command) - found := false - for _, flag := range operation.Flags { - if flag.Name == "id" && flag.Target == "params.Id" { - found = true - } + if err := AddShortcuts(root, spec, func(resource ResourceSpec, operation OperationSpec) (*cobra.Command, error) { + return NewPlaceholderAction(resource, operation), nil + }); err != nil { + t.Fatalf("AddShortcuts() error = %v", err) } - if !found { - t.Fatalf("ProvidersResource() list operation missing explicit id flag mapping") + if CommandByName(command, "setup") == nil { + t.Fatal("missing integrations setup shortcut") } } diff --git a/internal/resourcecmd/resources_catalog.go b/internal/resourcecmd/resources_catalog.go deleted file mode 100644 index edab72e..0000000 --- a/internal/resourcecmd/resources_catalog.go +++ /dev/null @@ -1,57 +0,0 @@ -package resourcecmd - -func InstanceResource() ResourceSpec { - return ResourceSpec{ - Plural: "instance", - Singular: "instance", - Short: "Read the current instance", - Operations: []OperationSpec{ - { - Name: OperationGet, - Short: "Get the current instance", - Long: "Get the instance selected for authenticated API requests.", - }, - }, - } -} - -func ProvidersResource() ResourceSpec { - return ResourceSpec{ - Plural: "providers", - Singular: "provider", - Short: "Browse providers", - Long: "Browse providers using provider listing search and render the underlying provider objects.", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List providers", - Long: "List providers using the searchable provider listings endpoint and render the nested provider objects.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search providers by name or description.", false)}, - Flags: append( - paginationFlags("providers"), - stringSliceFlag("id", "params.Id", "Filter by provider listing ID"), - stringSliceFlag("provider-category-id", "params.ProviderCategoryId", "Filter by provider category ID"), - stringSliceFlag("provider-collection-id", "params.ProviderCollectionId", "Filter by provider collection ID"), - stringSliceFlag("provider-group-id", "params.ProviderGroupId", "Filter by provider group ID"), - stringSliceFlag("publisher-id", "params.PublisherId", "Filter by publisher ID"), - boolFlag("is-owner", "params.IsOwner", "Filter by owner visibility"), - boolFlag("is-public", "params.IsPublic", "Filter by public listings"), - boolFlag("is-verified", "params.IsVerified", "Filter by verified listings"), - boolFlag("is-official", "params.IsOfficial", "Filter by official listings"), - boolFlag("is-metorial", "params.IsMetorial", "Filter by Metorial-maintained listings"), - ), - Examples: []string{ - "metorial providers list", - "metorial providers list github", - }, - }, - { - Name: OperationGet, - Short: "Get a provider", - Long: "Get a single provider by provider ID using provider listing lookup behind the scenes.", - Args: []ArgumentSpec{arg("provider-id", "", "Provider ID. Find one with `metorial providers list`.", true)}, - Examples: []string{"metorial providers get prv_123"}, - }, - }, - } -} diff --git a/internal/resourcecmd/resources_identity.go b/internal/resourcecmd/resources_identity.go deleted file mode 100644 index e05ae66..0000000 --- a/internal/resourcecmd/resources_identity.go +++ /dev/null @@ -1,211 +0,0 @@ -package resourcecmd - -func IdentitiesResource() ResourceSpec { - return ResourceSpec{ - Plural: "identities", - Singular: "identity", - Short: "Manage identities", - Long: "Create, inspect, update, and delete identities owned by actors.", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List identities", - Long: "List identities for the selected instance. When provided, the optional search argument filters by name or description.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search identities by name or description.", false)}, - Flags: append( - paginationFlags("identities"), - stringSliceFlag("status", "params.Status", "Filter by identity status"), - stringSliceFlag("id", "params.Id", "Filter by identity ID"), - stringSliceFlag("agent-id", "params.AgentId", "Filter by owner agent ID"), - stringSliceFlag("actor-id", "params.ActorId", "Filter by owner actor ID"), - ), - Examples: []string{ - "metorial identities list", - "metorial identities list github", - }, - }, - { - Name: OperationGet, - Short: "Get an identity", - Long: "Get a single identity by ID.", - Args: []ArgumentSpec{arg("identity-id", "", "Identity ID. Find one with `metorial identities list`.", true)}, - Examples: []string{ - "metorial identities get idn_123", - }, - }, - { - Name: OperationCreate, - Short: "Create an identity", - Long: "Create an identity owned by an existing actor.", - Args: []ArgumentSpec{ - arg("actor-id", "body.ActorId", "Identity actor that will own the identity. Find one with `metorial actors list`.", true), - arg("name", "body.Name", "Display name for the identity.", true), - }, - Flags: []FlagSpec{ - stringFlag("description", "body.Description", "Optional description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - Examples: []string{ - `metorial identities create act_123 "GitHub production"`, - `metorial identities create act_123 "GitHub production" --description "Used for deploys"`, - }, - SeeAlso: []string{"metorial actors list"}, - }, - { - Name: OperationUpdate, - Short: "Update an identity", - Long: "Update mutable fields on an identity.", - Args: []ArgumentSpec{arg("identity-id", "", "Identity ID. Find one with `metorial identities list`.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Updated display name", false), - stringFlag("description", "body.Description", "Updated description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - Examples: []string{ - `metorial identities update idn_123 --name "GitHub staging"`, - }, - }, - { - Name: OperationDelete, - Short: "Delete an identity", - Long: "Archive an identity by ID.", - Args: []ArgumentSpec{arg("identity-id", "", "Identity ID. Find one with `metorial identities list`.", true)}, - Examples: []string{"metorial identities delete idn_123"}, - }, - }, - } -} - -func ActorsResource() ResourceSpec { - return ResourceSpec{ - Plural: "actors", - Singular: "actor", - Short: "Manage identity actors", - Long: "Create and manage identity actors that own identities.", - PathPlural: "identity-actors", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List actors", - Long: "List identity actors for the selected instance. When provided, the optional search argument filters by name or description.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search actors by name or description.", false)}, - Flags: append( - paginationFlags("actors"), - stringSliceFlag("status", "params.Status", "Filter by actor status"), - stringSliceFlag("id", "params.Id", "Filter by actor ID"), - stringSliceFlag("agent-id", "params.AgentId", "Filter by linked agent ID"), - stringSliceFlag("consumer-id", "params.ConsumerId", "Filter by linked consumer ID"), - ), - Examples: []string{ - "metorial actors list", - "metorial actors list support", - }, - }, - { - Name: OperationGet, - Short: "Get an actor", - Long: "Get a single actor by ID.", - Args: []ArgumentSpec{arg("actor-id", "", "Actor ID. Find one with `metorial actors list`.", true)}, - Examples: []string{"metorial actors get act_123"}, - }, - { - Name: OperationCreate, - Short: "Create an actor", - Long: "Create a new identity actor.", - Args: []ArgumentSpec{ - arg("type", "body.Type", "Actor type. Accepted values are `person` or `agent`.", true), - arg("name", "body.Name", "Display name for the actor.", true), - }, - Flags: []FlagSpec{ - stringFlag("description", "body.Description", "Optional description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - Examples: []string{ - `metorial actors create person "Primary operator"`, - `metorial actors create agent "Support bot" --description "Owns support identities"`, - }, - }, - { - Name: OperationUpdate, - Short: "Update an actor", - Long: "Update mutable fields on an actor.", - Args: []ArgumentSpec{arg("actor-id", "", "Actor ID. Find one with `metorial actors list`.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Updated display name", false), - stringFlag("description", "body.Description", "Updated description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - }, - Examples: []string{"metorial actors update act_123 --description \"Updated description\""}, - }, - { - Name: OperationDelete, - Short: "Delete an actor", - Long: "Archive an actor by ID.", - Args: []ArgumentSpec{arg("actor-id", "", "Actor ID. Find one with `metorial actors list`.", true)}, - Examples: []string{"metorial actors delete act_123"}, - }, - }, - } -} - -func IdentityCredentialsResource() ResourceSpec { - return ResourceSpec{ - Plural: "identity-credentials", - Singular: "identity-credential", - Short: "Manage identity credentials", - Long: "Create and inspect credentials that connect identities to provider resources.", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List identity credentials", - Long: "List identity credentials for the selected instance.", - Flags: append(paginationFlags("identity credentials"), - stringSliceFlag("status", "params.Status", "Filter by credential status"), - stringSliceFlag("id", "params.Id", "Filter by identity credential ID"), - stringSliceFlag("agent-id", "params.AgentId", "Filter by owner agent ID"), - stringSliceFlag("actor-id", "params.ActorId", "Filter by owner actor ID"), - stringSliceFlag("identity-id", "params.IdentityId", "Filter by identity ID"), - stringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - stringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - stringSliceFlag("provider-config-id", "params.ProviderConfigId", "Filter by provider config ID"), - stringSliceFlag("provider-auth-config-id", "params.ProviderAuthConfigId", "Filter by provider auth config ID"), - ), - Examples: []string{"metorial identity-credentials list --identity-id idn_123"}, - }, - { - Name: OperationGet, - Short: "Get an identity credential", - Long: "Get a single identity credential by ID.", - Args: []ArgumentSpec{arg("identity-credential-id", "", "Identity credential ID. Find one with `metorial identity-credentials list`.", true)}, - Examples: []string{"metorial identity-credentials get icr_123"}, - }, - { - Name: OperationCreate, - Short: "Create an identity credential", - Long: "Create an identity credential attached to an existing identity.", - Args: []ArgumentSpec{arg("identity-id", "body.IdentityId", "Identity that will own the credential. Find one with `metorial identities list`.", true)}, - Flags: []FlagSpec{ - stringFlag("deployment-id", "body.DeploymentId", "Provider deployment to attach", false), - stringFlag("config-id", "body.ConfigId", "Provider config to attach", false), - stringFlag("auth-config-id", "body.AuthConfigId", "Provider auth config to attach", false), - stringFlag("delegation-config-id", "body.DelegationConfigId", "Delegation config to apply", false), - }, - Examples: []string{ - "metorial identity-credentials create idn_123 --deployment-id dep_123", - }, - SeeAlso: []string{"metorial identities list", "metorial deployments list", "metorial configs list", "metorial auth-configs list"}, - }, - { - Name: OperationDelete, - Short: "Delete an identity credential", - Long: "Archive an identity credential by ID.", - Args: []ArgumentSpec{arg("identity-credential-id", "", "Identity credential ID. Find one with `metorial identity-credentials list`.", true)}, - Examples: []string{"metorial identity-credentials delete icr_123"}, - }, - }, - } -} diff --git a/internal/resourcecmd/resources_provider.go b/internal/resourcecmd/resources_provider.go deleted file mode 100644 index f2c9a4b..0000000 --- a/internal/resourcecmd/resources_provider.go +++ /dev/null @@ -1,210 +0,0 @@ -package resourcecmd - -func DeploymentsResource() ResourceSpec { - return ResourceSpec{ - Plural: "deployments", - Singular: "deployment", - Short: "Manage provider deployments", - Long: "Create and manage provider deployments.", - PathPlural: "provider-deployments", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List deployments", - Long: "List deployments for the selected instance. When provided, the optional search argument filters by name or description.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search deployments by name or description.", false)}, - Flags: append( - paginationFlags("deployments"), - stringSliceFlag("id", "params.Id", "Filter by deployment ID"), - stringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - stringSliceFlag("provider-version-id", "params.ProviderVersionId", "Filter by provider version ID"), - stringSliceFlag("status", "params.Status", "Filter by deployment status"), - ), - Examples: []string{"metorial deployments list github"}, - }, - { - Name: OperationGet, - Short: "Get a deployment", - Long: "Get a single deployment by ID.", - Args: []ArgumentSpec{arg("deployment-id", "", "Deployment ID. Find one with `metorial deployments list`.", true)}, - Examples: []string{"metorial deployments get dep_123"}, - }, - { - Name: OperationCreate, - Short: "Create a deployment", - Long: "Create a deployment from an existing provider.", - Args: []ArgumentSpec{ - arg("provider-id", "body.ProviderId", "Provider to deploy. Find one with `metorial providers list`.", true), - arg("name", "body.Name", "Display name for the deployment.", true), - }, - Flags: []FlagSpec{ - stringFlag("description", "body.Description", "Optional description", false), - stringFlag("locked-provider-version-id", "body.LockedProviderVersionId", "Pinned provider version", false), - stringFlag("provider-config-id", "body.ProviderConfigId", "Existing provider config ID", false), - jsonFlag("provider-config", "body.ProviderConfig", "Inline JSON object for provider config"), - jsonFileFlag("provider-config-file", "body.ProviderConfig", "Read provider config JSON from a file"), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{ - `metorial deployments create prv_123 "Production deployment"`, - }, - SeeAlso: []string{"metorial providers list", "metorial configs list"}, - }, - { - Name: OperationUpdate, - Short: "Update a deployment", - Long: "Update mutable fields on a deployment.", - Args: []ArgumentSpec{arg("deployment-id", "", "Deployment ID. Find one with `metorial deployments list`.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Updated display name", false), - stringFlag("description", "body.Description", "Updated description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{"metorial deployments update dep_123 --description \"Updated description\""}, - }, - }, - } -} - -func ConfigsResource() ResourceSpec { - return ResourceSpec{ - Plural: "configs", - Singular: "config", - Short: "Manage provider configs", - Long: "Create and manage provider configuration objects.", - PathPlural: "provider-configs", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List configs", - Long: "List provider configs for the selected instance. When provided, the optional search argument filters by name or description.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search configs by name or description.", false)}, - Flags: append(paginationFlags("configs"), - stringSliceFlag("status", "params.Status", "Filter by config status"), - stringSliceFlag("id", "params.Id", "Filter by config ID"), - stringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - stringSliceFlag("provider-specification-id", "params.ProviderSpecificationId", "Filter by provider specification ID"), - stringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - stringSliceFlag("provider-config-vault-id", "params.ProviderConfigVaultId", "Filter by config vault ID"), - ), - Examples: []string{"metorial configs list"}, - }, - { - Name: OperationGet, - Short: "Get a config", - Long: "Get a single provider config by ID.", - Args: []ArgumentSpec{arg("config-id", "", "Config ID. Find one with `metorial configs list`.", true)}, - Examples: []string{"metorial configs get cfg_123"}, - }, - { - Name: OperationCreate, - Short: "Create a config", - Long: "Create a provider config for a provider, optionally tied to a deployment.", - Args: []ArgumentSpec{arg("provider-id", "body.ProviderId", "Provider ID. Find one with `metorial providers list`.", true)}, - Flags: []FlagSpec{ - stringFlag("provider-deployment-id", "body.ProviderDeploymentId", "Optional provider deployment ID", false), - stringFlag("name", "body.Name", "Optional display name", false), - stringFlag("description", "body.Description", "Optional description", false), - jsonFlag("value", "body.Value", "Inline JSON object for config values"), - jsonFileFlag("value-file", "body.Value", "Read config values JSON from a file"), - stringFlag("provider-config-vault-id", "body.ProviderConfigVaultId", "Config vault ID to use as a template", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{"metorial configs create prv_123 --value-file config.json"}, - SeeAlso: []string{"metorial providers list", "metorial deployments list"}, - }, - { - Name: OperationUpdate, - Short: "Update a config", - Long: "Update mutable fields on a provider config.", - Args: []ArgumentSpec{arg("config-id", "", "Config ID. Find one with `metorial configs list`.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Updated display name", false), - stringFlag("description", "body.Description", "Updated description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{"metorial configs update cfg_123 --description \"Updated description\""}, - }, - }, - } -} - -func AuthConfigsResource() ResourceSpec { - return ResourceSpec{ - Plural: "auth-configs", - Singular: "auth-config", - Short: "Manage provider auth configs", - Long: "Create and manage provider authentication configs.", - PathPlural: "provider-auth-configs", - Operations: []OperationSpec{ - { - Name: OperationList, - Short: "List auth configs", - Long: "List provider auth configs for the selected instance. When provided, the optional search argument filters by name or description.", - Args: []ArgumentSpec{arg("search", "params.Search", "Search auth configs by name or description.", false)}, - Flags: append(paginationFlags("auth configs"), - stringSliceFlag("status", "params.Status", "Filter by auth config status"), - stringSliceFlag("id", "params.Id", "Filter by auth config ID"), - stringSliceFlag("provider-id", "params.ProviderId", "Filter by provider ID"), - stringSliceFlag("provider-deployment-id", "params.ProviderDeploymentId", "Filter by provider deployment ID"), - stringSliceFlag("provider-auth-credentials-id", "params.ProviderAuthCredentialsId", "Filter by provider auth credentials ID"), - stringSliceFlag("provider-auth-method-id", "params.ProviderAuthMethodId", "Filter by provider auth method ID"), - ), - Examples: []string{"metorial auth-configs list github"}, - }, - { - Name: OperationGet, - Short: "Get an auth config", - Long: "Get a single provider auth config by ID.", - Args: []ArgumentSpec{arg("auth-config-id", "", "Auth config ID. Find one with `metorial auth-configs list`.", true)}, - Examples: []string{"metorial auth-configs get acf_123"}, - }, - { - Name: OperationCreate, - Short: "Create an auth config", - Long: "Create a provider auth config using a provider auth method and auth payload.", - Args: []ArgumentSpec{arg("provider-auth-method-id", "body.ProviderAuthMethodId", "Provider auth method ID.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Optional display name", false), - stringFlag("description", "body.Description", "Optional description", false), - stringFlag("provider-deployment-id", "body.ProviderDeploymentId", "Optional provider deployment ID", false), - jsonFlag("value", "body.Value", "Inline JSON object for auth config values"), - jsonFileFlag("value-file", "body.Value", "Read auth config values JSON from a file"), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{"metorial auth-configs create pam_123 --value-file auth.json"}, - SeeAlso: []string{"metorial deployments list"}, - }, - { - Name: OperationUpdate, - Short: "Update an auth config", - Long: "Update mutable fields on a provider auth config.", - Args: []ArgumentSpec{arg("auth-config-id", "", "Auth config ID. Find one with `metorial auth-configs list`.", true)}, - Flags: []FlagSpec{ - stringFlag("name", "body.Name", "Updated display name", false), - stringFlag("description", "body.Description", "Updated description", false), - jsonFlag("metadata", "body.Metadata", "Inline JSON object for metadata"), - jsonFileFlag("metadata-file", "body.Metadata", "Read metadata JSON from a file"), - jsonFlag("tool-filters", "body.ToolFilters", "Inline JSON value for tool filters"), - jsonFileFlag("tool-filters-file", "body.ToolFilters", "Read tool filters JSON from a file"), - }, - Examples: []string{"metorial auth-configs update acf_123 --description \"Updated description\""}, - }, - }, - } -} diff --git a/internal/resourcecmd/spec_builders.go b/internal/resourcecmd/spec_builders.go deleted file mode 100644 index 03c7966..0000000 --- a/internal/resourcecmd/spec_builders.go +++ /dev/null @@ -1,76 +0,0 @@ -package resourcecmd - -func arg(name, target, description string, required bool) ArgumentSpec { - return ArgumentSpec{ - Name: name, - Target: target, - Required: required, - Description: description, - } -} - -func stringFlag(name, target, usage string, required bool) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagString, - Target: target, - Usage: usage, - Required: required, - } -} - -func boolFlag(name, target, usage string) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagBool, - Target: target, - Usage: usage, - } -} - -func floatFlag(name, target, usage string) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagFloat, - Target: target, - Usage: usage, - } -} - -func stringSliceFlag(name, target, usage string) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagStringSlice, - Target: target, - Usage: usage, - Repeated: true, - } -} - -func jsonFlag(name, target, usage string) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagJSON, - Target: target, - Usage: usage, - } -} - -func jsonFileFlag(name, target, usage string) FlagSpec { - return FlagSpec{ - Name: name, - Type: FlagJSONFile, - Target: target, - Usage: usage, - } -} - -func paginationFlags(label string) []FlagSpec { - return []FlagSpec{ - floatFlag("limit", "params.Limit", "Limit the number of "+label), - stringFlag("after", "params.After", "Fetch "+label+" after this cursor", false), - stringFlag("before", "params.Before", "Fetch "+label+" before this cursor", false), - stringFlag("cursor", "params.Cursor", "Fetch "+label+" using an opaque cursor", false), - stringFlag("order", "params.Order", "Sort order", false), - } -} diff --git a/internal/resourcecmd/types.go b/internal/resourcecmd/types.go index acd9f39..6059a23 100644 --- a/internal/resourcecmd/types.go +++ b/internal/resourcecmd/types.go @@ -1,6 +1,5 @@ package resourcecmd -// OperationName describes the CLI verb exposed for a resource. type OperationName string const ( @@ -47,9 +46,10 @@ type FlagSpec struct { Shorthand string } -// OperationSpec describes a single subcommand under a resource command. type OperationSpec struct { Name OperationName + Method string + Path string Use string Short string Long string @@ -60,7 +60,11 @@ type OperationSpec struct { SDKMapping string } -// ResourceSpec describes one top-level resource command such as `providers`. +type ShortcutSpec struct { + Path []string + Method OperationName +} + type ResourceSpec struct { Plural string Singular string @@ -69,4 +73,6 @@ type ResourceSpec struct { PathPlural string Operations []OperationSpec Aliases []string + Children []ResourceSpec + Shortcuts []ShortcutSpec } diff --git a/manifest/admin.yaml b/manifest/admin.yaml new file mode 100644 index 0000000..23e0532 --- /dev/null +++ b/manifest/admin.yaml @@ -0,0 +1,368 @@ +apiVersion: mt_2026_01_01_magnetar +binary: metorial-admin + +globals: + skipPathParams: [instanceId, organizationId] + pagination: true + bodyEscapeHatches: true + pathStrategy: public + +exclude: + sdkPathPrefixes: [consumer., dashboard.] + resources: + - assistants + - conversations + - testHelperConsumerOAuth + +commands: + - path: [instance] + resource: instances + aliases: [instances] + + - path: [providers] + resource: providers + include: [list, get] + args: + list: + search: { flag: search } + auth_method: { flag: auth-method } + + - path: [providers, listings] + resource: providerListings + + - path: [providers, versions] + resource: providers.versions + + - path: [providers, specifications] + resource: providers.specifications + + - path: [providers, tools] + resource: providers.tools + + - path: [providers, triggers] + resource: providers.triggers + + - path: [providers, categories] + resource: providerCategories + + - path: [providers, collections] + resource: providerCollections + + - path: [providers, groups] + resource: providerGroups + + - path: [providers, publishers] + resource: publishers + + - path: [providers, auth-methods] + resource: providers.authMethods + + - path: [providers, deployments] + resource: providerDeployments + include: [list, get, create, update] + args: + create: + provider_id: { flag: provider-id, required: true } + name: { flag: name } + description: { flag: description } + provider_config: { flag: config, type: json } + + - path: [providers, configs] + resource: providerDeployments.configs + + - path: [providers, vaults] + resource: providerDeployments.configVaults + + - path: [providers, auth-configs] + resource: providerDeployments.authConfigs + + - path: [providers, credentials] + resource: providerDeployments.authCredentials + + - path: [providers, setup-sessions] + resource: providerDeployments.setupSessions + + - path: [custom-providers] + resource: customProviders + include: [list, get, create, update, archive] + + - path: [custom-providers, versions] + resource: customProviders.versions + + - path: [custom-providers, deployments] + resource: customProviders.deployments + + - path: [custom-providers, commits] + resource: customProviders.commits + + - path: [custom-providers, environments] + resource: customProviders.environments + + - path: [identity] + resource: identities + + - path: [identity, actors] + resource: identityActors + + - path: [identity, credentials] + resource: identities.credentials + + - path: [identity, agents] + resource: agents + include: [list, get] + + - path: [identity, delegations] + resource: identities.delegations + + - path: [identity, delegation-configs] + resource: identities.delegationConfigs + + - path: [identity, delegation-requests] + resource: identities.delegationRequests + + - path: [sessions] + resource: sessions + include: [list, get, create, update] + + - path: [sessions, messages] + resource: sessions.messages + args: + list: + session_id: { positional: true, name: session-id, target: query } + + - path: [sessions, participants] + resource: sessions.participants + + - path: [sessions, connections] + resource: sessions.connections + + - path: [sessions, events] + resource: sessions.events + + - path: [sessions, providers] + resource: sessions.providers + + - path: [sessions, errors] + resource: sessions.errors + + - path: [sessions, error-groups] + resource: sessions.errorGroups + + - path: [sessions, tool-calls] + resource: toolCalls + + - path: [sessions, runs] + resource: providerRuns + + - path: [sessions, templates] + resource: sessionTemplates + + - path: [sessions, templates, providers] + resource: sessionTemplates.providers + + - path: [magic-mcp] + group: true + short: Magic MCP + + - path: [magic-mcp, servers] + resource: magicMcpServers + args: + get: + magicMcpServerId: { positional: true, name: server-id } + tools: + magicMcpServerId: { positional: true, name: server-id } + update: + magicMcpServerId: { positional: true, name: server-id } + delete: + magicMcpServerId: { positional: true, name: server-id } + + - path: [magic-mcp, servers, providers] + resource: magicMcpServers.providers + args: + list: + magicMcpServerId: { positional: true, name: server-id } + + - path: [magic-mcp, groups] + resource: magicMcpGroups + + - path: [magic-mcp, endpoints] + resource: magicMcpEndpoints + + - path: [magic-mcp, tokens] + resource: magicMcpTokens + + - path: [magic-mcp, sessions] + resource: magicMcpSessions + + - path: [skills] + resource: skills + include: [list, get, create, update, delete] + + - path: [skills, versions] + resource: skills.versions + + - path: [skills, items] + resource: skills.items + + - path: [skills, agents] + resource: skills.agents + + - path: [skills, participants] + resource: skills.participants + + - path: [skills, groups] + resource: skills.groups + include: [list, get, create, update, delete] + + - path: [skills, configurations] + resource: skills.configurations + + - path: [skills, templates] + resource: skills.templates + + - path: [skills, imports] + resource: skills.imports + + - path: [skills, exports] + resource: skills.exports + + - path: [skills, merge-requests] + resource: skills.mergeRequests + + - path: [skills, plugins] + resource: skills.plugins + include: [list, get, create, update, archive] + + - path: [skills, marketplaces] + resource: skills.marketplaces + + - path: [files] + resource: files + include: [list, get, delete] + + - path: [files, links] + resource: files.links + + - path: [documents] + resource: documents + include: [list, get, create, update, delete] + + - path: [documents, versions] + resource: documents.versions + + - path: [stores] + resource: stores + include: [list, get, create, update, delete] + + - path: [stores, items] + resource: stores.items + + - path: [chat] + group: true + short: Chat + + - path: [chat, connections] + resource: chat.connections + + - path: [chat, instances] + resource: chat.instances + include: [list, get, create, update, delete] + + - path: [chat, workspaces] + resource: chat.workspaces + + - path: [chat, events] + resource: chat.events + + - path: [callbacks] + resource: callbacks + + - path: [callbacks, events] + resource: callbackEvents + + - path: [callbacks, instances] + resource: callbackInstances + + - path: [events] + resource: events + + - path: [events, destinations] + resource: event_destinations + + - path: [events, listeners] + resource: eventDestinationListeners + include: [list, get, create, delete] + + - path: [network] + resource: networks + + - path: [network, enclaves] + resource: enclaves + + - path: [network, firewalls] + resource: firewalls + + - path: [network, policies] + resource: networkPolicies + + - path: [monitoring] + group: true + short: Monitoring + + - path: [monitoring, monitors] + resource: monitors + + - path: [monitoring, alerts] + resource: monitorAlerts + + - path: [monitoring, protoguard] + resource: protoGuardAlerts + + - path: [portals] + resource: portals + include: [list, get, create, update] + + - path: [portals, groups] + resource: portals.consumerGroups + + - path: [portals, invites] + resource: portals.consumerInvites + + - path: [portals, access] + resource: portals.access + + - path: [consumers] + resource: consumers + include: [list, get, create, update] + + - path: [consumers, surfaces] + resource: consumerSurfaces + + - path: [integrations] + resource: integrations + include: [list, get, create, update] + + - path: [integrations, providers] + resource: integrations.providers + + - path: [integrations, instances] + resource: integrations.instances + + - path: [integrations, setup-sessions] + resource: integrations.setupSessions + shortcuts: + - path: [integrations, setup] + method: create + + - path: [api-keys] + resource: apiKeys + + - path: [outposts] + resource: outposts + include: [list, get, create, update, delete, enable, disable] + + - path: [outposts, access] + resource: outposts.access + + - path: [outposts, credentials] + resource: outposts.credentials diff --git a/npm/cli-admin/README.md b/npm/cli-admin/README.md new file mode 100644 index 0000000..166940a --- /dev/null +++ b/npm/cli-admin/README.md @@ -0,0 +1,13 @@ +# `@metorial/admin` + +npm wrapper for the Metorial Admin CLI (`metorial-admin`). + +Use this to manage Magnetar resources, send authenticated API requests, and clone official examples. + +```bash +npm install -g @metorial/admin +metorial-admin login +metorial-admin providers list +metorial-admin fetch /providers +metorial-admin example list +``` diff --git a/npm/cli-admin/package.json b/npm/cli-admin/package.json new file mode 100644 index 0000000..bcfd50d --- /dev/null +++ b/npm/cli-admin/package.json @@ -0,0 +1,23 @@ +{ + "name": "@metorial/admin", + "version": "0.0.0-dev", + "description": "npm wrapper for the Metorial Admin CLI", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "bin": { + "metorial-admin": "./dist/bin.cjs" + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsup --config tsup.config.ts" + }, + "dependencies": { + "@metorial/cli-core": "workspace:*" + } +} diff --git a/npm/cli-admin/src/bin.ts b/npm/cli-admin/src/bin.ts new file mode 100644 index 0000000..b68d03f --- /dev/null +++ b/npm/cli-admin/src/bin.ts @@ -0,0 +1,6 @@ +import { npmInstallEnvironment, runCLIAndExit } from '@metorial/cli-core'; + +void runCLIAndExit(process.argv.slice(2), { + env: npmInstallEnvironment('@metorial/admin'), + binary: 'metorial-admin' +}); diff --git a/npm/cli-admin/src/index.ts b/npm/cli-admin/src/index.ts new file mode 100644 index 0000000..781a6dd --- /dev/null +++ b/npm/cli-admin/src/index.ts @@ -0,0 +1,7 @@ +export { + npmInstallEnvironment, + replaceOutput, + resolveCLIPath, + runCLI, + runCLIAndExit +} from '@metorial/cli-core'; diff --git a/npm/cli-admin/tsconfig.json b/npm/cli-admin/tsconfig.json new file mode 100644 index 0000000..89a0d93 --- /dev/null +++ b/npm/cli-admin/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [ + "src/**/*.ts" + ] +} diff --git a/npm/cli-admin/tsup.config.ts b/npm/cli-admin/tsup.config.ts new file mode 100644 index 0000000..cd980b5 --- /dev/null +++ b/npm/cli-admin/tsup.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig([ + { + entry: ['src/index.ts'], + format: ['cjs'], + dts: true, + bundle: true, + clean: true, + target: 'node20', + outDir: 'dist' + }, + { + entry: ['src/bin.ts'], + format: ['cjs'], + bundle: true, + clean: false, + target: 'node20', + outDir: 'dist', + banner: { + js: '#!/usr/bin/env node' + }, + outExtension() { + return { + js: '.cjs' + }; + } + } +]); diff --git a/npm/cli-core/src/index.ts b/npm/cli-core/src/index.ts index b603604..bbc5bdc 100644 --- a/npm/cli-core/src/index.ts +++ b/npm/cli-core/src/index.ts @@ -22,6 +22,7 @@ export type RunCLIOptions = { cwd?: string; env?: NodeJS.ProcessEnv; version?: string; + binary?: string; stdoutTransform?: OutputTransform; stderrTransform?: OutputTransform; }; @@ -33,12 +34,12 @@ type PlatformSpec = { let DEFAULT_BASE_URL = 'https://cli.metorial.com'; -export async function resolveCLIPath(version?: string) { +export async function resolveCLIPath(version?: string, binary = 'metorial') { let tag = normalizeVersion( version || process.env.METORIAL_CLI_VERSION || packageJson.version ); - let spec = getPlatformSpec(tag); - let installDir = path.join(getCacheRoot(), 'versions', tag); + let spec = getPlatformSpec(tag, binary); + let installDir = path.join(getCacheRoot(), 'versions', tag, spec.binaryName.replace(/\.exe$/, '')); let binaryPath = path.join(installDir, spec.binaryName); if (await exists(binaryPath)) { @@ -50,7 +51,7 @@ export async function resolveCLIPath(version?: string) { } export async function runCLI(args: string[], options: RunCLIOptions = {}) { - let binaryPath = await resolveCLIPath(options.version); + let binaryPath = await resolveCLIPath(options.version, options.binary || 'metorial'); if (!options.stdoutTransform && !options.stderrTransform) { return await spawnWithInheritedOutput(binaryPath, args, options); @@ -225,14 +226,14 @@ function getCacheRoot() { return path.join(os.homedir(), '.metorial', 'cli-npm'); } -function getPlatformSpec(tag: string): PlatformSpec { +function getPlatformSpec(tag: string, binary = 'metorial'): PlatformSpec { let goos = resolveGoOS(); let goarch = resolveGoArch(); let extension = goos === 'windows' ? 'zip' : 'tar.gz'; - let binaryName = goos === 'windows' ? 'metorial.exe' : 'metorial'; + let binaryName = goos === 'windows' ? `${binary}.exe` : binary; return { - archiveName: `metorial_${tag.replace(/^v/, '')}_${goos}_${goarch}.${extension}`, + archiveName: `${binary}_${tag.replace(/^v/, '')}_${goos}_${goarch}.${extension}`, binaryName }; } diff --git a/npm/cli/README.md b/npm/cli/README.md index 1a98c4d..51f131d 100644 --- a/npm/cli/README.md +++ b/npm/cli/README.md @@ -1,49 +1,15 @@ # `@metorial/cli` -The official npm package for the Metorial CLI. +The official npm package for the Metorial consumer CLI (`metorial`). -Metorial helps you deploy and manage providers for AI applications. This package gives you the `metorial` command through npm so you can inspect providers, deployments, sessions, integrations, and related resources directly from your terminal. - -## Install - -Install globally: +Use it to discover integrations and call MCP tools from your terminal. ```bash npm install -g @metorial/cli -``` - -Or run without installing: - -```bash -npx @metorial/cli@latest -``` - -## What You Can Do - -Use the CLI to: - -- inspect providers and deployments -- review sessions and integrations -- send authenticated API requests -- start from official examples - -## Common Commands - -```bash metorial login -metorial providers list -metorial deployments list -metorial sessions list metorial integrations list -metorial example list +metorial integrations catalog list metorial open ``` -## Help - -```bash -metorial --help -metorial --help -``` - -If you want to start from an example project, use `npm create metorial@latest` to browse examples or `npm create metorial@latest ` to create one directly. +For Magnetar resource administration, raw API requests, and examples, install [`@metorial/admin`](https://www.npmjs.com/package/@metorial/admin). diff --git a/npm/create/src/bin.ts b/npm/create/src/bin.ts index 560174c..9e0be97 100644 --- a/npm/create/src/bin.ts +++ b/npm/create/src/bin.ts @@ -2,10 +2,11 @@ import { npmInstallEnvironment, replaceOutput, runCLIAndExit } from '@metorial/c let args = process.argv.slice(2); let cliArgs = args.length === 0 ? ['example', 'list'] : ['example', 'create', ...args]; -let transform = replaceOutput('metorial example create', 'npm create'); +let transform = replaceOutput('metorial-admin example create', 'npm create'); void runCLIAndExit(cliArgs, { env: npmInstallEnvironment('create-metorial'), + binary: 'metorial-admin', stdoutTransform: transform, stderrTransform: transform }); diff --git a/package.json b/package.json index e4da030..97a4a7b 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "npm/*" ], "scripts": { - "build:npm": "bun run --cwd npm/cli-core build && bun run --cwd npm/cli build && bun run --cwd npm/create build && bun run --cwd npm/call-tool build", + "build:npm": "bun run --cwd npm/cli-core build && bun run --cwd npm/cli build && bun run --cwd npm/cli-admin build && bun run --cwd npm/create build && bun run --cwd npm/call-tool build", "build:browser-shell": "bun ./scripts/build-browser-shell.ts", "set-npm-version": "bun ./scripts/set-npm-version.ts", "publish:npm": "bun ./scripts/publish-npm.ts" diff --git a/scripts/publish-npm.ts b/scripts/publish-npm.ts index 77a1a4c..9496c7d 100644 --- a/scripts/publish-npm.ts +++ b/scripts/publish-npm.ts @@ -8,7 +8,7 @@ let currentFile = fileURLToPath(import.meta.url); let scriptsDir = path.dirname(currentFile); let rootDir = path.resolve(scriptsDir, '..'); -let publishOrder = ['npm/cli-core', 'npm/cli', 'npm/create', 'npm/call-tool']; +let publishOrder = ['npm/cli-core', 'npm/cli', 'npm/cli-admin', 'npm/create', 'npm/call-tool']; for (let packagePath of publishOrder) { execFileSync( diff --git a/templates/cli.md b/templates/cli.md index b7ef04a..c521911 100644 --- a/templates/cli.md +++ b/templates/cli.md @@ -1,49 +1,37 @@ # Metorial CLI -Metorial CLI is the simplest way to work with Metorial from your terminal. +Metorial ships two CLIs: -It helps you: - -- sign in to your Metorial account -- inspect providers, deployments, sessions, and other resources -- browse and manage integrations -- send authenticated API requests -- start from official example projects - -If you are new to Metorial, the core idea is simple: Metorial helps you deploy and manage providers for AI applications. The CLI gives you a direct way to explore those providers, inspect your deployments, and work with runtime sessions from the command line. +- `metorial` — integrations and MCP tool calling +- `metorial-admin` — Magnetar resource admin, `fetch`, and examples ## Install -Pick the option that matches your setup. - ### macOS or Linux -Use the standalone installer: - ```bash curl -fsSL https://cli.metorial.com/install.sh | bash ``` ### npm -Use npm if you already work in Node.js: - ```bash npm install -g @metorial/cli +npm install -g @metorial/admin ``` ### npx -Use npx if you want to run the CLI without installing it globally: - ```bash npx @metorial/cli@latest +npx @metorial/admin@latest ``` ### Homebrew ```bash brew install metorial/tap/metorial +brew install metorial/tap/metorial-admin ``` ### Scoop @@ -51,122 +39,31 @@ brew install metorial/tap/metorial ```powershell scoop bucket add metorial https://github.com/metorial/scoop-bucket scoop install metorial +scoop install metorial-admin ``` -## Which Install Option Should I Pick? - -- Use the installer for a simple standalone install on macOS or Linux. -- Use `npm` if you want a normal global install in a Node.js environment. -- Use `npx` if you only need the CLI occasionally. -- Use `brew`, `choco`, or `scoop` if that is already how you manage tools. - -## Understand The Basics - -You do not need to memorize the full Metorial model to get started, but these terms help: - -- A provider is an integration such as Slack, GitHub, Exa, or another tool source. -- A deployment is the configured instance of that provider that your app can use. -- A session is the runtime layer that gives your AI access to tools from one or more attached providers. -- An organization, project, and instance help you separate work and environments such as development and production. - -## First Steps - -Sign in first: - -```bash -metorial login -``` - -Then inspect what is available in your account: - -```bash -metorial providers list -metorial deployments list -metorial sessions list -metorial integrations list -``` - -If you want the dashboard too: - -```bash -metorial open -``` - -## Core Commands - -### Sign In +## First steps ```bash metorial login -``` - -Starts the browser-based sign-in flow and makes that profile active on your machine. - -### Browse Resources - -```bash -metorial providers list -metorial deployments list -metorial sessions list -metorial instance list -``` - -These commands help you understand your current setup, especially when you are checking what providers and deployments are available in a given environment. - -### Work With Integrations - -```bash metorial integrations list metorial integrations catalog list -metorial integrations tools -``` - -Use these commands to inspect connected integrations, browse the catalog, and see the tools an integration exposes. - -### Start From An Example - -```bash -metorial example list -metorial example create ``` -You can also do this through npm: +Admin resources: ```bash -npm create metorial@latest -npm create metorial@latest [path] +metorial-admin providers list +metorial-admin sessions list +metorial-admin fetch /providers +metorial-admin example list ``` -### Open Metorial In Your Browser - -```bash -metorial open -``` - -### Send An Authenticated API Request - -```bash -metorial fetch -``` - -Useful when you want a direct API response from the same authenticated context you are already using in the CLI. - -### Check Your Version - -```bash -metorial version -``` - -## Need More? +## Help ```bash metorial --help -metorial --help +metorial-admin --help ``` -Docs: - -- [Metorial docs](https://metorial.com/docs) -- [Providers](https://metorial.com/docs/concepts-providers.md) -- [Server deployments](https://metorial.com/docs/concepts-server-deployments.md) -- [Sessions](https://metorial.com/docs/concepts-sessions.md) +Docs: [metorial.com/docs](https://metorial.com/docs) diff --git a/templates/install.sh b/templates/install.sh index 4f49cb8..66e3a8a 100755 --- a/templates/install.sh +++ b/templates/install.sh @@ -129,7 +129,7 @@ resolve_install_dir() { } resolve_managed_bin_path() { - printf '%s/.metorial/cli/metorial' "$HOME" + printf '%s/.metorial/cli/%s' "$HOME" "$1" } json_escape() { @@ -240,36 +240,54 @@ main() { [ -n "$version" ] || fail 'Unable to resolve the latest CLI version' normalized_version="${version#v}" - archive_name="metorial_${normalized_version}_${os}_${arch}.tar.gz" release_base="${RELEASE_ROOT}/${version}" - archive_path="${TMP_DIR}/${archive_name}" checksum_path="${TMP_DIR}/checksums.txt" - extract_dir="${TMP_DIR}/extract" install_dir='' install_dir="$(resolve_install_dir)" managed_bin_path='' - managed_bin_path="$(resolve_managed_bin_path)" + managed_bin_path="$(resolve_managed_bin_path metorial)" symlink_path="${install_dir}/metorial" + admin_managed_bin_path='' + admin_managed_bin_path="$(resolve_managed_bin_path metorial-admin)" + admin_symlink_path="${install_dir}/metorial-admin" start_spinner "Downloading version ${version}" - curl -fsSL "${release_base}/${archive_name}" -o "$archive_path" curl -fsSL "${release_base}/checksums.txt" -o "$checksum_path" - - verify_checksum "$checksum_path" "$archive_name" "$archive_path" - extract_archive "$archive_path" "$extract_dir" - - mkdir -p "$(dirname "$managed_bin_path")" - mkdir -p "$install_dir" - install "$extract_dir/metorial" "$managed_bin_path" - ln -sfn "$managed_bin_path" "$symlink_path" + install_release_binary metorial "$normalized_version" "$os" "$arch" "$release_base" "$checksum_path" "$managed_bin_path" "$symlink_path" + install_release_binary metorial-admin "$normalized_version" "$os" "$arch" "$release_base" "$checksum_path" "$admin_managed_bin_path" "$admin_symlink_path" write_install_metadata "$install_dir" "$symlink_path" "$managed_bin_path" stop_spinner printf '\rSuccessfully installed \033[1;34mMetorial CLI\033[0m (%s)\n' "$version" - printf "Get started by running 'metorial'\n" + printf "Get started by running 'metorial' or 'metorial-admin'\n" info "Managed binary: ${managed_bin_path}" info "Command symlink: ${symlink_path}" + info "Admin binary: ${admin_managed_bin_path}" + info "Admin symlink: ${admin_symlink_path}" ensure_path_in_shell_rc "$install_dir" } +install_release_binary() { + binary_name="$1" + normalized_version="$2" + os="$3" + arch="$4" + release_base="$5" + checksum_path="$6" + managed_bin_path="$7" + symlink_path="$8" + archive_name="${binary_name}_${normalized_version}_${os}_${arch}.tar.gz" + archive_path="${TMP_DIR}/${archive_name}" + extract_dir="${TMP_DIR}/extract-${binary_name}" + + curl -fsSL "${release_base}/${archive_name}" -o "$archive_path" + verify_checksum "$checksum_path" "$archive_name" "$archive_path" + extract_archive "$archive_path" "$extract_dir" + + mkdir -p "$(dirname "$managed_bin_path")" + mkdir -p "$(dirname "$symlink_path")" + install "${extract_dir}/${binary_name}" "$managed_bin_path" + ln -sfn "$managed_bin_path" "$symlink_path" +} + main "$@"