@teambit/ripple 0.0.257 → 0.0.258

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.
@@ -1,6 +1,6 @@
1
1
  import type { Command, CommandOptions } from '@teambit/cli';
2
2
  import type { LastExportData } from '@teambit/export';
3
- import type { RippleMain, RippleJob, CiGraphNode } from './ripple.main.runtime';
3
+ import type { RippleMain, RippleJob, CiGraphNode, SimulateNetwork } from './ripple.main.runtime';
4
4
  export declare class RippleCmd implements Command {
5
5
  name: string;
6
6
  description: string;
@@ -170,3 +170,33 @@ export declare class RippleStopCmd implements Command {
170
170
  job: RippleJob | null;
171
171
  }>;
172
172
  }
173
+ type SimulateFlags = {
174
+ lane?: string;
175
+ scopes?: string;
176
+ owners?: string;
177
+ excludeScopes?: string;
178
+ };
179
+ export declare class RippleSimulateCmd implements Command {
180
+ private ripple;
181
+ name: string;
182
+ description: string;
183
+ extendedDescription: string;
184
+ skipWorkspace: boolean;
185
+ remoteOp: boolean;
186
+ alias: string;
187
+ options: CommandOptions;
188
+ constructor(ripple: RippleMain);
189
+ report(_args: [], flags: SimulateFlags): Promise<string>;
190
+ json(_args: [], flags: SimulateFlags): Promise<{
191
+ laneId: string;
192
+ job: RippleJob;
193
+ network: SimulateNetwork;
194
+ url: string;
195
+ }>;
196
+ /**
197
+ * the lane to simulate: `--lane` when given (validated and normalized), otherwise the current lane.
198
+ */
199
+ private resolveLaneId;
200
+ private simulate;
201
+ }
202
+ export {};
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RippleStopCmd = exports.RippleRetryCmd = exports.RippleLogCmd = exports.RippleListCmd = exports.RippleErrorsCmd = exports.RippleCmd = void 0;
6
+ exports.RippleStopCmd = exports.RippleSimulateCmd = exports.RippleRetryCmd = exports.RippleLogCmd = exports.RippleListCmd = exports.RippleErrorsCmd = exports.RippleCmd = void 0;
7
7
  function _chalk() {
8
8
  const data = _interopRequireDefault(require("chalk"));
9
9
  _chalk = function () {
@@ -18,6 +18,27 @@ function _cliTable() {
18
18
  };
19
19
  return data;
20
20
  }
21
+ function _cli() {
22
+ const data = require("@teambit/cli");
23
+ _cli = function () {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _bitError() {
29
+ const data = require("@teambit/bit-error");
30
+ _bitError = function () {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _laneId() {
36
+ const data = require("@teambit/lane-id");
37
+ _laneId = function () {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
21
42
  function _rippleUtils() {
22
43
  const data = require("./ripple-utils");
23
44
  _rippleUtils = function () {
@@ -115,7 +136,7 @@ class RippleListCmd {
115
136
  }
116
137
  });
117
138
  for (const job of jobs) {
118
- table.push([job.id, truncate(job.name || '-', 40), getScopeFromLaneId(job.laneId), (0, _rippleUtils().colorPhase)(job.status?.phase), job.user?.username || '-', formatDate(job.status?.startedAt), formatDuration(job.status?.startedAt, job.status?.finishedAt)]);
139
+ table.push([job.id, truncate(job.name || '-', 40) + (job.simulation ? (0, _cli().formatHint)(' (simulation)') : ''), getScopeFromLaneId(job.laneId), (0, _rippleUtils().colorPhase)(job.status?.phase), job.user?.username || '-', formatDate(job.status?.startedAt), formatDuration(job.status?.startedAt, job.status?.finishedAt)]);
119
140
  }
120
141
  const header = ownerUsed ? _chalk().default.gray(`showing jobs for owner "${ownerUsed}" (use --all for all jobs)`) : '';
121
142
  return [header, table.toString()].filter(Boolean).join('\n');
@@ -631,5 +652,117 @@ function truncate(str, max) {
631
652
  if (str.length <= max) return str;
632
653
  return `${str.substring(0, max - 1)}…`;
633
654
  }
655
+ function splitList(value) {
656
+ if (!value) return undefined;
657
+ const items = value.split(',').map(item => item.trim()).filter(Boolean);
658
+ return items.length ? items : undefined;
659
+ }
660
+ function describeNetwork(network) {
661
+ const parts = [network.scopeIds?.length ? `scopes ${network.scopeIds.join(', ')}` : '', network.ownerIds?.length ? `owners ${network.ownerIds.join(', ')}` : '', network.excludeScopeIds?.length ? `excluding scopes ${network.excludeScopeIds.join(', ')}` : ''].filter(Boolean);
662
+ return parts.join('; ');
663
+ }
664
+ class RippleSimulateCmd {
665
+ constructor(ripple) {
666
+ this.ripple = ripple;
667
+ _defineProperty(this, "name", 'simulate');
668
+ _defineProperty(this, "description", 'start a Ripple CI simulation for a lane to reveal which dependents break (auto-detects current lane)');
669
+ _defineProperty(this, "extendedDescription", `a simulation builds the dependents of the lane components against the lane heads on bit.cloud,
670
+ without merging or publishing anything. it's the way to get dependent coverage for a change before the lane is merged.
671
+ the simulation runs against the lane as it exists on bit.cloud, so export the lane first.
672
+ simulations are heavy jobs and are billed as such. run them at review time, not on every change.
673
+ dependents are searched in the lane's own scope by default. widen or narrow the search with --scopes, --owners and
674
+ --exclude-scopes.
675
+ follow the job with "bit ripple log". once it finishes, "bit ripple errors" shows what broke. both take the job id
676
+ printed when the simulation starts.`);
677
+ _defineProperty(this, "skipWorkspace", true);
678
+ _defineProperty(this, "remoteOp", true);
679
+ _defineProperty(this, "alias", '');
680
+ _defineProperty(this, "options", [['', 'lane <lane>', 'lane ID to simulate, e.g. "scope/lane-name" (default: detected from .bitmap)'], ['', 'scopes <scopes>', 'comma-separated scopes to search for dependents in (default: the lane scope)'], ['', 'owners <owners>', 'comma-separated owners (organizations) to search for dependents in'], ['', 'exclude-scopes <scopes>', 'comma-separated scopes to exclude from the dependents search'], ['j', 'json', 'return the output as JSON']]);
681
+ }
682
+ async report(_args, flags) {
683
+ const {
684
+ laneId,
685
+ job,
686
+ network,
687
+ defaultedToLaneScope
688
+ } = await this.simulate(flags);
689
+ const networkNote = defaultedToLaneScope ? ' (default: the lane scope. use --scopes/--owners to widen)' : '';
690
+ const lines = [(0, _cli().formatSuccessSummary)(`started a Ripple CI simulation for lane "${laneId}".`), (0, _cli().formatItem)(`job id: ${job.id || '(not assigned yet)'}`), job.status?.phase ? (0, _cli().formatItem)(`status: ${(0, _rippleUtils().colorPhase)(job.status.phase)}`) : '', (0, _cli().formatItem)(`network: ${describeNetwork(network)}${networkNote}`), (0, _cli().formatItem)(`url: ${this.ripple.getJobUrl(job)}`)].filter(Boolean);
691
+ const hint = job.id ? (0, _cli().formatHint)(`follow the job with "bit ripple log ${job.id}". once it finishes, run "bit ripple errors ${job.id}" to see what broke.`) : (0, _cli().formatHint)(`run "bit ripple list --lane ${laneId}" to get the job id, then "bit ripple log <job-id>" to follow it.`);
692
+ return (0, _cli().joinSections)([lines.join('\n'), hint]);
693
+ }
694
+ async json(_args, flags) {
695
+ const {
696
+ laneId,
697
+ job,
698
+ network
699
+ } = await this.simulate(flags);
700
+ return {
701
+ laneId,
702
+ job,
703
+ network,
704
+ url: this.ripple.getJobUrl(job)
705
+ };
706
+ }
707
+
708
+ /**
709
+ * the lane to simulate: `--lane` when given (validated and normalized), otherwise the current lane.
710
+ */
711
+ resolveLaneId(flags) {
712
+ const currentLaneId = this.ripple.getCurrentLaneId();
713
+ if (!flags.lane) {
714
+ if (!currentLaneId) {
715
+ throw new (_bitError().BitError)('a simulation requires a lane. switch to a lane or pass --lane <scope/lane-name>');
716
+ }
717
+ return {
718
+ laneId: currentLaneId,
719
+ isCurrentLane: true
720
+ };
721
+ }
722
+ if (flags.lane === _laneId().DEFAULT_LANE) throw new (_bitError().BitError)(defaultLaneError(flags.lane));
723
+ let parsed;
724
+ try {
725
+ parsed = _laneId().LaneId.parse(flags.lane);
726
+ } catch (err) {
727
+ throw new (_bitError().BitError)(`invalid --lane "${flags.lane}", expected "scope/lane-name". ${err.message}`);
728
+ }
729
+ if (parsed.isDefault()) throw new (_bitError().BitError)(defaultLaneError(flags.lane));
730
+ const laneId = parsed.toString();
731
+ return {
732
+ laneId,
733
+ isCurrentLane: laneId === currentLaneId
734
+ };
735
+ }
736
+ async simulate(flags) {
737
+ const {
738
+ laneId,
739
+ isCurrentLane
740
+ } = this.resolveLaneId(flags);
741
+ if (isCurrentLane && this.ripple.isCurrentLaneExported() === false) {
742
+ throw new (_bitError().BitError)(`lane "${laneId}" was never exported. a simulation runs against the lane on bit.cloud, run "bit export" first`);
743
+ }
744
+ const network = {
745
+ scopeIds: splitList(flags.scopes),
746
+ ownerIds: splitList(flags.owners),
747
+ excludeScopeIds: splitList(flags.excludeScopes)
748
+ };
749
+ // Ripple CI can't resolve the dependents graph without a positive search base (scopes or owners),
750
+ // so search the lane's own scope by default. exclusions alone only narrow, they don't provide a base.
751
+ const defaultedToLaneScope = !network.scopeIds?.length && !network.ownerIds?.length;
752
+ if (defaultedToLaneScope) network.scopeIds = [_laneId().LaneId.parse(laneId).scope];
753
+ const job = await this.ripple.simulateLane(laneId, network);
754
+ if (!job) throw new (_bitError().BitError)(`failed to start a simulation for lane "${laneId}"`);
755
+ return {
756
+ laneId,
757
+ job,
758
+ network,
759
+ defaultedToLaneScope
760
+ };
761
+ }
762
+ }
763
+ exports.RippleSimulateCmd = RippleSimulateCmd;
764
+ function defaultLaneError(lane) {
765
+ return `"${lane}" is the default lane. a simulation needs a lane whose changes are tested against their dependents on main`;
766
+ }
634
767
 
635
768
  //# sourceMappingURL=ripple.cmd.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_cliTable","_rippleUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","lastExportMatchesTarget","last","targetLane","lastLaneStr","lane","scope","name","undefined","lastExportHeader","lastExport","job","age","formatAge","timestamp","target","phase","status","toUpperCase","chalk","green","isFailedPhase","red","gray","colorPhase","RippleCmd","constructor","report","code","exports","RippleListCmd","ripple","args","flags","jobs","ownerUsed","getFilteredJobs","length","hint","tip","yellow","table","Table","head","cyan","chars","top","bottom","left","mid","right","middle","style","push","id","truncate","getScopeFromLaneId","laneId","user","username","formatDate","startedAt","formatDuration","finishedAt","header","toString","filter","Boolean","join","json","requestedLimit","limit","parseInt","isFinite","Error","filters","all","owner","getDefaultOwner","owners","lanes","scopes","needsClientFilter","fetchLimit","Math","max","listJobs","userFilter","toLowerCase","j","includes","slice","RippleLogCmd","description","resolveJob","jobId","resolved","resolveJobId","error","source","getJob","lines","bold","displayName","Date","toLocaleString","jobUrl","getJobUrl","component","appendComponentDetail","appendComponentList","componentId","summary","getComponentBuildSummary","tasks","task","startTime","warnings","ciNodes","getCiGraphNodes","totalComponents","reduce","sum","n","componentIds","shown","node","compId","icon","componentBuild","RippleErrorsCmd","getErrors","getCurrentLaneId","failedNodes","succeededNodes","otherNodes","failedComponents","flatMap","blockedComponents","containerNames","map","containerName","logMap","getContainerLogs","compList","logMessages","get","errorLines","log","extractErrorsFromLog","msg","clean","stripAnsi","test","succeededCount","containerLogs","messages","getLastExport","rippleJobs","slug","getJobBySlug","found","findLatestJobForLane","RippleRetryCmd","allowedPhases","actionVerb","result","retryJob","RippleStopCmd","stopJob","dateStr","start","getTime","end","now","ms","seconds","floor","minutes","remainingSeconds","hours","remainingMinutes","split","str","substring"],"sources":["ripple.cmd.ts"],"sourcesContent":["import type { Command, CommandOptions } from '@teambit/cli';\nimport chalk from 'chalk';\nimport Table from 'cli-table';\nimport type { LastExportData } from '@teambit/export';\nimport type { RippleMain, RippleJob, CiGraphNode } from './ripple.main.runtime';\nimport { colorPhase, isFailedPhase, stripAnsi, resolveJobId, formatAge } from './ripple-utils';\n\n/**\n * a last-export entry matches the target context when its saved lane equals the current lane\n * (or both are undefined / \"main\"). this prevents using a stale last-export from a different lane\n * after the user has switched lanes.\n */\nfunction lastExportMatchesTarget(last: LastExportData, targetLane: string | undefined): boolean {\n const lastLaneStr = last.lane ? `${last.lane.scope}/${last.lane.name}` : undefined;\n return lastLaneStr === targetLane;\n}\n\nfunction lastExportHeader(lastExport: LastExportData, job: { status?: { phase?: string } }): string {\n const age = formatAge(lastExport.timestamp);\n const target = lastExport.lane ? `lane \"${lastExport.lane.scope}/${lastExport.lane.name}\"` : 'main';\n const phase = job.status?.phase?.toUpperCase();\n if (phase === 'SUCCESS') {\n return chalk.green(`✓ Your last export (${age}) to ${target} succeeded.`);\n }\n if (isFailedPhase(phase)) {\n return chalk.red(`✗ Your last export (${age}) to ${target} failed.`);\n }\n return chalk.gray(`Your last export (${age}) to ${target} — status: ${colorPhase(phase)}.`);\n}\n\nexport class RippleCmd implements Command {\n name = 'ripple <sub-command>';\n description = 'manage Ripple CI jobs on bit.cloud';\n extendedDescription = 'view, retry, and manage Ripple CI jobs that build your components in the cloud after export.';\n group = 'collaborate';\n skipWorkspace = true;\n remoteOp = true;\n\n options: CommandOptions = [];\n commands: Command[] = [];\n\n async report() {\n return { code: 1, data: '[ripple] please specify a subcommand. See --help for available commands.' };\n }\n}\n\nexport class RippleListCmd implements Command {\n name = 'list';\n description = 'list recent Ripple CI jobs (filtered by workspace owner by default)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'all', 'show jobs from all owners, not just the workspace owner'],\n ['o', 'owner <owner>', 'filter by organization (default: detected from workspace defaultScope)'],\n ['s', 'scope <scope>', 'filter by scope (e.g. \"teambit.cloud\")'],\n ['', 'lane <lane>', 'filter by lane ID (e.g. \"scope/lane-name\")'],\n ['u', 'user <user>', 'filter by username'],\n ['', 'status <status>', 'filter by status (e.g. SUCCESS, FAILURE, RUNNING)'],\n ['l', 'limit <limit>', 'max number of jobs to show (default: 20)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs, ownerUsed } = await this.getFilteredJobs(flags);\n\n if (!jobs || jobs.length === 0) {\n let hint = '';\n if (flags.lane) hint = ` for lane \"${flags.lane}\"`;\n else if (flags.scope) hint = ` for scope \"${flags.scope}\"`;\n else if (ownerUsed) hint = ` for owner \"${ownerUsed}\"`;\n const tip = ownerUsed ? ' Use --all to see jobs from all owners.' : '';\n return chalk.yellow(`No Ripple CI jobs found${hint}.${tip}`);\n }\n\n const table = new Table({\n head: [\n chalk.cyan('Job ID'),\n chalk.cyan('Name'),\n chalk.cyan('Scope'),\n chalk.cyan('Status'),\n chalk.cyan('User'),\n chalk.cyan('Started'),\n chalk.cyan('Duration'),\n ],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n\n for (const job of jobs) {\n table.push([\n job.id,\n truncate(job.name || '-', 40),\n getScopeFromLaneId(job.laneId),\n colorPhase(job.status?.phase),\n job.user?.username || '-',\n formatDate(job.status?.startedAt),\n formatDuration(job.status?.startedAt, job.status?.finishedAt),\n ]);\n }\n\n const header = ownerUsed ? chalk.gray(`showing jobs for owner \"${ownerUsed}\" (use --all for all jobs)`) : '';\n return [header, table.toString()].filter(Boolean).join('\\n');\n }\n\n async json(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs } = await this.getFilteredJobs(flags);\n return { jobs: jobs || [] };\n }\n\n private async getFilteredJobs(flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }): Promise<{ jobs: RippleJob[]; ownerUsed?: string }> {\n const requestedLimit = flags.limit ? parseInt(flags.limit, 10) : 20;\n if (!Number.isFinite(requestedLimit) || requestedLimit < 1) {\n throw new Error(`Invalid --limit value \"${flags.limit}\". Expected a positive integer.`);\n }\n\n // build server-side filters\n const filters: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string } = {};\n\n // determine owner for default filtering (skip when --lane or --scope is given explicitly)\n let ownerUsed: string | undefined;\n if (!flags.all && !flags.lane && !flags.scope) {\n ownerUsed = flags.owner || this.ripple.getDefaultOwner();\n } else if (flags.owner) {\n ownerUsed = flags.owner;\n }\n\n if (ownerUsed) filters.owners = [ownerUsed];\n if (flags.lane) filters.lanes = [flags.lane];\n if (flags.scope) filters.scopes = [flags.scope];\n if (flags.status) filters.status = flags.status.toUpperCase();\n\n // user filter is not supported server-side, so overfetch if needed\n const needsClientFilter = !!flags.user;\n const fetchLimit = needsClientFilter ? Math.max(requestedLimit * 5, 100) : requestedLimit;\n let jobs = await this.ripple.listJobs({ filters, limit: fetchLimit });\n\n // apply client-side filters for fields not supported by FilterOptions\n if (flags.user) {\n const userFilter = flags.user.toLowerCase();\n jobs = jobs.filter((j) => j.user?.username?.toLowerCase().includes(userFilter));\n }\n\n jobs = jobs.slice(0, requestedLimit);\n\n return { jobs, ownerUsed };\n }\n}\n\nexport class RippleLogCmd implements Command {\n name = 'log [job-id]';\n description =\n 'show job details and component build task summaries (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['c', 'component <component>', 'show build tasks for a specific component (full component ID)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n private async resolveJob(jobId: string | undefined, flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags);\n if ('error' in resolved) return { job: null, error: resolved.error, source: undefined, lastExport: undefined };\n // when resolved from last-export, the resolver already fetched the full job — reuse it\n const job = resolved.job ?? (await this.ripple.getJob(resolved.id));\n return { job, error: undefined, source: resolved.source, lastExport: resolved.lastExport };\n }\n\n async report([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, error, source, lastExport } = await this.resolveJob(jobId, flags);\n if (!job) {\n if (jobId) return chalk.red(`Job \"${jobId}\" not found.`);\n return chalk.red(error || 'Could not find a Ripple CI job.');\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold('Job Details'));\n lines.push(` ${chalk.cyan('ID:')} ${job.id}`);\n if (job.name) lines.push(` ${chalk.cyan('Name:')} ${job.name}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n if (job.user?.displayName)\n lines.push(` ${chalk.cyan('User:')} ${job.user.displayName} (${job.user.username})`);\n if (job.status?.startedAt)\n lines.push(` ${chalk.cyan('Started:')} ${new Date(job.status.startedAt).toLocaleString()}`);\n if (job.status?.finishedAt)\n lines.push(` ${chalk.cyan('Finished:')} ${new Date(job.status.finishedAt).toLocaleString()}`);\n const jobUrl = this.ripple.getJobUrl(job);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n\n if (flags.component) {\n await this.appendComponentDetail(lines, job.id, flags.component);\n } else {\n this.appendComponentList(lines, job);\n }\n\n return lines.join('\\n');\n }\n\n private async appendComponentDetail(lines: string[], jobId: string, componentId: string) {\n const summary = await this.ripple.getComponentBuildSummary(jobId, componentId);\n if (!summary) {\n lines.push('');\n lines.push(chalk.yellow(`No build summary found for component \"${componentId}\" in this job.`));\n return;\n }\n lines.push('');\n lines.push(chalk.bold(`Build Tasks for ${summary.name || componentId}`));\n if (!summary.tasks || summary.tasks.length === 0) {\n lines.push(chalk.gray(' No build tasks found.'));\n return;\n }\n const table = new Table({\n head: [chalk.cyan('Task'), chalk.cyan('Status'), chalk.cyan('Started'), chalk.cyan('Warnings')],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n for (const task of summary.tasks) {\n table.push([\n task.name || '-',\n colorPhase(task.status?.status),\n task.startTime ? new Date(task.startTime).toLocaleString() : '-',\n task.status?.warnings ? chalk.yellow(String(task.status.warnings)) : '0',\n ]);\n }\n lines.push(table.toString());\n }\n\n private appendComponentList(lines: string[], job: { ciGraph?: string }) {\n const ciNodes = this.ripple.getCiGraphNodes(job);\n if (ciNodes.length === 0) return;\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.bold(`Components (${totalComponents})`));\n lines.push(chalk.gray(' Use --component <id> to see build tasks for a specific component'));\n let shown = 0;\n for (const node of ciNodes) {\n if (shown >= 30) {\n lines.push(chalk.gray(` ... and ${totalComponents - shown} more`));\n break;\n }\n for (const compId of node.componentIds) {\n if (shown >= 30) break;\n const icon = isFailedPhase(node.phase)\n ? chalk.red('✗')\n : node.phase === 'SUCCESS'\n ? chalk.green('✓')\n : chalk.yellow('○');\n lines.push(` ${icon} ${compId}`);\n shown++;\n }\n }\n }\n\n async json([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, source, lastExport } = await this.resolveJob(jobId, flags);\n if (flags.component && job) {\n const summary = await this.ripple.getComponentBuildSummary(job.id, flags.component);\n return { job, componentBuild: summary, source, lastExport };\n }\n return { job, source, lastExport };\n }\n}\n\nexport class RippleErrorsCmd implements Command {\n name = 'errors [job-id]';\n description = 'show build errors for a Ripple CI job (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['', 'log', 'show full build log for failed containers (not just the error summary)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n\n if (!job) {\n if (jobId) {\n return chalk.red(`Job \"${jobId}\" not found.`);\n }\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (laneId) {\n return chalk.red(`No Ripple CI job found for lane \"${laneId}\".`);\n }\n return chalk.red(\n error ||\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.'\n );\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold(`Ripple CI Errors — ${job.name || job.id}`));\n lines.push(` ${chalk.cyan('Job ID:')} ${job.id}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n lines.push(` ${chalk.cyan('URL:')} ${this.ripple.getJobUrl(job)}`);\n\n if (ciNodes.length === 0) {\n lines.push('');\n lines.push(chalk.yellow('Could not determine which components are in this job.'));\n return lines.join('\\n');\n }\n\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const succeededNodes = ciNodes.filter((n) => n.phase === 'SUCCESS');\n const otherNodes = ciNodes.filter((n) => !isFailedPhase(n.phase) && n.phase !== 'SUCCESS');\n\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n const failedComponents = failedNodes.flatMap((n) => n.componentIds);\n const blockedComponents = otherNodes.flatMap((n) => n.componentIds);\n\n if (failedComponents.length === 0) {\n if (job.status?.phase?.toUpperCase() === 'FAILURE') {\n lines.push('');\n lines.push(\n chalk.yellow(`${totalComponents} component(s) in this job — no individual component failures found.`)\n );\n lines.push(chalk.yellow('The failure may be in a pipeline-level step. Check the Ripple CI URL above.'));\n } else {\n lines.push('');\n lines.push(chalk.green(`All ${totalComponents} component(s) built successfully.`));\n }\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(chalk.red.bold(`${failedComponents.length} component(s) with build failures:`));\n\n // fetch all build logs in parallel\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n\n for (const node of failedNodes) {\n const compList = node.componentIds.join(', ');\n lines.push('');\n lines.push(chalk.bold(` ${compList}`));\n\n const logMessages = logMap.get(node.containerName);\n if (logMessages && logMessages.length > 0) {\n const errorLines = flags.log ? logMessages : this.ripple.extractErrorsFromLog(logMessages);\n if (errorLines.length > 0) {\n for (const msg of errorLines) {\n const clean = stripAnsi(msg);\n // skip stack trace lines (noisy) unless --log is used\n if (!flags.log && /^\\s+at\\s/.test(clean)) continue;\n if (clean.length > 0) {\n lines.push(` ${clean}`);\n }\n }\n } else {\n lines.push(chalk.gray(' No error details found in build log.'));\n }\n } else {\n lines.push(chalk.gray(' Build log not available.'));\n }\n }\n\n if (blockedComponents.length > 0) {\n lines.push('');\n lines.push(chalk.yellow(`${blockedComponents.length} component(s) not built (blocked by failure):`));\n for (const compId of blockedComponents) {\n lines.push(` ${chalk.yellow('○')} ${compId}`);\n }\n }\n\n if (succeededNodes.length > 0) {\n const succeededCount = succeededNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.green(`${succeededCount} component(s) built successfully.`));\n }\n\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n if (!job) {\n return { error: error || 'No job found', job: null, ciNodes: [], containerLogs: {}, source, lastExport };\n }\n\n // fetch error logs for failed containers in parallel\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n const containerLogs: Record<string, string[]> = {};\n for (const [name, messages] of logMap) {\n containerLogs[name] = flags.log ? messages : this.ripple.extractErrorsFromLog(messages);\n }\n\n return { job, ciNodes, containerLogs, source, lastExport };\n }\n\n private async getErrors(\n jobId: string | undefined,\n flags: { lane?: string }\n ): Promise<{\n job: any;\n ciNodes: CiGraphNode[];\n source?: 'arg' | 'lane' | 'last-export';\n lastExport?: LastExportData;\n error?: string;\n }> {\n let job: any = null;\n let source: 'arg' | 'lane' | 'last-export' | undefined;\n let lastExport: LastExportData | undefined;\n\n if (jobId) {\n job = await this.ripple.getJob(jobId);\n source = 'arg';\n } else {\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n const last = await this.ripple.getLastExport();\n if (last?.rippleJobs?.length && lastExportMatchesTarget(last, laneId)) {\n const slug = last.rippleJobs[last.rippleJobs.length - 1];\n job = await this.ripple.getJobBySlug(slug);\n source = 'last-export';\n lastExport = last;\n if (!job) {\n return {\n job: null,\n ciNodes: [],\n source: 'last-export',\n lastExport: last,\n error: `Could not find Ripple CI job for your last export \"${slug}\".`,\n };\n }\n } else if (laneId) {\n const found = await this.ripple.findLatestJobForLane(laneId);\n job = found ? await this.ripple.getJob(found.id) : null;\n source = 'lane';\n }\n }\n\n if (!job) {\n return { job: null, ciNodes: [], source, lastExport };\n }\n\n // use ciGraph (internal graph) for job-specific build status per container/component\n const ciNodes = this.ripple.getCiGraphNodes(job);\n\n return { job, ciNodes, source, lastExport };\n }\n}\n\nexport class RippleRetryCmd implements Command {\n name = 'retry [job-id]';\n description = 'retry a failed Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to retry (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.retryJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to retry job \"${resolved.id}\". Make sure the job exists and has failed.`);\n }\n const lines: string[] = [];\n lines.push(chalk.green(`Successfully retried job \"${resolved.id}\".`));\n if (result.id) lines.push(` ${chalk.cyan('New Job ID:')} ${result.id}`);\n if (result.status?.phase) lines.push(` ${chalk.cyan('Status:')} ${result.status.phase}`);\n const jobUrl = this.ripple.getJobUrl(result);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.retryJob(resolved.id);\n return { job: result };\n }\n}\n\nexport class RippleStopCmd implements Command {\n name = 'stop [job-id]';\n description = 'stop a running Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to stop (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.stopJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to stop job \"${resolved.id}\". Make sure the job exists and is currently running.`);\n }\n return chalk.green(`Successfully stopped job \"${resolved.id}\".`);\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.stopJob(resolved.id);\n return { job: result };\n }\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n return new Date(dateStr).toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction formatDuration(startedAt?: string, finishedAt?: string): string {\n if (!startedAt) return '-';\n const start = new Date(startedAt).getTime();\n const end = finishedAt ? new Date(finishedAt).getTime() : Date.now();\n const ms = end - start;\n if (ms < 0) return '-';\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n\nfunction getScopeFromLaneId(laneId?: string): string {\n if (!laneId) return '-';\n return laneId.split('/')[0] || '-';\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.substring(0, max - 1)}…`;\n}\n"],"mappings":";;;;;;AACA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,UAAA;EAAA,MAAAH,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAC,SAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,SAAAI,aAAA;EAAA,MAAAJ,IAAA,GAAAE,OAAA;EAAAE,YAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA+F,SAAAC,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,gBAAAH,CAAA,EAAAI,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAJ,CAAA,GAAAO,MAAA,CAAAC,cAAA,CAAAR,CAAA,EAAAI,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAZ,CAAA,CAAAI,CAAA,IAAAC,CAAA,EAAAL,CAAA;AAAA,SAAAM,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAL,CAAA,GAAAK,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAhB,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAAiB,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAE/F;AACA;AACA;AACA;AACA;AACA,SAASgB,uBAAuBA,CAACC,IAAoB,EAAEC,UAA8B,EAAW;EAC9F,MAAMC,WAAW,GAAGF,IAAI,CAACG,IAAI,GAAG,GAAGH,IAAI,CAACG,IAAI,CAACC,KAAK,IAAIJ,IAAI,CAACG,IAAI,CAACE,IAAI,EAAE,GAAGC,SAAS;EAClF,OAAOJ,WAAW,KAAKD,UAAU;AACnC;AAEA,SAASM,gBAAgBA,CAACC,UAA0B,EAAEC,GAAoC,EAAU;EAClG,MAAMC,GAAG,GAAG,IAAAC,wBAAS,EAACH,UAAU,CAACI,SAAS,CAAC;EAC3C,MAAMC,MAAM,GAAGL,UAAU,CAACL,IAAI,GAAG,SAASK,UAAU,CAACL,IAAI,CAACC,KAAK,IAAII,UAAU,CAACL,IAAI,CAACE,IAAI,GAAG,GAAG,MAAM;EACnG,MAAMS,KAAK,GAAGL,GAAG,CAACM,MAAM,EAAED,KAAK,EAAEE,WAAW,CAAC,CAAC;EAC9C,IAAIF,KAAK,KAAK,SAAS,EAAE;IACvB,OAAOG,gBAAK,CAACC,KAAK,CAAC,uBAAuBR,GAAG,QAAQG,MAAM,aAAa,CAAC;EAC3E;EACA,IAAI,IAAAM,4BAAa,EAACL,KAAK,CAAC,EAAE;IACxB,OAAOG,gBAAK,CAACG,GAAG,CAAC,uBAAuBV,GAAG,QAAQG,MAAM,UAAU,CAAC;EACtE;EACA,OAAOI,gBAAK,CAACI,IAAI,CAAC,qBAAqBX,GAAG,QAAQG,MAAM,cAAc,IAAAS,yBAAU,EAACR,KAAK,CAAC,GAAG,CAAC;AAC7F;AAEO,MAAMS,SAAS,CAAoB;EAAAC,YAAA;IAAA3C,eAAA,eACjC,sBAAsB;IAAAA,eAAA,sBACf,oCAAoC;IAAAA,eAAA,8BAC5B,8FAA8F;IAAAA,eAAA,gBAC5G,aAAa;IAAAA,eAAA,wBACL,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,kBAEW,EAAE;IAAAA,eAAA,mBACN,EAAE;EAAA;EAExB,MAAM4C,MAAMA,CAAA,EAAG;IACb,OAAO;MAAEC,IAAI,EAAE,CAAC;MAAErD,IAAI,EAAE;IAA2E,CAAC;EACtG;AACF;AAACsD,OAAA,CAAAJ,SAAA,GAAAA,SAAA;AAEM,MAAMK,aAAa,CAAoB;EAkB5CJ,WAAWA,CAASK,MAAkB,EAAE;IAAA,KAApBA,MAAkB,GAAlBA,MAAkB;IAAAhD,eAAA,eAjB/B,MAAM;IAAAA,eAAA,sBACC,qEAAqE;IAAAA,eAAA,wBACnE,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,gBACP,EAAE;IAAAA,eAAA,kBAEgB,CACxB,CAAC,EAAE,EAAE,KAAK,EAAE,yDAAyD,CAAC,EACtE,CAAC,GAAG,EAAE,eAAe,EAAE,wEAAwE,CAAC,EAChG,CAAC,GAAG,EAAE,eAAe,EAAE,wCAAwC,CAAC,EAChE,CAAC,EAAE,EAAE,aAAa,EAAE,4CAA4C,CAAC,EACjE,CAAC,GAAG,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAC1C,CAAC,EAAE,EAAE,iBAAiB,EAAE,mDAAmD,CAAC,EAC5E,CAAC,GAAG,EAAE,eAAe,EAAE,0CAA0C,CAAC,EAClE,CAAC,GAAG,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAC3C;EAEwC;EAEzC,MAAM4C,MAAMA,CACVK,IAAQ,EACRC,KAQC,EACD;IACA,MAAM;MAAEC,IAAI;MAAEC;IAAU,CAAC,GAAG,MAAM,IAAI,CAACC,eAAe,CAACH,KAAK,CAAC;IAE7D,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACG,MAAM,KAAK,CAAC,EAAE;MAC9B,IAAIC,IAAI,GAAG,EAAE;MACb,IAAIL,KAAK,CAAC5B,IAAI,EAAEiC,IAAI,GAAG,cAAcL,KAAK,CAAC5B,IAAI,GAAG,CAAC,KAC9C,IAAI4B,KAAK,CAAC3B,KAAK,EAAEgC,IAAI,GAAG,eAAeL,KAAK,CAAC3B,KAAK,GAAG,CAAC,KACtD,IAAI6B,SAAS,EAAEG,IAAI,GAAG,eAAeH,SAAS,GAAG;MACtD,MAAMI,GAAG,GAAGJ,SAAS,GAAG,yCAAyC,GAAG,EAAE;MACtE,OAAOhB,gBAAK,CAACqB,MAAM,CAAC,0BAA0BF,IAAI,IAAIC,GAAG,EAAE,CAAC;IAC9D;IAEA,MAAME,KAAK,GAAG,KAAIC,mBAAK,EAAC;MACtBC,IAAI,EAAE,CACJxB,gBAAK,CAACyB,IAAI,CAAC,QAAQ,CAAC,EACpBzB,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,EAClBzB,gBAAK,CAACyB,IAAI,CAAC,OAAO,CAAC,EACnBzB,gBAAK,CAACyB,IAAI,CAAC,QAAQ,CAAC,EACpBzB,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,EAClBzB,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,EACrBzB,gBAAK,CAACyB,IAAI,CAAC,UAAU,CAAC,CACvB;MACDC,KAAK,EAAE;QACLC,GAAG,EAAE,EAAE;QACP,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACfC,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,EAAE;QAClBC,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACdC,GAAG,EAAE,EAAE;QACP,SAAS,EAAE,EAAE;QACbC,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;QACfC,MAAM,EAAE;MACV,CAAC;MACDC,KAAK,EAAE;QAAE,cAAc,EAAE,CAAC;QAAE,eAAe,EAAE;MAAE;IACjD,CAAC,CAAC;IAEF,KAAK,MAAMzC,GAAG,IAAIuB,IAAI,EAAE;MACtBO,KAAK,CAACY,IAAI,CAAC,CACT1C,GAAG,CAAC2C,EAAE,EACNC,QAAQ,CAAC5C,GAAG,CAACJ,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,EAC7BiD,kBAAkB,CAAC7C,GAAG,CAAC8C,MAAM,CAAC,EAC9B,IAAAjC,yBAAU,EAACb,GAAG,CAACM,MAAM,EAAED,KAAK,CAAC,EAC7BL,GAAG,CAAC+C,IAAI,EAAEC,QAAQ,IAAI,GAAG,EACzBC,UAAU,CAACjD,GAAG,CAACM,MAAM,EAAE4C,SAAS,CAAC,EACjCC,cAAc,CAACnD,GAAG,CAACM,MAAM,EAAE4C,SAAS,EAAElD,GAAG,CAACM,MAAM,EAAE8C,UAAU,CAAC,CAC9D,CAAC;IACJ;IAEA,MAAMC,MAAM,GAAG7B,SAAS,GAAGhB,gBAAK,CAACI,IAAI,CAAC,2BAA2BY,SAAS,4BAA4B,CAAC,GAAG,EAAE;IAC5G,OAAO,CAAC6B,MAAM,EAAEvB,KAAK,CAACwB,QAAQ,CAAC,CAAC,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEA,MAAMC,IAAIA,CACRrC,IAAQ,EACRC,KAQC,EACD;IACA,MAAM;MAAEC;IAAK,CAAC,GAAG,MAAM,IAAI,CAACE,eAAe,CAACH,KAAK,CAAC;IAClD,OAAO;MAAEC,IAAI,EAAEA,IAAI,IAAI;IAAG,CAAC;EAC7B;EAEA,MAAcE,eAAeA,CAACH,KAQ7B,EAAsD;IACrD,MAAMqC,cAAc,GAAGrC,KAAK,CAACsC,KAAK,GAAGC,QAAQ,CAACvC,KAAK,CAACsC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE;IACnE,IAAI,CAACvE,MAAM,CAACyE,QAAQ,CAACH,cAAc,CAAC,IAAIA,cAAc,GAAG,CAAC,EAAE;MAC1D,MAAM,IAAII,KAAK,CAAC,0BAA0BzC,KAAK,CAACsC,KAAK,iCAAiC,CAAC;IACzF;;IAEA;IACA,MAAMI,OAAoF,GAAG,CAAC,CAAC;;IAE/F;IACA,IAAIxC,SAA6B;IACjC,IAAI,CAACF,KAAK,CAAC2C,GAAG,IAAI,CAAC3C,KAAK,CAAC5B,IAAI,IAAI,CAAC4B,KAAK,CAAC3B,KAAK,EAAE;MAC7C6B,SAAS,GAAGF,KAAK,CAAC4C,KAAK,IAAI,IAAI,CAAC9C,MAAM,CAAC+C,eAAe,CAAC,CAAC;IAC1D,CAAC,MAAM,IAAI7C,KAAK,CAAC4C,KAAK,EAAE;MACtB1C,SAAS,GAAGF,KAAK,CAAC4C,KAAK;IACzB;IAEA,IAAI1C,SAAS,EAAEwC,OAAO,CAACI,MAAM,GAAG,CAAC5C,SAAS,CAAC;IAC3C,IAAIF,KAAK,CAAC5B,IAAI,EAAEsE,OAAO,CAACK,KAAK,GAAG,CAAC/C,KAAK,CAAC5B,IAAI,CAAC;IAC5C,IAAI4B,KAAK,CAAC3B,KAAK,EAAEqE,OAAO,CAACM,MAAM,GAAG,CAAChD,KAAK,CAAC3B,KAAK,CAAC;IAC/C,IAAI2B,KAAK,CAAChB,MAAM,EAAE0D,OAAO,CAAC1D,MAAM,GAAGgB,KAAK,CAAChB,MAAM,CAACC,WAAW,CAAC,CAAC;;IAE7D;IACA,MAAMgE,iBAAiB,GAAG,CAAC,CAACjD,KAAK,CAACyB,IAAI;IACtC,MAAMyB,UAAU,GAAGD,iBAAiB,GAAGE,IAAI,CAACC,GAAG,CAACf,cAAc,GAAG,CAAC,EAAE,GAAG,CAAC,GAAGA,cAAc;IACzF,IAAIpC,IAAI,GAAG,MAAM,IAAI,CAACH,MAAM,CAACuD,QAAQ,CAAC;MAAEX,OAAO;MAAEJ,KAAK,EAAEY;IAAW,CAAC,CAAC;;IAErE;IACA,IAAIlD,KAAK,CAACyB,IAAI,EAAE;MACd,MAAM6B,UAAU,GAAGtD,KAAK,CAACyB,IAAI,CAAC8B,WAAW,CAAC,CAAC;MAC3CtD,IAAI,GAAGA,IAAI,CAACgC,MAAM,CAAEuB,CAAC,IAAKA,CAAC,CAAC/B,IAAI,EAAEC,QAAQ,EAAE6B,WAAW,CAAC,CAAC,CAACE,QAAQ,CAACH,UAAU,CAAC,CAAC;IACjF;IAEArD,IAAI,GAAGA,IAAI,CAACyD,KAAK,CAAC,CAAC,EAAErB,cAAc,CAAC;IAEpC,OAAO;MAAEpC,IAAI;MAAEC;IAAU,CAAC;EAC5B;AACF;AAACN,OAAA,CAAAC,aAAA,GAAAA,aAAA;AAEM,MAAM8D,YAAY,CAAoB;EAqB3ClE,WAAWA,CAASK,MAAkB,EAAE;IAAA,KAApBA,MAAkB,GAAlBA,MAAkB;IAAAhD,eAAA,eApB/B,cAAc;IAAAA,eAAA,sBAEnB,mHAAmH;IAAAA,eAAA,wBACrG,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,gBACP,EAAE;IAAAA,eAAA,kBAEgB,CACxB,CAAC,EAAE,EAAE,aAAa,EAAE,qEAAqE,CAAC,EAC1F,CAAC,GAAG,EAAE,uBAAuB,EAAE,+DAA+D,CAAC,EAC/F,CAAC,GAAG,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAC3C;IAAAA,eAAA,oBAEW,CACV;MACEwB,IAAI,EAAE,QAAQ;MACdsF,WAAW,EAAE;IACf,CAAC,CACF;EAEwC;EAEzC,MAAcC,UAAUA,CAACC,KAAyB,EAAE9D,KAAwB,EAAE;IAC5E,MAAM+D,QAAQ,GAAG,MAAM,IAAAC,2BAAY,EAAC,IAAI,CAAClE,MAAM,EAAEgE,KAAK,EAAE9D,KAAK,CAAC;IAC9D,IAAI,OAAO,IAAI+D,QAAQ,EAAE,OAAO;MAAErF,GAAG,EAAE,IAAI;MAAEuF,KAAK,EAAEF,QAAQ,CAACE,KAAK;MAAEC,MAAM,EAAE3F,SAAS;MAAEE,UAAU,EAAEF;IAAU,CAAC;IAC9G;IACA,MAAMG,GAAG,GAAGqF,QAAQ,CAACrF,GAAG,KAAK,MAAM,IAAI,CAACoB,MAAM,CAACqE,MAAM,CAACJ,QAAQ,CAAC1C,EAAE,CAAC,CAAC;IACnE,OAAO;MAAE3C,GAAG;MAAEuF,KAAK,EAAE1F,SAAS;MAAE2F,MAAM,EAAEH,QAAQ,CAACG,MAAM;MAAEzF,UAAU,EAAEsF,QAAQ,CAACtF;IAAW,CAAC;EAC5F;EAEA,MAAMiB,MAAMA,CAAC,CAACoE,KAAK,CAAW,EAAE9D,KAA4C,EAAE;IAC5E,MAAM;MAAEtB,GAAG;MAAEuF,KAAK;MAAEC,MAAM;MAAEzF;IAAW,CAAC,GAAG,MAAM,IAAI,CAACoF,UAAU,CAACC,KAAK,EAAE9D,KAAK,CAAC;IAC9E,IAAI,CAACtB,GAAG,EAAE;MACR,IAAIoF,KAAK,EAAE,OAAO5E,gBAAK,CAACG,GAAG,CAAC,QAAQyE,KAAK,cAAc,CAAC;MACxD,OAAO5E,gBAAK,CAACG,GAAG,CAAC4E,KAAK,IAAI,iCAAiC,CAAC;IAC9D;IAEA,MAAMG,KAAe,GAAG,EAAE;IAC1B,IAAIF,MAAM,KAAK,aAAa,IAAIzF,UAAU,EAAE;MAC1C2F,KAAK,CAAChD,IAAI,CAAC5C,gBAAgB,CAACC,UAAU,EAAEC,GAAG,CAAC,CAAC;MAC7C0F,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;IAChB;IACAgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACmF,IAAI,CAAC,aAAa,CAAC,CAAC;IACrCD,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,KAAK,CAAC,UAAUjC,GAAG,CAAC2C,EAAE,EAAE,CAAC;IACpD,IAAI3C,GAAG,CAACJ,IAAI,EAAE8F,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,OAAO,CAAC,QAAQjC,GAAG,CAACJ,IAAI,EAAE,CAAC;IACpE8F,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,MAAM,IAAApB,yBAAU,EAACb,GAAG,CAACM,MAAM,EAAED,KAAK,CAAC,EAAE,CAAC;IAC3E,IAAIL,GAAG,CAAC8C,MAAM,EAAE4C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,OAAO,CAAC,QAAQjC,GAAG,CAAC8C,MAAM,EAAE,CAAC;IACxE,IAAI9C,GAAG,CAAC+C,IAAI,EAAE6C,WAAW,EACvBF,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,OAAO,CAAC,QAAQjC,GAAG,CAAC+C,IAAI,CAAC6C,WAAW,KAAK5F,GAAG,CAAC+C,IAAI,CAACC,QAAQ,GAAG,CAAC;IAC3F,IAAIhD,GAAG,CAACM,MAAM,EAAE4C,SAAS,EACvBwC,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI4D,IAAI,CAAC7F,GAAG,CAACM,MAAM,CAAC4C,SAAS,CAAC,CAAC4C,cAAc,CAAC,CAAC,EAAE,CAAC;IAC/F,IAAI9F,GAAG,CAACM,MAAM,EAAE8C,UAAU,EACxBsC,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI4D,IAAI,CAAC7F,GAAG,CAACM,MAAM,CAAC8C,UAAU,CAAC,CAAC0C,cAAc,CAAC,CAAC,EAAE,CAAC;IAChG,MAAMC,MAAM,GAAG,IAAI,CAAC3E,MAAM,CAAC4E,SAAS,CAAChG,GAAG,CAAC;IACzC0F,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,SAAS8D,MAAM,EAAE,CAAC;IAEpD,IAAIzE,KAAK,CAAC2E,SAAS,EAAE;MACnB,MAAM,IAAI,CAACC,qBAAqB,CAACR,KAAK,EAAE1F,GAAG,CAAC2C,EAAE,EAAErB,KAAK,CAAC2E,SAAS,CAAC;IAClE,CAAC,MAAM;MACL,IAAI,CAACE,mBAAmB,CAACT,KAAK,EAAE1F,GAAG,CAAC;IACtC;IAEA,OAAO0F,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;EACzB;EAEA,MAAcyC,qBAAqBA,CAACR,KAAe,EAAEN,KAAa,EAAEgB,WAAmB,EAAE;IACvF,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACjF,MAAM,CAACkF,wBAAwB,CAAClB,KAAK,EAAEgB,WAAW,CAAC;IAC9E,IAAI,CAACC,OAAO,EAAE;MACZX,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;MACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACqB,MAAM,CAAC,yCAAyCuE,WAAW,gBAAgB,CAAC,CAAC;MAC9F;IACF;IACAV,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;IACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACmF,IAAI,CAAC,mBAAmBU,OAAO,CAACzG,IAAI,IAAIwG,WAAW,EAAE,CAAC,CAAC;IACxE,IAAI,CAACC,OAAO,CAACE,KAAK,IAAIF,OAAO,CAACE,KAAK,CAAC7E,MAAM,KAAK,CAAC,EAAE;MAChDgE,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACI,IAAI,CAAC,yBAAyB,CAAC,CAAC;MACjD;IACF;IACA,MAAMkB,KAAK,GAAG,KAAIC,mBAAK,EAAC;MACtBC,IAAI,EAAE,CAACxB,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,EAAEzB,gBAAK,CAACyB,IAAI,CAAC,QAAQ,CAAC,EAAEzB,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,EAAEzB,gBAAK,CAACyB,IAAI,CAAC,UAAU,CAAC,CAAC;MAC/FC,KAAK,EAAE;QACLC,GAAG,EAAE,EAAE;QACP,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACfC,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,EAAE;QAClBC,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACdC,GAAG,EAAE,EAAE;QACP,SAAS,EAAE,EAAE;QACbC,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;QACfC,MAAM,EAAE;MACV,CAAC;MACDC,KAAK,EAAE;QAAE,cAAc,EAAE,CAAC;QAAE,eAAe,EAAE;MAAE;IACjD,CAAC,CAAC;IACF,KAAK,MAAM+D,IAAI,IAAIH,OAAO,CAACE,KAAK,EAAE;MAChCzE,KAAK,CAACY,IAAI,CAAC,CACT8D,IAAI,CAAC5G,IAAI,IAAI,GAAG,EAChB,IAAAiB,yBAAU,EAAC2F,IAAI,CAAClG,MAAM,EAAEA,MAAM,CAAC,EAC/BkG,IAAI,CAACC,SAAS,GAAG,IAAIZ,IAAI,CAACW,IAAI,CAACC,SAAS,CAAC,CAACX,cAAc,CAAC,CAAC,GAAG,GAAG,EAChEU,IAAI,CAAClG,MAAM,EAAEoG,QAAQ,GAAGlG,gBAAK,CAACqB,MAAM,CAACzC,MAAM,CAACoH,IAAI,CAAClG,MAAM,CAACoG,QAAQ,CAAC,CAAC,GAAG,GAAG,CACzE,CAAC;IACJ;IACAhB,KAAK,CAAChD,IAAI,CAACZ,KAAK,CAACwB,QAAQ,CAAC,CAAC,CAAC;EAC9B;EAEQ6C,mBAAmBA,CAACT,KAAe,EAAE1F,GAAyB,EAAE;IACtE,MAAM2G,OAAO,GAAG,IAAI,CAACvF,MAAM,CAACwF,eAAe,CAAC5G,GAAG,CAAC;IAChD,IAAI2G,OAAO,CAACjF,MAAM,KAAK,CAAC,EAAE;IAC1B,MAAMmF,eAAe,GAAGF,OAAO,CAACG,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAKD,GAAG,GAAGC,CAAC,CAACC,YAAY,CAACvF,MAAM,EAAE,CAAC,CAAC;IAClFgE,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;IACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACmF,IAAI,CAAC,eAAekB,eAAe,GAAG,CAAC,CAAC;IACzDnB,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACI,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC5F,IAAIsG,KAAK,GAAG,CAAC;IACb,KAAK,MAAMC,IAAI,IAAIR,OAAO,EAAE;MAC1B,IAAIO,KAAK,IAAI,EAAE,EAAE;QACfxB,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACI,IAAI,CAAC,aAAaiG,eAAe,GAAGK,KAAK,OAAO,CAAC,CAAC;QACnE;MACF;MACA,KAAK,MAAME,MAAM,IAAID,IAAI,CAACF,YAAY,EAAE;QACtC,IAAIC,KAAK,IAAI,EAAE,EAAE;QACjB,MAAMG,IAAI,GAAG,IAAA3G,4BAAa,EAACyG,IAAI,CAAC9G,KAAK,CAAC,GAClCG,gBAAK,CAACG,GAAG,CAAC,GAAG,CAAC,GACdwG,IAAI,CAAC9G,KAAK,KAAK,SAAS,GACtBG,gBAAK,CAACC,KAAK,CAAC,GAAG,CAAC,GAChBD,gBAAK,CAACqB,MAAM,CAAC,GAAG,CAAC;QACvB6D,KAAK,CAAChD,IAAI,CAAC,KAAK2E,IAAI,IAAID,MAAM,EAAE,CAAC;QACjCF,KAAK,EAAE;MACT;IACF;EACF;EAEA,MAAMxD,IAAIA,CAAC,CAAC0B,KAAK,CAAW,EAAE9D,KAA4C,EAAE;IAC1E,MAAM;MAAEtB,GAAG;MAAEwF,MAAM;MAAEzF;IAAW,CAAC,GAAG,MAAM,IAAI,CAACoF,UAAU,CAACC,KAAK,EAAE9D,KAAK,CAAC;IACvE,IAAIA,KAAK,CAAC2E,SAAS,IAAIjG,GAAG,EAAE;MAC1B,MAAMqG,OAAO,GAAG,MAAM,IAAI,CAACjF,MAAM,CAACkF,wBAAwB,CAACtG,GAAG,CAAC2C,EAAE,EAAErB,KAAK,CAAC2E,SAAS,CAAC;MACnF,OAAO;QAAEjG,GAAG;QAAEsH,cAAc,EAAEjB,OAAO;QAAEb,MAAM;QAAEzF;MAAW,CAAC;IAC7D;IACA,OAAO;MAAEC,GAAG;MAAEwF,MAAM;MAAEzF;IAAW,CAAC;EACpC;AACF;AAACmB,OAAA,CAAA+D,YAAA,GAAAA,YAAA;AAEM,MAAMsC,eAAe,CAAoB;EAoB9CxG,WAAWA,CAASK,MAAkB,EAAE;IAAA,KAApBA,MAAkB,GAAlBA,MAAkB;IAAAhD,eAAA,eAnB/B,iBAAiB;IAAAA,eAAA,sBACV,qGAAqG;IAAAA,eAAA,wBACnG,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,gBACP,EAAE;IAAAA,eAAA,kBAEgB,CACxB,CAAC,EAAE,EAAE,aAAa,EAAE,qEAAqE,CAAC,EAC1F,CAAC,EAAE,EAAE,KAAK,EAAE,wEAAwE,CAAC,EACrF,CAAC,GAAG,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAC3C;IAAAA,eAAA,oBAEW,CACV;MACEwB,IAAI,EAAE,QAAQ;MACdsF,WAAW,EAAE;IACf,CAAC,CACF;EAEwC;EAEzC,MAAMlE,MAAMA,CAAC,CAACoE,KAAK,CAAW,EAAE9D,KAAuC,EAAE;IACvE,MAAM;MAAEtB,GAAG;MAAE2G,OAAO;MAAEnB,MAAM;MAAEzF,UAAU;MAAEwF;IAAM,CAAC,GAAG,MAAM,IAAI,CAACiC,SAAS,CAACpC,KAAK,EAAE9D,KAAK,CAAC;IAEtF,IAAI,CAACtB,GAAG,EAAE;MACR,IAAIoF,KAAK,EAAE;QACT,OAAO5E,gBAAK,CAACG,GAAG,CAAC,QAAQyE,KAAK,cAAc,CAAC;MAC/C;MACA,MAAMtC,MAAM,GAAGxB,KAAK,CAAC5B,IAAI,IAAI,IAAI,CAAC0B,MAAM,CAACqG,gBAAgB,CAAC,CAAC;MAC3D,IAAI3E,MAAM,EAAE;QACV,OAAOtC,gBAAK,CAACG,GAAG,CAAC,oCAAoCmC,MAAM,IAAI,CAAC;MAClE;MACA,OAAOtC,gBAAK,CAACG,GAAG,CACd4E,KAAK,IACH,6GACJ,CAAC;IACH;IAEA,MAAMG,KAAe,GAAG,EAAE;IAC1B,IAAIF,MAAM,KAAK,aAAa,IAAIzF,UAAU,EAAE;MAC1C2F,KAAK,CAAChD,IAAI,CAAC5C,gBAAgB,CAACC,UAAU,EAAEC,GAAG,CAAC,CAAC;MAC7C0F,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;IAChB;IACAgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACmF,IAAI,CAAC,sBAAsB3F,GAAG,CAACJ,IAAI,IAAII,GAAG,CAAC2C,EAAE,EAAE,CAAC,CAAC;IAClE+C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,IAAIjC,GAAG,CAAC2C,EAAE,EAAE,CAAC;IAClD+C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,IAAI,IAAApB,yBAAU,EAACb,GAAG,CAACM,MAAM,EAAED,KAAK,CAAC,EAAE,CAAC;IACzE,IAAIL,GAAG,CAAC8C,MAAM,EAAE4C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,OAAO,CAAC,MAAMjC,GAAG,CAAC8C,MAAM,EAAE,CAAC;IACtE4C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAACb,MAAM,CAAC4E,SAAS,CAAChG,GAAG,CAAC,EAAE,CAAC;IAEtE,IAAI2G,OAAO,CAACjF,MAAM,KAAK,CAAC,EAAE;MACxBgE,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;MACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACqB,MAAM,CAAC,uDAAuD,CAAC,CAAC;MACjF,OAAO6D,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;IACzB;IAEA,MAAMiE,WAAW,GAAGf,OAAO,CAACpD,MAAM,CAAEyD,CAAC,IAAK,IAAAtG,4BAAa,EAACsG,CAAC,CAAC3G,KAAK,CAAC,CAAC;IACjE,MAAMsH,cAAc,GAAGhB,OAAO,CAACpD,MAAM,CAAEyD,CAAC,IAAKA,CAAC,CAAC3G,KAAK,KAAK,SAAS,CAAC;IACnE,MAAMuH,UAAU,GAAGjB,OAAO,CAACpD,MAAM,CAAEyD,CAAC,IAAK,CAAC,IAAAtG,4BAAa,EAACsG,CAAC,CAAC3G,KAAK,CAAC,IAAI2G,CAAC,CAAC3G,KAAK,KAAK,SAAS,CAAC;IAE1F,MAAMwG,eAAe,GAAGF,OAAO,CAACG,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAKD,GAAG,GAAGC,CAAC,CAACC,YAAY,CAACvF,MAAM,EAAE,CAAC,CAAC;IAClF,MAAMmG,gBAAgB,GAAGH,WAAW,CAACI,OAAO,CAAEd,CAAC,IAAKA,CAAC,CAACC,YAAY,CAAC;IACnE,MAAMc,iBAAiB,GAAGH,UAAU,CAACE,OAAO,CAAEd,CAAC,IAAKA,CAAC,CAACC,YAAY,CAAC;IAEnE,IAAIY,gBAAgB,CAACnG,MAAM,KAAK,CAAC,EAAE;MACjC,IAAI1B,GAAG,CAACM,MAAM,EAAED,KAAK,EAAEE,WAAW,CAAC,CAAC,KAAK,SAAS,EAAE;QAClDmF,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;QACdgD,KAAK,CAAChD,IAAI,CACRlC,gBAAK,CAACqB,MAAM,CAAC,GAAGgF,eAAe,qEAAqE,CACtG,CAAC;QACDnB,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACqB,MAAM,CAAC,6EAA6E,CAAC,CAAC;MACzG,CAAC,MAAM;QACL6D,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;QACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACC,KAAK,CAAC,OAAOoG,eAAe,mCAAmC,CAAC,CAAC;MACpF;MACA,OAAOnB,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;IACzB;IAEAiC,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;IACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACG,GAAG,CAACgF,IAAI,CAAC,GAAGkC,gBAAgB,CAACnG,MAAM,oCAAoC,CAAC,CAAC;;IAE1F;IACA,MAAMsG,cAAc,GAAGN,WAAW,CAACO,GAAG,CAAEjB,CAAC,IAAKA,CAAC,CAACkB,aAAa,CAAC;IAC9D,MAAMC,MAAM,GAAG,MAAM,IAAI,CAAC/G,MAAM,CAACgH,gBAAgB,CAACpI,GAAG,CAAC2C,EAAE,EAAEqF,cAAc,CAAC;IAEzE,KAAK,MAAMb,IAAI,IAAIO,WAAW,EAAE;MAC9B,MAAMW,QAAQ,GAAGlB,IAAI,CAACF,YAAY,CAACxD,IAAI,CAAC,IAAI,CAAC;MAC7CiC,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;MACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACmF,IAAI,CAAC,KAAK0C,QAAQ,EAAE,CAAC,CAAC;MAEvC,MAAMC,WAAW,GAAGH,MAAM,CAACI,GAAG,CAACpB,IAAI,CAACe,aAAa,CAAC;MAClD,IAAII,WAAW,IAAIA,WAAW,CAAC5G,MAAM,GAAG,CAAC,EAAE;QACzC,MAAM8G,UAAU,GAAGlH,KAAK,CAACmH,GAAG,GAAGH,WAAW,GAAG,IAAI,CAAClH,MAAM,CAACsH,oBAAoB,CAACJ,WAAW,CAAC;QAC1F,IAAIE,UAAU,CAAC9G,MAAM,GAAG,CAAC,EAAE;UACzB,KAAK,MAAMiH,GAAG,IAAIH,UAAU,EAAE;YAC5B,MAAMI,KAAK,GAAG,IAAAC,wBAAS,EAACF,GAAG,CAAC;YAC5B;YACA,IAAI,CAACrH,KAAK,CAACmH,GAAG,IAAI,UAAU,CAACK,IAAI,CAACF,KAAK,CAAC,EAAE;YAC1C,IAAIA,KAAK,CAAClH,MAAM,GAAG,CAAC,EAAE;cACpBgE,KAAK,CAAChD,IAAI,CAAC,OAAOkG,KAAK,EAAE,CAAC;YAC5B;UACF;QACF,CAAC,MAAM;UACLlD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACI,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACpE;MACF,CAAC,MAAM;QACL8E,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACI,IAAI,CAAC,8BAA8B,CAAC,CAAC;MACxD;IACF;IAEA,IAAImH,iBAAiB,CAACrG,MAAM,GAAG,CAAC,EAAE;MAChCgE,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;MACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACqB,MAAM,CAAC,GAAGkG,iBAAiB,CAACrG,MAAM,+CAA+C,CAAC,CAAC;MACpG,KAAK,MAAM0F,MAAM,IAAIW,iBAAiB,EAAE;QACtCrC,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACqB,MAAM,CAAC,GAAG,CAAC,IAAIuF,MAAM,EAAE,CAAC;MAChD;IACF;IAEA,IAAIO,cAAc,CAACjG,MAAM,GAAG,CAAC,EAAE;MAC7B,MAAMqH,cAAc,GAAGpB,cAAc,CAACb,MAAM,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAKD,GAAG,GAAGC,CAAC,CAACC,YAAY,CAACvF,MAAM,EAAE,CAAC,CAAC;MACxFgE,KAAK,CAAChD,IAAI,CAAC,EAAE,CAAC;MACdgD,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACC,KAAK,CAAC,GAAGsI,cAAc,mCAAmC,CAAC,CAAC;IAC/E;IAEA,OAAOrD,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;EACzB;EAEA,MAAMC,IAAIA,CAAC,CAAC0B,KAAK,CAAW,EAAE9D,KAAuC,EAAE;IACrE,MAAM;MAAEtB,GAAG;MAAE2G,OAAO;MAAEnB,MAAM;MAAEzF,UAAU;MAAEwF;IAAM,CAAC,GAAG,MAAM,IAAI,CAACiC,SAAS,CAACpC,KAAK,EAAE9D,KAAK,CAAC;IACtF,IAAI,CAACtB,GAAG,EAAE;MACR,OAAO;QAAEuF,KAAK,EAAEA,KAAK,IAAI,cAAc;QAAEvF,GAAG,EAAE,IAAI;QAAE2G,OAAO,EAAE,EAAE;QAAEqC,aAAa,EAAE,CAAC,CAAC;QAAExD,MAAM;QAAEzF;MAAW,CAAC;IAC1G;;IAEA;IACA,MAAM2H,WAAW,GAAGf,OAAO,CAACpD,MAAM,CAAEyD,CAAC,IAAK,IAAAtG,4BAAa,EAACsG,CAAC,CAAC3G,KAAK,CAAC,CAAC;IACjE,MAAM2H,cAAc,GAAGN,WAAW,CAACO,GAAG,CAAEjB,CAAC,IAAKA,CAAC,CAACkB,aAAa,CAAC;IAC9D,MAAMC,MAAM,GAAG,MAAM,IAAI,CAAC/G,MAAM,CAACgH,gBAAgB,CAACpI,GAAG,CAAC2C,EAAE,EAAEqF,cAAc,CAAC;IACzE,MAAMgB,aAAuC,GAAG,CAAC,CAAC;IAClD,KAAK,MAAM,CAACpJ,IAAI,EAAEqJ,QAAQ,CAAC,IAAId,MAAM,EAAE;MACrCa,aAAa,CAACpJ,IAAI,CAAC,GAAG0B,KAAK,CAACmH,GAAG,GAAGQ,QAAQ,GAAG,IAAI,CAAC7H,MAAM,CAACsH,oBAAoB,CAACO,QAAQ,CAAC;IACzF;IAEA,OAAO;MAAEjJ,GAAG;MAAE2G,OAAO;MAAEqC,aAAa;MAAExD,MAAM;MAAEzF;IAAW,CAAC;EAC5D;EAEA,MAAcyH,SAASA,CACrBpC,KAAyB,EACzB9D,KAAwB,EAOvB;IACD,IAAItB,GAAQ,GAAG,IAAI;IACnB,IAAIwF,MAAkD;IACtD,IAAIzF,UAAsC;IAE1C,IAAIqF,KAAK,EAAE;MACTpF,GAAG,GAAG,MAAM,IAAI,CAACoB,MAAM,CAACqE,MAAM,CAACL,KAAK,CAAC;MACrCI,MAAM,GAAG,KAAK;IAChB,CAAC,MAAM;MACL,MAAM1C,MAAM,GAAGxB,KAAK,CAAC5B,IAAI,IAAI,IAAI,CAAC0B,MAAM,CAACqG,gBAAgB,CAAC,CAAC;MAC3D,MAAMlI,IAAI,GAAG,MAAM,IAAI,CAAC6B,MAAM,CAAC8H,aAAa,CAAC,CAAC;MAC9C,IAAI3J,IAAI,EAAE4J,UAAU,EAAEzH,MAAM,IAAIpC,uBAAuB,CAACC,IAAI,EAAEuD,MAAM,CAAC,EAAE;QACrE,MAAMsG,IAAI,GAAG7J,IAAI,CAAC4J,UAAU,CAAC5J,IAAI,CAAC4J,UAAU,CAACzH,MAAM,GAAG,CAAC,CAAC;QACxD1B,GAAG,GAAG,MAAM,IAAI,CAACoB,MAAM,CAACiI,YAAY,CAACD,IAAI,CAAC;QAC1C5D,MAAM,GAAG,aAAa;QACtBzF,UAAU,GAAGR,IAAI;QACjB,IAAI,CAACS,GAAG,EAAE;UACR,OAAO;YACLA,GAAG,EAAE,IAAI;YACT2G,OAAO,EAAE,EAAE;YACXnB,MAAM,EAAE,aAAa;YACrBzF,UAAU,EAAER,IAAI;YAChBgG,KAAK,EAAE,sDAAsD6D,IAAI;UACnE,CAAC;QACH;MACF,CAAC,MAAM,IAAItG,MAAM,EAAE;QACjB,MAAMwG,KAAK,GAAG,MAAM,IAAI,CAAClI,MAAM,CAACmI,oBAAoB,CAACzG,MAAM,CAAC;QAC5D9C,GAAG,GAAGsJ,KAAK,GAAG,MAAM,IAAI,CAAClI,MAAM,CAACqE,MAAM,CAAC6D,KAAK,CAAC3G,EAAE,CAAC,GAAG,IAAI;QACvD6C,MAAM,GAAG,MAAM;MACjB;IACF;IAEA,IAAI,CAACxF,GAAG,EAAE;MACR,OAAO;QAAEA,GAAG,EAAE,IAAI;QAAE2G,OAAO,EAAE,EAAE;QAAEnB,MAAM;QAAEzF;MAAW,CAAC;IACvD;;IAEA;IACA,MAAM4G,OAAO,GAAG,IAAI,CAACvF,MAAM,CAACwF,eAAe,CAAC5G,GAAG,CAAC;IAEhD,OAAO;MAAEA,GAAG;MAAE2G,OAAO;MAAEnB,MAAM;MAAEzF;IAAW,CAAC;EAC7C;AACF;AAACmB,OAAA,CAAAqG,eAAA,GAAAA,eAAA;AAEM,MAAMiC,cAAc,CAAoB;EAgB7CzI,WAAWA,CAASK,MAAkB,EAAE;IAAA,KAApBA,MAAkB,GAAlBA,MAAkB;IAAAhD,eAAA,eAf/B,gBAAgB;IAAAA,eAAA,sBACT,+EAA+E;IAAAA,eAAA,wBAC7E,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,gBACP,EAAE;IAAAA,eAAA,kBAEgB,CACxB,CAAC,EAAE,EAAE,aAAa,EAAE,qEAAqE,CAAC,EAC1F,CAAC,GAAG,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAC3C;IAAAA,eAAA,oBAEW,CACV;MAAEwB,IAAI,EAAE,QAAQ;MAAEsF,WAAW,EAAE;IAA4E,CAAC,CAC7G;EAEwC;EAEzC,MAAMlE,MAAMA,CAAC,CAACoE,KAAK,CAAW,EAAE9D,KAAwB,EAAE;IACxD,MAAM+D,QAAQ,GAAG,MAAM,IAAAC,2BAAY,EAAC,IAAI,CAAClE,MAAM,EAAEgE,KAAK,EAAE9D,KAAK,EAAE;MAC7DmI,aAAa,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;MACpCC,UAAU,EAAE;IACd,CAAC,CAAC;IACF,IAAI,OAAO,IAAIrE,QAAQ,EAAE,OAAO7E,gBAAK,CAACG,GAAG,CAAC0E,QAAQ,CAACE,KAAK,CAAC;IAEzD,MAAMoE,MAAM,GAAG,MAAM,IAAI,CAACvI,MAAM,CAACwI,QAAQ,CAACvE,QAAQ,CAAC1C,EAAE,CAAC;IACtD,IAAI,CAACgH,MAAM,EAAE;MACX,OAAOnJ,gBAAK,CAACG,GAAG,CAAC,wBAAwB0E,QAAQ,CAAC1C,EAAE,6CAA6C,CAAC;IACpG;IACA,MAAM+C,KAAe,GAAG,EAAE;IAC1BA,KAAK,CAAChD,IAAI,CAAClC,gBAAK,CAACC,KAAK,CAAC,6BAA6B4E,QAAQ,CAAC1C,EAAE,IAAI,CAAC,CAAC;IACrE,IAAIgH,MAAM,CAAChH,EAAE,EAAE+C,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,aAAa,CAAC,IAAI0H,MAAM,CAAChH,EAAE,EAAE,CAAC;IACxE,IAAIgH,MAAM,CAACrJ,MAAM,EAAED,KAAK,EAAEqF,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,SAAS,CAAC,QAAQ0H,MAAM,CAACrJ,MAAM,CAACD,KAAK,EAAE,CAAC;IAC7F,MAAM0F,MAAM,GAAG,IAAI,CAAC3E,MAAM,CAAC4E,SAAS,CAAC2D,MAAM,CAAC;IAC5CjE,KAAK,CAAChD,IAAI,CAAC,KAAKlC,gBAAK,CAACyB,IAAI,CAAC,MAAM,CAAC,WAAW8D,MAAM,EAAE,CAAC;IACtD,OAAOL,KAAK,CAACjC,IAAI,CAAC,IAAI,CAAC;EACzB;EAEA,MAAMC,IAAIA,CAAC,CAAC0B,KAAK,CAAW,EAAE9D,KAAwB,EAAE;IACtD,MAAM+D,QAAQ,GAAG,MAAM,IAAAC,2BAAY,EAAC,IAAI,CAAClE,MAAM,EAAEgE,KAAK,EAAE9D,KAAK,EAAE;MAC7DmI,aAAa,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;MACpCC,UAAU,EAAE;IACd,CAAC,CAAC;IACF,IAAI,OAAO,IAAIrE,QAAQ,EAAE,OAAO;MAAEE,KAAK,EAAEF,QAAQ,CAACE;IAAM,CAAC;IACzD,MAAMoE,MAAM,GAAG,MAAM,IAAI,CAACvI,MAAM,CAACwI,QAAQ,CAACvE,QAAQ,CAAC1C,EAAE,CAAC;IACtD,OAAO;MAAE3C,GAAG,EAAE2J;IAAO,CAAC;EACxB;AACF;AAACzI,OAAA,CAAAsI,cAAA,GAAAA,cAAA;AAEM,MAAMK,aAAa,CAAoB;EAgB5C9I,WAAWA,CAASK,MAAkB,EAAE;IAAA,KAApBA,MAAkB,GAAlBA,MAAkB;IAAAhD,eAAA,eAf/B,eAAe;IAAAA,eAAA,sBACR,+EAA+E;IAAAA,eAAA,wBAC7E,IAAI;IAAAA,eAAA,mBACT,IAAI;IAAAA,eAAA,gBACP,EAAE;IAAAA,eAAA,kBAEgB,CACxB,CAAC,EAAE,EAAE,aAAa,EAAE,qEAAqE,CAAC,EAC1F,CAAC,GAAG,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAC3C;IAAAA,eAAA,oBAEW,CACV;MAAEwB,IAAI,EAAE,QAAQ;MAAEsF,WAAW,EAAE;IAA2E,CAAC,CAC5G;EAEwC;EAEzC,MAAMlE,MAAMA,CAAC,CAACoE,KAAK,CAAW,EAAE9D,KAAwB,EAAE;IACxD,MAAM+D,QAAQ,GAAG,MAAM,IAAAC,2BAAY,EAAC,IAAI,CAAClE,MAAM,EAAEgE,KAAK,EAAE9D,KAAK,EAAE;MAC7DmI,aAAa,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC;MACvDC,UAAU,EAAE;IACd,CAAC,CAAC;IACF,IAAI,OAAO,IAAIrE,QAAQ,EAAE,OAAO7E,gBAAK,CAACG,GAAG,CAAC0E,QAAQ,CAACE,KAAK,CAAC;IAEzD,MAAMoE,MAAM,GAAG,MAAM,IAAI,CAACvI,MAAM,CAAC0I,OAAO,CAACzE,QAAQ,CAAC1C,EAAE,CAAC;IACrD,IAAI,CAACgH,MAAM,EAAE;MACX,OAAOnJ,gBAAK,CAACG,GAAG,CAAC,uBAAuB0E,QAAQ,CAAC1C,EAAE,uDAAuD,CAAC;IAC7G;IACA,OAAOnC,gBAAK,CAACC,KAAK,CAAC,6BAA6B4E,QAAQ,CAAC1C,EAAE,IAAI,CAAC;EAClE;EAEA,MAAMe,IAAIA,CAAC,CAAC0B,KAAK,CAAW,EAAE9D,KAAwB,EAAE;IACtD,MAAM+D,QAAQ,GAAG,MAAM,IAAAC,2BAAY,EAAC,IAAI,CAAClE,MAAM,EAAEgE,KAAK,EAAE9D,KAAK,EAAE;MAC7DmI,aAAa,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC;MACvDC,UAAU,EAAE;IACd,CAAC,CAAC;IACF,IAAI,OAAO,IAAIrE,QAAQ,EAAE,OAAO;MAAEE,KAAK,EAAEF,QAAQ,CAACE;IAAM,CAAC;IACzD,MAAMoE,MAAM,GAAG,MAAM,IAAI,CAACvI,MAAM,CAAC0I,OAAO,CAACzE,QAAQ,CAAC1C,EAAE,CAAC;IACrD,OAAO;MAAE3C,GAAG,EAAE2J;IAAO,CAAC;EACxB;AACF;AAACzI,OAAA,CAAA2I,aAAA,GAAAA,aAAA;AAED,SAAS5G,UAAUA,CAAC8G,OAAgB,EAAU;EAC5C,IAAI,CAACA,OAAO,EAAE,OAAO,GAAG;EACxB,IAAI;IACF,OAAO,IAAIlE,IAAI,CAACkE,OAAO,CAAC,CAACjE,cAAc,CAAC,CAAC;EAC3C,CAAC,CAAC,MAAM;IACN,OAAOiE,OAAO;EAChB;AACF;AAEA,SAAS5G,cAAcA,CAACD,SAAkB,EAAEE,UAAmB,EAAU;EACvE,IAAI,CAACF,SAAS,EAAE,OAAO,GAAG;EAC1B,MAAM8G,KAAK,GAAG,IAAInE,IAAI,CAAC3C,SAAS,CAAC,CAAC+G,OAAO,CAAC,CAAC;EAC3C,MAAMC,GAAG,GAAG9G,UAAU,GAAG,IAAIyC,IAAI,CAACzC,UAAU,CAAC,CAAC6G,OAAO,CAAC,CAAC,GAAGpE,IAAI,CAACsE,GAAG,CAAC,CAAC;EACpE,MAAMC,EAAE,GAAGF,GAAG,GAAGF,KAAK;EACtB,IAAII,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG;EACtB,MAAMC,OAAO,GAAG5F,IAAI,CAAC6F,KAAK,CAACF,EAAE,GAAG,IAAI,CAAC;EACrC,IAAIC,OAAO,GAAG,EAAE,EAAE,OAAO,GAAGA,OAAO,GAAG;EACtC,MAAME,OAAO,GAAG9F,IAAI,CAAC6F,KAAK,CAACD,OAAO,GAAG,EAAE,CAAC;EACxC,MAAMG,gBAAgB,GAAGH,OAAO,GAAG,EAAE;EACrC,IAAIE,OAAO,GAAG,EAAE,EAAE,OAAO,GAAGA,OAAO,KAAKC,gBAAgB,GAAG;EAC3D,MAAMC,KAAK,GAAGhG,IAAI,CAAC6F,KAAK,CAACC,OAAO,GAAG,EAAE,CAAC;EACtC,MAAMG,gBAAgB,GAAGH,OAAO,GAAG,EAAE;EACrC,OAAO,GAAGE,KAAK,KAAKC,gBAAgB,GAAG;AACzC;AAEA,SAAS7H,kBAAkBA,CAACC,MAAe,EAAU;EACnD,IAAI,CAACA,MAAM,EAAE,OAAO,GAAG;EACvB,OAAOA,MAAM,CAAC6H,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;AACpC;AAEA,SAAS/H,QAAQA,CAACgI,GAAW,EAAElG,GAAW,EAAU;EAClD,IAAIkG,GAAG,CAAClJ,MAAM,IAAIgD,GAAG,EAAE,OAAOkG,GAAG;EACjC,OAAO,GAAGA,GAAG,CAACC,SAAS,CAAC,CAAC,EAAEnG,GAAG,GAAG,CAAC,CAAC,GAAG;AACxC","ignoreList":[]}
1
+ {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_cliTable","_cli","_bitError","_laneId","_rippleUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","lastExportMatchesTarget","last","targetLane","lastLaneStr","lane","scope","name","undefined","lastExportHeader","lastExport","job","age","formatAge","timestamp","target","phase","status","toUpperCase","chalk","green","isFailedPhase","red","gray","colorPhase","RippleCmd","constructor","report","code","exports","RippleListCmd","ripple","args","flags","jobs","ownerUsed","getFilteredJobs","length","hint","tip","yellow","table","Table","head","cyan","chars","top","bottom","left","mid","right","middle","style","push","id","truncate","simulation","formatHint","getScopeFromLaneId","laneId","user","username","formatDate","startedAt","formatDuration","finishedAt","header","toString","filter","Boolean","join","json","requestedLimit","limit","parseInt","isFinite","Error","filters","all","owner","getDefaultOwner","owners","lanes","scopes","needsClientFilter","fetchLimit","Math","max","listJobs","userFilter","toLowerCase","j","includes","slice","RippleLogCmd","description","resolveJob","jobId","resolved","resolveJobId","error","source","getJob","lines","bold","displayName","Date","toLocaleString","jobUrl","getJobUrl","component","appendComponentDetail","appendComponentList","componentId","summary","getComponentBuildSummary","tasks","task","startTime","warnings","ciNodes","getCiGraphNodes","totalComponents","reduce","sum","n","componentIds","shown","node","compId","icon","componentBuild","RippleErrorsCmd","getErrors","getCurrentLaneId","failedNodes","succeededNodes","otherNodes","failedComponents","flatMap","blockedComponents","containerNames","map","containerName","logMap","getContainerLogs","compList","logMessages","get","errorLines","log","extractErrorsFromLog","msg","clean","stripAnsi","test","succeededCount","containerLogs","messages","getLastExport","rippleJobs","slug","getJobBySlug","found","findLatestJobForLane","RippleRetryCmd","allowedPhases","actionVerb","result","retryJob","RippleStopCmd","stopJob","dateStr","start","getTime","end","now","ms","seconds","floor","minutes","remainingSeconds","hours","remainingMinutes","split","str","substring","splitList","items","item","trim","describeNetwork","network","parts","scopeIds","ownerIds","excludeScopeIds","RippleSimulateCmd","_args","defaultedToLaneScope","simulate","networkNote","formatSuccessSummary","formatItem","joinSections","url","resolveLaneId","currentLaneId","BitError","isCurrentLane","DEFAULT_LANE","defaultLaneError","parsed","LaneId","parse","err","message","isDefault","isCurrentLaneExported","excludeScopes","simulateLane"],"sources":["ripple.cmd.ts"],"sourcesContent":["import type { Command, CommandOptions } from '@teambit/cli';\nimport chalk from 'chalk';\nimport Table from 'cli-table';\nimport type { LastExportData } from '@teambit/export';\nimport { formatSuccessSummary, formatItem, formatHint, joinSections } from '@teambit/cli';\nimport { BitError } from '@teambit/bit-error';\nimport { LaneId, DEFAULT_LANE } from '@teambit/lane-id';\nimport type { RippleMain, RippleJob, CiGraphNode, SimulateNetwork } from './ripple.main.runtime';\nimport { colorPhase, isFailedPhase, stripAnsi, resolveJobId, formatAge } from './ripple-utils';\n\n/**\n * a last-export entry matches the target context when its saved lane equals the current lane\n * (or both are undefined / \"main\"). this prevents using a stale last-export from a different lane\n * after the user has switched lanes.\n */\nfunction lastExportMatchesTarget(last: LastExportData, targetLane: string | undefined): boolean {\n const lastLaneStr = last.lane ? `${last.lane.scope}/${last.lane.name}` : undefined;\n return lastLaneStr === targetLane;\n}\n\nfunction lastExportHeader(lastExport: LastExportData, job: { status?: { phase?: string } }): string {\n const age = formatAge(lastExport.timestamp);\n const target = lastExport.lane ? `lane \"${lastExport.lane.scope}/${lastExport.lane.name}\"` : 'main';\n const phase = job.status?.phase?.toUpperCase();\n if (phase === 'SUCCESS') {\n return chalk.green(`✓ Your last export (${age}) to ${target} succeeded.`);\n }\n if (isFailedPhase(phase)) {\n return chalk.red(`✗ Your last export (${age}) to ${target} failed.`);\n }\n return chalk.gray(`Your last export (${age}) to ${target} — status: ${colorPhase(phase)}.`);\n}\n\nexport class RippleCmd implements Command {\n name = 'ripple <sub-command>';\n description = 'manage Ripple CI jobs on bit.cloud';\n extendedDescription = 'view, retry, and manage Ripple CI jobs that build your components in the cloud after export.';\n group = 'collaborate';\n skipWorkspace = true;\n remoteOp = true;\n\n options: CommandOptions = [];\n commands: Command[] = [];\n\n async report() {\n return { code: 1, data: '[ripple] please specify a subcommand. See --help for available commands.' };\n }\n}\n\nexport class RippleListCmd implements Command {\n name = 'list';\n description = 'list recent Ripple CI jobs (filtered by workspace owner by default)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'all', 'show jobs from all owners, not just the workspace owner'],\n ['o', 'owner <owner>', 'filter by organization (default: detected from workspace defaultScope)'],\n ['s', 'scope <scope>', 'filter by scope (e.g. \"teambit.cloud\")'],\n ['', 'lane <lane>', 'filter by lane ID (e.g. \"scope/lane-name\")'],\n ['u', 'user <user>', 'filter by username'],\n ['', 'status <status>', 'filter by status (e.g. SUCCESS, FAILURE, RUNNING)'],\n ['l', 'limit <limit>', 'max number of jobs to show (default: 20)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs, ownerUsed } = await this.getFilteredJobs(flags);\n\n if (!jobs || jobs.length === 0) {\n let hint = '';\n if (flags.lane) hint = ` for lane \"${flags.lane}\"`;\n else if (flags.scope) hint = ` for scope \"${flags.scope}\"`;\n else if (ownerUsed) hint = ` for owner \"${ownerUsed}\"`;\n const tip = ownerUsed ? ' Use --all to see jobs from all owners.' : '';\n return chalk.yellow(`No Ripple CI jobs found${hint}.${tip}`);\n }\n\n const table = new Table({\n head: [\n chalk.cyan('Job ID'),\n chalk.cyan('Name'),\n chalk.cyan('Scope'),\n chalk.cyan('Status'),\n chalk.cyan('User'),\n chalk.cyan('Started'),\n chalk.cyan('Duration'),\n ],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n\n for (const job of jobs) {\n table.push([\n job.id,\n truncate(job.name || '-', 40) + (job.simulation ? formatHint(' (simulation)') : ''),\n getScopeFromLaneId(job.laneId),\n colorPhase(job.status?.phase),\n job.user?.username || '-',\n formatDate(job.status?.startedAt),\n formatDuration(job.status?.startedAt, job.status?.finishedAt),\n ]);\n }\n\n const header = ownerUsed ? chalk.gray(`showing jobs for owner \"${ownerUsed}\" (use --all for all jobs)`) : '';\n return [header, table.toString()].filter(Boolean).join('\\n');\n }\n\n async json(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs } = await this.getFilteredJobs(flags);\n return { jobs: jobs || [] };\n }\n\n private async getFilteredJobs(flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }): Promise<{ jobs: RippleJob[]; ownerUsed?: string }> {\n const requestedLimit = flags.limit ? parseInt(flags.limit, 10) : 20;\n if (!Number.isFinite(requestedLimit) || requestedLimit < 1) {\n throw new Error(`Invalid --limit value \"${flags.limit}\". Expected a positive integer.`);\n }\n\n // build server-side filters\n const filters: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string } = {};\n\n // determine owner for default filtering (skip when --lane or --scope is given explicitly)\n let ownerUsed: string | undefined;\n if (!flags.all && !flags.lane && !flags.scope) {\n ownerUsed = flags.owner || this.ripple.getDefaultOwner();\n } else if (flags.owner) {\n ownerUsed = flags.owner;\n }\n\n if (ownerUsed) filters.owners = [ownerUsed];\n if (flags.lane) filters.lanes = [flags.lane];\n if (flags.scope) filters.scopes = [flags.scope];\n if (flags.status) filters.status = flags.status.toUpperCase();\n\n // user filter is not supported server-side, so overfetch if needed\n const needsClientFilter = !!flags.user;\n const fetchLimit = needsClientFilter ? Math.max(requestedLimit * 5, 100) : requestedLimit;\n let jobs = await this.ripple.listJobs({ filters, limit: fetchLimit });\n\n // apply client-side filters for fields not supported by FilterOptions\n if (flags.user) {\n const userFilter = flags.user.toLowerCase();\n jobs = jobs.filter((j) => j.user?.username?.toLowerCase().includes(userFilter));\n }\n\n jobs = jobs.slice(0, requestedLimit);\n\n return { jobs, ownerUsed };\n }\n}\n\nexport class RippleLogCmd implements Command {\n name = 'log [job-id]';\n description =\n 'show job details and component build task summaries (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['c', 'component <component>', 'show build tasks for a specific component (full component ID)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n private async resolveJob(jobId: string | undefined, flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags);\n if ('error' in resolved) return { job: null, error: resolved.error, source: undefined, lastExport: undefined };\n // when resolved from last-export, the resolver already fetched the full job — reuse it\n const job = resolved.job ?? (await this.ripple.getJob(resolved.id));\n return { job, error: undefined, source: resolved.source, lastExport: resolved.lastExport };\n }\n\n async report([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, error, source, lastExport } = await this.resolveJob(jobId, flags);\n if (!job) {\n if (jobId) return chalk.red(`Job \"${jobId}\" not found.`);\n return chalk.red(error || 'Could not find a Ripple CI job.');\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold('Job Details'));\n lines.push(` ${chalk.cyan('ID:')} ${job.id}`);\n if (job.name) lines.push(` ${chalk.cyan('Name:')} ${job.name}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n if (job.user?.displayName)\n lines.push(` ${chalk.cyan('User:')} ${job.user.displayName} (${job.user.username})`);\n if (job.status?.startedAt)\n lines.push(` ${chalk.cyan('Started:')} ${new Date(job.status.startedAt).toLocaleString()}`);\n if (job.status?.finishedAt)\n lines.push(` ${chalk.cyan('Finished:')} ${new Date(job.status.finishedAt).toLocaleString()}`);\n const jobUrl = this.ripple.getJobUrl(job);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n\n if (flags.component) {\n await this.appendComponentDetail(lines, job.id, flags.component);\n } else {\n this.appendComponentList(lines, job);\n }\n\n return lines.join('\\n');\n }\n\n private async appendComponentDetail(lines: string[], jobId: string, componentId: string) {\n const summary = await this.ripple.getComponentBuildSummary(jobId, componentId);\n if (!summary) {\n lines.push('');\n lines.push(chalk.yellow(`No build summary found for component \"${componentId}\" in this job.`));\n return;\n }\n lines.push('');\n lines.push(chalk.bold(`Build Tasks for ${summary.name || componentId}`));\n if (!summary.tasks || summary.tasks.length === 0) {\n lines.push(chalk.gray(' No build tasks found.'));\n return;\n }\n const table = new Table({\n head: [chalk.cyan('Task'), chalk.cyan('Status'), chalk.cyan('Started'), chalk.cyan('Warnings')],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n for (const task of summary.tasks) {\n table.push([\n task.name || '-',\n colorPhase(task.status?.status),\n task.startTime ? new Date(task.startTime).toLocaleString() : '-',\n task.status?.warnings ? chalk.yellow(String(task.status.warnings)) : '0',\n ]);\n }\n lines.push(table.toString());\n }\n\n private appendComponentList(lines: string[], job: { ciGraph?: string }) {\n const ciNodes = this.ripple.getCiGraphNodes(job);\n if (ciNodes.length === 0) return;\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.bold(`Components (${totalComponents})`));\n lines.push(chalk.gray(' Use --component <id> to see build tasks for a specific component'));\n let shown = 0;\n for (const node of ciNodes) {\n if (shown >= 30) {\n lines.push(chalk.gray(` ... and ${totalComponents - shown} more`));\n break;\n }\n for (const compId of node.componentIds) {\n if (shown >= 30) break;\n const icon = isFailedPhase(node.phase)\n ? chalk.red('✗')\n : node.phase === 'SUCCESS'\n ? chalk.green('✓')\n : chalk.yellow('○');\n lines.push(` ${icon} ${compId}`);\n shown++;\n }\n }\n }\n\n async json([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, source, lastExport } = await this.resolveJob(jobId, flags);\n if (flags.component && job) {\n const summary = await this.ripple.getComponentBuildSummary(job.id, flags.component);\n return { job, componentBuild: summary, source, lastExport };\n }\n return { job, source, lastExport };\n }\n}\n\nexport class RippleErrorsCmd implements Command {\n name = 'errors [job-id]';\n description = 'show build errors for a Ripple CI job (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['', 'log', 'show full build log for failed containers (not just the error summary)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n\n if (!job) {\n if (jobId) {\n return chalk.red(`Job \"${jobId}\" not found.`);\n }\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (laneId) {\n return chalk.red(`No Ripple CI job found for lane \"${laneId}\".`);\n }\n return chalk.red(\n error ||\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.'\n );\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold(`Ripple CI Errors — ${job.name || job.id}`));\n lines.push(` ${chalk.cyan('Job ID:')} ${job.id}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n lines.push(` ${chalk.cyan('URL:')} ${this.ripple.getJobUrl(job)}`);\n\n if (ciNodes.length === 0) {\n lines.push('');\n lines.push(chalk.yellow('Could not determine which components are in this job.'));\n return lines.join('\\n');\n }\n\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const succeededNodes = ciNodes.filter((n) => n.phase === 'SUCCESS');\n const otherNodes = ciNodes.filter((n) => !isFailedPhase(n.phase) && n.phase !== 'SUCCESS');\n\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n const failedComponents = failedNodes.flatMap((n) => n.componentIds);\n const blockedComponents = otherNodes.flatMap((n) => n.componentIds);\n\n if (failedComponents.length === 0) {\n if (job.status?.phase?.toUpperCase() === 'FAILURE') {\n lines.push('');\n lines.push(\n chalk.yellow(`${totalComponents} component(s) in this job — no individual component failures found.`)\n );\n lines.push(chalk.yellow('The failure may be in a pipeline-level step. Check the Ripple CI URL above.'));\n } else {\n lines.push('');\n lines.push(chalk.green(`All ${totalComponents} component(s) built successfully.`));\n }\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(chalk.red.bold(`${failedComponents.length} component(s) with build failures:`));\n\n // fetch all build logs in parallel\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n\n for (const node of failedNodes) {\n const compList = node.componentIds.join(', ');\n lines.push('');\n lines.push(chalk.bold(` ${compList}`));\n\n const logMessages = logMap.get(node.containerName);\n if (logMessages && logMessages.length > 0) {\n const errorLines = flags.log ? logMessages : this.ripple.extractErrorsFromLog(logMessages);\n if (errorLines.length > 0) {\n for (const msg of errorLines) {\n const clean = stripAnsi(msg);\n // skip stack trace lines (noisy) unless --log is used\n if (!flags.log && /^\\s+at\\s/.test(clean)) continue;\n if (clean.length > 0) {\n lines.push(` ${clean}`);\n }\n }\n } else {\n lines.push(chalk.gray(' No error details found in build log.'));\n }\n } else {\n lines.push(chalk.gray(' Build log not available.'));\n }\n }\n\n if (blockedComponents.length > 0) {\n lines.push('');\n lines.push(chalk.yellow(`${blockedComponents.length} component(s) not built (blocked by failure):`));\n for (const compId of blockedComponents) {\n lines.push(` ${chalk.yellow('○')} ${compId}`);\n }\n }\n\n if (succeededNodes.length > 0) {\n const succeededCount = succeededNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.green(`${succeededCount} component(s) built successfully.`));\n }\n\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n if (!job) {\n return { error: error || 'No job found', job: null, ciNodes: [], containerLogs: {}, source, lastExport };\n }\n\n // fetch error logs for failed containers in parallel\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n const containerLogs: Record<string, string[]> = {};\n for (const [name, messages] of logMap) {\n containerLogs[name] = flags.log ? messages : this.ripple.extractErrorsFromLog(messages);\n }\n\n return { job, ciNodes, containerLogs, source, lastExport };\n }\n\n private async getErrors(\n jobId: string | undefined,\n flags: { lane?: string }\n ): Promise<{\n job: any;\n ciNodes: CiGraphNode[];\n source?: 'arg' | 'lane' | 'last-export';\n lastExport?: LastExportData;\n error?: string;\n }> {\n let job: any = null;\n let source: 'arg' | 'lane' | 'last-export' | undefined;\n let lastExport: LastExportData | undefined;\n\n if (jobId) {\n job = await this.ripple.getJob(jobId);\n source = 'arg';\n } else {\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n const last = await this.ripple.getLastExport();\n if (last?.rippleJobs?.length && lastExportMatchesTarget(last, laneId)) {\n const slug = last.rippleJobs[last.rippleJobs.length - 1];\n job = await this.ripple.getJobBySlug(slug);\n source = 'last-export';\n lastExport = last;\n if (!job) {\n return {\n job: null,\n ciNodes: [],\n source: 'last-export',\n lastExport: last,\n error: `Could not find Ripple CI job for your last export \"${slug}\".`,\n };\n }\n } else if (laneId) {\n const found = await this.ripple.findLatestJobForLane(laneId);\n job = found ? await this.ripple.getJob(found.id) : null;\n source = 'lane';\n }\n }\n\n if (!job) {\n return { job: null, ciNodes: [], source, lastExport };\n }\n\n // use ciGraph (internal graph) for job-specific build status per container/component\n const ciNodes = this.ripple.getCiGraphNodes(job);\n\n return { job, ciNodes, source, lastExport };\n }\n}\n\nexport class RippleRetryCmd implements Command {\n name = 'retry [job-id]';\n description = 'retry a failed Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to retry (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.retryJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to retry job \"${resolved.id}\". Make sure the job exists and has failed.`);\n }\n const lines: string[] = [];\n lines.push(chalk.green(`Successfully retried job \"${resolved.id}\".`));\n if (result.id) lines.push(` ${chalk.cyan('New Job ID:')} ${result.id}`);\n if (result.status?.phase) lines.push(` ${chalk.cyan('Status:')} ${result.status.phase}`);\n const jobUrl = this.ripple.getJobUrl(result);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.retryJob(resolved.id);\n return { job: result };\n }\n}\n\nexport class RippleStopCmd implements Command {\n name = 'stop [job-id]';\n description = 'stop a running Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to stop (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.stopJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to stop job \"${resolved.id}\". Make sure the job exists and is currently running.`);\n }\n return chalk.green(`Successfully stopped job \"${resolved.id}\".`);\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.stopJob(resolved.id);\n return { job: result };\n }\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n return new Date(dateStr).toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction formatDuration(startedAt?: string, finishedAt?: string): string {\n if (!startedAt) return '-';\n const start = new Date(startedAt).getTime();\n const end = finishedAt ? new Date(finishedAt).getTime() : Date.now();\n const ms = end - start;\n if (ms < 0) return '-';\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n\nfunction getScopeFromLaneId(laneId?: string): string {\n if (!laneId) return '-';\n return laneId.split('/')[0] || '-';\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.substring(0, max - 1)}…`;\n}\n\ntype SimulateFlags = {\n lane?: string;\n scopes?: string;\n owners?: string;\n excludeScopes?: string;\n};\n\nfunction splitList(value?: string): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n return items.length ? items : undefined;\n}\n\nfunction describeNetwork(network: SimulateNetwork): string {\n const parts = [\n network.scopeIds?.length ? `scopes ${network.scopeIds.join(', ')}` : '',\n network.ownerIds?.length ? `owners ${network.ownerIds.join(', ')}` : '',\n network.excludeScopeIds?.length ? `excluding scopes ${network.excludeScopeIds.join(', ')}` : '',\n ].filter(Boolean);\n return parts.join('; ');\n}\n\ntype SimulateResult = {\n laneId: string;\n job: RippleJob;\n network: SimulateNetwork;\n /** no network flag was given, so the search was limited to the lane's own scope */\n defaultedToLaneScope: boolean;\n};\n\nexport class RippleSimulateCmd implements Command {\n name = 'simulate';\n description = 'start a Ripple CI simulation for a lane to reveal which dependents break (auto-detects current lane)';\n extendedDescription = `a simulation builds the dependents of the lane components against the lane heads on bit.cloud,\nwithout merging or publishing anything. it's the way to get dependent coverage for a change before the lane is merged.\nthe simulation runs against the lane as it exists on bit.cloud, so export the lane first.\nsimulations are heavy jobs and are billed as such. run them at review time, not on every change.\ndependents are searched in the lane's own scope by default. widen or narrow the search with --scopes, --owners and\n--exclude-scopes.\nfollow the job with \"bit ripple log\". once it finishes, \"bit ripple errors\" shows what broke. both take the job id\nprinted when the simulation starts.`;\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to simulate, e.g. \"scope/lane-name\" (default: detected from .bitmap)'],\n ['', 'scopes <scopes>', 'comma-separated scopes to search for dependents in (default: the lane scope)'],\n ['', 'owners <owners>', 'comma-separated owners (organizations) to search for dependents in'],\n ['', 'exclude-scopes <scopes>', 'comma-separated scopes to exclude from the dependents search'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report(_args: [], flags: SimulateFlags) {\n const { laneId, job, network, defaultedToLaneScope } = await this.simulate(flags);\n const networkNote = defaultedToLaneScope ? ' (default: the lane scope. use --scopes/--owners to widen)' : '';\n const lines = [\n formatSuccessSummary(`started a Ripple CI simulation for lane \"${laneId}\".`),\n formatItem(`job id: ${job.id || '(not assigned yet)'}`),\n job.status?.phase ? formatItem(`status: ${colorPhase(job.status.phase)}`) : '',\n formatItem(`network: ${describeNetwork(network)}${networkNote}`),\n formatItem(`url: ${this.ripple.getJobUrl(job)}`),\n ].filter(Boolean);\n const hint = job.id\n ? formatHint(\n `follow the job with \"bit ripple log ${job.id}\". once it finishes, run \"bit ripple errors ${job.id}\" to see what broke.`\n )\n : formatHint(\n `run \"bit ripple list --lane ${laneId}\" to get the job id, then \"bit ripple log <job-id>\" to follow it.`\n );\n return joinSections([lines.join('\\n'), hint]);\n }\n\n async json(_args: [], flags: SimulateFlags) {\n const { laneId, job, network } = await this.simulate(flags);\n return { laneId, job, network, url: this.ripple.getJobUrl(job) };\n }\n\n /**\n * the lane to simulate: `--lane` when given (validated and normalized), otherwise the current lane.\n */\n private resolveLaneId(flags: SimulateFlags): { laneId: string; isCurrentLane: boolean } {\n const currentLaneId = this.ripple.getCurrentLaneId();\n if (!flags.lane) {\n if (!currentLaneId) {\n throw new BitError('a simulation requires a lane. switch to a lane or pass --lane <scope/lane-name>');\n }\n return { laneId: currentLaneId, isCurrentLane: true };\n }\n if (flags.lane === DEFAULT_LANE) throw new BitError(defaultLaneError(flags.lane));\n let parsed: LaneId;\n try {\n parsed = LaneId.parse(flags.lane);\n } catch (err: any) {\n throw new BitError(`invalid --lane \"${flags.lane}\", expected \"scope/lane-name\". ${err.message}`);\n }\n if (parsed.isDefault()) throw new BitError(defaultLaneError(flags.lane));\n const laneId = parsed.toString();\n return { laneId, isCurrentLane: laneId === currentLaneId };\n }\n\n private async simulate(flags: SimulateFlags): Promise<SimulateResult> {\n const { laneId, isCurrentLane } = this.resolveLaneId(flags);\n if (isCurrentLane && this.ripple.isCurrentLaneExported() === false) {\n throw new BitError(\n `lane \"${laneId}\" was never exported. a simulation runs against the lane on bit.cloud, run \"bit export\" first`\n );\n }\n const network: SimulateNetwork = {\n scopeIds: splitList(flags.scopes),\n ownerIds: splitList(flags.owners),\n excludeScopeIds: splitList(flags.excludeScopes),\n };\n // Ripple CI can't resolve the dependents graph without a positive search base (scopes or owners),\n // so search the lane's own scope by default. exclusions alone only narrow, they don't provide a base.\n const defaultedToLaneScope = !network.scopeIds?.length && !network.ownerIds?.length;\n if (defaultedToLaneScope) network.scopeIds = [LaneId.parse(laneId).scope];\n const job = await this.ripple.simulateLane(laneId, network);\n if (!job) throw new BitError(`failed to start a simulation for lane \"${laneId}\"`);\n return { laneId, job, network, defaultedToLaneScope };\n }\n}\n\nfunction defaultLaneError(lane: string): string {\n return `\"${lane}\" is the default lane. a simulation needs a lane whose changes are tested against their dependents on main`;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -27,6 +27,15 @@ export type RippleJobFull = RippleJob & {
27
27
  ciGraph?: string;
28
28
  ciComponentGraph?: string;
29
29
  };
30
+ /**
31
+ * where Ripple CI looks for dependents of the lane components when simulating. the server can't resolve
32
+ * the dependents graph without a positive search base, so the caller always sets `scopeIds` or `ownerIds`.
33
+ */
34
+ export type SimulateNetwork = {
35
+ scopeIds?: string[];
36
+ ownerIds?: string[];
37
+ excludeScopeIds?: string[];
38
+ };
30
39
  export type BuildTaskStatus = {
31
40
  status?: string;
32
41
  warnings?: number;
@@ -60,7 +69,24 @@ export declare class RippleMain {
60
69
  private static GET_COMPONENT_BUILD_SUMMARY;
61
70
  private static RETRY_JOB;
62
71
  private static STOP_JOB;
72
+ private static SIMULATE_LANE;
73
+ /**
74
+ * the same lookup as GET_JOB_BY_SLUG without the two CI graph blobs, which the simulate flow never reads.
75
+ * a simulation is a wide dependents fan-out, so those blobs are unbounded and the poll can run 3 times.
76
+ */
77
+ private static GET_JOB_BY_SLUG_MINIMAL;
78
+ /** how many times to look the persisted job up, and the backoff between the attempts */
79
+ private static JOB_LOOKUP_ATTEMPTS;
80
+ private static JOB_LOOKUP_DELAY_MS;
63
81
  private ensureAuthenticated;
82
+ /**
83
+ * every Ripple CI GraphQL request goes through this, so it honors the configured proxy, CA and network
84
+ * settings, the same way the cloud aspect reaches bit.cloud. kept as a field so tests can replace it:
85
+ * the agent-wrapped fetcher doesn't go through the global fetch.
86
+ * the log-streaming endpoint (`getContainerLog`) deliberately stays on the global fetch - it reads the
87
+ * response as a web stream (`body.getReader()`), which the agent-wrapped node-fetch response doesn't have.
88
+ */
89
+ private fetcher;
64
90
  private fetchRippleGQL;
65
91
  listJobs(opts: {
66
92
  limit?: number;
@@ -99,6 +125,26 @@ export declare class RippleMain {
99
125
  extractErrorsFromLog(messages: string[]): string[];
100
126
  retryJob(jobId: string): Promise<RippleJob | null>;
101
127
  stopJob(jobId: string): Promise<RippleJob | null>;
128
+ /**
129
+ * start a simulation job for a lane. Ripple CI builds the dependents of the lane components (searched in
130
+ * the given network of scopes/owners) against the lane heads, without merging or publishing anything.
131
+ * the schema also accepts an `incrementStrategy`, but a simulation publishes nothing so it's not exposed
132
+ * and the server default is used.
133
+ * `options.network` is always sent (empty when no filter is given): the schema marks `options` as
134
+ * optional, but the resolver reads `options.network` unconditionally and fails when it's omitted.
135
+ */
136
+ simulateLane(laneId: string, network?: SimulateNetwork): Promise<RippleJob | null>;
137
+ /**
138
+ * poll for the persisted job: the simulate mutation responds before the job is written, so a single
139
+ * immediate lookup can still come back empty. the delay doubles between the attempts, to cover more
140
+ * server lag with the same number of requests. returns null once the budget is spent - the simulation is
141
+ * already running by then, so the caller reports it without an id rather than failing the command.
142
+ */
143
+ private getPersistedJobBySlug;
144
+ /**
145
+ * whether the current lane was exported at least once. undefined when not on a lane / no workspace.
146
+ */
147
+ isCurrentLaneExported(): boolean | undefined;
102
148
  /**
103
149
  * detect the current lane from the workspace.
104
150
  * returns the laneId in "scope/lane-name" format, or undefined if not on a lane.