@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
|
@@ -116,7 +116,9 @@ var TpmClient = class {
|
|
|
116
116
|
return this.request(endpoint);
|
|
117
117
|
}
|
|
118
118
|
async getTool(packageName, toolName) {
|
|
119
|
-
return this.request(
|
|
119
|
+
return this.request(
|
|
120
|
+
`/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`
|
|
121
|
+
);
|
|
120
122
|
}
|
|
121
123
|
async getToolBySlug(slug) {
|
|
122
124
|
const searchResult = await this.searchTools({ query: slug, limit: 1 });
|
|
@@ -150,7 +152,7 @@ var TpmClient = class {
|
|
|
150
152
|
const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;
|
|
151
153
|
const headers = {
|
|
152
154
|
"Content-Type": "application/json",
|
|
153
|
-
|
|
155
|
+
Accept: "text/event-stream"
|
|
154
156
|
};
|
|
155
157
|
if (this.apiKey) {
|
|
156
158
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
@@ -278,6 +280,54 @@ var TpmClient = class {
|
|
|
278
280
|
async listApiKeys() {
|
|
279
281
|
return this.request("/user/tpmjs-api-keys");
|
|
280
282
|
}
|
|
283
|
+
// Scenarios
|
|
284
|
+
async listScenarios(options = {}) {
|
|
285
|
+
const params = new URLSearchParams();
|
|
286
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
287
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
288
|
+
if (options.collectionId) params.set("collectionId", options.collectionId);
|
|
289
|
+
if (options.tags) params.set("tags", options.tags);
|
|
290
|
+
if (options.sortBy) params.set("sortBy", options.sortBy);
|
|
291
|
+
const queryString = params.toString();
|
|
292
|
+
const endpoint = queryString ? `/scenarios?${queryString}` : "/scenarios";
|
|
293
|
+
return this.request(endpoint);
|
|
294
|
+
}
|
|
295
|
+
async listCollectionScenarios(collectionId, options = {}) {
|
|
296
|
+
const params = new URLSearchParams();
|
|
297
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
298
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
299
|
+
const queryString = params.toString();
|
|
300
|
+
const endpoint = queryString ? `/collections/${collectionId}/scenarios?${queryString}` : `/collections/${collectionId}/scenarios`;
|
|
301
|
+
return this.request(endpoint);
|
|
302
|
+
}
|
|
303
|
+
async getScenario(id) {
|
|
304
|
+
return this.request(`/scenarios/${id}`);
|
|
305
|
+
}
|
|
306
|
+
async createScenario(input) {
|
|
307
|
+
return this.request("/scenarios", {
|
|
308
|
+
method: "POST",
|
|
309
|
+
body: JSON.stringify(input)
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
async generateScenarios(collectionId, input = {}) {
|
|
313
|
+
return this.request(`/collections/${collectionId}/scenarios/generate`, {
|
|
314
|
+
method: "POST",
|
|
315
|
+
body: JSON.stringify(input)
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
async runScenario(scenarioId) {
|
|
319
|
+
return this.request(`/scenarios/${scenarioId}/run`, {
|
|
320
|
+
method: "POST"
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async getScenarioRuns(scenarioId, options = {}) {
|
|
324
|
+
const params = new URLSearchParams();
|
|
325
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
326
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
327
|
+
const queryString = params.toString();
|
|
328
|
+
const endpoint = queryString ? `/scenarios/${scenarioId}/runs?${queryString}` : `/scenarios/${scenarioId}/runs`;
|
|
329
|
+
return this.request(endpoint);
|
|
330
|
+
}
|
|
281
331
|
// Check if authenticated
|
|
282
332
|
isAuthenticated() {
|
|
283
333
|
return !!this.apiKey;
|
|
@@ -434,6 +484,22 @@ var OutputFormatter = class {
|
|
|
434
484
|
link(text, url) {
|
|
435
485
|
return `\x1B]8;;${url}\x07${pc.underline(pc.blue(text))}\x1B]8;;\x07`;
|
|
436
486
|
}
|
|
487
|
+
// Color helpers
|
|
488
|
+
green(text) {
|
|
489
|
+
return pc.green(text);
|
|
490
|
+
}
|
|
491
|
+
red(text) {
|
|
492
|
+
return pc.red(text);
|
|
493
|
+
}
|
|
494
|
+
yellow(text) {
|
|
495
|
+
return pc.yellow(text);
|
|
496
|
+
}
|
|
497
|
+
blue(text) {
|
|
498
|
+
return pc.blue(text);
|
|
499
|
+
}
|
|
500
|
+
cyan(text) {
|
|
501
|
+
return pc.cyan(text);
|
|
502
|
+
}
|
|
437
503
|
};
|
|
438
504
|
function createOutput(flags) {
|
|
439
505
|
return new OutputFormatter({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/collection/add.ts"],"names":[],"mappings":"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","file":"add.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 CollectionAdd extends Command {\n static description = 'Add tools to a collection';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> my-collection tool-id-1',\n '<%= config.bin %> <%= command.id %> my-collection tool-id-1 tool-id-2 tool-id-3',\n ];\n\n static strict = false; // Allow variable number of arguments\n\n static flags = {\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 collection: Args.string({\n description: 'Collection ID or slug',\n required: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, argv, flags } = await this.parse(CollectionAdd);\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 // Get tool IDs from remaining arguments\n const toolIds = argv.slice(1) as string[];\n\n if (toolIds.length === 0) {\n output.error('Please specify at least one tool ID to add');\n output.text('Example: tpm collection add my-collection tool-id-1 tool-id-2');\n return;\n }\n\n const spinner = output.spinner(`Adding ${toolIds.length} tool(s)...`);\n\n try {\n await client.addToolsToCollection(args.collection, toolIds);\n\n spinner.stop();\n\n if (flags.json) {\n output.json({ success: true, added: toolIds.length, toolIds });\n return;\n }\n\n output.success(`Added ${toolIds.length} tool(s) to collection`);\n for (const toolId of toolIds) {\n output.listItem(toolId);\n }\n } catch (error) {\n spinner.fail('Failed to add tools');\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/collection/add.ts"],"names":[],"mappings":"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","file":"add.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 CollectionAdd extends Command {\n static description = 'Add tools to a collection';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> my-collection tool-id-1',\n '<%= config.bin %> <%= command.id %> my-collection tool-id-1 tool-id-2 tool-id-3',\n ];\n\n static strict = false; // Allow variable number of arguments\n\n static flags = {\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 collection: Args.string({\n description: 'Collection ID or slug',\n required: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, argv, flags } = await this.parse(CollectionAdd);\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 // Get tool IDs from remaining arguments\n const toolIds = argv.slice(1) as string[];\n\n if (toolIds.length === 0) {\n output.error('Please specify at least one tool ID to add');\n output.text('Example: tpm collection add my-collection tool-id-1 tool-id-2');\n return;\n }\n\n const spinner = output.spinner(`Adding ${toolIds.length} tool(s)...`);\n\n try {\n await client.addToolsToCollection(args.collection, toolIds);\n\n spinner.stop();\n\n if (flags.json) {\n output.json({ success: true, added: toolIds.length, toolIds });\n return;\n }\n\n output.success(`Added ${toolIds.length} tool(s) to collection`);\n for (const toolId of toolIds) {\n output.listItem(toolId);\n }\n } catch (error) {\n spinner.fail('Failed to add tools');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|
|
@@ -116,7 +116,9 @@ var TpmClient = class {
|
|
|
116
116
|
return this.request(endpoint);
|
|
117
117
|
}
|
|
118
118
|
async getTool(packageName, toolName) {
|
|
119
|
-
return this.request(
|
|
119
|
+
return this.request(
|
|
120
|
+
`/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`
|
|
121
|
+
);
|
|
120
122
|
}
|
|
121
123
|
async getToolBySlug(slug) {
|
|
122
124
|
const searchResult = await this.searchTools({ query: slug, limit: 1 });
|
|
@@ -150,7 +152,7 @@ var TpmClient = class {
|
|
|
150
152
|
const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;
|
|
151
153
|
const headers = {
|
|
152
154
|
"Content-Type": "application/json",
|
|
153
|
-
|
|
155
|
+
Accept: "text/event-stream"
|
|
154
156
|
};
|
|
155
157
|
if (this.apiKey) {
|
|
156
158
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
@@ -278,6 +280,54 @@ var TpmClient = class {
|
|
|
278
280
|
async listApiKeys() {
|
|
279
281
|
return this.request("/user/tpmjs-api-keys");
|
|
280
282
|
}
|
|
283
|
+
// Scenarios
|
|
284
|
+
async listScenarios(options = {}) {
|
|
285
|
+
const params = new URLSearchParams();
|
|
286
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
287
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
288
|
+
if (options.collectionId) params.set("collectionId", options.collectionId);
|
|
289
|
+
if (options.tags) params.set("tags", options.tags);
|
|
290
|
+
if (options.sortBy) params.set("sortBy", options.sortBy);
|
|
291
|
+
const queryString = params.toString();
|
|
292
|
+
const endpoint = queryString ? `/scenarios?${queryString}` : "/scenarios";
|
|
293
|
+
return this.request(endpoint);
|
|
294
|
+
}
|
|
295
|
+
async listCollectionScenarios(collectionId, options = {}) {
|
|
296
|
+
const params = new URLSearchParams();
|
|
297
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
298
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
299
|
+
const queryString = params.toString();
|
|
300
|
+
const endpoint = queryString ? `/collections/${collectionId}/scenarios?${queryString}` : `/collections/${collectionId}/scenarios`;
|
|
301
|
+
return this.request(endpoint);
|
|
302
|
+
}
|
|
303
|
+
async getScenario(id) {
|
|
304
|
+
return this.request(`/scenarios/${id}`);
|
|
305
|
+
}
|
|
306
|
+
async createScenario(input) {
|
|
307
|
+
return this.request("/scenarios", {
|
|
308
|
+
method: "POST",
|
|
309
|
+
body: JSON.stringify(input)
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
async generateScenarios(collectionId, input = {}) {
|
|
313
|
+
return this.request(`/collections/${collectionId}/scenarios/generate`, {
|
|
314
|
+
method: "POST",
|
|
315
|
+
body: JSON.stringify(input)
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
async runScenario(scenarioId) {
|
|
319
|
+
return this.request(`/scenarios/${scenarioId}/run`, {
|
|
320
|
+
method: "POST"
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async getScenarioRuns(scenarioId, options = {}) {
|
|
324
|
+
const params = new URLSearchParams();
|
|
325
|
+
if (options.limit) params.set("limit", String(options.limit));
|
|
326
|
+
if (options.offset) params.set("offset", String(options.offset));
|
|
327
|
+
const queryString = params.toString();
|
|
328
|
+
const endpoint = queryString ? `/scenarios/${scenarioId}/runs?${queryString}` : `/scenarios/${scenarioId}/runs`;
|
|
329
|
+
return this.request(endpoint);
|
|
330
|
+
}
|
|
281
331
|
// Check if authenticated
|
|
282
332
|
isAuthenticated() {
|
|
283
333
|
return !!this.apiKey;
|
|
@@ -434,6 +484,22 @@ var OutputFormatter = class {
|
|
|
434
484
|
link(text, url) {
|
|
435
485
|
return `\x1B]8;;${url}\x07${pc.underline(pc.blue(text))}\x1B]8;;\x07`;
|
|
436
486
|
}
|
|
487
|
+
// Color helpers
|
|
488
|
+
green(text) {
|
|
489
|
+
return pc.green(text);
|
|
490
|
+
}
|
|
491
|
+
red(text) {
|
|
492
|
+
return pc.red(text);
|
|
493
|
+
}
|
|
494
|
+
yellow(text) {
|
|
495
|
+
return pc.yellow(text);
|
|
496
|
+
}
|
|
497
|
+
blue(text) {
|
|
498
|
+
return pc.blue(text);
|
|
499
|
+
}
|
|
500
|
+
cyan(text) {
|
|
501
|
+
return pc.cyan(text);
|
|
502
|
+
}
|
|
437
503
|
};
|
|
438
504
|
function createOutput(flags) {
|
|
439
505
|
return new OutputFormatter({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/collection/create.ts"],"names":[],"mappings":"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","file":"create.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 { Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class CollectionCreate extends Command {\n static description = 'Create a new collection';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> --name \"My Tools\"',\n '<%= config.bin %> <%= command.id %> --name \"Web Scrapers\" --description \"Tools for web scraping\" --public',\n ];\n\n static flags = {\n name: Flags.string({\n char: 'n',\n description: 'Collection name',\n required: true,\n }),\n description: Flags.string({\n char: 'd',\n description: 'Collection description',\n }),\n public: Flags.boolean({\n description: 'Make collection public',\n default: false,\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 async run(): Promise<void> {\n const { flags } = await this.parse(CollectionCreate);\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 const spinner = output.spinner('Creating collection...');\n\n try {\n const response = await client.createCollection({\n name: flags.name,\n description: flags.description,\n isPublic: flags.public,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n output.error(response.message || 'Failed to create collection');\n return;\n }\n\n if (flags.json) {\n output.json(response.data);\n return;\n }\n\n output.success(`Collection \"${response.data.name}\" created successfully`);\n output.newLine();\n output.keyValue('ID', response.data.id);\n if (response.data.slug) {\n output.keyValue('Slug', response.data.slug);\n }\n output.keyValue('Public', response.data.isPublic ? 'Yes' : 'No');\n output.newLine();\n output.text(`Add tools: tpm collection add ${response.data.id} <tool-id>`);\n } catch (error) {\n spinner.fail('Failed to create collection');\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/collection/create.ts"],"names":[],"mappings":"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","file":"create.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 { Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class CollectionCreate extends Command {\n static description = 'Create a new collection';\n\n static examples = [\n '<%= config.bin %> <%= command.id %> --name \"My Tools\"',\n '<%= config.bin %> <%= command.id %> --name \"Web Scrapers\" --description \"Tools for web scraping\" --public',\n ];\n\n static flags = {\n name: Flags.string({\n char: 'n',\n description: 'Collection name',\n required: true,\n }),\n description: Flags.string({\n char: 'd',\n description: 'Collection description',\n }),\n public: Flags.boolean({\n description: 'Make collection public',\n default: false,\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 async run(): Promise<void> {\n const { flags } = await this.parse(CollectionCreate);\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 const spinner = output.spinner('Creating collection...');\n\n try {\n const response = await client.createCollection({\n name: flags.name,\n description: flags.description,\n isPublic: flags.public,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n output.error(response.message || 'Failed to create collection');\n return;\n }\n\n if (flags.json) {\n output.json(response.data);\n return;\n }\n\n output.success(`Collection \"${response.data.name}\" created successfully`);\n output.newLine();\n output.keyValue('ID', response.data.id);\n if (response.data.slug) {\n output.keyValue('Slug', response.data.slug);\n }\n output.keyValue('Public', response.data.isPublic ? 'Yes' : 'No');\n output.newLine();\n output.text(`Add tools: tpm collection add ${response.data.id} <tool-id>`);\n } catch (error) {\n spinner.fail('Failed to create collection');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|