@gnsx/genesys.agent.cli 1.0.11 → 1.0.12

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.
@@ -220,19 +220,67 @@ var init_package = __esm({
220
220
  }
221
221
  });
222
222
 
223
+ // src/extensions/version-check.ts
224
+ async function checkForNewVersion() {
225
+ if (process.env.PI_OFFLINE) {
226
+ return void 0;
227
+ }
228
+ try {
229
+ const encodedName = encodeURIComponent(PACKAGE_NAME);
230
+ const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {
231
+ signal: AbortSignal.timeout(1e4)
232
+ });
233
+ if (!response.ok) {
234
+ return void 0;
235
+ }
236
+ const data = await response.json();
237
+ const latestVersion = data.version;
238
+ if (latestVersion && latestVersion !== CURRENT_VERSION) {
239
+ return latestVersion;
240
+ }
241
+ return void 0;
242
+ } catch (err) {
243
+ return void 0;
244
+ }
245
+ }
246
+ var pkg, PACKAGE_NAME, CURRENT_VERSION, versionCheckExtension, version_check_default;
247
+ var init_version_check = __esm({
248
+ "src/extensions/version-check.ts"() {
249
+ "use strict";
250
+ init_package();
251
+ pkg = getPackageJson();
252
+ PACKAGE_NAME = pkg.name;
253
+ CURRENT_VERSION = pkg.version;
254
+ versionCheckExtension = (pi) => {
255
+ pi.on("session_start", async (_event, ctx) => {
256
+ checkForNewVersion().then((newVersion) => {
257
+ if (newVersion) {
258
+ ctx.ui.notify(
259
+ `Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,
260
+ "info"
261
+ );
262
+ }
263
+ });
264
+ });
265
+ };
266
+ version_check_default = versionCheckExtension;
267
+ }
268
+ });
269
+
223
270
  // src/cli.ts
224
271
  var cli_exports = {};
225
- import { existsSync as existsSync2 } from "fs";
226
- import { readdir } from "fs/promises";
227
272
  import { dirname as dirname2, join as join2, resolve } from "path";
228
273
  import { fileURLToPath as fileURLToPath3 } from "url";
274
+ import { getExtensions } from "@gnsx/genesys.agent.extensions";
229
275
  import { getModel, setBedrockProviderModule } from "@mariozechner/pi-ai";
230
276
  import { bedrockProviderModule } from "@mariozechner/pi-ai/bedrock-provider";
231
277
  import {
278
+ AuthStorage,
232
279
  createAgentSession,
233
280
  DefaultResourceLoader,
234
281
  getAgentDir,
235
282
  InteractiveMode,
283
+ ModelRegistry,
236
284
  runPrintMode,
237
285
  SessionManager,
238
286
  SettingsManager
@@ -257,8 +305,8 @@ async function readStdin() {
257
305
  });
258
306
  }
259
307
  async function main(argv) {
260
- const pkg = getPackageJson();
261
- const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);
308
+ const pkg2 = getPackageJson();
309
+ const { args, commandHandled } = parseArgs(argv, pkg2.version, pkg2.name);
262
310
  if (commandHandled) {
263
311
  return;
264
312
  }
@@ -280,22 +328,30 @@ async function main(argv) {
280
328
  }
281
329
  const agentDir = getAgentDir();
282
330
  const settingsManager = SettingsManager.create(cwd, agentDir);
283
- let extensionFiles = [];
284
- const extensionsDir = join2(__dirname, "extensions");
285
- if (existsSync2(extensionsDir)) {
286
- extensionFiles = await readdir(extensionsDir).then(
287
- (files) => files.filter((f) => (f.endsWith(".ts") || f.endsWith(".js")) && !f.endsWith(".d.ts")).map((f) => join2(extensionsDir, f))
288
- );
289
- }
331
+ const sharedExtensions = getExtensions("cli");
332
+ const extensionFactories = [...sharedExtensions, version_check_default];
290
333
  const resourceLoader = new DefaultResourceLoader({
291
334
  cwd,
292
335
  agentDir,
293
336
  settingsManager,
294
- additionalExtensionPaths: extensionFiles
337
+ extensionFactories
295
338
  });
296
339
  await resourceLoader.reload();
340
+ const extensionsResult = resourceLoader.getExtensions();
341
+ const authStorage = AuthStorage.create(join2(agentDir, "auth.json"));
342
+ const modelRegistry = new ModelRegistry(authStorage, join2(agentDir, "models.json"));
343
+ for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {
344
+ try {
345
+ modelRegistry.registerProvider(name, config);
346
+ } catch (error) {
347
+ const message = error instanceof Error ? error.message : String(error);
348
+ console.warn(`Warning: Extension "${extensionPath}" failed to register provider "${name}": ${message}`);
349
+ }
350
+ }
351
+ extensionsResult.runtime.pendingProviderRegistrations = [];
297
352
  const { session, modelFallbackMessage } = await createAgentSession({
298
353
  cwd,
354
+ modelRegistry,
299
355
  ...model ? { model } : {},
300
356
  ...args.thinking ? { thinkingLevel: args.thinking } : {},
301
357
  ...sessionManager ? { sessionManager } : {},
@@ -332,6 +388,7 @@ var init_cli = __esm({
332
388
  "src/cli.ts"() {
333
389
  "use strict";
334
390
  init_args();
391
+ init_version_check();
335
392
  init_package();
336
393
  setBedrockProviderModule(bedrockProviderModule);
337
394
  __filename = fileURLToPath3(import.meta.url);
@@ -344,7 +401,7 @@ var init_cli = __esm({
344
401
  });
345
402
 
346
403
  // src/launcher.ts
347
- import { existsSync as existsSync3 } from "fs";
404
+ import { existsSync as existsSync2 } from "fs";
348
405
  import { dirname as dirname3, join as join3 } from "path";
349
406
  import { fileURLToPath as fileURLToPath4 } from "url";
350
407
  var __filename2 = fileURLToPath4(import.meta.url);
@@ -352,7 +409,7 @@ var __dirname2 = dirname3(__filename2);
352
409
  function findPackageDir(startDir) {
353
410
  let dir = startDir;
354
411
  while (dir !== dirname3(dir)) {
355
- if (existsSync3(join3(dir, "package.json"))) {
412
+ if (existsSync2(join3(dir, "package.json"))) {
356
413
  return dir;
357
414
  }
358
415
  dir = dirname3(dir);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with our version-check extension\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Scan extensions folder for all .ts and .js files (excluding .d.ts)\n let extensionFiles: string[] = [];\n const extensionsDir = join(__dirname, 'extensions');\n if (existsSync(extensionsDir)) {\n extensionFiles = await readdir(extensionsDir).then((files) =>\n files\n .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))\n .map((f) => join(extensionsDir, f)),\n );\n }\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n additionalExtensionPaths: extensionFiles,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":";;;;;;;AAOA,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAOxB,SAAU,qBAAkB;AAChC,MAAI;AACF,UAAM,cAAc,cAAc,YAAY,GAAG;AACjD,WAAO,YAAY,SAAS,cAAc;EAC5C,QAAQ;AACN,WAAO;EACT;AACF;AAQM,SAAU,uBAAoB;AAElC,MAAI,QAAQ,IAAI;AAAmB,WAAO;AAC1C,MAAI,QAAQ,IAAI,cAAc,SAAS,MAAM;AAAG,WAAO;AAGvD,QAAM,WAAW,QAAQ,KAAK,CAAC,KAAK;AACpC,MAAI,SAAS,SAAS,MAAM;AAAG,WAAO;AACtC,MAAI,SAAS,SAAS,KAAK;AAAG,WAAO;AAGrC,SAAO;AACT;AAMA,SAAS,eAAe,QAAgB,SAAe;AACrD,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAElD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,aAAa,YAAY,CAAC,KAAK;AACrC,UAAM,cAAc,aAAa,CAAC,KAAK;AACvC,QAAI,aAAa;AAAa,aAAO;AACrC,QAAI,aAAa;AAAa,aAAO;EACvC;AAEA,SAAO;AACT;AASA,eAAsB,gBACpB,aACA,gBAAsB;AAEtB,MAAI;AACF,QAAI,CAAC,mBAAkB;AAAI,aAAO;AAElC,UAAM,cAAc,mBAAmB,WAAW;AAClD,UAAM,WAAW,MAAM,MAAM,8BAA8B,WAAW,WAAW;MAC/E,QAAQ,YAAY,QAAQ,GAAK;KAClC;AAED,QAAI,CAAC,SAAS;AAAI,aAAO;AAEzB,UAAM,OAAQ,MAAM,SAAS,KAAI;AACjC,UAAM,gBAAgB,KAAK;AAE3B,QAAI,CAAC,iBAAiB,kBAAkB;AAAgB,aAAO;AAC/D,QAAI,CAAC,eAAe,eAAe,cAAc;AAAG,aAAO;AAE3D,WAAO;EACT,QAAQ;AACN,WAAO;EACT;AACF;AAWM,SAAU,cACd,aACA,gBACA,gBACA,eAAqB;AAErB,UAAQ,IAAI;WAAc,WAAW,KAAK;AAC1C,UAAQ,IAAI,eAAe,cAAc,EAAE;AAC3C,UAAQ,IAAI,eAAe,aAAa;CAAI;AAE5C,MAAI;AACF,UAAM,gBAAgB,mBAAmB,SACrC,kBAAkB,WAAW,mBAAmB,WAAW,YAC3D,oBAAoB,WAAW,sBAAsB,WAAW;AAGpE,aAAS,eAAe,EAAE,OAAO,UAAS,CAA6C;AAEvF,YAAQ,IAAI;0BAAwB,WAAW,yBAAyB,aAAa,GAAG;AACxF,WAAO;EACT,SAAS,OAAO;AACd,YAAQ,MAAM;gEAA8D;AAC5E,QAAI,mBAAmB,QAAQ;AAC7B,cAAQ,MAAM,oBAAoB,WAAW,EAAE;AAC/C,cAAQ,MAAM,iBAAiB,WAAW,SAAS;IACrD,OAAO;AACL,cAAQ,MAAM,sBAAsB,WAAW,EAAE;AACjD,cAAQ,MAAM,oBAAoB,WAAW,SAAS;IACxD;AACA,WAAO;EACT;AACF;AAeM,SAAU,iBACd,SACA,aACA,gBACA,UAAgC;AAEhC,UACG,QAAQ,QAAQ,EAChB,YAAY,kDAAkD,EAC9D,OAAO,YAAW;AAEjB,eAAU;AAGV,QAAI,CAAC,mBAAkB,GAAI;AACzB,cAAQ,IAAI,yDAAyD;AACrE,cAAQ,KAAK,CAAC;IAChB;AAEA,YAAQ,IAAI,yBAAyB;AAErC,UAAM,gBAAgB,MAAM,gBAAgB,aAAa,cAAc;AAEvE,QAAI,CAAC,eAAe;AAClB,cAAQ,IAAI,8CAA8C,cAAc,IAAI;AAC5E,cAAQ,KAAK,CAAC;IAChB;AAEA,YAAQ,IAAI;+BAA2B,cAAc,YAAO,aAAa,EAAE;AAE3E,UAAM,iBAAiB,qBAAoB;AAE3C,QAAI,mBAAmB,WAAW;AAChC,cAAQ,MAAM,oEAA+D;AAC7E,cAAQ,MAAM,oBAAoB,WAAW,mBAAmB,WAAW,SAAS;AACpF,cAAQ,MAAM,MAAM;AACpB,cAAQ,MAAM,sBAAsB,WAAW,sBAAsB,WAAW,SAAS;AACzF,cAAQ,KAAK,CAAC;IAChB;AAEA,UAAM,UAAU,cAAc,aAAa,gBAAgB,gBAAgB,aAAa;AACxF,YAAQ,KAAK,UAAU,IAAI,CAAC;EAC9B,CAAC;AACL;AAjMA;;;;;;;ACAA;;;;;;;;ACQA,SAAS,eAAe;AA8CxB,SAAS,gBAAgB,OAAuC;AAC9D,SAAO,gBAAgB,SAAS,KAAsB;AACxD;AAEA,SAAS,WAAW,OAAqD;AAEvE,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,UAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,WAAO;AAAA,MACL,UAAU,MAAM,MAAM,GAAG,KAAK;AAAA,MAC9B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM;AACxB;AAEO,SAAS,UAAU,MAAgB,SAAiB,aAAsC;AAC/F,MAAI,iBAAiB;AAErB,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,OAAa;AAAA,IACjB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,CAAC;AAAA,EACb;AAEA,UACG,KAAK,SAAS,EACd,YAAY,oDAAoD,EAChE,QAAQ,SAAS,eAAe,EAChC,MAAM,oBAAoB,EAC1B,OAAO,MAAM;AAAA,EAEd,CAAC;AAGH,mBAAiB,SAAS,aAAa,SAAS,MAAM;AACpD,qBAAiB;AAAA,EACnB,CAAC;AAED,UACG,OAAO,eAAe,kDAAkD,KAAK,EAC7E,OAAO,kBAAkB,oCAAoC,KAAK,EAClE,OAAO,gBAAgB,gDAAgD,KAAK,EAC5E,OAAO,uBAAuB,gDAAgD,EAC9E,OAAO,qBAAqB,mCAAmC,EAC/D,OAAO,sBAAsB,mBAAmB,gBAAgB,KAAK,IAAI,CAAC,EAAE,EAC5E,OAAO,eAAe,gDAAgD,EACtE,SAAS,eAAe,qBAAqB,EAC7C,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,UAAU,QAAQ;AAGxB,MAAI,KAAK,OAAO;AACd,UAAM,SAAS,WAAW,KAAK,KAAK;AACpC,SAAK,QAAQ,OAAO;AACpB,QAAI,OAAO,UAAU;AACnB,WAAK,WAAW,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,KAAK,UAAU;AACjB,SAAK,WAAW,KAAK;AAAA,EACvB;AAGA,MAAI,KAAK,UAAU;AACjB,QAAI,CAAC,gBAAgB,KAAK,QAAQ,GAAG;AACnC,cAAQ,MAAM,8BAA8B,gBAAgB,KAAK,IAAI,CAAC,EAAE;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,WAAW,KAAK;AAAA,EACvB;AAEA,OAAK,QAAQ,KAAK,SAAS;AAC3B,OAAK,YAAY,KAAK,aAAa;AACnC,OAAK,WAAW,KAAK,YAAY;AACjC,OAAK,MAAM,KAAK;AAGhB,MAAI,QAAQ,SAAS,KAAK,QAAQ,CAAC,GAAG;AACpC,SAAK,WAAW,QAAQ,CAAC;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,SAAS,eAAe;AACzC;AA9IA,IAoDM;AApDN;AAAA;AAAA;AAOA;AA6CA,IAAM,kBAAmC,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,OAAO;AAAA;AAAA;;;AChD5F,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,iBAAAA,sBAAqB;AAEvB,SAAS,iBAA2D;AACzE,QAAMC,aAAY,QAAQD,eAAc,YAAY,GAAG,CAAC;AACxD,MAAI,aAAaC;AAEjB,SAAO,MAAM;AACX,UAAM,UAAU,KAAK,YAAY,cAAc;AAC/C,QAAI,WAAW,OAAO,GAAG;AACvB,YAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AAEA,UAAM,YAAY,QAAQ,UAAU;AAEpC,QAAI,cAAc,YAAY;AAC5B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,iBAAa;AAAA,EACf;AACF;AA1BA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AASA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,OAAM,eAAe;AACvC,SAAS,iBAAAC,sBAAqB;AAG9B,SAAS,UAAU,gCAAgC;AACnD,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,eAAe,YAAoC;AACjD,MAAI,QAAQ,MAAM,OAAO;AAEvB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,QAAI,OAAO;AACX,YAAQ,MAAM,YAAY,OAAO;AAEjC,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,cAAQ;AAAA,IACV,CAAC;AAED,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,MAAAA,SAAQ,KAAK,KAAK,KAAK,IAAI;AAAA,IAC7B,CAAC;AAED,YAAQ,MAAM,GAAG,SAAS,CAAC,QAAQ;AACjC,aAAO,GAAG;AAAA,IACZ,CAAC;AAGD,YAAQ,MAAM,OAAO;AAAA,EACvB,CAAC;AACH;AAQA,eAAe,KAAK,MAA+B;AACjD,QAAM,MAAM,eAAe;AAC3B,QAAM,EAAE,MAAM,eAAe,IAAI,UAAU,MAAM,IAAI,SAAS,IAAI,IAAI;AAGtE,MAAI,gBAAgB;AAClB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI,QAAQ,IAAI;AAKvD,MAAI;AAEJ,MAAI,KAAK,WAAW;AAClB,qBAAiB,eAAe,SAAS;AAAA,EAC3C,WAAW,KAAK,UAAU;AACxB,qBAAiB,eAAe,eAAe,GAAG;AAAA,EACpD;AAOA,MAAI;AAEJ,MAAI,KAAK,OAAO;AACd,UAAM,WAAY,KAAK,YAAY;AACnC,QAAI;AACF,cAAQ,SAAS,UAAU,KAAK,KAAuC;AAAA,IACzE,QAAQ;AACN,cAAQ,KAAK,2BAA2B,QAAQ,IAAI,KAAK,KAAK,6BAA6B;AAAA,IAC7F;AAAA,EACF;AAKA,QAAM,WAAW,YAAY;AAC7B,QAAM,kBAAkB,gBAAgB,OAAO,KAAK,QAAQ;AAG5D,MAAI,iBAA2B,CAAC;AAChC,QAAM,gBAAgBF,MAAK,WAAW,YAAY;AAClD,MAAIF,YAAW,aAAa,GAAG;AAC7B,qBAAiB,MAAM,QAAQ,aAAa,EAAE;AAAA,MAAK,CAAC,UAClD,MACG,OAAO,CAAC,OAAO,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC,EAAE,SAAS,OAAO,CAAC,EAC9E,IAAI,CAAC,MAAME,MAAK,eAAe,CAAC,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,iBAAiB,IAAI,sBAAsB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B;AAAA,EAC5B,CAAC;AACD,QAAM,eAAe,OAAO;AAK5B,QAAM,EAAE,SAAS,qBAAqB,IAAI,MAAM,mBAAmB;AAAA,IACjE;AAAA,IACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,KAAK,WAAW,EAAE,eAAe,KAAK,SAAS,IAAI,CAAC;AAAA,IACxD,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,sBAAsB;AACxB,YAAQ,KAAK,YAAY,oBAAoB,EAAE;AAAA,EACjD;AAOA,MAAI,iBAAiB,KAAK,SAAS,CAAC;AACpC,MAAI,KAAK,SAAS,CAAC,gBAAgB;AACjC,UAAM,eAAe,MAAM,UAAU;AACrC,QAAI,cAAc;AAChB,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,aAAa,SAAS;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA,UAAU,KAAK,SAAS,MAAM,CAAC;AAAA,IACjC,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,OAAO;AACL,UAAM,OAAO,IAAI,gBAAgB,SAAS;AAAA,MACxC;AAAA,MACA,iBAAiB,KAAK,SAAS,MAAM,CAAC;AAAA,IACxC,CAAC;AACD,UAAM,KAAK,IAAI;AAAA,EACjB;AACF;AA7KA,IAgEM,YACA;AAjEN;AAAA;AAAA;AA2BA;AACA;AAkCA,6BAAyB,qBAAqB;AAE9C,IAAM,aAAaC,eAAc,YAAY,GAAG;AAChD,IAAM,YAAYF,SAAQ,UAAU;AA8GpC,SAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACzC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA;AAAA;;;AC1KD,SAAS,cAAAI,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYJ,SAAQG,WAAU;AAMpC,SAAS,eAAe,UAAsC;AAC5D,MAAI,MAAM;AACV,SAAO,QAAQH,SAAQ,GAAG,GAAG;AAC3B,QAAID,YAAWE,MAAK,KAAK,cAAc,CAAC,GAAG;AACzC,aAAO;AAAA,IACT;AACA,UAAMD,SAAQ,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AAKA,IAAM,aAAa,eAAeI,UAAS;AAC3C,IAAI,YAAY;AACd,UAAQ,IAAI,iBAAiB;AAC/B;AAGA,QAAQ,IAAI,wBAAwB;AAGpC,MAAM;","names":["fileURLToPath","__dirname","existsSync","dirname","join","fileURLToPath","resolve","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
1
+ {"version":3,"sources":["../../../../../cli-utils/src/self-update.ts","../../../../../cli-utils/src/index.ts","../../src/args.ts","../../src/utils/package.ts","../../src/extensions/version-check.ts","../../src/cli.ts","../../src/launcher.ts"],"sourcesContent":["/**\n * Self-update functionality for Genesys CLI tools.\n *\n * Provides utilities for checking and performing CLI updates\n * via npm or pnpm package managers.\n */\n\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport type { Command } from 'commander';\n\n/**\n * Check if running from an installed package (not local development).\n * Returns true if the current file is inside node_modules.\n */\nexport function isInstalledPackage(): boolean {\n try {\n const currentFile = fileURLToPath(import.meta.url);\n return currentFile.includes('node_modules');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect which package manager was used to install the CLI.\n * Checks environment variables and execution path.\n *\n * @returns 'pnpm', 'npm', or 'unknown'\n */\nexport function detectPackageManager(): 'pnpm' | 'npm' | 'unknown' {\n // Check environment variables\n if (process.env.PNPM_PACKAGE_NAME) return 'pnpm';\n if (process.env.npm_execpath?.includes('pnpm')) return 'pnpm';\n\n // Check exec path\n const execPath = process.argv[1] || '';\n if (execPath.includes('pnpm')) return 'pnpm';\n if (execPath.includes('npm')) return 'npm';\n\n // Default to pnpm (monorepo preference)\n return 'pnpm';\n}\n\n/**\n * Compare semantic versions.\n * Returns true if latest is newer than current.\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = latest.split('.').map(Number);\n const currentParts = current.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] || 0;\n const currentPart = currentParts[i] || 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\n/**\n * Check npm registry for the latest version of a package.\n *\n * @param packageName - The npm package name\n * @param currentVersion - The currently installed version\n * @returns Latest version string, or null if up-to-date or error\n */\nexport async function checkForUpdates(\n packageName: string,\n currentVersion: string\n): Promise<string | null> {\n try {\n if (!isInstalledPackage()) return null;\n\n const encodedName = encodeURIComponent(packageName);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (!latestVersion || latestVersion === currentVersion) return null;\n if (!isNewerVersion(latestVersion, currentVersion)) return null;\n\n return latestVersion;\n } catch {\n return null;\n }\n}\n\n/**\n * Perform the update using the detected package manager.\n *\n * @param packageName - The npm package name\n * @param packageManager - The package manager to use ('pnpm' or 'npm')\n * @param currentVersion - The current installed version\n * @param latestVersion - The latest available version\n * @returns true on success, false on failure\n */\nexport function performUpdate(\n packageName: string,\n packageManager: 'pnpm' | 'npm',\n currentVersion: string,\n latestVersion: string\n): boolean {\n console.log(`\\nUpdating ${packageName}...`);\n console.log(` Current: v${currentVersion}`);\n console.log(` Latest: v${latestVersion}\\n`);\n\n try {\n const updateCommand = packageManager === 'pnpm'\n ? `pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`\n : `npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`;\n\n // Run in shell for cross-platform compatibility (&& works on Unix, needs shell on Windows)\n execSync(updateCommand, { stdio: 'inherit' } as import('child_process').ExecSyncOptions);\n\n console.log(`\\n✅ Update complete! ${packageName} has been updated to v${latestVersion}.`);\n return true;\n } catch (error) {\n console.error(`\\n❌ Update failed. Please try running the commands manually:`);\n if (packageManager === 'pnpm') {\n console.error(` pnpm remove -g ${packageName}`);\n console.error(` pnpm add -g ${packageName}@latest`);\n } else {\n console.error(` npm uninstall -g ${packageName}`);\n console.error(` npm install -g ${packageName}@latest`);\n }\n return false;\n }\n}\n\n/**\n * Callback fired when the update command is invoked.\n */\nexport type UpdateCommandCallback = () => void;\n\n/**\n * Add 'update' subcommand to a Commander.js program.\n *\n * @param program - The Commander.js program\n * @param packageName - The npm package name\n * @param currentVersion - The current installed version\n * @param onUpdate - Optional callback fired when the update command is invoked\n */\nexport function addUpdateCommand(\n program: Command,\n packageName: string,\n currentVersion: string,\n onUpdate?: UpdateCommandCallback\n): void {\n program\n .command('update')\n .description('Check for updates and install the latest version')\n .action(async () => {\n // Notify caller that update command is being handled\n onUpdate?.();\n\n // Skip if running from local development\n if (!isInstalledPackage()) {\n console.log('Skipping update check - running from local development.');\n process.exit(0);\n }\n\n console.log('Checking for updates...');\n\n const latestVersion = await checkForUpdates(packageName, currentVersion);\n\n if (!latestVersion) {\n console.log(`You are already using the latest version (v${currentVersion}).`);\n process.exit(0);\n }\n\n console.log(`\\n📦 Update available: v${currentVersion} → v${latestVersion}`);\n\n const packageManager = detectPackageManager();\n\n if (packageManager === 'unknown') {\n console.error('\\n❌ Could not detect package manager. Please update manually:');\n console.error(` pnpm remove -g ${packageName} && pnpm add -g ${packageName}@latest`);\n console.error(` or`);\n console.error(` npm uninstall -g ${packageName} && npm install -g ${packageName}@latest`);\n process.exit(1);\n }\n\n const success = performUpdate(packageName, packageManager, currentVersion, latestVersion);\n process.exit(success ? 0 : 1);\n });\n}\n","export * from './self-update.js';\n","/**\n * CLI argument definitions for the Genesys Agent v2 CLI.\n *\n * Intentionally minimal — model selection, session management and tool\n * configuration are delegated to pi's own machinery via createAgentSession.\n */\n\nimport { addUpdateCommand } from '@gnsx/cli-utils';\nimport { Command } from 'commander';\n\nimport type { ThinkingLevel } from '@mariozechner/pi-agent-core';\n\nexport interface Args {\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n\n /** Model identifier, e.g. \"anthropic/claude-opus-4-5\" or \"claude-opus-4-5\" */\n model?: string;\n\n /** LLM provider, e.g. \"anthropic\". Used together with --model. */\n provider?: string;\n\n /** Thinking/reasoning level */\n thinking?: ThinkingLevel;\n\n /**\n * Print mode: send a single prompt, output the response, exit.\n * When true, `messages[0]` is used as the prompt.\n */\n print: boolean;\n\n /**\n * Disable session persistence (in-memory only).\n */\n noSession: boolean;\n\n /**\n * Continue the most recent session for the current working directory.\n */\n continue: boolean;\n\n /** Positional arguments / prompt text (used in print mode) */\n messages: string[];\n}\n\nexport interface ParseArgsResult {\n args: Args;\n program: Command;\n /** True if a subcommand (e.g., update) was invoked and the caller should exit early */\n commandHandled: boolean;\n}\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh'];\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return THINKING_LEVELS.includes(value as ThinkingLevel);\n}\n\nfunction parseModel(value: string): { provider?: string; model: string } {\n // Support \"provider/model\" shorthand\n if (value.includes('/')) {\n const slash = value.indexOf('/');\n return {\n provider: value.slice(0, slash),\n model: value.slice(slash + 1),\n };\n }\n return { model: value };\n}\n\nexport function parseArgs(argv: string[], version: string, packageName: string): ParseArgsResult {\n let commandHandled = false;\n\n const program = new Command();\n const args: Args = {\n print: false,\n noSession: false,\n continue: false,\n messages: [],\n };\n\n program\n .name('genesys')\n .description('Genesys Agent v2 CLI - AI-powered coding assistant')\n .version(version, '-v, --version')\n .usage('[options] [prompt]')\n .action(() => {\n // Default action: agent session will run (commandHandled remains false)\n });\n\n // Add update command - callback sets flag when invoked\n addUpdateCommand(program, packageName, version, () => {\n commandHandled = true;\n });\n\n program\n .option('-p, --print', 'print mode: send prompt, output response, exit', false)\n .option('-c, --continue', 'continue the most recent session', false)\n .option('--no-session', 'disable session persistence (in-memory only)', false)\n .option('-m, --model <model>', 'model to use, e.g. \"anthropic/claude-opus-4-5\"')\n .option('--provider <name>', 'provider name (used with --model)')\n .option('--thinking <level>', `thinking level: ${THINKING_LEVELS.join(', ')}`)\n .option('--cwd <dir>', 'working directory (default: current directory)')\n .argument('[prompt...]', 'initial prompt text')\n .parse(argv, { from: 'user' });\n\n const opts = program.opts();\n const cliArgs = program.processedArgs as string[][];\n\n // Handle model parsing with provider/model shorthand\n if (opts.model) {\n const parsed = parseModel(opts.model);\n args.model = parsed.model;\n if (parsed.provider) {\n args.provider = parsed.provider;\n }\n }\n // Provider can be overridden explicitly\n if (opts.provider) {\n args.provider = opts.provider;\n }\n\n // Validate thinking level\n if (opts.thinking) {\n if (!isThinkingLevel(opts.thinking)) {\n console.error(`--thinking must be one of: ${THINKING_LEVELS.join(', ')}`);\n process.exit(1);\n }\n args.thinking = opts.thinking;\n }\n\n args.print = opts.print ?? false;\n args.noSession = opts.noSession ?? false;\n args.continue = opts.continue ?? false;\n args.cwd = opts.cwd;\n\n // Collect positional arguments as messages\n if (cliArgs.length > 0 && cliArgs[0]) {\n args.messages = cliArgs[0];\n }\n\n return { args, program, commandHandled };\n}\n","/**\n * Returns the parsed package.json for the nearest package by traversing\n * up from the current module's directory.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageJson<T = { name: string; version: string }>(): T {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let currentDir = __dirname;\n\n while (true) {\n const pkgPath = join(currentDir, 'package.json');\n if (existsSync(pkgPath)) {\n const content = readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as T;\n }\n\n const parentDir = dirname(currentDir);\n // Stop at filesystem root\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n currentDir = parentDir;\n }\n}\n","/**\n * Extension that checks for updates to @gnsx/genesys.agent.cli\n * and shows a notification if a newer version is available.\n */\nimport { getPackageJson } from '../utils/package.js';\n\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory } from '@mariozechner/pi-coding-agent';\n\nconst pkg = getPackageJson();\nconst PACKAGE_NAME = pkg.name;\nconst CURRENT_VERSION = pkg.version;\n\nasync function checkForNewVersion(): Promise<string | undefined> {\n if (process.env.PI_OFFLINE) {\n return undefined;\n }\n\n try {\n const encodedName = encodeURIComponent(PACKAGE_NAME);\n const response = await fetch(`https://registry.npmjs.org/${encodedName}/latest`, {\n signal: AbortSignal.timeout(10000),\n });\n if (!response.ok) {\n return undefined;\n }\n\n const data = (await response.json()) as { version?: string };\n const latestVersion = data.version;\n\n if (latestVersion && latestVersion !== CURRENT_VERSION) {\n return latestVersion;\n }\n return undefined;\n } catch (err) {\n return undefined;\n }\n}\n\nconst versionCheckExtension: ExtensionFactory = (pi: ExtensionAPI) => {\n // Listen for session start to check version\n pi.on('session_start', async (_event, ctx: ExtensionContext) => {\n // Run version check asynchronously (don't block startup)\n checkForNewVersion().then((newVersion) => {\n if (newVersion) {\n ctx.ui.notify(\n `Update available: v${newVersion} (current: v${CURRENT_VERSION}). Run: pnpm add -g ${PACKAGE_NAME}`,\n 'info'\n );\n }\n });\n });\n};\n\nexport default versionCheckExtension;\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI entry point.\n *\n * Thin wrapper around pi's createAgentSession + InteractiveMode / runPrintMode.\n * All session persistence, model selection, tool management and compaction are\n * handled by the pi framework.\n */\n\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getExtensions } from '@gnsx/genesys.agent.extensions';\nimport { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';\nimport { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';\nimport {\n AuthStorage,\n createAgentSession,\n DefaultResourceLoader,\n getAgentDir,\n InteractiveMode,\n ModelRegistry,\n runPrintMode,\n SessionManager,\n SettingsManager,\n} from '@mariozechner/pi-coding-agent';\n\nimport { parseArgs } from './args.js';\nimport versionCheckExtension from './extensions/version-check.js';\nimport { getPackageJson } from './utils/package.js';\n\n/**\n * Read all data from stdin if available.\n * Returns null if stdin is not piped/redirected.\n */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n // stdin is a terminal (not piped)\n return null;\n }\n\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf-8');\n\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n\n process.stdin.on('end', () => {\n resolve(data.trim() || null);\n });\n\n process.stdin.on('error', (err) => {\n reject(err);\n });\n\n // Resume stdin to start reading\n process.stdin.resume();\n });\n}\n\n// Register Bedrock provider so AWS users can use it without extra setup\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nasync function main(argv: string[]): Promise<void> {\n const pkg = getPackageJson();\n const { args, commandHandled } = parseArgs(argv, pkg.version, pkg.name);\n\n // If a subcommand (e.g., update) was invoked, skip the agent session logic\n if (commandHandled) {\n return;\n }\n\n const cwd = args.cwd ? resolve(args.cwd) : process.cwd();\n\n // -------------------------------------------------------------------------\n // Session manager\n // -------------------------------------------------------------------------\n let sessionManager: SessionManager | undefined;\n\n if (args.noSession) {\n sessionManager = SessionManager.inMemory();\n } else if (args.continue) {\n sessionManager = SessionManager.continueRecent(cwd);\n }\n // undefined → createAgentSession creates a new persisted session\n\n // -------------------------------------------------------------------------\n // Model resolution (only when --model is passed; pi picks from settings /\n // env vars automatically otherwise)\n // -------------------------------------------------------------------------\n let model: ReturnType<typeof getModel> | undefined;\n\n if (args.model) {\n const provider = (args.provider ?? 'anthropic') as Parameters<typeof getModel>[0];\n try {\n model = getModel(provider, args.model as Parameters<typeof getModel>[1]);\n } catch {\n console.warn(`Warning: unknown model \"${provider}/${args.model}\", falling back to default.`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Create custom resource loader with shared extensions + CLI-specific extensions\n // -------------------------------------------------------------------------\n const agentDir = getAgentDir();\n const settingsManager = SettingsManager.create(cwd, agentDir);\n\n // Get shared extensions from the extensions package + CLI-specific version check\n const sharedExtensions = getExtensions('cli');\n const extensionFactories = [...sharedExtensions, versionCheckExtension];\n\n const resourceLoader = new DefaultResourceLoader({\n cwd,\n agentDir,\n settingsManager,\n extensionFactories,\n });\n await resourceLoader.reload();\n\n // -------------------------------------------------------------------------\n // Apply extension provider registrations\n // -------------------------------------------------------------------------\n const extensionsResult = resourceLoader.getExtensions();\n const authStorage = AuthStorage.create(join(agentDir, 'auth.json'));\n const modelRegistry = new ModelRegistry(authStorage, join(agentDir, 'models.json'));\n\n // Apply pending provider registrations from extensions so they're available\n // for model resolution before AgentSession is created\n for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n try {\n modelRegistry.registerProvider(name, config);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Extension \"${extensionPath}\" failed to register provider \"${name}\": ${message}`);\n }\n }\n extensionsResult.runtime.pendingProviderRegistrations = [];\n\n // -------------------------------------------------------------------------\n // Create session\n // -------------------------------------------------------------------------\n const { session, modelFallbackMessage } = await createAgentSession({\n cwd,\n modelRegistry,\n ...(model ? { model } : {}),\n ...(args.thinking ? { thinkingLevel: args.thinking } : {}),\n ...(sessionManager ? { sessionManager } : {}),\n settingsManager,\n resourceLoader,\n });\n\n if (modelFallbackMessage) {\n console.warn(`Warning: ${modelFallbackMessage}`);\n }\n\n // -------------------------------------------------------------------------\n // Run mode\n // -------------------------------------------------------------------------\n\n // Read from stdin if -p flag is set but no prompt provided\n let initialMessage = args.messages[0];\n if (args.print && !initialMessage) {\n const stdinContent = await readStdin();\n if (stdinContent) {\n initialMessage = stdinContent;\n }\n }\n\n if (args.print) {\n await runPrintMode(session, {\n mode: 'text',\n initialMessage,\n messages: args.messages.slice(1),\n });\n process.exit(0);\n } else {\n const mode = new InteractiveMode(session, {\n initialMessage,\n initialMessages: args.messages.slice(1),\n });\n await mode.run();\n }\n}\n\nmain(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","#!/usr/bin/env node\n/**\n * Genesys Agent v2 CLI launcher.\n *\n * Sets environment variables before importing the main CLI to ensure\n * pi-coding-agent reads the correct configuration during initialization.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Find the first directory containing package.json, starting from the given\n * directory and walking upward.\n */\nfunction findPackageDir(startDir: string): string | undefined {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return undefined;\n}\n\n// Set PI_PACKAGE_DIR to the first directory with package.json\n// This MUST be set before importing @mariozechner/pi-coding-agent so that\n// packages/coding-agent/src/config.ts can read it during initialization\nconst packageDir = findPackageDir(__dirname);\nif (packageDir) {\n process.env.PI_PACKAGE_DIR = packageDir;\n}\n\n// Disable pi-coding-agent's built-in version check (we use an extension)\nprocess.env.PI_SKIP_VERSION_CHECK = '1';\n\n// Now import and run the actual CLI\nawait import('./cli.js');\n"],"mappings":"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","names":["fileURLToPath","__dirname","dirname","join","fileURLToPath","resolve","pkg","existsSync","dirname","join","fileURLToPath","__filename","__dirname"]}
package/dist/src/cli.js CHANGED
@@ -6,14 +6,14 @@
6
6
  * All session persistence, model selection, tool management and compaction are
7
7
  * handled by the pi framework.
8
8
  */
9
- import { existsSync } from 'node:fs';
10
- import { readdir } from 'node:fs/promises';
11
9
  import { dirname, join, resolve } from 'node:path';
12
10
  import { fileURLToPath } from 'node:url';
11
+ import { getExtensions } from '@gnsx/genesys.agent.extensions';
13
12
  import { getModel, setBedrockProviderModule } from '@mariozechner/pi-ai';
14
13
  import { bedrockProviderModule } from '@mariozechner/pi-ai/bedrock-provider';
15
- import { createAgentSession, DefaultResourceLoader, getAgentDir, InteractiveMode, runPrintMode, SessionManager, SettingsManager, } from '@mariozechner/pi-coding-agent';
14
+ import { AuthStorage, createAgentSession, DefaultResourceLoader, getAgentDir, InteractiveMode, ModelRegistry, runPrintMode, SessionManager, SettingsManager, } from '@mariozechner/pi-coding-agent';
16
15
  import { parseArgs } from './args.js';
16
+ import versionCheckExtension from './extensions/version-check.js';
17
17
  import { getPackageJson } from './utils/package.js';
18
18
  /**
19
19
  * Read all data from stdin if available.
@@ -78,30 +78,44 @@ async function main(argv) {
78
78
  }
79
79
  }
80
80
  // -------------------------------------------------------------------------
81
- // Create custom resource loader with our version-check extension
81
+ // Create custom resource loader with shared extensions + CLI-specific extensions
82
82
  // -------------------------------------------------------------------------
83
83
  const agentDir = getAgentDir();
84
84
  const settingsManager = SettingsManager.create(cwd, agentDir);
85
- // Scan extensions folder for all .ts and .js files (excluding .d.ts)
86
- let extensionFiles = [];
87
- const extensionsDir = join(__dirname, 'extensions');
88
- if (existsSync(extensionsDir)) {
89
- extensionFiles = await readdir(extensionsDir).then((files) => files
90
- .filter((f) => (f.endsWith('.ts') || f.endsWith('.js')) && !f.endsWith('.d.ts'))
91
- .map((f) => join(extensionsDir, f)));
92
- }
85
+ // Get shared extensions from the extensions package + CLI-specific version check
86
+ const sharedExtensions = getExtensions('cli');
87
+ const extensionFactories = [...sharedExtensions, versionCheckExtension];
93
88
  const resourceLoader = new DefaultResourceLoader({
94
89
  cwd,
95
90
  agentDir,
96
91
  settingsManager,
97
- additionalExtensionPaths: extensionFiles,
92
+ extensionFactories,
98
93
  });
99
94
  await resourceLoader.reload();
100
95
  // -------------------------------------------------------------------------
96
+ // Apply extension provider registrations
97
+ // -------------------------------------------------------------------------
98
+ const extensionsResult = resourceLoader.getExtensions();
99
+ const authStorage = AuthStorage.create(join(agentDir, 'auth.json'));
100
+ const modelRegistry = new ModelRegistry(authStorage, join(agentDir, 'models.json'));
101
+ // Apply pending provider registrations from extensions so they're available
102
+ // for model resolution before AgentSession is created
103
+ for (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {
104
+ try {
105
+ modelRegistry.registerProvider(name, config);
106
+ }
107
+ catch (error) {
108
+ const message = error instanceof Error ? error.message : String(error);
109
+ console.warn(`Warning: Extension "${extensionPath}" failed to register provider "${name}": ${message}`);
110
+ }
111
+ }
112
+ extensionsResult.runtime.pendingProviderRegistrations = [];
113
+ // -------------------------------------------------------------------------
101
114
  // Create session
102
115
  // -------------------------------------------------------------------------
103
116
  const { session, modelFallbackMessage } = await createAgentSession({
104
117
  cwd,
118
+ modelRegistry,
105
119
  ...(model ? { model } : {}),
106
120
  ...(args.thinking ? { thinkingLevel: args.thinking } : {}),
107
121
  ...(sessionManager ? { sessionManager } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;GAGG;AACH,KAAK,UAAU,SAAS;IACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,kCAAkC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wEAAwE;AACxE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;AAEhD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAExE,2EAA2E;IAC3E,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzD,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAC5E,IAAI,cAA0C,CAAC;IAE/C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IACD,iEAAiE;IAEjE,4EAA4E;IAC5E,0EAA0E;IAC1E,oCAAoC;IACpC,4EAA4E;IAC5E,IAAI,KAA8C,CAAC;IAEnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAmC,CAAC;QAClF,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAuC,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,IAAI,IAAI,CAAC,KAAK,6BAA6B,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,iEAAiE;IACjE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE9D,qEAAqE;IACrE,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3D,KAAK;aACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC/E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CACtC,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;QAC/C,GAAG;QACH,QAAQ;QACR,eAAe;QACf,wBAAwB,EAAE,cAAc;KACzC,CAAC,CAAC;IACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAE9B,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,kBAAkB,CAAC;QACjE,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,eAAe;QACf,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,YAAY,oBAAoB,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAE5E,2DAA2D;IAC3D,IAAI,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,SAAS,EAAE,CAAC;QACvC,IAAI,YAAY,EAAE,CAAC;YACjB,cAAc,GAAG,YAAY,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAAC,OAAO,EAAE;YAC1B,IAAI,EAAE,MAAM;YACZ,cAAc;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SACjC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE;YACxC,cAAc;YACd,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}