@nathapp/nax 0.68.6 → 0.68.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/nax.js +232 -1768
  2. package/package.json +1 -1
package/dist/nax.js CHANGED
@@ -17011,7 +17011,8 @@ var init_schemas_infra = __esm(() => {
17011
17011
  decomposeTimeoutSeconds: exports_external.number().int().min(30).max(1800).optional(),
17012
17012
  mode: exports_external.enum(["single", "debate", "pipeline", "refine"]).optional(),
17013
17013
  citationThreshold: exports_external.number().min(0).max(1).default(0.5),
17014
- criticModel: ConfiguredModelSchema.default("fast")
17014
+ criticModel: ConfiguredModelSchema.default("fast"),
17015
+ specGuard: exports_external.boolean().default(false)
17015
17016
  });
17016
17017
  AcceptanceFixConfigSchema = exports_external.object({
17017
17018
  diagnoseModel: ConfiguredModelSchema.default("fast"),
@@ -17468,7 +17469,8 @@ var init_schemas3 = __esm(() => {
17468
17469
  outputPath: "spec.md",
17469
17470
  timeoutSeconds: 600,
17470
17471
  citationThreshold: 0.5,
17471
- criticModel: "fast"
17472
+ criticModel: "fast",
17473
+ specGuard: false
17472
17474
  }),
17473
17475
  acceptance: AcceptanceConfigSchema.default({
17474
17476
  enabled: true,
@@ -18054,14 +18056,14 @@ class Logger {
18054
18056
  filePath;
18055
18057
  useChalk;
18056
18058
  formatterMode;
18057
- headless;
18059
+ suppressConsole;
18058
18060
  writeQueueTail = Promise.resolve();
18059
18061
  constructor(options) {
18060
18062
  this.level = options.level;
18061
18063
  this.filePath = options.filePath;
18062
18064
  this.useChalk = options.useChalk ?? true;
18063
18065
  this.formatterMode = options.formatterMode;
18064
- this.headless = options.headless ?? false;
18066
+ this.suppressConsole = options.suppressConsole ?? false;
18065
18067
  if (this.filePath) {
18066
18068
  this.initFileDirectory();
18067
18069
  }
@@ -18098,9 +18100,9 @@ class Logger {
18098
18100
  ...sessionRole && { sessionRole },
18099
18101
  ...strippedData && { data: strippedData }
18100
18102
  };
18101
- if (this.shouldLog(level)) {
18103
+ if (this.shouldLog(level) && !this.suppressConsole) {
18102
18104
  let consoleOutput = null;
18103
- if (this.headless && this.formatterMode) {
18105
+ if (this.formatterMode) {
18104
18106
  const formatterOptions = {
18105
18107
  mode: this.formatterMode,
18106
18108
  useColor: this.useChalk
@@ -19023,7 +19025,7 @@ function reshapeSelector(name, fn) {
19023
19025
  var reviewConfigSelector, planConfigSelector, decomposeConfigSelector, rectifyConfigSelector, acceptanceConfigSelector, acceptanceFixConfigSelector, acceptanceGenConfigSelector, tddConfigSelector, debateConfigSelector, routingConfigSelector, verifyConfigSelector, rectificationGateConfigSelector, agentConfigSelector, agentManagerConfigSelector, interactionConfigSelector, precheckConfigSelector, qualityConfigSelector, autofixConfigSelector, executionGatesConfigSelector, testPatternConfigSelector, contextConfigSelector, contextToolRuntimeConfigSelector, promptLoaderConfigSelector, llmRoutingConfigSelector;
19024
19026
  var init_selectors = __esm(() => {
19025
19027
  reviewConfigSelector = pickSelector("review", "review", "debate", "models", "execution", "project", "quality", "agent");
19026
- planConfigSelector = pickSelector("plan", "plan", "debate");
19028
+ planConfigSelector = pickSelector("plan", "plan", "debate", "agent", "project");
19027
19029
  decomposeConfigSelector = pickSelector("decompose", "plan", "agent");
19028
19030
  rectifyConfigSelector = pickSelector("rectify", "execution");
19029
19031
  acceptanceConfigSelector = pickSelector("acceptance", "acceptance");
@@ -27572,6 +27574,40 @@ var init_verbatim_fidelity = __esm(() => {
27572
27574
  HEADING = /^\s*#/;
27573
27575
  });
27574
27576
 
27577
+ // src/prd/spec-drift.ts
27578
+ function leadingTagGroup2(ac) {
27579
+ return ac.match(LEADING_TAG_GROUP2)?.[1] ?? null;
27580
+ }
27581
+ function hasDeprecatedTag(ac) {
27582
+ const tags = leadingTagGroup2(ac);
27583
+ return tags !== null && DEPRECATED_TAG.test(tags);
27584
+ }
27585
+ function hasShellPattern(ac) {
27586
+ return SHELL_PIPE.test(ac) || SHELL_WC.test(ac) || SHELL_GREP_FLAG.test(ac);
27587
+ }
27588
+ function findSpecDriftViolations(prd) {
27589
+ const violations = [];
27590
+ for (const story of prd.userStories ?? []) {
27591
+ for (let i = 0;i < (story.acceptanceCriteria ?? []).length; i++) {
27592
+ const ac = story.acceptanceCriteria[i];
27593
+ if (hasDeprecatedTag(ac)) {
27594
+ violations.push({ storyId: story.id, acIndex: i, ac, reason: "deprecated-tag" });
27595
+ } else if (hasShellPattern(ac)) {
27596
+ violations.push({ storyId: story.id, acIndex: i, ac, reason: "shell-pattern" });
27597
+ }
27598
+ }
27599
+ }
27600
+ return violations;
27601
+ }
27602
+ var LEADING_TAG_GROUP2, DEPRECATED_TAG, SHELL_PIPE, SHELL_WC, SHELL_GREP_FLAG;
27603
+ var init_spec_drift = __esm(() => {
27604
+ LEADING_TAG_GROUP2 = /^\s*(?:[-*]|\d+\.)?\s*((?:\[[a-z][a-z-]*\]\s*)+)/i;
27605
+ DEPRECATED_TAG = /\[(grep|file|verbatim)\]/i;
27606
+ SHELL_PIPE = /`[^`]*\b(grep|find|wc|awk|sed|sort|head|tail|xargs|cut|uniq)\b[^`]*\|[^`]*`/i;
27607
+ SHELL_WC = /`[^`]*\bwc\b[^`]*`/;
27608
+ SHELL_GREP_FLAG = /`[^`]*grep\s+-[a-z]/i;
27609
+ });
27610
+
27575
27611
  // src/prd/validate.ts
27576
27612
  function validateStoryId(id) {
27577
27613
  if (!id || id.length === 0) {
@@ -27977,6 +28013,7 @@ var PRD_MAX_FILE_SIZE;
27977
28013
  var init_prd = __esm(() => {
27978
28014
  init_json_file();
27979
28015
  init_verbatim_fidelity();
28016
+ init_spec_drift();
27980
28017
  init_schema2();
27981
28018
  PRD_MAX_FILE_SIZE = 5 * 1024 * 1024;
27982
28019
  });
@@ -34103,6 +34140,16 @@ function warnOnDroppedVerbatimAcs(prd, specContent, featureName) {
34103
34140
  getSafeLogger()?.warn("plan", "[verbatim] spec acceptance criteria dropped from PRD \u2014 run spec-review --prd before executing", { featureName, missingCount: missing.length, missing });
34104
34141
  }
34105
34142
  }
34143
+ function warnOnSpecDrift(prd, featureName) {
34144
+ const violations = findSpecDriftViolations(prd);
34145
+ if (violations.length > 0) {
34146
+ getSafeLogger()?.warn("plan", "spec-drift violations remain after specGuard repair \u2014 review PRD before executing", {
34147
+ featureName,
34148
+ violationCount: violations.length,
34149
+ violations
34150
+ });
34151
+ }
34152
+ }
34106
34153
  var init_verbatim_warn = __esm(() => {
34107
34154
  init_logger2();
34108
34155
  init_prd();
@@ -34223,6 +34270,20 @@ async function readMissingVerbatimAcs(input) {
34223
34270
  return [];
34224
34271
  }
34225
34272
  }
34273
+ async function readSpecDriftViolations(input) {
34274
+ const content = await _planRefineDeps.readFile(input.outputPath);
34275
+ if (!content)
34276
+ return [];
34277
+ try {
34278
+ const prd = validatePlanOutput(content, input.featureName, input.branchName);
34279
+ return findSpecDriftViolations(prd);
34280
+ } catch {
34281
+ getSafeLogger()?.debug("plan", "Skipped spec-drift check \u2014 draft PRD not yet parseable", {
34282
+ featureName: input.featureName
34283
+ });
34284
+ return [];
34285
+ }
34286
+ }
34226
34287
  var _planRefineDeps, NEGATIVE_PATH_TOKENS, planRefineOp;
34227
34288
  var init_plan_refine = __esm(() => {
34228
34289
  init_retry();
@@ -34306,8 +34367,9 @@ ${outputFormat}`,
34306
34367
  },
34307
34368
  async hopBody(initialPrompt, ctx) {
34308
34369
  const builder = new PlanPromptBuilder;
34370
+ const specGuard = ctx.input.specGuard ?? false;
34309
34371
  const turn1 = await ctx.sendWithParseRetry(initialPrompt);
34310
- const turn2 = await ctx.send(builder.buildRefineContinuation(ctx.input.outputPath));
34372
+ const turn2 = await ctx.send(builder.buildRefineContinuation(ctx.input.outputPath, specGuard));
34311
34373
  let totalCost = (turn1.estimatedCostUsd ?? 0) + (turn2.estimatedCostUsd ?? 0);
34312
34374
  let last = turn2;
34313
34375
  const missing = await readMissingVerbatimAcs(ctx.input);
@@ -34320,14 +34382,29 @@ ${outputFormat}`,
34320
34382
  totalCost += turn3.estimatedCostUsd ?? 0;
34321
34383
  last = turn3;
34322
34384
  }
34385
+ if (specGuard) {
34386
+ const drifted = await readSpecDriftViolations(ctx.input);
34387
+ if (drifted.length > 0) {
34388
+ getSafeLogger()?.info("plan", "specGuard: spec-drift violations found \u2014 issuing one repair turn", {
34389
+ featureName: ctx.input.featureName,
34390
+ violationCount: drifted.length
34391
+ });
34392
+ const turn4 = await ctx.send(builder.buildSpecDriftRepair(drifted, ctx.input.outputPath));
34393
+ totalCost += turn4.estimatedCostUsd ?? 0;
34394
+ last = turn4;
34395
+ }
34396
+ }
34323
34397
  return { ...last, estimatedCostUsd: totalCost };
34324
34398
  },
34325
34399
  parse(output, input) {
34326
34400
  return validatePlanOutput(output, input.featureName, input.branchName);
34327
34401
  },
34328
- verify: async (parsed, input, _ctx) => {
34402
+ verify: async (parsed, input, ctx) => {
34329
34403
  const validated = validateRefinedPrd(parsed);
34330
34404
  warnOnDroppedVerbatimAcs(validated, input.specContent, input.featureName);
34405
+ if (ctx.config.plan.specGuard) {
34406
+ warnOnSpecDrift(validated, input.featureName);
34407
+ }
34331
34408
  return validated;
34332
34409
  },
34333
34410
  recover: async (input, ctx) => {
@@ -35448,7 +35525,7 @@ function parseRefinementResponse(response, criteria) {
35448
35525
  try {
35449
35526
  const fromFence = extractJsonFromMarkdown(response);
35450
35527
  const cleaned = stripTrailingCommas(fromFence !== response ? fromFence : response);
35451
- const parsed = JSON.parse(cleaned);
35528
+ const parsed = recoverJsonArray(cleaned) ?? JSON.parse(cleaned);
35452
35529
  if (!Array.isArray(parsed)) {
35453
35530
  return fallbackCriteria(criteria);
35454
35531
  }
@@ -35468,11 +35545,33 @@ function refinementWouldFallback(response) {
35468
35545
  try {
35469
35546
  const fromFence = extractJsonFromMarkdown(response);
35470
35547
  const cleaned = stripTrailingCommas(fromFence !== response ? fromFence : response);
35471
- return !Array.isArray(JSON.parse(cleaned));
35548
+ const parsed = recoverJsonArray(cleaned) ?? JSON.parse(cleaned);
35549
+ return !Array.isArray(parsed);
35472
35550
  } catch {
35473
35551
  return true;
35474
35552
  }
35475
35553
  }
35554
+ function recoverJsonArray(text) {
35555
+ const trimmed = text.trim();
35556
+ if (!trimmed.startsWith("[") || trimmed.endsWith("]"))
35557
+ return null;
35558
+ try {
35559
+ const closed = stripTrailingCommas(`${trimmed}]`);
35560
+ const parsed = JSON.parse(closed);
35561
+ if (Array.isArray(parsed))
35562
+ return parsed;
35563
+ } catch {}
35564
+ const lastBrace = trimmed.lastIndexOf("}");
35565
+ if (lastBrace === -1)
35566
+ return null;
35567
+ try {
35568
+ const recovered = `${stripTrailingCommas(trimmed.slice(0, lastBrace + 1))}]`;
35569
+ const parsed = JSON.parse(recovered);
35570
+ if (Array.isArray(parsed))
35571
+ return parsed;
35572
+ } catch {}
35573
+ return null;
35574
+ }
35476
35575
  function fallbackCriteria(criteria, storyId = "") {
35477
35576
  return criteria.map((c) => ({
35478
35577
  original: c,
@@ -42075,7 +42174,13 @@ Please re-write the complete PRD JSON, ensuring every factual claim is cited wit
42075
42174
 
42076
42175
  Output ONLY the JSON object. Do not include markdown fences or explanation.`;
42077
42176
  }
42078
- buildRefineContinuation(outputFilePath) {
42177
+ buildRefineContinuation(outputFilePath, specGuard = false) {
42178
+ const specGuardItems = specGuard ? `
42179
+ #### orphan-acs
42180
+ Every acceptance criterion in the PRD must trace back to a requirement stated in the spec. An AC that introduces scope the spec never mentions \u2014 new enum values, new status codes, new config keys, extra validation rules, invented helper behaviour \u2014 is scope bleed from candidate-PRD merging. Delete it, or reduce it to exactly what the spec says.
42181
+
42182
+ #### no-behavior-degradation
42183
+ No acceptance criterion may use a deprecated verification tag (\`[grep]\`, \`[file]\`, \`[verbatim]\`) or contain a shell-command pattern (\`grep -\`, \`wc\`, \`|\` inside a backtick span). These signal a file-content check that the agent cannot implement as a runtime test. Rewrite any such AC as a behavioural assertion: what the function returns, throws, or emits \u2014 not what the source file contains.` : "";
42079
42184
  return `You are in the second turn of a refine pass. Assume this draft has flaws, and audit it adversarially before you trust it.
42080
42185
 
42081
42186
  Review the draft with a strict self-audit mindset. Re-read the codebase context and compare the PRD against it. Focus only on the issues below, then rewrite the PRD if needed.
@@ -42110,9 +42215,27 @@ Re-check routing.complexity and routing.testStrategy against the current codebas
42110
42215
  If a story changes existing behavior, extracts a shared helper, extends an existing function signature, or replaces a warning/stub path with real behavior, ensure there is at least one acceptance criterion protecting backward compatibility or proving the old placeholder behavior is gone.
42111
42216
 
42112
42217
  #### scope-consistency
42113
- Check each story's title, description, scope, contextFiles, and acceptance criteria for internal consistency. If the story says a file or command is in scope anywhere else, do not list it as out of scope. If the title or acceptance criteria clearly include CLI, output, tests, or helper extraction work, the Scope section must reflect that accurately.
42218
+ Check each story's title, description, scope, contextFiles, and acceptance criteria for internal consistency. If the story says a file or command is in scope anywhere else, do not list it as out of scope. If the title or acceptance criteria clearly include CLI, output, tests, or helper extraction work, the Scope section must reflect that accurately.${specGuardItems}
42114
42219
 
42115
42220
  Write the revised PRD to this file path: ${outputFilePath}
42221
+ Do not output the PRD in chat. After writing the file, reply with a brief text confirmation only.`;
42222
+ }
42223
+ buildSpecDriftRepair(violations, outputFilePath) {
42224
+ const list = violations.map((v) => `- ${v.storyId} AC[${v.acIndex}] (${v.reason}): ${v.ac}`).join(`
42225
+ `);
42226
+ return `Your PRD contains acceptance criteria that cannot be implemented as runtime tests \u2014 they use deprecated verification tags or shell-command patterns that describe file-content checks rather than observable behaviour. These must be rewritten.
42227
+
42228
+ Flagged acceptance criteria:
42229
+
42230
+ ${list}
42231
+
42232
+ For each one:
42233
+ - Replace the AC with a behavioural assertion: what the function, method, or CLI command returns, throws, logs, or emits \u2014 not what the source file contains.
42234
+ - Remove any deprecated tags (\`[grep]\`, \`[file]\`, \`[verbatim]\`) from the leading tag group. Replace with \`[unit]\`, \`[integration]\`, or \`[cli]\` as appropriate.
42235
+ - Remove any shell-command patterns (\`grep -\`, \`wc\`, pipe \`|\` inside backticks). Express the same invariant as an assertion on the runtime value.
42236
+ - Do not remove or weaken acceptance criteria that are already correct.
42237
+
42238
+ Write the corrected PRD to this file path: ${outputFilePath}
42116
42239
  Do not output the PRD in chat. After writing the file, reply with a brief text confirmation only.`;
42117
42240
  }
42118
42241
  buildVerbatimRepair(missingAcs, outputFilePath) {
@@ -45522,7 +45645,7 @@ function createRuntime(config2, workdir, opts) {
45522
45645
  }
45523
45646
  const configLoader = createConfigLoader(config2);
45524
45647
  const dispatchEvents = new DispatchEventBus;
45525
- const agentStreamEvents = new AgentStreamEventBus;
45648
+ const agentStreamEvents = opts?.agentStreamEvents ?? new AgentStreamEventBus;
45526
45649
  const projectKey = config2.name?.trim() || basename5(workdir);
45527
45650
  const outputDir = projectOutputDir(projectKey, config2.outputDir);
45528
45651
  const globalDir = globalOutputDir();
@@ -51068,7 +51191,7 @@ async function collectStoryMetrics(ctx, storyStartTime) {
51068
51191
  attempts,
51069
51192
  finalTier,
51070
51193
  success: agentResult?.success || false,
51071
- cost: (ctx.accumulatedAttemptCost ?? 0) + (agentResult?.estimatedCostUsd || 0),
51194
+ cost: ctx.runtime.costAggregator.byStory()[story.id]?.totalCostUsd ?? 0,
51072
51195
  durationMs: agentResult?.durationMs || 0,
51073
51196
  firstPassSuccess,
51074
51197
  startedAt: storyStartTime,
@@ -51089,9 +51212,9 @@ function collectBatchMetrics(ctx, storyStartTime) {
51089
51212
  const stories = ctx.stories;
51090
51213
  const routing = ctx.routing;
51091
51214
  const agentResult = ctx.agentResult;
51092
- const totalCost = agentResult?.estimatedCostUsd || 0;
51215
+ const batchTotal = ctx.runtime.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? 0;
51093
51216
  const totalDuration = agentResult?.durationMs || 0;
51094
- const costPerStory = totalCost / stories.length;
51217
+ const costPerStory = batchTotal / stories.length;
51095
51218
  const durationPerStory = totalDuration / stories.length;
51096
51219
  const batchAgentUsed = routing.agent ?? ctx.agentManager?.getDefault() ?? resolveDefaultAgent(ctx.config);
51097
51220
  let modelUsed = routing.modelTier;
@@ -52680,7 +52803,7 @@ var init_completion = __esm(() => {
52680
52803
  async execute(ctx) {
52681
52804
  const logger = getLogger();
52682
52805
  const isBatch = ctx.stories.length > 1;
52683
- const sessionCost = ctx.agentResult?.estimatedCostUsd || 0;
52806
+ const sessionCost = ctx.runtime.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? 0;
52684
52807
  const persistPrd = ctx.skipPrdPersistence !== true;
52685
52808
  const prdPath = ctx.prdPath ?? (ctx.featureDir ? `${ctx.featureDir}/prd.json` : `${ctx.workdir}/nax/features/unknown/prd.json`);
52686
52809
  const storyStartTime = ctx.storyStartTime || new Date().toISOString();
@@ -58436,7 +58559,7 @@ var package_default;
58436
58559
  var init_package = __esm(() => {
58437
58560
  package_default = {
58438
58561
  name: "@nathapp/nax",
58439
- version: "0.68.6",
58562
+ version: "0.68.7",
58440
58563
  description: "AI Coding Agent Orchestrator \u2014 loops until done",
58441
58564
  type: "module",
58442
58565
  bin: {
@@ -58531,8 +58654,8 @@ var init_version = __esm(() => {
58531
58654
  NAX_VERSION = package_default.version;
58532
58655
  NAX_COMMIT = (() => {
58533
58656
  try {
58534
- if (/^[0-9a-f]{6,10}$/.test("acc1d4bd"))
58535
- return "acc1d4bd";
58657
+ if (/^[0-9a-f]{6,10}$/.test("0ba99b3b"))
58658
+ return "0ba99b3b";
58536
58659
  } catch {}
58537
58660
  try {
58538
58661
  const result = Bun.spawnSync(["git", "rev-parse", "--short", "HEAD"], {
@@ -59802,7 +59925,6 @@ async function handleRunCompletion(options) {
59802
59925
  startedAt,
59803
59926
  prd,
59804
59927
  allStoryMetrics,
59805
- totalCost,
59806
59928
  storiesCompleted,
59807
59929
  iterations,
59808
59930
  startTime,
@@ -59910,15 +60032,7 @@ async function handleRunCompletion(options) {
59910
60032
  });
59911
60033
  }
59912
60034
  const aggSnap = options.runtime.costAggregator.snapshot();
59913
- const aggregatorTotal = aggSnap.totalCostUsd;
59914
- const reportedTotal = Math.max(totalCost, aggregatorTotal);
59915
- if (aggregatorTotal > totalCost + 0.01) {
59916
- logger?.debug("run.complete", "Cost aggregator total exceeds accumulated totalCost", {
59917
- totalCost,
59918
- aggregatorTotal,
59919
- gap: aggregatorTotal - totalCost
59920
- });
59921
- }
60035
+ const reportedTotal = aggSnap.totalCostUsd;
59922
60036
  const aggByStage = options.runtime.costAggregator.byStage();
59923
60037
  const aggByStory = options.runtime.costAggregator.byStory();
59924
60038
  {
@@ -60066,11 +60180,11 @@ async function handleRunCompletion(options) {
60066
60180
  }
60067
60181
  var _runCompletionDeps;
60068
60182
  var init_run_completion = __esm(() => {
60183
+ init_pipeline();
60069
60184
  init_agents();
60070
60185
  init_runner5();
60071
60186
  init_logger2();
60072
60187
  init_metrics();
60073
- init_event_bus();
60074
60188
  init_prd();
60075
60189
  init_detector();
60076
60190
  init_scratch_purge();
@@ -60272,7 +60386,7 @@ function wireHooks(bus, hooks, workdir, feature) {
60272
60386
  return safe("on-story-complete", () => fireHook(hooks, "on-story-complete", hookCtx(feature, { storyId: ev.storyId, status: "passed", cost: ev.cost }), workdir));
60273
60387
  }));
60274
60388
  unsubs.push(bus.on("story:failed", (ev) => {
60275
- return safe("on-story-fail", () => fireHook(hooks, "on-story-fail", hookCtx(feature, { storyId: ev.storyId, status: "failed", reason: ev.reason }), workdir));
60389
+ return safe("on-story-fail", () => fireHook(hooks, "on-story-fail", hookCtx(feature, { storyId: ev.storyId, status: "failed", reason: ev.reason, cost: ev.cost }), workdir));
60276
60390
  }));
60277
60391
  unsubs.push(bus.on("story:paused", (ev) => {
60278
60392
  return safe("on-pause (story)", () => fireHook(hooks, "on-pause", hookCtx(feature, { storyId: ev.storyId, reason: ev.reason, cost: ev.cost }), workdir));
@@ -60939,8 +61053,8 @@ async function handleDryRun(ctx) {
60939
61053
  return { storiesCompletedDelta: ctx.storiesToExecute.length, prdDirty: true };
60940
61054
  }
60941
61055
  var init_dry_run = __esm(() => {
61056
+ init_pipeline();
60942
61057
  init_logger2();
60943
- init_event_bus();
60944
61058
  init_prd();
60945
61059
  });
60946
61060
 
@@ -61267,7 +61381,7 @@ async function handleNoTierAvailable(ctx, failureCategory) {
61267
61381
  type: "story:paused",
61268
61382
  storyId: ctx.story.id,
61269
61383
  reason: `Execution stopped (${failureCategory ?? "unknown"} requires human review)`,
61270
- cost: ctx.totalCost
61384
+ cost: ctx.runtime?.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61271
61385
  });
61272
61386
  return { outcome: "paused", prdDirty: true, prd: pausedPrd };
61273
61387
  }
@@ -61285,7 +61399,8 @@ async function handleNoTierAvailable(ctx, failureCategory) {
61285
61399
  storyId: ctx.story.id,
61286
61400
  story: { id: ctx.story.id, title: ctx.story.title, status: ctx.story.status, attempts: ctx.story.attempts },
61287
61401
  reason: "Execution failed",
61288
- countsTowardEscalation: true
61402
+ countsTowardEscalation: true,
61403
+ cost: ctx.runtime?.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61289
61404
  });
61290
61405
  return { outcome: "failed", prdDirty: true, prd: failedPrd };
61291
61406
  }
@@ -61307,7 +61422,7 @@ async function handleMaxAttemptsReached(ctx, failureCategory) {
61307
61422
  type: "story:paused",
61308
61423
  storyId: ctx.story.id,
61309
61424
  reason: `Max attempts reached (${failureCategory ?? "unknown"} requires human review)`,
61310
- cost: ctx.totalCost
61425
+ cost: ctx.runtime?.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61311
61426
  });
61312
61427
  return { outcome: "paused", prdDirty: true, prd: pausedPrd };
61313
61428
  }
@@ -61326,13 +61441,14 @@ async function handleMaxAttemptsReached(ctx, failureCategory) {
61326
61441
  storyId: ctx.story.id,
61327
61442
  story: { id: ctx.story.id, title: ctx.story.title, status: ctx.story.status, attempts: ctx.story.attempts },
61328
61443
  reason: "Max attempts reached",
61329
- countsTowardEscalation: true
61444
+ countsTowardEscalation: true,
61445
+ cost: ctx.runtime?.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61330
61446
  });
61331
61447
  return { outcome: "failed", prdDirty: true, prd: failedPrd };
61332
61448
  }
61333
61449
  var init_tier_outcome = __esm(() => {
61450
+ init_pipeline();
61334
61451
  init_logger2();
61335
- init_event_bus();
61336
61452
  init_prd();
61337
61453
  init_progress();
61338
61454
  init_tier_escalation();
@@ -61489,9 +61605,9 @@ async function handleTierEscalation(ctx) {
61489
61605
  }
61490
61606
  var _tierEscalationDeps;
61491
61607
  var init_tier_escalation = __esm(() => {
61608
+ init_pipeline();
61492
61609
  init_hooks();
61493
61610
  init_logger2();
61494
- init_event_bus();
61495
61611
  init_prd();
61496
61612
  init_routing();
61497
61613
  init_llm();
@@ -61735,7 +61851,7 @@ async function handlePipelineFailure(ctx, pipelineResult) {
61735
61851
  type: "story:paused",
61736
61852
  storyId: ctx.story.id,
61737
61853
  reason: pipelineResult.reason || "Pipeline paused",
61738
- cost: ctx.totalCost
61854
+ cost: ctx.runtime.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61739
61855
  });
61740
61856
  break;
61741
61857
  case "skip":
@@ -61769,7 +61885,8 @@ async function handlePipelineFailure(ctx, pipelineResult) {
61769
61885
  reason: pipelineResult.reason || "Pipeline failed",
61770
61886
  countsTowardEscalation: true,
61771
61887
  feature: ctx.feature,
61772
- attempts: ctx.story.attempts
61888
+ attempts: ctx.story.attempts,
61889
+ cost: ctx.runtime.costAggregator.byStory()[ctx.story.id]?.totalCostUsd ?? ctx.totalCost
61773
61890
  });
61774
61891
  if (ctx.story.attempts !== undefined && ctx.story.attempts >= ctx.config.execution.rectification.maxAttemptsTotal) {
61775
61892
  await pipelineEventBus.emitAsync({
@@ -61808,8 +61925,8 @@ async function handlePipelineFailure(ctx, pipelineResult) {
61808
61925
  }
61809
61926
  var _resultHandlerDeps;
61810
61927
  var init_pipeline_result_handler = __esm(() => {
61928
+ init_pipeline();
61811
61929
  init_logger2();
61812
- init_event_bus();
61813
61930
  init_prd();
61814
61931
  init_bun_deps();
61815
61932
  init_git();
@@ -62471,12 +62588,15 @@ async function executeUnified(ctx, initialPrd) {
62471
62588
  ctx.naxIgnoreIndex = nextIndex;
62472
62589
  return nextIndex;
62473
62590
  };
62474
- pipelineEventBus.clear();
62475
- wireHooks(pipelineEventBus, ctx.hooks, ctx.workdir, ctx.feature);
62476
- wireReporters(pipelineEventBus, ctx.pluginRegistry, ctx.runId, ctx.startTime);
62477
- wireInteraction(pipelineEventBus, ctx.interactionChain, ctx.config);
62478
- wireEventsWriter(pipelineEventBus, ctx.feature, ctx.runId, ctx.workdir);
62479
- wireRegistry(pipelineEventBus, ctx.feature, ctx.runId, ctx.workdir, ctx.runtime.outputDir);
62591
+ for (const fn of _prevRunUnsubscribers)
62592
+ fn();
62593
+ _prevRunUnsubscribers = [
62594
+ wireHooks(pipelineEventBus, ctx.hooks, ctx.workdir, ctx.feature),
62595
+ wireReporters(pipelineEventBus, ctx.pluginRegistry, ctx.runId, ctx.startTime),
62596
+ wireInteraction(pipelineEventBus, ctx.interactionChain, ctx.config),
62597
+ wireEventsWriter(pipelineEventBus, ctx.feature, ctx.runId, ctx.workdir),
62598
+ wireRegistry(pipelineEventBus, ctx.feature, ctx.runId, ctx.workdir, ctx.runtime.outputDir)
62599
+ ];
62480
62600
  pipelineEventBus.emit({
62481
62601
  type: "run:started",
62482
62602
  feature: ctx.feature,
@@ -62911,12 +63031,12 @@ function reconcileBatchOutcome(prd, batchResult) {
62911
63031
  }
62912
63032
  }
62913
63033
  }
62914
- var TERMINAL_ACTIONS, _unifiedExecutorDeps;
63034
+ var TERMINAL_ACTIONS, _prevRunUnsubscribers, _unifiedExecutorDeps;
62915
63035
  var init_unified_executor = __esm(() => {
63036
+ init_pipeline();
62916
63037
  init_agents();
62917
63038
  init_triggers();
62918
63039
  init_logger2();
62919
- init_event_bus();
62920
63040
  init_runner4();
62921
63041
  init_stages();
62922
63042
  init_events_writer();
@@ -62933,6 +63053,7 @@ var init_unified_executor = __esm(() => {
62933
63053
  init_pipeline_result_handler();
62934
63054
  init_story_selector();
62935
63055
  TERMINAL_ACTIONS = new Set(["fail", "skip", "pause"]);
63056
+ _prevRunUnsubscribers = [];
62936
63057
  _unifiedExecutorDeps = {
62937
63058
  runParallelBatch: async (opts) => {
62938
63059
  const { runParallelBatch: runParallelBatch2 } = await Promise.resolve().then(() => (init_parallel_batch(), exports_parallel_batch));
@@ -63837,7 +63958,8 @@ async function setupRun(options) {
63837
63958
  parentSignal: shutdownController.signal,
63838
63959
  sessionManager,
63839
63960
  agentManager: options.agentManager,
63840
- featureName: options.feature
63961
+ featureName: options.feature,
63962
+ agentStreamEvents: options.agentStreamEvents
63841
63963
  });
63842
63964
  await runtime.pidRegistry.cleanupStale();
63843
63965
  const cleanupCrashHandlers = installCrashHandlers({
@@ -64004,11 +64126,11 @@ async function setupRun(options) {
64004
64126
  }
64005
64127
  var _runSetupDeps;
64006
64128
  var init_run_setup = __esm(() => {
64129
+ init_pipeline();
64007
64130
  init_paths();
64008
64131
  init_errors();
64009
64132
  init_interaction();
64010
64133
  init_logger2();
64011
- init_event_bus();
64012
64134
  init_loader4();
64013
64135
  init_prd();
64014
64136
  init_project();
@@ -93355,1646 +93477,6 @@ var require_jsx_dev_runtime = __commonJS((exports, module) => {
93355
93477
  }
93356
93478
  });
93357
93479
 
93358
- // node_modules/cli-spinners/spinners.json
93359
- var require_spinners = __commonJS((exports, module) => {
93360
- module.exports = {
93361
- dots: {
93362
- interval: 80,
93363
- frames: [
93364
- "\u280B",
93365
- "\u2819",
93366
- "\u2839",
93367
- "\u2838",
93368
- "\u283C",
93369
- "\u2834",
93370
- "\u2826",
93371
- "\u2827",
93372
- "\u2807",
93373
- "\u280F"
93374
- ]
93375
- },
93376
- dots2: {
93377
- interval: 80,
93378
- frames: [
93379
- "\u28FE",
93380
- "\u28FD",
93381
- "\u28FB",
93382
- "\u28BF",
93383
- "\u287F",
93384
- "\u28DF",
93385
- "\u28EF",
93386
- "\u28F7"
93387
- ]
93388
- },
93389
- dots3: {
93390
- interval: 80,
93391
- frames: [
93392
- "\u280B",
93393
- "\u2819",
93394
- "\u281A",
93395
- "\u281E",
93396
- "\u2816",
93397
- "\u2826",
93398
- "\u2834",
93399
- "\u2832",
93400
- "\u2833",
93401
- "\u2813"
93402
- ]
93403
- },
93404
- dots4: {
93405
- interval: 80,
93406
- frames: [
93407
- "\u2804",
93408
- "\u2806",
93409
- "\u2807",
93410
- "\u280B",
93411
- "\u2819",
93412
- "\u2838",
93413
- "\u2830",
93414
- "\u2820",
93415
- "\u2830",
93416
- "\u2838",
93417
- "\u2819",
93418
- "\u280B",
93419
- "\u2807",
93420
- "\u2806"
93421
- ]
93422
- },
93423
- dots5: {
93424
- interval: 80,
93425
- frames: [
93426
- "\u280B",
93427
- "\u2819",
93428
- "\u281A",
93429
- "\u2812",
93430
- "\u2802",
93431
- "\u2802",
93432
- "\u2812",
93433
- "\u2832",
93434
- "\u2834",
93435
- "\u2826",
93436
- "\u2816",
93437
- "\u2812",
93438
- "\u2810",
93439
- "\u2810",
93440
- "\u2812",
93441
- "\u2813",
93442
- "\u280B"
93443
- ]
93444
- },
93445
- dots6: {
93446
- interval: 80,
93447
- frames: [
93448
- "\u2801",
93449
- "\u2809",
93450
- "\u2819",
93451
- "\u281A",
93452
- "\u2812",
93453
- "\u2802",
93454
- "\u2802",
93455
- "\u2812",
93456
- "\u2832",
93457
- "\u2834",
93458
- "\u2824",
93459
- "\u2804",
93460
- "\u2804",
93461
- "\u2824",
93462
- "\u2834",
93463
- "\u2832",
93464
- "\u2812",
93465
- "\u2802",
93466
- "\u2802",
93467
- "\u2812",
93468
- "\u281A",
93469
- "\u2819",
93470
- "\u2809",
93471
- "\u2801"
93472
- ]
93473
- },
93474
- dots7: {
93475
- interval: 80,
93476
- frames: [
93477
- "\u2808",
93478
- "\u2809",
93479
- "\u280B",
93480
- "\u2813",
93481
- "\u2812",
93482
- "\u2810",
93483
- "\u2810",
93484
- "\u2812",
93485
- "\u2816",
93486
- "\u2826",
93487
- "\u2824",
93488
- "\u2820",
93489
- "\u2820",
93490
- "\u2824",
93491
- "\u2826",
93492
- "\u2816",
93493
- "\u2812",
93494
- "\u2810",
93495
- "\u2810",
93496
- "\u2812",
93497
- "\u2813",
93498
- "\u280B",
93499
- "\u2809",
93500
- "\u2808"
93501
- ]
93502
- },
93503
- dots8: {
93504
- interval: 80,
93505
- frames: [
93506
- "\u2801",
93507
- "\u2801",
93508
- "\u2809",
93509
- "\u2819",
93510
- "\u281A",
93511
- "\u2812",
93512
- "\u2802",
93513
- "\u2802",
93514
- "\u2812",
93515
- "\u2832",
93516
- "\u2834",
93517
- "\u2824",
93518
- "\u2804",
93519
- "\u2804",
93520
- "\u2824",
93521
- "\u2820",
93522
- "\u2820",
93523
- "\u2824",
93524
- "\u2826",
93525
- "\u2816",
93526
- "\u2812",
93527
- "\u2810",
93528
- "\u2810",
93529
- "\u2812",
93530
- "\u2813",
93531
- "\u280B",
93532
- "\u2809",
93533
- "\u2808",
93534
- "\u2808"
93535
- ]
93536
- },
93537
- dots9: {
93538
- interval: 80,
93539
- frames: [
93540
- "\u28B9",
93541
- "\u28BA",
93542
- "\u28BC",
93543
- "\u28F8",
93544
- "\u28C7",
93545
- "\u2867",
93546
- "\u2857",
93547
- "\u284F"
93548
- ]
93549
- },
93550
- dots10: {
93551
- interval: 80,
93552
- frames: [
93553
- "\u2884",
93554
- "\u2882",
93555
- "\u2881",
93556
- "\u2841",
93557
- "\u2848",
93558
- "\u2850",
93559
- "\u2860"
93560
- ]
93561
- },
93562
- dots11: {
93563
- interval: 100,
93564
- frames: [
93565
- "\u2801",
93566
- "\u2802",
93567
- "\u2804",
93568
- "\u2840",
93569
- "\u2880",
93570
- "\u2820",
93571
- "\u2810",
93572
- "\u2808"
93573
- ]
93574
- },
93575
- dots12: {
93576
- interval: 80,
93577
- frames: [
93578
- "\u2880\u2800",
93579
- "\u2840\u2800",
93580
- "\u2804\u2800",
93581
- "\u2882\u2800",
93582
- "\u2842\u2800",
93583
- "\u2805\u2800",
93584
- "\u2883\u2800",
93585
- "\u2843\u2800",
93586
- "\u280D\u2800",
93587
- "\u288B\u2800",
93588
- "\u284B\u2800",
93589
- "\u280D\u2801",
93590
- "\u288B\u2801",
93591
- "\u284B\u2801",
93592
- "\u280D\u2809",
93593
- "\u280B\u2809",
93594
- "\u280B\u2809",
93595
- "\u2809\u2819",
93596
- "\u2809\u2819",
93597
- "\u2809\u2829",
93598
- "\u2808\u2899",
93599
- "\u2808\u2859",
93600
- "\u2888\u2829",
93601
- "\u2840\u2899",
93602
- "\u2804\u2859",
93603
- "\u2882\u2829",
93604
- "\u2842\u2898",
93605
- "\u2805\u2858",
93606
- "\u2883\u2828",
93607
- "\u2843\u2890",
93608
- "\u280D\u2850",
93609
- "\u288B\u2820",
93610
- "\u284B\u2880",
93611
- "\u280D\u2841",
93612
- "\u288B\u2801",
93613
- "\u284B\u2801",
93614
- "\u280D\u2809",
93615
- "\u280B\u2809",
93616
- "\u280B\u2809",
93617
- "\u2809\u2819",
93618
- "\u2809\u2819",
93619
- "\u2809\u2829",
93620
- "\u2808\u2899",
93621
- "\u2808\u2859",
93622
- "\u2808\u2829",
93623
- "\u2800\u2899",
93624
- "\u2800\u2859",
93625
- "\u2800\u2829",
93626
- "\u2800\u2898",
93627
- "\u2800\u2858",
93628
- "\u2800\u2828",
93629
- "\u2800\u2890",
93630
- "\u2800\u2850",
93631
- "\u2800\u2820",
93632
- "\u2800\u2880",
93633
- "\u2800\u2840"
93634
- ]
93635
- },
93636
- dots13: {
93637
- interval: 80,
93638
- frames: [
93639
- "\u28FC",
93640
- "\u28F9",
93641
- "\u28BB",
93642
- "\u283F",
93643
- "\u285F",
93644
- "\u28CF",
93645
- "\u28E7",
93646
- "\u28F6"
93647
- ]
93648
- },
93649
- dots8Bit: {
93650
- interval: 80,
93651
- frames: [
93652
- "\u2800",
93653
- "\u2801",
93654
- "\u2802",
93655
- "\u2803",
93656
- "\u2804",
93657
- "\u2805",
93658
- "\u2806",
93659
- "\u2807",
93660
- "\u2840",
93661
- "\u2841",
93662
- "\u2842",
93663
- "\u2843",
93664
- "\u2844",
93665
- "\u2845",
93666
- "\u2846",
93667
- "\u2847",
93668
- "\u2808",
93669
- "\u2809",
93670
- "\u280A",
93671
- "\u280B",
93672
- "\u280C",
93673
- "\u280D",
93674
- "\u280E",
93675
- "\u280F",
93676
- "\u2848",
93677
- "\u2849",
93678
- "\u284A",
93679
- "\u284B",
93680
- "\u284C",
93681
- "\u284D",
93682
- "\u284E",
93683
- "\u284F",
93684
- "\u2810",
93685
- "\u2811",
93686
- "\u2812",
93687
- "\u2813",
93688
- "\u2814",
93689
- "\u2815",
93690
- "\u2816",
93691
- "\u2817",
93692
- "\u2850",
93693
- "\u2851",
93694
- "\u2852",
93695
- "\u2853",
93696
- "\u2854",
93697
- "\u2855",
93698
- "\u2856",
93699
- "\u2857",
93700
- "\u2818",
93701
- "\u2819",
93702
- "\u281A",
93703
- "\u281B",
93704
- "\u281C",
93705
- "\u281D",
93706
- "\u281E",
93707
- "\u281F",
93708
- "\u2858",
93709
- "\u2859",
93710
- "\u285A",
93711
- "\u285B",
93712
- "\u285C",
93713
- "\u285D",
93714
- "\u285E",
93715
- "\u285F",
93716
- "\u2820",
93717
- "\u2821",
93718
- "\u2822",
93719
- "\u2823",
93720
- "\u2824",
93721
- "\u2825",
93722
- "\u2826",
93723
- "\u2827",
93724
- "\u2860",
93725
- "\u2861",
93726
- "\u2862",
93727
- "\u2863",
93728
- "\u2864",
93729
- "\u2865",
93730
- "\u2866",
93731
- "\u2867",
93732
- "\u2828",
93733
- "\u2829",
93734
- "\u282A",
93735
- "\u282B",
93736
- "\u282C",
93737
- "\u282D",
93738
- "\u282E",
93739
- "\u282F",
93740
- "\u2868",
93741
- "\u2869",
93742
- "\u286A",
93743
- "\u286B",
93744
- "\u286C",
93745
- "\u286D",
93746
- "\u286E",
93747
- "\u286F",
93748
- "\u2830",
93749
- "\u2831",
93750
- "\u2832",
93751
- "\u2833",
93752
- "\u2834",
93753
- "\u2835",
93754
- "\u2836",
93755
- "\u2837",
93756
- "\u2870",
93757
- "\u2871",
93758
- "\u2872",
93759
- "\u2873",
93760
- "\u2874",
93761
- "\u2875",
93762
- "\u2876",
93763
- "\u2877",
93764
- "\u2838",
93765
- "\u2839",
93766
- "\u283A",
93767
- "\u283B",
93768
- "\u283C",
93769
- "\u283D",
93770
- "\u283E",
93771
- "\u283F",
93772
- "\u2878",
93773
- "\u2879",
93774
- "\u287A",
93775
- "\u287B",
93776
- "\u287C",
93777
- "\u287D",
93778
- "\u287E",
93779
- "\u287F",
93780
- "\u2880",
93781
- "\u2881",
93782
- "\u2882",
93783
- "\u2883",
93784
- "\u2884",
93785
- "\u2885",
93786
- "\u2886",
93787
- "\u2887",
93788
- "\u28C0",
93789
- "\u28C1",
93790
- "\u28C2",
93791
- "\u28C3",
93792
- "\u28C4",
93793
- "\u28C5",
93794
- "\u28C6",
93795
- "\u28C7",
93796
- "\u2888",
93797
- "\u2889",
93798
- "\u288A",
93799
- "\u288B",
93800
- "\u288C",
93801
- "\u288D",
93802
- "\u288E",
93803
- "\u288F",
93804
- "\u28C8",
93805
- "\u28C9",
93806
- "\u28CA",
93807
- "\u28CB",
93808
- "\u28CC",
93809
- "\u28CD",
93810
- "\u28CE",
93811
- "\u28CF",
93812
- "\u2890",
93813
- "\u2891",
93814
- "\u2892",
93815
- "\u2893",
93816
- "\u2894",
93817
- "\u2895",
93818
- "\u2896",
93819
- "\u2897",
93820
- "\u28D0",
93821
- "\u28D1",
93822
- "\u28D2",
93823
- "\u28D3",
93824
- "\u28D4",
93825
- "\u28D5",
93826
- "\u28D6",
93827
- "\u28D7",
93828
- "\u2898",
93829
- "\u2899",
93830
- "\u289A",
93831
- "\u289B",
93832
- "\u289C",
93833
- "\u289D",
93834
- "\u289E",
93835
- "\u289F",
93836
- "\u28D8",
93837
- "\u28D9",
93838
- "\u28DA",
93839
- "\u28DB",
93840
- "\u28DC",
93841
- "\u28DD",
93842
- "\u28DE",
93843
- "\u28DF",
93844
- "\u28A0",
93845
- "\u28A1",
93846
- "\u28A2",
93847
- "\u28A3",
93848
- "\u28A4",
93849
- "\u28A5",
93850
- "\u28A6",
93851
- "\u28A7",
93852
- "\u28E0",
93853
- "\u28E1",
93854
- "\u28E2",
93855
- "\u28E3",
93856
- "\u28E4",
93857
- "\u28E5",
93858
- "\u28E6",
93859
- "\u28E7",
93860
- "\u28A8",
93861
- "\u28A9",
93862
- "\u28AA",
93863
- "\u28AB",
93864
- "\u28AC",
93865
- "\u28AD",
93866
- "\u28AE",
93867
- "\u28AF",
93868
- "\u28E8",
93869
- "\u28E9",
93870
- "\u28EA",
93871
- "\u28EB",
93872
- "\u28EC",
93873
- "\u28ED",
93874
- "\u28EE",
93875
- "\u28EF",
93876
- "\u28B0",
93877
- "\u28B1",
93878
- "\u28B2",
93879
- "\u28B3",
93880
- "\u28B4",
93881
- "\u28B5",
93882
- "\u28B6",
93883
- "\u28B7",
93884
- "\u28F0",
93885
- "\u28F1",
93886
- "\u28F2",
93887
- "\u28F3",
93888
- "\u28F4",
93889
- "\u28F5",
93890
- "\u28F6",
93891
- "\u28F7",
93892
- "\u28B8",
93893
- "\u28B9",
93894
- "\u28BA",
93895
- "\u28BB",
93896
- "\u28BC",
93897
- "\u28BD",
93898
- "\u28BE",
93899
- "\u28BF",
93900
- "\u28F8",
93901
- "\u28F9",
93902
- "\u28FA",
93903
- "\u28FB",
93904
- "\u28FC",
93905
- "\u28FD",
93906
- "\u28FE",
93907
- "\u28FF"
93908
- ]
93909
- },
93910
- sand: {
93911
- interval: 80,
93912
- frames: [
93913
- "\u2801",
93914
- "\u2802",
93915
- "\u2804",
93916
- "\u2840",
93917
- "\u2848",
93918
- "\u2850",
93919
- "\u2860",
93920
- "\u28C0",
93921
- "\u28C1",
93922
- "\u28C2",
93923
- "\u28C4",
93924
- "\u28CC",
93925
- "\u28D4",
93926
- "\u28E4",
93927
- "\u28E5",
93928
- "\u28E6",
93929
- "\u28EE",
93930
- "\u28F6",
93931
- "\u28F7",
93932
- "\u28FF",
93933
- "\u287F",
93934
- "\u283F",
93935
- "\u289F",
93936
- "\u281F",
93937
- "\u285B",
93938
- "\u281B",
93939
- "\u282B",
93940
- "\u288B",
93941
- "\u280B",
93942
- "\u280D",
93943
- "\u2849",
93944
- "\u2809",
93945
- "\u2811",
93946
- "\u2821",
93947
- "\u2881"
93948
- ]
93949
- },
93950
- line: {
93951
- interval: 130,
93952
- frames: [
93953
- "-",
93954
- "\\",
93955
- "|",
93956
- "/"
93957
- ]
93958
- },
93959
- line2: {
93960
- interval: 100,
93961
- frames: [
93962
- "\u2802",
93963
- "-",
93964
- "\u2013",
93965
- "\u2014",
93966
- "\u2013",
93967
- "-"
93968
- ]
93969
- },
93970
- pipe: {
93971
- interval: 100,
93972
- frames: [
93973
- "\u2524",
93974
- "\u2518",
93975
- "\u2534",
93976
- "\u2514",
93977
- "\u251C",
93978
- "\u250C",
93979
- "\u252C",
93980
- "\u2510"
93981
- ]
93982
- },
93983
- simpleDots: {
93984
- interval: 400,
93985
- frames: [
93986
- ". ",
93987
- ".. ",
93988
- "...",
93989
- " "
93990
- ]
93991
- },
93992
- simpleDotsScrolling: {
93993
- interval: 200,
93994
- frames: [
93995
- ". ",
93996
- ".. ",
93997
- "...",
93998
- " ..",
93999
- " .",
94000
- " "
94001
- ]
94002
- },
94003
- star: {
94004
- interval: 70,
94005
- frames: [
94006
- "\u2736",
94007
- "\u2738",
94008
- "\u2739",
94009
- "\u273A",
94010
- "\u2739",
94011
- "\u2737"
94012
- ]
94013
- },
94014
- star2: {
94015
- interval: 80,
94016
- frames: [
94017
- "+",
94018
- "x",
94019
- "*"
94020
- ]
94021
- },
94022
- flip: {
94023
- interval: 70,
94024
- frames: [
94025
- "_",
94026
- "_",
94027
- "_",
94028
- "-",
94029
- "`",
94030
- "`",
94031
- "'",
94032
- "\xB4",
94033
- "-",
94034
- "_",
94035
- "_",
94036
- "_"
94037
- ]
94038
- },
94039
- hamburger: {
94040
- interval: 100,
94041
- frames: [
94042
- "\u2631",
94043
- "\u2632",
94044
- "\u2634"
94045
- ]
94046
- },
94047
- growVertical: {
94048
- interval: 120,
94049
- frames: [
94050
- "\u2581",
94051
- "\u2583",
94052
- "\u2584",
94053
- "\u2585",
94054
- "\u2586",
94055
- "\u2587",
94056
- "\u2586",
94057
- "\u2585",
94058
- "\u2584",
94059
- "\u2583"
94060
- ]
94061
- },
94062
- growHorizontal: {
94063
- interval: 120,
94064
- frames: [
94065
- "\u258F",
94066
- "\u258E",
94067
- "\u258D",
94068
- "\u258C",
94069
- "\u258B",
94070
- "\u258A",
94071
- "\u2589",
94072
- "\u258A",
94073
- "\u258B",
94074
- "\u258C",
94075
- "\u258D",
94076
- "\u258E"
94077
- ]
94078
- },
94079
- balloon: {
94080
- interval: 140,
94081
- frames: [
94082
- " ",
94083
- ".",
94084
- "o",
94085
- "O",
94086
- "@",
94087
- "*",
94088
- " "
94089
- ]
94090
- },
94091
- balloon2: {
94092
- interval: 120,
94093
- frames: [
94094
- ".",
94095
- "o",
94096
- "O",
94097
- "\xB0",
94098
- "O",
94099
- "o",
94100
- "."
94101
- ]
94102
- },
94103
- noise: {
94104
- interval: 100,
94105
- frames: [
94106
- "\u2593",
94107
- "\u2592",
94108
- "\u2591"
94109
- ]
94110
- },
94111
- bounce: {
94112
- interval: 120,
94113
- frames: [
94114
- "\u2801",
94115
- "\u2802",
94116
- "\u2804",
94117
- "\u2802"
94118
- ]
94119
- },
94120
- boxBounce: {
94121
- interval: 120,
94122
- frames: [
94123
- "\u2596",
94124
- "\u2598",
94125
- "\u259D",
94126
- "\u2597"
94127
- ]
94128
- },
94129
- boxBounce2: {
94130
- interval: 100,
94131
- frames: [
94132
- "\u258C",
94133
- "\u2580",
94134
- "\u2590",
94135
- "\u2584"
94136
- ]
94137
- },
94138
- triangle: {
94139
- interval: 50,
94140
- frames: [
94141
- "\u25E2",
94142
- "\u25E3",
94143
- "\u25E4",
94144
- "\u25E5"
94145
- ]
94146
- },
94147
- binary: {
94148
- interval: 80,
94149
- frames: [
94150
- "010010",
94151
- "001100",
94152
- "100101",
94153
- "111010",
94154
- "111101",
94155
- "010111",
94156
- "101011",
94157
- "111000",
94158
- "110011",
94159
- "110101"
94160
- ]
94161
- },
94162
- arc: {
94163
- interval: 100,
94164
- frames: [
94165
- "\u25DC",
94166
- "\u25E0",
94167
- "\u25DD",
94168
- "\u25DE",
94169
- "\u25E1",
94170
- "\u25DF"
94171
- ]
94172
- },
94173
- circle: {
94174
- interval: 120,
94175
- frames: [
94176
- "\u25E1",
94177
- "\u2299",
94178
- "\u25E0"
94179
- ]
94180
- },
94181
- squareCorners: {
94182
- interval: 180,
94183
- frames: [
94184
- "\u25F0",
94185
- "\u25F3",
94186
- "\u25F2",
94187
- "\u25F1"
94188
- ]
94189
- },
94190
- circleQuarters: {
94191
- interval: 120,
94192
- frames: [
94193
- "\u25F4",
94194
- "\u25F7",
94195
- "\u25F6",
94196
- "\u25F5"
94197
- ]
94198
- },
94199
- circleHalves: {
94200
- interval: 50,
94201
- frames: [
94202
- "\u25D0",
94203
- "\u25D3",
94204
- "\u25D1",
94205
- "\u25D2"
94206
- ]
94207
- },
94208
- squish: {
94209
- interval: 100,
94210
- frames: [
94211
- "\u256B",
94212
- "\u256A"
94213
- ]
94214
- },
94215
- toggle: {
94216
- interval: 250,
94217
- frames: [
94218
- "\u22B6",
94219
- "\u22B7"
94220
- ]
94221
- },
94222
- toggle2: {
94223
- interval: 80,
94224
- frames: [
94225
- "\u25AB",
94226
- "\u25AA"
94227
- ]
94228
- },
94229
- toggle3: {
94230
- interval: 120,
94231
- frames: [
94232
- "\u25A1",
94233
- "\u25A0"
94234
- ]
94235
- },
94236
- toggle4: {
94237
- interval: 100,
94238
- frames: [
94239
- "\u25A0",
94240
- "\u25A1",
94241
- "\u25AA",
94242
- "\u25AB"
94243
- ]
94244
- },
94245
- toggle5: {
94246
- interval: 100,
94247
- frames: [
94248
- "\u25AE",
94249
- "\u25AF"
94250
- ]
94251
- },
94252
- toggle6: {
94253
- interval: 300,
94254
- frames: [
94255
- "\u101D",
94256
- "\u1040"
94257
- ]
94258
- },
94259
- toggle7: {
94260
- interval: 80,
94261
- frames: [
94262
- "\u29BE",
94263
- "\u29BF"
94264
- ]
94265
- },
94266
- toggle8: {
94267
- interval: 100,
94268
- frames: [
94269
- "\u25CD",
94270
- "\u25CC"
94271
- ]
94272
- },
94273
- toggle9: {
94274
- interval: 100,
94275
- frames: [
94276
- "\u25C9",
94277
- "\u25CE"
94278
- ]
94279
- },
94280
- toggle10: {
94281
- interval: 100,
94282
- frames: [
94283
- "\u3282",
94284
- "\u3280",
94285
- "\u3281"
94286
- ]
94287
- },
94288
- toggle11: {
94289
- interval: 50,
94290
- frames: [
94291
- "\u29C7",
94292
- "\u29C6"
94293
- ]
94294
- },
94295
- toggle12: {
94296
- interval: 120,
94297
- frames: [
94298
- "\u2617",
94299
- "\u2616"
94300
- ]
94301
- },
94302
- toggle13: {
94303
- interval: 80,
94304
- frames: [
94305
- "=",
94306
- "*",
94307
- "-"
94308
- ]
94309
- },
94310
- arrow: {
94311
- interval: 100,
94312
- frames: [
94313
- "\u2190",
94314
- "\u2196",
94315
- "\u2191",
94316
- "\u2197",
94317
- "\u2192",
94318
- "\u2198",
94319
- "\u2193",
94320
- "\u2199"
94321
- ]
94322
- },
94323
- arrow2: {
94324
- interval: 80,
94325
- frames: [
94326
- "\u2B06\uFE0F ",
94327
- "\u2197\uFE0F ",
94328
- "\u27A1\uFE0F ",
94329
- "\u2198\uFE0F ",
94330
- "\u2B07\uFE0F ",
94331
- "\u2199\uFE0F ",
94332
- "\u2B05\uFE0F ",
94333
- "\u2196\uFE0F "
94334
- ]
94335
- },
94336
- arrow3: {
94337
- interval: 120,
94338
- frames: [
94339
- "\u25B9\u25B9\u25B9\u25B9\u25B9",
94340
- "\u25B8\u25B9\u25B9\u25B9\u25B9",
94341
- "\u25B9\u25B8\u25B9\u25B9\u25B9",
94342
- "\u25B9\u25B9\u25B8\u25B9\u25B9",
94343
- "\u25B9\u25B9\u25B9\u25B8\u25B9",
94344
- "\u25B9\u25B9\u25B9\u25B9\u25B8"
94345
- ]
94346
- },
94347
- bouncingBar: {
94348
- interval: 80,
94349
- frames: [
94350
- "[ ]",
94351
- "[= ]",
94352
- "[== ]",
94353
- "[=== ]",
94354
- "[====]",
94355
- "[ ===]",
94356
- "[ ==]",
94357
- "[ =]",
94358
- "[ ]",
94359
- "[ =]",
94360
- "[ ==]",
94361
- "[ ===]",
94362
- "[====]",
94363
- "[=== ]",
94364
- "[== ]",
94365
- "[= ]"
94366
- ]
94367
- },
94368
- bouncingBall: {
94369
- interval: 80,
94370
- frames: [
94371
- "( \u25CF )",
94372
- "( \u25CF )",
94373
- "( \u25CF )",
94374
- "( \u25CF )",
94375
- "( \u25CF)",
94376
- "( \u25CF )",
94377
- "( \u25CF )",
94378
- "( \u25CF )",
94379
- "( \u25CF )",
94380
- "(\u25CF )"
94381
- ]
94382
- },
94383
- smiley: {
94384
- interval: 200,
94385
- frames: [
94386
- "\uD83D\uDE04 ",
94387
- "\uD83D\uDE1D "
94388
- ]
94389
- },
94390
- monkey: {
94391
- interval: 300,
94392
- frames: [
94393
- "\uD83D\uDE48 ",
94394
- "\uD83D\uDE48 ",
94395
- "\uD83D\uDE49 ",
94396
- "\uD83D\uDE4A "
94397
- ]
94398
- },
94399
- hearts: {
94400
- interval: 100,
94401
- frames: [
94402
- "\uD83D\uDC9B ",
94403
- "\uD83D\uDC99 ",
94404
- "\uD83D\uDC9C ",
94405
- "\uD83D\uDC9A ",
94406
- "\u2764\uFE0F "
94407
- ]
94408
- },
94409
- clock: {
94410
- interval: 100,
94411
- frames: [
94412
- "\uD83D\uDD5B ",
94413
- "\uD83D\uDD50 ",
94414
- "\uD83D\uDD51 ",
94415
- "\uD83D\uDD52 ",
94416
- "\uD83D\uDD53 ",
94417
- "\uD83D\uDD54 ",
94418
- "\uD83D\uDD55 ",
94419
- "\uD83D\uDD56 ",
94420
- "\uD83D\uDD57 ",
94421
- "\uD83D\uDD58 ",
94422
- "\uD83D\uDD59 ",
94423
- "\uD83D\uDD5A "
94424
- ]
94425
- },
94426
- earth: {
94427
- interval: 180,
94428
- frames: [
94429
- "\uD83C\uDF0D ",
94430
- "\uD83C\uDF0E ",
94431
- "\uD83C\uDF0F "
94432
- ]
94433
- },
94434
- material: {
94435
- interval: 17,
94436
- frames: [
94437
- "\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94438
- "\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94439
- "\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94440
- "\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94441
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94442
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94443
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94444
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94445
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94446
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94447
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94448
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94449
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94450
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581",
94451
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581",
94452
- "\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581",
94453
- "\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581",
94454
- "\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581",
94455
- "\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581",
94456
- "\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94457
- "\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94458
- "\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581",
94459
- "\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581",
94460
- "\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94461
- "\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94462
- "\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94463
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94464
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94465
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94466
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94467
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94468
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94469
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94470
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94471
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94472
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94473
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94474
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94475
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588",
94476
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588",
94477
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588",
94478
- "\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588",
94479
- "\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588",
94480
- "\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588",
94481
- "\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588",
94482
- "\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588",
94483
- "\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94484
- "\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94485
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94486
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94487
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94488
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94489
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94490
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94491
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94492
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94493
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94494
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581",
94495
- "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581\u2581",
94496
- "\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581",
94497
- "\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581\u2581",
94498
- "\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581\u2581",
94499
- "\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94500
- "\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94501
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94502
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94503
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581\u2581",
94504
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581",
94505
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581\u2581",
94506
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94507
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94508
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94509
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94510
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2581",
94511
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94512
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
94513
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588\u2588",
94514
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588",
94515
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588",
94516
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588\u2588",
94517
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588",
94518
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588\u2588",
94519
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588",
94520
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588",
94521
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588\u2588",
94522
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94523
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94524
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2588",
94525
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94526
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94527
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581",
94528
- "\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581\u2581"
94529
- ]
94530
- },
94531
- moon: {
94532
- interval: 80,
94533
- frames: [
94534
- "\uD83C\uDF11 ",
94535
- "\uD83C\uDF12 ",
94536
- "\uD83C\uDF13 ",
94537
- "\uD83C\uDF14 ",
94538
- "\uD83C\uDF15 ",
94539
- "\uD83C\uDF16 ",
94540
- "\uD83C\uDF17 ",
94541
- "\uD83C\uDF18 "
94542
- ]
94543
- },
94544
- runner: {
94545
- interval: 140,
94546
- frames: [
94547
- "\uD83D\uDEB6 ",
94548
- "\uD83C\uDFC3 "
94549
- ]
94550
- },
94551
- pong: {
94552
- interval: 80,
94553
- frames: [
94554
- "\u2590\u2802 \u258C",
94555
- "\u2590\u2808 \u258C",
94556
- "\u2590 \u2802 \u258C",
94557
- "\u2590 \u2820 \u258C",
94558
- "\u2590 \u2840 \u258C",
94559
- "\u2590 \u2820 \u258C",
94560
- "\u2590 \u2802 \u258C",
94561
- "\u2590 \u2808 \u258C",
94562
- "\u2590 \u2802 \u258C",
94563
- "\u2590 \u2820 \u258C",
94564
- "\u2590 \u2840 \u258C",
94565
- "\u2590 \u2820 \u258C",
94566
- "\u2590 \u2802 \u258C",
94567
- "\u2590 \u2808 \u258C",
94568
- "\u2590 \u2802\u258C",
94569
- "\u2590 \u2820\u258C",
94570
- "\u2590 \u2840\u258C",
94571
- "\u2590 \u2820 \u258C",
94572
- "\u2590 \u2802 \u258C",
94573
- "\u2590 \u2808 \u258C",
94574
- "\u2590 \u2802 \u258C",
94575
- "\u2590 \u2820 \u258C",
94576
- "\u2590 \u2840 \u258C",
94577
- "\u2590 \u2820 \u258C",
94578
- "\u2590 \u2802 \u258C",
94579
- "\u2590 \u2808 \u258C",
94580
- "\u2590 \u2802 \u258C",
94581
- "\u2590 \u2820 \u258C",
94582
- "\u2590 \u2840 \u258C",
94583
- "\u2590\u2820 \u258C"
94584
- ]
94585
- },
94586
- shark: {
94587
- interval: 120,
94588
- frames: [
94589
- "\u2590|\\____________\u258C",
94590
- "\u2590_|\\___________\u258C",
94591
- "\u2590__|\\__________\u258C",
94592
- "\u2590___|\\_________\u258C",
94593
- "\u2590____|\\________\u258C",
94594
- "\u2590_____|\\_______\u258C",
94595
- "\u2590______|\\______\u258C",
94596
- "\u2590_______|\\_____\u258C",
94597
- "\u2590________|\\____\u258C",
94598
- "\u2590_________|\\___\u258C",
94599
- "\u2590__________|\\__\u258C",
94600
- "\u2590___________|\\_\u258C",
94601
- "\u2590____________|\\\u258C",
94602
- "\u2590____________/|\u258C",
94603
- "\u2590___________/|_\u258C",
94604
- "\u2590__________/|__\u258C",
94605
- "\u2590_________/|___\u258C",
94606
- "\u2590________/|____\u258C",
94607
- "\u2590_______/|_____\u258C",
94608
- "\u2590______/|______\u258C",
94609
- "\u2590_____/|_______\u258C",
94610
- "\u2590____/|________\u258C",
94611
- "\u2590___/|_________\u258C",
94612
- "\u2590__/|__________\u258C",
94613
- "\u2590_/|___________\u258C",
94614
- "\u2590/|____________\u258C"
94615
- ]
94616
- },
94617
- dqpb: {
94618
- interval: 100,
94619
- frames: [
94620
- "d",
94621
- "q",
94622
- "p",
94623
- "b"
94624
- ]
94625
- },
94626
- weather: {
94627
- interval: 100,
94628
- frames: [
94629
- "\u2600\uFE0F ",
94630
- "\u2600\uFE0F ",
94631
- "\u2600\uFE0F ",
94632
- "\uD83C\uDF24 ",
94633
- "\u26C5\uFE0F ",
94634
- "\uD83C\uDF25 ",
94635
- "\u2601\uFE0F ",
94636
- "\uD83C\uDF27 ",
94637
- "\uD83C\uDF28 ",
94638
- "\uD83C\uDF27 ",
94639
- "\uD83C\uDF28 ",
94640
- "\uD83C\uDF27 ",
94641
- "\uD83C\uDF28 ",
94642
- "\u26C8 ",
94643
- "\uD83C\uDF28 ",
94644
- "\uD83C\uDF27 ",
94645
- "\uD83C\uDF28 ",
94646
- "\u2601\uFE0F ",
94647
- "\uD83C\uDF25 ",
94648
- "\u26C5\uFE0F ",
94649
- "\uD83C\uDF24 ",
94650
- "\u2600\uFE0F ",
94651
- "\u2600\uFE0F "
94652
- ]
94653
- },
94654
- christmas: {
94655
- interval: 400,
94656
- frames: [
94657
- "\uD83C\uDF32",
94658
- "\uD83C\uDF84"
94659
- ]
94660
- },
94661
- grenade: {
94662
- interval: 80,
94663
- frames: [
94664
- "\u060C ",
94665
- "\u2032 ",
94666
- " \xB4 ",
94667
- " \u203E ",
94668
- " \u2E0C",
94669
- " \u2E0A",
94670
- " |",
94671
- " \u204E",
94672
- " \u2055",
94673
- " \u0DF4 ",
94674
- " \u2053",
94675
- " ",
94676
- " ",
94677
- " "
94678
- ]
94679
- },
94680
- point: {
94681
- interval: 125,
94682
- frames: [
94683
- "\u2219\u2219\u2219",
94684
- "\u25CF\u2219\u2219",
94685
- "\u2219\u25CF\u2219",
94686
- "\u2219\u2219\u25CF",
94687
- "\u2219\u2219\u2219"
94688
- ]
94689
- },
94690
- layer: {
94691
- interval: 150,
94692
- frames: [
94693
- "-",
94694
- "=",
94695
- "\u2261"
94696
- ]
94697
- },
94698
- betaWave: {
94699
- interval: 80,
94700
- frames: [
94701
- "\u03C1\u03B2\u03B2\u03B2\u03B2\u03B2\u03B2",
94702
- "\u03B2\u03C1\u03B2\u03B2\u03B2\u03B2\u03B2",
94703
- "\u03B2\u03B2\u03C1\u03B2\u03B2\u03B2\u03B2",
94704
- "\u03B2\u03B2\u03B2\u03C1\u03B2\u03B2\u03B2",
94705
- "\u03B2\u03B2\u03B2\u03B2\u03C1\u03B2\u03B2",
94706
- "\u03B2\u03B2\u03B2\u03B2\u03B2\u03C1\u03B2",
94707
- "\u03B2\u03B2\u03B2\u03B2\u03B2\u03B2\u03C1"
94708
- ]
94709
- },
94710
- fingerDance: {
94711
- interval: 160,
94712
- frames: [
94713
- "\uD83E\uDD18 ",
94714
- "\uD83E\uDD1F ",
94715
- "\uD83D\uDD96 ",
94716
- "\u270B ",
94717
- "\uD83E\uDD1A ",
94718
- "\uD83D\uDC46 "
94719
- ]
94720
- },
94721
- fistBump: {
94722
- interval: 80,
94723
- frames: [
94724
- "\uD83E\uDD1C\u3000\u3000\u3000\u3000\uD83E\uDD1B ",
94725
- "\uD83E\uDD1C\u3000\u3000\u3000\u3000\uD83E\uDD1B ",
94726
- "\uD83E\uDD1C\u3000\u3000\u3000\u3000\uD83E\uDD1B ",
94727
- "\u3000\uD83E\uDD1C\u3000\u3000\uD83E\uDD1B\u3000 ",
94728
- "\u3000\u3000\uD83E\uDD1C\uD83E\uDD1B\u3000\u3000 ",
94729
- "\u3000\uD83E\uDD1C\u2728\uD83E\uDD1B\u3000\u3000 ",
94730
- "\uD83E\uDD1C\u3000\u2728\u3000\uD83E\uDD1B\u3000 "
94731
- ]
94732
- },
94733
- soccerHeader: {
94734
- interval: 80,
94735
- frames: [
94736
- " \uD83E\uDDD1\u26BD\uFE0F \uD83E\uDDD1 ",
94737
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94738
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94739
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94740
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94741
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94742
- "\uD83E\uDDD1 \u26BD\uFE0F\uD83E\uDDD1 ",
94743
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94744
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94745
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94746
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 ",
94747
- "\uD83E\uDDD1 \u26BD\uFE0F \uD83E\uDDD1 "
94748
- ]
94749
- },
94750
- mindblown: {
94751
- interval: 160,
94752
- frames: [
94753
- "\uD83D\uDE10 ",
94754
- "\uD83D\uDE10 ",
94755
- "\uD83D\uDE2E ",
94756
- "\uD83D\uDE2E ",
94757
- "\uD83D\uDE26 ",
94758
- "\uD83D\uDE26 ",
94759
- "\uD83D\uDE27 ",
94760
- "\uD83D\uDE27 ",
94761
- "\uD83E\uDD2F ",
94762
- "\uD83D\uDCA5 ",
94763
- "\u2728 ",
94764
- "\u3000 ",
94765
- "\u3000 ",
94766
- "\u3000 "
94767
- ]
94768
- },
94769
- speaker: {
94770
- interval: 160,
94771
- frames: [
94772
- "\uD83D\uDD08 ",
94773
- "\uD83D\uDD09 ",
94774
- "\uD83D\uDD0A ",
94775
- "\uD83D\uDD09 "
94776
- ]
94777
- },
94778
- orangePulse: {
94779
- interval: 100,
94780
- frames: [
94781
- "\uD83D\uDD38 ",
94782
- "\uD83D\uDD36 ",
94783
- "\uD83D\uDFE0 ",
94784
- "\uD83D\uDFE0 ",
94785
- "\uD83D\uDD36 "
94786
- ]
94787
- },
94788
- bluePulse: {
94789
- interval: 100,
94790
- frames: [
94791
- "\uD83D\uDD39 ",
94792
- "\uD83D\uDD37 ",
94793
- "\uD83D\uDD35 ",
94794
- "\uD83D\uDD35 ",
94795
- "\uD83D\uDD37 "
94796
- ]
94797
- },
94798
- orangeBluePulse: {
94799
- interval: 100,
94800
- frames: [
94801
- "\uD83D\uDD38 ",
94802
- "\uD83D\uDD36 ",
94803
- "\uD83D\uDFE0 ",
94804
- "\uD83D\uDFE0 ",
94805
- "\uD83D\uDD36 ",
94806
- "\uD83D\uDD39 ",
94807
- "\uD83D\uDD37 ",
94808
- "\uD83D\uDD35 ",
94809
- "\uD83D\uDD35 ",
94810
- "\uD83D\uDD37 "
94811
- ]
94812
- },
94813
- timeTravel: {
94814
- interval: 100,
94815
- frames: [
94816
- "\uD83D\uDD5B ",
94817
- "\uD83D\uDD5A ",
94818
- "\uD83D\uDD59 ",
94819
- "\uD83D\uDD58 ",
94820
- "\uD83D\uDD57 ",
94821
- "\uD83D\uDD56 ",
94822
- "\uD83D\uDD55 ",
94823
- "\uD83D\uDD54 ",
94824
- "\uD83D\uDD53 ",
94825
- "\uD83D\uDD52 ",
94826
- "\uD83D\uDD51 ",
94827
- "\uD83D\uDD50 "
94828
- ]
94829
- },
94830
- aesthetic: {
94831
- interval: 80,
94832
- frames: [
94833
- "\u25B0\u25B1\u25B1\u25B1\u25B1\u25B1\u25B1",
94834
- "\u25B0\u25B0\u25B1\u25B1\u25B1\u25B1\u25B1",
94835
- "\u25B0\u25B0\u25B0\u25B1\u25B1\u25B1\u25B1",
94836
- "\u25B0\u25B0\u25B0\u25B0\u25B1\u25B1\u25B1",
94837
- "\u25B0\u25B0\u25B0\u25B0\u25B0\u25B1\u25B1",
94838
- "\u25B0\u25B0\u25B0\u25B0\u25B0\u25B0\u25B1",
94839
- "\u25B0\u25B0\u25B0\u25B0\u25B0\u25B0\u25B0",
94840
- "\u25B0\u25B1\u25B1\u25B1\u25B1\u25B1\u25B1"
94841
- ]
94842
- },
94843
- dwarfFortress: {
94844
- interval: 80,
94845
- frames: [
94846
- " \u2588\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94847
- "\u263A\u2588\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94848
- "\u263A\u2588\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94849
- "\u263A\u2593\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94850
- "\u263A\u2593\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94851
- "\u263A\u2592\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94852
- "\u263A\u2592\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94853
- "\u263A\u2591\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94854
- "\u263A\u2591\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94855
- "\u263A \u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94856
- " \u263A\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94857
- " \u263A\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94858
- " \u263A\u2593\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94859
- " \u263A\u2593\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94860
- " \u263A\u2592\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94861
- " \u263A\u2592\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94862
- " \u263A\u2591\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94863
- " \u263A\u2591\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94864
- " \u263A \u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94865
- " \u263A\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94866
- " \u263A\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94867
- " \u263A\u2593\u2588\u2588\u2588\xA3\xA3\xA3 ",
94868
- " \u263A\u2593\u2588\u2588\u2588\xA3\xA3\xA3 ",
94869
- " \u263A\u2592\u2588\u2588\u2588\xA3\xA3\xA3 ",
94870
- " \u263A\u2592\u2588\u2588\u2588\xA3\xA3\xA3 ",
94871
- " \u263A\u2591\u2588\u2588\u2588\xA3\xA3\xA3 ",
94872
- " \u263A\u2591\u2588\u2588\u2588\xA3\xA3\xA3 ",
94873
- " \u263A \u2588\u2588\u2588\xA3\xA3\xA3 ",
94874
- " \u263A\u2588\u2588\u2588\xA3\xA3\xA3 ",
94875
- " \u263A\u2588\u2588\u2588\xA3\xA3\xA3 ",
94876
- " \u263A\u2593\u2588\u2588\xA3\xA3\xA3 ",
94877
- " \u263A\u2593\u2588\u2588\xA3\xA3\xA3 ",
94878
- " \u263A\u2592\u2588\u2588\xA3\xA3\xA3 ",
94879
- " \u263A\u2592\u2588\u2588\xA3\xA3\xA3 ",
94880
- " \u263A\u2591\u2588\u2588\xA3\xA3\xA3 ",
94881
- " \u263A\u2591\u2588\u2588\xA3\xA3\xA3 ",
94882
- " \u263A \u2588\u2588\xA3\xA3\xA3 ",
94883
- " \u263A\u2588\u2588\xA3\xA3\xA3 ",
94884
- " \u263A\u2588\u2588\xA3\xA3\xA3 ",
94885
- " \u263A\u2593\u2588\xA3\xA3\xA3 ",
94886
- " \u263A\u2593\u2588\xA3\xA3\xA3 ",
94887
- " \u263A\u2592\u2588\xA3\xA3\xA3 ",
94888
- " \u263A\u2592\u2588\xA3\xA3\xA3 ",
94889
- " \u263A\u2591\u2588\xA3\xA3\xA3 ",
94890
- " \u263A\u2591\u2588\xA3\xA3\xA3 ",
94891
- " \u263A \u2588\xA3\xA3\xA3 ",
94892
- " \u263A\u2588\xA3\xA3\xA3 ",
94893
- " \u263A\u2588\xA3\xA3\xA3 ",
94894
- " \u263A\u2593\xA3\xA3\xA3 ",
94895
- " \u263A\u2593\xA3\xA3\xA3 ",
94896
- " \u263A\u2592\xA3\xA3\xA3 ",
94897
- " \u263A\u2592\xA3\xA3\xA3 ",
94898
- " \u263A\u2591\xA3\xA3\xA3 ",
94899
- " \u263A\u2591\xA3\xA3\xA3 ",
94900
- " \u263A \xA3\xA3\xA3 ",
94901
- " \u263A\xA3\xA3\xA3 ",
94902
- " \u263A\xA3\xA3\xA3 ",
94903
- " \u263A\u2593\xA3\xA3 ",
94904
- " \u263A\u2593\xA3\xA3 ",
94905
- " \u263A\u2592\xA3\xA3 ",
94906
- " \u263A\u2592\xA3\xA3 ",
94907
- " \u263A\u2591\xA3\xA3 ",
94908
- " \u263A\u2591\xA3\xA3 ",
94909
- " \u263A \xA3\xA3 ",
94910
- " \u263A\xA3\xA3 ",
94911
- " \u263A\xA3\xA3 ",
94912
- " \u263A\u2593\xA3 ",
94913
- " \u263A\u2593\xA3 ",
94914
- " \u263A\u2592\xA3 ",
94915
- " \u263A\u2592\xA3 ",
94916
- " \u263A\u2591\xA3 ",
94917
- " \u263A\u2591\xA3 ",
94918
- " \u263A \xA3 ",
94919
- " \u263A\xA3 ",
94920
- " \u263A\xA3 ",
94921
- " \u263A\u2593 ",
94922
- " \u263A\u2593 ",
94923
- " \u263A\u2592 ",
94924
- " \u263A\u2592 ",
94925
- " \u263A\u2591 ",
94926
- " \u263A\u2591 ",
94927
- " \u263A ",
94928
- " \u263A &",
94929
- " \u263A \u263C&",
94930
- " \u263A \u263C &",
94931
- " \u263A\u263C &",
94932
- " \u263A\u263C & ",
94933
- " \u203C & ",
94934
- " \u263A & ",
94935
- " \u203C & ",
94936
- " \u263A & ",
94937
- " \u203C & ",
94938
- " \u263A & ",
94939
- "\u203C & ",
94940
- " & ",
94941
- " & ",
94942
- " & \u2591 ",
94943
- " & \u2592 ",
94944
- " & \u2593 ",
94945
- " & \xA3 ",
94946
- " & \u2591\xA3 ",
94947
- " & \u2592\xA3 ",
94948
- " & \u2593\xA3 ",
94949
- " & \xA3\xA3 ",
94950
- " & \u2591\xA3\xA3 ",
94951
- " & \u2592\xA3\xA3 ",
94952
- "& \u2593\xA3\xA3 ",
94953
- "& \xA3\xA3\xA3 ",
94954
- " \u2591\xA3\xA3\xA3 ",
94955
- " \u2592\xA3\xA3\xA3 ",
94956
- " \u2593\xA3\xA3\xA3 ",
94957
- " \u2588\xA3\xA3\xA3 ",
94958
- " \u2591\u2588\xA3\xA3\xA3 ",
94959
- " \u2592\u2588\xA3\xA3\xA3 ",
94960
- " \u2593\u2588\xA3\xA3\xA3 ",
94961
- " \u2588\u2588\xA3\xA3\xA3 ",
94962
- " \u2591\u2588\u2588\xA3\xA3\xA3 ",
94963
- " \u2592\u2588\u2588\xA3\xA3\xA3 ",
94964
- " \u2593\u2588\u2588\xA3\xA3\xA3 ",
94965
- " \u2588\u2588\u2588\xA3\xA3\xA3 ",
94966
- " \u2591\u2588\u2588\u2588\xA3\xA3\xA3 ",
94967
- " \u2592\u2588\u2588\u2588\xA3\xA3\xA3 ",
94968
- " \u2593\u2588\u2588\u2588\xA3\xA3\xA3 ",
94969
- " \u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94970
- " \u2591\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94971
- " \u2592\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94972
- " \u2593\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94973
- " \u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94974
- " \u2591\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94975
- " \u2592\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94976
- " \u2593\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94977
- " \u2588\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 ",
94978
- " \u2588\u2588\u2588\u2588\u2588\u2588\xA3\xA3\xA3 "
94979
- ]
94980
- }
94981
- };
94982
- });
94983
-
94984
- // node_modules/cli-spinners/index.js
94985
- var require_cli_spinners = __commonJS((exports, module) => {
94986
- var spinners = Object.assign({}, require_spinners());
94987
- var spinnersList = Object.keys(spinners);
94988
- Object.defineProperty(spinners, "random", {
94989
- get() {
94990
- const randomIndex = Math.floor(Math.random() * spinnersList.length);
94991
- const spinnerName = spinnersList[randomIndex];
94992
- return spinners[spinnerName];
94993
- }
94994
- });
94995
- module.exports = spinners;
94996
- });
94997
-
94998
93480
  // src/commands/curator.ts
94999
93481
  var exports_curator = {};
95000
93482
  __export(exports_curator, {
@@ -95417,7 +93899,6 @@ async function buildPlanModeContext(workdir, fullConfig, options, deps) {
95417
93899
  branchName,
95418
93900
  timeoutSeconds,
95419
93901
  config: config2,
95420
- fullConfig,
95421
93902
  options,
95422
93903
  runtime,
95423
93904
  interactionChain,
@@ -95528,7 +94009,7 @@ var _debatePlanDeps = {
95528
94009
  class DebatePlanStrategy {
95529
94010
  mode = "debate";
95530
94011
  async execute(ctx) {
95531
- const { taskContext, outputFormat } = new PlanPromptBuilder().build(ctx.specContent, ctx.codebaseContext, undefined, ctx.relativePackages, ctx.packageDetails, ctx.fullConfig?.project);
94012
+ const { taskContext, outputFormat } = new PlanPromptBuilder().build(ctx.specContent, ctx.codebaseContext, undefined, ctx.relativePackages, ctx.packageDetails, ctx.config.project);
95532
94013
  const planStage = ctx.config.debate?.stages?.plan;
95533
94014
  if (!planStage) {
95534
94015
  throw new NaxError("[plan] debate strategy requires config.debate.stages.plan", "PLAN_DEBATE_STAGE_CONFIG_MISSING", {
@@ -95548,7 +94029,7 @@ class DebatePlanStrategy {
95548
94029
  ctx: callCtx,
95549
94030
  stage: "plan",
95550
94031
  stageConfig,
95551
- config: ctx.fullConfig,
94032
+ config: ctx.runtime.configLoader.current(),
95552
94033
  workdir: ctx.workdir,
95553
94034
  featureName: ctx.options.feature,
95554
94035
  timeoutSeconds: ctx.timeoutSeconds,
@@ -95560,7 +94041,7 @@ class DebatePlanStrategy {
95560
94041
  feature: ctx.options.feature,
95561
94042
  outputDir: ctx.outputDir,
95562
94043
  timeoutSeconds: ctx.timeoutSeconds,
95563
- maxInteractionTurns: ctx.fullConfig?.agent?.maxInteractionTurns,
94044
+ maxInteractionTurns: ctx.config.agent?.maxInteractionTurns,
95564
94045
  specContent: ctx.specContent
95565
94046
  });
95566
94047
  if (debateResult.outcome !== "failed" && debateResult.output) {
@@ -95572,7 +94053,7 @@ class DebatePlanStrategy {
95572
94053
  const prd = await callOp({
95573
94054
  ...callCtx,
95574
94055
  interactionBridge: ctx.interactionBridge,
95575
- maxInteractionTurns: ctx.fullConfig?.agent?.maxInteractionTurns
94056
+ maxInteractionTurns: ctx.config.agent?.maxInteractionTurns
95576
94057
  }, planInteractiveOp, {
95577
94058
  specContent: ctx.specContent,
95578
94059
  codebaseContext: ctx.codebaseContext,
@@ -95581,7 +94062,7 @@ class DebatePlanStrategy {
95581
94062
  outputPath: ctx.outputPath,
95582
94063
  packages: ctx.relativePackages,
95583
94064
  packageDetails: ctx.packageDetails,
95584
- projectProfile: ctx.fullConfig.project
94065
+ projectProfile: ctx.config.project
95585
94066
  });
95586
94067
  assertIsValidPrd(prd);
95587
94068
  const withProject = { ...prd, project: ctx.projectName };
@@ -95609,7 +94090,7 @@ var _pipelinePlanDeps = {
95609
94090
  class PipelinePlanStrategy {
95610
94091
  mode = "pipeline";
95611
94092
  async execute(ctx) {
95612
- if (ctx.fullConfig?.debate?.enabled === true) {
94093
+ if (ctx.config.debate?.enabled === true) {
95613
94094
  ctx.deps.getLogger()?.warn("plan", "pipeline mode active; debate config ignored", {
95614
94095
  storyId: ctx.options.feature,
95615
94096
  mode: "pipeline",
@@ -95645,10 +94126,10 @@ class PipelinePlanStrategy {
95645
94126
  codebaseContext: ctx.codebaseContext,
95646
94127
  feature: ctx.options.feature,
95647
94128
  branchName: ctx.branchName,
95648
- citationThreshold: ctx.fullConfig.plan?.citationThreshold ?? 0.5,
94129
+ citationThreshold: ctx.config.plan.citationThreshold,
95649
94130
  packages: ctx.relativePackages,
95650
94131
  packageDetails: ctx.packageDetails,
95651
- projectProfile: ctx.fullConfig?.project
94132
+ projectProfile: ctx.config.project
95652
94133
  };
95653
94134
  const draft = await _pipelinePlanDeps.callOp(callCtx, _pipelinePlanDeps.planDraftOp, draftCtx);
95654
94135
  const verdict = await _pipelinePlanDeps.runPlanCritic({
@@ -95657,7 +94138,7 @@ class PipelinePlanStrategy {
95657
94138
  workdir: ctx.workdir,
95658
94139
  runId: ctx.runtime.runId,
95659
94140
  storyId: ctx.options.feature,
95660
- config: ctx.fullConfig,
94141
+ config: ctx.runtime.configLoader.current(),
95661
94142
  callCtx,
95662
94143
  draftCtx
95663
94144
  });
@@ -95691,7 +94172,7 @@ class RefinePlanStrategy {
95691
94172
  storyId: ctx.options.feature,
95692
94173
  featureName: ctx.options.feature,
95693
94174
  interactionBridge: ctx.interactionBridge,
95694
- maxInteractionTurns: ctx.fullConfig.agent?.maxInteractionTurns
94175
+ maxInteractionTurns: ctx.config.agent?.maxInteractionTurns
95695
94176
  }, _refinePlanDeps.planRefineOp, {
95696
94177
  specContent: ctx.specContent,
95697
94178
  codebaseContext: ctx.codebaseContext,
@@ -95700,7 +94181,8 @@ class RefinePlanStrategy {
95700
94181
  outputPath: ctx.outputPath,
95701
94182
  packages: ctx.relativePackages,
95702
94183
  packageDetails: ctx.packageDetails,
95703
- projectProfile: ctx.fullConfig.project
94184
+ projectProfile: ctx.config.project,
94185
+ specGuard: ctx.config.plan.specGuard ?? false
95704
94186
  });
95705
94187
  return writeOrRecoverPrd(ctx, prd);
95706
94188
  } catch (err) {
@@ -95731,7 +94213,7 @@ class SinglePlanStrategy {
95731
94213
  storyId: ctx.options.feature,
95732
94214
  featureName: ctx.options.feature,
95733
94215
  interactionBridge: ctx.interactionBridge,
95734
- maxInteractionTurns: ctx.fullConfig.agent?.maxInteractionTurns
94216
+ maxInteractionTurns: ctx.config.agent?.maxInteractionTurns
95735
94217
  }, _singlePlanDeps.planInteractiveOp, {
95736
94218
  specContent: ctx.specContent,
95737
94219
  codebaseContext: ctx.codebaseContext,
@@ -95740,7 +94222,7 @@ class SinglePlanStrategy {
95740
94222
  outputPath: ctx.outputPath,
95741
94223
  packages: ctx.relativePackages,
95742
94224
  packageDetails: ctx.packageDetails,
95743
- projectProfile: ctx.fullConfig.project
94225
+ projectProfile: ctx.config.project
95744
94226
  });
95745
94227
  assertIsValidPrd(prd);
95746
94228
  await ctx.deps.writeFile(ctx.outputPath, JSON.stringify({ ...prd, project: ctx.projectName }, null, 2));
@@ -98539,7 +97021,8 @@ async function runSetupPhase(options) {
98539
97021
  getStoriesCompleted: options.getStoriesCompleted,
98540
97022
  getTotalStories: options.getTotalStories,
98541
97023
  agentGetFn: options.agentGetFn,
98542
- agentManager: options.agentManager
97024
+ agentManager: options.agentManager,
97025
+ agentStreamEvents: options.agentStreamEvents
98543
97026
  });
98544
97027
  return setupResult;
98545
97028
  }
@@ -98563,7 +97046,8 @@ async function run(options) {
98563
97046
  logFilePath,
98564
97047
  formatterMode = "normal",
98565
97048
  headless = false,
98566
- skipPrecheck = false
97049
+ skipPrecheck = false,
97050
+ agentStreamEvents
98567
97051
  } = options;
98568
97052
  const startTime = Date.now();
98569
97053
  const runStartedAt = new Date().toISOString();
@@ -98591,6 +97075,7 @@ async function run(options) {
98591
97075
  skipPrecheck,
98592
97076
  headless,
98593
97077
  formatterMode,
97078
+ agentStreamEvents,
98594
97079
  getTotalCost: () => totalCost,
98595
97080
  getIterations: () => iterations,
98596
97081
  getStoriesCompleted: () => storiesCompleted,
@@ -104906,7 +103391,7 @@ var import_react27 = __toESM(require_react(), 1);
104906
103391
  // node_modules/ink/build/hooks/use-cursor.js
104907
103392
  var import_react28 = __toESM(require_react(), 1);
104908
103393
  // src/tui/App.tsx
104909
- var import_react36 = __toESM(require_react(), 1);
103394
+ var import_react35 = __toESM(require_react(), 1);
104910
103395
 
104911
103396
  // src/utils/queue-writer.ts
104912
103397
  async function writeQueueCommand(queueFilePath, command) {
@@ -105234,27 +103719,6 @@ function HelpOverlay({ visible = false }) {
105234
103719
  }, undefined, true, undefined, this);
105235
103720
  }
105236
103721
 
105237
- // node_modules/ink-spinner/build/index.js
105238
- var import_react29 = __toESM(require_react(), 1);
105239
- var import_cli_spinners = __toESM(require_cli_spinners(), 1);
105240
- function Spinner({ type = "dots" }) {
105241
- const [frame, setFrame] = import_react29.useState(0);
105242
- const spinner = import_cli_spinners.default[type];
105243
- import_react29.useEffect(() => {
105244
- const timer = setInterval(() => {
105245
- setFrame((previousFrame) => {
105246
- const isLastFrame = previousFrame === spinner.frames.length - 1;
105247
- return isLastFrame ? 0 : previousFrame + 1;
105248
- });
105249
- }, spinner.interval);
105250
- return () => {
105251
- clearInterval(timer);
105252
- };
105253
- }, [spinner]);
105254
- return import_react29.default.createElement(Text, null, spinner.frames[frame]);
105255
- }
105256
- var build_default = Spinner;
105257
-
105258
103722
  // src/tui/components/LiveActivityPanel.tsx
105259
103723
  var jsx_dev_runtime3 = __toESM(require_jsx_dev_runtime(), 1);
105260
103724
  var MAX_ESCALATION_DISPLAY = 5;
@@ -105340,13 +103804,8 @@ function LiveActivityPanel({
105340
103804
  paddingY: 1,
105341
103805
  children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(Text, {
105342
103806
  dimColor: true,
105343
- children: [
105344
- /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(build_default, {
105345
- type: "dots"
105346
- }, undefined, false, undefined, this),
105347
- " Waiting for agent..."
105348
- ]
105349
- }, undefined, true, undefined, this)
103807
+ children: "Waiting for agent..."
103808
+ }, undefined, false, undefined, this)
105350
103809
  }, undefined, false, undefined, this)
105351
103810
  ]
105352
103811
  }, undefined, true, undefined, this);
@@ -105519,13 +103978,13 @@ function StatusBar({
105519
103978
  }
105520
103979
 
105521
103980
  // src/tui/components/StoriesPanel.tsx
105522
- var import_react31 = __toESM(require_react(), 1);
103981
+ var import_react30 = __toESM(require_react(), 1);
105523
103982
 
105524
103983
  // src/tui/hooks/useLayout.ts
105525
- var import_react30 = __toESM(require_react(), 1);
103984
+ var import_react29 = __toESM(require_react(), 1);
105526
103985
  function useLayout() {
105527
- const [layout, setLayout] = import_react30.useState(() => computeLayout());
105528
- import_react30.useEffect(() => {
103986
+ const [layout, setLayout] = import_react29.useState(() => computeLayout());
103987
+ import_react29.useEffect(() => {
105529
103988
  const handleResize = () => {
105530
103989
  setLayout(computeLayout());
105531
103990
  };
@@ -105584,8 +104043,8 @@ function getStatusIcon(status) {
105584
104043
  function StoriesPanel({ stories, width, compact: compact2 = false, maxHeight }) {
105585
104044
  const maxVisible = compact2 ? COMPACT_MAX_VISIBLE_STORIES : MAX_VISIBLE_STORIES;
105586
104045
  const needsScrolling = stories.length > maxVisible;
105587
- const [scrollOffset, setScrollOffset] = import_react31.useState(0);
105588
- import_react31.useEffect(() => {
104046
+ const [scrollOffset, setScrollOffset] = import_react30.useState(0);
104047
+ import_react30.useEffect(() => {
105589
104048
  const runningIndex = stories.findIndex((s) => s.status === "running");
105590
104049
  if (runningIndex !== -1 && needsScrolling) {
105591
104050
  if (runningIndex < scrollOffset) {
@@ -105703,10 +104162,10 @@ function StoriesPanel({ stories, width, compact: compact2 = false, maxHeight })
105703
104162
  }
105704
104163
 
105705
104164
  // src/tui/hooks/useAgentStreamEvents.ts
105706
- var import_react32 = __toESM(require_react(), 1);
104165
+ var import_react31 = __toESM(require_react(), 1);
105707
104166
  function useAgentStreamEvents(bus) {
105708
- const [activeCalls, setActiveCalls] = import_react32.useState(new Map);
105709
- import_react32.useEffect(() => {
104167
+ const [activeCalls, setActiveCalls] = import_react31.useState(new Map);
104168
+ import_react31.useEffect(() => {
105710
104169
  if (!bus)
105711
104170
  return;
105712
104171
  const unsubscribe = bus.onAgentStream((event) => {
@@ -105847,9 +104306,9 @@ function useKeyboard({ focus, currentStory, onAction, disabled = false }) {
105847
104306
 
105848
104307
  // src/tui/hooks/usePipelineBusEvents.ts
105849
104308
  init_pipeline();
105850
- var import_react33 = __toESM(require_react(), 1);
104309
+ var import_react32 = __toESM(require_react(), 1);
105851
104310
  function usePipelineBusEvents(initialStories) {
105852
- const [state, setState] = import_react33.useState(() => ({
104311
+ const [state, setState] = import_react32.useState(() => ({
105853
104312
  stories: initialStories,
105854
104313
  totalCost: 0,
105855
104314
  elapsedMs: 0,
@@ -105857,8 +104316,8 @@ function usePipelineBusEvents(initialStories) {
105857
104316
  runErrored: false,
105858
104317
  escalationLog: []
105859
104318
  }));
105860
- const startTimeRef = import_react33.useRef(Date.now());
105861
- import_react33.useEffect(() => {
104319
+ const startTimeRef = import_react32.useRef(Date.now());
104320
+ import_react32.useEffect(() => {
105862
104321
  const startTime = startTimeRef.current;
105863
104322
  const timer = setInterval(() => {
105864
104323
  setState((prev) => ({
@@ -105971,10 +104430,10 @@ function usePipelineBusEvents(initialStories) {
105971
104430
  }
105972
104431
 
105973
104432
  // src/tui/hooks/usePipelineEvents.ts
105974
- var import_react34 = __toESM(require_react(), 1);
104433
+ var import_react33 = __toESM(require_react(), 1);
105975
104434
  function usePipelineEvents(events) {
105976
- const [currentStage, setCurrentStage] = import_react34.useState(undefined);
105977
- import_react34.useEffect(() => {
104435
+ const [currentStage, setCurrentStage] = import_react33.useState(undefined);
104436
+ import_react33.useEffect(() => {
105978
104437
  const onStageEnter = (stage) => setCurrentStage(stage);
105979
104438
  events.on("stage:enter", onStageEnter);
105980
104439
  return () => events.off("stage:enter", onStageEnter);
@@ -105983,21 +104442,21 @@ function usePipelineEvents(events) {
105983
104442
  }
105984
104443
 
105985
104444
  // src/tui/hooks/usePty.ts
105986
- var import_react35 = __toESM(require_react(), 1);
104445
+ var import_react34 = __toESM(require_react(), 1);
105987
104446
  var MAX_PTY_BUFFER_LINES = 500;
105988
104447
  var MAX_LINE_LENGTH = 1e4;
105989
104448
  var PTY_FLUSH_INTERVAL_MS = 100;
105990
104449
  function usePty(options) {
105991
- const [state, setState] = import_react35.useState(() => ({
104450
+ const [state, setState] = import_react34.useState(() => ({
105992
104451
  outputLines: [],
105993
104452
  isRunning: false
105994
104453
  }));
105995
- const [handle, setHandle] = import_react35.useState(null);
104454
+ const [handle, setHandle] = import_react34.useState(null);
105996
104455
  const command = options?.command;
105997
104456
  const argsJson = JSON.stringify(options?.args);
105998
104457
  const cwd2 = options?.cwd;
105999
104458
  const envJson = JSON.stringify(options?.env);
106000
- import_react35.useEffect(() => {
104459
+ import_react34.useEffect(() => {
106001
104460
  if (!command) {
106002
104461
  return;
106003
104462
  }
@@ -106066,8 +104525,8 @@ function usePty(options) {
106066
104525
  proc.kill();
106067
104526
  };
106068
104527
  }, [command, argsJson, cwd2, envJson]);
106069
- const handleResize = import_react35.useCallback((_cols, _rows) => {}, []);
106070
- import_react35.useEffect(() => {
104528
+ const handleResize = import_react34.useCallback((_cols, _rows) => {}, []);
104529
+ import_react34.useEffect(() => {
106071
104530
  const onResize = () => {
106072
104531
  const cols = process.stdout.columns ?? 80;
106073
104532
  const rows = process.stdout.rows ?? 24;
@@ -106103,11 +104562,11 @@ function App2({
106103
104562
  const busState = usePipelineBusEvents(initialStories);
106104
104563
  const { currentStage } = usePipelineEvents(events);
106105
104564
  const { exit } = use_app_default();
106106
- const [focus, setFocus] = import_react36.useState("stories" /* Stories */);
106107
- const [showHelp, setShowHelp] = import_react36.useState(false);
106108
- const [showCost, setShowCost] = import_react36.useState(false);
106109
- const [showQuitConfirm, setShowQuitConfirm] = import_react36.useState(false);
106110
- const [showAbortConfirm, setShowAbortConfirm] = import_react36.useState(false);
104565
+ const [focus, setFocus] = import_react35.useState("stories" /* Stories */);
104566
+ const [showHelp, setShowHelp] = import_react35.useState(false);
104567
+ const [showCost, setShowCost] = import_react35.useState(false);
104568
+ const [showQuitConfirm, setShowQuitConfirm] = import_react35.useState(false);
104569
+ const [showAbortConfirm, setShowAbortConfirm] = import_react35.useState(false);
106111
104570
  const { handle: ptyHandle } = usePty(ptyOptions ?? null);
106112
104571
  const { activeCalls } = useAgentStreamEvents(agentStreamEvents);
106113
104572
  const isRunComplete = !!busState.runSummary;
@@ -106683,7 +105142,8 @@ program2.command("run").description("Run the orchestration loop for a feature").
106683
105142
  filePath: logFilePath,
106684
105143
  useChalk: true,
106685
105144
  formatterMode: useHeadless ? formatterMode : undefined,
106686
- headless: useHeadless
105145
+ headless: useHeadless,
105146
+ suppressConsole: !useHeadless
106687
105147
  });
106688
105148
  if (options.agent) {
106689
105149
  config2.agent ??= {};
@@ -106693,6 +105153,7 @@ program2.command("run").description("Run the orchestration loop for a feature").
106693
105153
  const globalNaxDir = join83(homedir3(), ".nax");
106694
105154
  const hooks = await loadHooksConfig(naxDir, globalNaxDir);
106695
105155
  const eventEmitter = new PipelineEventEmitter;
105156
+ const agentStreamEvents = useHeadless ? undefined : new AgentStreamEventBus;
106696
105157
  let tuiInstance;
106697
105158
  if (!useHeadless) {
106698
105159
  const prd = await loadPRD(prdPath);
@@ -106706,7 +105167,9 @@ program2.command("run").description("Run the orchestration loop for a feature").
106706
105167
  feature: options.feature,
106707
105168
  stories: initialStories,
106708
105169
  events: eventEmitter,
106709
- ptyOptions: null
105170
+ ptyOptions: null,
105171
+ agentStreamEvents,
105172
+ queueFilePath: join83(workdir, ".queue.txt")
106710
105173
  });
106711
105174
  } else {
106712
105175
  console.log(source_default.dim(" [Headless mode \u2014 pipe output]"));
@@ -106735,7 +105198,8 @@ program2.command("run").description("Run the orchestration loop for a feature").
106735
105198
  logFilePath,
106736
105199
  formatterMode: useHeadless ? formatterMode : undefined,
106737
105200
  headless: useHeadless,
106738
- skipPrecheck: options.skipPrecheck ?? false
105201
+ skipPrecheck: options.skipPrecheck ?? false,
105202
+ agentStreamEvents
106739
105203
  });
106740
105204
  const latestSymlink = join83(runsDir, "latest.jsonl");
106741
105205
  try {