@rayu-dev/rayu-cli 1.3.428 → 1.3.429

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/rayu.js +483 -212
  2. package/package.json +1 -1
package/dist/rayu.js CHANGED
@@ -35755,8 +35755,10 @@ var exports_rayuProviders = {};
35755
35755
  __export(exports_rayuProviders, {
35756
35756
  vertexHost: () => vertexHost,
35757
35757
  vertexBaseURL: () => vertexBaseURL,
35758
+ providerDisplayName: () => providerDisplayName,
35758
35759
  ollamaBaseURL: () => ollamaBaseURL,
35759
35760
  migrateEnvKeysToConfig: () => migrateEnvKeysToConfig,
35761
+ getActiveProviderDisplayName: () => getActiveProviderDisplayName,
35760
35762
  bedrockBaseURL: () => bedrockBaseURL,
35761
35763
  VERTEX_REGIONS: () => VERTEX_REGIONS,
35762
35764
  PROVIDER_PRESETS: () => PROVIDER_PRESETS,
@@ -35848,7 +35850,34 @@ function migrateEnvKeysToConfig() {
35848
35850
  saveRayuConfig(cfg);
35849
35851
  }
35850
35852
  }
35851
- var DEFAULT_BEDROCK_REGION = "us-east-1", BEDROCK_REGIONS, GEMINI_VERTEX_PROVIDER_ID = "gemini-vertex", DEFAULT_VERTEX_REGION = "global", VERTEX_REGIONS, OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434/v1", PROVIDER_PRESETS;
35853
+ function providerKindName(kind) {
35854
+ switch (kind) {
35855
+ case "vertex":
35856
+ return "Vertex AI";
35857
+ case "bedrock":
35858
+ return "AWS Bedrock";
35859
+ case "genai":
35860
+ return "Gemini";
35861
+ case "anthropic":
35862
+ return "Anthropic";
35863
+ default:
35864
+ return "OpenAI-compatible";
35865
+ }
35866
+ }
35867
+ function providerDisplayName(provider) {
35868
+ const known = PROVIDER_DISPLAY_NAMES[provider.id];
35869
+ if (known)
35870
+ return known;
35871
+ if (provider.kind === "openai-compatible" && provider.baseURL && /(?:\/\/|@)(?:localhost|127\.0\.0\.1)(?::\d+)?|:11434(?:\/|$)/.test(provider.baseURL)) {
35872
+ return "Ollama";
35873
+ }
35874
+ return providerKindName(provider.kind);
35875
+ }
35876
+ function getActiveProviderDisplayName() {
35877
+ const p = getActiveProvider();
35878
+ return p ? providerDisplayName(p) : undefined;
35879
+ }
35880
+ var DEFAULT_BEDROCK_REGION = "us-east-1", BEDROCK_REGIONS, GEMINI_VERTEX_PROVIDER_ID = "gemini-vertex", DEFAULT_VERTEX_REGION = "global", VERTEX_REGIONS, OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434/v1", PROVIDER_PRESETS, PROVIDER_DISPLAY_NAMES;
35852
35881
  var init_rayuProviders = __esm(() => {
35853
35882
  init_rayuConfig();
35854
35883
  init_envUtils();
@@ -36047,6 +36076,31 @@ var init_rayuProviders = __esm(() => {
36047
36076
  promptBaseURL: true
36048
36077
  }
36049
36078
  ];
36079
+ PROVIDER_DISPLAY_NAMES = {
36080
+ anthropic: "Anthropic",
36081
+ nvidia: "NVIDIA",
36082
+ doubleword: "Doubleword",
36083
+ deepseek: "DeepSeek",
36084
+ "kimi-moonshot": "Kimi",
36085
+ "kimi-for-code": "Kimi for Code",
36086
+ openai: "OpenAI",
36087
+ gemini: "Gemini",
36088
+ [GEMINI_VERTEX_PROVIDER_ID]: "Vertex AI",
36089
+ "gemini-login": "Gemini",
36090
+ openrouter: "OpenRouter",
36091
+ xai: "xAI",
36092
+ groq: "Groq",
36093
+ fireworks: "Fireworks AI",
36094
+ togetherai: "Together AI",
36095
+ cerebras: "Cerebras",
36096
+ baseten: "Baseten",
36097
+ deepinfra: "DeepInfra",
36098
+ bedrock: "AWS Bedrock",
36099
+ "bedrock-openai": "AWS Bedrock",
36100
+ "bedrock-anthropic": "AWS Bedrock",
36101
+ ollama: "Ollama",
36102
+ local: "Local"
36103
+ };
36050
36104
  });
36051
36105
 
36052
36106
  // src/utils/rayuConfig.ts
@@ -148091,7 +148145,7 @@ var init_auth = __esm(() => {
148091
148145
 
148092
148146
  // src/utils/userAgent.ts
148093
148147
  function getRayuUserAgent() {
148094
- return `rayu/${"1.3.428"}`;
148148
+ return `rayu/${"1.3.429"}`;
148095
148149
  }
148096
148150
  var getClaudeCodeUserAgent;
148097
148151
  var init_userAgent = __esm(() => {
@@ -148117,7 +148171,7 @@ function getUserAgent() {
148117
148171
  const clientApp = process.env.RAYU_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}` : "";
148118
148172
  const workload = getWorkload();
148119
148173
  const workloadSuffix = workload ? `, workload/${workload}` : "";
148120
- return `rayu/${"1.3.428"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
148174
+ return `rayu/${"1.3.429"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
148121
148175
  }
148122
148176
  function getMCPUserAgent() {
148123
148177
  const parts = [];
@@ -148131,7 +148185,7 @@ function getMCPUserAgent() {
148131
148185
  parts.push(`client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}`);
148132
148186
  }
148133
148187
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
148134
- return `rayu/${"1.3.428"}${suffix}`;
148188
+ return `rayu/${"1.3.429"}${suffix}`;
148135
148189
  }
148136
148190
  function getWebFetchUserAgent() {
148137
148191
  return `Rayu-User (${getRayuUserAgent()})`;
@@ -148254,7 +148308,7 @@ var init_user = __esm(() => {
148254
148308
  deviceId,
148255
148309
  sessionId: getSessionId(),
148256
148310
  email: getEmail(),
148257
- appVersion: "1.3.428",
148311
+ appVersion: "1.3.429",
148258
148312
  platform: getHostPlatformForAnalytics(),
148259
148313
  organizationUuid,
148260
148314
  accountUuid,
@@ -165036,7 +165090,7 @@ function isToolUnsupported(e2, req) {
165036
165090
  return /does(n'?t| not) support tool|tool[\s_-]*(calling|use|s)\b[^.]*\bnot\s+support|function[\s_-]*call(ing)?\b[^.]*\bnot\s+support|no support for tool/i.test(msg);
165037
165091
  }
165038
165092
  function toolUnsupportedError(e2, model) {
165039
- const message = `Model "${model}" does not support tools (function calling), which ${PRODUCT_NAME} needs ` + `to read/edit files, run commands, and search. Small local LLMs often lack tool support. ` + `Pick a tool-capable model with /model (e.g. qwen2.5-coder, llama3.1, qwen3, mistral-nemo), ` + `pull one with "ollama pull qwen2.5-coder", or use a hosted/Ollama Cloud model.`;
165093
+ const message = `Model "${model}" is too small to use tools — it doesn't support function calling, ` + `which ${PRODUCT_NAME} needs to read/edit files, run commands, and search. Use a larger ` + `tool-capable model: pull one locally ("ollama pull qwen2.5-coder", or llama3.1 / qwen3 / ` + `mistral-nemo), or use an Ollama Cloud model, then select it with /model.`;
165040
165094
  return import_sdk2.APIError.generate(400, e2?.error, message, e2?.headers);
165041
165095
  }
165042
165096
  function normalizeError(e2) {
@@ -182049,7 +182103,7 @@ var init_metadata = __esm(() => {
182049
182103
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
182050
182104
  WHITESPACE_REGEX = /\s+/;
182051
182105
  getVersionBase = memoize_default(() => {
182052
- const match = "1.3.428".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
182106
+ const match = "1.3.429".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
182053
182107
  return match ? match[0] : undefined;
182054
182108
  });
182055
182109
  buildEnvContext = memoize_default(async () => {
@@ -182088,7 +182142,7 @@ var init_metadata = __esm(() => {
182088
182142
  },
182089
182143
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
182090
182144
  isRayuAction: isEnvTruthy(process.env.RAYU_ACTION),
182091
- version: "1.3.428",
182145
+ version: "1.3.429",
182092
182146
  versionBase: getVersionBase(),
182093
182147
  buildTime: "",
182094
182148
  deploymentEnvironment: env4.detectDeploymentEnvironment(),
@@ -182702,7 +182756,7 @@ function initialize1PEventLogging() {
182702
182756
  const platform2 = getPlatform();
182703
182757
  const attributes = {
182704
182758
  [import_semantic_conventions.ATTR_SERVICE_NAME]: "rayu",
182705
- [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.3.428"
182759
+ [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.3.429"
182706
182760
  };
182707
182761
  if (platform2 === "wsl") {
182708
182762
  const wslVersion = getWslVersion();
@@ -182729,7 +182783,7 @@ function initialize1PEventLogging() {
182729
182783
  })
182730
182784
  ]
182731
182785
  });
182732
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("io.rayu.events", "1.3.428");
182786
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("io.rayu.events", "1.3.429");
182733
182787
  }
182734
182788
  async function reinitialize1PEventLoggingIfConfigChanged() {
182735
182789
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -218645,7 +218699,7 @@ function getAttributionHeader(fingerprint) {
218645
218699
  if (!isAttributionHeaderEnabled()) {
218646
218700
  return "";
218647
218701
  }
218648
- const version2 = `${"1.3.428"}.${fingerprint}`;
218702
+ const version2 = `${"1.3.429"}.${fingerprint}`;
218649
218703
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
218650
218704
  const cch = "";
218651
218705
  const workload = getWorkload();
@@ -269590,6 +269644,51 @@ var init_asset_generation = __esm(() => {
269590
269644
  };
269591
269645
  });
269592
269646
 
269647
+ // src/tools/AgentTool/built-in/subagents/backend-design.ts
269648
+ function getBackendDesignSystemPrompt() {
269649
+ return `You are the Backend Design subagent for RAYU — you author a complete API + Data Model PRD (Product Requirements Document) for the server side from the task packet, so the backend collaborator can implement without guessing.
269650
+
269651
+ ${EPHEMERAL_FRAMING}
269652
+
269653
+ ${SKILL_SEEKING}
269654
+
269655
+ ## Your job
269656
+ Define, precisely and concretely, the backend contract so every downstream agent builds against the SAME shapes:
269657
+
269658
+ ### 1. API contract
269659
+ - **Endpoints** — for each: HTTP method + path (e.g. \`POST /api/auth/login\`), a one-line purpose.
269660
+ - **Request** — path/query params and request body schema (field names, types, required/optional, validation rules).
269661
+ - **Response** — success body schema + HTTP status code(s).
269662
+ - **Errors** — error response shape and the status codes each endpoint can return (400/401/403/404/409/422/500…).
269663
+ - **Auth per route** — public vs authenticated, and the role/permission required (ties into the security collaborator's RBAC).
269664
+
269665
+ ### 2. Data model (database design)
269666
+ - **Entities/tables** — each with fields (name, type, nullable, default).
269667
+ - **Relations** — one-to-many / many-to-many, foreign keys, on-delete behavior.
269668
+ - **Indexes & constraints** — unique constraints, indexes for hot queries, check constraints.
269669
+ - **Migration plan** — the ordered migrations needed to reach this schema.
269670
+
269671
+ ## Rules
269672
+ - Be exact and unambiguous — downstream agents treat this as the source of truth.
269673
+ - Keep the API and the data model ALIGNED (every response field is backed by the schema; every entity that needs CRUD has endpoints).
269674
+ - Do not invent scope beyond the packet; if something is genuinely missing, state the assumption and proceed.
269675
+
269676
+ ## Output
269677
+ Return the API + Data Model PRD as a single, well-structured markdown document (sections above). If the caller asked you to persist it, write it to the path given in the packet; otherwise return it as your final message.`;
269678
+ }
269679
+ var BACKEND_DESIGN_SUBAGENT;
269680
+ var init_backend_design = __esm(() => {
269681
+ BACKEND_DESIGN_SUBAGENT = {
269682
+ agentType: "backend-design",
269683
+ whenToUse: "Use to produce a complete API + Data Model PRD (endpoints with request/response schemas, status codes, error shapes, auth-per-route, plus entities, relations, indexes, and a migration plan) that the backend collaborator implements against as the single source of truth. The backend analog of `design`; best run before any backend implementation.",
269684
+ disallowedTools: [FILE_EDIT_TOOL_NAME, BASH_TOOL_NAME],
269685
+ source: "built-in",
269686
+ baseDir: "built-in",
269687
+ color: "blue",
269688
+ getSystemPrompt: getBackendDesignSystemPrompt
269689
+ };
269690
+ });
269691
+
269593
269692
  // src/tools/AgentTool/built-in/subagents/design.ts
269594
269693
  function getDesignSystemPrompt() {
269595
269694
  return `You are the Design subagent for RAYU — you author a complete Design PRD (Product Requirements Document) for a UI/product from the task packet.
@@ -269665,7 +269764,9 @@ ${SKILL_SEEKING}
269665
269764
  - Install all required dependencies.
269666
269765
  - Configure tooling (e.g. tailwind/theme config, linter, tsconfig) with the EXACT tokens from the Design PRD (colors, fonts) when provided.
269667
269766
  - Set up global styles and shared utilities/helpers called for by the brief.
269668
- - Create the folder structure (e.g. components, sections, hooks, lib, public/assets).
269767
+ - Create the folder structure for BOTH tiers as the stack needs them:
269768
+ - frontend (e.g. components, sections, hooks, lib, public/assets),
269769
+ - backend (e.g. routes/controllers, services, models, migrations, middleware, config).
269669
269770
 
269670
269771
  ## Rules
269671
269772
  - Use the exact stack/versions specified — do not substitute.
@@ -269795,6 +269896,7 @@ var init_review = __esm(() => {
269795
269896
  var SUBAGENTS, SUBAGENT_TYPES;
269796
269897
  var init_subagents = __esm(() => {
269797
269898
  init_asset_generation();
269899
+ init_backend_design();
269798
269900
  init_design();
269799
269901
  init_fix();
269800
269902
  init_global_setup();
@@ -269804,6 +269906,7 @@ var init_subagents = __esm(() => {
269804
269906
  SUBAGENTS = [
269805
269907
  PA_SUBAGENT,
269806
269908
  DESIGN_SUBAGENT,
269909
+ BACKEND_DESIGN_SUBAGENT,
269807
269910
  GLOBAL_SETUP_SUBAGENT,
269808
269911
  ASSET_GENERATION_SUBAGENT,
269809
269912
  REVIEW_SUBAGENT,
@@ -270311,7 +270414,7 @@ function defineCollaborator(s2) {
270311
270414
  return {
270312
270415
  agentType: s2.agentType,
270313
270416
  whenToUse: s2.whenToUse,
270314
- tools: ["*"],
270417
+ tools: s2.allowedSubagents ? ["*", `Agent(${s2.allowedSubagents.join(",")})`] : ["*"],
270315
270418
  color: s2.color,
270316
270419
  source: "built-in",
270317
270420
  baseDir: "built-in",
@@ -270357,6 +270460,14 @@ var init_backend = __esm(() => {
270357
270460
  role: "You build the backend end-to-end: API endpoints, the service layer and business logic, middleware/error handling, env config, and the data layer (schema design, models, relations, indexes, migrations). You implement the auth/security flow that the security collaborator defines.",
270358
270461
  skillHint: "e.g. an API-design skill for clean, consistent endpoint and schema design",
270359
270462
  withStackAwareness: true,
270463
+ allowedSubagents: [
270464
+ "backend-design",
270465
+ "review",
270466
+ "fix",
270467
+ "linter",
270468
+ "Explore",
270469
+ "general-purpose"
270470
+ ],
270360
270471
  owns: [
270361
270472
  "API routes (method, path, auth, request/response shapes)",
270362
270473
  "Service layer, business logic, middleware, error handling",
@@ -270378,6 +270489,7 @@ var init_deploy = __esm(() => {
270378
270489
  whenToUse: "DevOps & deployment: containerization, CI/CD, environment/secrets config, build pipelines, and shipping to the hosting target. Runs the production build, fixes build errors, and iterates until the app is deployable/live.",
270379
270490
  role: "You package and ship what the other collaborators built: Dockerfile/compose, CI/CD pipeline, environment and secrets configuration, health checks, and deployment to the target platform. You run the production build, resolve build errors, and iterate until deployment succeeds, then report the result/URL.",
270380
270491
  skillHint: "e.g. a deployment/CI skill for the target platform (Docker, Vercel, etc.)",
270492
+ allowedSubagents: ["review", "fix", "linter", "Explore", "general-purpose"],
270381
270493
  owns: [
270382
270494
  "Dockerfile (multi-stage) and docker-compose",
270383
270495
  "CI/CD pipeline and build configuration",
@@ -270400,10 +270512,19 @@ var init_frontend = __esm(() => {
270400
270512
  role: "You build the web frontend end-to-end against the design and the backend contracts: page structure and navigation, the component tree, state management, the design system (tokens, spacing, typography), motion/interactions, and wiring to the API. You produce working, production-ready UI — not just layouts.",
270401
270513
  skillHint: "e.g. a UI/UX design skill such as ui-ux-pro-max for stronger visual/UX decisions",
270402
270514
  withStackAwareness: true,
270515
+ allowedSubagents: [
270516
+ "design",
270517
+ "asset-generation",
270518
+ "review",
270519
+ "fix",
270520
+ "linter",
270521
+ "Explore",
270522
+ "general-purpose"
270523
+ ],
270403
270524
  owns: [
270404
270525
  "Page/screen architecture and the component tree",
270405
270526
  "State management and data fetching",
270406
- "Design system tokens (color, typography, spacing) and responsive behavior",
270527
+ "Implements the Design PRD tokens (color, typography, spacing) and responsive behavior",
270407
270528
  "Animations/interactions and accessibility",
270408
270529
  "API integration against the backend collaborator’s routes"
270409
270530
  ]
@@ -270423,6 +270544,16 @@ var init_mobile = __esm(() => {
270423
270544
  role: "You build the mobile app against the backend contracts and the auth flow: screen architecture and navigation, state management, the API service layer, auth implementation, and offline support. You produce working, production-ready mobile code.",
270424
270545
  skillHint: "e.g. a mobile/Flutter UI skill for idiomatic screens and navigation",
270425
270546
  withStackAwareness: true,
270547
+ allowedSubagents: [
270548
+ "design",
270549
+ "asset-generation",
270550
+ "backend-design",
270551
+ "review",
270552
+ "fix",
270553
+ "linter",
270554
+ "Explore",
270555
+ "general-purpose"
270556
+ ],
270426
270557
  owns: [
270427
270558
  "Screen architecture and navigation",
270428
270559
  "State management (Riverpod/Bloc/Provider or RN equivalent)",
@@ -270444,6 +270575,14 @@ var init_security = __esm(() => {
270444
270575
  whenToUse: "Security work: design AND implement auth/authorization (RBAC), input validation, secret/sensitive-data handling, and harden endpoints. Reviews other collaborators’ code for vulnerabilities and fixes them. Its security decisions are authoritative.",
270445
270576
  role: "You own security end-to-end: design the auth flow and authorization model, then implement and enforce it — guards/middleware, validation, secret handling, security headers, and OWASP Top-10 hardening. You also audit the backend/frontend for vulnerabilities and fix them. Your security decisions are the source of truth and override convenience.",
270446
270577
  skillHint: "e.g. a security-review or OWASP skill for systematic threat coverage",
270578
+ allowedSubagents: [
270579
+ "backend-design",
270580
+ "review",
270581
+ "fix",
270582
+ "linter",
270583
+ "Explore",
270584
+ "general-purpose"
270585
+ ],
270447
270586
  owns: [
270448
270587
  "Authentication + authorization (RBAC) design and implementation",
270449
270588
  "Input validation and sensitive-data (hash/encrypt) handling",
@@ -303250,7 +303389,7 @@ function getTelemetryAttributes() {
303250
303389
  attributes["session.id"] = sessionId;
303251
303390
  }
303252
303391
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
303253
- attributes["app.version"] = "1.3.428";
303392
+ attributes["app.version"] = "1.3.429";
303254
303393
  }
303255
303394
  const oauthAccount = getOauthAccountInfo();
303256
303395
  if (oauthAccount) {
@@ -413560,7 +413699,7 @@ function getInstallationEnv() {
413560
413699
  return;
413561
413700
  }
413562
413701
  function getClaudeCodeVersion() {
413563
- return "1.3.428";
413702
+ return "1.3.429";
413564
413703
  }
413565
413704
  async function getInstalledVSCodeExtensionVersion(command) {
413566
413705
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -418798,7 +418937,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
418798
418937
  const client4 = new Client({
418799
418938
  name: "claude-code",
418800
418939
  title: "RAYU",
418801
- version: "1.3.428",
418940
+ version: "1.3.429",
418802
418941
  description: "Anthropic's agentic coding tool",
418803
418942
  websiteUrl: PRODUCT_URL
418804
418943
  }, {
@@ -419115,7 +419254,7 @@ var init_client7 = __esm(() => {
419115
419254
  const client4 = new Client({
419116
419255
  name: "claude-code",
419117
419256
  title: "RAYU",
419118
- version: "1.3.428",
419257
+ version: "1.3.429",
419119
419258
  description: "Anthropic's agentic coding tool",
419120
419259
  websiteUrl: PRODUCT_URL
419121
419260
  }, {
@@ -433920,7 +434059,7 @@ function computeFingerprint(messageText, version2) {
433920
434059
  }
433921
434060
  function computeFingerprintFromMessages(messages) {
433922
434061
  const firstMessageText = extractFirstMessageText(messages);
433923
- return computeFingerprint(firstMessageText, "1.3.428");
434062
+ return computeFingerprint(firstMessageText, "1.3.429");
433924
434063
  }
433925
434064
  var FINGERPRINT_SALT = "59cf53e54c78";
433926
434065
  var init_fingerprint = () => {};
@@ -433962,7 +434101,7 @@ async function sideQuery(opts) {
433962
434101
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
433963
434102
  }
433964
434103
  const messageText = extractFirstUserMessageText(messages);
433965
- const fingerprint = computeFingerprint(messageText, "1.3.428");
434104
+ const fingerprint = computeFingerprint(messageText, "1.3.429");
433966
434105
  const attributionHeader = getAttributionHeader(fingerprint);
433967
434106
  const systemBlocks = [
433968
434107
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -434110,13 +434249,21 @@ function resolveAgentTools(agentDefinition, availableTools, isAsync3 = false, is
434110
434249
  return toolName2;
434111
434250
  }) ?? []);
434112
434251
  const allowedAvailableTools = filteredAvailableTools.filter((tool) => !disallowedToolSet.has(tool.name));
434113
- const hasWildcard = agentTools === undefined || agentTools.length === 1 && agentTools[0] === "*";
434252
+ const hasWildcard = agentTools === undefined || agentTools.some((t2) => t2 === "*");
434114
434253
  if (hasWildcard) {
434254
+ let wildcardAllowedAgentTypes;
434255
+ for (const toolSpec of agentTools ?? []) {
434256
+ const { toolName: toolName2, ruleContent } = permissionRuleValueFromString(toolSpec);
434257
+ if (toolName2 === AGENT_TOOL_NAME && ruleContent) {
434258
+ wildcardAllowedAgentTypes = ruleContent.split(",").map((s2) => s2.trim());
434259
+ }
434260
+ }
434115
434261
  return {
434116
434262
  hasWildcard: true,
434117
434263
  validTools: [],
434118
434264
  invalidTools: [],
434119
- resolvedTools: allowedAvailableTools
434265
+ resolvedTools: allowedAvailableTools,
434266
+ allowedAgentTypes: wildcardAllowedAgentTypes
434120
434267
  };
434121
434268
  }
434122
434269
  const availableToolMap = new Map;
@@ -490902,6 +491049,7 @@ var init_ExitPlanModeV2Tool = __esm(() => {
490902
491049
  }
490903
491050
  return {
490904
491051
  ...prev,
491052
+ swarmMode: true,
490905
491053
  toolPermissionContext: {
490906
491054
  ...baseContext,
490907
491055
  mode: restoreMode,
@@ -491072,7 +491220,7 @@ function AskUserQuestionResultMessage(t0) {
491072
491220
  ]
491073
491221
  }, undefined, true, undefined, this),
491074
491222
  /* @__PURE__ */ jsx_dev_runtime139.jsxDEV(ThemedText, {
491075
- children: "User answered Claude's questions:"
491223
+ children: "User answered Rayu's questions:"
491076
491224
  }, undefined, false, undefined, this)
491077
491225
  ]
491078
491226
  }, undefined, true, undefined, this);
@@ -502831,6 +502979,7 @@ function getDefaultAppState() {
502831
502979
  snapshotSequence: 0
502832
502980
  },
502833
502981
  pendingFileChanges: [],
502982
+ swarmMode: false,
502834
502983
  attribution: createEmptyAttributionState(),
502835
502984
  mcp: {
502836
502985
  clients: [],
@@ -509254,6 +509403,19 @@ You have exited plan mode. You can now make edits, run tools, and take actions.$
509254
509403
  createUserMessage({ content, isMeta: true })
509255
509404
  ]);
509256
509405
  }
509406
+ case "swarm_mode": {
509407
+ const content = `## Collaborator-swarm mode is ON
509408
+
509409
+ You are the ORCHESTRATOR — coordinate, do not implement yourself. Run the 3-phase build flow:
509410
+ 1. SCOPE & RESEARCH — clarify the request's detail and scope; ask the user for their preferred tech stack (offer recommendations with rationale). For open implementation choices (e.g. payment: Stripe / bank / ABA), dispatch the PA subagent to research the real options and present them for the user to choose.
509411
+ 2. ALIGNED PLAN — have PA produce ONE coherent plan, explicitly aligned across backend AND frontend (shared API contract, data model, auth); get the user's confirmation.
509412
+ 3. DELEGATE BY SPECIALTY — decompose into backend / frontend / mobile subtasks and delegate to the matching collaborators (run independent work in parallel). Each collaborator may use only its allowed subagents.
509413
+
509414
+ The user can return to normal mode with /normal.`;
509415
+ return wrapMessagesInSystemReminder([
509416
+ createUserMessage({ content, isMeta: true })
509417
+ ]);
509418
+ }
509257
509419
  case "auto_mode": {
509258
509420
  return getAutoModeInstructions(attachment);
509259
509421
  }
@@ -512468,6 +512630,7 @@ async function getAttachments(input, toolUseContext, ideSelection, queuedCommand
512468
512630
  maybe("skill_listing", () => getSkillListingAttachments(context)),
512469
512631
  maybe("plan_mode", () => getPlanModeAttachments(messages, toolUseContext)),
512470
512632
  maybe("plan_mode_exit", () => getPlanModeExitAttachment(toolUseContext)),
512633
+ maybe("swarm_mode", () => getSwarmModeAttachment(messages, toolUseContext)),
512471
512634
  ...[],
512472
512635
  maybe("todo_reminders", () => isTodoV2Enabled() ? getTaskReminderAttachments(messages, toolUseContext) : getTodoReminderAttachments(messages, toolUseContext)),
512473
512636
  ...isAgentSwarmsEnabled() ? [
@@ -512653,6 +512816,22 @@ async function getPlanModeAttachments(messages, toolUseContext) {
512653
512816
  });
512654
512817
  return attachments;
512655
512818
  }
512819
+ async function getSwarmModeAttachment(messages, toolUseContext) {
512820
+ if (toolUseContext.agentId) {
512821
+ return [];
512822
+ }
512823
+ if (!toolUseContext.getAppState().swarmMode) {
512824
+ return [];
512825
+ }
512826
+ if (messages && messages.length > 0) {
512827
+ const last2 = messages[messages.length - 1];
512828
+ const isHumanTurn2 = last2?.type === "user" && !last2.isMeta && !hasToolResultContent(last2.message.content);
512829
+ if (!isHumanTurn2) {
512830
+ return [];
512831
+ }
512832
+ }
512833
+ return [{ type: "swarm_mode" }];
512834
+ }
512656
512835
  async function getPlanModeExitAttachment(toolUseContext) {
512657
512836
  if (!needsPlanModeExitAttachment()) {
512658
512837
  return [];
@@ -528900,7 +529079,7 @@ function Feedback({
528900
529079
  platform: env4.platform,
528901
529080
  gitRepo: envInfo.isGit,
528902
529081
  terminal: env4.terminal,
528903
- version: "1.3.428",
529082
+ version: "1.3.429",
528904
529083
  transcript: normalizeMessagesForAPI(messages),
528905
529084
  errors: sanitizedErrors,
528906
529085
  lastApiRequest: getLastAPIRequest(),
@@ -529092,7 +529271,7 @@ function Feedback({
529092
529271
  ", ",
529093
529272
  env4.terminal,
529094
529273
  ", v",
529095
- "1.3.428"
529274
+ "1.3.429"
529096
529275
  ]
529097
529276
  }, undefined, true, undefined, this)
529098
529277
  ]
@@ -529198,7 +529377,7 @@ ${sanitizedDescription}
529198
529377
  ` + `**Environment Info**
529199
529378
  ` + `- Platform: ${env4.platform}
529200
529379
  ` + `- Terminal: ${env4.terminal}
529201
- ` + `- Version: ${"1.3.428"}
529380
+ ` + `- Version: ${"1.3.429"}
529202
529381
  ` + `- Feedback ID: ${feedbackId}
529203
529382
  ` + `
529204
529383
  **Errors**
@@ -530486,6 +530665,7 @@ async function clearConversation({
530486
530665
  snapshotSequence: 0
530487
530666
  },
530488
530667
  pendingFileChanges: [],
530668
+ swarmMode: false,
530489
530669
  mcp: {
530490
530670
  clients: [],
530491
530671
  tools: [],
@@ -532037,9 +532217,9 @@ async function assertMinVersion() {
532037
532217
  if (false) {}
532038
532218
  try {
532039
532219
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
532040
- if (versionConfig.minVersion && lt("1.3.428", versionConfig.minVersion)) {
532220
+ if (versionConfig.minVersion && lt("1.3.429", versionConfig.minVersion)) {
532041
532221
  console.error(`
532042
- It looks like your version of RAYU (${"1.3.428"}) needs an update.
532222
+ It looks like your version of RAYU (${"1.3.429"}) needs an update.
532043
532223
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
532044
532224
 
532045
532225
  To update, please run:
@@ -532265,7 +532445,7 @@ async function installGlobalPackage(specificVersion) {
532265
532445
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
532266
532446
  logEvent("tengu_auto_updater_lock_contention", {
532267
532447
  pid: process.pid,
532268
- currentVersion: "1.3.428"
532448
+ currentVersion: "1.3.429"
532269
532449
  });
532270
532450
  return "in_progress";
532271
532451
  }
@@ -532274,7 +532454,7 @@ async function installGlobalPackage(specificVersion) {
532274
532454
  if (!env4.isRunningWithBun() && env4.isNpmFromWindowsPath()) {
532275
532455
  logError2(new Error("Windows NPM detected in WSL environment"));
532276
532456
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
532277
- currentVersion: "1.3.428"
532457
+ currentVersion: "1.3.429"
532278
532458
  });
532279
532459
  console.error(`
532280
532460
  Error: Windows NPM detected in WSL
@@ -532810,7 +532990,7 @@ function detectLinuxGlobPatternWarnings() {
532810
532990
  }
532811
532991
  async function getDoctorDiagnostic() {
532812
532992
  const installationType = await getCurrentInstallationType();
532813
- const version2 = typeof MACRO !== "undefined" ? "1.3.428" : "unknown";
532993
+ const version2 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
532814
532994
  const installationPath = await getInstallationPath();
532815
532995
  const invokedBinary = getInvokedBinary();
532816
532996
  const multipleInstallations = await detectMultipleInstallations();
@@ -533605,8 +533785,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
533605
533785
  const maxVersion = await getMaxVersion();
533606
533786
  if (maxVersion && gt(version2, maxVersion)) {
533607
533787
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
533608
- if (gte("1.3.428", maxVersion)) {
533609
- logForDebugging(`Native installer: current version ${"1.3.428"} is already at or above maxVersion ${maxVersion}, skipping update`);
533788
+ if (gte("1.3.429", maxVersion)) {
533789
+ logForDebugging(`Native installer: current version ${"1.3.429"} is already at or above maxVersion ${maxVersion}, skipping update`);
533610
533790
  logEvent("tengu_native_update_skipped_max_version", {
533611
533791
  latency_ms: Date.now() - startTime,
533612
533792
  max_version: maxVersion,
@@ -533617,7 +533797,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
533617
533797
  version2 = maxVersion;
533618
533798
  }
533619
533799
  }
533620
- if (!forceReinstall && version2 === "1.3.428" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
533800
+ if (!forceReinstall && version2 === "1.3.429" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
533621
533801
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
533622
533802
  logEvent("tengu_native_update_complete", {
533623
533803
  latency_ms: Date.now() - startTime,
@@ -534813,7 +534993,7 @@ function buildPrimarySection() {
534813
534993
  }, undefined, false, undefined, this);
534814
534994
  return [{
534815
534995
  label: "Version",
534816
- value: "1.3.428"
534996
+ value: "1.3.429"
534817
534997
  }, {
534818
534998
  label: "Session name",
534819
534999
  value: nameValue
@@ -538504,7 +538684,7 @@ function Config({
538504
538684
  }
538505
538685
  }, undefined, false, undefined, this)
538506
538686
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime170.jsxDEV(ChannelDowngradeDialog, {
538507
- currentVersion: "1.3.428",
538687
+ currentVersion: "1.3.429",
538508
538688
  onChoice: (choice) => {
538509
538689
  setShowSubmenu(null);
538510
538690
  setTabsHidden(false);
@@ -538516,7 +538696,7 @@ function Config({
538516
538696
  autoUpdatesChannel: "stable"
538517
538697
  };
538518
538698
  if (choice === "stay") {
538519
- newSettings.minimumVersion = "1.3.428";
538699
+ newSettings.minimumVersion = "1.3.429";
538520
538700
  }
538521
538701
  updateSettingsForSource("userSettings", newSettings);
538522
538702
  setSettingsData((prev_27) => ({
@@ -546578,7 +546758,7 @@ function HelpV2(t0) {
546578
546758
  let t6;
546579
546759
  if ($3[31] !== tabs) {
546580
546760
  t6 = /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Tabs, {
546581
- title: `Rayu-CLI v${"1.3.428"}`,
546761
+ title: `Rayu-CLI v${"1.3.429"}`,
546582
546762
  color: "professionalBlue",
546583
546763
  defaultTab: "general",
546584
546764
  children: tabs
@@ -547942,18 +548122,27 @@ After writing the skill file(s), inform the user:
547942
548122
  init_verifiers_default = command4;
547943
548123
  });
547944
548124
 
548125
+ // src/utils/swarmMode.ts
548126
+ function getSwarmMode(state) {
548127
+ return state.swarmMode === true;
548128
+ }
548129
+ function setSwarmModeUpdater(value) {
548130
+ return (prev) => prev.swarmMode === value ? prev : { ...prev, swarmMode: value };
548131
+ }
548132
+
547945
548133
  // src/commands/collaborator-swarm/index.ts
547946
548134
  var command5, collaborator_swarm_default;
547947
548135
  var init_collaborator_swarm = __esm(() => {
547948
548136
  command5 = {
547949
548137
  type: "prompt",
547950
548138
  name: "collaborator_swarm",
547951
- description: "Run the collaborator swarm on a complex build: plan & research, then delegate implementation to frontend/backend/mobile/security/deploy collaborators in parallel waves",
548139
+ description: "Enter collaborator_swarm mode: orchestrate a complex build via the 3-phase flow (scope & research aligned plan → delegate to specialist collaborators). /normal exits.",
547952
548140
  argumentHint: "[task description]",
547953
548141
  contentLength: 0,
547954
548142
  progressMessage: "coordinating the collaborator swarm",
547955
548143
  source: "builtin",
547956
- async getPromptForCommand(args) {
548144
+ async getPromptForCommand(args, context2) {
548145
+ context2?.setAppState?.(setSwarmModeUpdater(true));
547957
548146
  const task = (args ?? "").trim();
547958
548147
  const taskLine = task ? `The task to coordinate:
547959
548148
 
@@ -547974,9 +548163,19 @@ HARD RULE: if a Collaborator or Subagent stalls, errors, or doesn't respond, you
547974
548163
  Keep going until the task is fully resolved; state assumptions and continue — don't stop for approval unless genuinely blocked. (If the task is actually trivial, say so and suggest the user just ask normally instead of the swarm — but if you proceed here, you proceed as orchestrator: delegating and verifying, not coding.)
547975
548164
 
547976
548165
  ## The three tiers
547977
- - **You (Orchestrator)** — plan, research, own SharedContext, coordinate, integrate.
547978
- - **Collaborators (Tier 2)** — semi-persistent domain implementers you delegate to: \`frontend\`, \`backend\` (incl. database), \`mobile\`, \`security\`, \`deploy\`. Spawn each as a NAMED BACKGROUND agent (run_in_background:true, stable lowercase name) so you can resume it with SendMessage instead of respawning. They have full tools and may use installed skills + dispatch subagents.
547979
- - **Subagents (Tier 3)** — ephemeral one-shot helpers ANYONE can call: \`PA\` (deep plan/research), \`design\` (Design PRD), \`global-setup\` (scaffold), \`asset-generation\`, \`review\` (audit → Fix List), \`fix\` (apply Fix List), \`linter\`, plus \`Explore\` and \`general-purpose\` (research).
548166
+ - **You (Orchestrator)** — scope, plan, own SharedContext, coordinate, integrate. You delegate all implementation; you call only the orchestrator-level subagents directly.
548167
+ - **Collaborators (Tier 2)** — semi-persistent domain implementers you delegate to: \`frontend\`, \`backend\` (incl. database), \`mobile\`, \`security\`, \`deploy\`. Spawn each as a NAMED BACKGROUND agent (run_in_background:true, stable lowercase name) so you can resume it with SendMessage instead of respawning. They have full tools and may dispatch ONLY their allowed subagents (see the matrix).
548168
+ - **Subagents (Tier 3)** — ephemeral one-shot helpers: \`PA\` (deep plan/research — orchestrator only), \`design\` (UI/UX + component PRD), \`backend-design\` (API + Data Model PRD), \`global-setup\` (scaffold — orchestrator only), \`asset-generation\` (images), \`review\` (audit → Fix List), \`fix\` (apply Fix List), \`linter\`, plus \`Explore\` and \`general-purpose\` (research).
548169
+
548170
+ ## Subagent specialization matrix (who may call what)
548171
+ Domain-locked so each agent uses only what fits its specialty:
548172
+ - **You (Orchestrator):** PA, global-setup, design, backend-design, asset-generation, review, fix, linter, Explore, general-purpose.
548173
+ - **frontend:** design, asset-generation, review, fix, linter, Explore, general-purpose. (NOT backend-design.)
548174
+ - **backend:** backend-design, review, fix, linter, Explore, general-purpose. (NOT design or asset-generation.)
548175
+ - **mobile:** design, asset-generation, backend-design, review, fix, linter, Explore, general-purpose.
548176
+ - **security:** backend-design, review, fix, linter, Explore, general-purpose.
548177
+ - **deploy:** review, fix, linter, Explore, general-purpose.
548178
+ \`PA\` and \`global-setup\` are ORCHESTRATOR-ONLY — collaborators implement; they never re-plan or re-scaffold. (These limits are also enforced in code.)
547980
548179
 
547981
548180
  ## DEFAULT TO PARALLEL (the single most important rule)
547982
548181
  Parallel execution is ~3–5x faster than sequential. Unless one call genuinely needs another's output, dispatch independent agents/tools TOGETHER in ONE assistant message (multiple Agent calls), not one-per-message. Plan all the calls you'll need upfront, then fire them together. Cap each batch at ~3–5 calls to avoid timeouts. Sequential is the exception, allowed ONLY on a true dependency. One-per-message dispatch is the #1 cause of slow swarm runs — avoid it.
@@ -547985,33 +548184,43 @@ Parallel execution is ~3–5x faster than sequential. Unless one call genuinely
547985
548184
  - Run ALL **Subagents in the FOREGROUND** — do NOT set \`run_in_background\` on a subagent. Their work and \`thinking…\` then stream INLINE so the user can watch them. This applies whether YOU (the orchestrator) dispatch the subagent OR a collaborator does (a collaborator's subagents appear inside that collaborator's view).
547986
548185
  - Spawn **Collaborators in the BACKGROUND** (\`run_in_background:true\`, stable lowercase name). Background is the ONLY mode that is resumable via \`SendMessage\`, so semi-persistent collaborators MUST be background. The user watches a collaborator's detailed work by entering its view (↓ then Enter); the task panel shows each collaborator's high-level status (including \`thinking…\`).
547987
548186
 
547988
- ## How to run the swarm
547989
- 1. **Plan & research FIRST visibly, in the foreground.** Before delegating anything, dispatch \`PA\` and/or several \`Explore\`/\`general-purpose\` subagents in the FOREGROUND (in a SINGLE message, multiple Agent calls, 3–5 max; do NOT set run_in_background) so the user watches the planning/research happen. State your analysis. For UI work, produce a \`design\` PRD. For a new project, run \`global-setup\` to scaffold. Then write the shared brief to \`.rayu/swarm/shared.json\` (goal/stack/flow/constraints/needs) — it is injected into every collaborator, so keep it tight (< ~500 tokens). Set "needs" to ONLY the domains this task requires.
547990
- - **Overlap where safe:** kick off work that doesn't depend on the final plan (e.g. \`global-setup\` scaffold, \`asset-generation\`) IN PARALLEL with planning rather than strictly after it.
547991
- 2. **Delegate in PARALLEL WAVES.** Decide which collaborators each wave needs, then dispatch all collaborators with no unmet dependency TOGETHER in ONE assistant message containing MULTIPLE Agent tool calls. NEVER send them one-per-message. Typical waves:
547992
- - Wave 1: \`backend\` (API + data layer) + \`security\` (auth/RBAC design) — together.
547993
- - Wave 2: \`frontend\` and/or \`mobile\` (integrate against backend contracts) — together.
547994
- - Wave 3: \`deploy\` (package & ship) — last.
547995
- Example of a correct parallel dispatch (one message):
548187
+ ## The 3-phase build flow
548188
+ ### Phase 1Scope & Research (you + PA, in the foreground)
548189
+ - Clarify the request: ask the user for the missing DETAIL and SCOPE, and ask their PREFERRED TECH STACK offer 2–3 concrete recommendations with a one-line rationale each (don't make them guess).
548190
+ - For any OPEN implementation choice (e.g. a payment provider Stripe vs a bank gateway vs ABA), dispatch the \`PA\` subagent to RESEARCH the real, available options for THIS project and return a short comparison; present those options to the user and let them choose. Loop until you have everything you need.
548191
+
548192
+ ### Phase 2 One aligned plan (PA you → user)
548193
+ - Hand the gathered context to \`PA\` for a deep, reasoned plan. PA must produce ONE coherent plan that is explicitly ALIGNED across backend AND frontend (shared API contract, data model, auth flow) — never two disjoint plans.
548194
+ - Relay PA's plan to the user for FINAL confirmation. (In plan mode, that's the ExitPlanMode approval — confirming auto-enters swarm execution.)
548195
+
548196
+ ### Phase 3 — Build (decompose by specialty; run as a dependency graph, not fixed waves)
548197
+ 1. **Setup gate (one short step):** for a new project, run \`global-setup\` to scaffold the FE+BE folder structure + tooling.
548198
+ 2. **Design block — 3-way PARALLEL (one message):** dispatch together \`global-setup\` (if not already done) ∥ \`design\` (UI/UX + component PRD) ∥ \`backend-design\` (API + Data Model PRD). They're independent — each derives from the plan, not from each other.
548199
+ \`\`\`
548200
+ Agent(subagent_type:"design", prompt:"<UI/UX + component PRD from the plan>")
548201
+ Agent(subagent_type:"backend-design", prompt:"<API contract + data model from the plan>")
548202
+ \`\`\`
548203
+ 3. **Implement — parallel where independent:** dispatch \`backend\` (builds API+DB from the backend-design PRD) ∥ \`security\` (auth/RBAC) together; then \`frontend\` ∥ \`mobile\` (integrate against the backend contract + the Design PRD) together. Each collaborator uses ONLY its allowed subagents.
547996
548204
  \`\`\`
547997
548205
  Agent(subagent_type:"backend", run_in_background:true, name:"backend", prompt:"<task + contracts>")
547998
548206
  Agent(subagent_type:"security", run_in_background:true, name:"security", prompt:"<task + contracts>")
547999
548207
  \`\`\`
548000
- 3. **Coordinate via SharedContext, not by re-typing.** Each collaborator reads the shared brief + its dependency sections and writes its own \`.rayu/swarm/<domain>.md\`. Give each collaborator only its task + any brand-new decision not yet in the artifact. The swarm state lives under \`.rayu/swarm/\` — always use that exact path, NEVER a \`.claude/\` directory.
548001
- 4. **Resume, don't respawn.** For a follow-up in a domain that already ran, SendMessage to that collaborator's name with the new task; spawn fresh only for an unrelated new domain.
548002
- 5. **Audit & fix (verification gate).** After a build wave, run the \`review\` subagent (→ Fix List), then \`fix\` (or the owning collaborator) to apply it; re-review until clean. Do NOT report the work complete until the build/tests pass and the review→fix loop is clean.
548003
- 6. **Ship.** When fixes are confirmed, the \`deploy\` collaborator runs the production build and deploys.
548208
+ 4. **Coordinate via SharedContext, not by re-typing.** Each collaborator reads the shared brief (\`.rayu/swarm/shared.json\`: goal/stack/flow/constraints/needs) + its dependency sections and writes its own \`.rayu/swarm/<domain>.md\`. Keep the brief tight (< ~500 tokens) and set "needs" to ONLY the domains this task requires. Always use \`.rayu/swarm/\` — NEVER a \`.claude/\` directory.
548209
+ 5. **Resume, don't respawn.** For a follow-up in a domain that already ran, SendMessage to that collaborator's name; spawn fresh only for a new domain.
548210
+ 6. **Audit & fix (verification gate):** after a build wave, run \`review\` (→ Fix List), then \`fix\` (or the owning collaborator) to apply it; re-review until clean. Don't report done until build/tests pass and the review→fix loop is clean.
548211
+ 7. **Ship:** the \`deploy\` collaborator runs the production build and deploys.
548004
548212
 
548005
548213
  ## Rules
548006
- - Do NOT use TaskCreate / task-list tools to coordinate the swarm — track the waves inline in your messages; the collaborator/subagent dispatches ARE the units of work.
548214
+ - Do NOT use TaskCreate / task-list tools to coordinate the swarm — track progress inline in your messages; the collaborator/subagent dispatches ARE the units of work.
548007
548215
  - Security and the chosen architecture are authoritative — collaborators build within them.
548008
- - Maximize parallelism within each wave; respect dependencies across waves.
548216
+ - Respect the subagent matrix: never route a job to a collaborator outside its specialty (e.g. don't ask \`backend\` for UI/images, or \`frontend\` for the data model).
548217
+ - Maximize parallelism for independent work; go sequential only on a true dependency.
548009
548218
  - Be autonomous: keep going until done; only pause if truly blocked. Report concisely and high-signal — don't narrate every step.
548010
548219
 
548011
548220
  ## Finish
548012
548221
  Integrate the collaborators' outputs into one coherent result, crediting which collaborator produced what, and report concisely to the user — only after the verification gate (build/tests pass, review→fix clean).
548013
548222
 
548014
- Begin by stating your analysis/plan step (read the project and discuss with the \`PA\` subagent), then your Wave 1 parallel dispatch.`
548223
+ This session is now in collaborator_swarm mode (it stays on for the whole session; the user exits with /normal). Begin with PHASE 1: state your understanding, ask the user for the missing scope + preferred tech stack (with recommendations), and dispatch \`PA\` for any implementation-option research the request needs.`
548015
548224
  }
548016
548225
  ];
548017
548226
  }
@@ -548019,6 +548228,34 @@ Begin by stating your analysis/plan step (read the project and discuss with the
548019
548228
  collaborator_swarm_default = command5;
548020
548229
  });
548021
548230
 
548231
+ // src/commands/normal/normal.ts
548232
+ var exports_normal = {};
548233
+ __export(exports_normal, {
548234
+ call: () => call17
548235
+ });
548236
+ var call17 = async (_args, context2) => {
548237
+ const wasOn = getSwarmMode(context2.getAppState());
548238
+ context2.setAppState(setSwarmModeUpdater(false));
548239
+ return {
548240
+ type: "text",
548241
+ value: wasOn ? "Exited collaborator_swarm mode — back to normal mode." : "Already in normal mode."
548242
+ };
548243
+ };
548244
+ var init_normal = () => {};
548245
+
548246
+ // src/commands/normal/index.ts
548247
+ var normal, normal_default;
548248
+ var init_normal2 = __esm(() => {
548249
+ normal = {
548250
+ type: "local",
548251
+ name: "normal",
548252
+ description: "Exit collaborator_swarm mode (return to normal mode)",
548253
+ supportsNonInteractive: false,
548254
+ load: () => Promise.resolve().then(() => (init_normal(), exports_normal))
548255
+ };
548256
+ normal_default = normal;
548257
+ });
548258
+
548022
548259
  // src/keybindings/template.ts
548023
548260
  function filterReservedShortcuts(blocks) {
548024
548261
  const reservedKeys = new Set(NON_REBINDABLE.map((r2) => normalizeKeyForComparison(r2.key)));
@@ -548050,11 +548287,11 @@ var init_template2 = __esm(() => {
548050
548287
  // src/commands/keybindings/keybindings.ts
548051
548288
  var exports_keybindings = {};
548052
548289
  __export(exports_keybindings, {
548053
- call: () => call17
548290
+ call: () => call18
548054
548291
  });
548055
548292
  import { mkdir as mkdir34, writeFile as writeFile37 } from "fs/promises";
548056
548293
  import { dirname as dirname58 } from "path";
548057
- async function call17() {
548294
+ async function call18() {
548058
548295
  if (!isKeybindingCustomizationEnabled()) {
548059
548296
  return {
548060
548297
  type: "text",
@@ -548113,9 +548350,9 @@ var init_keybindings2 = __esm(() => {
548113
548350
  // src/commands/keep/keep.ts
548114
548351
  var exports_keep = {};
548115
548352
  __export(exports_keep, {
548116
- call: () => call18
548353
+ call: () => call19
548117
548354
  });
548118
- var call18 = async (args, context2) => {
548355
+ var call19 = async (args, context2) => {
548119
548356
  return {
548120
548357
  type: "text",
548121
548358
  value: keepPendingFileChanges(context2, args)
@@ -562161,7 +562398,7 @@ var init_PluginSettings = __esm(() => {
562161
562398
  // src/commands/mcp/mcp.tsx
562162
562399
  var exports_mcp = {};
562163
562400
  __export(exports_mcp, {
562164
- call: () => call19
562401
+ call: () => call20
562165
562402
  });
562166
562403
  function MCPToggle(t0) {
562167
562404
  const $3 = import_compiler_runtime170.c(7);
@@ -562214,7 +562451,7 @@ function _temp239(c4) {
562214
562451
  function _temp98(s2) {
562215
562452
  return s2.mcp.clients;
562216
562453
  }
562217
- async function call19(onDone, _context, args) {
562454
+ async function call20(onDone, _context, args) {
562218
562455
  if (args) {
562219
562456
  const parts = args.trim().split(/\s+/);
562220
562457
  if (parts[0] === "no-redirect") {
@@ -564861,7 +565098,7 @@ var API_BASE2 = "https://api.telegram.org", MAX_MESSAGE_CHARS = 4096;
564861
565098
  // src/commands/telegram-bot/telegram-bot.tsx
564862
565099
  var exports_telegram_bot = {};
564863
565100
  __export(exports_telegram_bot, {
564864
- call: () => call20
565101
+ call: () => call21
564865
565102
  });
564866
565103
  import { randomUUID as randomUUID31 } from "crypto";
564867
565104
  function TokenInputStep({ onTokenSaved }) {
@@ -565048,7 +565285,7 @@ function TelegramBotConnect({ onDone }) {
565048
565285
  onDone
565049
565286
  }, undefined, false, undefined, this);
565050
565287
  }
565051
- async function call20(onDone) {
565288
+ async function call21(onDone) {
565052
565289
  return /* @__PURE__ */ jsx_dev_runtime224.jsxDEV(TelegramBotConnect, {
565053
565290
  onDone
565054
565291
  }, undefined, false, undefined, this);
@@ -565080,9 +565317,9 @@ var init_telegram_bot2 = __esm(() => {
565080
565317
  // src/commands/telegram-bot/disconnect.ts
565081
565318
  var exports_disconnect = {};
565082
565319
  __export(exports_disconnect, {
565083
- call: () => call21
565320
+ call: () => call22
565084
565321
  });
565085
- async function call21() {
565322
+ async function call22() {
565086
565323
  const config5 = readTelegramConfig();
565087
565324
  if (!config5.linkedChatId) {
565088
565325
  return { type: "text", value: "Telegram bot is not currently linked." };
@@ -565667,9 +565904,9 @@ var init_createSession = __esm(() => {
565667
565904
  // src/commands/rename/rename.ts
565668
565905
  var exports_rename = {};
565669
565906
  __export(exports_rename, {
565670
- call: () => call22
565907
+ call: () => call23
565671
565908
  });
565672
- async function call22(onDone, context2, args) {
565909
+ async function call23(onDone, context2, args) {
565673
565910
  if (isTeammate()) {
565674
565911
  onDone("Cannot rename: This session is a swarm teammate. Teammate names are set by the team leader.", { display: "system" });
565675
565912
  return null;
@@ -565905,9 +566142,9 @@ var init_ReviewDetailDialog = __esm(() => {
565905
566142
  // src/commands/review-detial/review-detial.tsx
565906
566143
  var exports_review_detial = {};
565907
566144
  __export(exports_review_detial, {
565908
- call: () => call23
566145
+ call: () => call24
565909
566146
  });
565910
- var jsx_dev_runtime226, call23 = async (onDone, context2, args) => {
566147
+ var jsx_dev_runtime226, call24 = async (onDone, context2, args) => {
565911
566148
  const result = resolvePendingFileChangeReview(context2, args ?? "");
565912
566149
  if (result.type === "message") {
565913
566150
  onDone(result.message, { display: "system" });
@@ -566553,7 +566790,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
566553
566790
  }
566554
566791
  return [];
566555
566792
  }
566556
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.428") {
566793
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.429") {
566557
566794
  if (false) {}
566558
566795
  const cachedChangelog = await getStoredChangelog();
566559
566796
  if (lastSeenVersion !== currentVersion || !cachedChangelog) {
@@ -566566,7 +566803,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.428")
566566
566803
  releaseNotes
566567
566804
  };
566568
566805
  }
566569
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.3.428") {
566806
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.3.429") {
566570
566807
  if (false) {}
566571
566808
  const releaseNotes = getRecentReleaseNotes(currentVersion, lastSeenVersion);
566572
566809
  return {
@@ -566694,11 +566931,11 @@ function getRecentActivitySync() {
566694
566931
  return cachedActivity;
566695
566932
  }
566696
566933
  function getLogoDisplayData() {
566697
- const version2 = process.env.DEMO_VERSION ?? "1.3.428";
566934
+ const version2 = process.env.DEMO_VERSION ?? "1.3.429";
566698
566935
  const serverUrl = getDirectConnectServerUrl();
566699
566936
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
566700
566937
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
566701
- const billingType = isClaudeAISubscriber() ? getSubscriptionName() : "API Usage Billing";
566938
+ const billingType = isClaudeAISubscriber() ? getSubscriptionName() : getActiveProviderDisplayName() ?? "API Usage Billing";
566702
566939
  const agentName = getInitialSettings().agent;
566703
566940
  return {
566704
566941
  version: version2,
@@ -566755,6 +566992,7 @@ var init_logoV2Utils = __esm(() => {
566755
566992
  init_file2();
566756
566993
  init_format();
566757
566994
  init_releaseNotes();
566995
+ init_rayuProviders();
566758
566996
  init_sessionStorage();
566759
566997
  init_settings2();
566760
566998
  cachedActivity = [];
@@ -566776,12 +567014,12 @@ var init_Clawd = __esm(() => {
566776
567014
  init_ink2();
566777
567015
  jsx_dev_runtime228 = __toESM(require_jsx_dev_runtime(), 1);
566778
567016
  RAYU_BANNER = [
566779
- ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#7CFFA0"],
566780
- ["██╔══██╗██╔══██╗╚██╗ ██╔╝██║ ██║", "#5BF58D"],
567017
+ ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#ff7cda"],
567018
+ ["██╔══██╗██╔══██╗╚██╗ ██╔╝██║ ██║", "#a35bf5"],
566781
567019
  ["██████╔╝███████║ ╚████╔╝ ██║ ██║", "#3DE877"],
566782
- ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#22D060"],
566783
- ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#15B84C"],
566784
- ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#0E9B3E"]
567020
+ ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#2822d0"],
567021
+ ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#84b815"],
567022
+ ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#9b0e84"]
566785
567023
  ];
566786
567024
  });
566787
567025
 
@@ -567986,7 +568224,7 @@ function LogoV2() {
567986
568224
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
567987
568225
  t2 = () => {
567988
568226
  const currentConfig = getGlobalConfig();
567989
- if (currentConfig.lastReleaseNotesSeen === "1.3.428") {
568227
+ if (currentConfig.lastReleaseNotesSeen === "1.3.429") {
567990
568228
  return;
567991
568229
  }
567992
568230
  saveGlobalConfig(_temp327);
@@ -568464,7 +568702,7 @@ function LogoV2() {
568464
568702
  t24 = $3[61];
568465
568703
  }
568466
568704
  const _latestNpm = getCachedLatestNpmVersionSync();
568467
- const _updateFeeds = _latestNpm && gt(_latestNpm, "1.3.428") ? [createUpdateAvailableFeed("1.3.428", _latestNpm)] : [];
568705
+ const _updateFeeds = _latestNpm && gt(_latestNpm, "1.3.429") ? [createUpdateAvailableFeed("1.3.429", _latestNpm)] : [];
568468
568706
  const t25 = layoutMode === "horizontal" && /* @__PURE__ */ jsx_dev_runtime239.jsxDEV(FeedColumn, {
568469
568707
  feeds: showOnboarding ? [createProjectOnboardingFeed(getSteps()), createRecentActivityFeed(activities)] : showGuestPassesUpsell ? [createRecentActivityFeed(activities), createGuestPassesFeed()] : showOverageCreditUpsell ? [createRecentActivityFeed(activities), createOverageCreditFeed()] : [createRecentActivityFeed(activities), ..._updateFeeds, createWhatsNewFeed(changelog)],
568470
568708
  maxWidth: rightWidth
@@ -568664,12 +568902,12 @@ function LogoV2() {
568664
568902
  return t41;
568665
568903
  }
568666
568904
  function _temp327(current) {
568667
- if (current.lastReleaseNotesSeen === "1.3.428") {
568905
+ if (current.lastReleaseNotesSeen === "1.3.429") {
568668
568906
  return current;
568669
568907
  }
568670
568908
  return {
568671
568909
  ...current,
568672
- lastReleaseNotesSeen: "1.3.428"
568910
+ lastReleaseNotesSeen: "1.3.429"
568673
568911
  };
568674
568912
  }
568675
568913
  function _temp241(s_0) {
@@ -569208,6 +569446,7 @@ var init_nullRenderingAttachments = __esm(() => {
569208
569446
  "plan_mode",
569209
569447
  "plan_mode_exit",
569210
569448
  "plan_mode_reentry",
569449
+ "swarm_mode",
569211
569450
  "structured_output",
569212
569451
  "team_context",
569213
569452
  "todo_reminder",
@@ -574431,7 +574670,7 @@ var init_crossProjectResume = __esm(() => {
574431
574670
  var exports_resume = {};
574432
574671
  __export(exports_resume, {
574433
574672
  filterResumableSessions: () => filterResumableSessions,
574434
- call: () => call24
574673
+ call: () => call25
574435
574674
  });
574436
574675
  function resumeHelpMessage(result) {
574437
574676
  switch (result.resultType) {
@@ -574616,7 +574855,7 @@ function ResumeCommand({
574616
574855
  function filterResumableSessions(logs, currentSessionId) {
574617
574856
  return logs.filter((l3) => !l3.isSidechain && getSessionIdFromLog(l3) !== currentSessionId);
574618
574857
  }
574619
- var import_compiler_runtime191, React80, jsx_dev_runtime253, call24 = async (onDone, context2, args) => {
574858
+ var import_compiler_runtime191, React80, jsx_dev_runtime253, call25 = async (onDone, context2, args) => {
574620
574859
  const onResume = async (sessionId, log3, entrypoint) => {
574621
574860
  try {
574622
574861
  await context2.resume?.(sessionId, log3, entrypoint);
@@ -575079,7 +575318,7 @@ var init_UltrareviewOverageDialog = __esm(() => {
575079
575318
  // src/commands/review/ultrareviewCommand.tsx
575080
575319
  var exports_ultrareviewCommand = {};
575081
575320
  __export(exports_ultrareviewCommand, {
575082
- call: () => call25
575321
+ call: () => call26
575083
575322
  });
575084
575323
  function contentBlocksToString(blocks) {
575085
575324
  return blocks.map((b3) => b3.type === "text" ? b3.text : "").filter(Boolean).join(`
@@ -575099,7 +575338,7 @@ async function launchAndDone(args, context2, onDone, billingNote, signal) {
575099
575338
  });
575100
575339
  }
575101
575340
  }
575102
- var jsx_dev_runtime255, call25 = async (onDone, context2, args) => {
575341
+ var jsx_dev_runtime255, call26 = async (onDone, context2, args) => {
575103
575342
  const gate = await checkOverageGate();
575104
575343
  if (gate.kind === "not-enabled") {
575105
575344
  onDone("Free ultrareviews used. Enable Extra Usage at https://claude.ai/settings/billing to continue.", {
@@ -575397,7 +575636,7 @@ var init_image_video = __esm(() => {
575397
575636
  // src/commands/session/session.tsx
575398
575637
  var exports_session = {};
575399
575638
  __export(exports_session, {
575400
- call: () => call26
575639
+ call: () => call27
575401
575640
  });
575402
575641
  function SessionInfo(t0) {
575403
575642
  const $3 = import_compiler_runtime193.c(19);
@@ -575570,7 +575809,7 @@ function _temp247(e2) {
575570
575809
  function _temp118(s2) {
575571
575810
  return s2.remoteSessionUrl;
575572
575811
  }
575573
- var import_compiler_runtime193, import_react154, jsx_dev_runtime256, call26 = async (onDone) => {
575812
+ var import_compiler_runtime193, import_react154, jsx_dev_runtime256, call27 = async (onDone) => {
575574
575813
  return /* @__PURE__ */ jsx_dev_runtime256.jsxDEV(SessionInfo, {
575575
575814
  onDone
575576
575815
  }, undefined, false, undefined, this);
@@ -575922,9 +576161,9 @@ var init_SkillsMenu = __esm(() => {
575922
576161
  // src/commands/skills/skills.tsx
575923
576162
  var exports_skills2 = {};
575924
576163
  __export(exports_skills2, {
575925
- call: () => call27
576164
+ call: () => call28
575926
576165
  });
575927
- async function call27(onDone, context2) {
576166
+ async function call28(onDone, context2) {
575928
576167
  return /* @__PURE__ */ jsx_dev_runtime258.jsxDEV(SkillsMenu, {
575929
576168
  onExit: onDone,
575930
576169
  commands: context2.options.commands
@@ -575951,9 +576190,9 @@ var init_skills5 = __esm(() => {
575951
576190
  // src/commands/status/status.tsx
575952
576191
  var exports_status = {};
575953
576192
  __export(exports_status, {
575954
- call: () => call28
576193
+ call: () => call29
575955
576194
  });
575956
- async function call28(onDone, context2) {
576195
+ async function call29(onDone, context2) {
575957
576196
  return /* @__PURE__ */ jsx_dev_runtime259.jsxDEV(Settings, {
575958
576197
  onClose: onDone,
575959
576198
  context: context2,
@@ -576564,7 +576803,7 @@ ${reasons}`,
576564
576803
  } : prev);
576565
576804
  }
576566
576805
  }
576567
- var ULTRAPLAN_TIMEOUT_MS, CCR_TERMS_URL2 = "https://code.claude.com/docs/en/claude-code-on-the-web", _rawPrompt, DEFAULT_INSTRUCTIONS, ULTRAPLAN_INSTRUCTIONS, call29 = async (onDone, context2, args) => {
576806
+ var ULTRAPLAN_TIMEOUT_MS, CCR_TERMS_URL2 = "https://code.claude.com/docs/en/claude-code-on-the-web", _rawPrompt, DEFAULT_INSTRUCTIONS, ULTRAPLAN_INSTRUCTIONS, call30 = async (onDone, context2, args) => {
576568
576807
  const blurb = args.trim();
576569
576808
  if (!blurb) {
576570
576809
  const msg = await launchUltraplan2({
@@ -576627,7 +576866,7 @@ var init_ultraplan = __esm(() => {
576627
576866
  argumentHint: "<prompt>",
576628
576867
  isEnabled: () => false,
576629
576868
  load: () => Promise.resolve({
576630
- call: call29
576869
+ call: call30
576631
576870
  })
576632
576871
  };
576633
576872
  });
@@ -581398,9 +581637,9 @@ var init_BackgroundTasksDialog = __esm(() => {
581398
581637
  // src/commands/tasks/tasks.tsx
581399
581638
  var exports_tasks = {};
581400
581639
  __export(exports_tasks, {
581401
- call: () => call30
581640
+ call: () => call31
581402
581641
  });
581403
- async function call30(onDone, context2) {
581642
+ async function call31(onDone, context2) {
581404
581643
  return /* @__PURE__ */ jsx_dev_runtime270.jsxDEV(BackgroundTasksDialog, {
581405
581644
  toolUseContext: context2,
581406
581645
  onDone
@@ -581679,9 +581918,9 @@ var init_terminalSetup2 = __esm(() => {
581679
581918
  // src/commands/undo/undo.ts
581680
581919
  var exports_undo = {};
581681
581920
  __export(exports_undo, {
581682
- call: () => call31
581921
+ call: () => call32
581683
581922
  });
581684
- var call31 = async (args, context2) => {
581923
+ var call32 = async (args, context2) => {
581685
581924
  const isAll = args.trim().toLowerCase() === "all";
581686
581925
  return {
581687
581926
  type: "text",
@@ -581709,7 +581948,7 @@ var init_undo3 = __esm(() => {
581709
581948
  // src/commands/theme/theme.tsx
581710
581949
  var exports_theme = {};
581711
581950
  __export(exports_theme, {
581712
- call: () => call32
581951
+ call: () => call33
581713
581952
  });
581714
581953
  function ThemePickerCommand(t0) {
581715
581954
  const $3 = import_compiler_runtime204.c(8);
@@ -581759,7 +581998,7 @@ function ThemePickerCommand(t0) {
581759
581998
  }
581760
581999
  return t3;
581761
582000
  }
581762
- var import_compiler_runtime204, jsx_dev_runtime271, call32 = async (onDone, _context) => {
582001
+ var import_compiler_runtime204, jsx_dev_runtime271, call33 = async (onDone, _context) => {
581763
582002
  return /* @__PURE__ */ jsx_dev_runtime271.jsxDEV(ThemePickerCommand, {
581764
582003
  onDone
581765
582004
  }, undefined, false, undefined, this);
@@ -581787,9 +582026,9 @@ var init_theme4 = __esm(() => {
581787
582026
  // src/commands/vim/vim.ts
581788
582027
  var exports_vim = {};
581789
582028
  __export(exports_vim, {
581790
- call: () => call33
582029
+ call: () => call34
581791
582030
  });
581792
- var call33 = async () => {
582031
+ var call34 = async () => {
581793
582032
  const config5 = getGlobalConfig();
581794
582033
  let currentMode = config5.editorMode || "normal";
581795
582034
  if (currentMode === "emacs") {
@@ -581831,7 +582070,7 @@ var init_vim2 = __esm(() => {
581831
582070
  var exports_thinkback = {};
581832
582071
  __export(exports_thinkback, {
581833
582072
  playAnimation: () => playAnimation,
581834
- call: () => call34
582073
+ call: () => call35
581835
582074
  });
581836
582075
  import { readFile as readFile47 } from "fs/promises";
581837
582076
  import { join as join136 } from "path";
@@ -582368,7 +582607,7 @@ function ThinkbackFlow(t0) {
582368
582607
  }
582369
582608
  return t8;
582370
582609
  }
582371
- async function call34(onDone) {
582610
+ async function call35(onDone) {
582372
582611
  return /* @__PURE__ */ jsx_dev_runtime272.jsxDEV(ThinkbackFlow, {
582373
582612
  onDone
582374
582613
  }, undefined, false, undefined, this);
@@ -582416,14 +582655,14 @@ var init_thinkback2 = __esm(() => {
582416
582655
  // src/commands/thinkback-play/thinkback-play.ts
582417
582656
  var exports_thinkback_play = {};
582418
582657
  __export(exports_thinkback_play, {
582419
- call: () => call35
582658
+ call: () => call36
582420
582659
  });
582421
582660
  import { join as join137 } from "path";
582422
582661
  function getPluginId2() {
582423
582662
  const marketplaceName = OFFICIAL_MARKETPLACE_NAME;
582424
582663
  return `thinkback@${marketplaceName}`;
582425
582664
  }
582426
- async function call35() {
582665
+ async function call36() {
582427
582666
  const v2Data = loadInstalledPluginsV2();
582428
582667
  const pluginId = getPluginId2();
582429
582668
  const installations = v2Data.plugins[pluginId];
@@ -584919,9 +585158,9 @@ var init_PermissionRuleList = __esm(() => {
584919
585158
  // src/commands/permissions/permissions.tsx
584920
585159
  var exports_permissions2 = {};
584921
585160
  __export(exports_permissions2, {
584922
- call: () => call36
585161
+ call: () => call37
584923
585162
  });
584924
- var jsx_dev_runtime280, call36 = async (onDone, context2) => {
585163
+ var jsx_dev_runtime280, call37 = async (onDone, context2) => {
584925
585164
  return /* @__PURE__ */ jsx_dev_runtime280.jsxDEV(PermissionRuleList, {
584926
585165
  onExit: onDone,
584927
585166
  onRetryDenials: (commands) => {
@@ -584951,7 +585190,7 @@ var init_permissions5 = __esm(() => {
584951
585190
  // src/commands/plan/plan.tsx
584952
585191
  var exports_plan = {};
584953
585192
  __export(exports_plan, {
584954
- call: () => call37
585193
+ call: () => call38
584955
585194
  });
584956
585195
  function PlanDisplay(t0) {
584957
585196
  const $3 = import_compiler_runtime213.c(11);
@@ -585039,7 +585278,7 @@ function PlanDisplay(t0) {
585039
585278
  }
585040
585279
  return t5;
585041
585280
  }
585042
- async function call37(onDone, context2, args) {
585281
+ async function call38(onDone, context2, args) {
585043
585282
  const {
585044
585283
  getAppState,
585045
585284
  setAppState
@@ -586877,9 +587116,9 @@ var init_HooksConfigMenu = __esm(() => {
586877
587116
  // src/commands/hooks/hooks.tsx
586878
587117
  var exports_hooks = {};
586879
587118
  __export(exports_hooks, {
586880
- call: () => call38
587119
+ call: () => call39
586881
587120
  });
586882
- var jsx_dev_runtime287, call38 = async (onDone, context2) => {
587121
+ var jsx_dev_runtime287, call39 = async (onDone, context2) => {
586883
587122
  logEvent("tengu_hooks_command", {});
586884
587123
  const appState = context2.getAppState();
586885
587124
  const permissionContext = appState.toolPermissionContext;
@@ -586912,10 +587151,10 @@ var init_hooks3 = __esm(() => {
586912
587151
  // src/commands/files/files.ts
586913
587152
  var exports_files4 = {};
586914
587153
  __export(exports_files4, {
586915
- call: () => call39
587154
+ call: () => call40
586916
587155
  });
586917
587156
  import { relative as relative31 } from "path";
586918
- async function call39(_args, context2) {
587157
+ async function call40(_args, context2) {
586919
587158
  const files2 = context2.readFileState ? cacheKeys(context2.readFileState) : [];
586920
587159
  if (files2.length === 0) {
586921
587160
  return { type: "text", value: "No files in context" };
@@ -586948,7 +587187,7 @@ var init_files8 = __esm(() => {
586948
587187
  var exports_branch = {};
586949
587188
  __export(exports_branch, {
586950
587189
  deriveFirstPrompt: () => deriveFirstPrompt,
586951
- call: () => call40
587190
+ call: () => call41
586952
587191
  });
586953
587192
  import { randomUUID as randomUUID33 } from "crypto";
586954
587193
  import { mkdir as mkdir36, readFile as readFile48, writeFile as writeFile41 } from "fs/promises";
@@ -587054,7 +587293,7 @@ async function getUniqueForkName(baseName) {
587054
587293
  }
587055
587294
  return `${baseName} (Branch ${nextNumber})`;
587056
587295
  }
587057
- async function call40(onDone, context2, args) {
587296
+ async function call41(onDone, context2, args) {
587058
587297
  const customTitle = args?.trim() || undefined;
587059
587298
  const originalSessionId = getSessionId();
587060
587299
  try {
@@ -593093,9 +593332,9 @@ var init_AgentsMenu = __esm(() => {
593093
593332
  // src/commands/agents/agents.tsx
593094
593333
  var exports_agents2 = {};
593095
593334
  __export(exports_agents2, {
593096
- call: () => call41
593335
+ call: () => call42
593097
593336
  });
593098
- async function call41(onDone, context2) {
593337
+ async function call42(onDone, context2) {
593099
593338
  const appState = context2.getAppState();
593100
593339
  const permissionContext = appState.toolPermissionContext;
593101
593340
  const tools = getTools(permissionContext);
@@ -593126,9 +593365,9 @@ var init_agents3 = __esm(() => {
593126
593365
  // src/commands/plugin/plugin.tsx
593127
593366
  var exports_plugin = {};
593128
593367
  __export(exports_plugin, {
593129
- call: () => call42
593368
+ call: () => call43
593130
593369
  });
593131
- async function call42(onDone, _context, args) {
593370
+ async function call43(onDone, _context, args) {
593132
593371
  return /* @__PURE__ */ jsx_dev_runtime313.jsxDEV(PluginSettings, {
593133
593372
  onComplete: onDone,
593134
593373
  args
@@ -593296,12 +593535,12 @@ var init_refresh = __esm(() => {
593296
593535
  // src/commands/reload-plugins/reload-plugins.ts
593297
593536
  var exports_reload_plugins = {};
593298
593537
  __export(exports_reload_plugins, {
593299
- call: () => call43
593538
+ call: () => call44
593300
593539
  });
593301
593540
  function n2(count4, noun) {
593302
593541
  return `${count4} ${plural(count4, noun)}`;
593303
593542
  }
593304
- var call43 = async (_args, context2) => {
593543
+ var call44 = async (_args, context2) => {
593305
593544
  if (false) {}
593306
593545
  const r2 = await refreshActivePlugins(context2.setAppState);
593307
593546
  const parts = [
@@ -593344,9 +593583,9 @@ var init_reload_plugins2 = __esm(() => {
593344
593583
  // src/commands/rewind/rewind.ts
593345
593584
  var exports_rewind = {};
593346
593585
  __export(exports_rewind, {
593347
- call: () => call44
593586
+ call: () => call45
593348
593587
  });
593349
- async function call44(_args, context2) {
593588
+ async function call45(_args, context2) {
593350
593589
  if (context2.openMessageSelector) {
593351
593590
  context2.openMessageSelector();
593352
593591
  }
@@ -593461,7 +593700,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
593461
593700
  smapsRollup,
593462
593701
  platform: process.platform,
593463
593702
  nodeVersion: process.version,
593464
- ccVersion: "1.3.428"
593703
+ ccVersion: "1.3.429"
593465
593704
  };
593466
593705
  }
593467
593706
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -593532,9 +593771,9 @@ var init_heapDumpService = __esm(() => {
593532
593771
  // src/commands/heapdump/heapdump.ts
593533
593772
  var exports_heapdump = {};
593534
593773
  __export(exports_heapdump, {
593535
- call: () => call45
593774
+ call: () => call46
593536
593775
  });
593537
- async function call45() {
593776
+ async function call46() {
593538
593777
  const result = await performHeapDump();
593539
593778
  if (!result.success) {
593540
593779
  return {
@@ -593841,7 +594080,7 @@ var USAGE = `/bridge-kick <subcommand>
593841
594080
  reconnect-session fail next POST /bridge/reconnect fails
593842
594081
  heartbeat <status> next heartbeat throws BridgeFatalError(status)
593843
594082
  reconnect call reconnectEnvironmentWithSession directly
593844
- status print bridge state`, call46 = async (args) => {
594083
+ status print bridge state`, call47 = async (args) => {
593845
594084
  const h3 = getBridgeDebugHandle();
593846
594085
  if (!h3) {
593847
594086
  return {
@@ -593974,16 +594213,16 @@ var init_bridge_kick = __esm(() => {
593974
594213
  description: "Inject bridge failure states for manual recovery testing",
593975
594214
  isEnabled: () => false,
593976
594215
  supportsNonInteractive: false,
593977
- load: () => Promise.resolve({ call: call46 })
594216
+ load: () => Promise.resolve({ call: call47 })
593978
594217
  };
593979
594218
  bridge_kick_default = bridgeKick;
593980
594219
  });
593981
594220
 
593982
594221
  // src/commands/version.ts
593983
- var call47 = async () => {
594222
+ var call48 = async () => {
593984
594223
  return {
593985
594224
  type: "text",
593986
- value: "1.3.428"
594225
+ value: "1.3.429"
593987
594226
  };
593988
594227
  }, version2, version_default;
593989
594228
  var init_version = __esm(() => {
@@ -593993,7 +594232,7 @@ var init_version = __esm(() => {
593993
594232
  description: "Print the version this session is running (not what autoupdate downloaded)",
593994
594233
  isEnabled: () => false,
593995
594234
  supportsNonInteractive: true,
593996
- load: () => Promise.resolve({ call: call47 })
594235
+ load: () => Promise.resolve({ call: call48 })
593997
594236
  };
593998
594237
  version_default = version2;
593999
594238
  });
@@ -595127,10 +595366,10 @@ var init_SandboxSettings = __esm(() => {
595127
595366
  // src/commands/sandbox-toggle/sandbox-toggle.tsx
595128
595367
  var exports_sandbox_toggle = {};
595129
595368
  __export(exports_sandbox_toggle, {
595130
- call: () => call48
595369
+ call: () => call49
595131
595370
  });
595132
595371
  import { relative as relative32 } from "path";
595133
- async function call48(onDone, _context, args) {
595372
+ async function call49(onDone, _context, args) {
595134
595373
  const settings = getSettings_DEPRECATED();
595135
595374
  const themeName = settings.theme || "light";
595136
595375
  const platform4 = getPlatform();
@@ -595237,9 +595476,9 @@ var init_sandbox_toggle2 = __esm(() => {
595237
595476
  // src/commands/contactMe/contactMe.ts
595238
595477
  var exports_contactMe = {};
595239
595478
  __export(exports_contactMe, {
595240
- call: () => call49
595479
+ call: () => call50
595241
595480
  });
595242
- async function call49() {
595481
+ async function call50() {
595243
595482
  const linkedinOk = await openBrowser(LINKEDIN_URL);
595244
595483
  const githubOk = await openBrowser(GITHUB_URL);
595245
595484
  if (linkedinOk && githubOk) {
@@ -595276,7 +595515,7 @@ var init_contactMe2 = __esm(() => {
595276
595515
  });
595277
595516
 
595278
595517
  // src/commands/advisor.ts
595279
- var call50 = async (args, context2) => {
595518
+ var call51 = async (args, context2) => {
595280
595519
  const arg = args.trim().toLowerCase();
595281
595520
  const baseModel = parseUserSpecifiedModel(context2.getAppState().mainLoopModel ?? getDefaultMainLoopModelSetting());
595282
595521
  if (!arg) {
@@ -595362,7 +595601,7 @@ var init_advisor2 = __esm(() => {
595362
595601
  return !canUserConfigureAdvisor();
595363
595602
  },
595364
595603
  supportsNonInteractive: true,
595365
- load: () => Promise.resolve({ call: call50 })
595604
+ load: () => Promise.resolve({ call: call51 })
595366
595605
  };
595367
595606
  advisor_default = advisor;
595368
595607
  });
@@ -595770,12 +596009,12 @@ var init_ExitFlow = __esm(() => {
595770
596009
  // src/commands/exit/exit.tsx
595771
596010
  var exports_exit = {};
595772
596011
  __export(exports_exit, {
595773
- call: () => call51
596012
+ call: () => call52
595774
596013
  });
595775
596014
  function getRandomGoodbyeMessage2() {
595776
596015
  return sample_default(GOODBYE_MESSAGES2) ?? "Goodbye!";
595777
596016
  }
595778
- async function call51(onDone) {
596017
+ async function call52(onDone) {
595779
596018
  if (false) {}
595780
596019
  const showWorktree = getCurrentWorktreeSession() !== null;
595781
596020
  if (showWorktree) {
@@ -596069,7 +596308,7 @@ var exports_export = {};
596069
596308
  __export(exports_export, {
596070
596309
  sanitizeFilename: () => sanitizeFilename,
596071
596310
  extractFirstPrompt: () => extractFirstPrompt,
596072
- call: () => call52
596311
+ call: () => call53
596073
596312
  });
596074
596313
  import { join as join142 } from "path";
596075
596314
  function formatTimestamp(date6) {
@@ -596110,7 +596349,7 @@ async function exportWithReactRenderer(context2) {
596110
596349
  const tools = context2.options.tools || [];
596111
596350
  return renderMessagesToPlainText(context2.messages, tools);
596112
596351
  }
596113
- async function call52(onDone, context2, args) {
596352
+ async function call53(onDone, context2, args) {
596114
596353
  const content = await exportWithReactRenderer(context2);
596115
596354
  const filename = args.trim();
596116
596355
  if (filename) {
@@ -597296,7 +597535,7 @@ var init_SearchableModelPicker = __esm(() => {
597296
597535
  // src/commands/connect/connect.tsx
597297
597536
  var exports_connect = {};
597298
597537
  __export(exports_connect, {
597299
- call: () => call53
597538
+ call: () => call54
597300
597539
  });
597301
597540
  function ConnectFlow({ onDone }) {
597302
597541
  const [phase, setPhase] = React100.useState("setup");
@@ -597309,7 +597548,7 @@ function ConnectFlow({ onDone }) {
597309
597548
  onDone
597310
597549
  }, undefined, false, undefined, this);
597311
597550
  }
597312
- var React100, jsx_dev_runtime327, call53 = async (onDone, _context, _args) => {
597551
+ var React100, jsx_dev_runtime327, call54 = async (onDone, _context, _args) => {
597313
597552
  return /* @__PURE__ */ jsx_dev_runtime327.jsxDEV(ConnectFlow, {
597314
597553
  onDone
597315
597554
  }, undefined, false, undefined, this);
@@ -597335,7 +597574,7 @@ var init_connect2 = __esm(() => {
597335
597574
  // src/commands/install-skill/install-skill.tsx
597336
597575
  var exports_install_skill = {};
597337
597576
  __export(exports_install_skill, {
597338
- call: () => call54
597577
+ call: () => call55
597339
597578
  });
597340
597579
  function InstallSkillFlow({
597341
597580
  source,
@@ -597430,7 +597669,7 @@ function InstallSkillFlow({
597430
597669
  ]
597431
597670
  }, undefined, true, undefined, this);
597432
597671
  }
597433
- var import_react181, jsx_dev_runtime328, call54 = async (onDone, _context, args) => {
597672
+ var import_react181, jsx_dev_runtime328, call55 = async (onDone, _context, args) => {
597434
597673
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597435
597674
  const overwrite = tokens.includes("--overwrite");
597436
597675
  const source = tokens.filter((t2) => t2 !== "--overwrite").join(" ").trim();
@@ -597481,7 +597720,7 @@ var init_immediateCommand = __esm(() => {
597481
597720
  // src/commands/model/model.tsx
597482
597721
  var exports_model2 = {};
597483
597722
  __export(exports_model2, {
597484
- call: () => call55
597723
+ call: () => call56
597485
597724
  });
597486
597725
  function ModelPickerWrapper(t0) {
597487
597726
  const $3 = import_compiler_runtime244.c(17);
@@ -597731,7 +597970,7 @@ function renderModelLabel(model) {
597731
597970
  const rendered = renderDefaultModelSetting(model ?? getDefaultMainLoopModelSetting());
597732
597971
  return model === null ? `${rendered} (default)` : rendered;
597733
597972
  }
597734
- var import_compiler_runtime244, React102, jsx_dev_runtime329, call55 = async (onDone, _context, args) => {
597973
+ var import_compiler_runtime244, React102, jsx_dev_runtime329, call56 = async (onDone, _context, args) => {
597735
597974
  args = args?.trim() || "";
597736
597975
  if (COMMON_INFO_ARGS.includes(args)) {
597737
597976
  logEvent("tengu_model_command_inline_help", {
@@ -597808,7 +598047,7 @@ var init_model3 = __esm(() => {
597808
598047
  // src/commands/model-subagent/command.tsx
597809
598048
  var exports_command = {};
597810
598049
  __export(exports_command, {
597811
- call: () => call56
598050
+ call: () => call57
597812
598051
  });
597813
598052
  function resolveAgentType(token) {
597814
598053
  const t2 = token.trim().toLowerCase();
@@ -597816,7 +598055,7 @@ function resolveAgentType(token) {
597816
598055
  return;
597817
598056
  return SUBAGENT_TYPES.find((a2) => a2.toLowerCase() === t2);
597818
598057
  }
597819
- var jsx_dev_runtime330, COST_TIP = "Tip: subagents run frequently — a large model here costs more and is usually overkill for small subtasks. Prefer an instant/small model (e.g. Claude Opus 4.8 as a subagent is overkill).", SUBCOMMANDS, call56 = async (onDone, _context, args) => {
598058
+ var jsx_dev_runtime330, COST_TIP = "Tip: subagents run frequently — a large model here costs more and is usually overkill for small subtasks. Prefer an instant/small model (e.g. Claude Opus 4.8 as a subagent is overkill).", SUBCOMMANDS, call57 = async (onDone, _context, args) => {
597820
598059
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597821
598060
  let agentType;
597822
598061
  let sub = "";
@@ -597889,7 +598128,7 @@ var init_model_subagent = __esm(() => {
597889
598128
  // src/commands/collaborator-model/command.tsx
597890
598129
  var exports_command2 = {};
597891
598130
  __export(exports_command2, {
597892
- call: () => call57
598131
+ call: () => call58
597893
598132
  });
597894
598133
  function resolveCollaborator(token) {
597895
598134
  const t2 = token.trim().toLowerCase();
@@ -597897,7 +598136,7 @@ function resolveCollaborator(token) {
597897
598136
  return;
597898
598137
  return COLLABORATOR_AGENT_TYPES.find((a2) => a2.toLowerCase() === t2);
597899
598138
  }
597900
- var jsx_dev_runtime331, COST_TIP2 = "Collaborators implement and iterate, so they benefit from a capable model. By default they inherit the main agent’s model; set a specific one here if you want a collaborator on a different/cheaper provider.", SUBCOMMANDS2, call57 = async (onDone, _context, args) => {
598139
+ var jsx_dev_runtime331, COST_TIP2 = "Collaborators implement and iterate, so they benefit from a capable model. By default they inherit the main agent’s model; set a specific one here if you want a collaborator on a different/cheaper provider.", SUBCOMMANDS2, call58 = async (onDone, _context, args) => {
597901
598140
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597902
598141
  let collaborator;
597903
598142
  let sub = "";
@@ -597992,7 +598231,7 @@ var init_collaborator_model = __esm(() => {
597992
598231
  // src/commands/model-image-generation/command.tsx
597993
598232
  var exports_command3 = {};
597994
598233
  __export(exports_command3, {
597995
- call: () => call58
598234
+ call: () => call59
597996
598235
  });
597997
598236
  function backendLabel(provider) {
597998
598237
  return provider === "vertex" ? "Vertex (Imagen)" : "NVIDIA";
@@ -598035,7 +598274,7 @@ function ImageModelPicker({
598035
598274
  ]
598036
598275
  }, undefined, true, undefined, this);
598037
598276
  }
598038
- var jsx_dev_runtime332, call58 = async (onDone) => {
598277
+ var jsx_dev_runtime332, call59 = async (onDone) => {
598039
598278
  return /* @__PURE__ */ jsx_dev_runtime332.jsxDEV(ImageModelPicker, {
598040
598279
  onDone
598041
598280
  }, undefined, false, undefined, this);
@@ -598066,7 +598305,7 @@ var init_model_image_generation = __esm(() => {
598066
598305
  // src/commands/model-video-generation/command.tsx
598067
598306
  var exports_command4 = {};
598068
598307
  __export(exports_command4, {
598069
- call: () => call59
598308
+ call: () => call60
598070
598309
  });
598071
598310
  function backendLabel2(backend) {
598072
598311
  if (backend === "vertex")
@@ -598113,7 +598352,7 @@ function VideoModelPicker({
598113
598352
  ]
598114
598353
  }, undefined, true, undefined, this);
598115
598354
  }
598116
- var jsx_dev_runtime333, call59 = async (onDone) => {
598355
+ var jsx_dev_runtime333, call60 = async (onDone) => {
598117
598356
  return /* @__PURE__ */ jsx_dev_runtime333.jsxDEV(VideoModelPicker, {
598118
598357
  onDone
598119
598358
  }, undefined, false, undefined, this);
@@ -598144,7 +598383,7 @@ var init_model_video_generation = __esm(() => {
598144
598383
  // src/commands/tag/tag.tsx
598145
598384
  var exports_tag = {};
598146
598385
  __export(exports_tag, {
598147
- call: () => call60
598386
+ call: () => call61
598148
598387
  });
598149
598388
  function ConfirmRemoveTag(t0) {
598150
598389
  const $3 = import_compiler_runtime245.c(11);
@@ -598368,7 +598607,7 @@ Examples:
598368
598607
  React103.useEffect(t1, t2);
598369
598608
  return null;
598370
598609
  }
598371
- async function call60(onDone, _context, args) {
598610
+ async function call61(onDone, _context, args) {
598372
598611
  args = args?.trim() || "";
598373
598612
  if (COMMON_INFO_ARGS.includes(args) || COMMON_HELP_ARGS.includes(args)) {
598374
598613
  return /* @__PURE__ */ jsx_dev_runtime334.jsxDEV(ShowHelp, {
@@ -598417,9 +598656,9 @@ var init_tag2 = __esm(() => {
598417
598656
  // src/commands/output-style/output-style.tsx
598418
598657
  var exports_output_style = {};
598419
598658
  __export(exports_output_style, {
598420
- call: () => call61
598659
+ call: () => call62
598421
598660
  });
598422
- async function call61(onDone) {
598661
+ async function call62(onDone) {
598423
598662
  onDone("/output-style has been deprecated. Use /config to change your output style, or set it in your settings file. Changes take effect on the next session.", {
598424
598663
  display: "system"
598425
598664
  });
@@ -598468,7 +598707,7 @@ var exports_effort = {};
598468
598707
  __export(exports_effort, {
598469
598708
  showCurrentEffort: () => showCurrentEffort,
598470
598709
  executeEffort: () => executeEffort,
598471
- call: () => call62
598710
+ call: () => call63
598472
598711
  });
598473
598712
  function setEffortValue(effortValue) {
598474
598713
  const persistable = toPersistableEffort(effortValue);
@@ -598619,7 +598858,7 @@ function ApplyEffortAndClose(t0) {
598619
598858
  React104.useEffect(t1, t2);
598620
598859
  return null;
598621
598860
  }
598622
- async function call62(onDone, _context, args) {
598861
+ async function call63(onDone, _context, args) {
598623
598862
  args = args?.trim() || "";
598624
598863
  if (COMMON_HELP_ARGS2.includes(args)) {
598625
598864
  onDone(`Usage: /effort [low|medium|high|max|auto]
@@ -601528,9 +601767,9 @@ var init_Stats = __esm(() => {
601528
601767
  // src/commands/stats/stats.tsx
601529
601768
  var exports_stats = {};
601530
601769
  __export(exports_stats, {
601531
- call: () => call63
601770
+ call: () => call64
601532
601771
  });
601533
- var jsx_dev_runtime337, call63 = async (onDone) => {
601772
+ var jsx_dev_runtime337, call64 = async (onDone) => {
601534
601773
  return /* @__PURE__ */ jsx_dev_runtime337.jsxDEV(Stats2, {
601535
601774
  onClose: onDone
601536
601775
  }, undefined, false, undefined, this);
@@ -603022,7 +603261,7 @@ function generateHtmlReport(data, insights) {
603022
603261
  </html>`;
603023
603262
  }
603024
603263
  function buildExportData(data, insights, facets, remoteStats) {
603025
- const version3 = typeof MACRO !== "undefined" ? "1.3.428" : "unknown";
603264
+ const version3 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
603026
603265
  const remote_hosts_collected = remoteStats?.hosts.filter((h3) => h3.sessionCount > 0).map((h3) => h3.name);
603027
603266
  const facets_summary = {
603028
603267
  total: facets.size,
@@ -603765,6 +604004,7 @@ var init_commands2 = __esm(() => {
603765
604004
  init_init2();
603766
604005
  init_init_verifiers();
603767
604006
  init_collaborator_swarm();
604007
+ init_normal2();
603768
604008
  init_keybindings2();
603769
604009
  init_keep2();
603770
604010
  init_mcp3();
@@ -603907,6 +604147,7 @@ var init_commands2 = __esm(() => {
603907
604147
  feedback_default,
603908
604148
  review_default,
603909
604149
  collaborator_swarm_default,
604150
+ normal_default,
603910
604151
  ultraplan_local_default,
603911
604152
  ultrareview_local_default,
603912
604153
  generate_image_default,
@@ -606922,7 +607163,7 @@ var init_sessionStorage = __esm(() => {
606922
607163
  init_settings2();
606923
607164
  init_slowOperations();
606924
607165
  init_uuid();
606925
- VERSION6 = typeof MACRO !== "undefined" ? "1.3.428" : "unknown";
607166
+ VERSION6 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
606926
607167
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
606927
607168
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
606928
607169
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -608143,7 +608384,7 @@ var init_filesystem = __esm(() => {
608143
608384
  });
608144
608385
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
608145
608386
  const nonce = randomBytes18(16).toString("hex");
608146
- return join150(getClaudeTempDir(), "bundled-skills", "1.3.428", nonce);
608387
+ return join150(getClaudeTempDir(), "bundled-skills", "1.3.429", nonce);
608147
608388
  });
608148
608389
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
608149
608390
  });
@@ -613258,7 +613499,7 @@ __export(exports_update, {
613258
613499
  import { execFileSync as execFileSync3 } from "node:child_process";
613259
613500
  import { homedir as homedir33 } from "os";
613260
613501
  async function update() {
613261
- writeToStdout(`Current version: ${"1.3.428"}
613502
+ writeToStdout(`Current version: ${"1.3.429"}
613262
613503
  `);
613263
613504
  const isBundled = isInBundledMode();
613264
613505
  if (isBundled) {
@@ -613284,13 +613525,13 @@ Manual check: npm view ${"@rayu-dev/rayu-cli"} version
613284
613525
  process.exit(1);
613285
613526
  return;
613286
613527
  }
613287
- if (latestVersion === "1.3.428") {
613528
+ if (latestVersion === "1.3.429") {
613288
613529
  writeToStdout(source_default.green(`
613289
- Rayu CLI is up to date (${"1.3.428"})
613530
+ Rayu CLI is up to date (${"1.3.429"})
613290
613531
  `));
613291
613532
  process.exit(0);
613292
613533
  }
613293
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.3.428"})
613534
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.3.429"})
613294
613535
  `);
613295
613536
  writeToStdout(`Installing update...
613296
613537
 
@@ -613314,7 +613555,7 @@ Try manually:
613314
613555
  return;
613315
613556
  }
613316
613557
  writeToStdout(source_default.green(`
613317
- Successfully updated from ${"1.3.428"} to ${latestVersion}
613558
+ Successfully updated from ${"1.3.429"} to ${latestVersion}
613318
613559
  `));
613319
613560
  process.exit(0);
613320
613561
  }
@@ -613328,14 +613569,14 @@ async function updateNativeBinary() {
613328
613569
  } catch {
613329
613570
  latestVersion = "";
613330
613571
  }
613331
- if (latestVersion && latestVersion === "1.3.428") {
613572
+ if (latestVersion && latestVersion === "1.3.429") {
613332
613573
  writeToStdout(source_default.green(`
613333
- Rayu CLI is up to date (1.3.428)
613574
+ Rayu CLI is up to date (1.3.429)
613334
613575
  `));
613335
613576
  process.exit(0);
613336
613577
  }
613337
613578
  if (latestVersion) {
613338
- writeToStdout(`New version available: ${latestVersion} (current: 1.3.428)
613579
+ writeToStdout(`New version available: ${latestVersion} (current: 1.3.429)
613339
613580
  `);
613340
613581
  }
613341
613582
  writeToStdout(`Downloading and installing update...
@@ -613350,13 +613591,13 @@ Rayu CLI is up to date (1.3.428)
613350
613591
  return;
613351
613592
  }
613352
613593
  writeToStdout(source_default.green(`
613353
- Rayu CLI is up to date (1.3.428)
613594
+ Rayu CLI is up to date (1.3.429)
613354
613595
  `));
613355
613596
  process.exit(0);
613356
613597
  }
613357
613598
  const updatedTo = result.latestVersion ?? latestVersion ?? "latest";
613358
613599
  writeToStdout(source_default.green(`
613359
- Successfully updated from 1.3.428 to ${updatedTo}
613600
+ Successfully updated from 1.3.429 to ${updatedTo}
613360
613601
  `));
613361
613602
  writeToStdout(`Restart your terminal to use the new version.
613362
613603
  `);
@@ -613387,7 +613628,7 @@ __export(exports_uninstall, {
613387
613628
  import { execFileSync as execFileSync4 } from "node:child_process";
613388
613629
  import { homedir as homedir34 } from "os";
613389
613630
  async function uninstall() {
613390
- writeToStdout(`Uninstalling Rayu CLI (${"1.3.428"})...
613631
+ writeToStdout(`Uninstalling Rayu CLI (${"1.3.429"})...
613391
613632
  `);
613392
613633
  writeToStdout(`Running: npm uninstall -g ${"@rayu-dev/rayu-cli"}
613393
613634
 
@@ -613410,7 +613651,7 @@ Try running manually:
613410
613651
  process.exit(1);
613411
613652
  }
613412
613653
  writeToStdout(source_default.green(`
613413
- Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.3.428"}
613654
+ Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.3.429"}
613414
613655
  `));
613415
613656
  writeToStdout(`Thanks for using Rayu CLI!
613416
613657
  `);
@@ -613462,7 +613703,7 @@ function showFirstRunWelcome() {
613462
613703
  `);
613463
613704
  try {
613464
613705
  mkdirSync13(getRayuConfigHomeDir(), { recursive: true });
613465
- writeFileSync15(markerPath(), "1.3.428", "utf8");
613706
+ writeFileSync15(markerPath(), "1.3.429", "utf8");
613466
613707
  } catch {}
613467
613708
  }
613468
613709
  var init_firstRun = __esm(() => {
@@ -625305,7 +625546,7 @@ async function initializeBetaTracing(resource) {
625305
625546
  });
625306
625547
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
625307
625548
  setLoggerProvider(loggerProvider);
625308
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.428");
625549
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.429");
625309
625550
  setEventLogger(eventLogger);
625310
625551
  process.on("beforeExit", async () => {
625311
625552
  await loggerProvider?.forceFlush();
@@ -625345,7 +625586,7 @@ async function initializeTelemetry() {
625345
625586
  const platform4 = getPlatform();
625346
625587
  const baseAttributes = {
625347
625588
  [import_semantic_conventions2.ATTR_SERVICE_NAME]: "claude-code",
625348
- [import_semantic_conventions2.ATTR_SERVICE_VERSION]: "1.3.428"
625589
+ [import_semantic_conventions2.ATTR_SERVICE_VERSION]: "1.3.429"
625349
625590
  };
625350
625591
  if (platform4 === "wsl") {
625351
625592
  const wslVersion = getWslVersion();
@@ -625390,7 +625631,7 @@ async function initializeTelemetry() {
625390
625631
  } catch {}
625391
625632
  };
625392
625633
  registerCleanup(shutdownTelemetry2);
625393
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.3.428");
625634
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.3.429");
625394
625635
  }
625395
625636
  const meterProvider = new import_sdk_metrics2.MeterProvider({
625396
625637
  resource,
@@ -625410,7 +625651,7 @@ async function initializeTelemetry() {
625410
625651
  });
625411
625652
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
625412
625653
  setLoggerProvider(loggerProvider);
625413
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.428");
625654
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.429");
625414
625655
  setEventLogger(eventLogger);
625415
625656
  logForDebugging("[3P telemetry] Event logger set successfully");
625416
625657
  process.on("beforeExit", async () => {
@@ -625472,7 +625713,7 @@ Current timeout: ${timeoutMs}ms
625472
625713
  }
625473
625714
  };
625474
625715
  registerCleanup(shutdownTelemetry);
625475
- return meterProvider.getMeter("com.anthropic.claude_code", "1.3.428");
625716
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.3.429");
625476
625717
  }
625477
625718
  async function flushTelemetry() {
625478
625719
  const meterProvider = getMeterProvider();
@@ -626985,7 +627226,7 @@ function buildSystemInitMessage(inputs) {
626985
627226
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
626986
627227
  apiKeySource: getAnthropicApiKeyWithSource().source,
626987
627228
  betas: getSdkBetas(),
626988
- claude_code_version: "1.3.428",
627229
+ claude_code_version: "1.3.429",
626989
627230
  output_style: outputStyle2,
626990
627231
  agents: inputs.agents.map((agent) => agent.agentType),
626991
627232
  skills: inputs.skills.filter((s2) => s2.userInvocable !== false).map((skill) => skill.name),
@@ -643194,7 +643435,7 @@ var init_useVoiceEnabled = __esm(() => {
643194
643435
  function getSemverPart(version3) {
643195
643436
  return `${import_semver12.major(version3, { loose: true })}.${import_semver12.minor(version3, { loose: true })}.${import_semver12.patch(version3, { loose: true })}`;
643196
643437
  }
643197
- function useUpdateNotification(updatedVersion, initialVersion = "1.3.428") {
643438
+ function useUpdateNotification(updatedVersion, initialVersion = "1.3.429") {
643198
643439
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react218.useState(() => getSemverPart(initialVersion));
643199
643440
  if (!updatedVersion) {
643200
643441
  return null;
@@ -643234,7 +643475,7 @@ function AutoUpdater({
643234
643475
  return;
643235
643476
  }
643236
643477
  if (false) {}
643237
- const currentVersion = "1.3.428";
643478
+ const currentVersion = "1.3.429";
643238
643479
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
643239
643480
  let latestVersion = await getLatestVersion(channel);
643240
643481
  const isDisabled = isAutoUpdaterDisabled();
@@ -643447,12 +643688,12 @@ function NativeAutoUpdater({
643447
643688
  logEvent("tengu_native_auto_updater_start", {});
643448
643689
  try {
643449
643690
  const maxVersion = await getMaxVersion();
643450
- if (maxVersion && gt("1.3.428", maxVersion)) {
643691
+ if (maxVersion && gt("1.3.429", maxVersion)) {
643451
643692
  const msg = await getMaxVersionMessage();
643452
643693
  setMaxVersionIssue(msg ?? "affects your version");
643453
643694
  }
643454
643695
  const result = await installLatest(channel);
643455
- const currentVersion = "1.3.428";
643696
+ const currentVersion = "1.3.429";
643456
643697
  const latencyMs = Date.now() - startTime;
643457
643698
  if (result.lockFailed) {
643458
643699
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -643589,17 +643830,17 @@ function PackageManagerAutoUpdater(t0) {
643589
643830
  const maxVersion = await getMaxVersion();
643590
643831
  if (maxVersion && latest && gt(latest, maxVersion)) {
643591
643832
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
643592
- if (gte("1.3.428", maxVersion)) {
643593
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.3.428"} is already at or above maxVersion ${maxVersion}, skipping update`);
643833
+ if (gte("1.3.429", maxVersion)) {
643834
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.3.429"} is already at or above maxVersion ${maxVersion}, skipping update`);
643594
643835
  setUpdateAvailable(false);
643595
643836
  return;
643596
643837
  }
643597
643838
  latest = maxVersion;
643598
643839
  }
643599
- const hasUpdate = latest && !gte("1.3.428", latest) && !shouldSkipVersion(latest);
643840
+ const hasUpdate = latest && !gte("1.3.429", latest) && !shouldSkipVersion(latest);
643600
643841
  setUpdateAvailable(!!hasUpdate);
643601
643842
  if (hasUpdate) {
643602
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.3.428"} -> ${latest}`);
643843
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.3.429"} -> ${latest}`);
643603
643844
  }
643604
643845
  };
643605
643846
  $3[0] = t1;
@@ -643633,7 +643874,7 @@ function PackageManagerAutoUpdater(t0) {
643633
643874
  wrap: "truncate",
643634
643875
  children: [
643635
643876
  "currentVersion: ",
643636
- "1.3.428"
643877
+ "1.3.429"
643637
643878
  ]
643638
643879
  }, undefined, true, undefined, this);
643639
643880
  $3[3] = verbose;
@@ -651798,7 +652039,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
651798
652039
  project_dir: getOriginalCwd(),
651799
652040
  added_dirs: addedDirs
651800
652041
  },
651801
- version: "1.3.428",
652042
+ version: "1.3.429",
651802
652043
  output_style: {
651803
652044
  name: outputStyleName
651804
652045
  },
@@ -653083,6 +653324,7 @@ function ModeIndicator({
653083
653324
  } = useTerminalSize();
653084
653325
  const modeCycleShortcut = useShortcutDisplay("chat:cycleMode", "Chat", "shift+tab");
653085
653326
  const tasks2 = useAppState((s2) => s2.tasks);
653327
+ const swarmMode = useAppState((s_sw) => s_sw.swarmMode);
653086
653328
  const teamContext = useAppState((s_0) => s_0.teamContext);
653087
653329
  const store = useAppStateStore();
653088
653330
  const [remoteSessionUrl] = import_react245.useState(() => store.getState().remoteSessionUrl);
@@ -653126,7 +653368,7 @@ function ModeIndicator({
653126
653368
  const isViewingTeammate = viewSelectionMode === "viewing-agent" && viewedTask?.type === "in_process_teammate";
653127
653369
  const isViewingCompletedTeammate = isViewingTeammate && viewedTask != null && viewedTask.status !== "running";
653128
653370
  const hasBackgroundTasks = runningTaskCount > 0 || isViewingTeammate;
653129
- const primaryItemCount = (isCoordinator || hasActiveMode ? 1 : 0) + (hasBackgroundTasks ? 1 : 0) + (hasTeams ? 1 : 0);
653371
+ const primaryItemCount = (isCoordinator || hasActiveMode ? 1 : 0) + (hasBackgroundTasks ? 1 : 0) + (hasTeams ? 1 : 0) + (swarmMode ? 1 : 0);
653130
653372
  const shouldShowPrStatus = isPrStatusEnabled() && prStatus.number !== null && prStatus.reviewState !== null && prStatus.url !== null && primaryItemCount < 2 && (primaryItemCount === 0 || columns >= 80);
653131
653373
  const shouldShowModeHint = primaryItemCount < 2;
653132
653374
  const hasInProcessTeammates = !showSpinnerTree && hasBackgroundTasks && Object.values(tasks2).some((t_1) => t_1.type === "in_process_teammate");
@@ -653151,7 +653393,18 @@ function ModeIndicator({
653151
653393
  }, undefined, true, undefined, this)
653152
653394
  ]
653153
653395
  }, "mode", true, undefined, this) : null;
653396
+ const swarmPart = swarmMode ? /* @__PURE__ */ jsx_dev_runtime415.jsxDEV(ThemedText, {
653397
+ color: "permission",
653398
+ children: [
653399
+ "⚡ collaborator_swarm mode",
653400
+ /* @__PURE__ */ jsx_dev_runtime415.jsxDEV(ThemedText, {
653401
+ dimColor: true,
653402
+ children: " · /normal to exit"
653403
+ }, undefined, false, undefined, this)
653404
+ ]
653405
+ }, "swarm-mode", true, undefined, this) : null;
653154
653406
  const parts = [
653407
+ ...swarmPart ? [swarmPart] : [],
653155
653408
  ...remoteSessionUrl ? [/* @__PURE__ */ jsx_dev_runtime415.jsxDEV(Link, {
653156
653409
  url: remoteSessionUrl,
653157
653410
  children: /* @__PURE__ */ jsx_dev_runtime415.jsxDEV(ThemedText, {
@@ -663168,7 +663421,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
663168
663421
  } catch {}
663169
663422
  const data = {
663170
663423
  trigger,
663171
- version: "1.3.428",
663424
+ version: "1.3.429",
663172
663425
  platform: process.platform,
663173
663426
  transcript,
663174
663427
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -665698,7 +665951,7 @@ var init_tipRegistry = __esm(() => {
665698
665951
  id: "mobile-app",
665699
665952
  content: async () => "/mobile to use RAYU from the Claude app on your phone",
665700
665953
  cooldownSessions: 15,
665701
- isRelevant: async () => true
665954
+ isRelevant: async () => false
665702
665955
  },
665703
665956
  {
665704
665957
  id: "opusplan-mode-reminder",
@@ -675217,7 +675470,22 @@ function WelcomeV2() {
675217
675470
  dimColor: true,
675218
675471
  children: [
675219
675472
  "v",
675220
- "1.3.428"
675473
+ "1.3.429"
675474
+ ]
675475
+ }, undefined, true, undefined, this)
675476
+ ]
675477
+ }, undefined, true, undefined, this),
675478
+ /* @__PURE__ */ jsx_dev_runtime456.jsxDEV(ThemedBox_default, {
675479
+ paddingLeft: 2,
675480
+ children: [
675481
+ /* @__PURE__ */ jsx_dev_runtime456.jsxDEV(AnimatedAsterisk, {
675482
+ char: UP_ARROW
675483
+ }, undefined, false, undefined, this),
675484
+ /* @__PURE__ */ jsx_dev_runtime456.jsxDEV(ThemedText, {
675485
+ dimColor: true,
675486
+ children: [
675487
+ " ",
675488
+ "Welcome!, Thank You For Choosing Rayu!"
675221
675489
  ]
675222
675490
  }, undefined, true, undefined, this)
675223
675491
  ]
@@ -675228,6 +675496,8 @@ function WelcomeV2() {
675228
675496
  var jsx_dev_runtime456, RAYU_BANNER2;
675229
675497
  var init_WelcomeV2 = __esm(() => {
675230
675498
  init_ink2();
675499
+ init_AnimatedAsterisk();
675500
+ init_figures2();
675231
675501
  jsx_dev_runtime456 = __toESM(require_jsx_dev_runtime(), 1);
675232
675502
  RAYU_BANNER2 = [
675233
675503
  ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#cfff7c"],
@@ -676934,7 +677204,7 @@ function completeOnboarding() {
676934
677204
  saveGlobalConfig((current) => ({
676935
677205
  ...current,
676936
677206
  hasCompletedOnboarding: true,
676937
- lastOnboardingVersion: "1.3.428"
677207
+ lastOnboardingVersion: "1.3.429"
676938
677208
  }));
676939
677209
  }
676940
677210
  function showDialog(root2, renderer) {
@@ -681234,7 +681504,7 @@ function appendToLog(path30, message) {
681234
681504
  cwd: getFsImplementation().cwd(),
681235
681505
  userType: "external",
681236
681506
  sessionId: getSessionId(),
681237
- version: "1.3.428"
681507
+ version: "1.3.429"
681238
681508
  };
681239
681509
  getLogWriter(path30).write(messageWithTimestamp);
681240
681510
  }
@@ -685342,8 +685612,8 @@ async function getEnvLessBridgeConfig() {
685342
685612
  }
685343
685613
  async function checkEnvLessBridgeMinVersion() {
685344
685614
  const cfg = await getEnvLessBridgeConfig();
685345
- if (cfg.min_version && lt("1.3.428", cfg.min_version)) {
685346
- return `Your version of RAYU (${"1.3.428"}) is too old for Remote Control.
685615
+ if (cfg.min_version && lt("1.3.429", cfg.min_version)) {
685616
+ return `Your version of RAYU (${"1.3.429"}) is too old for Remote Control.
685347
685617
  Version ${cfg.min_version} or higher is required. Run \`claude update\` to update.`;
685348
685618
  }
685349
685619
  return null;
@@ -685817,7 +686087,7 @@ async function initBridgeCore(params) {
685817
686087
  const rawApi = createBridgeApiClient({
685818
686088
  baseUrl,
685819
686089
  getAccessToken,
685820
- runnerVersion: "1.3.428",
686090
+ runnerVersion: "1.3.429",
685821
686091
  onDebug: logForDebugging,
685822
686092
  onAuth401,
685823
686093
  getTrustedDeviceToken
@@ -691179,7 +691449,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
691179
691449
  setCwd(cwd3);
691180
691450
  const server = new Server({
691181
691451
  name: "claude/tengu",
691182
- version: "1.3.428"
691452
+ version: "1.3.429"
691183
691453
  }, {
691184
691454
  capabilities: {
691185
691455
  tools: {}
@@ -693705,7 +693975,7 @@ ${customInstructions}` : customInstructions;
693705
693975
  }
693706
693976
  }
693707
693977
  logForDiagnosticsNoPII("info", "started", {
693708
- version: "1.3.428",
693978
+ version: "1.3.429",
693709
693979
  is_native_binary: isInBundledMode()
693710
693980
  });
693711
693981
  registerCleanup(async () => {
@@ -694008,6 +694278,7 @@ ${customInstructions}` : customInstructions;
694008
694278
  snapshotSequence: 0
694009
694279
  },
694010
694280
  pendingFileChanges: [],
694281
+ swarmMode: false,
694011
694282
  attribution: createEmptyAttributionState(),
694012
694283
  thinkingEnabled,
694013
694284
  promptSuggestionEnabled: shouldEnablePromptSuggestion(),
@@ -694423,7 +694694,7 @@ Usage: rayu --remote "your task description"`, () => gracefulShutdown(1));
694423
694694
  pendingHookMessages
694424
694695
  }, renderAndRun);
694425
694696
  }
694426
- }).version("1.3.428 (Rayu-CLI)", "-v, --version", "Output the version number");
694697
+ }).version("1.3.429 (Rayu-CLI)", "-v, --version", "Output the version number");
694427
694698
  program.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
694428
694699
  program.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
694429
694700
  if (canUserConfigureAdvisor()) {
@@ -694889,7 +695160,7 @@ if (false) {}
694889
695160
  async function main2() {
694890
695161
  const args = process.argv.slice(2);
694891
695162
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694892
- console.log(`${"1.3.428"} (Rayu-CLI)`);
695163
+ console.log(`${"1.3.429"} (Rayu-CLI)`);
694893
695164
  return;
694894
695165
  }
694895
695166
  const {