@runcofactor/cli 0.16.0 → 0.18.0

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 (129) hide show
  1. package/dist/{account-ZMV7NEFM.js → account-ZSM2Q3RB.js} +4 -4
  2. package/dist/{api-catalog-6HNOGVPA.js → api-catalog-MMPFWS52.js} +4 -4
  3. package/dist/{attachment-QAHR54HQ.js → attachment-NSYL5X3S.js} +4 -4
  4. package/dist/{augmentor-7T3L6ZR4.js → augmentor-LSJLMJYP.js} +4 -4
  5. package/dist/{auth-DURHUZDW.js → auth-OYF5A4BY.js} +4 -2
  6. package/dist/{chunk-RGDIVW3O.js → chunk-2R6544Z3.js} +2 -2
  7. package/dist/{chunk-AI3Y3AZH.js → chunk-7OO3RJYR.js} +1396 -185
  8. package/dist/chunk-7OO3RJYR.js.map +1 -0
  9. package/dist/{chunk-4NRDONSC.js → chunk-A6TH5VUI.js} +209 -79
  10. package/dist/chunk-A6TH5VUI.js.map +1 -0
  11. package/dist/{chunk-CEXV3MOC.js → chunk-E2FUQJVO.js} +4 -4
  12. package/dist/{chunk-D6AVOPOS.js → chunk-GFP4UEUT.js} +3 -3
  13. package/dist/{chunk-G5SXUXSU.js → chunk-H7ZML5QL.js} +2 -2
  14. package/dist/{chunk-LFFWD5JZ.js → chunk-IHCPMYKU.js} +3 -3
  15. package/dist/{chunk-UAJUZLDE.js → chunk-PVWG3V62.js} +3 -3
  16. package/dist/{chunk-3CZU7XCS.js → chunk-PWZ4ULCB.js} +20 -14
  17. package/dist/chunk-PWZ4ULCB.js.map +1 -0
  18. package/dist/{chunk-A4ISG3VX.js → chunk-U7OMQJ7V.js} +52 -4
  19. package/dist/chunk-U7OMQJ7V.js.map +1 -0
  20. package/dist/{chunk-DT2CEH2V.js → chunk-VHVOTGBQ.js} +3 -3
  21. package/dist/{chunk-IGHDIWZU.js → chunk-VYTIJ6HJ.js} +17 -2
  22. package/dist/{chunk-IGHDIWZU.js.map → chunk-VYTIJ6HJ.js.map} +1 -1
  23. package/dist/{credential-X6QKX473.js → credential-WOATCWOU.js} +4 -4
  24. package/dist/{credential-template-GD3D4MBI.js → credential-template-Q3DQE2AH.js} +4 -4
  25. package/dist/{debug-workflow-AAEOAME2.js → debug-workflow-ZNP5XZQF.js} +4 -4
  26. package/dist/{dist-QLTVBUMD.js → dist-4COOAKY3.js} +22 -2
  27. package/dist/{docs-BVUEXBY3.js → docs-XVU4LA7G.js} +4 -4
  28. package/dist/{doctor-RHMKD4W5.js → doctor-PGNHD3TI.js} +3 -3
  29. package/dist/{environment-WE7VVE6I.js → environment-MRDNWU47.js} +4 -4
  30. package/dist/{feature-flag-VJO2TJFT.js → feature-flag-D3DQZ6DX.js} +4 -4
  31. package/dist/index.js +51 -48
  32. package/dist/index.js.map +1 -1
  33. package/dist/{init-RQHHKJJD.js → init-DHWKUYIR.js} +4 -4
  34. package/dist/{install-CQLHNZ6U.js → install-DMEFGQHD.js} +4 -4
  35. package/dist/{issues-HK2JA5JS.js → issues-E4YQ4DVC.js} +4 -4
  36. package/dist/{knobs-ETJAV6YM.js → knobs-NA6SPLHX.js} +4 -4
  37. package/dist/{list-F6DGGW3Z.js → list-GJNGFQMC.js} +4 -4
  38. package/dist/{local-CMAY54I5.js → local-NSKOZHHA.js} +6 -6
  39. package/dist/{login-6CKG664C.js → login-AMSRVPXG.js} +4 -4
  40. package/dist/{mcp-GC2WOOZO.js → mcp-57VVZTXM.js} +5 -5
  41. package/dist/{metrics-IXICURAA.js → metrics-DM4YQQZN.js} +4 -4
  42. package/dist/{product-BUJWPYKB.js → product-WGOLTBRI.js} +4 -4
  43. package/dist/{property-4EXPWRNT.js → property-B7QMGLVW.js} +4 -4
  44. package/dist/{psql-XGLBI6T7.js → psql-4JHPJ2CO.js} +3 -3
  45. package/dist/{record-HL4QA7OX.js → record-RWVGZZSW.js} +5 -5
  46. package/dist/{redis-VJGCUJPV.js → redis-N44ZZ6VB.js} +3 -3
  47. package/dist/{release-2SMK5Y3V.js → release-R7GKLEAI.js} +4 -4
  48. package/dist/{sandbox-ORAPKOH3.js → sandbox-6D54ZQCG.js} +5 -5
  49. package/dist/{scenarios-DM5FDCAF.js → scenarios-WUUUKP2S.js} +4 -4
  50. package/dist/{session-X6IYGWYG.js → session-GDCMTNB3.js} +6 -6
  51. package/dist/{skill-ZU5V2EE5.js → skill-3SP7MAA4.js} +153 -2
  52. package/dist/skill-3SP7MAA4.js.map +1 -0
  53. package/dist/skills/optimize-cache/SKILL.md +25 -0
  54. package/dist/{spec-KO5QD6AY.js → spec-ESPA3H26.js} +3 -3
  55. package/dist/{src-DSD34JIX.js → src-5YXGM2KB.js} +18 -2
  56. package/dist/src-5YXGM2KB.js.map +1 -0
  57. package/dist/{src-PDYXACRP.js → src-B7CPYFLS.js} +4 -2
  58. package/dist/{src-HTGNKBUF.js → src-GRO2QR7U.js} +61 -23
  59. package/dist/{src-HTGNKBUF.js.map → src-GRO2QR7U.js.map} +1 -1
  60. package/dist/{start-2ECN4LX5.js → start-KDDRLUFN.js} +4 -4
  61. package/dist/{tag-R5I72HJ6.js → tag-DAGHQZAR.js} +5 -5
  62. package/dist/{task-V3JMSJIM.js → task-PRR75HI4.js} +4 -4
  63. package/dist/{test-suite-NOYVK6YX.js → test-suite-O3UY7EER.js} +6 -6
  64. package/dist/{trace-NOYEKNO4.js → trace-7LRHSPWN.js} +4 -4
  65. package/dist/{triage-4RFATHBE.js → triage-2BKUBMMX.js} +5 -5
  66. package/dist/{utilities-3WMXE743.js → utilities-O3OO64T5.js} +4 -4
  67. package/dist/{workflow-DC7WOTTW.js → workflow-5BFRS4CE.js} +10 -11
  68. package/dist/workflow-5BFRS4CE.js.map +1 -0
  69. package/dist/{workflow-cache-SDSI6SMF.js → workflow-cache-VVP3SPFM.js} +7 -7
  70. package/dist/{workflow-debug-6UQYP67Q.js → workflow-debug-XGOHNZ4E.js} +7 -7
  71. package/dist/{workflow-proposals-67AVGMHX.js → workflow-proposals-PGURJ6ZI.js} +4 -4
  72. package/package.json +5 -5
  73. package/dist/chunk-3CZU7XCS.js.map +0 -1
  74. package/dist/chunk-4NRDONSC.js.map +0 -1
  75. package/dist/chunk-A4ISG3VX.js.map +0 -1
  76. package/dist/chunk-AI3Y3AZH.js.map +0 -1
  77. package/dist/skill-ZU5V2EE5.js.map +0 -1
  78. package/dist/src-DSD34JIX.js.map +0 -1
  79. package/dist/workflow-DC7WOTTW.js.map +0 -1
  80. /package/dist/{account-ZMV7NEFM.js.map → account-ZSM2Q3RB.js.map} +0 -0
  81. /package/dist/{api-catalog-6HNOGVPA.js.map → api-catalog-MMPFWS52.js.map} +0 -0
  82. /package/dist/{attachment-QAHR54HQ.js.map → attachment-NSYL5X3S.js.map} +0 -0
  83. /package/dist/{augmentor-7T3L6ZR4.js.map → augmentor-LSJLMJYP.js.map} +0 -0
  84. /package/dist/{auth-DURHUZDW.js.map → auth-OYF5A4BY.js.map} +0 -0
  85. /package/dist/{chunk-RGDIVW3O.js.map → chunk-2R6544Z3.js.map} +0 -0
  86. /package/dist/{chunk-CEXV3MOC.js.map → chunk-E2FUQJVO.js.map} +0 -0
  87. /package/dist/{chunk-D6AVOPOS.js.map → chunk-GFP4UEUT.js.map} +0 -0
  88. /package/dist/{chunk-G5SXUXSU.js.map → chunk-H7ZML5QL.js.map} +0 -0
  89. /package/dist/{chunk-LFFWD5JZ.js.map → chunk-IHCPMYKU.js.map} +0 -0
  90. /package/dist/{chunk-UAJUZLDE.js.map → chunk-PVWG3V62.js.map} +0 -0
  91. /package/dist/{chunk-DT2CEH2V.js.map → chunk-VHVOTGBQ.js.map} +0 -0
  92. /package/dist/{credential-X6QKX473.js.map → credential-WOATCWOU.js.map} +0 -0
  93. /package/dist/{credential-template-GD3D4MBI.js.map → credential-template-Q3DQE2AH.js.map} +0 -0
  94. /package/dist/{debug-workflow-AAEOAME2.js.map → debug-workflow-ZNP5XZQF.js.map} +0 -0
  95. /package/dist/{dist-QLTVBUMD.js.map → dist-4COOAKY3.js.map} +0 -0
  96. /package/dist/{docs-BVUEXBY3.js.map → docs-XVU4LA7G.js.map} +0 -0
  97. /package/dist/{doctor-RHMKD4W5.js.map → doctor-PGNHD3TI.js.map} +0 -0
  98. /package/dist/{environment-WE7VVE6I.js.map → environment-MRDNWU47.js.map} +0 -0
  99. /package/dist/{feature-flag-VJO2TJFT.js.map → feature-flag-D3DQZ6DX.js.map} +0 -0
  100. /package/dist/{init-RQHHKJJD.js.map → init-DHWKUYIR.js.map} +0 -0
  101. /package/dist/{install-CQLHNZ6U.js.map → install-DMEFGQHD.js.map} +0 -0
  102. /package/dist/{issues-HK2JA5JS.js.map → issues-E4YQ4DVC.js.map} +0 -0
  103. /package/dist/{knobs-ETJAV6YM.js.map → knobs-NA6SPLHX.js.map} +0 -0
  104. /package/dist/{list-F6DGGW3Z.js.map → list-GJNGFQMC.js.map} +0 -0
  105. /package/dist/{local-CMAY54I5.js.map → local-NSKOZHHA.js.map} +0 -0
  106. /package/dist/{login-6CKG664C.js.map → login-AMSRVPXG.js.map} +0 -0
  107. /package/dist/{mcp-GC2WOOZO.js.map → mcp-57VVZTXM.js.map} +0 -0
  108. /package/dist/{metrics-IXICURAA.js.map → metrics-DM4YQQZN.js.map} +0 -0
  109. /package/dist/{product-BUJWPYKB.js.map → product-WGOLTBRI.js.map} +0 -0
  110. /package/dist/{property-4EXPWRNT.js.map → property-B7QMGLVW.js.map} +0 -0
  111. /package/dist/{psql-XGLBI6T7.js.map → psql-4JHPJ2CO.js.map} +0 -0
  112. /package/dist/{record-HL4QA7OX.js.map → record-RWVGZZSW.js.map} +0 -0
  113. /package/dist/{redis-VJGCUJPV.js.map → redis-N44ZZ6VB.js.map} +0 -0
  114. /package/dist/{release-2SMK5Y3V.js.map → release-R7GKLEAI.js.map} +0 -0
  115. /package/dist/{sandbox-ORAPKOH3.js.map → sandbox-6D54ZQCG.js.map} +0 -0
  116. /package/dist/{scenarios-DM5FDCAF.js.map → scenarios-WUUUKP2S.js.map} +0 -0
  117. /package/dist/{session-X6IYGWYG.js.map → session-GDCMTNB3.js.map} +0 -0
  118. /package/dist/{spec-KO5QD6AY.js.map → spec-ESPA3H26.js.map} +0 -0
  119. /package/dist/{src-PDYXACRP.js.map → src-B7CPYFLS.js.map} +0 -0
  120. /package/dist/{start-2ECN4LX5.js.map → start-KDDRLUFN.js.map} +0 -0
  121. /package/dist/{tag-R5I72HJ6.js.map → tag-DAGHQZAR.js.map} +0 -0
  122. /package/dist/{task-V3JMSJIM.js.map → task-PRR75HI4.js.map} +0 -0
  123. /package/dist/{test-suite-NOYVK6YX.js.map → test-suite-O3UY7EER.js.map} +0 -0
  124. /package/dist/{trace-NOYEKNO4.js.map → trace-7LRHSPWN.js.map} +0 -0
  125. /package/dist/{triage-4RFATHBE.js.map → triage-2BKUBMMX.js.map} +0 -0
  126. /package/dist/{utilities-3WMXE743.js.map → utilities-O3OO64T5.js.map} +0 -0
  127. /package/dist/{workflow-cache-SDSI6SMF.js.map → workflow-cache-VVP3SPFM.js.map} +0 -0
  128. /package/dist/{workflow-debug-6UQYP67Q.js.map → workflow-debug-XGOHNZ4E.js.map} +0 -0
  129. /package/dist/{workflow-proposals-67AVGMHX.js.map → workflow-proposals-PGURJ6ZI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { readBrandEnv } from './brand.js';\n\ntype StoredAuth = {\n token?: string;\n apiUrl?: string;\n orgId?: string;\n orgName?: string;\n};\n\n/** Multi-profile auth file format */\ntype MultiProfileAuth = {\n profiles: Record<string, StoredAuth>;\n default: string;\n};\n\n/** Legacy flat format (single profile) */\ntype LegacyAuth = StoredAuth;\n\nconst AUTH_DIR = path.join(os.homedir(), '.config', 'canary-cli');\nconst AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\n\n/* ── Shared argv helpers ─────────────────────────────────────────────── */\n\nexport function getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1 || index >= argv.length - 1) return undefined;\n return argv[index + 1];\n}\n\nexport function hasFlag(argv: string[], ...flags: string[]): boolean {\n return flags.some((flag) => argv.includes(flag));\n}\n\n/* ── Environment / profile mapping ───────────────────────────────────── */\n\n/** Map --env values to profile names for multi-profile auth storage */\nexport function envToProfile(env: string): string {\n if (env === 'prod' || env === 'production') return 'production';\n if (env === 'dev') return 'dev';\n if (env === 'local') return 'local';\n return env;\n}\n\nconst VALID_ENVS = ['prod', 'dev', 'local'];\n\n/** Environment URL mappings shared across CLI commands */\nexport const ENV_URLS: Record<string, { api: string; app: string }> = {\n prod: {\n api: 'https://api.trycanary.ai',\n app: 'https://app.trycanary.ai',\n },\n production: {\n api: 'https://api.trycanary.ai',\n app: 'https://app.trycanary.ai',\n },\n dev: {\n api: 'https://api.dev.trycanary.ai',\n app: 'https://app.dev.trycanary.ai',\n },\n local: {\n api: 'http://localhost:3000',\n app: 'http://localhost:5173',\n },\n};\n\n/** Derive the web-app URL that corresponds to a given API URL. */\nexport function resolveAppUrl(apiUrl: string): string {\n for (const env of Object.values(ENV_URLS)) {\n if (env.api === apiUrl) return env.app;\n }\n // Fallback for custom API URLs: replace \"api.\" at protocol boundary or \"/api\" path\n return apiUrl.replace(/(:\\/\\/)api\\./, '$1app.').replace(/:3000\\b/, ':5173');\n}\n\nfunction isMultiProfile(data: unknown): data is MultiProfileAuth {\n return typeof data === 'object' && data !== null && 'profiles' in data;\n}\n\n/** Read the raw auth file and normalize to multi-profile format */\nasync function readAuthFile(): Promise<MultiProfileAuth | null> {\n try {\n const content = await fs.readFile(AUTH_FILE, 'utf8');\n const data = JSON.parse(content) as unknown;\n\n if (isMultiProfile(data)) {\n return data;\n }\n\n // Legacy flat format — treat as the \"default\" profile\n const legacy = data as LegacyAuth;\n return {\n profiles: { default: legacy },\n default: 'default',\n };\n } catch {\n return null;\n }\n}\n\nexport async function readStoredAuth(profile?: string): Promise<StoredAuth | null> {\n const auth = await readAuthFile();\n if (!auth) return null;\n\n const key = profile ?? auth.default;\n return auth.profiles[key] ?? null;\n}\n\nexport async function readStoredToken(profile?: string): Promise<string | null> {\n const auth = await readStoredAuth(profile);\n return auth?.token ?? null;\n}\n\nexport async function readStoredApiUrl(profile?: string): Promise<string | null> {\n const auth = await readStoredAuth(profile);\n return auth?.apiUrl ?? null;\n}\n\n/** Return all stored tokens across every profile */\nexport async function readAllStoredTokens(): Promise<string[]> {\n const auth = await readAuthFile();\n if (!auth) return [];\n return Object.values(auth.profiles)\n .map((p) => p.token)\n .filter((t): t is string => !!t);\n}\n\nexport async function saveAuth(auth: StoredAuth, profile?: string): Promise<string> {\n await fs.mkdir(AUTH_DIR, { recursive: true, mode: 0o700 });\n\n // Read existing file (may be legacy or multi-profile)\n let existing: MultiProfileAuth;\n try {\n const content = await fs.readFile(AUTH_FILE, 'utf8');\n const data = JSON.parse(content) as unknown;\n\n if (isMultiProfile(data)) {\n existing = data;\n } else {\n // Migrate legacy flat format into profiles.default\n existing = {\n profiles: { default: data as LegacyAuth },\n default: 'default',\n };\n }\n } catch {\n existing = { profiles: {}, default: 'default' };\n }\n\n const key = profile ?? 'default';\n existing.profiles[key] = auth;\n\n // Set default to this profile if no default exists yet\n if (!existing.profiles[existing.default]) {\n existing.default = key;\n }\n\n await fs.writeFile(AUTH_FILE, JSON.stringify(existing, null, 2), {\n encoding: 'utf8',\n mode: 0o600,\n });\n return AUTH_FILE;\n}\n\n/* ── Shared config resolution ────────────────────────────────────────── */\n\ntype ResolvedConfig = { apiUrl: string; token: string };\n\nasync function resolveConfigInternal(\n argv: string[],\n opts: { required: boolean }\n): Promise<ResolvedConfig | null> {\n const env = getArgValue(argv, '--env');\n const profile = env ? envToProfile(env) : undefined;\n\n if (env && !ENV_URLS[env]) {\n if (opts.required) {\n console.error(`Unknown environment: ${env}`);\n console.error(`Valid environments: ${VALID_ENVS.join(', ')}`);\n process.exit(1);\n }\n return null;\n }\n\n const storedApiUrl = await readStoredApiUrl(profile);\n const apiUrl =\n getArgValue(argv, '--api-url') ??\n (env ? ENV_URLS[env].api : undefined) ??\n readBrandEnv('CANARY_API_URL') ??\n storedApiUrl ??\n 'https://api.trycanary.ai';\n\n const explicitToken = getArgValue(argv, '--token');\n\n let token: string | null;\n if (explicitToken) {\n token = explicitToken;\n } else if (profile) {\n token = (await readStoredToken(profile)) ?? readBrandEnv('CANARY_API_TOKEN') ?? null;\n if (!token && opts.required) {\n console.error(`Error: No token found for \"${env}\" profile.`);\n console.error(`Run: canary login --env ${env}`);\n process.exit(1);\n }\n } else {\n token = readBrandEnv('CANARY_API_TOKEN') ?? (await readStoredToken()) ?? null;\n if (!token && opts.required) {\n console.error('Error: No API token found.');\n console.error('Run: canary login');\n process.exit(1);\n }\n }\n\n return token ? { apiUrl, token } : null;\n}\n\n/**\n * Resolve API URL and auth token from argv flags, env vars, and stored profiles.\n * Used by knobs, feature-flag, release, and debug-session commands.\n */\nexport async function resolveConfig(argv: string[]): Promise<ResolvedConfig> {\n return (await resolveConfigInternal(argv, { required: true }))!;\n}\n\nexport async function resolveOptionalConfig(argv: string[]): Promise<ResolvedConfig | null> {\n return resolveConfigInternal(argv, { required: false });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/auth.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { readBrandEnv } from './brand.js';\n\ntype StoredAuth = {\n token?: string;\n apiUrl?: string;\n orgId?: string;\n orgName?: string;\n};\n\n/** Multi-profile auth file format */\ntype MultiProfileAuth = {\n profiles: Record<string, StoredAuth>;\n default: string;\n};\n\n/** Legacy flat format (single profile) */\ntype LegacyAuth = StoredAuth;\n\nconst AUTH_DIR = path.join(os.homedir(), '.config', 'canary-cli');\nconst AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\n\n/* ── Shared argv helpers ─────────────────────────────────────────────── */\n\nexport function getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1 || index >= argv.length - 1) return undefined;\n return argv[index + 1];\n}\n\nexport function hasFlag(argv: string[], ...flags: string[]): boolean {\n return flags.some((flag) => argv.includes(flag));\n}\n\n/* ── Environment / profile mapping ───────────────────────────────────── */\n\n/** Map --env values to profile names for multi-profile auth storage */\nexport function envToProfile(env: string): string {\n if (env === 'prod' || env === 'production') return 'production';\n if (env === 'dev') return 'dev';\n if (env === 'local') return 'local';\n return env;\n}\n\nconst VALID_ENVS = ['prod', 'dev', 'local'];\n\n/** Environment URL mappings shared across CLI commands */\nexport const ENV_URLS: Record<string, { api: string; app: string }> = {\n prod: {\n api: 'https://api.trycanary.ai',\n app: 'https://app.trycanary.ai',\n },\n production: {\n api: 'https://api.trycanary.ai',\n app: 'https://app.trycanary.ai',\n },\n dev: {\n api: 'https://api.dev.trycanary.ai',\n app: 'https://app.dev.trycanary.ai',\n },\n local: {\n api: 'http://localhost:3000',\n app: 'http://localhost:5173',\n },\n};\n\n/** Derive the web-app URL that corresponds to a given API URL. */\nexport function resolveAppUrl(apiUrl: string): string {\n for (const env of Object.values(ENV_URLS)) {\n if (env.api === apiUrl) return env.app;\n }\n // Fallback for custom API URLs: replace \"api.\" at protocol boundary or \"/api\" path\n return apiUrl.replace(/(:\\/\\/)api\\./, '$1app.').replace(/:3000\\b/, ':5173');\n}\n\nfunction isMultiProfile(data: unknown): data is MultiProfileAuth {\n return typeof data === 'object' && data !== null && 'profiles' in data;\n}\n\n/** Read the raw auth file and normalize to multi-profile format */\nasync function readAuthFile(): Promise<MultiProfileAuth | null> {\n try {\n const content = await fs.readFile(AUTH_FILE, 'utf8');\n const data = JSON.parse(content) as unknown;\n\n if (isMultiProfile(data)) {\n return data;\n }\n\n // Legacy flat format — treat as the \"default\" profile\n const legacy = data as LegacyAuth;\n return {\n profiles: { default: legacy },\n default: 'default',\n };\n } catch {\n return null;\n }\n}\n\nexport async function readStoredAuth(profile?: string): Promise<StoredAuth | null> {\n const auth = await readAuthFile();\n if (!auth) return null;\n\n const key = profile ?? auth.default;\n return auth.profiles[key] ?? null;\n}\n\nexport async function readStoredToken(profile?: string): Promise<string | null> {\n const auth = await readStoredAuth(profile);\n return auth?.token ?? null;\n}\n\nexport async function readStoredApiUrl(profile?: string): Promise<string | null> {\n const auth = await readStoredAuth(profile);\n return auth?.apiUrl ?? null;\n}\n\n/** Return all stored tokens across every profile */\nexport async function readAllStoredTokens(): Promise<string[]> {\n const auth = await readAuthFile();\n if (!auth) return [];\n return Object.values(auth.profiles)\n .map((p) => p.token)\n .filter((t): t is string => !!t);\n}\n\nexport async function saveAuth(auth: StoredAuth, profile?: string): Promise<string> {\n await fs.mkdir(AUTH_DIR, { recursive: true, mode: 0o700 });\n\n // Read existing file (may be legacy or multi-profile)\n let existing: MultiProfileAuth;\n try {\n const content = await fs.readFile(AUTH_FILE, 'utf8');\n const data = JSON.parse(content) as unknown;\n\n if (isMultiProfile(data)) {\n existing = data;\n } else {\n // Migrate legacy flat format into profiles.default\n existing = {\n profiles: { default: data as LegacyAuth },\n default: 'default',\n };\n }\n } catch {\n existing = { profiles: {}, default: 'default' };\n }\n\n const key = profile ?? 'default';\n existing.profiles[key] = auth;\n\n // Set default to this profile if no default exists yet\n if (!existing.profiles[existing.default]) {\n existing.default = key;\n }\n\n await fs.writeFile(AUTH_FILE, JSON.stringify(existing, null, 2), {\n encoding: 'utf8',\n mode: 0o600,\n });\n return AUTH_FILE;\n}\n\n/* ── Shared config resolution ────────────────────────────────────────── */\n\ntype ResolvedConfig = { apiUrl: string; token: string };\n\nasync function resolveConfigInternal(\n argv: string[],\n opts: { required: boolean }\n): Promise<ResolvedConfig | null> {\n const env = getArgValue(argv, '--env');\n const profile = env ? envToProfile(env) : undefined;\n\n if (env && !ENV_URLS[env]) {\n if (opts.required) {\n console.error(`Unknown environment: ${env}`);\n console.error(`Valid environments: ${VALID_ENVS.join(', ')}`);\n process.exit(1);\n }\n return null;\n }\n\n const storedApiUrl = await readStoredApiUrl(profile);\n const apiUrl =\n getArgValue(argv, '--api-url') ??\n (env ? ENV_URLS[env].api : undefined) ??\n readBrandEnv('CANARY_API_URL') ??\n storedApiUrl ??\n 'https://api.trycanary.ai';\n\n const explicitToken = getArgValue(argv, '--token');\n\n let token: string | null;\n if (explicitToken) {\n token = explicitToken;\n } else if (profile) {\n token = (await readStoredToken(profile)) ?? readBrandEnv('CANARY_API_TOKEN') ?? null;\n if (!token && opts.required) {\n console.error(`Error: No token found for \"${env}\" profile.`);\n console.error(`Run: canary login --env ${env}`);\n process.exit(1);\n }\n } else {\n token = readBrandEnv('CANARY_API_TOKEN') ?? (await readStoredToken()) ?? null;\n if (!token && opts.required) {\n console.error('Error: No API token found.');\n console.error('Run: canary login');\n process.exit(1);\n }\n }\n\n return token ? { apiUrl, token } : null;\n}\n\n/**\n * Resolve API URL and auth token from argv flags, env vars, and stored profiles.\n * Used by knobs, feature-flag, release, and debug-session commands.\n */\nexport async function resolveConfig(argv: string[]): Promise<ResolvedConfig> {\n return (await resolveConfigInternal(argv, { required: true }))!;\n}\n\nexport async function resolveOptionalConfig(argv: string[]): Promise<ResolvedConfig | null> {\n return resolveConfigInternal(argv, { required: false });\n}\n\n/**\n * Where the effective auth token would come from for this invocation:\n * - `flag` — explicit `--token`\n * - `env` — CANARY_API_TOKEN / COFACTOR_API_TOKEN\n * - `stored` — an interactive `canary login` session in auth.json\n * - `none` — no token resolvable\n *\n * Mirrors the precedence in `resolveConfigInternal` exactly (which differs by\n * whether a profile is selected). `stored` is the only \"logged in interactively\"\n * source; `flag`/`env` are API-key style auth used by CI/automation.\n */\nexport async function resolveAuthSource(\n argv: string[]\n): Promise<'flag' | 'env' | 'stored' | 'none'> {\n const env = getArgValue(argv, '--env');\n if (env && !ENV_URLS[env]) return 'none';\n const profile = env ? envToProfile(env) : undefined;\n\n if (getArgValue(argv, '--token')) return 'flag';\n\n if (profile) {\n // With a profile, stored auth wins over the env var.\n if (await readStoredToken(profile)) return 'stored';\n if (readBrandEnv('CANARY_API_TOKEN')) return 'env';\n return 'none';\n }\n\n // Without a profile, the env var wins over stored auth.\n if (readBrandEnv('CANARY_API_TOKEN')) return 'env';\n if (await readStoredToken()) return 'stored';\n return 'none';\n}\n"],"mappings":"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","names":[]}
@@ -3,16 +3,16 @@ import {
3
3
  apiRequest,
4
4
  fetchProperties,
5
5
  getApplicationArg
6
- } from "./chunk-UAJUZLDE.js";
6
+ } from "./chunk-PVWG3V62.js";
7
7
  import {
8
8
  apiFetch,
9
9
  exitOnFailure
10
- } from "./chunk-3CZU7XCS.js";
10
+ } from "./chunk-PWZ4ULCB.js";
11
11
  import {
12
12
  getArgValue,
13
13
  hasFlag,
14
14
  resolveConfig
15
- } from "./chunk-IGHDIWZU.js";
15
+ } from "./chunk-VYTIJ6HJ.js";
16
16
  import "./chunk-32P26BZT.js";
17
17
  import "./chunk-JWHYXEA2.js";
18
18
  import "./chunk-GZVCNYR4.js";
@@ -451,4 +451,4 @@ async function runCredential(argv) {
451
451
  export {
452
452
  runCredential
453
453
  };
454
- //# sourceMappingURL=credential-X6QKX473.js.map
454
+ //# sourceMappingURL=credential-WOATCWOU.js.map
@@ -3,13 +3,13 @@ import {
3
3
  apiRequest,
4
4
  fetchProperties,
5
5
  getApplicationArg
6
- } from "./chunk-UAJUZLDE.js";
7
- import "./chunk-3CZU7XCS.js";
6
+ } from "./chunk-PVWG3V62.js";
7
+ import "./chunk-PWZ4ULCB.js";
8
8
  import {
9
9
  getArgValue,
10
10
  hasFlag,
11
11
  resolveConfig
12
- } from "./chunk-IGHDIWZU.js";
12
+ } from "./chunk-VYTIJ6HJ.js";
13
13
  import "./chunk-32P26BZT.js";
14
14
  import "./chunk-JWHYXEA2.js";
15
15
  import "./chunk-GZVCNYR4.js";
@@ -290,4 +290,4 @@ async function runCredentialTemplate(argv) {
290
290
  export {
291
291
  runCredentialTemplate
292
292
  };
293
- //# sourceMappingURL=credential-template-GD3D4MBI.js.map
293
+ //# sourceMappingURL=credential-template-Q3DQE2AH.js.map
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  downloadStorageState
4
- } from "./chunk-UAJUZLDE.js";
5
- import "./chunk-3CZU7XCS.js";
4
+ } from "./chunk-PVWG3V62.js";
5
+ import "./chunk-PWZ4ULCB.js";
6
6
  import {
7
7
  acquireCloudLock,
8
8
  createSessionWithRelay,
@@ -13,7 +13,7 @@ import {
13
13
  getArgValue,
14
14
  hasFlag,
15
15
  resolveConfig
16
- } from "./chunk-IGHDIWZU.js";
16
+ } from "./chunk-VYTIJ6HJ.js";
17
17
  import "./chunk-32P26BZT.js";
18
18
  import "./chunk-JWHYXEA2.js";
19
19
  import "./chunk-GZVCNYR4.js";
@@ -257,4 +257,4 @@ async function runDebugWorkflow(argv) {
257
257
  export {
258
258
  runDebugWorkflow
259
259
  };
260
- //# sourceMappingURL=debug-workflow-AAEOAME2.js.map
260
+ //# sourceMappingURL=debug-workflow-ZNP5XZQF.js.map
@@ -3,8 +3,12 @@ import {
3
3
  BROWSER_LIFECYCLE_TOOLS,
4
4
  BrowserToolExecutor,
5
5
  CdpScreencastManager,
6
+ CpuOffloadPool,
7
+ CpuOffloadTimeoutError,
8
+ CpuOffloadWorkerError,
6
9
  CursorOverlay,
7
10
  DEFAULTS,
11
+ DEFAULT_CPU_OFFLOAD_TIMEOUT_MS,
8
12
  DEFAULT_VIEWPORT,
9
13
  FfmpegProcess,
10
14
  LARGE_GRID_CHAR_THRESHOLD,
@@ -34,9 +38,11 @@ import {
34
38
  compareEditingContexts,
35
39
  compareSnapshots,
36
40
  computeFingerprint,
41
+ configureCpuOffload,
37
42
  consoleLogger,
38
43
  cropImage,
39
44
  decodeV2Value,
45
+ defaultCpuOffloadSize,
40
46
  detectGrid,
41
47
  detectModal,
42
48
  detectModalFromYaml,
@@ -82,6 +88,7 @@ import {
82
88
  formatGridRow,
83
89
  formatSemanticDiff,
84
90
  formatSemanticSnapshot,
91
+ formatSnapshotMaybeOffloaded,
85
92
  getBrowserToolDefinitions,
86
93
  getBrowserToolDefinitionsWithLifecycle,
87
94
  getConsolidatedBrowserToolDefinitions,
@@ -92,6 +99,7 @@ import {
92
99
  hashFingerprint,
93
100
  highlightElement,
94
101
  identifyLargeGridRefs,
102
+ isCpuOffloadEnabled,
95
103
  isFfmpegAvailable,
96
104
  isMCPContentWithImages,
97
105
  isStableElement,
@@ -107,17 +115,19 @@ import {
107
115
  populateSearchContext,
108
116
  reconcileCellColumn,
109
117
  renderIfTimeout,
118
+ resolveCpuOffloadWorkerPath,
110
119
  restoreIndexedDB,
111
120
  searchElements,
112
121
  setCdpScreencastLogger,
113
122
  setPdfExtractLogger,
114
123
  setSnapshotAnalyzerLogger,
124
+ shutdownCpuOffload,
115
125
  sortMatchesByContext,
116
126
  withBrowserLaunchRetry,
117
127
  withRecoveryNotice,
118
128
  withRecoveryNoticeMCP,
119
129
  withToolTimeout
120
- } from "./chunk-AI3Y3AZH.js";
130
+ } from "./chunk-7OO3RJYR.js";
121
131
  import "./chunk-JWHYXEA2.js";
122
132
  import "./chunk-GZVCNYR4.js";
123
133
  import "./chunk-6LEZCKKV.js";
@@ -126,8 +136,12 @@ export {
126
136
  BROWSER_LIFECYCLE_TOOLS,
127
137
  BrowserToolExecutor,
128
138
  CdpScreencastManager,
139
+ CpuOffloadPool,
140
+ CpuOffloadTimeoutError,
141
+ CpuOffloadWorkerError,
129
142
  CursorOverlay,
130
143
  DEFAULTS,
144
+ DEFAULT_CPU_OFFLOAD_TIMEOUT_MS,
131
145
  DEFAULT_VIEWPORT,
132
146
  FfmpegProcess,
133
147
  LARGE_GRID_CHAR_THRESHOLD,
@@ -158,9 +172,11 @@ export {
158
172
  compareEditingContexts,
159
173
  compareSnapshots,
160
174
  computeFingerprint,
175
+ configureCpuOffload,
161
176
  consoleLogger,
162
177
  cropImage,
163
178
  decodeV2Value,
179
+ defaultCpuOffloadSize,
164
180
  detectGrid,
165
181
  detectModal,
166
182
  detectModalFromYaml,
@@ -206,6 +222,7 @@ export {
206
222
  formatGridRow,
207
223
  formatSemanticDiff,
208
224
  formatSemanticSnapshot,
225
+ formatSnapshotMaybeOffloaded,
209
226
  getBrowserToolDefinitions,
210
227
  getBrowserToolDefinitionsWithLifecycle,
211
228
  getConsolidatedBrowserToolDefinitions,
@@ -216,6 +233,7 @@ export {
216
233
  hashFingerprint,
217
234
  highlightElement,
218
235
  identifyLargeGridRefs,
236
+ isCpuOffloadEnabled,
219
237
  isFfmpegAvailable,
220
238
  isMCPContentWithImages,
221
239
  isStableElement,
@@ -231,15 +249,17 @@ export {
231
249
  populateSearchContext,
232
250
  reconcileCellColumn,
233
251
  renderIfTimeout,
252
+ resolveCpuOffloadWorkerPath,
234
253
  restoreIndexedDB,
235
254
  searchElements,
236
255
  setCdpScreencastLogger,
237
256
  setPdfExtractLogger,
238
257
  setSnapshotAnalyzerLogger,
258
+ shutdownCpuOffload,
239
259
  sortMatchesByContext,
240
260
  withBrowserLaunchRetry,
241
261
  withRecoveryNotice,
242
262
  withRecoveryNoticeMCP,
243
263
  withToolTimeout
244
264
  };
245
- //# sourceMappingURL=dist-QLTVBUMD.js.map
265
+ //# sourceMappingURL=dist-4COOAKY3.js.map
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  apiRequest
4
- } from "./chunk-UAJUZLDE.js";
5
- import "./chunk-3CZU7XCS.js";
4
+ } from "./chunk-PVWG3V62.js";
5
+ import "./chunk-PWZ4ULCB.js";
6
6
  import {
7
7
  getArgValue,
8
8
  hasFlag,
9
9
  resolveConfig
10
- } from "./chunk-IGHDIWZU.js";
10
+ } from "./chunk-VYTIJ6HJ.js";
11
11
  import "./chunk-32P26BZT.js";
12
12
  import {
13
13
  getSubDir
@@ -448,4 +448,4 @@ async function runDocs(argv) {
448
448
  export {
449
449
  runDocs
450
450
  };
451
- //# sourceMappingURL=docs-BVUEXBY3.js.map
451
+ //# sourceMappingURL=docs-XVU4LA7G.js.map
@@ -2,13 +2,13 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
2
2
  import {
3
3
  apiFetch,
4
4
  decodeJwtPayload
5
- } from "./chunk-3CZU7XCS.js";
5
+ } from "./chunk-PWZ4ULCB.js";
6
6
  import {
7
7
  ENV_URLS,
8
8
  envToProfile,
9
9
  getArgValue,
10
10
  readStoredAuth
11
- } from "./chunk-IGHDIWZU.js";
11
+ } from "./chunk-VYTIJ6HJ.js";
12
12
  import {
13
13
  readBrandEnv
14
14
  } from "./chunk-32P26BZT.js";
@@ -133,4 +133,4 @@ async function runAuthDoctor(argv) {
133
133
  export {
134
134
  runAuthDoctor
135
135
  };
136
- //# sourceMappingURL=doctor-RHMKD4W5.js.map
136
+ //# sourceMappingURL=doctor-PGNHD3TI.js.map
@@ -2,13 +2,13 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
2
2
  import {
3
3
  apiRequest,
4
4
  fetchProperties
5
- } from "./chunk-UAJUZLDE.js";
6
- import "./chunk-3CZU7XCS.js";
5
+ } from "./chunk-PVWG3V62.js";
6
+ import "./chunk-PWZ4ULCB.js";
7
7
  import {
8
8
  getArgValue,
9
9
  hasFlag,
10
10
  resolveConfig
11
- } from "./chunk-IGHDIWZU.js";
11
+ } from "./chunk-VYTIJ6HJ.js";
12
12
  import "./chunk-32P26BZT.js";
13
13
  import "./chunk-JWHYXEA2.js";
14
14
  import "./chunk-GZVCNYR4.js";
@@ -218,4 +218,4 @@ async function runEnvironment(argv) {
218
218
  export {
219
219
  runEnvironment
220
220
  };
221
- //# sourceMappingURL=environment-WE7VVE6I.js.map
221
+ //# sourceMappingURL=environment-MRDNWU47.js.map
@@ -4,13 +4,13 @@ import {
4
4
  fetchList,
5
5
  parseLifecycleStage,
6
6
  toLifecycleLabel
7
- } from "./chunk-UAJUZLDE.js";
8
- import "./chunk-3CZU7XCS.js";
7
+ } from "./chunk-PVWG3V62.js";
8
+ import "./chunk-PWZ4ULCB.js";
9
9
  import {
10
10
  getArgValue,
11
11
  hasFlag,
12
12
  resolveConfig
13
- } from "./chunk-IGHDIWZU.js";
13
+ } from "./chunk-VYTIJ6HJ.js";
14
14
  import "./chunk-32P26BZT.js";
15
15
  import "./chunk-JWHYXEA2.js";
16
16
  import "./chunk-GZVCNYR4.js";
@@ -429,4 +429,4 @@ async function runFeatureFlag(argv) {
429
429
  export {
430
430
  runFeatureFlag
431
431
  };
432
- //# sourceMappingURL=feature-flag-VJO2TJFT.js.map
432
+ //# sourceMappingURL=feature-flag-D3DQZ6DX.js.map
package/dist/index.js CHANGED
@@ -1,16 +1,17 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  runRemoteTest
4
- } from "./chunk-LFFWD5JZ.js";
5
- import "./chunk-DT2CEH2V.js";
6
- import "./chunk-UAJUZLDE.js";
4
+ } from "./chunk-IHCPMYKU.js";
5
+ import "./chunk-VHVOTGBQ.js";
6
+ import "./chunk-PVWG3V62.js";
7
7
  import {
8
+ debug,
8
9
  fetchOrExit,
9
10
  isSuperadminToken
10
- } from "./chunk-3CZU7XCS.js";
11
+ } from "./chunk-PWZ4ULCB.js";
11
12
  import {
12
13
  runLogin
13
- } from "./chunk-G5SXUXSU.js";
14
+ } from "./chunk-H7ZML5QL.js";
14
15
  import {
15
16
  checkForUpdate
16
17
  } from "./chunk-AQPJQ5AE.js";
@@ -20,9 +21,10 @@ import {
20
21
  hasFlag,
21
22
  readAllStoredTokens,
22
23
  readStoredAuth,
24
+ resolveAuthSource,
23
25
  resolveConfig,
24
26
  resolveOptionalConfig
25
- } from "./chunk-IGHDIWZU.js";
27
+ } from "./chunk-VYTIJ6HJ.js";
26
28
  import {
27
29
  installConsoleBranding,
28
30
  readBrandEnv,
@@ -444,8 +446,7 @@ async function createCliUserEventRecorder(argv, cliVersion) {
444
446
  origin: "cli",
445
447
  onError: (error) => {
446
448
  const message = error instanceof Error ? error.message : String(error);
447
- process3.stderr.write(`[canary] user event tracking skipped: ${message}
448
- `);
449
+ debug(`user event tracking skipped: ${message}`);
449
450
  }
450
451
  }),
451
452
  metadata: buildBaseMetadata(argv, cliVersion, config.apiUrl)
@@ -476,11 +477,11 @@ async function recordCliInstrumentationFailure(argv, cliVersion, stage, error) {
476
477
  }
477
478
 
478
479
  // src/index.ts
479
- var loadMcp = () => import("./mcp-GC2WOOZO.js").then((m) => m.runMcp);
480
- var loadDebugWorkflow = () => import("./debug-workflow-AAEOAME2.js").then((m) => m.runDebugWorkflow);
481
- var loadRecord = () => import("./record-HL4QA7OX.js").then((m) => m.runRecord);
482
- var loadSession = () => import("./session-X6IYGWYG.js").then((m) => m.runSession);
483
- var loadLocal = () => import("./local-CMAY54I5.js").then((m) => m.runLocal);
480
+ var loadMcp = () => import("./mcp-57VVZTXM.js").then((m) => m.runMcp);
481
+ var loadDebugWorkflow = () => import("./debug-workflow-ZNP5XZQF.js").then((m) => m.runDebugWorkflow);
482
+ var loadRecord = () => import("./record-RWVGZZSW.js").then((m) => m.runRecord);
483
+ var loadSession = () => import("./session-GDCMTNB3.js").then((m) => m.runSession);
484
+ var loadLocal = () => import("./local-NSKOZHHA.js").then((m) => m.runLocal);
484
485
  function printVersion() {
485
486
  console.log(`canary v${version}`);
486
487
  }
@@ -804,7 +805,7 @@ async function executeCommand(command, rest) {
804
805
  return;
805
806
  }
806
807
  if (command === "install") {
807
- const { runInstall } = await import("./install-CQLHNZ6U.js");
808
+ const { runInstall } = await import("./install-DMEFGQHD.js");
808
809
  await runInstall(rest);
809
810
  return;
810
811
  }
@@ -841,79 +842,79 @@ async function executeCommand(command, rest) {
841
842
  return;
842
843
  }
843
844
  if (command === "psql") {
844
- const { runPsql } = await import("./psql-XGLBI6T7.js");
845
+ const { runPsql } = await import("./psql-4JHPJ2CO.js");
845
846
  await runPsql(rest);
846
847
  return;
847
848
  }
848
849
  if (command === "redis") {
849
- const { runRedis } = await import("./redis-VJGCUJPV.js");
850
+ const { runRedis } = await import("./redis-N44ZZ6VB.js");
850
851
  await runRedis(rest);
851
852
  return;
852
853
  }
853
854
  if (command === "release") {
854
- const { runRelease } = await import("./release-2SMK5Y3V.js");
855
+ const { runRelease } = await import("./release-R7GKLEAI.js");
855
856
  await runRelease(rest);
856
857
  return;
857
858
  }
858
859
  if (command === "docs") {
859
- const { runDocs } = await import("./docs-BVUEXBY3.js");
860
+ const { runDocs } = await import("./docs-XVU4LA7G.js");
860
861
  await runDocs(rest);
861
862
  return;
862
863
  }
863
864
  if (command === "feature-flag") {
864
- const { runFeatureFlag } = await import("./feature-flag-VJO2TJFT.js");
865
+ const { runFeatureFlag } = await import("./feature-flag-D3DQZ6DX.js");
865
866
  await runFeatureFlag(rest);
866
867
  return;
867
868
  }
868
869
  if (command === "product") {
869
- const { runProduct } = await import("./product-BUJWPYKB.js");
870
+ const { runProduct } = await import("./product-WGOLTBRI.js");
870
871
  await runProduct(rest);
871
872
  return;
872
873
  }
873
874
  if (command === "metrics") {
874
- const { runMetrics } = await import("./metrics-IXICURAA.js");
875
+ const { runMetrics } = await import("./metrics-DM4YQQZN.js");
875
876
  await runMetrics(rest);
876
877
  return;
877
878
  }
878
879
  if (command === "account") {
879
- const { runAccount } = await import("./account-ZMV7NEFM.js");
880
+ const { runAccount } = await import("./account-ZSM2Q3RB.js");
880
881
  await runAccount(rest);
881
882
  return;
882
883
  }
883
884
  if (command === "scenarios" || command === "scenario") {
884
- const { runScenarios } = await import("./scenarios-DM5FDCAF.js");
885
+ const { runScenarios } = await import("./scenarios-WUUUKP2S.js");
885
886
  await runScenarios(rest);
886
887
  return;
887
888
  }
888
889
  if (command === "knobs") {
889
- const { runKnobs } = await import("./knobs-ETJAV6YM.js");
890
+ const { runKnobs } = await import("./knobs-NA6SPLHX.js");
890
891
  await runKnobs(rest);
891
892
  return;
892
893
  }
893
894
  if (command === "issues") {
894
- const { runIssues } = await import("./issues-HK2JA5JS.js");
895
+ const { runIssues } = await import("./issues-E4YQ4DVC.js");
895
896
  await runIssues(rest);
896
897
  return;
897
898
  }
898
899
  if (command === "credential") {
899
- const { runCredential } = await import("./credential-X6QKX473.js");
900
+ const { runCredential } = await import("./credential-WOATCWOU.js");
900
901
  await runCredential(rest);
901
902
  return;
902
903
  }
903
904
  if (command === "persona" || command === "personas" || // Backwards-compat aliases for the former "credential template" name.
904
905
  command === "credential-template" || command === "credential-templates") {
905
- const { runCredentialTemplate } = await import("./credential-template-GD3D4MBI.js");
906
+ const { runCredentialTemplate } = await import("./credential-template-Q3DQE2AH.js");
906
907
  await runCredentialTemplate(rest);
907
908
  return;
908
909
  }
909
910
  if (command === "workflow") {
910
- const { runWorkflow } = await import("./workflow-DC7WOTTW.js");
911
+ const { runWorkflow } = await import("./workflow-5BFRS4CE.js");
911
912
  await runWorkflow(rest);
912
913
  return;
913
914
  }
914
915
  if (command === "spec") {
915
- const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
916
- const { handleSpec } = await import("./spec-KO5QD6AY.js");
916
+ const { resolveConfig: resolveConfig2 } = await import("./auth-OYF5A4BY.js");
917
+ const { handleSpec } = await import("./spec-ESPA3H26.js");
917
918
  const wantsAuth = rest[0] === "compile" || rest[0] === "pull" || rest[0] === "diff";
918
919
  if (wantsAuth) {
919
920
  const { apiUrl, token } = await resolveConfig2(rest);
@@ -924,8 +925,8 @@ async function executeCommand(command, rest) {
924
925
  return;
925
926
  }
926
927
  if (command === "augmentor" || command === "augmentors") {
927
- const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
928
- const { runAugmentor } = await import("./augmentor-7T3L6ZR4.js");
928
+ const { resolveConfig: resolveConfig2 } = await import("./auth-OYF5A4BY.js");
929
+ const { runAugmentor } = await import("./augmentor-LSJLMJYP.js");
929
930
  if (rest[0] === void 0 || rest[0] === "help" || rest[0] === "--help") {
930
931
  await runAugmentor(rest, "", "");
931
932
  } else {
@@ -935,71 +936,71 @@ async function executeCommand(command, rest) {
935
936
  return;
936
937
  }
937
938
  if (command === "api-catalog") {
938
- const { resolveConfig: resolveConfig2 } = await import("./auth-DURHUZDW.js");
939
- const { runApiCatalog } = await import("./api-catalog-6HNOGVPA.js");
939
+ const { resolveConfig: resolveConfig2 } = await import("./auth-OYF5A4BY.js");
940
+ const { runApiCatalog } = await import("./api-catalog-MMPFWS52.js");
940
941
  const { apiUrl, token } = await resolveConfig2(rest);
941
942
  await runApiCatalog(rest, apiUrl, token);
942
943
  return;
943
944
  }
944
945
  if (command === "skill" || command === "skills") {
945
- const { runSkill } = await import("./skill-ZU5V2EE5.js");
946
+ const { runSkill } = await import("./skill-3SP7MAA4.js");
946
947
  await runSkill(rest);
947
948
  return;
948
949
  }
949
950
  if (command === "task") {
950
- const { runTask } = await import("./task-V3JMSJIM.js");
951
+ const { runTask } = await import("./task-PRR75HI4.js");
951
952
  await runTask(rest);
952
953
  return;
953
954
  }
954
955
  if (command === "test-suite") {
955
- const { runTestSuite } = await import("./test-suite-NOYVK6YX.js");
956
+ const { runTestSuite } = await import("./test-suite-O3UY7EER.js");
956
957
  await runTestSuite(rest);
957
958
  return;
958
959
  }
959
960
  if (command === "triage") {
960
- const { runTriage } = await import("./triage-4RFATHBE.js");
961
+ const { runTriage } = await import("./triage-2BKUBMMX.js");
961
962
  await runTriage(rest);
962
963
  return;
963
964
  }
964
965
  if (command === "application" || command === "applications" || command === "property" || command === "properties") {
965
- const { runProperty } = await import("./property-4EXPWRNT.js");
966
+ const { runProperty } = await import("./property-B7QMGLVW.js");
966
967
  await runProperty(rest);
967
968
  return;
968
969
  }
969
970
  if (command === "environment" || command === "env") {
970
- const { runEnvironment } = await import("./environment-WE7VVE6I.js");
971
+ const { runEnvironment } = await import("./environment-MRDNWU47.js");
971
972
  await runEnvironment(rest);
972
973
  return;
973
974
  }
974
975
  if (command === "sandbox") {
975
- const { runSandbox } = await import("./sandbox-ORAPKOH3.js");
976
+ const { runSandbox } = await import("./sandbox-6D54ZQCG.js");
976
977
  await runSandbox(rest);
977
978
  return;
978
979
  }
979
980
  if (command === "attachment" || command === "attachments") {
980
- const { runAttachment } = await import("./attachment-QAHR54HQ.js");
981
+ const { runAttachment } = await import("./attachment-NSYL5X3S.js");
981
982
  await runAttachment(rest);
982
983
  return;
983
984
  }
984
985
  if (command === "utilities") {
985
- const { runUtilities } = await import("./utilities-3WMXE743.js");
986
+ const { runUtilities } = await import("./utilities-O3OO64T5.js");
986
987
  await runUtilities(rest);
987
988
  return;
988
989
  }
989
990
  if (command === "tag" || command === "tags") {
990
- const { runTag } = await import("./tag-R5I72HJ6.js");
991
+ const { runTag } = await import("./tag-DAGHQZAR.js");
991
992
  await runTag(rest);
992
993
  return;
993
994
  }
994
995
  if (command === "trace") {
995
- const { runTrace } = await import("./trace-NOYEKNO4.js");
996
+ const { runTrace } = await import("./trace-7LRHSPWN.js");
996
997
  await runTrace(rest);
997
998
  return;
998
999
  }
999
1000
  if (command === "auth") {
1000
1001
  const sub = rest[0];
1001
1002
  if (sub === "doctor") {
1002
- const { runAuthDoctor } = await import("./doctor-RHMKD4W5.js");
1003
+ const { runAuthDoctor } = await import("./doctor-PGNHD3TI.js");
1003
1004
  await runAuthDoctor(rest.slice(1));
1004
1005
  return;
1005
1006
  }
@@ -1033,8 +1034,10 @@ async function main(argv) {
1033
1034
  printVersion();
1034
1035
  return;
1035
1036
  }
1036
- if (command && COMMANDS_WITH_UPDATE_CHECK.has(command)) {
1037
- await checkForUpdate(version);
1037
+ if (command && COMMANDS_WITH_UPDATE_CHECK.has(command) && !wantsMachineOutput) {
1038
+ if (await resolveAuthSource(argv) === "stored") {
1039
+ await checkForUpdate(version);
1040
+ }
1038
1041
  }
1039
1042
  let tracking = null;
1040
1043
  try {