@porchestra/cli 1.0.2 ā 1.0.3
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/index.js +80 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -301,6 +301,7 @@ import { promises as fs } from "fs";
|
|
|
301
301
|
import path from "path";
|
|
302
302
|
import os from "os";
|
|
303
303
|
import { z as z2 } from "zod";
|
|
304
|
+
import { input } from "@inquirer/prompts";
|
|
304
305
|
|
|
305
306
|
// src/core/config/config-schema.ts
|
|
306
307
|
import { z } from "zod";
|
|
@@ -330,7 +331,7 @@ var CliConfigSchema = z.object({
|
|
|
330
331
|
deviceName: z.string().optional()
|
|
331
332
|
}).optional(),
|
|
332
333
|
api: z.object({
|
|
333
|
-
baseUrl: z.string().url().
|
|
334
|
+
baseUrl: z.string().url().optional(),
|
|
334
335
|
skipTlsVerify: z.boolean().default(false)
|
|
335
336
|
}).default({}),
|
|
336
337
|
trackedProjects: z.array(TrackedProjectSchema).default([]),
|
|
@@ -424,6 +425,38 @@ var ConfigManager = class {
|
|
|
424
425
|
}
|
|
425
426
|
this.config = null;
|
|
426
427
|
}
|
|
428
|
+
async ensureApiBaseUrl() {
|
|
429
|
+
const config = await this.get();
|
|
430
|
+
const existing = config.api?.baseUrl;
|
|
431
|
+
if (existing) {
|
|
432
|
+
return existing;
|
|
433
|
+
}
|
|
434
|
+
const envUrl = process.env.PORCHESTRA_API_URL;
|
|
435
|
+
const defaultUrl = envUrl || "http://localhost:3000/api/v1";
|
|
436
|
+
const value = await input({
|
|
437
|
+
message: "API base URL:",
|
|
438
|
+
default: defaultUrl,
|
|
439
|
+
validate: (val) => {
|
|
440
|
+
try {
|
|
441
|
+
const parsed = new URL(val);
|
|
442
|
+
if (!parsed.protocol.startsWith("http")) {
|
|
443
|
+
return "URL must start with http:// or https://";
|
|
444
|
+
}
|
|
445
|
+
return true;
|
|
446
|
+
} catch {
|
|
447
|
+
return "Please enter a valid URL";
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
await this.update((cfg) => ({
|
|
452
|
+
...cfg,
|
|
453
|
+
api: {
|
|
454
|
+
...cfg.api,
|
|
455
|
+
baseUrl: value
|
|
456
|
+
}
|
|
457
|
+
}));
|
|
458
|
+
return value;
|
|
459
|
+
}
|
|
427
460
|
getConfigPath() {
|
|
428
461
|
return this.configPath;
|
|
429
462
|
}
|
|
@@ -462,8 +495,7 @@ var AuthService = class {
|
|
|
462
495
|
this.configManager = configManager;
|
|
463
496
|
}
|
|
464
497
|
async login(credentials) {
|
|
465
|
-
const
|
|
466
|
-
const baseUrl = credentials.apiUrl || config.api?.baseUrl || "https://api.porchestra.io/v1";
|
|
498
|
+
const baseUrl = credentials.apiUrl || await this.configManager.ensureApiBaseUrl();
|
|
467
499
|
const deviceInfo = {
|
|
468
500
|
os: os2.platform(),
|
|
469
501
|
version: os2.release(),
|
|
@@ -500,8 +532,7 @@ var AuthService = class {
|
|
|
500
532
|
}
|
|
501
533
|
}
|
|
502
534
|
async refreshToken(tokenId, currentToken) {
|
|
503
|
-
const
|
|
504
|
-
const baseUrl = config.api?.baseUrl || "https://api.porchestra.io/v1";
|
|
535
|
+
const baseUrl = await this.configManager.ensureApiBaseUrl();
|
|
505
536
|
try {
|
|
506
537
|
const response = await got.post(`${baseUrl}/cli/token/refresh`, {
|
|
507
538
|
json: {
|
|
@@ -522,8 +553,7 @@ var AuthService = class {
|
|
|
522
553
|
}
|
|
523
554
|
}
|
|
524
555
|
async revokeToken(token, revokeAll = false) {
|
|
525
|
-
const
|
|
526
|
-
const baseUrl = config.api?.baseUrl || "https://api.porchestra.io/v1";
|
|
556
|
+
const baseUrl = await this.configManager.ensureApiBaseUrl();
|
|
527
557
|
try {
|
|
528
558
|
const response = await got.delete(`${baseUrl}/cli/token`, {
|
|
529
559
|
json: {
|
|
@@ -543,8 +573,7 @@ var AuthService = class {
|
|
|
543
573
|
}
|
|
544
574
|
}
|
|
545
575
|
async getCurrentUser(token) {
|
|
546
|
-
const
|
|
547
|
-
const baseUrl = config.api?.baseUrl || "https://api.porchestra.io/v1";
|
|
576
|
+
const baseUrl = await this.configManager.ensureApiBaseUrl();
|
|
548
577
|
try {
|
|
549
578
|
const response = await got.get(`${baseUrl}/auth/me`, {
|
|
550
579
|
headers: {
|
|
@@ -640,8 +669,7 @@ var ApiClient = class {
|
|
|
640
669
|
this.configManager = configManager;
|
|
641
670
|
}
|
|
642
671
|
async getBaseUrl() {
|
|
643
|
-
|
|
644
|
-
return config.api?.baseUrl || "https://api.porchestra.io/v1";
|
|
672
|
+
return this.configManager.ensureApiBaseUrl();
|
|
645
673
|
}
|
|
646
674
|
async getToken() {
|
|
647
675
|
const config = await this.configManager.get();
|
|
@@ -1073,7 +1101,7 @@ export class {{pascalCase agentName}}Agent {
|
|
|
1073
1101
|
// src/commands/login.ts
|
|
1074
1102
|
import { Command } from "commander";
|
|
1075
1103
|
import pc from "picocolors";
|
|
1076
|
-
import { input, password } from "@inquirer/prompts";
|
|
1104
|
+
import { input as input2, password } from "@inquirer/prompts";
|
|
1077
1105
|
function createLoginCommand(configManager, authService) {
|
|
1078
1106
|
return new Command("login").description("Authenticate with your Porchestra account").option("--api-url <url>", "Override API URL").option("--skip-tls-verify", "Skip TLS certificate verification (insecure)").action(async (options) => {
|
|
1079
1107
|
console.log(pc.bold("\n \u{1F510} Porchestra CLI Login\n"));
|
|
@@ -1081,7 +1109,7 @@ function createLoginCommand(configManager, authService) {
|
|
|
1081
1109
|
if (options.skipTlsVerify) {
|
|
1082
1110
|
console.log(pc.yellow("\n \u26A0\uFE0F WARNING: TLS verification disabled. Not recommended for production.\n"));
|
|
1083
1111
|
}
|
|
1084
|
-
const email = await
|
|
1112
|
+
const email = await input2({
|
|
1085
1113
|
message: " Email:",
|
|
1086
1114
|
validate: (value) => value.includes("@") || "Please enter a valid email"
|
|
1087
1115
|
});
|
|
@@ -1375,7 +1403,7 @@ function createPullCommand(configManager, apiClient, codeGenerator) {
|
|
|
1375
1403
|
// src/commands/config.ts
|
|
1376
1404
|
import { Command as Command6 } from "commander";
|
|
1377
1405
|
import pc6 from "picocolors";
|
|
1378
|
-
import { confirm as confirm3 } from "@inquirer/prompts";
|
|
1406
|
+
import { confirm as confirm3, input as input3 } from "@inquirer/prompts";
|
|
1379
1407
|
function createConfigCommand(configManager) {
|
|
1380
1408
|
const config = new Command6("config").description("Manage CLI configuration");
|
|
1381
1409
|
config.command("get <key>").description("Get a configuration value").action(async (key) => {
|
|
@@ -1394,6 +1422,44 @@ function createConfigCommand(configManager) {
|
|
|
1394
1422
|
console.log(pc6.bold("\nConfiguration:"));
|
|
1395
1423
|
printConfig(cfg);
|
|
1396
1424
|
});
|
|
1425
|
+
config.command("api-url").description("Get or set the API base URL").argument("[url]", "New API base URL").action(async (url) => {
|
|
1426
|
+
if (!url) {
|
|
1427
|
+
const cfg = await configManager.get();
|
|
1428
|
+
const current = cfg.api?.baseUrl;
|
|
1429
|
+
const value = await input3({
|
|
1430
|
+
message: "API base URL:",
|
|
1431
|
+
default: current || "http://localhost:3000/api/v1",
|
|
1432
|
+
validate: (val) => {
|
|
1433
|
+
try {
|
|
1434
|
+
const parsed = new URL(val);
|
|
1435
|
+
if (!parsed.protocol.startsWith("http")) {
|
|
1436
|
+
return "URL must start with http:// or https://";
|
|
1437
|
+
}
|
|
1438
|
+
return true;
|
|
1439
|
+
} catch {
|
|
1440
|
+
return "Please enter a valid URL";
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
});
|
|
1444
|
+
await configManager.update((cfg2) => ({
|
|
1445
|
+
...cfg2,
|
|
1446
|
+
api: {
|
|
1447
|
+
...cfg2.api,
|
|
1448
|
+
baseUrl: value
|
|
1449
|
+
}
|
|
1450
|
+
}));
|
|
1451
|
+
console.log(pc6.green(`\u2713 API base URL set to ${value}`));
|
|
1452
|
+
return;
|
|
1453
|
+
}
|
|
1454
|
+
await configManager.update((cfg) => ({
|
|
1455
|
+
...cfg,
|
|
1456
|
+
api: {
|
|
1457
|
+
...cfg.api,
|
|
1458
|
+
baseUrl: url
|
|
1459
|
+
}
|
|
1460
|
+
}));
|
|
1461
|
+
console.log(pc6.green(`\u2713 API base URL set to ${url}`));
|
|
1462
|
+
});
|
|
1397
1463
|
config.command("reset").description("Reset all configuration (WARNING: clears auth)").option("--force", "Skip confirmation").action(async (options) => {
|
|
1398
1464
|
if (!options.force) {
|
|
1399
1465
|
const confirmed = await confirm3({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/config/project-tracker.ts","../src/utils/date.ts","../src/commands/explore.ts","../src/index.ts","../src/core/config/config-manager.ts","../src/core/config/config-schema.ts","../src/utils/errors.ts","../src/core/auth/auth-service.ts","../src/core/auth/token-manager.ts","../src/core/api/client.ts","../src/core/generators/code-generator.ts","../src/utils/path-utils.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/pull.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/agents.ts"],"sourcesContent":["import { ConfigManager } from './config-manager.js';\nimport { TrackedProject, TrackedAgent } from './config-schema.js';\n\nexport interface ProjectBrief {\n id: string;\n name: string;\n slug: string;\n}\n\nexport interface AgentBrief {\n id: string;\n name: string;\n slug: string;\n folderPath: string;\n}\n\nexport class ProjectTracker {\n constructor(private configManager: ConfigManager) {}\n\n async getTrackedProjects(): Promise<TrackedProject[]> {\n const config = await this.configManager.get();\n return config.trackedProjects || [];\n }\n\n async getTrackedAgents(projectId: string): Promise<TrackedAgent[]> {\n const config = await this.configManager.get();\n const project = config.trackedProjects?.find(p => p.projectId === projectId);\n return project?.agents || [];\n }\n\n async listTrackedAgents(): Promise<Array<{ project: TrackedProject; agent: TrackedAgent }>> {\n const projects = await this.getTrackedProjects();\n return projects.flatMap(project =>\n project.agents.map(agent => ({ project, agent }))\n );\n }\n\n async trackProject(project: ProjectBrief, agents: AgentBrief[]): Promise<void> {\n await this.configManager.update((config) => {\n const existingIndex = config.trackedProjects.findIndex(\n p => p.projectId === project.id\n );\n\n const trackedAgents: TrackedAgent[] = agents.map(agent => ({\n agentId: agent.id,\n agentName: agent.name,\n agentSlug: agent.slug,\n folderPath: agent.folderPath,\n selectedAt: new Date().toISOString(),\n }));\n\n const trackedProject: TrackedProject = {\n projectId: project.id,\n projectName: project.name,\n projectSlug: project.slug,\n selectedAt: new Date().toISOString(),\n agents: trackedAgents,\n };\n\n const newProjects = [...config.trackedProjects];\n if (existingIndex >= 0) {\n newProjects[existingIndex] = trackedProject;\n } else {\n newProjects.push(trackedProject);\n }\n\n return { ...config, trackedProjects: newProjects };\n });\n }\n\n async untrackProject(projectId: string): Promise<void> {\n await this.configManager.update((config) => ({\n ...config,\n trackedProjects: config.trackedProjects.filter(\n p => p.projectId !== projectId\n ),\n }));\n }\n\n async untrackAgent(projectId: string, agentId: string): Promise<boolean> {\n let removed = false;\n\n await this.configManager.update((config) => {\n const projectIndex = config.trackedProjects.findIndex(\n p => p.projectId === projectId\n );\n\n if (projectIndex === -1) return config;\n\n const project = config.trackedProjects[projectIndex];\n const remainingAgents = project.agents.filter(\n agent => agent.agentId !== agentId\n );\n\n if (remainingAgents.length === project.agents.length) {\n return config;\n }\n\n removed = true;\n\n const newProjects = [...config.trackedProjects];\n\n if (remainingAgents.length === 0) {\n newProjects.splice(projectIndex, 1);\n } else {\n newProjects[projectIndex] = { ...project, agents: remainingAgents };\n }\n\n return { ...config, trackedProjects: newProjects };\n });\n\n return removed;\n }\n\n async updateLastPulled(\n projectId: string,\n agentId: string,\n version: string\n ): Promise<void> {\n await this.configManager.update((config) => {\n const projectIndex = config.trackedProjects.findIndex(\n p => p.projectId === projectId\n );\n if (projectIndex === -1) return config;\n\n const project = config.trackedProjects[projectIndex];\n const agentIndex = project.agents.findIndex(\n a => a.agentId === agentId\n );\n if (agentIndex === -1) return config;\n\n const now = new Date().toISOString();\n const newAgents = [...project.agents];\n newAgents[agentIndex] = {\n ...newAgents[agentIndex],\n lastPulledAt: now,\n lastPulledVersion: version,\n };\n\n const newProjects = [...config.trackedProjects];\n newProjects[projectIndex] = {\n ...project,\n agents: newAgents,\n lastPulledAt: now,\n };\n\n return { ...config, trackedProjects: newProjects };\n });\n }\n\n async getSummary(): Promise<{ projectCount: number; agentCount: number }> {\n const projects = await this.getTrackedProjects();\n return {\n projectCount: projects.length,\n agentCount: projects.reduce((sum, p) => sum + p.agents.length, 0),\n };\n }\n}\n","export function formatDistanceToNow(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 30) return `${diffDays}d ago`;\n return date.toISOString().split('T')[0];\n}\n\nexport function formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n","import { Command } from 'commander';\nimport { select, checkbox, confirm, Separator } from '@inquirer/prompts';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { ApiClient } from '../core/api/client.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\nimport { formatDate } from '../utils/date.js';\n\ninterface ExploreOptions {\n project?: string;\n}\n\ninterface ProjectChoice {\n name: string;\n value: any;\n short?: string;\n}\n\nexport function createExploreCommand(\n configManager: ConfigManager,\n apiClient: ApiClient\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('explore')\n .description('Explore and select projects/agents to track')\n .option('-p, --project <id>', 'Start with specific project')\n .action(async (options: ExploreOptions) => {\n const spinner = ora('Fetching projects...').start();\n \n try {\n // Fetch all projects\n const response = await apiClient.getProjectsBrief();\n const projects = response.projects;\n spinner.stop();\n\n if (projects.length === 0) {\n console.log(pc.yellow('No projects found. Create one in the web app first.'));\n return;\n }\n\n // Project selection loop\n let exploring = true;\n while (exploring) {\n const projectChoices: ProjectChoice[] = projects.map((p) => ({\n name: `${p.name} ${pc.gray(`(${p.agentCount} agents, last modified ${formatDate(p.lastModifiedAt)})`)}`,\n value: p,\n short: p.name\n }));\n\n let selectedProject: any;\n if (options.project) {\n selectedProject = projects.find((p) => p.id === options.project || p.slug === options.project);\n } else {\n const choices: any[] = [\n ...projectChoices,\n new Separator(),\n { name: pc.yellow('Done exploring'), value: 'DONE' }\n ];\n selectedProject = await select({\n message: 'Select a project to explore:',\n choices\n });\n }\n\n if (selectedProject === 'DONE') {\n exploring = false;\n break;\n }\n\n if (!selectedProject) {\n console.log(pc.red('Project not found'));\n continue;\n }\n\n // Fetch agents for selected project\n const agentSpinner = ora(`Fetching agents for ${selectedProject.name}...`).start();\n const agentsResponse = await apiClient.getProjectAgents(selectedProject.id);\n const agents = agentsResponse;\n agentSpinner.succeed(`Found ${agents.agents.length} agents`);\n\n // Display agents with folder paths\n console.log(pc.bold(`\\nš ${selectedProject.name}\\n`));\n \n agents.agents.forEach((agent) => {\n const isPublished = agent.isPublished \n ? pc.green('ā') \n : pc.gray('ā');\n const versionInfo = `${agent.version} ${pc.gray(`(${agents.versionResolution.source})`)}`;\n \n console.log(` ${isPublished} ${pc.cyan(agent.name)}`);\n console.log(` ${pc.gray('Path:')} ${agent.folderPath}`);\n console.log(` ${pc.gray('Version:')} ${versionInfo}`);\n console.log(` ${pc.gray('Tools:')} ${agent.toolCount}`);\n if (agents.versionResolution.source !== 'PRODUCTION') {\n console.log(` ${pc.yellow('ā ')} ${agents.versionResolution.note}`);\n }\n console.log();\n });\n\n // Agent selection\n const currentlyTracked = await projectTracker.getTrackedAgents(selectedProject.id);\n const trackedIds = new Set(currentlyTracked.map(a => a.agentId));\n\n const selectedAgentIds = await checkbox({\n message: 'Select agents to track (space to toggle, enter to confirm):',\n choices: agents.agents.map((agent) => ({\n name: `${agent.name} ${pc.gray(`(${agent.folderPath})`)}`,\n value: agent.id,\n checked: trackedIds.has(agent.id)\n }))\n });\n\n // Update tracking - IMMEDIATE AUTO-SAVE\n if (selectedAgentIds.length > 0) {\n const selectedAgents = agents.agents.filter((a) => selectedAgentIds.includes(a.id));\n try {\n await projectTracker.trackProject(selectedProject, selectedAgents);\n console.log(pc.green(`\\nā Auto-saved: Tracking ${selectedAgents.length} agents from ${selectedProject.name}`));\n } catch (error) {\n console.error(pc.red(`\\nā Failed to save tracking: ${(error as Error).message}`));\n throw error; // RETHROW - don't silently fail\n }\n } else {\n try {\n await projectTracker.untrackProject(selectedProject.id);\n console.log(pc.yellow(`\\nā Auto-saved: No longer tracking ${selectedProject.name}`));\n } catch (error) {\n console.error(pc.red(`\\nā Failed to untrack: ${(error as Error).message}`));\n throw error; // RETHROW - don't silently fail\n }\n }\n\n // Continue?\n if (!options.project) {\n const continueExploring = await confirm({\n message: 'Explore another project?',\n default: true\n });\n if (!continueExploring) exploring = false;\n } else {\n exploring = false;\n }\n }\n\n // Summary\n const summary = await projectTracker.getSummary();\n console.log(pc.bold('\\nš Tracking Summary\\n'));\n console.log(` Projects: ${summary.projectCount}`);\n console.log(` Agents: ${summary.agentCount}`);\n console.log(pc.gray('\\nRun `porchestra pull` to generate code for tracked agents\\n'));\n\n } catch (error) {\n spinner.fail('Failed to fetch projects');\n console.error(pc.red(`\\nā ${(error as Error).message}`));\n process.exit(1);\n }\n });\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from './core/config/config-manager.js';\nimport { AuthService } from './core/auth/auth-service.js';\nimport { TokenManager } from './core/auth/token-manager.js';\nimport { ApiClient } from './core/api/client.js';\nimport { CodeGenerator } from './core/generators/code-generator.js';\nimport { createLoginCommand } from './commands/login.js';\nimport { createLogoutCommand } from './commands/logout.js';\nimport { createWhoamiCommand } from './commands/whoami.js';\nimport { createExploreCommand } from './commands/explore.js';\nimport { createPullCommand } from './commands/pull.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createStatusCommand } from './commands/status.js';\nimport { createAgentsCommand } from './commands/agents.js';\nimport { PorchestraError } from './utils/errors.js';\n\nconst packageJson = { version: '1.0.0' };\n\n// Global error handlers\nprocess.on('unhandledRejection', (error) => {\n console.error(pc.red('\\nā Unexpected error:'));\n console.error(error);\n process.exit(1);\n});\n\nprocess.on('uncaughtException', (error) => {\n console.error(pc.red('\\nā Fatal error:'));\n console.error(error);\n process.exit(1);\n});\n\nasync function main() {\n // Initialize core services\n const configManager = new ConfigManager();\n const authService = new AuthService(configManager);\n // TokenManager is available for future token operations\n new TokenManager(configManager);\n const apiClient = new ApiClient(configManager);\n const codeGenerator = new CodeGenerator();\n\n // Check token expiration and refresh if needed\n await authService.checkAndRefreshTokenIfNeeded();\n\n // Create CLI program\n const program = new Command()\n .name('porchestra')\n .description('CLI for Porchestra - Generate LLM tool handlers')\n .version(packageJson.version)\n .configureOutput({\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(pc.red(str))\n });\n\n // Add global options\n program\n .option('--api-url <url>', 'Override API URL')\n .option('--config-dir <dir>', 'Override config directory');\n\n // Register commands\n program.addCommand(createLoginCommand(configManager, authService));\n program.addCommand(createLogoutCommand(configManager, authService));\n program.addCommand(createWhoamiCommand(configManager, authService));\n program.addCommand(createExploreCommand(configManager, apiClient));\n program.addCommand(createPullCommand(configManager, apiClient, codeGenerator));\n program.addCommand(createConfigCommand(configManager));\n program.addCommand(createStatusCommand(configManager));\n program.addCommand(createAgentsCommand(configManager));\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n if (error instanceof PorchestraError) {\n console.error(pc.red(`\\nā ${error.message}`));\n if (process.env.DEBUG) {\n console.error(pc.gray(error.stack));\n }\n } else {\n console.error(pc.red(`\\nā Unexpected error: ${(error as Error).message}`));\n }\n process.exit(1);\n});\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { z } from 'zod';\nimport { CliConfig, CliConfigSchema } from './config-schema.js';\n\nconst DEFAULT_CONFIG_DIR = path.join(os.homedir(), '.porchestra');\nconst CONFIG_FILE = 'config.json';\n\nexport class ConfigManager {\n private configPath: string;\n private config: CliConfig | null = null;\n\n constructor() {\n const configDir = process.env.PORCHESTRA_CONFIG_DIR || DEFAULT_CONFIG_DIR;\n this.configPath = path.join(configDir, CONFIG_FILE);\n }\n\n async load(): Promise<CliConfig> {\n try {\n const data = await fs.readFile(this.configPath, 'utf-8');\n const parsed = JSON.parse(data);\n \n // STRICT VALIDATION - throws on error\n const validated = CliConfigSchema.parse(parsed);\n this.config = validated;\n return validated;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Return default config\n const defaultConfig = { version: '1.0.0' } as const;\n this.config = CliConfigSchema.parse(defaultConfig);\n return this.config;\n }\n \n // THROW on validation errors\n if (error instanceof z.ZodError) {\n console.error('ā Config validation failed:');\n error.errors.forEach((err) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n throw new Error(`Invalid config file at ${this.configPath}. Please run 'porchestra config reset' to fix.`);\n }\n \n throw error;\n }\n }\n\n async save(config: CliConfig): Promise<void> {\n try {\n // STRICT VALIDATION before save\n const validated = CliConfigSchema.parse(config);\n \n // Ensure directory exists\n const configDir = path.dirname(this.configPath);\n await fs.mkdir(configDir, { recursive: true });\n \n // Atomic write (write to temp, then rename)\n const tempPath = `${this.configPath}.tmp`;\n await fs.writeFile(\n tempPath,\n JSON.stringify(validated, null, 2),\n 'utf-8'\n );\n await fs.rename(tempPath, this.configPath);\n \n this.config = validated;\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('ā Config validation failed on save:');\n error.errors.forEach((err) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n throw new Error('Failed to save config: validation error');\n }\n throw error;\n }\n }\n\n async get(): Promise<CliConfig> {\n if (!this.config) {\n return this.load();\n }\n return this.config;\n }\n\n async update(updater: (config: CliConfig) => CliConfig): Promise<void> {\n const config = await this.get();\n const updated = updater({ ...config }); // Create new object\n await this.save(updated);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.configPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n this.config = null;\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n}\n","import { z } from 'zod';\n\n// Simplified datetime validation - just accepts any string\nconst DateTimeStringSchema = z.string().optional();\n\nexport const TrackedAgentSchema = z.object({\n agentId: z.string().uuid(),\n agentName: z.string(),\n agentSlug: z.string(),\n folderPath: z.string(),\n selectedAt: DateTimeStringSchema,\n lastPulledAt: DateTimeStringSchema.optional(),\n lastPulledVersion: z.string().optional(),\n});\n\nexport const TrackedProjectSchema = z.object({\n projectId: z.string().uuid(),\n projectName: z.string(),\n projectSlug: z.string(),\n selectedAt: DateTimeStringSchema,\n agents: z.array(TrackedAgentSchema),\n lastPulledAt: DateTimeStringSchema.optional(),\n});\n\nexport const CliConfigSchema = z.object({\n auth: z.object({\n token: z.string().optional(),\n tokenId: z.string().uuid().optional(),\n expiresAt: DateTimeStringSchema.optional(),\n deviceName: z.string().optional(),\n }).optional(),\n \n api: z.object({\n baseUrl: z.string().url().default('https://api.porchestra.io/v1'),\n skipTlsVerify: z.boolean().default(false),\n }).default({}),\n \n trackedProjects: z.array(TrackedProjectSchema).default([]),\n \n output: z.object({\n baseDir: z.string().default('./src/agents'),\n createIndexFiles: z.boolean().default(true),\n }).default({}),\n \n cli: z.object({\n lastLoginAt: DateTimeStringSchema.optional(),\n lastVersionCheck: DateTimeStringSchema.optional(),\n latestKnownVersion: z.string().optional(),\n }).optional(),\n \n version: z.literal('1.0.0'),\n});\n\nexport type TrackedAgent = z.infer<typeof TrackedAgentSchema>;\nexport type TrackedProject = z.infer<typeof TrackedProjectSchema>;\nexport type CliConfig = z.infer<typeof CliConfigSchema>;\n","export class PorchestraError extends Error {\n constructor(message: string, public code: string) {\n super(message);\n this.name = 'PorchestraError';\n }\n}\n\nexport class AuthenticationError extends PorchestraError {\n constructor(message: string, public retryable = false) {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NetworkError extends PorchestraError {\n constructor(\n message: string,\n public statusCode?: number,\n public retryable = true\n ) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n }\n}\n\nexport class ValidationError extends PorchestraError {\n constructor(message: string, public field?: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n\nexport class FileSystemError extends PorchestraError {\n constructor(message: string, public path: string) {\n super(message, 'FS_ERROR');\n this.name = 'FileSystemError';\n }\n}\n","import { ConfigManager } from '../config/config-manager.js';\nimport { AuthenticationError, NetworkError } from '../../utils/errors.js';\nimport {\n ApiResponse,\n CliTokenResponse,\n CliTokenRefreshResponse,\n CliTokenRevokeResponse,\n UserInfo,\n} from '../../types/index.js';\nimport got from 'got';\nimport os from 'os';\n\ninterface LoginCredentials {\n email: string;\n password: string;\n apiUrl?: string;\n deviceName?: string;\n skipTlsVerify?: boolean;\n}\n\nexport class AuthService {\n private configManager: ConfigManager;\n\n constructor(configManager: ConfigManager) {\n this.configManager = configManager;\n }\n\n async login(credentials: LoginCredentials): Promise<CliTokenResponse> {\n const config = await this.configManager.get();\n const baseUrl = credentials.apiUrl || config.api?.baseUrl || 'https://api.porchestra.io/v1';\n \n const deviceInfo = {\n os: os.platform(),\n version: os.release(),\n cliVersion: '1.0.0',\n };\n\n const deviceName = credentials.deviceName || `${os.hostname()} - ${deviceInfo.os}`;\n\n try {\n const response = await got.post(`${baseUrl}/cli/login`, {\n json: {\n email: credentials.email,\n password: credentials.password,\n deviceName,\n deviceInfo,\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n https: {\n rejectUnauthorized: !credentials.skipTlsVerify,\n },\n }).json<ApiResponse<CliTokenResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode) {\n if (error.response.statusCode === 401) {\n throw new AuthenticationError('Invalid email or password');\n }\n throw new AuthenticationError(`Login failed: ${error.message}`);\n }\n if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND' || error.code === 'ETIMEDOUT') {\n throw new NetworkError(`Network error: ${error.message}`);\n }\n throw error;\n }\n }\n\n async refreshToken(tokenId: string, currentToken: string): Promise<CliTokenRefreshResponse> {\n const config = await this.configManager.get();\n const baseUrl = config.api?.baseUrl || 'https://api.porchestra.io/v1';\n\n try {\n const response = await got.post(`${baseUrl}/cli/token/refresh`, {\n json: {\n tokenId,\n currentToken,\n },\n headers: {\n 'Authorization': `Bearer ${currentToken}`,\n 'Content-Type': 'application/json',\n },\n }).json<ApiResponse<CliTokenRefreshResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token refresh failed. Please login again.');\n }\n throw error;\n }\n }\n\n async revokeToken(token: string, revokeAll = false): Promise<CliTokenRevokeResponse> {\n const config = await this.configManager.get();\n const baseUrl = config.api?.baseUrl || 'https://api.porchestra.io/v1';\n\n try {\n const response = await got.delete(`${baseUrl}/cli/token`, {\n json: {\n revokeAll,\n },\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n }).json<ApiResponse<CliTokenRevokeResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token already revoked or invalid');\n }\n throw error;\n }\n }\n\n async getCurrentUser(token: string): Promise<UserInfo> {\n const config = await this.configManager.get();\n const baseUrl = config.api?.baseUrl || 'https://api.porchestra.io/v1';\n\n try {\n const response = await got.get(`${baseUrl}/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n }).json<ApiResponse<UserInfo>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token is invalid or expired');\n }\n throw error;\n }\n }\n\n async checkAndRefreshTokenIfNeeded(): Promise<boolean> {\n const config = await this.configManager.get();\n \n if (!config.auth?.token || !config.auth?.tokenId || !config.auth?.expiresAt) {\n return false;\n }\n\n const expiresAt = new Date(config.auth.expiresAt);\n const now = new Date();\n const sevenDaysFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);\n\n // If token expires within 7 days, refresh it\n if (expiresAt < sevenDaysFromNow) {\n try {\n const refreshed = await this.refreshToken(\n config.auth.tokenId,\n config.auth.token\n );\n\n await this.configManager.update((cfg) => ({\n ...cfg,\n auth: {\n ...cfg.auth,\n token: refreshed.token,\n expiresAt: refreshed.expiresAt,\n },\n }));\n\n return true;\n } catch {\n return false;\n }\n }\n\n return true;\n }\n}\n","import { ConfigManager } from '../config/config-manager.js';\n\nexport class TokenManager {\n constructor(private configManager: ConfigManager) {}\n\n async getToken(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.token;\n }\n\n async getTokenId(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.tokenId;\n }\n\n async getExpiresAt(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.expiresAt;\n }\n\n async isAuthenticated(): Promise<boolean> {\n const token = await this.getToken();\n if (!token) return false;\n\n const expiresAt = await this.getExpiresAt();\n if (!expiresAt) return false;\n\n const expiryDate = new Date(expiresAt);\n return expiryDate > new Date();\n }\n\n async getDaysUntilExpiry(): Promise<number | null> {\n const expiresAt = await this.getExpiresAt();\n if (!expiresAt) return null;\n\n const expiryDate = new Date(expiresAt);\n const now = new Date();\n const diffMs = expiryDate.getTime() - now.getTime();\n return Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n }\n\n async isExpiringSoon(days = 7): Promise<boolean> {\n const daysUntilExpiry = await this.getDaysUntilExpiry();\n if (daysUntilExpiry === null) return false;\n return daysUntilExpiry <= days;\n }\n}\n","import got from 'got';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { NetworkError, AuthenticationError } from '../../utils/errors.js';\nimport {\n ProjectsBriefResponse,\n AgentsListResponse,\n AgentToolsResponse,\n UserInfo,\n CliConfigResponse,\n ApiResponse,\n} from '../../types/index.js';\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 1000;\n\ninterface RequestOptions {\n method: 'GET' | 'POST' | 'DELETE';\n headers?: Record<string, string>;\n}\n\nexport class ApiClient {\n private configManager: ConfigManager;\n\n constructor(configManager: ConfigManager) {\n this.configManager = configManager;\n }\n\n private async getBaseUrl(): Promise<string> {\n const config = await this.configManager.get();\n return config.api?.baseUrl || 'https://api.porchestra.io/v1';\n }\n\n private async getToken(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.token;\n }\n\n private async requestWithRetry<T>(\n url: string,\n options: RequestOptions,\n attempt = 1\n ): Promise<T> {\n try {\n const token = await this.getToken();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers || {}),\n };\n\n const response = await got(url, {\n method: options.method,\n headers,\n retry: { limit: 0 },\n }).json<ApiResponse<T>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Authentication failed. Please login again.');\n }\n\n const isRetryable =\n error.code === 'ECONNRESET' ||\n error.code === 'ETIMEDOUT' ||\n error.code === 'ENOTFOUND' ||\n (error.response?.statusCode && error.response.statusCode >= 500);\n\n if (isRetryable && attempt < MAX_RETRIES) {\n await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * attempt));\n return this.requestWithRetry(url, options, attempt + 1);\n }\n\n throw new NetworkError(\n `API request failed: ${error.message}`,\n error.response?.statusCode,\n isRetryable\n );\n }\n }\n\n async getProjectsBrief(): Promise<ProjectsBriefResponse> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<ProjectsBriefResponse>(\n `${baseUrl}/projects/brief`,\n { method: 'GET' }\n );\n }\n\n async getProjectAgents(\n projectId: string,\n environment?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT'\n ): Promise<AgentsListResponse> {\n const baseUrl = await this.getBaseUrl();\n const query = environment ? `?environment=${environment}` : '';\n return this.requestWithRetry<AgentsListResponse>(\n `${baseUrl}/projects/${projectId}/agents${query}`,\n { method: 'GET' }\n );\n }\n\n async getAgentTools(\n projectId: string,\n agentId: string,\n environment?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT'\n ): Promise<AgentToolsResponse> {\n const baseUrl = await this.getBaseUrl();\n const query = environment ? `?environment=${environment}` : '';\n return this.requestWithRetry<AgentToolsResponse>(\n `${baseUrl}/projects/${projectId}/agents/${agentId}/tools${query}`,\n { method: 'GET' }\n );\n }\n\n async getCurrentUser(token: string): Promise<UserInfo> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<UserInfo>(\n `${baseUrl}/auth/me`,\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${token}` },\n }\n );\n }\n\n async getCliConfig(): Promise<CliConfigResponse> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<CliConfigResponse>(\n `${baseUrl}/cli/config`,\n { method: 'GET' }\n );\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport Handlebars from 'handlebars';\nimport { calculateAgentOutputPath } from '../../utils/path-utils.js';\nimport { AgentToolsResponse } from '../../types/index.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface GenerateOptions {\n agent: AgentToolsResponse['agent'];\n tools: AgentToolsResponse['tools'];\n components: AgentToolsResponse['components'];\n outputDir: string;\n forceOverwrite: boolean;\n}\n\ninterface ToolData {\n name: string;\n description: string;\n parameters: object;\n returns: object | null;\n isBuiltin?: boolean;\n builtinType?: string;\n}\n\ninterface TemplateData {\n agentName: string;\n version: string;\n generatedAt: string;\n tools: ToolData[];\n variableSchema: object | null;\n inputSchema: object | null;\n responseSchema: object | null;\n responseJsonSchema: object;\n}\n\n// Register Handlebars helpers\nHandlebars.registerHelper('pascalCase', function(str: string) {\n return str\n .replace(/[-_\\s](.)/g, (_, char) => char.toUpperCase())\n .replace(/^(.)/, (_, char) => char.toUpperCase());\n});\n\nHandlebars.registerHelper('camelCase', function(str: string) {\n return str\n .replace(/[-_\\s](.)/g, (_, char) => char.toUpperCase())\n .replace(/^(.)/, (_, char) => char.toLowerCase());\n});\n\nHandlebars.registerHelper('zodType', function(schema: any) {\n return jsonSchemaToZodType(schema);\n});\n\nHandlebars.registerHelper('json', function(value: any) {\n return JSON.stringify(value ?? {}, null, 2);\n});\n\nfunction normalizeSchemaContent(content: unknown): any {\n if (typeof content === 'string') {\n try {\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n }\n return content;\n}\n\nfunction buildVariableJsonSchemaFromDefinitions(defs: any[]): object {\n const schema: any = {\n type: 'object',\n properties: {},\n required: [] as string[],\n };\n\n const ensureObjectSchema = (target: any, key: string) => {\n if (!target.properties[key]) {\n target.properties[key] = { type: 'object', properties: {}, required: [] as string[] };\n }\n return target.properties[key];\n };\n\n const toJsonSchema = (def: any): any => {\n const type = def?.type;\n if (type === 'enum') {\n return {\n type: 'string',\n enum: def?.validation?.options ?? [],\n };\n }\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return { type };\n }\n if (type === 'array') {\n return { type: 'array', items: {} };\n }\n if (type === 'object') {\n return { type: 'object', properties: {} };\n }\n return {};\n };\n\n for (const def of defs) {\n if (!def?.path || typeof def.path !== 'string') continue;\n const pathParts = def.path.split('.').filter(Boolean);\n if (pathParts.length === 0) continue;\n\n let curr = schema;\n for (let i = 0; i < pathParts.length; i++) {\n const key = pathParts[i];\n const isLeaf = i === pathParts.length - 1;\n if (isLeaf) {\n curr.properties[key] = toJsonSchema(def);\n if (def?.validation?.required !== false) {\n curr.required.push(key);\n }\n } else {\n curr = ensureObjectSchema(curr, key);\n }\n }\n }\n\n if (schema.required.length === 0) delete schema.required;\n return schema;\n}\n\nfunction jsonSchemaToZodType(schema: any): string {\n if (!schema) return 'z.any()';\n\n switch (schema.type) {\n case 'string': {\n let zod = 'z.string()';\n if (schema.minLength) zod += `.min(${schema.minLength})`;\n if (schema.maxLength) zod += `.max(${schema.maxLength})`;\n if (schema.pattern) zod += `.regex(/${schema.pattern}/)`;\n if (schema.enum) zod = `z.enum([${schema.enum.map((e: string) => `'${e}'`).join(', ')}])`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'number':\n case 'integer': {\n let zod = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n if (schema.minimum !== undefined) zod += `.min(${schema.minimum})`;\n if (schema.maximum !== undefined) zod += `.max(${schema.maximum})`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'boolean': {\n let zod = 'z.boolean()';\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'array': {\n const itemType = jsonSchemaToZodType(schema.items);\n let zod = `z.array(${itemType})`;\n if (schema.minItems) zod += `.min(${schema.minItems})`;\n if (schema.maxItems) zod += `.max(${schema.maxItems})`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'object': {\n if (!schema.properties) return 'z.record(z.any())';\n \n const required = new Set(schema.required || []);\n const props = Object.entries(schema.properties).map(([key, prop]: [string, any]) => {\n const propType = jsonSchemaToZodType(prop);\n const isRequired = required.has(key);\n const formattedKey = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n return ` ${formattedKey}: ${isRequired ? propType : `${propType}.optional()`}`;\n });\n \n let zod = `z.object({\\n${props.join(',\\n')}\\n})`;\n if (schema.additionalProperties === false) zod += '.strict()';\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n default:\n return 'z.any()';\n }\n}\n\nexport class CodeGenerator {\n private schemasTemplate: Handlebars.TemplateDelegate;\n private toolsTemplate: Handlebars.TemplateDelegate;\n private indexTemplate: Handlebars.TemplateDelegate;\n\n constructor() {\n this.schemasTemplate = Handlebars.compile(schemasTemplateSource);\n this.toolsTemplate = Handlebars.compile(toolsTemplateSource);\n this.indexTemplate = Handlebars.compile(indexTemplateSource);\n }\n\n async generate(options: GenerateOptions): Promise<void> {\n const { agent, tools, components, outputDir } = options;\n\n await fs.mkdir(outputDir, { recursive: true });\n\n const responseJsonSchema = (components?.responseSchema?.content as object) || {};\n\n const rawVariableSchema = normalizeSchemaContent(components?.variableSchema?.content);\n const resolvedVariableSchema = Array.isArray(rawVariableSchema)\n ? buildVariableJsonSchemaFromDefinitions(rawVariableSchema)\n : (rawVariableSchema as object) || null;\n\n const templateData: TemplateData = {\n agentName: agent?.name || 'Unknown Agent',\n version: agent?.version || 'unknown',\n generatedAt: new Date().toISOString(),\n tools: (tools || [])\n .filter(t => t && !t.isBuiltin && typeof t.name === 'string' && t.name.length > 0)\n .map(t => ({\n name: t.name,\n description: t.description || '',\n parameters: t.parameters || {},\n returns: t.returns ?? null,\n isBuiltin: t.isBuiltin,\n builtinType: t.builtinType,\n })),\n variableSchema: resolvedVariableSchema,\n inputSchema: (components?.inputSchema?.content as object) || null,\n responseSchema: (components?.responseSchema?.content as object) || null,\n responseJsonSchema,\n };\n\n // Generate ast.json (always overwrite)\n const astPath = path.join(outputDir, 'ast.json');\n const astContent = JSON.stringify(components?.ast?.content ?? {}, null, 2);\n await fs.writeFile(astPath, astContent, 'utf-8');\n\n // Generate config.ts (always overwrite)\n const configPath = path.join(outputDir, 'config.ts');\n const configContent = `/**\n * Auto-generated model config for ${templateData.agentName}\n * Generated: ${templateData.generatedAt}\n * Version: ${templateData.version}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nexport const ModelConfig = ${JSON.stringify(components?.modelConfig?.content ?? {}, null, 2)} as const;\n`;\n await fs.writeFile(configPath, configContent, 'utf-8');\n\n // Generate schemas.ts (always overwrite)\n const schemasPath = path.join(outputDir, 'schemas.ts');\n const schemasContent = this.schemasTemplate(templateData);\n await fs.writeFile(schemasPath, schemasContent, 'utf-8');\n\n // Generate tools.ts (always overwrite)\n const toolsPath = path.join(outputDir, 'tools.ts');\n const toolsContent = this.toolsTemplate(templateData);\n await fs.writeFile(toolsPath, toolsContent, 'utf-8');\n\n // Generate index.ts (always overwrite)\n const indexPath = path.join(outputDir, 'index.ts');\n const indexContent = this.indexTemplate(templateData);\n await fs.writeFile(indexPath, indexContent, 'utf-8');\n }\n\n calculateOutputPath(baseDir: string, folderPath: string, agentName: string): string {\n return calculateAgentOutputPath(baseDir, folderPath, agentName);\n }\n}\n\n// Template sources\nconst schemasTemplateSource = `/**\n * Auto-generated Zod schemas for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { z } from 'zod';\n\n// 1. System Prompt Variables\nexport const VariableSchema = {{{zodType variableSchema}}};\nexport type AgentVariables = z.infer<typeof VariableSchema>;\n\n// 2. User Input\nexport const InputSchema = {{{zodType inputSchema}}};\nexport type AgentInput = z.infer<typeof InputSchema>;\n\n// 3. Model Response\nexport const ResponseSchema = {{{zodType responseSchema}}};\nexport type AgentResponse = z.infer<typeof ResponseSchema>;\n\n// 4. Raw JSON Schema (for LLM Provider 'response_format')\nexport const ResponseJsonSchema = {{{json responseJsonSchema}}} as const;\n`;\n\nconst toolsTemplateSource = `/**\n * Auto-generated tools for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { z } from 'zod';\n\n{{#each tools}}\n// Schema for {{name}}\nexport const {{pascalCase name}}Params = {{{zodType parameters}}};\nexport type {{pascalCase name}}ParamsType = z.infer<typeof {{pascalCase name}}Params>;\n\n{{/each}}\n// The Interface the user MUST implement\nexport interface ToolImplementation {\n{{#each tools}}\n {{camelCase name}}: (args: {{pascalCase name}}ParamsType) => Promise<unknown>;\n{{/each}}\n}\n\n// Raw Tool Definitions for provider SDKs\nexport const ToolDefinitions = [\n{{#each tools}}\n {\n name: '{{name}}',\n description: {{{json description}}},\n parameters: {{{json parameters}}},\n },\n{{/each}}\n] as const;\n\n// Dispatcher with validation\nexport async function dispatch(\n name: string,\n args: unknown,\n impl: ToolImplementation\n): Promise<unknown> {\n switch (name) {\n {{#each tools}}\n case '{{name}}':\n return await impl.{{camelCase name}}({{pascalCase name}}Params.parse(args));\n {{/each}}\n default:\n throw new Error(\\`Unknown tool: \\${name}\\`);\n }\n}\n`;\n\nconst indexTemplateSource = `/**\n * Auto-generated Agent class for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { PorchestraRuntime } from '@porchestra/core';\nimport rawAst from './ast.json';\nimport { ModelConfig } from './config.js';\nimport * as Schemas from './schemas.js';\nimport * as Tools from './tools.js';\n\nexport class {{pascalCase agentName}}Agent {\n /**\n * @param tools - The implementation of the tool logic. Required if the agent uses tools.\n */\n constructor(private readonly tools?: Tools.ToolImplementation) {}\n\n /**\n * Renders the System Prompt.\n * Throws ZodError if variables are invalid.\n */\n public renderPrompt(variables: Schemas.AgentVariables): string {\n const safeVars = Schemas.VariableSchema.parse(variables);\n return PorchestraRuntime.render(rawAst as any, safeVars);\n }\n\n /**\n * Routes an LLM Tool Call to your implementation.\n * Validates arguments automatically.\n */\n public async handleTool(name: string, args: unknown): Promise<unknown> {\n if (!this.tools) {\n throw new Error('No tool implementation provided to Agent constructor.');\n }\n return Tools.dispatch(name, args, this.tools);\n }\n\n /** Validates User Input (e.g. from API Request) */\n public static validateInput(data: unknown): Schemas.AgentInput {\n return Schemas.InputSchema.parse(data);\n }\n\n /** Validates LLM Output (Post-generation check) */\n public static validateResponse(data: unknown): Schemas.AgentResponse {\n return Schemas.ResponseSchema.parse(data);\n }\n\n /** Get Provider Configuration */\n public static get config() {\n return ModelConfig;\n }\n\n /** Get Tool Definitions for the LLM Provider */\n public static get toolDefinitions() {\n return Tools.ToolDefinitions;\n }\n\n /** Get JSON Schema for Structured Outputs */\n public static get responseFormat() {\n return Schemas.ResponseJsonSchema;\n }\n}\n`;\n","import path from 'path';\nimport { promises as fs } from 'fs';\n\nexport function normalizeFolderPath(folderPath: string): string {\n let normalized = folderPath.replace(/^\\//, '');\n normalized = normalized.replace(/\\/+/g, '/');\n normalized = normalized\n .split('/')\n .map(segment => sanitizePathSegment(segment))\n .join('/');\n normalized = normalized.replace(/\\/$/, '');\n return normalized;\n}\n\nfunction sanitizePathSegment(segment: string): string {\n return segment\n .replace(/[^a-zA-Z0-9-_]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-');\n}\n\nexport function calculateOutputPath(\n baseDir: string,\n folderPath: string,\n filename?: string\n): string {\n const normalized = normalizeFolderPath(folderPath);\n const fullPath = path.join(baseDir, normalized);\n return filename ? path.join(fullPath, filename) : fullPath;\n}\n\nexport function calculateAgentOutputPath(\n baseDir: string,\n folderPath: string,\n agentName: string,\n filename?: string\n): string {\n const normalizedFolder = normalizeFolderPath(folderPath);\n const normalizedAgent = sanitizePathSegment(agentName);\n const fullPath = path.join(baseDir, normalizedFolder, normalizedAgent);\n return filename ? path.join(fullPath, filename) : fullPath;\n}\n\nexport async function ensureDirectory(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { input, password } from '@inquirer/prompts';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { AuthService } from '../core/auth/auth-service.js';\n\ninterface LoginOptions {\n apiUrl?: string;\n skipTlsVerify?: boolean;\n}\n\nexport function createLoginCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n return new Command('login')\n .description('Authenticate with your Porchestra account')\n .option('--api-url <url>', 'Override API URL')\n .option('--skip-tls-verify', 'Skip TLS certificate verification (insecure)')\n .action(async (options: LoginOptions) => {\n console.log(pc.bold('\\n \\uD83D\\uDD10 Porchestra CLI Login\\n'));\n\n const apiUrl = options.apiUrl || process.env.PORCHESTRA_API_URL;\n \n if (options.skipTlsVerify) {\n console.log(pc.yellow('\\n \\u26A0\\uFE0F WARNING: TLS verification disabled. Not recommended for production.\\n'));\n }\n\n const email = await input({\n message: ' Email:',\n validate: (value) => value.includes('@') || 'Please enter a valid email'\n });\n\n const pwd = await password({\n message: ' Password:',\n mask: '*'\n });\n\n try {\n const result = await authService.login({\n email,\n password: pwd,\n apiUrl,\n skipTlsVerify: options.skipTlsVerify\n });\n\n // DEBUG: Log raw API response\n console.log(pc.yellow('\\n [DEBUG] Raw API response:'));\n console.log(pc.yellow(` token: ${result.token?.substring(0, 20)}...`));\n console.log(pc.yellow(` tokenId: ${result.tokenId}`));\n console.log(pc.yellow(` expiresAt: ${result.expiresAt}`));\n console.log(pc.yellow(` issuedAt: ${result.issuedAt}`));\n console.log(pc.yellow(` deviceName: ${result.deviceName}`));\n\n try {\n await configManager.update((cfg) => ({\n ...cfg,\n auth: {\n token: result.token,\n tokenId: result.tokenId,\n expiresAt: result.expiresAt,\n deviceName: result.deviceName\n },\n api: {\n baseUrl: apiUrl || cfg.api?.baseUrl || 'https://api.porchestra.io/v1',\n skipTlsVerify: options.skipTlsVerify || false\n },\n cli: {\n ...cfg.cli,\n lastLoginAt: new Date().toISOString()\n }\n }));\n \n // DEBUG: Verify config was saved\n const savedConfig = await configManager.get();\n console.log(pc.yellow('\\n [DEBUG] Saved config auth:'));\n console.log(pc.yellow(` ${JSON.stringify(savedConfig.auth, null, 2)}`));\n } catch (saveError) {\n console.error(pc.red('\\n [DEBUG] Save error:'), saveError);\n throw saveError;\n }\n\n const expiresAt = new Date(result.expiresAt);\n const daysUntilExpiry = Math.ceil((expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n\n console.log(pc.green(`\n ā Login successful\n `));\n console.log(pc.gray(` Token expires in ${daysUntilExpiry} days (${result.expiresAt})`));\n console.log(pc.gray(` Device: ${result.deviceName}`));\n if (apiUrl) {\n console.log(pc.gray(` API: ${apiUrl}`));\n }\n console.log(pc.gray(` Auto-refresh: 7 days before expiry`));\n console.log();\n } catch (error) {\n console.error(pc.red(`\\n \\u2717 Login failed: ${(error as Error).message}`));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { confirm } from '@inquirer/prompts';\nimport { AuthService } from '../core/auth/auth-service.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\n\ninterface LogoutOptions {\n all?: boolean;\n}\n\nexport function createLogoutCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n return new Command('logout')\n .description('Logout and revoke CLI token')\n .option('--all', 'Revoke all device tokens (logout everywhere)')\n .action(async (options: LogoutOptions) => {\n const config = await configManager.get();\n \n if (!config.auth?.token) {\n console.log(pc.yellow('Not currently logged in'));\n return;\n }\n\n if (options.all) {\n const confirmed = await confirm({\n message: 'This will revoke ALL your CLI tokens on ALL devices. Continue?',\n default: false\n });\n if (!confirmed) return;\n }\n\n try {\n // Revoke on server\n await authService.revokeToken(config.auth.token, options.all);\n \n // Clear local config\n await configManager.clear();\n\n if (options.all) {\n console.log(pc.green('ā Revoked all tokens and logged out all devices'));\n } else {\n console.log(pc.green('ā Logged out successfully'));\n }\n } catch (error) {\n // Even if server revoke fails, clear local config\n await configManager.clear();\n console.log(pc.yellow('ā Cleared local credentials (server revoke may have failed)'));\n }\n });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { AuthService } from '../core/auth/auth-service.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\n\nexport function createWhoamiCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('whoami')\n .description('Show current user and token information')\n .action(async () => {\n const config = await configManager.get();\n \n if (!config.auth?.token) {\n console.log(pc.yellow('Not logged in. Run `porchestra login`'));\n return;\n }\n\n try {\n const userInfo = await authService.getCurrentUser(config.auth.token);\n const expiresAt = new Date(config.auth.expiresAt!);\n const isExpiringSoon = expiresAt.getTime() - Date.now() < 7 * 24 * 60 * 60 * 1000;\n\n console.log(pc.bold('\\nš¤ User Information\\n'));\n console.log(` Email: ${pc.cyan(userInfo.email)}`);\n console.log(` Name: ${userInfo.name || 'N/A'}`);\n \n console.log(pc.bold('\\nš Token Information\\n'));\n console.log(` Device: ${config.auth.deviceName || 'N/A'}`);\n console.log(` Expires: ${isExpiringSoon ? pc.yellow(expiresAt.toISOString()) : pc.green(expiresAt.toISOString())}`);\n \n if (isExpiringSoon) {\n console.log(pc.yellow(' ā ļø Expires within 7 days - will auto-refresh'));\n }\n \n if (config.api?.baseUrl !== 'https://api.porchestra.io/v1') {\n console.log(pc.bold('\\nš API Configuration\\n'));\n console.log(` URL: ${config.api?.baseUrl}`);\n }\n\n // Show tracked projects summary\n const summary = await projectTracker.getSummary();\n console.log(pc.bold('\\nš Tracked Projects\\n'));\n console.log(` Projects: ${summary.projectCount}`);\n console.log(` Agents: ${summary.agentCount}`);\n\n } catch (error) {\n console.log(pc.red('Failed to fetch user info. Token may be invalid.'));\n console.log(pc.gray('Run `porchestra login` to re-authenticate.'));\n }\n });\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { ApiClient } from '../core/api/client.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { CodeGenerator } from '../core/generators/code-generator.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\n\ninterface PullOptions {\n project?: string;\n agent?: string;\n version?: string;\n env?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT';\n output?: string;\n force?: boolean;\n}\n\nexport function createPullCommand(\n configManager: ConfigManager,\n apiClient: ApiClient,\n codeGenerator: CodeGenerator\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('pull')\n .description('Generate tool code for tracked agents')\n .option('-p, --project <id>', 'Pull specific project only')\n .option('-a, --agent <id>', 'Pull specific agent only')\n .option('-e, --env <environment>', 'Target environment (production|staging|development)')\n .option('-o, --output <path>', 'Override output directory')\n .option('--force', 'Overwrite implementation files (WARNING: may lose code)')\n .action(async (options: PullOptions) => {\n // Check if logged in\n const config = await configManager.get();\n if (!config.auth?.token) {\n console.log(pc.red('Not logged in. Run `porchestra login` first.'));\n process.exit(1);\n }\n\n // Get tracked projects\n let trackedProjects = await projectTracker.getTrackedProjects();\n\n // Auto-trigger explore if no projects tracked\n if (trackedProjects.length === 0) {\n console.log(pc.yellow('\\nā No projects selected for tracking.\\n'));\n console.log(pc.gray('Starting project explorer...\\n'));\n \n // Import and run explore dynamically\n const { createExploreCommand } = await import('./explore.js');\n const exploreCmd = createExploreCommand(configManager, apiClient);\n // Execute the explore command to let user select projects\n await exploreCmd.parseAsync(['node', 'script', 'explore']);\n \n // Re-check tracking after explore\n trackedProjects = await projectTracker.getTrackedProjects();\n \n if (trackedProjects.length === 0) {\n console.log(pc.red('\\nā No projects selected. Run `porchestra explore` to select projects.'));\n process.exit(1);\n }\n }\n\n // Filter by options\n if (options.project) {\n trackedProjects = trackedProjects.filter(\n p => p.projectId === options.project || p.projectSlug === options.project\n );\n if (trackedProjects.length === 0) {\n console.log(pc.red(`Project \"${options.project}\" not found in tracked projects`));\n process.exit(1);\n }\n }\n\n // Pull each project\n const baseOutputDir = options.output || config.output?.baseDir || path.resolve(process.cwd(), 'src/porchestra/agents');\n let totalAgents = 0;\n let successCount = 0;\n\n for (const project of trackedProjects) {\n // Filter agents if specified\n let agents = project.agents;\n if (options.agent) {\n agents = agents.filter(\n a => a.agentId === options.agent || a.agentSlug === options.agent\n );\n }\n\n if (agents.length === 0) continue;\n\n console.log(pc.bold(`\\nš¦ ${project.projectName}\\n`));\n totalAgents += agents.length;\n\n // Process each agent with progress\n for (let i = 0; i < agents.length; i++) {\n const agent = agents[i];\n const progress = `[${i + 1}/${agents.length}]`;\n const spinner = ora(`${progress} Fetching ${agent.agentName}...`).start();\n\n try {\n // Fetch agent tools\n const toolsResponse = await apiClient.getAgentTools(\n project.projectId,\n agent.agentId,\n options.env\n );\n\n spinner.text = `${progress} Generating code...`;\n\n const normalizeToolset = (toolset: any[] = []) =>\n toolset.map((t, idx) => ({\n id: t.id ?? `toolset-${idx}`,\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? {},\n returns: t.returns ?? null,\n isBuiltin: t.isBuiltin ?? false,\n builtinType: t.builtinType,\n }));\n\n const rawToolConfig = toolsResponse?.components?.toolConfig?.content as any;\n const parsedToolConfig = (() => {\n if (typeof rawToolConfig === 'string') {\n try {\n return JSON.parse(rawToolConfig);\n } catch {\n return undefined;\n }\n }\n return rawToolConfig;\n })();\n\n const findToolArray = (value: any): any[] | undefined => {\n if (Array.isArray(value)) {\n const hasNamedObjects = value.every(v => v && typeof v === 'object' && 'name' in v);\n return hasNamedObjects ? value : undefined;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.toolset)) return value.toolset;\n if (Array.isArray(value.tools)) return value.tools;\n for (const key of Object.keys(value)) {\n const found = findToolArray((value as any)[key]);\n if (found) return found;\n }\n }\n return undefined;\n };\n\n const toolsetFromConfig = findToolArray(parsedToolConfig) ?? [];\n\n const resolvedTools = (toolsResponse?.tools && toolsResponse.tools.length > 0)\n ? toolsResponse.tools\n : (Array.isArray(toolsResponse?.toolset)\n ? normalizeToolset(toolsResponse.toolset)\n : normalizeToolset(toolsetFromConfig));\n\n if (!toolsResponse?.agent || !toolsResponse?.components) {\n throw new Error('Invalid tools response from API');\n }\n\n // Generate code\n const outputDir = codeGenerator.calculateOutputPath(\n baseOutputDir,\n agent.folderPath,\n toolsResponse.agent.name\n );\n\n await codeGenerator.generate({\n agent: toolsResponse.agent,\n tools: resolvedTools,\n components: toolsResponse.components,\n outputDir,\n forceOverwrite: options.force || false\n });\n\n spinner.succeed(`${progress} ${agent.agentName} ā ${pc.gray(outputDir)}`);\n successCount++;\n\n // Update last pulled info\n await projectTracker.updateLastPulled(\n project.projectId,\n agent.agentId,\n toolsResponse.agent.version\n );\n\n } catch (error) {\n spinner.fail(`${progress} ${agent.agentName}`);\n console.error(pc.red(` ā ${(error as Error).message}`));\n }\n }\n }\n\n // Summary\n console.log(pc.bold('\\n⨠Pull Complete\\n'));\n \n if (successCount === totalAgents) {\n console.log(` ${pc.green('ā')} Generated: ${successCount} / ${totalAgents} agents`);\n } else if (successCount > 0) {\n console.log(` ${pc.yellow('ā ')} Generated: ${successCount} / ${totalAgents} agents`);\n console.log(` ${pc.red('ā')} Failed: ${totalAgents - successCount} agents`);\n } else {\n console.log(` ${pc.red('ā')} Failed: All ${totalAgents} agents`);\n }\n \n console.log(` Output: ${pc.gray(baseOutputDir)}`);\n \n if (successCount > 0) {\n console.log(pc.gray('\\nNext steps:'));\n console.log(pc.gray(' 1. Implement tool functions in tool-impl.ts files'));\n console.log(pc.gray(' 2. Import and use the tool dispatcher in your code'));\n }\n \n console.log();\n \n // Exit with error if any agents failed\n if (successCount < totalAgents) {\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport pc from 'picocolors';\nimport { confirm } from '@inquirer/prompts';\n\nexport function createConfigCommand(configManager: ConfigManager): Command {\n const config = new Command('config')\n .description('Manage CLI configuration');\n\n config\n .command('get <key>')\n .description('Get a configuration value')\n .action(async (key: string) => {\n const cfg = await configManager.get();\n const value = getNestedValue(cfg, key);\n console.log(value !== undefined ? value : pc.gray('(not set)'));\n });\n\n config\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action(async (key: string, value: string) => {\n await configManager.update((cfg) => {\n return setNestedValue(cfg, key, parseValue(value));\n });\n console.log(pc.green(`ā Set ${key} = ${value}`));\n });\n\n config\n .command('list')\n .description('List all configuration values')\n .action(async () => {\n const cfg = await configManager.get();\n console.log(pc.bold('\\nConfiguration:'));\n printConfig(cfg);\n });\n\n config\n .command('reset')\n .description('Reset all configuration (WARNING: clears auth)')\n .option('--force', 'Skip confirmation')\n .action(async (options) => {\n if (!options.force) {\n const confirmed = await confirm({\n message: 'This will clear all config including login. Continue?',\n default: false\n });\n if (!confirmed) return;\n }\n await configManager.clear();\n console.log(pc.green('ā Configuration reset'));\n });\n\n return config;\n}\n\nfunction getNestedValue(obj: any, key: string): any {\n return key.split('.').reduce((o, k) => o?.[k], obj);\n}\n\nfunction setNestedValue(obj: any, key: string, value: any): any {\n const keys = key.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((o, k) => {\n if (!o[k]) o[k] = {};\n return o[k];\n }, obj);\n target[last] = value;\n return obj;\n}\n\nfunction parseValue(value: string): any {\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (!isNaN(Number(value))) return Number(value);\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction printConfig(obj: any, prefix = ''): void {\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n console.log(`\\n${pc.cyan(fullKey)}:`);\n printConfig(value, fullKey);\n } else {\n const displayValue = key.includes('token') \n ? pc.gray('***hidden***') \n : value;\n console.log(` ${fullKey} = ${displayValue}`);\n }\n }\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\nimport { formatDistanceToNow } from '../utils/date.js';\n\nexport function createStatusCommand(\n configManager: ConfigManager\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('status')\n .description('Show CLI status and tracked projects')\n .action(async () => {\n const config = await configManager.get();\n \n console.log(pc.bold('\\nš Porchestra CLI Status\\n'));\n\n // Auth status\n if (config.auth?.token) {\n const expiresAt = new Date(config.auth.expiresAt!);\n const daysUntilExpiry = Math.ceil(\n (expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24)\n );\n const expiryColor = daysUntilExpiry < 7 ? pc.yellow : pc.green;\n \n console.log(pc.bold('š Authentication'));\n console.log(` Status: ${pc.green('ā Logged in')}`);\n console.log(` Device: ${config.auth.deviceName}`);\n console.log(` Expires: ${expiryColor(daysUntilExpiry + ' days')} (${config.auth.expiresAt})`);\n } else {\n console.log(pc.bold('š Authentication'));\n console.log(` Status: ${pc.yellow('ā Not logged in')}`);\n console.log(pc.gray(' Run `porchestra login` to authenticate'));\n }\n\n // API Configuration\n console.log(pc.bold('\\nš API Configuration'));\n console.log(` URL: ${config.api?.baseUrl || pc.gray('(default)')}`);\n if (config.api?.skipTlsVerify) {\n console.log(pc.yellow(` ā ļø TLS verification disabled`));\n }\n\n // Tracked Projects\n const projects = await projectTracker.getTrackedProjects();\n console.log(pc.bold('\\nš Tracked Projects'));\n \n if (projects.length === 0) {\n console.log(pc.gray(' No projects tracked'));\n console.log(pc.gray(' Run `porchestra explore` to select projects'));\n } else {\n console.log(` Projects: ${projects.length}`);\n console.log(` Agents: ${projects.reduce((sum, p) => sum + p.agents.length, 0)}`);\n \n projects.forEach(project => {\n const lastPulled = project.lastPulledAt \n ? formatDistanceToNow(new Date(project.lastPulledAt))\n : pc.gray('never');\n \n console.log(pc.gray(`\\n ${project.projectName}`));\n project.agents.forEach(agent => {\n const agentPulled = agent.lastPulledAt\n ? formatDistanceToNow(new Date(agent.lastPulledAt))\n : pc.gray('pending');\n console.log(pc.gray(` āā ${agent.agentName} ${pc.cyan(agent.folderPath)} (${agentPulled})`));\n });\n console.log(pc.gray(` Last pulled: ${lastPulled}`));\n });\n }\n\n // Output Configuration\n console.log(pc.bold('\\nš Output Configuration'));\n console.log(` Base dir: ${config.output?.baseDir || './src/agents'}`);\n console.log(` Index files: ${config.output?.createIndexFiles ? 'yes' : 'no'}`);\n\n console.log();\n });\n}\n","import { Command } from 'commander';\r\nimport { select, confirm } from '@inquirer/prompts';\r\nimport pc from 'picocolors';\r\nimport { ConfigManager } from '../core/config/config-manager.js';\r\nimport { ProjectTracker } from '../core/config/project-tracker.js';\r\nimport { formatDistanceToNow } from '../utils/date.js';\r\n\r\ninterface ListOptions {\r\n project?: string;\r\n json?: boolean;\r\n}\r\n\r\ninterface RemoveOptions {\r\n project?: string;\r\n force?: boolean;\r\n}\r\n\r\nexport function createAgentsCommand(configManager: ConfigManager): Command {\r\n const projectTracker = new ProjectTracker(configManager);\r\n\r\n const listAction = async (options: ListOptions = {}) => {\r\n let projects = await projectTracker.getTrackedProjects();\r\n\r\n if (options.project) {\r\n projects = projects.filter(\r\n project => project.projectId === options.project || project.projectSlug === options.project\r\n );\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.red(`No tracked project found for \"${options.project}\"`));\r\n return;\r\n }\r\n }\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(projects, null, 2));\r\n return;\r\n }\r\n\r\n console.log(pc.bold('\\nš Tracked Agents\\n'));\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.gray(' No agents tracked. Run `porchestra explore` to add agents.'));\r\n console.log();\r\n return;\r\n }\r\n\r\n let totalAgents = 0;\r\n\r\n projects.forEach((project) => {\r\n totalAgents += project.agents.length;\r\n console.log(pc.bold(` ${project.projectName}`));\r\n\r\n project.agents.forEach((agent) => {\r\n const lastPulled = agent.lastPulledAt\r\n ? formatDistanceToNow(new Date(agent.lastPulledAt))\r\n : 'pending';\r\n const version = agent.lastPulledVersion ? ` @ ${agent.lastPulledVersion}` : '';\r\n\r\n console.log(` āā ${pc.cyan(agent.agentName)}${version ? pc.gray(version) : ''}`);\r\n console.log(pc.gray(` ${agent.folderPath} (${lastPulled})`));\r\n });\r\n\r\n console.log();\r\n });\r\n\r\n console.log(pc.gray(`Total: ${projects.length} project(s), ${totalAgents} agent(s)\\n`));\r\n };\r\n\r\n const command = new Command('agents')\r\n .description('Manage tracked agents')\r\n .action(async () => listAction());\r\n\r\n command\r\n .command('list')\r\n .description('List tracked agents')\r\n .option('-p, --project <id>', 'Filter by project id or slug')\r\n .option('--json', 'Output raw JSON for scripting')\r\n .action(listAction);\r\n\r\n command\r\n .command('remove [agent]')\r\n .description('Stop tracking a specific agent')\r\n .option('-p, --project <id>', 'Project id or slug (disambiguates agents with the same slug)')\r\n .option('-f, --force', 'Skip confirmation prompt')\r\n .action(async (agentArg: string | undefined, options: RemoveOptions) => {\r\n let projects = await projectTracker.getTrackedProjects();\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.gray('No agents tracked. Run `porchestra explore` first.'));\r\n return;\r\n }\r\n\r\n if (options.project) {\r\n projects = projects.filter(\r\n project => project.projectId === options.project || project.projectSlug === options.project\r\n );\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.red(`No tracked project found for \"${options.project}\"`));\r\n return;\r\n }\r\n }\r\n\r\n const candidates = projects.flatMap((project) =>\r\n project.agents.map((agent) => ({\r\n project,\r\n agent,\r\n value: `${project.projectId}:${agent.agentId}`,\r\n }))\r\n );\r\n\r\n let filtered = candidates;\r\n\r\n if (agentArg) {\r\n filtered = candidates.filter(({ agent }) =>\r\n agent.agentId === agentArg || agent.agentSlug === agentArg\r\n );\r\n }\r\n\r\n if (filtered.length === 0) {\r\n const message = agentArg\r\n ? `No tracked agent found for \"${agentArg}\".`\r\n : 'No tracked agents found.';\r\n console.log(pc.red(message));\r\n return;\r\n }\r\n\r\n let target = filtered[0];\r\n\r\n if (filtered.length > 1) {\r\n const choice = await select({\r\n message: 'Select an agent to stop tracking:',\r\n choices: filtered.map(({ project, agent, value }) => ({\r\n name: `${agent.agentName} ${pc.gray(`(${project.projectName}) ${agent.folderPath}`)}`,\r\n value,\r\n })),\r\n });\r\n\r\n target = filtered.find(candidate => candidate.value === choice)!;\r\n }\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm({\r\n message: `Remove ${target.agent.agentName} from ${target.project.projectName}?`,\r\n default: false,\r\n });\r\n\r\n if (!confirmed) return;\r\n }\r\n\r\n const removed = await projectTracker.untrackAgent(\r\n target.project.projectId,\r\n target.agent.agentId\r\n );\r\n\r\n if (!removed) {\r\n console.log(pc.red('Agent was not removed (not found).'));\r\n return;\r\n }\r\n\r\n const projectRemoved = target.project.agents.length === 1;\r\n\r\n console.log(pc.green(`ā Stopped tracking ${target.agent.agentName}`));\r\n console.log(pc.gray(` Project: ${target.project.projectName}`));\r\n\r\n if (projectRemoved) {\r\n console.log(pc.gray(' Project removed from tracking because it has no remaining agents.'));\r\n }\r\n });\r\n\r\n return command;\r\n}\r\n"],"mappings":"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","names":["Command","confirm","pc","Command","pc","z","z","os","got","got","fs","path","path","path","fs","path","Command","pc","Command","pc","Command","path","pc","ora","createExploreCommand","Command","pc","confirm","Command","pc","Command","select","confirm","pc","pc","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/config/project-tracker.ts","../src/utils/date.ts","../src/commands/explore.ts","../src/index.ts","../src/core/config/config-manager.ts","../src/core/config/config-schema.ts","../src/utils/errors.ts","../src/core/auth/auth-service.ts","../src/core/auth/token-manager.ts","../src/core/api/client.ts","../src/core/generators/code-generator.ts","../src/utils/path-utils.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/pull.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/agents.ts"],"sourcesContent":["import { ConfigManager } from './config-manager.js';\nimport { TrackedProject, TrackedAgent } from './config-schema.js';\n\nexport interface ProjectBrief {\n id: string;\n name: string;\n slug: string;\n}\n\nexport interface AgentBrief {\n id: string;\n name: string;\n slug: string;\n folderPath: string;\n}\n\nexport class ProjectTracker {\n constructor(private configManager: ConfigManager) {}\n\n async getTrackedProjects(): Promise<TrackedProject[]> {\n const config = await this.configManager.get();\n return config.trackedProjects || [];\n }\n\n async getTrackedAgents(projectId: string): Promise<TrackedAgent[]> {\n const config = await this.configManager.get();\n const project = config.trackedProjects?.find(p => p.projectId === projectId);\n return project?.agents || [];\n }\n\n async listTrackedAgents(): Promise<Array<{ project: TrackedProject; agent: TrackedAgent }>> {\n const projects = await this.getTrackedProjects();\n return projects.flatMap(project =>\n project.agents.map(agent => ({ project, agent }))\n );\n }\n\n async trackProject(project: ProjectBrief, agents: AgentBrief[]): Promise<void> {\n await this.configManager.update((config) => {\n const existingIndex = config.trackedProjects.findIndex(\n p => p.projectId === project.id\n );\n\n const trackedAgents: TrackedAgent[] = agents.map(agent => ({\n agentId: agent.id,\n agentName: agent.name,\n agentSlug: agent.slug,\n folderPath: agent.folderPath,\n selectedAt: new Date().toISOString(),\n }));\n\n const trackedProject: TrackedProject = {\n projectId: project.id,\n projectName: project.name,\n projectSlug: project.slug,\n selectedAt: new Date().toISOString(),\n agents: trackedAgents,\n };\n\n const newProjects = [...config.trackedProjects];\n if (existingIndex >= 0) {\n newProjects[existingIndex] = trackedProject;\n } else {\n newProjects.push(trackedProject);\n }\n\n return { ...config, trackedProjects: newProjects };\n });\n }\n\n async untrackProject(projectId: string): Promise<void> {\n await this.configManager.update((config) => ({\n ...config,\n trackedProjects: config.trackedProjects.filter(\n p => p.projectId !== projectId\n ),\n }));\n }\n\n async untrackAgent(projectId: string, agentId: string): Promise<boolean> {\n let removed = false;\n\n await this.configManager.update((config) => {\n const projectIndex = config.trackedProjects.findIndex(\n p => p.projectId === projectId\n );\n\n if (projectIndex === -1) return config;\n\n const project = config.trackedProjects[projectIndex];\n const remainingAgents = project.agents.filter(\n agent => agent.agentId !== agentId\n );\n\n if (remainingAgents.length === project.agents.length) {\n return config;\n }\n\n removed = true;\n\n const newProjects = [...config.trackedProjects];\n\n if (remainingAgents.length === 0) {\n newProjects.splice(projectIndex, 1);\n } else {\n newProjects[projectIndex] = { ...project, agents: remainingAgents };\n }\n\n return { ...config, trackedProjects: newProjects };\n });\n\n return removed;\n }\n\n async updateLastPulled(\n projectId: string,\n agentId: string,\n version: string\n ): Promise<void> {\n await this.configManager.update((config) => {\n const projectIndex = config.trackedProjects.findIndex(\n p => p.projectId === projectId\n );\n if (projectIndex === -1) return config;\n\n const project = config.trackedProjects[projectIndex];\n const agentIndex = project.agents.findIndex(\n a => a.agentId === agentId\n );\n if (agentIndex === -1) return config;\n\n const now = new Date().toISOString();\n const newAgents = [...project.agents];\n newAgents[agentIndex] = {\n ...newAgents[agentIndex],\n lastPulledAt: now,\n lastPulledVersion: version,\n };\n\n const newProjects = [...config.trackedProjects];\n newProjects[projectIndex] = {\n ...project,\n agents: newAgents,\n lastPulledAt: now,\n };\n\n return { ...config, trackedProjects: newProjects };\n });\n }\n\n async getSummary(): Promise<{ projectCount: number; agentCount: number }> {\n const projects = await this.getTrackedProjects();\n return {\n projectCount: projects.length,\n agentCount: projects.reduce((sum, p) => sum + p.agents.length, 0),\n };\n }\n}\n","export function formatDistanceToNow(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 30) return `${diffDays}d ago`;\n return date.toISOString().split('T')[0];\n}\n\nexport function formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n","import { Command } from 'commander';\nimport { select, checkbox, confirm, Separator } from '@inquirer/prompts';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { ApiClient } from '../core/api/client.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\nimport { formatDate } from '../utils/date.js';\n\ninterface ExploreOptions {\n project?: string;\n}\n\ninterface ProjectChoice {\n name: string;\n value: any;\n short?: string;\n}\n\nexport function createExploreCommand(\n configManager: ConfigManager,\n apiClient: ApiClient\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('explore')\n .description('Explore and select projects/agents to track')\n .option('-p, --project <id>', 'Start with specific project')\n .action(async (options: ExploreOptions) => {\n const spinner = ora('Fetching projects...').start();\n \n try {\n // Fetch all projects\n const response = await apiClient.getProjectsBrief();\n const projects = response.projects;\n spinner.stop();\n\n if (projects.length === 0) {\n console.log(pc.yellow('No projects found. Create one in the web app first.'));\n return;\n }\n\n // Project selection loop\n let exploring = true;\n while (exploring) {\n const projectChoices: ProjectChoice[] = projects.map((p) => ({\n name: `${p.name} ${pc.gray(`(${p.agentCount} agents, last modified ${formatDate(p.lastModifiedAt)})`)}`,\n value: p,\n short: p.name\n }));\n\n let selectedProject: any;\n if (options.project) {\n selectedProject = projects.find((p) => p.id === options.project || p.slug === options.project);\n } else {\n const choices: any[] = [\n ...projectChoices,\n new Separator(),\n { name: pc.yellow('Done exploring'), value: 'DONE' }\n ];\n selectedProject = await select({\n message: 'Select a project to explore:',\n choices\n });\n }\n\n if (selectedProject === 'DONE') {\n exploring = false;\n break;\n }\n\n if (!selectedProject) {\n console.log(pc.red('Project not found'));\n continue;\n }\n\n // Fetch agents for selected project\n const agentSpinner = ora(`Fetching agents for ${selectedProject.name}...`).start();\n const agentsResponse = await apiClient.getProjectAgents(selectedProject.id);\n const agents = agentsResponse;\n agentSpinner.succeed(`Found ${agents.agents.length} agents`);\n\n // Display agents with folder paths\n console.log(pc.bold(`\\nš ${selectedProject.name}\\n`));\n \n agents.agents.forEach((agent) => {\n const isPublished = agent.isPublished \n ? pc.green('ā') \n : pc.gray('ā');\n const versionInfo = `${agent.version} ${pc.gray(`(${agents.versionResolution.source})`)}`;\n \n console.log(` ${isPublished} ${pc.cyan(agent.name)}`);\n console.log(` ${pc.gray('Path:')} ${agent.folderPath}`);\n console.log(` ${pc.gray('Version:')} ${versionInfo}`);\n console.log(` ${pc.gray('Tools:')} ${agent.toolCount}`);\n if (agents.versionResolution.source !== 'PRODUCTION') {\n console.log(` ${pc.yellow('ā ')} ${agents.versionResolution.note}`);\n }\n console.log();\n });\n\n // Agent selection\n const currentlyTracked = await projectTracker.getTrackedAgents(selectedProject.id);\n const trackedIds = new Set(currentlyTracked.map(a => a.agentId));\n\n const selectedAgentIds = await checkbox({\n message: 'Select agents to track (space to toggle, enter to confirm):',\n choices: agents.agents.map((agent) => ({\n name: `${agent.name} ${pc.gray(`(${agent.folderPath})`)}`,\n value: agent.id,\n checked: trackedIds.has(agent.id)\n }))\n });\n\n // Update tracking - IMMEDIATE AUTO-SAVE\n if (selectedAgentIds.length > 0) {\n const selectedAgents = agents.agents.filter((a) => selectedAgentIds.includes(a.id));\n try {\n await projectTracker.trackProject(selectedProject, selectedAgents);\n console.log(pc.green(`\\nā Auto-saved: Tracking ${selectedAgents.length} agents from ${selectedProject.name}`));\n } catch (error) {\n console.error(pc.red(`\\nā Failed to save tracking: ${(error as Error).message}`));\n throw error; // RETHROW - don't silently fail\n }\n } else {\n try {\n await projectTracker.untrackProject(selectedProject.id);\n console.log(pc.yellow(`\\nā Auto-saved: No longer tracking ${selectedProject.name}`));\n } catch (error) {\n console.error(pc.red(`\\nā Failed to untrack: ${(error as Error).message}`));\n throw error; // RETHROW - don't silently fail\n }\n }\n\n // Continue?\n if (!options.project) {\n const continueExploring = await confirm({\n message: 'Explore another project?',\n default: true\n });\n if (!continueExploring) exploring = false;\n } else {\n exploring = false;\n }\n }\n\n // Summary\n const summary = await projectTracker.getSummary();\n console.log(pc.bold('\\nš Tracking Summary\\n'));\n console.log(` Projects: ${summary.projectCount}`);\n console.log(` Agents: ${summary.agentCount}`);\n console.log(pc.gray('\\nRun `porchestra pull` to generate code for tracked agents\\n'));\n\n } catch (error) {\n spinner.fail('Failed to fetch projects');\n console.error(pc.red(`\\nā ${(error as Error).message}`));\n process.exit(1);\n }\n });\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from './core/config/config-manager.js';\nimport { AuthService } from './core/auth/auth-service.js';\nimport { TokenManager } from './core/auth/token-manager.js';\nimport { ApiClient } from './core/api/client.js';\nimport { CodeGenerator } from './core/generators/code-generator.js';\nimport { createLoginCommand } from './commands/login.js';\nimport { createLogoutCommand } from './commands/logout.js';\nimport { createWhoamiCommand } from './commands/whoami.js';\nimport { createExploreCommand } from './commands/explore.js';\nimport { createPullCommand } from './commands/pull.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createStatusCommand } from './commands/status.js';\nimport { createAgentsCommand } from './commands/agents.js';\nimport { PorchestraError } from './utils/errors.js';\n\nconst packageJson = { version: '1.0.0' };\n\n// Global error handlers\nprocess.on('unhandledRejection', (error) => {\n console.error(pc.red('\\nā Unexpected error:'));\n console.error(error);\n process.exit(1);\n});\n\nprocess.on('uncaughtException', (error) => {\n console.error(pc.red('\\nā Fatal error:'));\n console.error(error);\n process.exit(1);\n});\n\nasync function main() {\n // Initialize core services\n const configManager = new ConfigManager();\n const authService = new AuthService(configManager);\n // TokenManager is available for future token operations\n new TokenManager(configManager);\n const apiClient = new ApiClient(configManager);\n const codeGenerator = new CodeGenerator();\n\n // Check token expiration and refresh if needed\n await authService.checkAndRefreshTokenIfNeeded();\n\n // Create CLI program\n const program = new Command()\n .name('porchestra')\n .description('CLI for Porchestra - Generate LLM tool handlers')\n .version(packageJson.version)\n .configureOutput({\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(pc.red(str))\n });\n\n // Add global options\n program\n .option('--api-url <url>', 'Override API URL')\n .option('--config-dir <dir>', 'Override config directory');\n\n // Register commands\n program.addCommand(createLoginCommand(configManager, authService));\n program.addCommand(createLogoutCommand(configManager, authService));\n program.addCommand(createWhoamiCommand(configManager, authService));\n program.addCommand(createExploreCommand(configManager, apiClient));\n program.addCommand(createPullCommand(configManager, apiClient, codeGenerator));\n program.addCommand(createConfigCommand(configManager));\n program.addCommand(createStatusCommand(configManager));\n program.addCommand(createAgentsCommand(configManager));\n\n // Parse arguments\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n if (error instanceof PorchestraError) {\n console.error(pc.red(`\\nā ${error.message}`));\n if (process.env.DEBUG) {\n console.error(pc.gray(error.stack));\n }\n } else {\n console.error(pc.red(`\\nā Unexpected error: ${(error as Error).message}`));\n }\n process.exit(1);\n});\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { z } from 'zod';\nimport { input } from '@inquirer/prompts';\nimport { CliConfig, CliConfigSchema } from './config-schema.js';\n\nconst DEFAULT_CONFIG_DIR = path.join(os.homedir(), '.porchestra');\nconst CONFIG_FILE = 'config.json';\n\nexport class ConfigManager {\n private configPath: string;\n private config: CliConfig | null = null;\n\n constructor() {\n const configDir = process.env.PORCHESTRA_CONFIG_DIR || DEFAULT_CONFIG_DIR;\n this.configPath = path.join(configDir, CONFIG_FILE);\n }\n\n async load(): Promise<CliConfig> {\n try {\n const data = await fs.readFile(this.configPath, 'utf-8');\n const parsed = JSON.parse(data);\n \n // STRICT VALIDATION - throws on error\n const validated = CliConfigSchema.parse(parsed);\n this.config = validated;\n return validated;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Return default config\n const defaultConfig = { version: '1.0.0' } as const;\n this.config = CliConfigSchema.parse(defaultConfig);\n return this.config;\n }\n \n // THROW on validation errors\n if (error instanceof z.ZodError) {\n console.error('ā Config validation failed:');\n error.errors.forEach((err) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n throw new Error(`Invalid config file at ${this.configPath}. Please run 'porchestra config reset' to fix.`);\n }\n \n throw error;\n }\n }\n\n async save(config: CliConfig): Promise<void> {\n try {\n // STRICT VALIDATION before save\n const validated = CliConfigSchema.parse(config);\n \n // Ensure directory exists\n const configDir = path.dirname(this.configPath);\n await fs.mkdir(configDir, { recursive: true });\n \n // Atomic write (write to temp, then rename)\n const tempPath = `${this.configPath}.tmp`;\n await fs.writeFile(\n tempPath,\n JSON.stringify(validated, null, 2),\n 'utf-8'\n );\n await fs.rename(tempPath, this.configPath);\n \n this.config = validated;\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('ā Config validation failed on save:');\n error.errors.forEach((err) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n throw new Error('Failed to save config: validation error');\n }\n throw error;\n }\n }\n\n async get(): Promise<CliConfig> {\n if (!this.config) {\n return this.load();\n }\n return this.config;\n }\n\n async update(updater: (config: CliConfig) => CliConfig): Promise<void> {\n const config = await this.get();\n const updated = updater({ ...config }); // Create new object\n await this.save(updated);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.configPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n this.config = null;\n }\n\n async ensureApiBaseUrl(): Promise<string> {\n const config = await this.get();\n const existing = config.api?.baseUrl;\n if (existing) {\n return existing;\n }\n\n const envUrl = process.env.PORCHESTRA_API_URL;\n const defaultUrl = envUrl || 'http://localhost:3000/api/v1';\n\n const value = await input({\n message: 'API base URL:',\n default: defaultUrl,\n validate: (val) => {\n try {\n const parsed = new URL(val);\n if (!parsed.protocol.startsWith('http')) {\n return 'URL must start with http:// or https://';\n }\n return true;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n });\n\n await this.update((cfg) => ({\n ...cfg,\n api: {\n ...cfg.api,\n baseUrl: value,\n },\n }));\n\n return value;\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n}\n","import { z } from 'zod';\n\n// Simplified datetime validation - just accepts any string\nconst DateTimeStringSchema = z.string().optional();\n\nexport const TrackedAgentSchema = z.object({\n agentId: z.string().uuid(),\n agentName: z.string(),\n agentSlug: z.string(),\n folderPath: z.string(),\n selectedAt: DateTimeStringSchema,\n lastPulledAt: DateTimeStringSchema.optional(),\n lastPulledVersion: z.string().optional(),\n});\n\nexport const TrackedProjectSchema = z.object({\n projectId: z.string().uuid(),\n projectName: z.string(),\n projectSlug: z.string(),\n selectedAt: DateTimeStringSchema,\n agents: z.array(TrackedAgentSchema),\n lastPulledAt: DateTimeStringSchema.optional(),\n});\n\nexport const CliConfigSchema = z.object({\n auth: z.object({\n token: z.string().optional(),\n tokenId: z.string().uuid().optional(),\n expiresAt: DateTimeStringSchema.optional(),\n deviceName: z.string().optional(),\n }).optional(),\n \n api: z.object({\n baseUrl: z.string().url().optional(),\n skipTlsVerify: z.boolean().default(false),\n }).default({}),\n \n trackedProjects: z.array(TrackedProjectSchema).default([]),\n \n output: z.object({\n baseDir: z.string().default('./src/agents'),\n createIndexFiles: z.boolean().default(true),\n }).default({}),\n \n cli: z.object({\n lastLoginAt: DateTimeStringSchema.optional(),\n lastVersionCheck: DateTimeStringSchema.optional(),\n latestKnownVersion: z.string().optional(),\n }).optional(),\n \n version: z.literal('1.0.0'),\n});\n\nexport type TrackedAgent = z.infer<typeof TrackedAgentSchema>;\nexport type TrackedProject = z.infer<typeof TrackedProjectSchema>;\nexport type CliConfig = z.infer<typeof CliConfigSchema>;\n","export class PorchestraError extends Error {\n constructor(message: string, public code: string) {\n super(message);\n this.name = 'PorchestraError';\n }\n}\n\nexport class AuthenticationError extends PorchestraError {\n constructor(message: string, public retryable = false) {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NetworkError extends PorchestraError {\n constructor(\n message: string,\n public statusCode?: number,\n public retryable = true\n ) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n }\n}\n\nexport class ValidationError extends PorchestraError {\n constructor(message: string, public field?: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n\nexport class FileSystemError extends PorchestraError {\n constructor(message: string, public path: string) {\n super(message, 'FS_ERROR');\n this.name = 'FileSystemError';\n }\n}\n","import { ConfigManager } from '../config/config-manager.js';\nimport { AuthenticationError, NetworkError } from '../../utils/errors.js';\nimport {\n ApiResponse,\n CliTokenResponse,\n CliTokenRefreshResponse,\n CliTokenRevokeResponse,\n UserInfo,\n} from '../../types/index.js';\nimport got from 'got';\nimport os from 'os';\n\ninterface LoginCredentials {\n email: string;\n password: string;\n apiUrl?: string;\n deviceName?: string;\n skipTlsVerify?: boolean;\n}\n\nexport class AuthService {\n private configManager: ConfigManager;\n\n constructor(configManager: ConfigManager) {\n this.configManager = configManager;\n }\n\n async login(credentials: LoginCredentials): Promise<CliTokenResponse> {\n const baseUrl = credentials.apiUrl || await this.configManager.ensureApiBaseUrl();\n \n const deviceInfo = {\n os: os.platform(),\n version: os.release(),\n cliVersion: '1.0.0',\n };\n\n const deviceName = credentials.deviceName || `${os.hostname()} - ${deviceInfo.os}`;\n\n try {\n const response = await got.post(`${baseUrl}/cli/login`, {\n json: {\n email: credentials.email,\n password: credentials.password,\n deviceName,\n deviceInfo,\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n https: {\n rejectUnauthorized: !credentials.skipTlsVerify,\n },\n }).json<ApiResponse<CliTokenResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode) {\n if (error.response.statusCode === 401) {\n throw new AuthenticationError('Invalid email or password');\n }\n throw new AuthenticationError(`Login failed: ${error.message}`);\n }\n if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND' || error.code === 'ETIMEDOUT') {\n throw new NetworkError(`Network error: ${error.message}`);\n }\n throw error;\n }\n }\n\n async refreshToken(tokenId: string, currentToken: string): Promise<CliTokenRefreshResponse> {\n const baseUrl = await this.configManager.ensureApiBaseUrl();\n\n try {\n const response = await got.post(`${baseUrl}/cli/token/refresh`, {\n json: {\n tokenId,\n currentToken,\n },\n headers: {\n 'Authorization': `Bearer ${currentToken}`,\n 'Content-Type': 'application/json',\n },\n }).json<ApiResponse<CliTokenRefreshResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token refresh failed. Please login again.');\n }\n throw error;\n }\n }\n\n async revokeToken(token: string, revokeAll = false): Promise<CliTokenRevokeResponse> {\n const baseUrl = await this.configManager.ensureApiBaseUrl();\n\n try {\n const response = await got.delete(`${baseUrl}/cli/token`, {\n json: {\n revokeAll,\n },\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n }).json<ApiResponse<CliTokenRevokeResponse>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token already revoked or invalid');\n }\n throw error;\n }\n }\n\n async getCurrentUser(token: string): Promise<UserInfo> {\n const baseUrl = await this.configManager.ensureApiBaseUrl();\n\n try {\n const response = await got.get(`${baseUrl}/auth/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n }).json<ApiResponse<UserInfo>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Token is invalid or expired');\n }\n throw error;\n }\n }\n\n async checkAndRefreshTokenIfNeeded(): Promise<boolean> {\n const config = await this.configManager.get();\n \n if (!config.auth?.token || !config.auth?.tokenId || !config.auth?.expiresAt) {\n return false;\n }\n\n const expiresAt = new Date(config.auth.expiresAt);\n const now = new Date();\n const sevenDaysFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);\n\n // If token expires within 7 days, refresh it\n if (expiresAt < sevenDaysFromNow) {\n try {\n const refreshed = await this.refreshToken(\n config.auth.tokenId,\n config.auth.token\n );\n\n await this.configManager.update((cfg) => ({\n ...cfg,\n auth: {\n ...cfg.auth,\n token: refreshed.token,\n expiresAt: refreshed.expiresAt,\n },\n }));\n\n return true;\n } catch {\n return false;\n }\n }\n\n return true;\n }\n}\n","import { ConfigManager } from '../config/config-manager.js';\n\nexport class TokenManager {\n constructor(private configManager: ConfigManager) {}\n\n async getToken(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.token;\n }\n\n async getTokenId(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.tokenId;\n }\n\n async getExpiresAt(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.expiresAt;\n }\n\n async isAuthenticated(): Promise<boolean> {\n const token = await this.getToken();\n if (!token) return false;\n\n const expiresAt = await this.getExpiresAt();\n if (!expiresAt) return false;\n\n const expiryDate = new Date(expiresAt);\n return expiryDate > new Date();\n }\n\n async getDaysUntilExpiry(): Promise<number | null> {\n const expiresAt = await this.getExpiresAt();\n if (!expiresAt) return null;\n\n const expiryDate = new Date(expiresAt);\n const now = new Date();\n const diffMs = expiryDate.getTime() - now.getTime();\n return Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n }\n\n async isExpiringSoon(days = 7): Promise<boolean> {\n const daysUntilExpiry = await this.getDaysUntilExpiry();\n if (daysUntilExpiry === null) return false;\n return daysUntilExpiry <= days;\n }\n}\n","import got from 'got';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { NetworkError, AuthenticationError } from '../../utils/errors.js';\nimport {\n ProjectsBriefResponse,\n AgentsListResponse,\n AgentToolsResponse,\n UserInfo,\n CliConfigResponse,\n ApiResponse,\n} from '../../types/index.js';\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 1000;\n\ninterface RequestOptions {\n method: 'GET' | 'POST' | 'DELETE';\n headers?: Record<string, string>;\n}\n\nexport class ApiClient {\n private configManager: ConfigManager;\n\n constructor(configManager: ConfigManager) {\n this.configManager = configManager;\n }\n\n private async getBaseUrl(): Promise<string> {\n return this.configManager.ensureApiBaseUrl();\n }\n\n private async getToken(): Promise<string | undefined> {\n const config = await this.configManager.get();\n return config.auth?.token;\n }\n\n private async requestWithRetry<T>(\n url: string,\n options: RequestOptions,\n attempt = 1\n ): Promise<T> {\n try {\n const token = await this.getToken();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers || {}),\n };\n\n const response = await got(url, {\n method: options.method,\n headers,\n retry: { limit: 0 },\n }).json<ApiResponse<T>>();\n\n return response.data;\n } catch (error: any) {\n if (error.response?.statusCode === 401) {\n throw new AuthenticationError('Authentication failed. Please login again.');\n }\n\n const isRetryable =\n error.code === 'ECONNRESET' ||\n error.code === 'ETIMEDOUT' ||\n error.code === 'ENOTFOUND' ||\n (error.response?.statusCode && error.response.statusCode >= 500);\n\n if (isRetryable && attempt < MAX_RETRIES) {\n await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * attempt));\n return this.requestWithRetry(url, options, attempt + 1);\n }\n\n throw new NetworkError(\n `API request failed: ${error.message}`,\n error.response?.statusCode,\n isRetryable\n );\n }\n }\n\n async getProjectsBrief(): Promise<ProjectsBriefResponse> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<ProjectsBriefResponse>(\n `${baseUrl}/projects/brief`,\n { method: 'GET' }\n );\n }\n\n async getProjectAgents(\n projectId: string,\n environment?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT'\n ): Promise<AgentsListResponse> {\n const baseUrl = await this.getBaseUrl();\n const query = environment ? `?environment=${environment}` : '';\n return this.requestWithRetry<AgentsListResponse>(\n `${baseUrl}/projects/${projectId}/agents${query}`,\n { method: 'GET' }\n );\n }\n\n async getAgentTools(\n projectId: string,\n agentId: string,\n environment?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT'\n ): Promise<AgentToolsResponse> {\n const baseUrl = await this.getBaseUrl();\n const query = environment ? `?environment=${environment}` : '';\n return this.requestWithRetry<AgentToolsResponse>(\n `${baseUrl}/projects/${projectId}/agents/${agentId}/tools${query}`,\n { method: 'GET' }\n );\n }\n\n async getCurrentUser(token: string): Promise<UserInfo> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<UserInfo>(\n `${baseUrl}/auth/me`,\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${token}` },\n }\n );\n }\n\n async getCliConfig(): Promise<CliConfigResponse> {\n const baseUrl = await this.getBaseUrl();\n return this.requestWithRetry<CliConfigResponse>(\n `${baseUrl}/cli/config`,\n { method: 'GET' }\n );\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport Handlebars from 'handlebars';\nimport { calculateAgentOutputPath } from '../../utils/path-utils.js';\nimport { AgentToolsResponse } from '../../types/index.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface GenerateOptions {\n agent: AgentToolsResponse['agent'];\n tools: AgentToolsResponse['tools'];\n components: AgentToolsResponse['components'];\n outputDir: string;\n forceOverwrite: boolean;\n}\n\ninterface ToolData {\n name: string;\n description: string;\n parameters: object;\n returns: object | null;\n isBuiltin?: boolean;\n builtinType?: string;\n}\n\ninterface TemplateData {\n agentName: string;\n version: string;\n generatedAt: string;\n tools: ToolData[];\n variableSchema: object | null;\n inputSchema: object | null;\n responseSchema: object | null;\n responseJsonSchema: object;\n}\n\n// Register Handlebars helpers\nHandlebars.registerHelper('pascalCase', function(str: string) {\n return str\n .replace(/[-_\\s](.)/g, (_, char) => char.toUpperCase())\n .replace(/^(.)/, (_, char) => char.toUpperCase());\n});\n\nHandlebars.registerHelper('camelCase', function(str: string) {\n return str\n .replace(/[-_\\s](.)/g, (_, char) => char.toUpperCase())\n .replace(/^(.)/, (_, char) => char.toLowerCase());\n});\n\nHandlebars.registerHelper('zodType', function(schema: any) {\n return jsonSchemaToZodType(schema);\n});\n\nHandlebars.registerHelper('json', function(value: any) {\n return JSON.stringify(value ?? {}, null, 2);\n});\n\nfunction normalizeSchemaContent(content: unknown): any {\n if (typeof content === 'string') {\n try {\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n }\n return content;\n}\n\nfunction buildVariableJsonSchemaFromDefinitions(defs: any[]): object {\n const schema: any = {\n type: 'object',\n properties: {},\n required: [] as string[],\n };\n\n const ensureObjectSchema = (target: any, key: string) => {\n if (!target.properties[key]) {\n target.properties[key] = { type: 'object', properties: {}, required: [] as string[] };\n }\n return target.properties[key];\n };\n\n const toJsonSchema = (def: any): any => {\n const type = def?.type;\n if (type === 'enum') {\n return {\n type: 'string',\n enum: def?.validation?.options ?? [],\n };\n }\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return { type };\n }\n if (type === 'array') {\n return { type: 'array', items: {} };\n }\n if (type === 'object') {\n return { type: 'object', properties: {} };\n }\n return {};\n };\n\n for (const def of defs) {\n if (!def?.path || typeof def.path !== 'string') continue;\n const pathParts = def.path.split('.').filter(Boolean);\n if (pathParts.length === 0) continue;\n\n let curr = schema;\n for (let i = 0; i < pathParts.length; i++) {\n const key = pathParts[i];\n const isLeaf = i === pathParts.length - 1;\n if (isLeaf) {\n curr.properties[key] = toJsonSchema(def);\n if (def?.validation?.required !== false) {\n curr.required.push(key);\n }\n } else {\n curr = ensureObjectSchema(curr, key);\n }\n }\n }\n\n if (schema.required.length === 0) delete schema.required;\n return schema;\n}\n\nfunction jsonSchemaToZodType(schema: any): string {\n if (!schema) return 'z.any()';\n\n switch (schema.type) {\n case 'string': {\n let zod = 'z.string()';\n if (schema.minLength) zod += `.min(${schema.minLength})`;\n if (schema.maxLength) zod += `.max(${schema.maxLength})`;\n if (schema.pattern) zod += `.regex(/${schema.pattern}/)`;\n if (schema.enum) zod = `z.enum([${schema.enum.map((e: string) => `'${e}'`).join(', ')}])`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'number':\n case 'integer': {\n let zod = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n if (schema.minimum !== undefined) zod += `.min(${schema.minimum})`;\n if (schema.maximum !== undefined) zod += `.max(${schema.maximum})`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'boolean': {\n let zod = 'z.boolean()';\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'array': {\n const itemType = jsonSchemaToZodType(schema.items);\n let zod = `z.array(${itemType})`;\n if (schema.minItems) zod += `.min(${schema.minItems})`;\n if (schema.maxItems) zod += `.max(${schema.maxItems})`;\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n case 'object': {\n if (!schema.properties) return 'z.record(z.any())';\n \n const required = new Set(schema.required || []);\n const props = Object.entries(schema.properties).map(([key, prop]: [string, any]) => {\n const propType = jsonSchemaToZodType(prop);\n const isRequired = required.has(key);\n const formattedKey = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n return ` ${formattedKey}: ${isRequired ? propType : `${propType}.optional()`}`;\n });\n \n let zod = `z.object({\\n${props.join(',\\n')}\\n})`;\n if (schema.additionalProperties === false) zod += '.strict()';\n if (schema.nullable) zod += '.nullable()';\n return zod;\n }\n default:\n return 'z.any()';\n }\n}\n\nexport class CodeGenerator {\n private schemasTemplate: Handlebars.TemplateDelegate;\n private toolsTemplate: Handlebars.TemplateDelegate;\n private indexTemplate: Handlebars.TemplateDelegate;\n\n constructor() {\n this.schemasTemplate = Handlebars.compile(schemasTemplateSource);\n this.toolsTemplate = Handlebars.compile(toolsTemplateSource);\n this.indexTemplate = Handlebars.compile(indexTemplateSource);\n }\n\n async generate(options: GenerateOptions): Promise<void> {\n const { agent, tools, components, outputDir } = options;\n\n await fs.mkdir(outputDir, { recursive: true });\n\n const responseJsonSchema = (components?.responseSchema?.content as object) || {};\n\n const rawVariableSchema = normalizeSchemaContent(components?.variableSchema?.content);\n const resolvedVariableSchema = Array.isArray(rawVariableSchema)\n ? buildVariableJsonSchemaFromDefinitions(rawVariableSchema)\n : (rawVariableSchema as object) || null;\n\n const templateData: TemplateData = {\n agentName: agent?.name || 'Unknown Agent',\n version: agent?.version || 'unknown',\n generatedAt: new Date().toISOString(),\n tools: (tools || [])\n .filter(t => t && !t.isBuiltin && typeof t.name === 'string' && t.name.length > 0)\n .map(t => ({\n name: t.name,\n description: t.description || '',\n parameters: t.parameters || {},\n returns: t.returns ?? null,\n isBuiltin: t.isBuiltin,\n builtinType: t.builtinType,\n })),\n variableSchema: resolvedVariableSchema,\n inputSchema: (components?.inputSchema?.content as object) || null,\n responseSchema: (components?.responseSchema?.content as object) || null,\n responseJsonSchema,\n };\n\n // Generate ast.json (always overwrite)\n const astPath = path.join(outputDir, 'ast.json');\n const astContent = JSON.stringify(components?.ast?.content ?? {}, null, 2);\n await fs.writeFile(astPath, astContent, 'utf-8');\n\n // Generate config.ts (always overwrite)\n const configPath = path.join(outputDir, 'config.ts');\n const configContent = `/**\n * Auto-generated model config for ${templateData.agentName}\n * Generated: ${templateData.generatedAt}\n * Version: ${templateData.version}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nexport const ModelConfig = ${JSON.stringify(components?.modelConfig?.content ?? {}, null, 2)} as const;\n`;\n await fs.writeFile(configPath, configContent, 'utf-8');\n\n // Generate schemas.ts (always overwrite)\n const schemasPath = path.join(outputDir, 'schemas.ts');\n const schemasContent = this.schemasTemplate(templateData);\n await fs.writeFile(schemasPath, schemasContent, 'utf-8');\n\n // Generate tools.ts (always overwrite)\n const toolsPath = path.join(outputDir, 'tools.ts');\n const toolsContent = this.toolsTemplate(templateData);\n await fs.writeFile(toolsPath, toolsContent, 'utf-8');\n\n // Generate index.ts (always overwrite)\n const indexPath = path.join(outputDir, 'index.ts');\n const indexContent = this.indexTemplate(templateData);\n await fs.writeFile(indexPath, indexContent, 'utf-8');\n }\n\n calculateOutputPath(baseDir: string, folderPath: string, agentName: string): string {\n return calculateAgentOutputPath(baseDir, folderPath, agentName);\n }\n}\n\n// Template sources\nconst schemasTemplateSource = `/**\n * Auto-generated Zod schemas for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { z } from 'zod';\n\n// 1. System Prompt Variables\nexport const VariableSchema = {{{zodType variableSchema}}};\nexport type AgentVariables = z.infer<typeof VariableSchema>;\n\n// 2. User Input\nexport const InputSchema = {{{zodType inputSchema}}};\nexport type AgentInput = z.infer<typeof InputSchema>;\n\n// 3. Model Response\nexport const ResponseSchema = {{{zodType responseSchema}}};\nexport type AgentResponse = z.infer<typeof ResponseSchema>;\n\n// 4. Raw JSON Schema (for LLM Provider 'response_format')\nexport const ResponseJsonSchema = {{{json responseJsonSchema}}} as const;\n`;\n\nconst toolsTemplateSource = `/**\n * Auto-generated tools for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { z } from 'zod';\n\n{{#each tools}}\n// Schema for {{name}}\nexport const {{pascalCase name}}Params = {{{zodType parameters}}};\nexport type {{pascalCase name}}ParamsType = z.infer<typeof {{pascalCase name}}Params>;\n\n{{/each}}\n// The Interface the user MUST implement\nexport interface ToolImplementation {\n{{#each tools}}\n {{camelCase name}}: (args: {{pascalCase name}}ParamsType) => Promise<unknown>;\n{{/each}}\n}\n\n// Raw Tool Definitions for provider SDKs\nexport const ToolDefinitions = [\n{{#each tools}}\n {\n name: '{{name}}',\n description: {{{json description}}},\n parameters: {{{json parameters}}},\n },\n{{/each}}\n] as const;\n\n// Dispatcher with validation\nexport async function dispatch(\n name: string,\n args: unknown,\n impl: ToolImplementation\n): Promise<unknown> {\n switch (name) {\n {{#each tools}}\n case '{{name}}':\n return await impl.{{camelCase name}}({{pascalCase name}}Params.parse(args));\n {{/each}}\n default:\n throw new Error(\\`Unknown tool: \\${name}\\`);\n }\n}\n`;\n\nconst indexTemplateSource = `/**\n * Auto-generated Agent class for {{agentName}}\n * Generated: {{generatedAt}}\n * Version: {{version}}\n * DO NOT MODIFY - This file is auto-generated by Porchestra CLI\n */\n\nimport { PorchestraRuntime } from '@porchestra/core';\nimport rawAst from './ast.json';\nimport { ModelConfig } from './config.js';\nimport * as Schemas from './schemas.js';\nimport * as Tools from './tools.js';\n\nexport class {{pascalCase agentName}}Agent {\n /**\n * @param tools - The implementation of the tool logic. Required if the agent uses tools.\n */\n constructor(private readonly tools?: Tools.ToolImplementation) {}\n\n /**\n * Renders the System Prompt.\n * Throws ZodError if variables are invalid.\n */\n public renderPrompt(variables: Schemas.AgentVariables): string {\n const safeVars = Schemas.VariableSchema.parse(variables);\n return PorchestraRuntime.render(rawAst as any, safeVars);\n }\n\n /**\n * Routes an LLM Tool Call to your implementation.\n * Validates arguments automatically.\n */\n public async handleTool(name: string, args: unknown): Promise<unknown> {\n if (!this.tools) {\n throw new Error('No tool implementation provided to Agent constructor.');\n }\n return Tools.dispatch(name, args, this.tools);\n }\n\n /** Validates User Input (e.g. from API Request) */\n public static validateInput(data: unknown): Schemas.AgentInput {\n return Schemas.InputSchema.parse(data);\n }\n\n /** Validates LLM Output (Post-generation check) */\n public static validateResponse(data: unknown): Schemas.AgentResponse {\n return Schemas.ResponseSchema.parse(data);\n }\n\n /** Get Provider Configuration */\n public static get config() {\n return ModelConfig;\n }\n\n /** Get Tool Definitions for the LLM Provider */\n public static get toolDefinitions() {\n return Tools.ToolDefinitions;\n }\n\n /** Get JSON Schema for Structured Outputs */\n public static get responseFormat() {\n return Schemas.ResponseJsonSchema;\n }\n}\n`;\n","import path from 'path';\nimport { promises as fs } from 'fs';\n\nexport function normalizeFolderPath(folderPath: string): string {\n let normalized = folderPath.replace(/^\\//, '');\n normalized = normalized.replace(/\\/+/g, '/');\n normalized = normalized\n .split('/')\n .map(segment => sanitizePathSegment(segment))\n .join('/');\n normalized = normalized.replace(/\\/$/, '');\n return normalized;\n}\n\nfunction sanitizePathSegment(segment: string): string {\n return segment\n .replace(/[^a-zA-Z0-9-_]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-');\n}\n\nexport function calculateOutputPath(\n baseDir: string,\n folderPath: string,\n filename?: string\n): string {\n const normalized = normalizeFolderPath(folderPath);\n const fullPath = path.join(baseDir, normalized);\n return filename ? path.join(fullPath, filename) : fullPath;\n}\n\nexport function calculateAgentOutputPath(\n baseDir: string,\n folderPath: string,\n agentName: string,\n filename?: string\n): string {\n const normalizedFolder = normalizeFolderPath(folderPath);\n const normalizedAgent = sanitizePathSegment(agentName);\n const fullPath = path.join(baseDir, normalizedFolder, normalizedAgent);\n return filename ? path.join(fullPath, filename) : fullPath;\n}\n\nexport async function ensureDirectory(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { input, password } from '@inquirer/prompts';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { AuthService } from '../core/auth/auth-service.js';\n\ninterface LoginOptions {\n apiUrl?: string;\n skipTlsVerify?: boolean;\n}\n\nexport function createLoginCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n return new Command('login')\n .description('Authenticate with your Porchestra account')\n .option('--api-url <url>', 'Override API URL')\n .option('--skip-tls-verify', 'Skip TLS certificate verification (insecure)')\n .action(async (options: LoginOptions) => {\n console.log(pc.bold('\\n \\uD83D\\uDD10 Porchestra CLI Login\\n'));\n\n const apiUrl = options.apiUrl || process.env.PORCHESTRA_API_URL;\n \n if (options.skipTlsVerify) {\n console.log(pc.yellow('\\n \\u26A0\\uFE0F WARNING: TLS verification disabled. Not recommended for production.\\n'));\n }\n\n const email = await input({\n message: ' Email:',\n validate: (value) => value.includes('@') || 'Please enter a valid email'\n });\n\n const pwd = await password({\n message: ' Password:',\n mask: '*'\n });\n\n try {\n const result = await authService.login({\n email,\n password: pwd,\n apiUrl,\n skipTlsVerify: options.skipTlsVerify\n });\n\n // DEBUG: Log raw API response\n console.log(pc.yellow('\\n [DEBUG] Raw API response:'));\n console.log(pc.yellow(` token: ${result.token?.substring(0, 20)}...`));\n console.log(pc.yellow(` tokenId: ${result.tokenId}`));\n console.log(pc.yellow(` expiresAt: ${result.expiresAt}`));\n console.log(pc.yellow(` issuedAt: ${result.issuedAt}`));\n console.log(pc.yellow(` deviceName: ${result.deviceName}`));\n\n try {\n await configManager.update((cfg) => ({\n ...cfg,\n auth: {\n token: result.token,\n tokenId: result.tokenId,\n expiresAt: result.expiresAt,\n deviceName: result.deviceName\n },\n api: {\n baseUrl: apiUrl || cfg.api?.baseUrl || 'https://api.porchestra.io/v1',\n skipTlsVerify: options.skipTlsVerify || false\n },\n cli: {\n ...cfg.cli,\n lastLoginAt: new Date().toISOString()\n }\n }));\n \n // DEBUG: Verify config was saved\n const savedConfig = await configManager.get();\n console.log(pc.yellow('\\n [DEBUG] Saved config auth:'));\n console.log(pc.yellow(` ${JSON.stringify(savedConfig.auth, null, 2)}`));\n } catch (saveError) {\n console.error(pc.red('\\n [DEBUG] Save error:'), saveError);\n throw saveError;\n }\n\n const expiresAt = new Date(result.expiresAt);\n const daysUntilExpiry = Math.ceil((expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n\n console.log(pc.green(`\n ā Login successful\n `));\n console.log(pc.gray(` Token expires in ${daysUntilExpiry} days (${result.expiresAt})`));\n console.log(pc.gray(` Device: ${result.deviceName}`));\n if (apiUrl) {\n console.log(pc.gray(` API: ${apiUrl}`));\n }\n console.log(pc.gray(` Auto-refresh: 7 days before expiry`));\n console.log();\n } catch (error) {\n console.error(pc.red(`\\n \\u2717 Login failed: ${(error as Error).message}`));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { confirm } from '@inquirer/prompts';\nimport { AuthService } from '../core/auth/auth-service.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\n\ninterface LogoutOptions {\n all?: boolean;\n}\n\nexport function createLogoutCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n return new Command('logout')\n .description('Logout and revoke CLI token')\n .option('--all', 'Revoke all device tokens (logout everywhere)')\n .action(async (options: LogoutOptions) => {\n const config = await configManager.get();\n \n if (!config.auth?.token) {\n console.log(pc.yellow('Not currently logged in'));\n return;\n }\n\n if (options.all) {\n const confirmed = await confirm({\n message: 'This will revoke ALL your CLI tokens on ALL devices. Continue?',\n default: false\n });\n if (!confirmed) return;\n }\n\n try {\n // Revoke on server\n await authService.revokeToken(config.auth.token, options.all);\n \n // Clear local config\n await configManager.clear();\n\n if (options.all) {\n console.log(pc.green('ā Revoked all tokens and logged out all devices'));\n } else {\n console.log(pc.green('ā Logged out successfully'));\n }\n } catch (error) {\n // Even if server revoke fails, clear local config\n await configManager.clear();\n console.log(pc.yellow('ā Cleared local credentials (server revoke may have failed)'));\n }\n });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { AuthService } from '../core/auth/auth-service.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\n\nexport function createWhoamiCommand(\n configManager: ConfigManager,\n authService: AuthService\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('whoami')\n .description('Show current user and token information')\n .action(async () => {\n const config = await configManager.get();\n \n if (!config.auth?.token) {\n console.log(pc.yellow('Not logged in. Run `porchestra login`'));\n return;\n }\n\n try {\n const userInfo = await authService.getCurrentUser(config.auth.token);\n const expiresAt = new Date(config.auth.expiresAt!);\n const isExpiringSoon = expiresAt.getTime() - Date.now() < 7 * 24 * 60 * 60 * 1000;\n\n console.log(pc.bold('\\nš¤ User Information\\n'));\n console.log(` Email: ${pc.cyan(userInfo.email)}`);\n console.log(` Name: ${userInfo.name || 'N/A'}`);\n \n console.log(pc.bold('\\nš Token Information\\n'));\n console.log(` Device: ${config.auth.deviceName || 'N/A'}`);\n console.log(` Expires: ${isExpiringSoon ? pc.yellow(expiresAt.toISOString()) : pc.green(expiresAt.toISOString())}`);\n \n if (isExpiringSoon) {\n console.log(pc.yellow(' ā ļø Expires within 7 days - will auto-refresh'));\n }\n \n if (config.api?.baseUrl !== 'https://api.porchestra.io/v1') {\n console.log(pc.bold('\\nš API Configuration\\n'));\n console.log(` URL: ${config.api?.baseUrl}`);\n }\n\n // Show tracked projects summary\n const summary = await projectTracker.getSummary();\n console.log(pc.bold('\\nš Tracked Projects\\n'));\n console.log(` Projects: ${summary.projectCount}`);\n console.log(` Agents: ${summary.agentCount}`);\n\n } catch (error) {\n console.log(pc.red('Failed to fetch user info. Token may be invalid.'));\n console.log(pc.gray('Run `porchestra login` to re-authenticate.'));\n }\n });\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { ApiClient } from '../core/api/client.js';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { CodeGenerator } from '../core/generators/code-generator.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\n\ninterface PullOptions {\n project?: string;\n agent?: string;\n version?: string;\n env?: 'PRODUCTION' | 'STAGING' | 'DEVELOPMENT';\n output?: string;\n force?: boolean;\n}\n\nexport function createPullCommand(\n configManager: ConfigManager,\n apiClient: ApiClient,\n codeGenerator: CodeGenerator\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('pull')\n .description('Generate tool code for tracked agents')\n .option('-p, --project <id>', 'Pull specific project only')\n .option('-a, --agent <id>', 'Pull specific agent only')\n .option('-e, --env <environment>', 'Target environment (production|staging|development)')\n .option('-o, --output <path>', 'Override output directory')\n .option('--force', 'Overwrite implementation files (WARNING: may lose code)')\n .action(async (options: PullOptions) => {\n // Check if logged in\n const config = await configManager.get();\n if (!config.auth?.token) {\n console.log(pc.red('Not logged in. Run `porchestra login` first.'));\n process.exit(1);\n }\n\n // Get tracked projects\n let trackedProjects = await projectTracker.getTrackedProjects();\n\n // Auto-trigger explore if no projects tracked\n if (trackedProjects.length === 0) {\n console.log(pc.yellow('\\nā No projects selected for tracking.\\n'));\n console.log(pc.gray('Starting project explorer...\\n'));\n \n // Import and run explore dynamically\n const { createExploreCommand } = await import('./explore.js');\n const exploreCmd = createExploreCommand(configManager, apiClient);\n // Execute the explore command to let user select projects\n await exploreCmd.parseAsync(['node', 'script', 'explore']);\n \n // Re-check tracking after explore\n trackedProjects = await projectTracker.getTrackedProjects();\n \n if (trackedProjects.length === 0) {\n console.log(pc.red('\\nā No projects selected. Run `porchestra explore` to select projects.'));\n process.exit(1);\n }\n }\n\n // Filter by options\n if (options.project) {\n trackedProjects = trackedProjects.filter(\n p => p.projectId === options.project || p.projectSlug === options.project\n );\n if (trackedProjects.length === 0) {\n console.log(pc.red(`Project \"${options.project}\" not found in tracked projects`));\n process.exit(1);\n }\n }\n\n // Pull each project\n const baseOutputDir = options.output || config.output?.baseDir || path.resolve(process.cwd(), 'src/porchestra/agents');\n let totalAgents = 0;\n let successCount = 0;\n\n for (const project of trackedProjects) {\n // Filter agents if specified\n let agents = project.agents;\n if (options.agent) {\n agents = agents.filter(\n a => a.agentId === options.agent || a.agentSlug === options.agent\n );\n }\n\n if (agents.length === 0) continue;\n\n console.log(pc.bold(`\\nš¦ ${project.projectName}\\n`));\n totalAgents += agents.length;\n\n // Process each agent with progress\n for (let i = 0; i < agents.length; i++) {\n const agent = agents[i];\n const progress = `[${i + 1}/${agents.length}]`;\n const spinner = ora(`${progress} Fetching ${agent.agentName}...`).start();\n\n try {\n // Fetch agent tools\n const toolsResponse = await apiClient.getAgentTools(\n project.projectId,\n agent.agentId,\n options.env\n );\n\n spinner.text = `${progress} Generating code...`;\n\n const normalizeToolset = (toolset: any[] = []) =>\n toolset.map((t, idx) => ({\n id: t.id ?? `toolset-${idx}`,\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? {},\n returns: t.returns ?? null,\n isBuiltin: t.isBuiltin ?? false,\n builtinType: t.builtinType,\n }));\n\n const rawToolConfig = toolsResponse?.components?.toolConfig?.content as any;\n const parsedToolConfig = (() => {\n if (typeof rawToolConfig === 'string') {\n try {\n return JSON.parse(rawToolConfig);\n } catch {\n return undefined;\n }\n }\n return rawToolConfig;\n })();\n\n const findToolArray = (value: any): any[] | undefined => {\n if (Array.isArray(value)) {\n const hasNamedObjects = value.every(v => v && typeof v === 'object' && 'name' in v);\n return hasNamedObjects ? value : undefined;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.toolset)) return value.toolset;\n if (Array.isArray(value.tools)) return value.tools;\n for (const key of Object.keys(value)) {\n const found = findToolArray((value as any)[key]);\n if (found) return found;\n }\n }\n return undefined;\n };\n\n const toolsetFromConfig = findToolArray(parsedToolConfig) ?? [];\n\n const resolvedTools = (toolsResponse?.tools && toolsResponse.tools.length > 0)\n ? toolsResponse.tools\n : (Array.isArray(toolsResponse?.toolset)\n ? normalizeToolset(toolsResponse.toolset)\n : normalizeToolset(toolsetFromConfig));\n\n if (!toolsResponse?.agent || !toolsResponse?.components) {\n throw new Error('Invalid tools response from API');\n }\n\n // Generate code\n const outputDir = codeGenerator.calculateOutputPath(\n baseOutputDir,\n agent.folderPath,\n toolsResponse.agent.name\n );\n\n await codeGenerator.generate({\n agent: toolsResponse.agent,\n tools: resolvedTools,\n components: toolsResponse.components,\n outputDir,\n forceOverwrite: options.force || false\n });\n\n spinner.succeed(`${progress} ${agent.agentName} ā ${pc.gray(outputDir)}`);\n successCount++;\n\n // Update last pulled info\n await projectTracker.updateLastPulled(\n project.projectId,\n agent.agentId,\n toolsResponse.agent.version\n );\n\n } catch (error) {\n spinner.fail(`${progress} ${agent.agentName}`);\n console.error(pc.red(` ā ${(error as Error).message}`));\n }\n }\n }\n\n // Summary\n console.log(pc.bold('\\n⨠Pull Complete\\n'));\n \n if (successCount === totalAgents) {\n console.log(` ${pc.green('ā')} Generated: ${successCount} / ${totalAgents} agents`);\n } else if (successCount > 0) {\n console.log(` ${pc.yellow('ā ')} Generated: ${successCount} / ${totalAgents} agents`);\n console.log(` ${pc.red('ā')} Failed: ${totalAgents - successCount} agents`);\n } else {\n console.log(` ${pc.red('ā')} Failed: All ${totalAgents} agents`);\n }\n \n console.log(` Output: ${pc.gray(baseOutputDir)}`);\n \n if (successCount > 0) {\n console.log(pc.gray('\\nNext steps:'));\n console.log(pc.gray(' 1. Implement tool functions in tool-impl.ts files'));\n console.log(pc.gray(' 2. Import and use the tool dispatcher in your code'));\n }\n \n console.log();\n \n // Exit with error if any agents failed\n if (successCount < totalAgents) {\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport pc from 'picocolors';\nimport { confirm, input } from '@inquirer/prompts';\n\nexport function createConfigCommand(configManager: ConfigManager): Command {\n const config = new Command('config')\n .description('Manage CLI configuration');\n\n config\n .command('get <key>')\n .description('Get a configuration value')\n .action(async (key: string) => {\n const cfg = await configManager.get();\n const value = getNestedValue(cfg, key);\n console.log(value !== undefined ? value : pc.gray('(not set)'));\n });\n\n config\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action(async (key: string, value: string) => {\n await configManager.update((cfg) => {\n return setNestedValue(cfg, key, parseValue(value));\n });\n console.log(pc.green(`ā Set ${key} = ${value}`));\n });\n\n config\n .command('list')\n .description('List all configuration values')\n .action(async () => {\n const cfg = await configManager.get();\n console.log(pc.bold('\\nConfiguration:'));\n printConfig(cfg);\n });\n\n config\n .command('api-url')\n .description('Get or set the API base URL')\n .argument('[url]', 'New API base URL')\n .action(async (url?: string) => {\n if (!url) {\n const cfg = await configManager.get();\n const current = cfg.api?.baseUrl;\n const value = await input({\n message: 'API base URL:',\n default: current || 'http://localhost:3000/api/v1',\n validate: (val) => {\n try {\n const parsed = new URL(val);\n if (!parsed.protocol.startsWith('http')) {\n return 'URL must start with http:// or https://';\n }\n return true;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n });\n\n await configManager.update((cfg) => ({\n ...cfg,\n api: {\n ...cfg.api,\n baseUrl: value,\n },\n }));\n\n console.log(pc.green(`ā API base URL set to ${value}`));\n return;\n }\n\n await configManager.update((cfg) => ({\n ...cfg,\n api: {\n ...cfg.api,\n baseUrl: url,\n },\n }));\n\n console.log(pc.green(`ā API base URL set to ${url}`));\n });\n\n config\n .command('reset')\n .description('Reset all configuration (WARNING: clears auth)')\n .option('--force', 'Skip confirmation')\n .action(async (options) => {\n if (!options.force) {\n const confirmed = await confirm({\n message: 'This will clear all config including login. Continue?',\n default: false\n });\n if (!confirmed) return;\n }\n await configManager.clear();\n console.log(pc.green('ā Configuration reset'));\n });\n\n return config;\n}\n\nfunction getNestedValue(obj: any, key: string): any {\n return key.split('.').reduce((o, k) => o?.[k], obj);\n}\n\nfunction setNestedValue(obj: any, key: string, value: any): any {\n const keys = key.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((o, k) => {\n if (!o[k]) o[k] = {};\n return o[k];\n }, obj);\n target[last] = value;\n return obj;\n}\n\nfunction parseValue(value: string): any {\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (!isNaN(Number(value))) return Number(value);\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction printConfig(obj: any, prefix = ''): void {\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n console.log(`\\n${pc.cyan(fullKey)}:`);\n printConfig(value, fullKey);\n } else {\n const displayValue = key.includes('token') \n ? pc.gray('***hidden***') \n : value;\n console.log(` ${fullKey} = ${displayValue}`);\n }\n }\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { ConfigManager } from '../core/config/config-manager.js';\nimport { ProjectTracker } from '../core/config/project-tracker.js';\nimport { formatDistanceToNow } from '../utils/date.js';\n\nexport function createStatusCommand(\n configManager: ConfigManager\n): Command {\n const projectTracker = new ProjectTracker(configManager);\n\n return new Command('status')\n .description('Show CLI status and tracked projects')\n .action(async () => {\n const config = await configManager.get();\n \n console.log(pc.bold('\\nš Porchestra CLI Status\\n'));\n\n // Auth status\n if (config.auth?.token) {\n const expiresAt = new Date(config.auth.expiresAt!);\n const daysUntilExpiry = Math.ceil(\n (expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24)\n );\n const expiryColor = daysUntilExpiry < 7 ? pc.yellow : pc.green;\n \n console.log(pc.bold('š Authentication'));\n console.log(` Status: ${pc.green('ā Logged in')}`);\n console.log(` Device: ${config.auth.deviceName}`);\n console.log(` Expires: ${expiryColor(daysUntilExpiry + ' days')} (${config.auth.expiresAt})`);\n } else {\n console.log(pc.bold('š Authentication'));\n console.log(` Status: ${pc.yellow('ā Not logged in')}`);\n console.log(pc.gray(' Run `porchestra login` to authenticate'));\n }\n\n // API Configuration\n console.log(pc.bold('\\nš API Configuration'));\n console.log(` URL: ${config.api?.baseUrl || pc.gray('(default)')}`);\n if (config.api?.skipTlsVerify) {\n console.log(pc.yellow(` ā ļø TLS verification disabled`));\n }\n\n // Tracked Projects\n const projects = await projectTracker.getTrackedProjects();\n console.log(pc.bold('\\nš Tracked Projects'));\n \n if (projects.length === 0) {\n console.log(pc.gray(' No projects tracked'));\n console.log(pc.gray(' Run `porchestra explore` to select projects'));\n } else {\n console.log(` Projects: ${projects.length}`);\n console.log(` Agents: ${projects.reduce((sum, p) => sum + p.agents.length, 0)}`);\n \n projects.forEach(project => {\n const lastPulled = project.lastPulledAt \n ? formatDistanceToNow(new Date(project.lastPulledAt))\n : pc.gray('never');\n \n console.log(pc.gray(`\\n ${project.projectName}`));\n project.agents.forEach(agent => {\n const agentPulled = agent.lastPulledAt\n ? formatDistanceToNow(new Date(agent.lastPulledAt))\n : pc.gray('pending');\n console.log(pc.gray(` āā ${agent.agentName} ${pc.cyan(agent.folderPath)} (${agentPulled})`));\n });\n console.log(pc.gray(` Last pulled: ${lastPulled}`));\n });\n }\n\n // Output Configuration\n console.log(pc.bold('\\nš Output Configuration'));\n console.log(` Base dir: ${config.output?.baseDir || './src/agents'}`);\n console.log(` Index files: ${config.output?.createIndexFiles ? 'yes' : 'no'}`);\n\n console.log();\n });\n}\n","import { Command } from 'commander';\r\nimport { select, confirm } from '@inquirer/prompts';\r\nimport pc from 'picocolors';\r\nimport { ConfigManager } from '../core/config/config-manager.js';\r\nimport { ProjectTracker } from '../core/config/project-tracker.js';\r\nimport { formatDistanceToNow } from '../utils/date.js';\r\n\r\ninterface ListOptions {\r\n project?: string;\r\n json?: boolean;\r\n}\r\n\r\ninterface RemoveOptions {\r\n project?: string;\r\n force?: boolean;\r\n}\r\n\r\nexport function createAgentsCommand(configManager: ConfigManager): Command {\r\n const projectTracker = new ProjectTracker(configManager);\r\n\r\n const listAction = async (options: ListOptions = {}) => {\r\n let projects = await projectTracker.getTrackedProjects();\r\n\r\n if (options.project) {\r\n projects = projects.filter(\r\n project => project.projectId === options.project || project.projectSlug === options.project\r\n );\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.red(`No tracked project found for \"${options.project}\"`));\r\n return;\r\n }\r\n }\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(projects, null, 2));\r\n return;\r\n }\r\n\r\n console.log(pc.bold('\\nš Tracked Agents\\n'));\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.gray(' No agents tracked. Run `porchestra explore` to add agents.'));\r\n console.log();\r\n return;\r\n }\r\n\r\n let totalAgents = 0;\r\n\r\n projects.forEach((project) => {\r\n totalAgents += project.agents.length;\r\n console.log(pc.bold(` ${project.projectName}`));\r\n\r\n project.agents.forEach((agent) => {\r\n const lastPulled = agent.lastPulledAt\r\n ? formatDistanceToNow(new Date(agent.lastPulledAt))\r\n : 'pending';\r\n const version = agent.lastPulledVersion ? ` @ ${agent.lastPulledVersion}` : '';\r\n\r\n console.log(` āā ${pc.cyan(agent.agentName)}${version ? pc.gray(version) : ''}`);\r\n console.log(pc.gray(` ${agent.folderPath} (${lastPulled})`));\r\n });\r\n\r\n console.log();\r\n });\r\n\r\n console.log(pc.gray(`Total: ${projects.length} project(s), ${totalAgents} agent(s)\\n`));\r\n };\r\n\r\n const command = new Command('agents')\r\n .description('Manage tracked agents')\r\n .action(async () => listAction());\r\n\r\n command\r\n .command('list')\r\n .description('List tracked agents')\r\n .option('-p, --project <id>', 'Filter by project id or slug')\r\n .option('--json', 'Output raw JSON for scripting')\r\n .action(listAction);\r\n\r\n command\r\n .command('remove [agent]')\r\n .description('Stop tracking a specific agent')\r\n .option('-p, --project <id>', 'Project id or slug (disambiguates agents with the same slug)')\r\n .option('-f, --force', 'Skip confirmation prompt')\r\n .action(async (agentArg: string | undefined, options: RemoveOptions) => {\r\n let projects = await projectTracker.getTrackedProjects();\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.gray('No agents tracked. Run `porchestra explore` first.'));\r\n return;\r\n }\r\n\r\n if (options.project) {\r\n projects = projects.filter(\r\n project => project.projectId === options.project || project.projectSlug === options.project\r\n );\r\n\r\n if (projects.length === 0) {\r\n console.log(pc.red(`No tracked project found for \"${options.project}\"`));\r\n return;\r\n }\r\n }\r\n\r\n const candidates = projects.flatMap((project) =>\r\n project.agents.map((agent) => ({\r\n project,\r\n agent,\r\n value: `${project.projectId}:${agent.agentId}`,\r\n }))\r\n );\r\n\r\n let filtered = candidates;\r\n\r\n if (agentArg) {\r\n filtered = candidates.filter(({ agent }) =>\r\n agent.agentId === agentArg || agent.agentSlug === agentArg\r\n );\r\n }\r\n\r\n if (filtered.length === 0) {\r\n const message = agentArg\r\n ? `No tracked agent found for \"${agentArg}\".`\r\n : 'No tracked agents found.';\r\n console.log(pc.red(message));\r\n return;\r\n }\r\n\r\n let target = filtered[0];\r\n\r\n if (filtered.length > 1) {\r\n const choice = await select({\r\n message: 'Select an agent to stop tracking:',\r\n choices: filtered.map(({ project, agent, value }) => ({\r\n name: `${agent.agentName} ${pc.gray(`(${project.projectName}) ${agent.folderPath}`)}`,\r\n value,\r\n })),\r\n });\r\n\r\n target = filtered.find(candidate => candidate.value === choice)!;\r\n }\r\n\r\n if (!options.force) {\r\n const confirmed = await confirm({\r\n message: `Remove ${target.agent.agentName} from ${target.project.projectName}?`,\r\n default: false,\r\n });\r\n\r\n if (!confirmed) return;\r\n }\r\n\r\n const removed = await projectTracker.untrackAgent(\r\n target.project.projectId,\r\n target.agent.agentId\r\n );\r\n\r\n if (!removed) {\r\n console.log(pc.red('Agent was not removed (not found).'));\r\n return;\r\n }\r\n\r\n const projectRemoved = target.project.agents.length === 1;\r\n\r\n console.log(pc.green(`ā Stopped tracking ${target.agent.agentName}`));\r\n console.log(pc.gray(` Project: ${target.project.projectName}`));\r\n\r\n if (projectRemoved) {\r\n console.log(pc.gray(' Project removed from tracking because it has no remaining agents.'));\r\n }\r\n });\r\n\r\n return command;\r\n}\r\n"],"mappings":"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","names":["Command","confirm","pc","Command","pc","z","z","os","got","got","fs","path","path","path","fs","path","input","Command","pc","Command","pc","Command","path","pc","ora","createExploreCommand","Command","pc","confirm","input","cfg","Command","pc","Command","select","confirm","pc","pc","Command"]}
|