@openbuilder/cli 0.31.11

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.
Files changed (78) hide show
  1. package/README.md +1053 -0
  2. package/bin/openbuilder.js +31 -0
  3. package/dist/chunks/Banner-D4tqKfzA.js +113 -0
  4. package/dist/chunks/Banner-D4tqKfzA.js.map +1 -0
  5. package/dist/chunks/auto-update-Dj3lWPWO.js +350 -0
  6. package/dist/chunks/auto-update-Dj3lWPWO.js.map +1 -0
  7. package/dist/chunks/build-D0qYqIq0.js +116 -0
  8. package/dist/chunks/build-D0qYqIq0.js.map +1 -0
  9. package/dist/chunks/cleanup-qVTsA3tk.js +141 -0
  10. package/dist/chunks/cleanup-qVTsA3tk.js.map +1 -0
  11. package/dist/chunks/cli-error-BjQwvWtK.js +140 -0
  12. package/dist/chunks/cli-error-BjQwvWtK.js.map +1 -0
  13. package/dist/chunks/config-BGP1jZJ4.js +167 -0
  14. package/dist/chunks/config-BGP1jZJ4.js.map +1 -0
  15. package/dist/chunks/config-manager-BkbjtN-H.js +133 -0
  16. package/dist/chunks/config-manager-BkbjtN-H.js.map +1 -0
  17. package/dist/chunks/database-BvAbD4sP.js +68 -0
  18. package/dist/chunks/database-BvAbD4sP.js.map +1 -0
  19. package/dist/chunks/database-setup-BYjIRAmT.js +253 -0
  20. package/dist/chunks/database-setup-BYjIRAmT.js.map +1 -0
  21. package/dist/chunks/exports-ij9sv4UM.js +7793 -0
  22. package/dist/chunks/exports-ij9sv4UM.js.map +1 -0
  23. package/dist/chunks/init-CZoN6soU.js +468 -0
  24. package/dist/chunks/init-CZoN6soU.js.map +1 -0
  25. package/dist/chunks/init-tui-BNzk_7Yx.js +1127 -0
  26. package/dist/chunks/init-tui-BNzk_7Yx.js.map +1 -0
  27. package/dist/chunks/logger-ZpJi7chw.js +38 -0
  28. package/dist/chunks/logger-ZpJi7chw.js.map +1 -0
  29. package/dist/chunks/main-tui-Cq1hLCx-.js +644 -0
  30. package/dist/chunks/main-tui-Cq1hLCx-.js.map +1 -0
  31. package/dist/chunks/manager-CvGX9qqe.js +1161 -0
  32. package/dist/chunks/manager-CvGX9qqe.js.map +1 -0
  33. package/dist/chunks/port-allocator-BRFzgH9b.js +749 -0
  34. package/dist/chunks/port-allocator-BRFzgH9b.js.map +1 -0
  35. package/dist/chunks/process-killer-CaUL7Kpl.js +87 -0
  36. package/dist/chunks/process-killer-CaUL7Kpl.js.map +1 -0
  37. package/dist/chunks/prompts-1QbE_bRr.js +128 -0
  38. package/dist/chunks/prompts-1QbE_bRr.js.map +1 -0
  39. package/dist/chunks/repo-cloner-CpOQjFSo.js +219 -0
  40. package/dist/chunks/repo-cloner-CpOQjFSo.js.map +1 -0
  41. package/dist/chunks/repo-detector-B_oj696o.js +66 -0
  42. package/dist/chunks/repo-detector-B_oj696o.js.map +1 -0
  43. package/dist/chunks/run-D23hg4xy.js +630 -0
  44. package/dist/chunks/run-D23hg4xy.js.map +1 -0
  45. package/dist/chunks/runner-logger-instance-nDWv2h2T.js +899 -0
  46. package/dist/chunks/runner-logger-instance-nDWv2h2T.js.map +1 -0
  47. package/dist/chunks/spinner-BJL9zWAJ.js +53 -0
  48. package/dist/chunks/spinner-BJL9zWAJ.js.map +1 -0
  49. package/dist/chunks/start-BygPCbvw.js +1708 -0
  50. package/dist/chunks/start-BygPCbvw.js.map +1 -0
  51. package/dist/chunks/start-traditional-uoLZXdxm.js +255 -0
  52. package/dist/chunks/start-traditional-uoLZXdxm.js.map +1 -0
  53. package/dist/chunks/status-cS8YwtUx.js +97 -0
  54. package/dist/chunks/status-cS8YwtUx.js.map +1 -0
  55. package/dist/chunks/theme-DhorI2Hb.js +44 -0
  56. package/dist/chunks/theme-DhorI2Hb.js.map +1 -0
  57. package/dist/chunks/upgrade-CT6w0lKp.js +323 -0
  58. package/dist/chunks/upgrade-CT6w0lKp.js.map +1 -0
  59. package/dist/chunks/useBuildState-CdBSu9y_.js +331 -0
  60. package/dist/chunks/useBuildState-CdBSu9y_.js.map +1 -0
  61. package/dist/cli/index.js +694 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/index.js +14358 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/instrument.js +64226 -0
  66. package/dist/instrument.js.map +1 -0
  67. package/dist/templates.json +295 -0
  68. package/package.json +98 -0
  69. package/scripts/install-vendor-deps.js +34 -0
  70. package/scripts/install-vendor.js +167 -0
  71. package/scripts/prepare-release.js +71 -0
  72. package/templates/config.template.json +18 -0
  73. package/templates.json +295 -0
  74. package/vendor/ai-sdk-provider-claude-code-LOCAL.tgz +0 -0
  75. package/vendor/sentry-core-LOCAL.tgz +0 -0
  76. package/vendor/sentry-nextjs-LOCAL.tgz +0 -0
  77. package/vendor/sentry-node-LOCAL.tgz +0 -0
  78. package/vendor/sentry-node-core-LOCAL.tgz +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-allocator-BRFzgH9b.js","sources":["../../../../packages/agent-core/dist/lib/port-allocator.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/lib/db/client.ts\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport pg from \"pg\";\n\n// src/lib/db/schema.ts\nvar schema_exports = {};\n__export(schema_exports, {\n accounts: () => accounts,\n generationNotes: () => generationNotes,\n generationSessions: () => generationSessions,\n generationTodos: () => generationTodos,\n generationToolCalls: () => generationToolCalls,\n messages: () => messages,\n portAllocations: () => portAllocations,\n projects: () => projects,\n runnerKeys: () => runnerKeys,\n runningProcesses: () => runningProcesses,\n serverOperations: () => serverOperations,\n sessions: () => sessions,\n users: () => users,\n verifications: () => verifications\n});\nimport { pgTable, text, integer, timestamp, uuid, jsonb, index, uniqueIndex, boolean } from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm\";\nvar users = pgTable(\"users\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"email_verified\").notNull().default(false),\n image: text(\"image\"),\n hasCompletedOnboarding: boolean(\"has_completed_onboarding\").notNull().default(false),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n});\nvar sessions = pgTable(\"sessions\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n token: text(\"token\").notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n userIdIdx: index(\"sessions_user_id_idx\").on(table.userId),\n tokenIdx: index(\"sessions_token_idx\").on(table.token)\n}));\nvar accounts = pgTable(\"accounts\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n // 'credential', 'google', etc.\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\"),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\"),\n scope: text(\"scope\"),\n idToken: text(\"id_token\"),\n // ID token from OAuth providers\n password: text(\"password\"),\n // Hashed password for credential provider\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n userIdIdx: index(\"accounts_user_id_idx\").on(table.userId),\n providerAccountIdx: uniqueIndex(\"accounts_provider_account_idx\").on(table.providerId, table.accountId)\n}));\nvar verifications = pgTable(\"verifications\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n identifier: text(\"identifier\").notNull(),\n // email or other identifier\n value: text(\"value\").notNull(),\n // verification token\n expiresAt: timestamp(\"expires_at\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n identifierIdx: index(\"verifications_identifier_idx\").on(table.identifier)\n}));\nvar runnerKeys = pgTable(\"runner_keys\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n // User-friendly name like \"My MacBook\"\n keyHash: text(\"key_hash\").notNull(),\n // SHA-256 hash of the full key\n keyPrefix: text(\"key_prefix\").notNull(),\n // First 8 chars for display: \"sv_abc123...\"\n lastUsedAt: timestamp(\"last_used_at\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n revokedAt: timestamp(\"revoked_at\")\n // Soft delete - null means active\n}, (table) => ({\n userIdIdx: index(\"runner_keys_user_id_idx\").on(table.userId),\n keyHashIdx: uniqueIndex(\"runner_keys_key_hash_idx\").on(table.keyHash)\n}));\nvar projects = pgTable(\"projects\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id, { onDelete: \"set null\" }),\n // Owner of the project (nullable for migration/local mode)\n name: text(\"name\").notNull(),\n slug: text(\"slug\").notNull().unique(),\n description: text(\"description\"),\n originalPrompt: text(\"original_prompt\"),\n icon: text(\"icon\").default(\"Folder\"),\n status: text(\"status\").notNull().default(\"pending\"),\n projectType: text(\"project_type\"),\n detectedFramework: text(\"detected_framework\"),\n // Auto-detected framework (astro, next, vite, etc.)\n path: text(\"path\"),\n // Nullable - deprecated, path should be calculated from slug\n runCommand: text(\"run_command\"),\n port: integer(\"port\"),\n devServerPid: integer(\"dev_server_pid\"),\n devServerPort: integer(\"dev_server_port\"),\n devServerStatus: text(\"dev_server_status\").default(\"stopped\"),\n devServerStatusUpdatedAt: timestamp(\"dev_server_status_updated_at\").defaultNow(),\n tunnelUrl: text(\"tunnel_url\"),\n runnerId: text(\"runner_id\"),\n // Runner that created/manages this project\n generationState: text(\"generation_state\"),\n designPreferences: jsonb(\"design_preferences\"),\n // User-specified design constraints (deprecated - use tags)\n tags: jsonb(\"tags\"),\n // Tag-based configuration system\n lastActivityAt: timestamp(\"last_activity_at\").defaultNow(),\n errorMessage: text(\"error_message\"),\n // GitHub integration fields\n githubRepo: text(\"github_repo\"),\n // e.g., \"owner/repo-name\"\n githubUrl: text(\"github_url\"),\n // Full repository URL\n githubBranch: text(\"github_branch\"),\n // Default branch (e.g., \"main\")\n githubLastPushedAt: timestamp(\"github_last_pushed_at\"),\n // Last push timestamp\n githubAutoPush: boolean(\"github_auto_push\").default(false),\n // Auto-push after builds\n githubLastSyncAt: timestamp(\"github_last_sync_at\"),\n // Last time we synced repo info\n githubMeta: jsonb(\"github_meta\"),\n // Additional metadata (issues count, recent commits, etc.)\n // NeonDB integration fields\n neondbConnectionString: text(\"neondb_connection_string\"),\n // DATABASE_URL (encrypted/partial)\n neondbClaimUrl: text(\"neondb_claim_url\"),\n // URL to claim the database\n neondbHost: text(\"neondb_host\"),\n // Database host endpoint\n neondbDatabase: text(\"neondb_database\"),\n // Database name\n neondbCreatedAt: timestamp(\"neondb_created_at\"),\n // When database was provisioned\n neondbExpiresAt: timestamp(\"neondb_expires_at\"),\n // When unclaimed DB expires (72 hours)\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n // Indexes for performance\n userIdIdx: index(\"projects_user_id_idx\").on(table.userId),\n runnerIdIdx: index(\"projects_runner_id_idx\").on(table.runnerId),\n statusIdx: index(\"projects_status_idx\").on(table.status),\n lastActivityIdx: index(\"projects_last_activity_idx\").on(table.lastActivityAt)\n}));\nvar messages = pgTable(\"messages\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n role: text(\"role\").notNull(),\n content: text(\"content\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow()\n});\nvar portAllocations = pgTable(\"port_allocations\", {\n port: integer(\"port\").primaryKey(),\n framework: text(\"framework\").notNull(),\n projectId: uuid(\"project_id\").references(() => projects.id, { onDelete: \"set null\" }),\n reservedAt: timestamp(\"reserved_at\").defaultNow()\n});\nvar runningProcesses = pgTable(\"running_processes\", {\n projectId: uuid(\"project_id\").primaryKey().notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n pid: integer(\"pid\").notNull(),\n port: integer(\"port\"),\n command: text(\"command\"),\n runnerId: text(\"runner_id\"),\n // Runner that manages this process\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n lastHealthCheck: timestamp(\"last_health_check\"),\n healthCheckFailCount: integer(\"health_check_fail_count\").notNull().default(0)\n}, (table) => ({\n // Index for filtering by runner\n runnerIdIdx: index(\"running_processes_runner_id_idx\").on(table.runnerId)\n}));\nvar generationSessions = pgTable(\"generation_sessions\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n buildId: text(\"build_id\").notNull(),\n operationType: text(\"operation_type\"),\n status: text(\"status\").notNull().default(\"active\"),\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n endedAt: timestamp(\"ended_at\"),\n summary: text(\"summary\"),\n rawState: jsonb(\"raw_state\"),\n isAutoFix: boolean(\"is_auto_fix\").default(false),\n // Flag for auto-fix sessions triggered by startup errors\n autoFixError: text(\"auto_fix_error\"),\n // The error message that triggered the auto-fix\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n projectIdIdx: index(\"generation_sessions_project_id_idx\").on(table.projectId),\n buildIdUnique: uniqueIndex(\"generation_sessions_build_id_unique\").on(table.buildId)\n}));\nvar generationTodos = pgTable(\"generation_todos\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n content: text(\"content\").notNull(),\n activeForm: text(\"active_form\"),\n status: text(\"status\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_todos_session_id_idx\").on(table.sessionId),\n sessionIndexUnique: uniqueIndex(\"generation_todos_session_index_unique\").on(table.sessionId, table.todoIndex)\n}));\nvar generationToolCalls = pgTable(\"generation_tool_calls\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n toolCallId: text(\"tool_call_id\").notNull(),\n name: text(\"name\").notNull(),\n input: jsonb(\"input\"),\n output: jsonb(\"output\"),\n state: text(\"state\").notNull(),\n startedAt: timestamp(\"started_at\").notNull().defaultNow(),\n endedAt: timestamp(\"ended_at\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_tool_calls_session_id_idx\").on(table.sessionId),\n toolCallUnique: uniqueIndex(\"generation_tool_calls_call_id_unique\").on(table.sessionId, table.toolCallId)\n}));\nvar generationNotes = pgTable(\"generation_notes\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sessionId: uuid(\"session_id\").notNull().references(() => generationSessions.id, { onDelete: \"cascade\" }),\n todoIndex: integer(\"todo_index\").notNull(),\n textId: text(\"text_id\"),\n kind: text(\"kind\").notNull().default(\"text\"),\n content: text(\"content\").notNull(),\n createdAt: timestamp(\"created_at\").notNull().defaultNow()\n}, (table) => ({\n sessionIdIdx: index(\"generation_notes_session_id_idx\").on(table.sessionId),\n textIdUnique: uniqueIndex(\"generation_notes_text_id_unique\").on(table.sessionId, table.textId).where(sql`${table.textId} is not null`)\n}));\nvar serverOperations = pgTable(\"server_operations\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n operation: text(\"operation\").notNull(),\n // 'start', 'stop', 'restart'\n status: text(\"status\").notNull().default(\"pending\"),\n // 'pending', 'sent', 'ack', 'completed', 'failed', 'timeout'\n runnerId: text(\"runner_id\"),\n port: integer(\"port\"),\n pid: integer(\"pid\"),\n error: text(\"error\"),\n failureReason: text(\"failure_reason\"),\n // 'port_in_use', 'health_check_timeout', 'immediate_crash', etc.\n retryCount: integer(\"retry_count\").notNull().default(0),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").notNull().defaultNow(),\n sentAt: timestamp(\"sent_at\"),\n ackAt: timestamp(\"ack_at\"),\n completedAt: timestamp(\"completed_at\")\n}, (table) => ({\n projectIdIdx: index(\"server_operations_project_id_idx\").on(table.projectId),\n statusIdx: index(\"server_operations_status_idx\").on(table.status),\n createdAtIdx: index(\"server_operations_created_at_idx\").on(table.createdAt)\n}));\n\n// src/lib/db/client.ts\nvar { Pool } = pg;\nfunction createPostgresClient() {\n const connectionString = process.env.DATABASE_URL;\n if (!connectionString) {\n throw new Error(\n 'DATABASE_URL is not set. Please configure your database connection:\\n - Run \"openbuilder init\" to set up a Neon database\\n - Or set DATABASE_URL environment variable to your PostgreSQL connection string'\n );\n }\n const pool = new Pool({\n connectionString,\n ssl: process.env.PGSSLMODE === \"disable\" ? false : { rejectUnauthorized: false }\n });\n const client = drizzle(pool, { schema: schema_exports });\n return client;\n}\nvar db = new Proxy({}, {\n get(_target, prop) {\n if (!global.__db) {\n global.__db = createPostgresClient();\n }\n return global.__db[prop];\n }\n});\n\n// src/lib/port-allocator.ts\nimport { and, eq, isNull, sql as sql2, isNotNull, lt } from \"drizzle-orm\";\nimport { createServer } from \"net\";\nimport { readFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\n// src/lib/logging/build-logger.ts\nimport * as Sentry from \"@sentry/node\";\nvar BuildLogger = class {\n buildId = null;\n projectId = null;\n /**\n * Set correlation IDs for the current build\n * Call this at the start of each build to enable correlation tracking\n */\n setBuildContext(buildId, projectId) {\n this.buildId = buildId;\n this.projectId = projectId;\n this.log(\"debug\", \"runner\", `Build context set: ${buildId} / ${projectId}`);\n }\n /**\n * Clear correlation IDs after build completes\n */\n clearBuildContext() {\n this.log(\"debug\", \"runner\", \"Build context cleared\");\n this.buildId = null;\n this.projectId = null;\n }\n /**\n * Core logging method - creates structured log entries\n * Public for custom logging needs\n */\n log(level, context, message, data) {\n if (process.env.SILENT_MODE === \"1\") {\n return;\n }\n if (level === \"info\" || level === \"debug\") {\n if (process.env.DEBUG_BUILD === \"0\") {\n return;\n }\n }\n const entry = {\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n level,\n context,\n buildId: this.buildId ?? void 0,\n projectId: this.projectId ?? void 0,\n message,\n data\n };\n const prefix = `[${context}]`;\n const icon = {\n debug: \"\\u{1F50D}\",\n info: \"\\u{1F4CB}\",\n warn: \"\\u26A0\\uFE0F \",\n error: \"\\u274C\"\n }[level];\n const logFn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n if (data && Object.keys(data).length > 0) {\n logFn(`${icon} ${prefix} ${message}`, data);\n } else {\n logFn(`${icon} ${prefix} ${message}`);\n }\n if (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"test\") {\n try {\n if (level === \"warn\" || level === \"error\") {\n Sentry.addBreadcrumb({\n category: `build-logger.${context}`,\n message,\n level: level === \"error\" ? \"error\" : \"warning\",\n data: {\n ...data,\n buildId: this.buildId,\n projectId: this.projectId\n }\n });\n }\n } catch {\n }\n }\n }\n /**\n * Orchestrator-specific logging methods\n */\n orchestrator = {\n newProject: (operationType) => this.log(\"info\", \"orchestrator\", `NEW PROJECT (operationType: ${operationType})`),\n existingProject: (operationType) => this.log(\"info\", \"orchestrator\", `EXISTING PROJECT (operationType: ${operationType})`),\n templateProvided: (templateName, templateId, framework) => this.log(\"info\", \"orchestrator\", `Frontend provided template: ${templateName}`, {\n templateId,\n framework\n }),\n templateSelecting: (method) => this.log(\"info\", \"orchestrator\", `Template selection: ${method}`),\n templateSelected: (templateName, templateId) => this.log(\"info\", \"orchestrator\", `Selected template: ${templateName}`, { templateId }),\n templateDownloading: (templateName, repository, target) => this.log(\"info\", \"orchestrator\", `Downloading template: ${templateName}`, {\n repository,\n target\n }),\n templateDownloaded: (templateName, path, fileTreeSize) => this.log(\"info\", \"orchestrator\", `Template downloaded: ${templateName}`, {\n path,\n fileTreeSize\n }),\n catalogPrepared: (catalogSize) => this.log(\"info\", \"orchestrator\", `Template catalog prepared (${catalogSize} chars)`, {\n catalogSize\n }),\n systemPromptGenerated: (size) => this.log(\"info\", \"orchestrator\", `System prompt generated (${size} chars)`, { size }),\n orchestrationComplete: (data) => this.log(\"info\", \"orchestrator\", \"Orchestration complete\", data),\n error: (message, error) => this.log(\"error\", \"orchestrator\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Message transformer-specific logging methods\n */\n transformer = {\n todoListFound: () => this.log(\"debug\", \"transformer\", \"Found Codex task list, parsing...\"),\n todoListParsed: (todoCount, completed, inProgress, pending) => this.log(\"info\", \"transformer\", `Parsed ${todoCount} todos`, {\n completed,\n inProgress,\n pending\n }),\n todoListInvalidFormat: (expected, got) => this.log(\"error\", \"transformer\", \"Invalid todo format from Codex\", {\n expected,\n got: JSON.stringify(got).substring(0, 200)\n }),\n todoListParseError: (error, rawJson) => this.log(\"error\", \"transformer\", \"Failed to parse Codex todolist\", {\n error: String(error),\n rawJson: rawJson.substring(0, 300)\n }),\n todoListRemoved: () => this.log(\"debug\", \"transformer\", \"Removed task list from chat text\"),\n toolStarted: (toolName, toolId) => this.log(\"debug\", \"transformer\", `Tool started: ${toolName}`, { toolName, toolId }),\n toolCompleted: (toolName, toolId) => this.log(\"debug\", \"transformer\", `Tool completed: ${toolName}`, { toolName, toolId }),\n pathViolationWarning: (toolName, path, workspace) => this.log(\"warn\", \"transformer\", `Path outside workspace: ${path}`, {\n toolName,\n path,\n workspace\n }),\n desktopPathDetected: (path) => this.log(\"error\", \"transformer\", `DESKTOP PATH DETECTED - Likely hallucinated: ${path}`, { path })\n };\n /**\n * Codex query-specific logging methods\n */\n codexQuery = {\n promptBuilding: (workingDirectory, systemPromptSize, userPromptSize) => this.log(\"info\", \"codex-query\", \"Building Codex prompt\", {\n workingDirectory,\n systemPromptSize,\n userPromptSize\n }),\n threadStarting: () => this.log(\"info\", \"codex-query\", \"Starting Codex thread (multi-turn)\"),\n turnStarted: (turnNumber, maxTurns, promptSize) => this.log(\"info\", \"codex-query\", `\\u2550\\u2550\\u2550 Turn ${turnNumber}/${maxTurns} \\u2550\\u2550\\u2550`, {\n turnNumber,\n maxTurns,\n promptSize\n }),\n taskListExtracted: () => this.log(\"info\", \"codex-query\", \"Task list extracted and updated\"),\n taskListStatus: (completed, inProgress, pending, total) => this.log(\"info\", \"codex-query\", `Tasks: ${completed} completed | ${inProgress} in_progress | ${pending} pending (total: ${total})`, {\n completed,\n inProgress,\n pending,\n total\n }),\n taskListTask: (index2, content, status, icon) => this.log(\"debug\", \"codex-query\", ` ${icon} ${index2 + 1}. ${content}`, { status }),\n taskListParseError: (error, rawContent) => this.log(\"error\", \"codex-query\", \"PARSE ERROR: Could not parse task list JSON\", {\n error: String(error),\n rawContent: rawContent.substring(0, 200)\n }),\n taskListMissing: (turnNumber) => this.log(\"warn\", \"codex-query\", `WARNING: No <start-todolist> tags found in Turn ${turnNumber}`, {\n turnNumber\n }),\n turnComplete: (turnNumber, hadToolCalls, messageLength) => this.log(\"info\", \"codex-query\", `Turn ${turnNumber} complete`, {\n hadToolCalls,\n messageLength\n }),\n tasksComplete: (completed, total) => this.log(\"info\", \"codex-query\", `Task status: ${completed}/${total} completed`, {\n completed,\n total\n }),\n allComplete: () => this.log(\"info\", \"codex-query\", \"\\u2705 All MVP tasks complete!\"),\n allTasksComplete: () => this.log(\"info\", \"codex-query\", \"\\u2705 All MVP tasks complete!\"),\n taskCompleteDetected: () => this.log(\"info\", \"codex-query\", \"\\u2705 Task complete (detected completion signal)\"),\n continuePrompting: (reason) => this.log(\"warn\", \"codex-query\", `No tools used but not done - ${reason}`),\n continuing: () => this.log(\"info\", \"codex-query\", \"\\u23ED\\uFE0F Continuing to next turn (had tool calls)\"),\n loopExited: (turnCount, maxTurns) => this.log(\"info\", \"codex-query\", `EXITED WHILE LOOP after ${turnCount} turns`, {\n turnCount,\n maxTurns\n }),\n sessionComplete: (turnCount) => this.log(\"info\", \"codex-query\", `Session complete after ${turnCount} turns`, { turnCount }),\n error: (message, error) => this.log(\"error\", \"codex-query\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Claude query-specific logging methods\n */\n claudeQuery = {\n queryStarted: (model, cwd, maxTurns) => this.log(\"info\", \"claude-query\", `Starting Claude query (${model})`, {\n cwd,\n maxTurns\n }),\n error: (message, error) => this.log(\"error\", \"claude-query\", message, {\n error: error instanceof Error ? error.message : String(error)\n })\n };\n /**\n * Runner-specific logging methods\n */\n runner = {\n workspaceRoot: (path) => this.log(\"info\", \"runner\", `Workspace root: ${path}`, { path }),\n commandReceived: (commandType, projectId) => this.log(\"info\", \"runner\", `Received command: ${commandType}`, { commandType, projectId }),\n buildOperation: (operationType, projectSlug, agentId) => this.log(\"info\", \"runner\", `Build operation: ${operationType}`, {\n operationType,\n projectSlug,\n agentId\n }),\n templateProvided: (templateId) => this.log(\"info\", \"runner\", `Template provided by frontend: ${templateId}`, { templateId }),\n buildStreamCreated: () => this.log(\"info\", \"runner\", \"Build stream created, starting to process chunks...\"),\n firstChunkReceived: (agentLabel) => this.log(\"info\", \"runner\", `First chunk received from ${agentLabel}`, { agentLabel }),\n streamEnded: (chunkCount) => this.log(\"info\", \"runner\", `Stream ended after ${chunkCount} chunks`, { chunkCount }),\n buildCompleted: (projectId) => this.log(\"info\", \"runner\", `Build completed successfully`, { projectId }),\n buildFailed: (error) => this.log(\"error\", \"runner\", `Build failed: ${error}`, { error }),\n portDetected: (port) => this.log(\"info\", \"runner\", `Port detected: ${port}`, { port }),\n tunnelCreated: (port, tunnelUrl) => this.log(\"info\", \"runner\", `Tunnel created: ${tunnelUrl} \\u2192 localhost:${port}`, {\n port,\n tunnelUrl\n }),\n error: (message, error, context) => this.log(\"error\", \"runner\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Build stream-specific logging (tool calls, text, etc.)\n */\n build = {\n agentText: (agentLabel, text2) => {\n const truncated = text2.length > 200 ? text2.slice(0, 200) + \"...\" : text2;\n this.log(\"debug\", \"build\", `${agentLabel}: ${truncated}`, {\n agentLabel,\n textLength: text2.length\n });\n },\n agentThinking: (thinking) => {\n const truncated = thinking.length > 300 ? thinking.slice(0, 300) + \"...\" : thinking;\n this.log(\"debug\", \"build\", `Thinking: ${truncated}`, {\n thinkingLength: thinking.length\n });\n },\n toolCalled: (toolName, toolId, inputSize) => this.log(\"info\", \"build\", `Tool called: ${toolName} (${toolId})`, {\n toolName,\n toolId,\n inputSize\n }),\n toolResult: (toolId, outputSize, isError) => this.log(isError ? \"error\" : \"info\", \"build\", `Tool result (${toolId})`, {\n toolId,\n outputSize,\n isError\n }),\n runCommandDetected: (runCommand) => this.log(\"info\", \"build\", `Detected runCommand: ${runCommand}`, { runCommand })\n };\n /**\n * WebSocket-specific logging methods\n */\n websocket = {\n serverCreated: (instanceId) => this.log(\"info\", \"websocket\", `WebSocket server instance created`, { instanceId }),\n serverInitialized: (path, runnerPath) => this.log(\"info\", \"websocket\", `Server initialized`, { path, runnerPath }),\n clientConnected: (clientId, projectId, sessionId) => this.log(\"info\", \"websocket\", `Client connected: ${clientId}`, { clientId, projectId, sessionId }),\n clientDisconnected: (clientId) => this.log(\"info\", \"websocket\", `Client disconnected: ${clientId}`, { clientId }),\n clientSubscribed: (clientId, projectId) => this.log(\"info\", \"websocket\", `Client subscribed to project: ${projectId}`, { clientId, projectId }),\n clientTimeout: (clientId) => this.log(\"warn\", \"websocket\", `Client timeout: ${clientId}`, { clientId }),\n runnerConnected: (runnerId) => this.log(\"info\", \"websocket\", `Runner connected: ${runnerId}`, { runnerId }),\n runnerDisconnected: (runnerId, code) => this.log(\"info\", \"websocket\", `Runner disconnected: ${runnerId}`, { runnerId, code }),\n runnerNotConnected: (runnerId, commandType) => this.log(\"warn\", \"websocket\", `Cannot send command to runner ${runnerId}: not connected`, {\n runnerId,\n commandType\n }),\n runnerAuthRejected: () => this.log(\"warn\", \"websocket\", `Runner connection rejected: invalid auth`),\n runnerAuthMissing: () => this.log(\"error\", \"websocket\", `RUNNER_SHARED_SECRET is not configured`),\n runnerStaleRemoved: (runnerId) => this.log(\"info\", \"websocket\", `Removing stale runner connection: ${runnerId}`, { runnerId }),\n commandSent: (runnerId, commandType, traceAttached) => this.log(\"debug\", \"websocket\", `Sent command to runner: ${commandType}`, {\n runnerId,\n commandType,\n traceAttached\n }),\n eventReceived: (runnerId, eventType) => this.log(\"debug\", \"websocket\", `Received event from runner: ${eventType}`, {\n runnerId,\n eventType\n }),\n broadcastToolCall: (toolName, toolState, subscriberCount) => this.log(\"info\", \"websocket\", `Broadcasting planning tool: ${toolName} (state=${toolState})`, {\n toolName,\n toolState,\n subscriberCount\n }),\n broadcastBuildComplete: (projectId, sessionId, subscriberCount) => this.log(\"info\", \"websocket\", `Broadcasting build-complete`, {\n projectId,\n sessionId,\n subscriberCount\n }),\n unknownUpgradePath: (pathname) => this.log(\"warn\", \"websocket\", `Unknown upgrade path: ${pathname}`, { pathname }),\n shutdown: () => this.log(\"info\", \"websocket\", `Shutting down server...`),\n shutdownComplete: () => this.log(\"info\", \"websocket\", `Server shut down`),\n error: (message, error, context) => this.log(\"error\", \"websocket\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Port allocator-specific logging methods\n */\n portAllocator = {\n portAllocated: (port, projectId) => this.log(\"info\", \"port-allocator\", `Port allocated: ${port}`, { port, projectId }),\n portReleased: (port, projectId) => this.log(\"info\", \"port-allocator\", `Port released: ${port}`, { port, projectId }),\n portInUse: (port) => this.log(\"warn\", \"port-allocator\", `Port ${port} is already in use`, { port }),\n portRangeExhausted: (minPort, maxPort) => this.log(\"error\", \"port-allocator\", `No available ports in range ${minPort}-${maxPort}`, {\n minPort,\n maxPort\n }),\n portConflict: (port, projectId, existingProjectId) => this.log(\"warn\", \"port-allocator\", `Port ${port} conflict detected`, {\n port,\n projectId,\n existingProjectId\n }),\n allocationsCleared: (count) => this.log(\"info\", \"port-allocator\", `Cleared ${count} port allocations`, { count }),\n error: (message, error, context) => this.log(\"error\", \"port-allocator\", message, {\n error: error instanceof Error ? error.message : String(error),\n ...context\n })\n };\n /**\n * Process manager-specific logging methods\n */\n processManager = {\n processStarting: (projectId, command, cwd) => this.log(\"info\", \"process-manager\", `Starting process: ${command}`, {\n projectId,\n command,\n cwd\n }),\n processStarted: (projectId, pid) => this.log(\"info\", \"process-manager\", `Process started`, { projectId, pid }),\n processOutput: (projectId, output) => this.log(\"debug\", \"process-manager\", `Process output: ${output.substring(0, 100)}`, {\n projectId,\n outputLength: output.length\n }),\n processError: (projectId, error) => this.log(\"error\", \"process-manager\", `Process error: ${error}`, { projectId, error }),\n processExited: (projectId, code, signal) => this.log(\"info\", \"process-manager\", `Process exited`, { projectId, code, signal }),\n processStopped: (projectId) => this.log(\"info\", \"process-manager\", `Process stopped`, { projectId }),\n processNotFound: (projectId) => this.log(\"warn\", \"process-manager\", `Process not found for project: ${projectId}`, { projectId }),\n processKilled: (projectId, signal) => this.log(\"info\", \"process-manager\", `Process killed with signal: ${signal}`, {\n projectId,\n signal\n }),\n processCleanup: (projectId) => this.log(\"info\", \"process-manager\", `Cleaning up process`, { projectId }),\n processListRetrieved: (count) => this.log(\"debug\", \"process-manager\", `Retrieved ${count} running processes`, { count }),\n error: (message, error, context) => this.log(\"error\", \"process-manager\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n /**\n * Build events-specific logging methods\n */\n buildEvents = {\n eventReceived: (eventType, projectId, sessionId) => this.log(\"info\", \"build-events\", `Received event: ${eventType}`, {\n eventType,\n projectId,\n sessionId\n }),\n eventProcessed: (eventType, projectId) => this.log(\"debug\", \"build-events\", `Processed event: ${eventType}`, { eventType, projectId }),\n buildStarted: (projectId, sessionId) => this.log(\"info\", \"build-events\", `Build started`, { projectId, sessionId }),\n buildCompleted: (projectId, sessionId, success) => this.log(\"info\", \"build-events\", `Build ${success ? \"completed\" : \"failed\"}`, {\n projectId,\n sessionId,\n success\n }),\n portDetected: (projectId, port) => this.log(\"info\", \"build-events\", `Port detected: ${port}`, { projectId, port }),\n devServerStarted: (projectId, port, url) => this.log(\"info\", \"build-events\", `Dev server started: ${url}`, { projectId, port, url }),\n devServerError: (projectId, error) => this.log(\"error\", \"build-events\", `Dev server error: ${error}`, { projectId, error }),\n toolCallReceived: (toolName, toolId) => this.log(\"debug\", \"build-events\", `Tool call: ${toolName}`, { toolName, toolId }),\n logChunkReceived: (projectId, chunkSize) => this.log(\"debug\", \"build-events\", `Log chunk received`, { projectId, chunkSize }),\n invalidEvent: (reason) => this.log(\"warn\", \"build-events\", `Invalid event: ${reason}`, { reason }),\n error: (message, error, context) => this.log(\"error\", \"build-events\", message, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0,\n ...context\n })\n };\n};\nvar buildLogger = new BuildLogger();\n\n// src/lib/port-allocator.ts\nvar FRAMEWORK_RANGES = {\n next: { start: 3101, end: 3200 },\n node: { start: 3101, end: 3200 },\n tanstack: { start: 3101, end: 3200 },\n astro: { start: 4321, end: 4421 },\n vite: { start: 5173, end: 5273 },\n default: { start: 6e3, end: 6100 }\n};\nvar FRAMEWORK_ENV_MAP = {\n next: [\"PORT\", \"NEXT_PUBLIC_PORT\"],\n node: [\"PORT\"],\n tanstack: [\"PORT\", \"VITE_PORT\"],\n astro: [\"PORT\", \"ASTRO_PORT\"],\n vite: [\"PORT\", \"VITE_PORT\"],\n default: [\"PORT\"]\n};\nasync function detectFrameworkFromFilesystem(projectPath) {\n try {\n let cachedPkg = null;\n const loadPackageJson = async () => {\n if (cachedPkg) return cachedPkg;\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) {\n cachedPkg = null;\n return cachedPkg;\n }\n const pkgContent = await readFile(pkgPath, \"utf-8\");\n const pkg2 = JSON.parse(pkgContent);\n cachedPkg = {\n deps: { ...pkg2.dependencies ?? {}, ...pkg2.peerDependencies ?? {} },\n devDeps: pkg2.devDependencies ?? {},\n devScript: pkg2.scripts?.dev?.toLowerCase() ?? \"\"\n };\n return cachedPkg;\n };\n const hasTanStackDependency = async () => {\n const pkg2 = await loadPackageJson();\n if (!pkg2) return false;\n const combined = { ...pkg2.deps, ...pkg2.devDeps };\n if (combined[\"@tanstack/react-start\"]) return true;\n if (pkg2.devScript.includes(\"tanstack\")) return true;\n return false;\n };\n if (existsSync(join(projectPath, \"astro.config.mjs\")) || existsSync(join(projectPath, \"astro.config.ts\")) || existsSync(join(projectPath, \"astro.config.js\"))) {\n return \"astro\";\n }\n if (existsSync(join(projectPath, \"next.config.ts\")) || existsSync(join(projectPath, \"next.config.js\")) || existsSync(join(projectPath, \"next.config.mjs\"))) {\n return \"next\";\n }\n if (existsSync(join(projectPath, \"vite.config.ts\")) || existsSync(join(projectPath, \"vite.config.js\"))) {\n if (await hasTanStackDependency()) {\n return \"tanstack\";\n }\n return \"vite\";\n }\n const pkg = await loadPackageJson();\n if (pkg) {\n const allDeps = { ...pkg.deps, ...pkg.devDeps };\n if (allDeps[\"astro\"]) return \"astro\";\n if (allDeps[\"@tanstack/react-start\"]) return \"tanstack\";\n if (allDeps[\"next\"]) return \"next\";\n if (allDeps[\"vite\"]) return \"vite\";\n if (pkg.devScript.includes(\"tanstack\")) return \"tanstack\";\n if (pkg.devScript.includes(\"astro\")) return \"astro\";\n if (pkg.devScript.includes(\"next\")) return \"next\";\n if (pkg.devScript.includes(\"vite\")) return \"vite\";\n }\n } catch (error) {\n buildLogger.portAllocator.error(\"Failed to detect framework from filesystem\", error);\n }\n return null;\n}\nasync function resolveFramework(projectType, runCommand, savedFramework) {\n if (savedFramework) {\n const framework = toFrameworkKey(savedFramework);\n buildLogger.log(\"info\", \"port-allocator\", `Using saved framework (locked): ${framework}`, {\n savedFramework,\n projectType,\n runCommand\n });\n return framework;\n }\n buildLogger.log(\"warn\", \"port-allocator\", \"No saved framework found, falling back to detection (may cause port drift)\", {\n projectType,\n runCommand\n });\n const normalizedType = projectType?.toLowerCase() ?? \"\";\n if (normalizedType.includes(\"tanstack\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: tanstack\", { projectType });\n return \"tanstack\";\n }\n if (normalizedType.includes(\"vite\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: vite\", { projectType });\n return \"vite\";\n }\n if (normalizedType.includes(\"astro\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: astro\", { projectType });\n return \"astro\";\n }\n if (normalizedType.includes(\"next\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: next\", { projectType });\n return \"next\";\n }\n if (normalizedType.includes(\"node\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from projectType: node\", { projectType });\n return \"node\";\n }\n const normalizedCommand = runCommand?.toLowerCase() ?? \"\";\n if (normalizedCommand.includes(\"vite\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: vite\", { runCommand });\n return \"vite\";\n }\n if (normalizedCommand.includes(\"astro\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: astro\", { runCommand });\n return \"astro\";\n }\n if (normalizedCommand.includes(\"tanstack\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: tanstack\", { runCommand });\n return \"tanstack\";\n }\n if (normalizedCommand.includes(\"next\")) {\n buildLogger.log(\"debug\", \"port-allocator\", \"Detected from runCommand: next\", { runCommand });\n return \"next\";\n }\n buildLogger.log(\"warn\", \"port-allocator\", \"No framework detected, using default (port 6000+)\", {\n projectType,\n runCommand\n });\n return \"default\";\n}\nfunction toFrameworkKey(value) {\n switch (value) {\n case \"next\":\n case \"astro\":\n case \"vite\":\n case \"tanstack\":\n case \"node\":\n return value;\n default:\n return \"default\";\n }\n}\nasync function reservePortForProject(params) {\n const framework = await resolveFramework(params.projectType, params.runCommand, params.detectedFramework);\n const range = FRAMEWORK_RANGES[framework];\n const preferred = params.preferredPort ?? void 0;\n return db.transaction(async (tx) => {\n await tx.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, params.projectId)).execute();\n const now = /* @__PURE__ */ new Date();\n const tryReservePort = async (port) => {\n if (port < range.start || port > range.end) {\n return null;\n }\n const existing = await tx.select().from(portAllocations).where(eq(portAllocations.port, port)).limit(1).execute();\n if (existing.length === 0) {\n await tx.insert(portAllocations).values({\n port,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n return port;\n }\n if (existing[0].projectId === null) {\n await tx.update(portAllocations).set({ projectId: params.projectId, reservedAt: now }).where(eq(portAllocations.port, port)).execute();\n return port;\n }\n return null;\n };\n if (preferred) {\n const reserved = await tryReservePort(preferred);\n if (reserved !== null) {\n return { port: reserved, framework };\n }\n }\n const reusable = await tx.select().from(portAllocations).where(and(eq(portAllocations.framework, framework), isNull(portAllocations.projectId))).orderBy(portAllocations.port).limit(1).execute();\n if (reusable.length > 0) {\n await tx.update(portAllocations).set({ projectId: params.projectId, reservedAt: now }).where(eq(portAllocations.port, reusable[0].port)).execute();\n return { port: reusable[0].port, framework };\n }\n const rows = await tx.select({\n maxPort: sql2`COALESCE(MAX(${portAllocations.port}), ${range.start - 1})`\n }).from(portAllocations).where(eq(portAllocations.framework, framework)).execute();\n const maxPort = rows[0]?.maxPort ?? range.start - 1;\n const nextPort = Math.max(range.start, maxPort + 1);\n if (nextPort > range.end) {\n throw new Error(`No available ports remaining for framework \"${framework}\" (${range.start}-${range.end}).`);\n }\n await tx.insert(portAllocations).values({\n port: nextPort,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n return { port: nextPort, framework };\n });\n}\nasync function updatePortReservationForProject(projectId, actualPort) {\n await db.transaction(async (tx) => {\n const rows = await tx.select().from(portAllocations).where(eq(portAllocations.projectId, projectId)).limit(1).execute();\n if (rows.length === 0) {\n return;\n }\n const current = rows[0];\n if (current.port === actualPort) {\n return;\n }\n const frameworkKey = toFrameworkKey(current.framework);\n const range = FRAMEWORK_RANGES[frameworkKey] ?? FRAMEWORK_RANGES.default;\n if (actualPort < range.start || actualPort > range.end) {\n return;\n }\n const occupying = await tx.select().from(portAllocations).where(eq(portAllocations.port, actualPort)).limit(1).execute();\n if (occupying.length > 0 && occupying[0].projectId !== null && occupying[0].projectId !== projectId) {\n return;\n }\n await tx.delete(portAllocations).where(eq(portAllocations.port, current.port)).execute();\n const now = /* @__PURE__ */ new Date();\n if (occupying.length > 0) {\n await tx.update(portAllocations).set({ projectId, reservedAt: now }).where(eq(portAllocations.port, actualPort)).execute();\n } else {\n await tx.insert(portAllocations).values({\n port: actualPort,\n framework: current.framework,\n projectId,\n reservedAt: now\n }).execute();\n }\n });\n}\nasync function releasePortForProject(projectId) {\n await db.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, projectId)).execute();\n}\nfunction buildEnvForFramework(framework, port) {\n const envKeys = FRAMEWORK_ENV_MAP[framework] ?? FRAMEWORK_ENV_MAP.default;\n const env = {};\n envKeys.forEach((key) => {\n env[key] = String(port);\n });\n env.DEV_SERVER_PORT = String(port);\n return env;\n}\nfunction getRunCommand(baseCommand) {\n if (!baseCommand || !baseCommand.trim()) {\n return \"npm run dev\";\n }\n return baseCommand;\n}\nasync function checkPortAvailability(port) {\n const localhostAvailable = await checkSingleInterface(port, \"localhost\");\n if (!localhostAvailable) {\n return false;\n }\n const allInterfacesAvailable = await checkSingleInterface(port, \"0.0.0.0\");\n return allInterfacesAvailable;\n}\nfunction checkSingleInterface(port, host) {\n return new Promise((resolve) => {\n const server = createServer();\n server.once(\"error\", (err) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n server.once(\"listening\", () => {\n server.close(() => {\n resolve(true);\n });\n });\n server.listen(port, host);\n });\n}\nasync function findAvailablePortInRange(range, preferredStart) {\n const scanStart = preferredStart && preferredStart >= range.start && preferredStart <= range.end ? preferredStart : range.start;\n buildLogger.log(\"debug\", \"port-allocator\", `Scanning for available port in range ${range.start}-${range.end}`, {\n scanStart,\n rangeStart: range.start,\n rangeEnd: range.end\n });\n for (let port = scanStart; port <= range.end; port++) {\n const isAvailable = await checkPortAvailability(port);\n if (isAvailable) {\n buildLogger.log(\"debug\", \"port-allocator\", `Found available port: ${port}`, { port });\n return port;\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Port ${port} in use`, { port });\n }\n if (scanStart > range.start) {\n buildLogger.log(\"debug\", \"port-allocator\", `Wrapping around to scan ${range.start}-${scanStart - 1}`, {\n rangeStart: range.start,\n scanStart: scanStart - 1\n });\n for (let port = range.start; port < scanStart; port++) {\n const isAvailable = await checkPortAvailability(port);\n if (isAvailable) {\n buildLogger.log(\"debug\", \"port-allocator\", `Found available port: ${port}`, { port });\n return port;\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Port ${port} in use`, { port });\n }\n }\n buildLogger.portAllocator.portRangeExhausted(range.start, range.end);\n return null;\n}\nasync function getPortForProject(projectId) {\n const rows = await db.select().from(portAllocations).where(eq(portAllocations.projectId, projectId)).limit(1).execute();\n if (rows.length === 0) {\n return null;\n }\n const allocation = rows[0];\n return {\n port: allocation.port,\n framework: toFrameworkKey(allocation.framework)\n };\n}\nasync function reserveOrReallocatePort(params, skipPortCheck = false) {\n const framework = await resolveFramework(params.projectType, params.runCommand, params.detectedFramework);\n const range = FRAMEWORK_RANGES[framework];\n buildLogger.log(\"info\", \"port-allocator\", `Allocating port for project ${params.projectId}`, {\n projectId: params.projectId,\n framework,\n rangeStart: range.start,\n rangeEnd: range.end,\n skipPortCheck\n });\n const existing = await getPortForProject(params.projectId);\n if (existing) {\n const withinRange = existing.port >= range.start && existing.port <= range.end;\n const sameFramework = existing.framework === framework;\n buildLogger.log(\"debug\", \"port-allocator\", `Found existing allocation: port ${existing.port}`, {\n port: existing.port,\n framework: existing.framework,\n projectId: params.projectId\n });\n if (!withinRange) {\n buildLogger.log(\"warn\", \"port-allocator\", `Port ${existing.port} outside valid range ${range.start}-${range.end}, will reallocate`, {\n port: existing.port,\n rangeStart: range.start,\n rangeEnd: range.end,\n projectId: params.projectId\n });\n await releasePortForProject(params.projectId);\n } else if (!sameFramework) {\n buildLogger.log(\"warn\", \"port-allocator\", `Framework mismatch (${existing.framework} \\u2192 ${framework}), will reallocate`, {\n oldFramework: existing.framework,\n newFramework: framework,\n projectId: params.projectId\n });\n await releasePortForProject(params.projectId);\n } else {\n if (skipPortCheck) {\n buildLogger.log(\"info\", \"port-allocator\", `Reusing port ${existing.port} (skipPortCheck=true)`, {\n port: existing.port,\n projectId: params.projectId\n });\n await db.update(portAllocations).set({ reservedAt: /* @__PURE__ */ new Date() }).where(eq(portAllocations.projectId, params.projectId)).execute();\n return existing;\n }\n const isAvailable = await checkPortAvailability(existing.port);\n if (isAvailable) {\n buildLogger.portAllocator.portAllocated(existing.port, params.projectId);\n await db.update(portAllocations).set({ reservedAt: /* @__PURE__ */ new Date() }).where(eq(portAllocations.projectId, params.projectId)).execute();\n return existing;\n }\n buildLogger.portAllocator.portInUse(existing.port);\n await releasePortForProject(params.projectId);\n }\n }\n let availablePort = null;\n if (skipPortCheck) {\n buildLogger.log(\"info\", \"port-allocator\", \"Remote runner mode: using DB allocation without OS check\", {\n projectId: params.projectId\n });\n try {\n const allocation = await reservePortForProject({\n ...params,\n detectedFramework: params.detectedFramework ?? framework\n });\n availablePort = allocation.port;\n buildLogger.log(\"info\", \"port-allocator\", `Allocated port ${availablePort} from DB`, {\n port: availablePort,\n projectId: params.projectId\n });\n } catch (error) {\n throw new Error(`Unable to allocate port for remote runner: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n } else {\n buildLogger.log(\"info\", \"port-allocator\", \"Local runner mode: scanning OS for available port\", {\n projectId: params.projectId,\n preferredPort: params.preferredPort\n });\n availablePort = await findAvailablePortInRange(range, params.preferredPort ?? void 0);\n if (!availablePort) {\n throw new Error(\n `All ports in range ${range.start}-${range.end} are in use. Please stop other dev servers or free up ports.`\n );\n }\n }\n buildLogger.log(\"debug\", \"port-allocator\", `Reserving port ${availablePort} in database`, {\n port: availablePort,\n projectId: params.projectId\n });\n await db.transaction(async (tx) => {\n await tx.update(portAllocations).set({ projectId: null, reservedAt: null }).where(eq(portAllocations.projectId, params.projectId)).execute();\n const existingPort = await tx.select().from(portAllocations).where(eq(portAllocations.port, availablePort)).limit(1).execute();\n const now = /* @__PURE__ */ new Date();\n if (existingPort.length === 0) {\n await tx.insert(portAllocations).values({\n port: availablePort,\n framework,\n projectId: params.projectId,\n reservedAt: now\n }).execute();\n } else {\n await tx.update(portAllocations).set({ projectId: params.projectId, framework, reservedAt: now }).where(eq(portAllocations.port, availablePort)).execute();\n }\n });\n buildLogger.portAllocator.portAllocated(availablePort, params.projectId);\n return { port: availablePort, framework };\n}\nasync function cleanupAbandonedPorts() {\n const threshold = new Date(Date.now() - 7 * 24 * 60 * 60 * 1e3);\n const result = await db.update(portAllocations).set({ projectId: null, reservedAt: null }).where(and(\n isNotNull(portAllocations.projectId),\n lt(portAllocations.reservedAt, threshold)\n )).returning();\n const cleanedCount = result.length;\n if (cleanedCount > 0) {\n buildLogger.portAllocator.allocationsCleared(cleanedCount);\n }\n return cleanedCount;\n}\nexport {\n buildEnvForFramework,\n checkPortAvailability,\n cleanupAbandonedPorts,\n detectFrameworkFromFilesystem,\n getPortForProject,\n getRunCommand,\n releasePortForProject,\n reserveOrReallocatePort,\n reservePortForProject,\n updatePortReservationForProject\n};\n//# sourceMappingURL=port-allocator.js.map"],"names":["Sentry.addBreadcrumb"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ // OpenBuilder CLI - Built with Rollup
2
+ import { exec } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ import { platform } from 'node:os';
5
+
6
+ const execAsync = promisify(exec);
7
+ /**
8
+ * Kill a process and all its children
9
+ * Works on macOS and Linux
10
+ */
11
+ async function killProcessTree(pid, signal = 'SIGTERM') {
12
+ if (!pid || pid <= 0) {
13
+ return;
14
+ }
15
+ const isWindows = platform() === 'win32';
16
+ try {
17
+ if (isWindows) {
18
+ // Windows - use taskkill
19
+ await execAsync(`taskkill /pid ${pid} /T /F`);
20
+ }
21
+ else {
22
+ // Unix (macOS/Linux) - kill process group
23
+ // Using negative PID kills the entire process group
24
+ try {
25
+ process.kill(-pid, signal);
26
+ }
27
+ catch (error) {
28
+ // If that fails, try killing just the PID
29
+ try {
30
+ process.kill(pid, signal);
31
+ }
32
+ catch {
33
+ // Process might already be dead
34
+ }
35
+ // Also try pkill as fallback
36
+ try {
37
+ await execAsync(`pkill -P ${pid}`);
38
+ }
39
+ catch {
40
+ // Best effort
41
+ }
42
+ }
43
+ }
44
+ }
45
+ catch (error) {
46
+ // Process might already be dead, that's fine
47
+ }
48
+ }
49
+ /**
50
+ * Kill process by port number
51
+ * Useful for cleaning up zombie processes
52
+ */
53
+ async function killProcessOnPort(port) {
54
+ const isWindows = platform() === 'win32';
55
+ try {
56
+ if (isWindows) {
57
+ // Windows
58
+ const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);
59
+ const lines = stdout.trim().split('\n');
60
+ for (const line of lines) {
61
+ const parts = line.trim().split(/\s+/);
62
+ const pid = parts[parts.length - 1];
63
+ if (pid && !isNaN(Number(pid))) {
64
+ await execAsync(`taskkill /PID ${pid} /F`);
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ // Unix - use lsof and kill
70
+ const { stdout } = await execAsync(`lsof -ti:${port}`);
71
+ const pids = stdout.trim().split('\n').filter(Boolean);
72
+ for (const pid of pids) {
73
+ if (pid && !isNaN(Number(pid))) {
74
+ await killProcessTree(Number(pid), 'SIGKILL');
75
+ }
76
+ }
77
+ }
78
+ return true;
79
+ }
80
+ catch (error) {
81
+ // No process found on port or already dead
82
+ return false;
83
+ }
84
+ }
85
+
86
+ export { killProcessOnPort, killProcessTree };
87
+ //# sourceMappingURL=process-killer-CaUL7Kpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-killer-CaUL7Kpl.js","sources":["../../src/cli/utils/process-killer.ts"],"sourcesContent":["import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { platform } from 'node:os';\n\nconst execAsync = promisify(exec);\n\n/**\n * Kill a process and all its children\n * Works on macOS and Linux\n */\nexport async function killProcessTree(pid: number, signal: string = 'SIGTERM'): Promise<void> {\n if (!pid || pid <= 0) {\n return;\n }\n\n const isWindows = platform() === 'win32';\n\n try {\n if (isWindows) {\n // Windows - use taskkill\n await execAsync(`taskkill /pid ${pid} /T /F`);\n } else {\n // Unix (macOS/Linux) - kill process group\n // Using negative PID kills the entire process group\n try {\n process.kill(-pid, signal);\n } catch (error) {\n // If that fails, try killing just the PID\n try {\n process.kill(pid, signal);\n } catch {\n // Process might already be dead\n }\n\n // Also try pkill as fallback\n try {\n await execAsync(`pkill -P ${pid}`);\n } catch {\n // Best effort\n }\n }\n }\n } catch (error) {\n // Process might already be dead, that's fine\n }\n}\n\n/**\n * Kill process by port number\n * Useful for cleaning up zombie processes\n */\nexport async function killProcessOnPort(port: number): Promise<boolean> {\n const isWindows = platform() === 'win32';\n\n try {\n if (isWindows) {\n // Windows\n const { stdout } = await execAsync(`netstat -ano | findstr :${port}`);\n const lines = stdout.trim().split('\\n');\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n const pid = parts[parts.length - 1];\n if (pid && !isNaN(Number(pid))) {\n await execAsync(`taskkill /PID ${pid} /F`);\n }\n }\n } else {\n // Unix - use lsof and kill\n const { stdout } = await execAsync(`lsof -ti:${port}`);\n const pids = stdout.trim().split('\\n').filter(Boolean);\n\n for (const pid of pids) {\n if (pid && !isNaN(Number(pid))) {\n await killProcessTree(Number(pid), 'SIGKILL');\n }\n }\n }\n return true;\n } catch (error) {\n // No process found on port or already dead\n return false;\n }\n}\n"],"names":[],"mappings":";;;;;AAIA,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;AAEjC;;;AAGG;AACI,eAAe,eAAe,CAAC,GAAW,EAAE,SAAiB,SAAS,EAAA;AAC3E,IAAA,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE;QACpB;IACF;AAEA,IAAA,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO;AAExC,IAAA,IAAI;QACF,IAAI,SAAS,EAAE;;AAEb,YAAA,MAAM,SAAS,CAAC,CAAA,cAAA,EAAiB,GAAG,CAAA,MAAA,CAAQ,CAAC;QAC/C;aAAO;;;AAGL,YAAA,IAAI;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;YAC5B;YAAE,OAAO,KAAK,EAAE;;AAEd,gBAAA,IAAI;AACF,oBAAA,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;gBAC3B;AAAE,gBAAA,MAAM;;gBAER;;AAGA,gBAAA,IAAI;AACF,oBAAA,MAAM,SAAS,CAAC,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE,CAAC;gBACpC;AAAE,gBAAA,MAAM;;gBAER;YACF;QACF;IACF;IAAE,OAAO,KAAK,EAAE;;IAEhB;AACF;AAEA;;;AAGG;AACI,eAAe,iBAAiB,CAAC,IAAY,EAAA;AAClD,IAAA,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO;AAExC,IAAA,IAAI;QACF,IAAI,SAAS,EAAE;;YAEb,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACvC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;gBACtC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;AAC9B,oBAAA,MAAM,SAAS,CAAC,CAAA,cAAA,EAAiB,GAAG,CAAA,GAAA,CAAK,CAAC;gBAC5C;YACF;QACF;aAAO;;YAEL,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE,CAAC;AACtD,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAEtD,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC9B,MAAM,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;gBAC/C;YACF;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAAE,OAAO,KAAK,EAAE;;AAEd,QAAA,OAAO,KAAK;IACd;AACF;;;;"}
@@ -0,0 +1,128 @@
1
+ // OpenBuilder CLI - Built with Rollup
2
+ import inquirer from 'inquirer';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+
6
+ /**
7
+ * Interactive prompts for CLI commands
8
+ */
9
+ class Prompts {
10
+ /**
11
+ * Prompt for initial configuration
12
+ */
13
+ async promptInit() {
14
+ const defaultWorkspace = join(homedir(), 'openbuilder-workspace');
15
+ const answers = await inquirer.prompt([
16
+ {
17
+ type: 'input',
18
+ name: 'workspace',
19
+ message: 'Where should projects be stored?',
20
+ default: defaultWorkspace,
21
+ validate: (input) => {
22
+ if (!input || input.trim() === '') {
23
+ return 'Workspace path is required';
24
+ }
25
+ return true;
26
+ },
27
+ },
28
+ {
29
+ type: 'input',
30
+ name: 'wsUrl',
31
+ message: 'Server WebSocket URL:',
32
+ default: 'ws://localhost:3000/ws/runner', // Direct connection to Next.js
33
+ validate: (input) => {
34
+ if (!input || input.trim() === '') {
35
+ return 'WebSocket URL is required';
36
+ }
37
+ if (!input.startsWith('ws://') && !input.startsWith('wss://')) {
38
+ return 'WebSocket URL must start with ws:// or wss://';
39
+ }
40
+ return true;
41
+ },
42
+ },
43
+ {
44
+ type: 'input',
45
+ name: 'apiUrl',
46
+ message: 'API base URL (frontend URL):',
47
+ default: 'http://localhost:3000', // Default to local
48
+ validate: (input) => {
49
+ if (!input || input.trim() === '') {
50
+ return 'API URL is required';
51
+ }
52
+ return true;
53
+ },
54
+ },
55
+ {
56
+ type: 'input',
57
+ name: 'secret',
58
+ message: 'Shared secret:',
59
+ default: 'dev-secret', // Default local secret
60
+ validate: (input) => {
61
+ if (!input || input.trim() === '') {
62
+ return 'Shared secret is required';
63
+ }
64
+ return true;
65
+ },
66
+ },
67
+ {
68
+ type: 'input',
69
+ name: 'runnerId',
70
+ message: 'Runner ID (identifier for this machine):',
71
+ default: 'local', // Default to 'local'
72
+ validate: (input) => {
73
+ if (!input || input.trim() === '') {
74
+ return 'Runner ID is required';
75
+ }
76
+ return true;
77
+ },
78
+ },
79
+ ]);
80
+ return answers;
81
+ }
82
+ /**
83
+ * Confirm action with user
84
+ */
85
+ async confirm(message, defaultValue = false) {
86
+ const { confirmed } = await inquirer.prompt([
87
+ {
88
+ type: 'confirm',
89
+ name: 'confirmed',
90
+ message,
91
+ default: defaultValue,
92
+ },
93
+ ]);
94
+ return confirmed;
95
+ }
96
+ /**
97
+ * Select from a list of options
98
+ */
99
+ async select(message, choices) {
100
+ const { selected } = await inquirer.prompt([
101
+ {
102
+ type: 'list',
103
+ name: 'selected',
104
+ message,
105
+ choices,
106
+ },
107
+ ]);
108
+ return selected;
109
+ }
110
+ /**
111
+ * Prompt for text input
112
+ */
113
+ async input(message, defaultValue) {
114
+ const { value } = await inquirer.prompt([
115
+ {
116
+ type: 'input',
117
+ name: 'value',
118
+ message,
119
+ default: defaultValue,
120
+ },
121
+ ]);
122
+ return value;
123
+ }
124
+ }
125
+ const prompts = new Prompts();
126
+
127
+ export { prompts as p };
128
+ //# sourceMappingURL=prompts-1QbE_bRr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts-1QbE_bRr.js","sources":["../../src/cli/utils/prompts.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface InitPromptAnswers {\n workspace: string;\n wsUrl: string;\n apiUrl: string;\n secret: string;\n runnerId: string;\n}\n\n/**\n * Interactive prompts for CLI commands\n */\nexport class Prompts {\n /**\n * Prompt for initial configuration\n */\n async promptInit(): Promise<InitPromptAnswers> {\n const defaultWorkspace = join(homedir(), 'openbuilder-workspace');\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'workspace',\n message: 'Where should projects be stored?',\n default: defaultWorkspace,\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Workspace path is required';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'wsUrl',\n message: 'Server WebSocket URL:',\n default: 'ws://localhost:3000/ws/runner', // Direct connection to Next.js\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'WebSocket URL is required';\n }\n if (!input.startsWith('ws://') && !input.startsWith('wss://')) {\n return 'WebSocket URL must start with ws:// or wss://';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'apiUrl',\n message: 'API base URL (frontend URL):',\n default: 'http://localhost:3000', // Default to local\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'API URL is required';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'secret',\n message: 'Shared secret:',\n default: 'dev-secret', // Default local secret\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Shared secret is required';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'runnerId',\n message: 'Runner ID (identifier for this machine):',\n default: 'local', // Default to 'local'\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Runner ID is required';\n }\n return true;\n },\n },\n ]);\n\n return answers;\n }\n\n /**\n * Confirm action with user\n */\n async confirm(message: string, defaultValue: boolean = false): Promise<boolean> {\n const { confirmed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n return confirmed;\n }\n\n /**\n * Select from a list of options\n */\n async select(message: string, choices: string[]): Promise<string> {\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message,\n choices,\n },\n ]);\n return selected;\n }\n\n /**\n * Prompt for text input\n */\n async input(message: string, defaultValue?: string): Promise<string> {\n const { value } = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message,\n default: defaultValue,\n },\n ]);\n return value;\n }\n}\n\nexport const prompts = new Prompts();\n"],"names":[],"mappings":"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"}