@tpmjs/cli 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent/chat.js +68 -2
- package/dist/commands/agent/chat.js.map +1 -1
- package/dist/commands/agent/create.js +68 -2
- package/dist/commands/agent/create.js.map +1 -1
- package/dist/commands/agent/delete.js +68 -2
- package/dist/commands/agent/delete.js.map +1 -1
- package/dist/commands/agent/list.js +68 -2
- package/dist/commands/agent/list.js.map +1 -1
- package/dist/commands/agent/update.js +68 -2
- package/dist/commands/agent/update.js.map +1 -1
- package/dist/commands/auth/login.js +99 -17
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +16 -0
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/status.js +68 -2
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/auth/whoami.js +68 -2
- package/dist/commands/auth/whoami.js.map +1 -1
- package/dist/commands/collection/add.js +68 -2
- package/dist/commands/collection/add.js.map +1 -1
- package/dist/commands/collection/create.js +68 -2
- package/dist/commands/collection/create.js.map +1 -1
- package/dist/commands/collection/delete.js +68 -2
- package/dist/commands/collection/delete.js.map +1 -1
- package/dist/commands/collection/import.js +68 -2
- package/dist/commands/collection/import.js.map +1 -1
- package/dist/commands/collection/list.js +68 -2
- package/dist/commands/collection/list.js.map +1 -1
- package/dist/commands/collection/remove.js +68 -2
- package/dist/commands/collection/remove.js.map +1 -1
- package/dist/commands/collection/update.js +68 -2
- package/dist/commands/collection/update.js.map +1 -1
- package/dist/commands/doctor.js +68 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp/config.js +16 -0
- package/dist/commands/mcp/config.js.map +1 -1
- package/dist/commands/mcp/serve.js +68 -2
- package/dist/commands/mcp/serve.js.map +1 -1
- package/dist/commands/playground.js +68 -2
- package/dist/commands/playground.js.map +1 -1
- package/dist/commands/publish/check.js +68 -2
- package/dist/commands/publish/check.js.map +1 -1
- package/dist/commands/publish/preview.js +16 -0
- package/dist/commands/publish/preview.js.map +1 -1
- package/dist/commands/scenario/generate.d.ts +19 -0
- package/dist/commands/scenario/generate.js +633 -0
- package/dist/commands/scenario/generate.js.map +1 -0
- package/dist/commands/scenario/info.d.ts +18 -0
- package/dist/commands/scenario/info.js +636 -0
- package/dist/commands/scenario/info.js.map +1 -0
- package/dist/commands/scenario/list.d.ts +20 -0
- package/dist/commands/scenario/list.js +652 -0
- package/dist/commands/scenario/list.js.map +1 -0
- package/dist/commands/scenario/run.d.ts +18 -0
- package/dist/commands/scenario/run.js +663 -0
- package/dist/commands/scenario/run.js.map +1 -0
- package/dist/commands/scenario/test.d.ts +17 -0
- package/dist/commands/scenario/test.js +620 -0
- package/dist/commands/scenario/test.js.map +1 -0
- package/dist/commands/tool/execute.js +68 -2
- package/dist/commands/tool/execute.js.map +1 -1
- package/dist/commands/tool/info.js +68 -2
- package/dist/commands/tool/info.js.map +1 -1
- package/dist/commands/tool/init.js +16 -0
- package/dist/commands/tool/init.js.map +1 -1
- package/dist/commands/tool/search.js +68 -2
- package/dist/commands/tool/search.js.map +1 -1
- package/dist/commands/tool/trending.js +68 -2
- package/dist/commands/tool/trending.js.map +1 -1
- package/dist/commands/tool/validate.js +68 -2
- package/dist/commands/tool/validate.js.map +1 -1
- package/dist/commands/update.js +16 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/index.d.ts +80 -0
- package/dist/index.js +68 -2
- package/dist/index.js.map +1 -1
- package/oclif.manifest.json +290 -1
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/agent/update.ts"],"names":[],"mappings":"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","file":"update.js","sourcesContent":["import Conf from 'conf';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(\n key: K,\n value: TpmConfig[K]\n): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = await response.json() as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(`/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`);\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find(t => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(field: unknown): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(key + ':')} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = ' '.repeat(indent) + '•';\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim('```' + (language ?? '')));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import { Args, Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class AgentUpdate extends Command {\n static description = 'Update an agent';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> my-agent --name \"New Name\"',\n '<%= config.bin %> <%= command.id %> my-agent --temperature 0.5 --public false',\n ];\n\n static flags = {\n name: Flags.string({\n char: 'n',\n description: 'Agent name',\n }),\n uid: Flags.string({\n description: 'Unique identifier (URL-friendly)',\n }),\n description: Flags.string({\n char: 'd',\n description: 'Agent description',\n }),\n provider: Flags.string({\n char: 'p',\n description: 'AI provider',\n options: ['ANTHROPIC', 'OPENAI', 'GOOGLE', 'GROQ', 'MISTRAL'],\n }),\n model: Flags.string({\n char: 'm',\n description: 'Model ID',\n }),\n 'system-prompt': Flags.string({\n char: 's',\n description: 'System prompt',\n }),\n temperature: Flags.string({\n char: 't',\n description: 'Temperature (0-2)',\n }),\n public: Flags.boolean({\n description: 'Make agent public',\n allowNo: true,\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n static args = {\n id: Args.string({\n description: 'Agent ID or UID',\n required: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(AgentUpdate);\n const output = createOutput(flags);\n const client = getClient();\n\n if (!client.isAuthenticated()) {\n output.error('Not authenticated. Run `tpm auth login` first.');\n return;\n }\n\n // Build update payload\n const updates: Record<string, unknown> = {};\n if (flags.name) updates.name = flags.name;\n if (flags.uid) updates.uid = flags.uid;\n if (flags.description !== undefined) updates.description = flags.description;\n if (flags.provider) updates.provider = flags.provider;\n if (flags.model) updates.modelId = flags.model;\n if (flags['system-prompt'] !== undefined) updates.systemPrompt = flags['system-prompt'];\n if (flags.temperature) updates.temperature = parseFloat(flags.temperature);\n if (flags.public !== undefined) updates.isPublic = flags.public;\n\n if (Object.keys(updates).length === 0) {\n output.error('No updates specified. Use --help to see available options.');\n return;\n }\n\n const spinner = output.spinner('Updating agent...');\n\n try {\n const response = await client.updateAgent(args.id, updates);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n output.error(response.message || 'Failed to update agent');\n return;\n }\n\n if (flags.json) {\n output.json(response.data);\n return;\n }\n\n output.success(`Agent \"${response.data.name}\" updated successfully`);\n } catch (error) {\n spinner.fail('Failed to update agent');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/agent/update.ts"],"names":[],"mappings":";;;;;;;;;;AAmBA,IAAM,UAAA,GAAkB,IAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,EAAQ,EAAG,QAAQ,CAAA;AACnD,IAAM,gBAAA,GAAwB,IAAA,CAAA,IAAA,CAAK,UAAA,EAAY,kBAAkB,CAAA;AACxC,IAAA,CAAA,IAAA,CAAK,UAAA,EAAY,SAAS;AAGnD,SAAS,eAAA,GAAwB;AAC/B,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,IAAG,aAAU,UAAA,EAAY,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,EAC3D;AACF;AAGA,IAAM,WAAA,GAAc,IAAI,IAAA,CAAgB;AAAA,EACtC,WAAA,EAAa,OAAA;AAAA,EACb,GAAA,EAAK,UAAA;AAAA,EACL,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ,uBAAA;AAAA,IACR,aAAA,EAAe,OAAA;AAAA,IACf,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW;AAAA;AAEf,CAAC,CAAA;AAcM,SAAS,eAA0C,GAAA,EAAsB;AAC9E,EAAA,OAAO,WAAA,CAAY,IAAI,GAAG,CAAA;AAC5B;AAcO,SAAS,eAAA,GAAyC;AACvD,EAAA,eAAA,EAAgB;AAEhB,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAa,EAAA,CAAA,YAAA,CAAa,gBAAA,EAAkB,OAAO,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAqBO,SAAS,SAAA,GAAgC;AAE9C,EAAA,IAAI,OAAA,CAAQ,IAAI,aAAA,EAAe;AAC7B,IAAA,OAAO,QAAQ,GAAA,CAAI,aAAA;AAAA,EACrB;AAGA,EAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,cAAA,CAAe,QAAQ,CAAA,IAAK,uBAAA;AAClE;;;AC8GO,IAAM,YAAN,MAAgB;AAAA,EACb,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,SAAA,EAAU;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,SAAA,EAAU;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAAA,EACpC;AAAA,EAEA,MAAc,OAAA,CAAW,QAAA,EAAkB,OAAA,GAAuB,EAAC,EAAe;AAChF,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,QAAQ,CAAA,CAAA;AACtC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,OAAA,CAAQ;AAAA,KACd;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,OAAA;AAAA,QACH,OAAA;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,KAAK,OAAA,IAAW,IAAA,CAAK,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,UACrD,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,GAAyD;AAC7D,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,QAAA,GAAwC;AAC5C,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAqC;AACnF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,QAAQ,KAAK,CAAA;AAChD,IAAA,IAAI,QAAQ,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC7D,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA,GAAK,QAAA;AAEzD,IAAA,OAAO,IAAA,CAAK,QAAiC,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,OAAA,CAAQ,WAAA,EAAqB,QAAA,EAA8C;AAC/E,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,UAAU,kBAAA,CAAmB,WAAW,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,KAC3E;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,IAAA,EAA0C;AAE5D,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,CAAA;AACrE,IAAA,IAAI,YAAA,CAAa,IAAA,IAAQ,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAClF,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA,IACrC;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACnD;AAAA,EAEA,MAAM,gBAAA,CAAiB,OAAA,GAA6B,EAAC,EAAqC;AACxF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAA,GAAK,iBAAA;AAElE,IAAA,OAAO,IAAA,CAAK,QAAiC,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,mBACJ,KAAA,EACmF;AACnF,IAAA,OAAO,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAAA,MACrC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAc,MAAA,EAAmD;AACjF,IAAA,OAAO,KAAK,OAAA,CAAQ,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,MAChE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,iBAAA,CACL,IAAA,EACA,MAAA,EACgD;AAChD,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,QAAA,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KACjD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,SAAS,SAAA,IAAa,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,QAAA,CAAS,kBAAA,EAAoB,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAG;AAC/B,UAAA;AAAA,QACF;AAEA,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,YAAA,IAAI,SAAS,QAAA,EAAU;AACrB,cAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAG;AAC/B,cAAA;AAAA,YACF;AACA,YAAA,IAAI;AACF,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,cAAA,MAAM,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,IAAQ,IAAA,EAAK;AAAA,YACnF,CAAA,CAAA,MAAQ;AACN,cAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAsC;AACnF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA,GAAK,SAAA;AAE1D,IAAA,OAAO,IAAA,CAAK,QAAkC,QAAQ,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,SAAS,EAAA,EAAyC;AACtD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,QAAA,EAAW,EAAE,CAAA,CAAE,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,YAAY,KAAA,EAAsD;AACtE,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAA,EAAW;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,EAAA,EAAY,KAAA,EAAsD;AAClF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,QAAA,EAAW,EAAE,CAAA,CAAA,EAAI;AAAA,MACnC,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,EAAA,EAAwC;AACxD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,QAAA,EAAW,EAAE,CAAA,CAAA,EAAI;AAAA,MACnC,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAA,CAAgB,OAAA,GAA6B,EAAC,EAA2C;AAC7F,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,GAAK,cAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,QAAuC,QAAQ,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,cAAc,EAAA,EAA8C;AAChE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAgE;AACrF,IAAA,OAAO,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAAA,MAClC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAA,CACJ,EAAA,EACA,KAAA,EACkC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI;AAAA,MACxC,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,EAAA,EAAwC;AAC7D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI;AAAA,MACxC,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,oBAAA,CAAqB,EAAA,EAAY,OAAA,EAA+C;AAEpF,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,QACvD,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,wBAAA,CAAyB,EAAA,EAAY,MAAA,EAA4C;AACrF,IAAA,OAAO,KAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,MACxD,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,GAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAe,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,GAA8C;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAsB,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,aAAA,CAAc,OAAA,GAA+B,EAAC,EAAyC;AAC3F,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC/D,IAAA,IAAI,QAAQ,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,QAAQ,YAAY,CAAA;AACzE,IAAA,IAAI,QAAQ,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AACjD,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAEvD,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA,GAAK,YAAA;AAE7D,IAAA,OAAO,IAAA,CAAK,QAAqC,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,uBAAA,CACJ,YAAA,EACA,OAAA,GAA6B,EAAC,EACmB;AACjD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,cACb,CAAA,aAAA,EAAgB,YAAY,cAAc,WAAW,CAAA,CAAA,GACrD,gBAAgB,YAAY,CAAA,UAAA,CAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,QAAgD,QAAQ,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,YAAY,EAAA,EAA4C;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA4D;AAC/E,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAc;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,iBAAA,CACJ,YAAA,EACA,KAAA,GAAgC,EAAC,EACoD;AACrF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,YAAY,CAAA,mBAAA,CAAA,EAAuB;AAAA,MACrE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,UAAA,EAAuD;AACvE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,WAAA,EAAc,UAAU,CAAA,IAAA,CAAA,EAAQ;AAAA,MAClD,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,OAAA,GAA6B,EAAC,EACW;AACzC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE/D,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,cACb,CAAA,WAAA,EAAc,UAAU,SAAS,WAAW,CAAA,CAAA,GAC5C,cAAc,UAAU,CAAA,KAAA,CAAA;AAE5B,IAAA,OAAO,IAAA,CAAK,QAAwC,QAAQ,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,eAAA,GAA2B;AACzB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AACF,CAAA;AAGO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACE,OAAA,EACO,UAAA,EACA,IAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AACF,CAAA;AAGA,IAAI,cAAA,GAAmC,IAAA;AAEhC,SAAS,UAAU,OAAA,EAAuC;AAC/D,EAAA,IAAI,CAAC,kBAAkB,OAAA,EAAS;AAC9B,IAAA,cAAA,GAAiB,IAAI,UAAU,OAAO,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,cAAA;AACT;AC5lBO,IAAM,kBAAN,MAAsB;AAAA,EACnB,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,KAAK,IAAA,EAAqB;AACxB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,KAAA,CACE,MACA,OAAA,EACM;AACN,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,MACtB,IAAA,EAAM,QAAQ,GAAA,CAAI,CAAC,QAAQ,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MAC9C,WAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,MACjD,KAAA,EAAO;AAAA,QACL,MAAM,EAAC;AAAA,QACP,QAAQ;AAAC;AACX,KACD,CAAA;AAED,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,OAAA,EAAwB;AAC7C,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA;AACrC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAClC,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AACnC,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,MAAM,OAAA,EAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,OAAA,CAAQ,IAAI,EAAA,CAAG,GAAA,CAAI,CAAA,QAAA,EAAW,OAAO,EAAE,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrB;AAAA;AAAA,EAGA,QAAQ,IAAA,EAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAA,CAAQ,IAAI,EAAA,CAAG,IAAA,CAAK,GAAG,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAAA;AAAA,EAGA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,QAAA,CAAS,KAAa,KAAA,EAAoD;AACxE,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,GAAA,CAAI,GAAA,GAAM,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,IAAS,EAAA,CAAG,GAAA,CAAI,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,QAAA,CAAS,IAAA,EAAc,MAAA,GAAS,CAAA,EAAS;AACvC,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,QAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAsB;AAC5B,IAAA,OAAO,GAAA,CAAI;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,KACxB,EAAE,KAAA,EAAM;AAAA,EACX;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd;AAAA;AAAA,EAGA,EAAA,GAAW;AACT,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,EAAA,CAAG,GAAA,CAAI,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,EAAA,EAAG;AAAA,EACV;AAAA;AAAA,EAGA,IAAA,CAAK,MAAc,QAAA,EAAyB;AAC1C,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAA,CAAG,GAAA,CAAI,KAAA,IAAS,QAAA,IAAY,GAAG,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,UAAU,IAAA,EAAsB;AAC9B,IAAA,OAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACrB;AAAA;AAAA,EAGA,IAAI,IAAA,EAAsB;AACxB,IAAA,OAAO,EAAA,CAAG,IAAI,IAAI,CAAA;AAAA,EACpB;AAAA;AAAA,EAGA,KAAK,IAAA,EAAsB;AACzB,IAAA,OAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACrB;AAAA;AAAA,EAGA,IAAA,CAAK,MAAc,GAAA,EAAqB;AAEtC,IAAA,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,IAAA,EAAO,EAAA,CAAG,UAAU,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA,YAAA,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,IAAA,EAAsB;AAC1B,IAAA,OAAO,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,IAAI,IAAA,EAAsB;AACxB,IAAA,OAAO,EAAA,CAAG,IAAI,IAAI,CAAA;AAAA,EACpB;AAAA,EAEA,OAAO,IAAA,EAAsB;AAC3B,IAAA,OAAO,EAAA,CAAG,OAAO,IAAI,CAAA;AAAA,EACvB;AAAA,EAEA,KAAK,IAAA,EAAsB;AACzB,IAAA,OAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACrB;AAAA,EAEA,KAAK,IAAA,EAAsB;AACzB,IAAA,OAAO,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACrB;AACF,CAAA;AAGO,SAAS,aAAa,KAAA,EAA+D;AAC1F,EAAA,OAAO,IAAI,eAAA,CAAgB;AAAA,IACzB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,SAAS,KAAA,CAAM;AAAA,GAChB,CAAA;AACH;;;ACxMA,IAAqB,WAAA,GAArB,MAAqB,YAAA,SAAoB,OAAA,CAAQ;AAAA,EAC/C,OAAO,WAAA,GAAc,iBAAA;AAAA,EAErB,OAAO,QAAA,GAAW;AAAA,IAChB,gEAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,OAAO,KAAA,GAAQ;AAAA,IACb,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,MACjB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,GAAA,EAAK,MAAM,MAAA,CAAO;AAAA,MAChB,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,WAAA,EAAa,MAAM,MAAA,CAAO;AAAA,MACxB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,QAAA,EAAU,MAAM,MAAA,CAAO;AAAA,MACrB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa,aAAA;AAAA,MACb,SAAS,CAAC,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,QAAQ,SAAS;AAAA,KAC7D,CAAA;AAAA,IACD,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,MAClB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,eAAA,EAAiB,MAAM,MAAA,CAAO;AAAA,MAC5B,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,WAAA,EAAa,MAAM,MAAA,CAAO;AAAA,MACxB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,IACD,MAAA,EAAQ,MAAM,OAAA,CAAQ;AAAA,MACpB,WAAA,EAAa,mBAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,IACD,IAAA,EAAM,MAAM,OAAA,CAAQ;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,IACD,OAAA,EAAS,MAAM,OAAA,CAAQ;AAAA,MACrB,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa,qBAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV;AAAA,GACH;AAAA,EAEA,OAAO,IAAA,GAAO;AAAA,IACZ,EAAA,EAAI,KAAK,MAAA,CAAO;AAAA,MACd,WAAA,EAAa,iBAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACX;AAAA,GACH;AAAA,EAEA,MAAM,GAAA,GAAqB;AACzB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,IAAA,CAAK,MAAM,YAAW,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,IAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,IAAA,IAAI,CAAC,MAAA,CAAO,eAAA,EAAgB,EAAG;AAC7B,MAAA,MAAA,CAAO,MAAM,gDAAgD,CAAA;AAC7D,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,KAAA,CAAM,IAAA;AACrC,IAAA,IAAI,KAAA,CAAM,GAAA,EAAK,OAAA,CAAQ,GAAA,GAAM,KAAA,CAAM,GAAA;AACnC,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,KAAA,CAAM,QAAA;AAC7C,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,OAAA,GAAU,KAAA,CAAM,KAAA;AACzC,IAAA,IAAI,MAAM,eAAe,CAAA,KAAM,QAAW,OAAA,CAAQ,YAAA,GAAe,MAAM,eAAe,CAAA;AACtF,IAAA,IAAI,MAAM,WAAA,EAAa,OAAA,CAAQ,WAAA,GAAc,UAAA,CAAW,MAAM,WAAW,CAAA;AACzE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,MAAA;AAEzD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,MAAM,4DAA4D,CAAA;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AAE1D,MAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,SAAS,IAAA,EAAM;AACvC,QAAA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,wBAAwB,CAAA;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,OAAA,EAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,sBAAA,CAAwB,CAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QACzC,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AACF","file":"update.js","sourcesContent":["import Conf from 'conf';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(\n key: K,\n value: TpmConfig[K]\n): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Scenario types\nexport interface Scenario {\n id: string;\n collectionId: string | null;\n prompt: string;\n name: string | null;\n description: string | null;\n tags: string[];\n qualityScore: number;\n totalRuns: number;\n lastRunAt: string | null;\n lastRunStatus: string | null;\n consecutivePasses: number;\n consecutiveFails: number;\n createdAt: string;\n updatedAt: string;\n collection?: {\n id: string;\n name: string;\n slug: string | null;\n username: string | null;\n } | null;\n}\n\nexport interface ScenarioRun {\n id: string;\n status: string;\n success: boolean;\n evaluator: {\n model: string | null;\n verdict: string | null;\n reason: string | null;\n };\n assertions: unknown;\n usage: {\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n executionTimeMs: number | null;\n };\n timestamps: {\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n };\n quotaRemaining?: number;\n}\n\nexport interface ScenarioListOptions extends PaginationOptions {\n collectionId?: string;\n tags?: string;\n sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';\n}\n\nexport interface CreateScenarioInput {\n collectionId: string;\n prompt: string;\n name?: string;\n description?: string;\n tags?: string[];\n}\n\nexport interface GenerateScenariosInput {\n count?: number;\n skipSimilarityCheck?: boolean;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(\n `/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`\n );\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find((t) => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(\n field: unknown\n ): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(\n id: string,\n input: UpdateCollectionInput\n ): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Scenarios\n async listScenarios(options: ScenarioListOptions = {}): Promise<PaginatedResponse<Scenario>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n if (options.collectionId) params.set('collectionId', options.collectionId);\n if (options.tags) params.set('tags', options.tags);\n if (options.sortBy) params.set('sortBy', options.sortBy);\n\n const queryString = params.toString();\n const endpoint = queryString ? `/scenarios?${queryString}` : '/scenarios';\n\n return this.request<PaginatedResponse<Scenario>>(endpoint);\n }\n\n async listCollectionScenarios(\n collectionId: string,\n options: PaginationOptions = {}\n ): Promise<ApiResponse<{ scenarios: Scenario[] }>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/collections/${collectionId}/scenarios?${queryString}`\n : `/collections/${collectionId}/scenarios`;\n\n return this.request<ApiResponse<{ scenarios: Scenario[] }>>(endpoint);\n }\n\n async getScenario(id: string): Promise<ApiResponse<Scenario>> {\n return this.request(`/scenarios/${id}`);\n }\n\n async createScenario(input: CreateScenarioInput): Promise<ApiResponse<Scenario>> {\n return this.request('/scenarios', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async generateScenarios(\n collectionId: string,\n input: GenerateScenariosInput = {}\n ): Promise<ApiResponse<{ scenarios: { scenario: Scenario; similarity?: unknown }[] }>> {\n return this.request(`/collections/${collectionId}/scenarios/generate`, {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async runScenario(scenarioId: string): Promise<ApiResponse<ScenarioRun>> {\n return this.request(`/scenarios/${scenarioId}/run`, {\n method: 'POST',\n });\n }\n\n async getScenarioRuns(\n scenarioId: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResponse<ScenarioRun>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/scenarios/${scenarioId}/runs?${queryString}`\n : `/scenarios/${scenarioId}/runs`;\n\n return this.request<PaginatedResponse<ScenarioRun>>(endpoint);\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(key + ':')} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = ' '.repeat(indent) + '•';\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim('```' + (language ?? '')));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n\n // Color helpers\n green(text: string): string {\n return pc.green(text);\n }\n\n red(text: string): string {\n return pc.red(text);\n }\n\n yellow(text: string): string {\n return pc.yellow(text);\n }\n\n blue(text: string): string {\n return pc.blue(text);\n }\n\n cyan(text: string): string {\n return pc.cyan(text);\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import { Args, Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class AgentUpdate extends Command {\n static description = 'Update an agent';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> my-agent --name \"New Name\"',\n '<%= config.bin %> <%= command.id %> my-agent --temperature 0.5 --public false',\n ];\n\n static flags = {\n name: Flags.string({\n char: 'n',\n description: 'Agent name',\n }),\n uid: Flags.string({\n description: 'Unique identifier (URL-friendly)',\n }),\n description: Flags.string({\n char: 'd',\n description: 'Agent description',\n }),\n provider: Flags.string({\n char: 'p',\n description: 'AI provider',\n options: ['ANTHROPIC', 'OPENAI', 'GOOGLE', 'GROQ', 'MISTRAL'],\n }),\n model: Flags.string({\n char: 'm',\n description: 'Model ID',\n }),\n 'system-prompt': Flags.string({\n char: 's',\n description: 'System prompt',\n }),\n temperature: Flags.string({\n char: 't',\n description: 'Temperature (0-2)',\n }),\n public: Flags.boolean({\n description: 'Make agent public',\n allowNo: true,\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n static args = {\n id: Args.string({\n description: 'Agent ID or UID',\n required: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(AgentUpdate);\n const output = createOutput(flags);\n const client = getClient();\n\n if (!client.isAuthenticated()) {\n output.error('Not authenticated. Run `tpm auth login` first.');\n return;\n }\n\n // Build update payload\n const updates: Record<string, unknown> = {};\n if (flags.name) updates.name = flags.name;\n if (flags.uid) updates.uid = flags.uid;\n if (flags.description !== undefined) updates.description = flags.description;\n if (flags.provider) updates.provider = flags.provider;\n if (flags.model) updates.modelId = flags.model;\n if (flags['system-prompt'] !== undefined) updates.systemPrompt = flags['system-prompt'];\n if (flags.temperature) updates.temperature = parseFloat(flags.temperature);\n if (flags.public !== undefined) updates.isPublic = flags.public;\n\n if (Object.keys(updates).length === 0) {\n output.error('No updates specified. Use --help to see available options.');\n return;\n }\n\n const spinner = output.spinner('Updating agent...');\n\n try {\n const response = await client.updateAgent(args.id, updates);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n output.error(response.message || 'Failed to update agent');\n return;\n }\n\n if (flags.json) {\n output.json(response.data);\n return;\n }\n\n output.success(`Agent \"${response.data.name}\" updated successfully`);\n } catch (error) {\n spinner.fail('Failed to update agent');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Command, Flags, Args } from '@oclif/core';
|
|
2
|
-
import open from 'open';
|
|
3
1
|
import { createServer } from 'http';
|
|
4
2
|
import { URL } from 'url';
|
|
3
|
+
import { Command, Flags, Args } from '@oclif/core';
|
|
4
|
+
import open from 'open';
|
|
5
5
|
import Conf from 'conf';
|
|
6
6
|
import * as fs from 'fs';
|
|
7
7
|
import * as os from 'os';
|
|
@@ -124,7 +124,9 @@ var TpmClient = class {
|
|
|
124
124
|
return this.request(endpoint);
|
|
125
125
|
}
|
|
126
126
|
async getTool(packageName, toolName) {
|
|
127
|
-
return this.request(
|
|
127
|
+
return this.request(
|
|
128
|
+
`/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`
|
|
129
|
+
);
|
|
128
130
|
}
|
|
129
131
|
async getToolBySlug(slug) {
|
|
130
132
|
const searchResult = await this.searchTools({ query: slug, limit: 1 });
|
|
@@ -158,7 +160,7 @@ var TpmClient = class {
|
|
|
158
160
|
const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;
|
|
159
161
|
const headers = {
|
|
160
162
|
"Content-Type": "application/json",
|
|
161
|
-
|
|
163
|
+
Accept: "text/event-stream"
|
|
162
164
|
};
|
|
163
165
|
if (this.apiKey) {
|
|
164
166
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
@@ -286,6 +288,54 @@ var TpmClient = class {
|
|
|
286
288
|
async listApiKeys() {
|
|
287
289
|
return this.request("/user/tpmjs-api-keys");
|
|
288
290
|
}
|
|
291
|
+
// Scenarios
|
|
292
|
+
async listScenarios(options = {}) {
|
|
293
|
+
const params = new URLSearchParams();
|
|
294
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
295
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
296
|
+
if (options.collectionId) params.set("collectionId", options.collectionId);
|
|
297
|
+
if (options.tags) params.set("tags", options.tags);
|
|
298
|
+
if (options.sortBy) params.set("sortBy", options.sortBy);
|
|
299
|
+
const queryString = params.toString();
|
|
300
|
+
const endpoint = queryString ? `/scenarios?${queryString}` : "/scenarios";
|
|
301
|
+
return this.request(endpoint);
|
|
302
|
+
}
|
|
303
|
+
async listCollectionScenarios(collectionId, options = {}) {
|
|
304
|
+
const params = new URLSearchParams();
|
|
305
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
306
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
307
|
+
const queryString = params.toString();
|
|
308
|
+
const endpoint = queryString ? `/collections/${collectionId}/scenarios?${queryString}` : `/collections/${collectionId}/scenarios`;
|
|
309
|
+
return this.request(endpoint);
|
|
310
|
+
}
|
|
311
|
+
async getScenario(id) {
|
|
312
|
+
return this.request(`/scenarios/${id}`);
|
|
313
|
+
}
|
|
314
|
+
async createScenario(input) {
|
|
315
|
+
return this.request("/scenarios", {
|
|
316
|
+
method: "POST",
|
|
317
|
+
body: JSON.stringify(input)
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
async generateScenarios(collectionId, input = {}) {
|
|
321
|
+
return this.request(`/collections/${collectionId}/scenarios/generate`, {
|
|
322
|
+
method: "POST",
|
|
323
|
+
body: JSON.stringify(input)
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
async runScenario(scenarioId) {
|
|
327
|
+
return this.request(`/scenarios/${scenarioId}/run`, {
|
|
328
|
+
method: "POST"
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
async getScenarioRuns(scenarioId, options = {}) {
|
|
332
|
+
const params = new URLSearchParams();
|
|
333
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
334
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
335
|
+
const queryString = params.toString();
|
|
336
|
+
const endpoint = queryString ? `/scenarios/${scenarioId}/runs?${queryString}` : `/scenarios/${scenarioId}/runs`;
|
|
337
|
+
return this.request(endpoint);
|
|
338
|
+
}
|
|
289
339
|
// Check if authenticated
|
|
290
340
|
isAuthenticated() {
|
|
291
341
|
return !!this.apiKey;
|
|
@@ -435,6 +485,22 @@ var OutputFormatter = class {
|
|
|
435
485
|
link(text, url) {
|
|
436
486
|
return `\x1B]8;;${url}\x07${pc.underline(pc.blue(text))}\x1B]8;;\x07`;
|
|
437
487
|
}
|
|
488
|
+
// Color helpers
|
|
489
|
+
green(text) {
|
|
490
|
+
return pc.green(text);
|
|
491
|
+
}
|
|
492
|
+
red(text) {
|
|
493
|
+
return pc.red(text);
|
|
494
|
+
}
|
|
495
|
+
yellow(text) {
|
|
496
|
+
return pc.yellow(text);
|
|
497
|
+
}
|
|
498
|
+
blue(text) {
|
|
499
|
+
return pc.blue(text);
|
|
500
|
+
}
|
|
501
|
+
cyan(text) {
|
|
502
|
+
return pc.cyan(text);
|
|
503
|
+
}
|
|
438
504
|
};
|
|
439
505
|
function createOutput(flags) {
|
|
440
506
|
return new OutputFormatter({
|
|
@@ -491,7 +557,9 @@ var Login = class _Login extends Command {
|
|
|
491
557
|
output.listItem("tpm auth login --api-key <your-api-key>");
|
|
492
558
|
output.listItem("tpm auth login --browser (opens browser for OAuth)");
|
|
493
559
|
output.newLine();
|
|
494
|
-
output.text(
|
|
560
|
+
output.text(
|
|
561
|
+
`Get your API key at: ${output.link("tpmjs.com/dashboard/settings/tpmjs-api-keys", "https://tpmjs.com/dashboard/settings/tpmjs-api-keys")}`
|
|
562
|
+
);
|
|
495
563
|
}
|
|
496
564
|
}
|
|
497
565
|
async loginWithApiKey(apiKey, output, flags) {
|
|
@@ -534,6 +602,11 @@ var Login = class _Login extends Command {
|
|
|
534
602
|
const state = crypto.randomUUID();
|
|
535
603
|
output.info("Opening browser for authentication...");
|
|
536
604
|
return new Promise((resolve) => {
|
|
605
|
+
let timeoutId;
|
|
606
|
+
const cleanup = () => {
|
|
607
|
+
clearTimeout(timeoutId);
|
|
608
|
+
server.close();
|
|
609
|
+
};
|
|
537
610
|
const server = createServer(async (req, res) => {
|
|
538
611
|
const url = new URL(req.url ?? "/", `http://localhost:${port}`);
|
|
539
612
|
if (url.pathname === "/callback") {
|
|
@@ -542,16 +615,20 @@ var Login = class _Login extends Command {
|
|
|
542
615
|
const error = url.searchParams.get("error");
|
|
543
616
|
if (error) {
|
|
544
617
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
545
|
-
res.end(
|
|
546
|
-
|
|
618
|
+
res.end(
|
|
619
|
+
"<html><body><h1>Authentication Failed</h1><p>You can close this window.</p></body></html>"
|
|
620
|
+
);
|
|
621
|
+
cleanup();
|
|
547
622
|
output.error(`Authentication failed: ${error}`);
|
|
548
623
|
resolve();
|
|
549
624
|
return;
|
|
550
625
|
}
|
|
551
626
|
if (receivedState !== state) {
|
|
552
627
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
553
|
-
res.end(
|
|
554
|
-
|
|
628
|
+
res.end(
|
|
629
|
+
"<html><body><h1>Invalid State</h1><p>Authentication failed due to invalid state.</p></body></html>"
|
|
630
|
+
);
|
|
631
|
+
cleanup();
|
|
555
632
|
output.error("Authentication failed: Invalid state parameter");
|
|
556
633
|
resolve();
|
|
557
634
|
return;
|
|
@@ -559,8 +636,10 @@ var Login = class _Login extends Command {
|
|
|
559
636
|
if (apiKey) {
|
|
560
637
|
saveCredentials({ apiKey });
|
|
561
638
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
562
|
-
res.end(
|
|
563
|
-
|
|
639
|
+
res.end(
|
|
640
|
+
"<html><body><h1>Success!</h1><p>You are now logged in. You can close this window.</p></body></html>"
|
|
641
|
+
);
|
|
642
|
+
cleanup();
|
|
564
643
|
output.success("Logged in successfully via browser");
|
|
565
644
|
if (flags.json) {
|
|
566
645
|
output.json({ success: true });
|
|
@@ -569,7 +648,7 @@ var Login = class _Login extends Command {
|
|
|
569
648
|
} else {
|
|
570
649
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
571
650
|
res.end("<html><body><h1>Error</h1><p>No API key received.</p></body></html>");
|
|
572
|
-
|
|
651
|
+
cleanup();
|
|
573
652
|
output.error("No API key received from authentication");
|
|
574
653
|
resolve();
|
|
575
654
|
}
|
|
@@ -589,11 +668,14 @@ var Login = class _Login extends Command {
|
|
|
589
668
|
output.text(`Please open this URL manually: ${authUrl}`);
|
|
590
669
|
}
|
|
591
670
|
});
|
|
592
|
-
setTimeout(
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
671
|
+
timeoutId = setTimeout(
|
|
672
|
+
() => {
|
|
673
|
+
server.close();
|
|
674
|
+
output.error("Authentication timed out");
|
|
675
|
+
resolve();
|
|
676
|
+
},
|
|
677
|
+
5 * 60 * 1e3
|
|
678
|
+
);
|
|
597
679
|
});
|
|
598
680
|
}
|
|
599
681
|
};
|