@rayu-dev/rayu-cli 1.3.427 → 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 +715 -263
  2. package/package.json +1 -1
package/dist/rayu.js CHANGED
@@ -35755,10 +35755,14 @@ var exports_rayuProviders = {};
35755
35755
  __export(exports_rayuProviders, {
35756
35756
  vertexHost: () => vertexHost,
35757
35757
  vertexBaseURL: () => vertexBaseURL,
35758
+ providerDisplayName: () => providerDisplayName,
35759
+ ollamaBaseURL: () => ollamaBaseURL,
35758
35760
  migrateEnvKeysToConfig: () => migrateEnvKeysToConfig,
35761
+ getActiveProviderDisplayName: () => getActiveProviderDisplayName,
35759
35762
  bedrockBaseURL: () => bedrockBaseURL,
35760
35763
  VERTEX_REGIONS: () => VERTEX_REGIONS,
35761
35764
  PROVIDER_PRESETS: () => PROVIDER_PRESETS,
35765
+ OLLAMA_DEFAULT_BASE_URL: () => OLLAMA_DEFAULT_BASE_URL,
35762
35766
  GEMINI_VERTEX_PROVIDER_ID: () => GEMINI_VERTEX_PROVIDER_ID,
35763
35767
  DEFAULT_VERTEX_REGION: () => DEFAULT_VERTEX_REGION,
35764
35768
  DEFAULT_BEDROCK_REGION: () => DEFAULT_BEDROCK_REGION,
@@ -35777,6 +35781,19 @@ function vertexBaseURL(project, region) {
35777
35781
  const p = project.trim();
35778
35782
  return `https://${vertexHost(r2)}/v1beta1/projects/${p}/locations/${r2}/endpoints/openapi`;
35779
35783
  }
35784
+ function ollamaBaseURL() {
35785
+ let raw = (process.env.OLLAMA_HOST || "").trim();
35786
+ if (!raw)
35787
+ return OLLAMA_DEFAULT_BASE_URL;
35788
+ if (/^\d+$/.test(raw))
35789
+ raw = `localhost:${raw}`;
35790
+ if (!/^https?:\/\//i.test(raw))
35791
+ raw = `http://${raw}`;
35792
+ raw = raw.replace(/\/+$/, "");
35793
+ if (!/\/v1(\/.*)?$/.test(raw))
35794
+ raw = `${raw}/v1`;
35795
+ return raw;
35796
+ }
35780
35797
  function migrateEnvKeysToConfig() {
35781
35798
  loadDotEnv();
35782
35799
  const cfg = loadRayuConfig();
@@ -35833,7 +35850,34 @@ function migrateEnvKeysToConfig() {
35833
35850
  saveRayuConfig(cfg);
35834
35851
  }
35835
35852
  }
35836
- var DEFAULT_BEDROCK_REGION = "us-east-1", BEDROCK_REGIONS, GEMINI_VERTEX_PROVIDER_ID = "gemini-vertex", DEFAULT_VERTEX_REGION = "global", VERTEX_REGIONS, 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;
35837
35881
  var init_rayuProviders = __esm(() => {
35838
35882
  init_rayuConfig();
35839
35883
  init_envUtils();
@@ -36019,6 +36063,12 @@ var init_rayuProviders = __esm(() => {
36019
36063
  kind: "bedrock",
36020
36064
  bedrockApi: "anthropic"
36021
36065
  },
36066
+ {
36067
+ id: "ollama",
36068
+ label: "Ollama (local · auto-detect)",
36069
+ kind: "openai-compatible",
36070
+ baseURL: OLLAMA_DEFAULT_BASE_URL
36071
+ },
36022
36072
  {
36023
36073
  id: "local",
36024
36074
  label: "Local / custom OpenAI-compatible endpoint",
@@ -36026,6 +36076,31 @@ var init_rayuProviders = __esm(() => {
36026
36076
  promptBaseURL: true
36027
36077
  }
36028
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
+ };
36029
36104
  });
36030
36105
 
36031
36106
  // src/utils/rayuConfig.ts
@@ -148070,7 +148145,7 @@ var init_auth = __esm(() => {
148070
148145
 
148071
148146
  // src/utils/userAgent.ts
148072
148147
  function getRayuUserAgent() {
148073
- return `rayu/${"1.3.427"}`;
148148
+ return `rayu/${"1.3.429"}`;
148074
148149
  }
148075
148150
  var getClaudeCodeUserAgent;
148076
148151
  var init_userAgent = __esm(() => {
@@ -148096,7 +148171,7 @@ function getUserAgent() {
148096
148171
  const clientApp = process.env.RAYU_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}` : "";
148097
148172
  const workload = getWorkload();
148098
148173
  const workloadSuffix = workload ? `, workload/${workload}` : "";
148099
- return `rayu/${"1.3.427"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
148174
+ return `rayu/${"1.3.429"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
148100
148175
  }
148101
148176
  function getMCPUserAgent() {
148102
148177
  const parts = [];
@@ -148110,7 +148185,7 @@ function getMCPUserAgent() {
148110
148185
  parts.push(`client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}`);
148111
148186
  }
148112
148187
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
148113
- return `rayu/${"1.3.427"}${suffix}`;
148188
+ return `rayu/${"1.3.429"}${suffix}`;
148114
148189
  }
148115
148190
  function getWebFetchUserAgent() {
148116
148191
  return `Rayu-User (${getRayuUserAgent()})`;
@@ -148233,7 +148308,7 @@ var init_user = __esm(() => {
148233
148308
  deviceId,
148234
148309
  sessionId: getSessionId(),
148235
148310
  email: getEmail(),
148236
- appVersion: "1.3.427",
148311
+ appVersion: "1.3.429",
148237
148312
  platform: getHostPlatformForAnalytics(),
148238
148313
  organizationUuid,
148239
148314
  accountUuid,
@@ -164309,6 +164384,54 @@ var init_openai = __esm(() => {
164309
164384
  init_azure();
164310
164385
  });
164311
164386
 
164387
+ // src/bridge/sessionIdCompat.ts
164388
+ var exports_sessionIdCompat = {};
164389
+ __export(exports_sessionIdCompat, {
164390
+ toInfraSessionId: () => toInfraSessionId,
164391
+ toCompatSessionId: () => toCompatSessionId,
164392
+ setCseShimGate: () => setCseShimGate
164393
+ });
164394
+ function setCseShimGate(gate) {
164395
+ _isCseShimEnabled = gate;
164396
+ }
164397
+ function toCompatSessionId(id) {
164398
+ if (!id.startsWith("cse_"))
164399
+ return id;
164400
+ if (_isCseShimEnabled && !_isCseShimEnabled())
164401
+ return id;
164402
+ return "session_" + id.slice("cse_".length);
164403
+ }
164404
+ function toInfraSessionId(id) {
164405
+ if (!id.startsWith("session_"))
164406
+ return id;
164407
+ return "cse_" + id.slice("session_".length);
164408
+ }
164409
+ var _isCseShimEnabled;
164410
+
164411
+ // src/constants/product.ts
164412
+ function isRemoteSessionStaging(sessionId, ingressUrl) {
164413
+ return sessionId?.includes("_staging_") === true || ingressUrl?.includes("staging") === true;
164414
+ }
164415
+ function isRemoteSessionLocal(sessionId, ingressUrl) {
164416
+ return sessionId?.includes("_local_") === true || ingressUrl?.includes("localhost") === true;
164417
+ }
164418
+ function getClaudeAiBaseUrl(sessionId, ingressUrl) {
164419
+ if (isRemoteSessionLocal(sessionId, ingressUrl)) {
164420
+ return CLAUDE_AI_LOCAL_BASE_URL;
164421
+ }
164422
+ if (isRemoteSessionStaging(sessionId, ingressUrl)) {
164423
+ return CLAUDE_AI_STAGING_BASE_URL;
164424
+ }
164425
+ return CLAUDE_AI_BASE_URL;
164426
+ }
164427
+ function getRemoteSessionUrl(sessionId, ingressUrl) {
164428
+ const { toCompatSessionId: toCompatSessionId2 } = __toCommonJS(exports_sessionIdCompat);
164429
+ const compatId = toCompatSessionId2(sessionId);
164430
+ const baseUrl = getClaudeAiBaseUrl(compatId, ingressUrl);
164431
+ return `${baseUrl}/code/${compatId}`;
164432
+ }
164433
+ var PRODUCT_NAME = "Rayu-CLI", PRODUCT_URL = "https://github.com/rayu-cli/rayu-cli", CLAUDE_AI_BASE_URL = "https://claude.ai", CLAUDE_AI_STAGING_BASE_URL = "https://claude-ai.staging.ant.dev", CLAUDE_AI_LOCAL_BASE_URL = "http://localhost:4000";
164434
+
164312
164435
  // src/services/api/openaiAdapter.ts
164313
164436
  var exports_openaiAdapter = {};
164314
164437
  __export(exports_openaiAdapter, {
@@ -164317,6 +164440,7 @@ __export(exports_openaiAdapter, {
164317
164440
  toBetaMessage: () => toBetaMessage,
164318
164441
  splitInlineThink: () => splitInlineThink,
164319
164442
  processInlineThink: () => processInlineThink,
164443
+ isToolUnsupported: () => isToolUnsupported,
164320
164444
  isReasoningModel: () => isReasoningModel,
164321
164445
  initialInlineThinkState: () => initialInlineThinkState,
164322
164446
  extractReasoningText: () => extractReasoningText,
@@ -164517,8 +164641,8 @@ function buildOpenAIRequest(params, options = {}) {
164517
164641
  req.max_tokens = params.max_tokens;
164518
164642
  }
164519
164643
  }
164520
- if (typeof params.temperature === "number" && !isReasoningModel(params.model)) {
164521
- req.temperature = params.temperature;
164644
+ if (!isReasoningModel(params.model)) {
164645
+ req.temperature = typeof params.temperature === "number" ? params.temperature : 1;
164522
164646
  }
164523
164647
  const tools = translateTools(params.tools);
164524
164648
  if (tools) {
@@ -164959,6 +165083,16 @@ function withoutTools(req) {
164959
165083
  const { tools: _tools, tool_choice: _tc, ...rest } = req;
164960
165084
  return rest;
164961
165085
  }
165086
+ function isToolUnsupported(e2, req) {
165087
+ if (e2?.status !== 400 || !req.tools)
165088
+ return false;
165089
+ const msg = String(e2?.message ?? "");
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);
165091
+ }
165092
+ function toolUnsupportedError(e2, 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.`;
165094
+ return import_sdk2.APIError.generate(400, e2?.error, message, e2?.headers);
165095
+ }
164962
165096
  function normalizeError(e2) {
164963
165097
  if (e2 instanceof APIConnectionError) {
164964
165098
  return new import_sdk2.APIConnectionError({
@@ -165033,6 +165167,10 @@ function createOpenAICompatibleClientUncached(config2) {
165033
165167
  throw normalizeError(e22);
165034
165168
  }
165035
165169
  }
165170
+ if (isToolUnsupported(e2, request)) {
165171
+ reportIssue("openai_adapter.tool_unsupported", "model does not support tool calling", { model, status: 400 });
165172
+ throw toolUnsupportedError(e2, model);
165173
+ }
165036
165174
  reportIssue("openai_adapter.request_failed", "OpenAI-compatible request failed", { model, status: e2?.status, error: e2 instanceof Error ? e2.message : String(e2) });
165037
165175
  throw normalizeError(e2);
165038
165176
  }
@@ -165061,6 +165199,9 @@ function createOpenAICompatibleClientUncached(config2) {
165061
165199
  } catch (e22) {
165062
165200
  throw normalizeError(e22);
165063
165201
  }
165202
+ } else if (isToolUnsupported(e2, request)) {
165203
+ reportIssue("openai_adapter.tool_unsupported", "model does not support tool calling", { model, status: 400 });
165204
+ throw toolUnsupportedError(e2, model);
165064
165205
  } else {
165065
165206
  reportIssue("openai_adapter.stream_failed", "OpenAI-compatible streaming request failed", {
165066
165207
  model,
@@ -181962,7 +182103,7 @@ var init_metadata = __esm(() => {
181962
182103
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
181963
182104
  WHITESPACE_REGEX = /\s+/;
181964
182105
  getVersionBase = memoize_default(() => {
181965
- const match = "1.3.427".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
182106
+ const match = "1.3.429".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
181966
182107
  return match ? match[0] : undefined;
181967
182108
  });
181968
182109
  buildEnvContext = memoize_default(async () => {
@@ -182001,7 +182142,7 @@ var init_metadata = __esm(() => {
182001
182142
  },
182002
182143
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
182003
182144
  isRayuAction: isEnvTruthy(process.env.RAYU_ACTION),
182004
- version: "1.3.427",
182145
+ version: "1.3.429",
182005
182146
  versionBase: getVersionBase(),
182006
182147
  buildTime: "",
182007
182148
  deploymentEnvironment: env4.detectDeploymentEnvironment(),
@@ -182615,7 +182756,7 @@ function initialize1PEventLogging() {
182615
182756
  const platform2 = getPlatform();
182616
182757
  const attributes = {
182617
182758
  [import_semantic_conventions.ATTR_SERVICE_NAME]: "rayu",
182618
- [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.3.427"
182759
+ [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.3.429"
182619
182760
  };
182620
182761
  if (platform2 === "wsl") {
182621
182762
  const wslVersion = getWslVersion();
@@ -182642,7 +182783,7 @@ function initialize1PEventLogging() {
182642
182783
  })
182643
182784
  ]
182644
182785
  });
182645
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("io.rayu.events", "1.3.427");
182786
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("io.rayu.events", "1.3.429");
182646
182787
  }
182647
182788
  async function reinitialize1PEventLoggingIfConfigChanged() {
182648
182789
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -218558,7 +218699,7 @@ function getAttributionHeader(fingerprint) {
218558
218699
  if (!isAttributionHeaderEnabled()) {
218559
218700
  return "";
218560
218701
  }
218561
- const version2 = `${"1.3.427"}.${fingerprint}`;
218702
+ const version2 = `${"1.3.429"}.${fingerprint}`;
218562
218703
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
218563
218704
  const cch = "";
218564
218705
  const workload = getWorkload();
@@ -269503,6 +269644,51 @@ var init_asset_generation = __esm(() => {
269503
269644
  };
269504
269645
  });
269505
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
+
269506
269692
  // src/tools/AgentTool/built-in/subagents/design.ts
269507
269693
  function getDesignSystemPrompt() {
269508
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.
@@ -269578,7 +269764,9 @@ ${SKILL_SEEKING}
269578
269764
  - Install all required dependencies.
269579
269765
  - Configure tooling (e.g. tailwind/theme config, linter, tsconfig) with the EXACT tokens from the Design PRD (colors, fonts) when provided.
269580
269766
  - Set up global styles and shared utilities/helpers called for by the brief.
269581
- - 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).
269582
269770
 
269583
269771
  ## Rules
269584
269772
  - Use the exact stack/versions specified — do not substitute.
@@ -269708,6 +269896,7 @@ var init_review = __esm(() => {
269708
269896
  var SUBAGENTS, SUBAGENT_TYPES;
269709
269897
  var init_subagents = __esm(() => {
269710
269898
  init_asset_generation();
269899
+ init_backend_design();
269711
269900
  init_design();
269712
269901
  init_fix();
269713
269902
  init_global_setup();
@@ -269717,6 +269906,7 @@ var init_subagents = __esm(() => {
269717
269906
  SUBAGENTS = [
269718
269907
  PA_SUBAGENT,
269719
269908
  DESIGN_SUBAGENT,
269909
+ BACKEND_DESIGN_SUBAGENT,
269720
269910
  GLOBAL_SETUP_SUBAGENT,
269721
269911
  ASSET_GENERATION_SUBAGENT,
269722
269912
  REVIEW_SUBAGENT,
@@ -270224,7 +270414,7 @@ function defineCollaborator(s2) {
270224
270414
  return {
270225
270415
  agentType: s2.agentType,
270226
270416
  whenToUse: s2.whenToUse,
270227
- tools: ["*"],
270417
+ tools: s2.allowedSubagents ? ["*", `Agent(${s2.allowedSubagents.join(",")})`] : ["*"],
270228
270418
  color: s2.color,
270229
270419
  source: "built-in",
270230
270420
  baseDir: "built-in",
@@ -270270,6 +270460,14 @@ var init_backend = __esm(() => {
270270
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.",
270271
270461
  skillHint: "e.g. an API-design skill for clean, consistent endpoint and schema design",
270272
270462
  withStackAwareness: true,
270463
+ allowedSubagents: [
270464
+ "backend-design",
270465
+ "review",
270466
+ "fix",
270467
+ "linter",
270468
+ "Explore",
270469
+ "general-purpose"
270470
+ ],
270273
270471
  owns: [
270274
270472
  "API routes (method, path, auth, request/response shapes)",
270275
270473
  "Service layer, business logic, middleware, error handling",
@@ -270291,6 +270489,7 @@ var init_deploy = __esm(() => {
270291
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.",
270292
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.",
270293
270491
  skillHint: "e.g. a deployment/CI skill for the target platform (Docker, Vercel, etc.)",
270492
+ allowedSubagents: ["review", "fix", "linter", "Explore", "general-purpose"],
270294
270493
  owns: [
270295
270494
  "Dockerfile (multi-stage) and docker-compose",
270296
270495
  "CI/CD pipeline and build configuration",
@@ -270313,10 +270512,19 @@ var init_frontend = __esm(() => {
270313
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.",
270314
270513
  skillHint: "e.g. a UI/UX design skill such as ui-ux-pro-max for stronger visual/UX decisions",
270315
270514
  withStackAwareness: true,
270515
+ allowedSubagents: [
270516
+ "design",
270517
+ "asset-generation",
270518
+ "review",
270519
+ "fix",
270520
+ "linter",
270521
+ "Explore",
270522
+ "general-purpose"
270523
+ ],
270316
270524
  owns: [
270317
270525
  "Page/screen architecture and the component tree",
270318
270526
  "State management and data fetching",
270319
- "Design system tokens (color, typography, spacing) and responsive behavior",
270527
+ "Implements the Design PRD tokens (color, typography, spacing) and responsive behavior",
270320
270528
  "Animations/interactions and accessibility",
270321
270529
  "API integration against the backend collaborator’s routes"
270322
270530
  ]
@@ -270336,6 +270544,16 @@ var init_mobile = __esm(() => {
270336
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.",
270337
270545
  skillHint: "e.g. a mobile/Flutter UI skill for idiomatic screens and navigation",
270338
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
+ ],
270339
270557
  owns: [
270340
270558
  "Screen architecture and navigation",
270341
270559
  "State management (Riverpod/Bloc/Provider or RN equivalent)",
@@ -270357,6 +270575,14 @@ var init_security = __esm(() => {
270357
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.",
270358
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.",
270359
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
+ ],
270360
270586
  owns: [
270361
270587
  "Authentication + authorization (RBAC) design and implementation",
270362
270588
  "Input validation and sensitive-data (hash/encrypt) handling",
@@ -303163,7 +303389,7 @@ function getTelemetryAttributes() {
303163
303389
  attributes["session.id"] = sessionId;
303164
303390
  }
303165
303391
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
303166
- attributes["app.version"] = "1.3.427";
303392
+ attributes["app.version"] = "1.3.429";
303167
303393
  }
303168
303394
  const oauthAccount = getOauthAccountInfo();
303169
303395
  if (oauthAccount) {
@@ -406029,54 +406255,6 @@ var init_p_map = __esm(() => {
406029
406255
  pMapSkip = Symbol("skip");
406030
406256
  });
406031
406257
 
406032
- // src/bridge/sessionIdCompat.ts
406033
- var exports_sessionIdCompat = {};
406034
- __export(exports_sessionIdCompat, {
406035
- toInfraSessionId: () => toInfraSessionId,
406036
- toCompatSessionId: () => toCompatSessionId,
406037
- setCseShimGate: () => setCseShimGate
406038
- });
406039
- function setCseShimGate(gate) {
406040
- _isCseShimEnabled = gate;
406041
- }
406042
- function toCompatSessionId(id) {
406043
- if (!id.startsWith("cse_"))
406044
- return id;
406045
- if (_isCseShimEnabled && !_isCseShimEnabled())
406046
- return id;
406047
- return "session_" + id.slice("cse_".length);
406048
- }
406049
- function toInfraSessionId(id) {
406050
- if (!id.startsWith("session_"))
406051
- return id;
406052
- return "cse_" + id.slice("session_".length);
406053
- }
406054
- var _isCseShimEnabled;
406055
-
406056
- // src/constants/product.ts
406057
- function isRemoteSessionStaging(sessionId, ingressUrl) {
406058
- return sessionId?.includes("_staging_") === true || ingressUrl?.includes("staging") === true;
406059
- }
406060
- function isRemoteSessionLocal(sessionId, ingressUrl) {
406061
- return sessionId?.includes("_local_") === true || ingressUrl?.includes("localhost") === true;
406062
- }
406063
- function getClaudeAiBaseUrl(sessionId, ingressUrl) {
406064
- if (isRemoteSessionLocal(sessionId, ingressUrl)) {
406065
- return CLAUDE_AI_LOCAL_BASE_URL;
406066
- }
406067
- if (isRemoteSessionStaging(sessionId, ingressUrl)) {
406068
- return CLAUDE_AI_STAGING_BASE_URL;
406069
- }
406070
- return CLAUDE_AI_BASE_URL;
406071
- }
406072
- function getRemoteSessionUrl(sessionId, ingressUrl) {
406073
- const { toCompatSessionId: toCompatSessionId2 } = __toCommonJS(exports_sessionIdCompat);
406074
- const compatId = toCompatSessionId2(sessionId);
406075
- const baseUrl = getClaudeAiBaseUrl(compatId, ingressUrl);
406076
- return `${baseUrl}/code/${compatId}`;
406077
- }
406078
- var PRODUCT_NAME = "Rayu-CLI", PRODUCT_URL = "https://github.com/rayu-cli/rayu-cli", CLAUDE_AI_BASE_URL = "https://claude.ai", CLAUDE_AI_STAGING_BASE_URL = "https://claude-ai.staging.ant.dev", CLAUDE_AI_LOCAL_BASE_URL = "http://localhost:4000";
406079
-
406080
406258
  // src/tools/ListMcpResourcesTool/prompt.ts
406081
406259
  var LIST_MCP_RESOURCES_TOOL_NAME = "ListMcpResourcesTool", DESCRIPTION6 = `
406082
406260
  Lists available resources from configured MCP servers.
@@ -413521,7 +413699,7 @@ function getInstallationEnv() {
413521
413699
  return;
413522
413700
  }
413523
413701
  function getClaudeCodeVersion() {
413524
- return "1.3.427";
413702
+ return "1.3.429";
413525
413703
  }
413526
413704
  async function getInstalledVSCodeExtensionVersion(command) {
413527
413705
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -418759,7 +418937,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
418759
418937
  const client4 = new Client({
418760
418938
  name: "claude-code",
418761
418939
  title: "RAYU",
418762
- version: "1.3.427",
418940
+ version: "1.3.429",
418763
418941
  description: "Anthropic's agentic coding tool",
418764
418942
  websiteUrl: PRODUCT_URL
418765
418943
  }, {
@@ -419076,7 +419254,7 @@ var init_client7 = __esm(() => {
419076
419254
  const client4 = new Client({
419077
419255
  name: "claude-code",
419078
419256
  title: "RAYU",
419079
- version: "1.3.427",
419257
+ version: "1.3.429",
419080
419258
  description: "Anthropic's agentic coding tool",
419081
419259
  websiteUrl: PRODUCT_URL
419082
419260
  }, {
@@ -433881,7 +434059,7 @@ function computeFingerprint(messageText, version2) {
433881
434059
  }
433882
434060
  function computeFingerprintFromMessages(messages) {
433883
434061
  const firstMessageText = extractFirstMessageText(messages);
433884
- return computeFingerprint(firstMessageText, "1.3.427");
434062
+ return computeFingerprint(firstMessageText, "1.3.429");
433885
434063
  }
433886
434064
  var FINGERPRINT_SALT = "59cf53e54c78";
433887
434065
  var init_fingerprint = () => {};
@@ -433923,7 +434101,7 @@ async function sideQuery(opts) {
433923
434101
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
433924
434102
  }
433925
434103
  const messageText = extractFirstUserMessageText(messages);
433926
- const fingerprint = computeFingerprint(messageText, "1.3.427");
434104
+ const fingerprint = computeFingerprint(messageText, "1.3.429");
433927
434105
  const attributionHeader = getAttributionHeader(fingerprint);
433928
434106
  const systemBlocks = [
433929
434107
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -434071,13 +434249,21 @@ function resolveAgentTools(agentDefinition, availableTools, isAsync3 = false, is
434071
434249
  return toolName2;
434072
434250
  }) ?? []);
434073
434251
  const allowedAvailableTools = filteredAvailableTools.filter((tool) => !disallowedToolSet.has(tool.name));
434074
- const hasWildcard = agentTools === undefined || agentTools.length === 1 && agentTools[0] === "*";
434252
+ const hasWildcard = agentTools === undefined || agentTools.some((t2) => t2 === "*");
434075
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
+ }
434076
434261
  return {
434077
434262
  hasWildcard: true,
434078
434263
  validTools: [],
434079
434264
  invalidTools: [],
434080
- resolvedTools: allowedAvailableTools
434265
+ resolvedTools: allowedAvailableTools,
434266
+ allowedAgentTypes: wildcardAllowedAgentTypes
434081
434267
  };
434082
434268
  }
434083
434269
  const availableToolMap = new Map;
@@ -490863,6 +491049,7 @@ var init_ExitPlanModeV2Tool = __esm(() => {
490863
491049
  }
490864
491050
  return {
490865
491051
  ...prev,
491052
+ swarmMode: true,
490866
491053
  toolPermissionContext: {
490867
491054
  ...baseContext,
490868
491055
  mode: restoreMode,
@@ -491033,7 +491220,7 @@ function AskUserQuestionResultMessage(t0) {
491033
491220
  ]
491034
491221
  }, undefined, true, undefined, this),
491035
491222
  /* @__PURE__ */ jsx_dev_runtime139.jsxDEV(ThemedText, {
491036
- children: "User answered Claude's questions:"
491223
+ children: "User answered Rayu's questions:"
491037
491224
  }, undefined, false, undefined, this)
491038
491225
  ]
491039
491226
  }, undefined, true, undefined, this);
@@ -502792,6 +502979,7 @@ function getDefaultAppState() {
502792
502979
  snapshotSequence: 0
502793
502980
  },
502794
502981
  pendingFileChanges: [],
502982
+ swarmMode: false,
502795
502983
  attribution: createEmptyAttributionState(),
502796
502984
  mcp: {
502797
502985
  clients: [],
@@ -509215,6 +509403,19 @@ You have exited plan mode. You can now make edits, run tools, and take actions.$
509215
509403
  createUserMessage({ content, isMeta: true })
509216
509404
  ]);
509217
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
+ }
509218
509419
  case "auto_mode": {
509219
509420
  return getAutoModeInstructions(attachment);
509220
509421
  }
@@ -512429,6 +512630,7 @@ async function getAttachments(input, toolUseContext, ideSelection, queuedCommand
512429
512630
  maybe("skill_listing", () => getSkillListingAttachments(context)),
512430
512631
  maybe("plan_mode", () => getPlanModeAttachments(messages, toolUseContext)),
512431
512632
  maybe("plan_mode_exit", () => getPlanModeExitAttachment(toolUseContext)),
512633
+ maybe("swarm_mode", () => getSwarmModeAttachment(messages, toolUseContext)),
512432
512634
  ...[],
512433
512635
  maybe("todo_reminders", () => isTodoV2Enabled() ? getTaskReminderAttachments(messages, toolUseContext) : getTodoReminderAttachments(messages, toolUseContext)),
512434
512636
  ...isAgentSwarmsEnabled() ? [
@@ -512614,6 +512816,22 @@ async function getPlanModeAttachments(messages, toolUseContext) {
512614
512816
  });
512615
512817
  return attachments;
512616
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
+ }
512617
512835
  async function getPlanModeExitAttachment(toolUseContext) {
512618
512836
  if (!needsPlanModeExitAttachment()) {
512619
512837
  return [];
@@ -528861,7 +529079,7 @@ function Feedback({
528861
529079
  platform: env4.platform,
528862
529080
  gitRepo: envInfo.isGit,
528863
529081
  terminal: env4.terminal,
528864
- version: "1.3.427",
529082
+ version: "1.3.429",
528865
529083
  transcript: normalizeMessagesForAPI(messages),
528866
529084
  errors: sanitizedErrors,
528867
529085
  lastApiRequest: getLastAPIRequest(),
@@ -529053,7 +529271,7 @@ function Feedback({
529053
529271
  ", ",
529054
529272
  env4.terminal,
529055
529273
  ", v",
529056
- "1.3.427"
529274
+ "1.3.429"
529057
529275
  ]
529058
529276
  }, undefined, true, undefined, this)
529059
529277
  ]
@@ -529159,7 +529377,7 @@ ${sanitizedDescription}
529159
529377
  ` + `**Environment Info**
529160
529378
  ` + `- Platform: ${env4.platform}
529161
529379
  ` + `- Terminal: ${env4.terminal}
529162
- ` + `- Version: ${"1.3.427"}
529380
+ ` + `- Version: ${"1.3.429"}
529163
529381
  ` + `- Feedback ID: ${feedbackId}
529164
529382
  ` + `
529165
529383
  **Errors**
@@ -530447,6 +530665,7 @@ async function clearConversation({
530447
530665
  snapshotSequence: 0
530448
530666
  },
530449
530667
  pendingFileChanges: [],
530668
+ swarmMode: false,
530450
530669
  mcp: {
530451
530670
  clients: [],
530452
530671
  tools: [],
@@ -531998,9 +532217,9 @@ async function assertMinVersion() {
531998
532217
  if (false) {}
531999
532218
  try {
532000
532219
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
532001
- if (versionConfig.minVersion && lt("1.3.427", versionConfig.minVersion)) {
532220
+ if (versionConfig.minVersion && lt("1.3.429", versionConfig.minVersion)) {
532002
532221
  console.error(`
532003
- It looks like your version of RAYU (${"1.3.427"}) needs an update.
532222
+ It looks like your version of RAYU (${"1.3.429"}) needs an update.
532004
532223
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
532005
532224
 
532006
532225
  To update, please run:
@@ -532226,7 +532445,7 @@ async function installGlobalPackage(specificVersion) {
532226
532445
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
532227
532446
  logEvent("tengu_auto_updater_lock_contention", {
532228
532447
  pid: process.pid,
532229
- currentVersion: "1.3.427"
532448
+ currentVersion: "1.3.429"
532230
532449
  });
532231
532450
  return "in_progress";
532232
532451
  }
@@ -532235,7 +532454,7 @@ async function installGlobalPackage(specificVersion) {
532235
532454
  if (!env4.isRunningWithBun() && env4.isNpmFromWindowsPath()) {
532236
532455
  logError2(new Error("Windows NPM detected in WSL environment"));
532237
532456
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
532238
- currentVersion: "1.3.427"
532457
+ currentVersion: "1.3.429"
532239
532458
  });
532240
532459
  console.error(`
532241
532460
  Error: Windows NPM detected in WSL
@@ -532771,7 +532990,7 @@ function detectLinuxGlobPatternWarnings() {
532771
532990
  }
532772
532991
  async function getDoctorDiagnostic() {
532773
532992
  const installationType = await getCurrentInstallationType();
532774
- const version2 = typeof MACRO !== "undefined" ? "1.3.427" : "unknown";
532993
+ const version2 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
532775
532994
  const installationPath = await getInstallationPath();
532776
532995
  const invokedBinary = getInvokedBinary();
532777
532996
  const multipleInstallations = await detectMultipleInstallations();
@@ -533566,8 +533785,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
533566
533785
  const maxVersion = await getMaxVersion();
533567
533786
  if (maxVersion && gt(version2, maxVersion)) {
533568
533787
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
533569
- if (gte("1.3.427", maxVersion)) {
533570
- logForDebugging(`Native installer: current version ${"1.3.427"} 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`);
533571
533790
  logEvent("tengu_native_update_skipped_max_version", {
533572
533791
  latency_ms: Date.now() - startTime,
533573
533792
  max_version: maxVersion,
@@ -533578,7 +533797,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
533578
533797
  version2 = maxVersion;
533579
533798
  }
533580
533799
  }
533581
- if (!forceReinstall && version2 === "1.3.427" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
533800
+ if (!forceReinstall && version2 === "1.3.429" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
533582
533801
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
533583
533802
  logEvent("tengu_native_update_complete", {
533584
533803
  latency_ms: Date.now() - startTime,
@@ -534774,7 +534993,7 @@ function buildPrimarySection() {
534774
534993
  }, undefined, false, undefined, this);
534775
534994
  return [{
534776
534995
  label: "Version",
534777
- value: "1.3.427"
534996
+ value: "1.3.429"
534778
534997
  }, {
534779
534998
  label: "Session name",
534780
534999
  value: nameValue
@@ -538465,7 +538684,7 @@ function Config({
538465
538684
  }
538466
538685
  }, undefined, false, undefined, this)
538467
538686
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime170.jsxDEV(ChannelDowngradeDialog, {
538468
- currentVersion: "1.3.427",
538687
+ currentVersion: "1.3.429",
538469
538688
  onChoice: (choice) => {
538470
538689
  setShowSubmenu(null);
538471
538690
  setTabsHidden(false);
@@ -538477,7 +538696,7 @@ function Config({
538477
538696
  autoUpdatesChannel: "stable"
538478
538697
  };
538479
538698
  if (choice === "stay") {
538480
- newSettings.minimumVersion = "1.3.427";
538699
+ newSettings.minimumVersion = "1.3.429";
538481
538700
  }
538482
538701
  updateSettingsForSource("userSettings", newSettings);
538483
538702
  setSettingsData((prev_27) => ({
@@ -546539,7 +546758,7 @@ function HelpV2(t0) {
546539
546758
  let t6;
546540
546759
  if ($3[31] !== tabs) {
546541
546760
  t6 = /* @__PURE__ */ jsx_dev_runtime197.jsxDEV(Tabs, {
546542
- title: `Rayu-CLI v${"1.3.427"}`,
546761
+ title: `Rayu-CLI v${"1.3.429"}`,
546543
546762
  color: "professionalBlue",
546544
546763
  defaultTab: "general",
546545
546764
  children: tabs
@@ -547903,18 +548122,27 @@ After writing the skill file(s), inform the user:
547903
548122
  init_verifiers_default = command4;
547904
548123
  });
547905
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
+
547906
548133
  // src/commands/collaborator-swarm/index.ts
547907
548134
  var command5, collaborator_swarm_default;
547908
548135
  var init_collaborator_swarm = __esm(() => {
547909
548136
  command5 = {
547910
548137
  type: "prompt",
547911
548138
  name: "collaborator_swarm",
547912
- 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.",
547913
548140
  argumentHint: "[task description]",
547914
548141
  contentLength: 0,
547915
548142
  progressMessage: "coordinating the collaborator swarm",
547916
548143
  source: "builtin",
547917
- async getPromptForCommand(args) {
548144
+ async getPromptForCommand(args, context2) {
548145
+ context2?.setAppState?.(setSwarmModeUpdater(true));
547918
548146
  const task = (args ?? "").trim();
547919
548147
  const taskLine = task ? `The task to coordinate:
547920
548148
 
@@ -547935,9 +548163,19 @@ HARD RULE: if a Collaborator or Subagent stalls, errors, or doesn't respond, you
547935
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.)
547936
548164
 
547937
548165
  ## The three tiers
547938
- - **You (Orchestrator)** — plan, research, own SharedContext, coordinate, integrate.
547939
- - **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.
547940
- - **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.)
547941
548179
 
547942
548180
  ## DEFAULT TO PARALLEL (the single most important rule)
547943
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.
@@ -547946,33 +548184,43 @@ Parallel execution is ~3–5x faster than sequential. Unless one call genuinely
547946
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).
547947
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…\`).
547948
548186
 
547949
- ## How to run the swarm
547950
- 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.
547951
- - **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.
547952
- 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:
547953
- - Wave 1: \`backend\` (API + data layer) + \`security\` (auth/RBAC design) — together.
547954
- - Wave 2: \`frontend\` and/or \`mobile\` (integrate against backend contracts) — together.
547955
- - Wave 3: \`deploy\` (package & ship) — last.
547956
- 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.
547957
548204
  \`\`\`
547958
548205
  Agent(subagent_type:"backend", run_in_background:true, name:"backend", prompt:"<task + contracts>")
547959
548206
  Agent(subagent_type:"security", run_in_background:true, name:"security", prompt:"<task + contracts>")
547960
548207
  \`\`\`
547961
- 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.
547962
- 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.
547963
- 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.
547964
- 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.
547965
548212
 
547966
548213
  ## Rules
547967
- - 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.
547968
548215
  - Security and the chosen architecture are authoritative — collaborators build within them.
547969
- - 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.
547970
548218
  - Be autonomous: keep going until done; only pause if truly blocked. Report concisely and high-signal — don't narrate every step.
547971
548219
 
547972
548220
  ## Finish
547973
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).
547974
548222
 
547975
- 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.`
547976
548224
  }
547977
548225
  ];
547978
548226
  }
@@ -547980,6 +548228,34 @@ Begin by stating your analysis/plan step (read the project and discuss with the
547980
548228
  collaborator_swarm_default = command5;
547981
548229
  });
547982
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
+
547983
548259
  // src/keybindings/template.ts
547984
548260
  function filterReservedShortcuts(blocks) {
547985
548261
  const reservedKeys = new Set(NON_REBINDABLE.map((r2) => normalizeKeyForComparison(r2.key)));
@@ -548011,11 +548287,11 @@ var init_template2 = __esm(() => {
548011
548287
  // src/commands/keybindings/keybindings.ts
548012
548288
  var exports_keybindings = {};
548013
548289
  __export(exports_keybindings, {
548014
- call: () => call17
548290
+ call: () => call18
548015
548291
  });
548016
548292
  import { mkdir as mkdir34, writeFile as writeFile37 } from "fs/promises";
548017
548293
  import { dirname as dirname58 } from "path";
548018
- async function call17() {
548294
+ async function call18() {
548019
548295
  if (!isKeybindingCustomizationEnabled()) {
548020
548296
  return {
548021
548297
  type: "text",
@@ -548074,9 +548350,9 @@ var init_keybindings2 = __esm(() => {
548074
548350
  // src/commands/keep/keep.ts
548075
548351
  var exports_keep = {};
548076
548352
  __export(exports_keep, {
548077
- call: () => call18
548353
+ call: () => call19
548078
548354
  });
548079
- var call18 = async (args, context2) => {
548355
+ var call19 = async (args, context2) => {
548080
548356
  return {
548081
548357
  type: "text",
548082
548358
  value: keepPendingFileChanges(context2, args)
@@ -562122,7 +562398,7 @@ var init_PluginSettings = __esm(() => {
562122
562398
  // src/commands/mcp/mcp.tsx
562123
562399
  var exports_mcp = {};
562124
562400
  __export(exports_mcp, {
562125
- call: () => call19
562401
+ call: () => call20
562126
562402
  });
562127
562403
  function MCPToggle(t0) {
562128
562404
  const $3 = import_compiler_runtime170.c(7);
@@ -562175,7 +562451,7 @@ function _temp239(c4) {
562175
562451
  function _temp98(s2) {
562176
562452
  return s2.mcp.clients;
562177
562453
  }
562178
- async function call19(onDone, _context, args) {
562454
+ async function call20(onDone, _context, args) {
562179
562455
  if (args) {
562180
562456
  const parts = args.trim().split(/\s+/);
562181
562457
  if (parts[0] === "no-redirect") {
@@ -564822,7 +565098,7 @@ var API_BASE2 = "https://api.telegram.org", MAX_MESSAGE_CHARS = 4096;
564822
565098
  // src/commands/telegram-bot/telegram-bot.tsx
564823
565099
  var exports_telegram_bot = {};
564824
565100
  __export(exports_telegram_bot, {
564825
- call: () => call20
565101
+ call: () => call21
564826
565102
  });
564827
565103
  import { randomUUID as randomUUID31 } from "crypto";
564828
565104
  function TokenInputStep({ onTokenSaved }) {
@@ -565009,7 +565285,7 @@ function TelegramBotConnect({ onDone }) {
565009
565285
  onDone
565010
565286
  }, undefined, false, undefined, this);
565011
565287
  }
565012
- async function call20(onDone) {
565288
+ async function call21(onDone) {
565013
565289
  return /* @__PURE__ */ jsx_dev_runtime224.jsxDEV(TelegramBotConnect, {
565014
565290
  onDone
565015
565291
  }, undefined, false, undefined, this);
@@ -565041,9 +565317,9 @@ var init_telegram_bot2 = __esm(() => {
565041
565317
  // src/commands/telegram-bot/disconnect.ts
565042
565318
  var exports_disconnect = {};
565043
565319
  __export(exports_disconnect, {
565044
- call: () => call21
565320
+ call: () => call22
565045
565321
  });
565046
- async function call21() {
565322
+ async function call22() {
565047
565323
  const config5 = readTelegramConfig();
565048
565324
  if (!config5.linkedChatId) {
565049
565325
  return { type: "text", value: "Telegram bot is not currently linked." };
@@ -565628,9 +565904,9 @@ var init_createSession = __esm(() => {
565628
565904
  // src/commands/rename/rename.ts
565629
565905
  var exports_rename = {};
565630
565906
  __export(exports_rename, {
565631
- call: () => call22
565907
+ call: () => call23
565632
565908
  });
565633
- async function call22(onDone, context2, args) {
565909
+ async function call23(onDone, context2, args) {
565634
565910
  if (isTeammate()) {
565635
565911
  onDone("Cannot rename: This session is a swarm teammate. Teammate names are set by the team leader.", { display: "system" });
565636
565912
  return null;
@@ -565866,9 +566142,9 @@ var init_ReviewDetailDialog = __esm(() => {
565866
566142
  // src/commands/review-detial/review-detial.tsx
565867
566143
  var exports_review_detial = {};
565868
566144
  __export(exports_review_detial, {
565869
- call: () => call23
566145
+ call: () => call24
565870
566146
  });
565871
- var jsx_dev_runtime226, call23 = async (onDone, context2, args) => {
566147
+ var jsx_dev_runtime226, call24 = async (onDone, context2, args) => {
565872
566148
  const result = resolvePendingFileChangeReview(context2, args ?? "");
565873
566149
  if (result.type === "message") {
565874
566150
  onDone(result.message, { display: "system" });
@@ -566514,7 +566790,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
566514
566790
  }
566515
566791
  return [];
566516
566792
  }
566517
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.427") {
566793
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.429") {
566518
566794
  if (false) {}
566519
566795
  const cachedChangelog = await getStoredChangelog();
566520
566796
  if (lastSeenVersion !== currentVersion || !cachedChangelog) {
@@ -566527,7 +566803,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.3.427")
566527
566803
  releaseNotes
566528
566804
  };
566529
566805
  }
566530
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.3.427") {
566806
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.3.429") {
566531
566807
  if (false) {}
566532
566808
  const releaseNotes = getRecentReleaseNotes(currentVersion, lastSeenVersion);
566533
566809
  return {
@@ -566655,11 +566931,11 @@ function getRecentActivitySync() {
566655
566931
  return cachedActivity;
566656
566932
  }
566657
566933
  function getLogoDisplayData() {
566658
- const version2 = process.env.DEMO_VERSION ?? "1.3.427";
566934
+ const version2 = process.env.DEMO_VERSION ?? "1.3.429";
566659
566935
  const serverUrl = getDirectConnectServerUrl();
566660
566936
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
566661
566937
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
566662
- const billingType = isClaudeAISubscriber() ? getSubscriptionName() : "API Usage Billing";
566938
+ const billingType = isClaudeAISubscriber() ? getSubscriptionName() : getActiveProviderDisplayName() ?? "API Usage Billing";
566663
566939
  const agentName = getInitialSettings().agent;
566664
566940
  return {
566665
566941
  version: version2,
@@ -566716,6 +566992,7 @@ var init_logoV2Utils = __esm(() => {
566716
566992
  init_file2();
566717
566993
  init_format();
566718
566994
  init_releaseNotes();
566995
+ init_rayuProviders();
566719
566996
  init_sessionStorage();
566720
566997
  init_settings2();
566721
566998
  cachedActivity = [];
@@ -566737,12 +567014,12 @@ var init_Clawd = __esm(() => {
566737
567014
  init_ink2();
566738
567015
  jsx_dev_runtime228 = __toESM(require_jsx_dev_runtime(), 1);
566739
567016
  RAYU_BANNER = [
566740
- ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#7CFFA0"],
566741
- ["██╔══██╗██╔══██╗╚██╗ ██╔╝██║ ██║", "#5BF58D"],
567017
+ ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#ff7cda"],
567018
+ ["██╔══██╗██╔══██╗╚██╗ ██╔╝██║ ██║", "#a35bf5"],
566742
567019
  ["██████╔╝███████║ ╚████╔╝ ██║ ██║", "#3DE877"],
566743
- ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#22D060"],
566744
- ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#15B84C"],
566745
- ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#0E9B3E"]
567020
+ ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#2822d0"],
567021
+ ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#84b815"],
567022
+ ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#9b0e84"]
566746
567023
  ];
566747
567024
  });
566748
567025
 
@@ -567947,7 +568224,7 @@ function LogoV2() {
567947
568224
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
567948
568225
  t2 = () => {
567949
568226
  const currentConfig = getGlobalConfig();
567950
- if (currentConfig.lastReleaseNotesSeen === "1.3.427") {
568227
+ if (currentConfig.lastReleaseNotesSeen === "1.3.429") {
567951
568228
  return;
567952
568229
  }
567953
568230
  saveGlobalConfig(_temp327);
@@ -568425,7 +568702,7 @@ function LogoV2() {
568425
568702
  t24 = $3[61];
568426
568703
  }
568427
568704
  const _latestNpm = getCachedLatestNpmVersionSync();
568428
- const _updateFeeds = _latestNpm && gt(_latestNpm, "1.3.427") ? [createUpdateAvailableFeed("1.3.427", _latestNpm)] : [];
568705
+ const _updateFeeds = _latestNpm && gt(_latestNpm, "1.3.429") ? [createUpdateAvailableFeed("1.3.429", _latestNpm)] : [];
568429
568706
  const t25 = layoutMode === "horizontal" && /* @__PURE__ */ jsx_dev_runtime239.jsxDEV(FeedColumn, {
568430
568707
  feeds: showOnboarding ? [createProjectOnboardingFeed(getSteps()), createRecentActivityFeed(activities)] : showGuestPassesUpsell ? [createRecentActivityFeed(activities), createGuestPassesFeed()] : showOverageCreditUpsell ? [createRecentActivityFeed(activities), createOverageCreditFeed()] : [createRecentActivityFeed(activities), ..._updateFeeds, createWhatsNewFeed(changelog)],
568431
568708
  maxWidth: rightWidth
@@ -568625,12 +568902,12 @@ function LogoV2() {
568625
568902
  return t41;
568626
568903
  }
568627
568904
  function _temp327(current) {
568628
- if (current.lastReleaseNotesSeen === "1.3.427") {
568905
+ if (current.lastReleaseNotesSeen === "1.3.429") {
568629
568906
  return current;
568630
568907
  }
568631
568908
  return {
568632
568909
  ...current,
568633
- lastReleaseNotesSeen: "1.3.427"
568910
+ lastReleaseNotesSeen: "1.3.429"
568634
568911
  };
568635
568912
  }
568636
568913
  function _temp241(s_0) {
@@ -569169,6 +569446,7 @@ var init_nullRenderingAttachments = __esm(() => {
569169
569446
  "plan_mode",
569170
569447
  "plan_mode_exit",
569171
569448
  "plan_mode_reentry",
569449
+ "swarm_mode",
569172
569450
  "structured_output",
569173
569451
  "team_context",
569174
569452
  "todo_reminder",
@@ -574392,7 +574670,7 @@ var init_crossProjectResume = __esm(() => {
574392
574670
  var exports_resume = {};
574393
574671
  __export(exports_resume, {
574394
574672
  filterResumableSessions: () => filterResumableSessions,
574395
- call: () => call24
574673
+ call: () => call25
574396
574674
  });
574397
574675
  function resumeHelpMessage(result) {
574398
574676
  switch (result.resultType) {
@@ -574577,7 +574855,7 @@ function ResumeCommand({
574577
574855
  function filterResumableSessions(logs, currentSessionId) {
574578
574856
  return logs.filter((l3) => !l3.isSidechain && getSessionIdFromLog(l3) !== currentSessionId);
574579
574857
  }
574580
- 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) => {
574581
574859
  const onResume = async (sessionId, log3, entrypoint) => {
574582
574860
  try {
574583
574861
  await context2.resume?.(sessionId, log3, entrypoint);
@@ -575040,7 +575318,7 @@ var init_UltrareviewOverageDialog = __esm(() => {
575040
575318
  // src/commands/review/ultrareviewCommand.tsx
575041
575319
  var exports_ultrareviewCommand = {};
575042
575320
  __export(exports_ultrareviewCommand, {
575043
- call: () => call25
575321
+ call: () => call26
575044
575322
  });
575045
575323
  function contentBlocksToString(blocks) {
575046
575324
  return blocks.map((b3) => b3.type === "text" ? b3.text : "").filter(Boolean).join(`
@@ -575060,7 +575338,7 @@ async function launchAndDone(args, context2, onDone, billingNote, signal) {
575060
575338
  });
575061
575339
  }
575062
575340
  }
575063
- var jsx_dev_runtime255, call25 = async (onDone, context2, args) => {
575341
+ var jsx_dev_runtime255, call26 = async (onDone, context2, args) => {
575064
575342
  const gate = await checkOverageGate();
575065
575343
  if (gate.kind === "not-enabled") {
575066
575344
  onDone("Free ultrareviews used. Enable Extra Usage at https://claude.ai/settings/billing to continue.", {
@@ -575358,7 +575636,7 @@ var init_image_video = __esm(() => {
575358
575636
  // src/commands/session/session.tsx
575359
575637
  var exports_session = {};
575360
575638
  __export(exports_session, {
575361
- call: () => call26
575639
+ call: () => call27
575362
575640
  });
575363
575641
  function SessionInfo(t0) {
575364
575642
  const $3 = import_compiler_runtime193.c(19);
@@ -575531,7 +575809,7 @@ function _temp247(e2) {
575531
575809
  function _temp118(s2) {
575532
575810
  return s2.remoteSessionUrl;
575533
575811
  }
575534
- 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) => {
575535
575813
  return /* @__PURE__ */ jsx_dev_runtime256.jsxDEV(SessionInfo, {
575536
575814
  onDone
575537
575815
  }, undefined, false, undefined, this);
@@ -575883,9 +576161,9 @@ var init_SkillsMenu = __esm(() => {
575883
576161
  // src/commands/skills/skills.tsx
575884
576162
  var exports_skills2 = {};
575885
576163
  __export(exports_skills2, {
575886
- call: () => call27
576164
+ call: () => call28
575887
576165
  });
575888
- async function call27(onDone, context2) {
576166
+ async function call28(onDone, context2) {
575889
576167
  return /* @__PURE__ */ jsx_dev_runtime258.jsxDEV(SkillsMenu, {
575890
576168
  onExit: onDone,
575891
576169
  commands: context2.options.commands
@@ -575912,9 +576190,9 @@ var init_skills5 = __esm(() => {
575912
576190
  // src/commands/status/status.tsx
575913
576191
  var exports_status = {};
575914
576192
  __export(exports_status, {
575915
- call: () => call28
576193
+ call: () => call29
575916
576194
  });
575917
- async function call28(onDone, context2) {
576195
+ async function call29(onDone, context2) {
575918
576196
  return /* @__PURE__ */ jsx_dev_runtime259.jsxDEV(Settings, {
575919
576197
  onClose: onDone,
575920
576198
  context: context2,
@@ -576525,7 +576803,7 @@ ${reasons}`,
576525
576803
  } : prev);
576526
576804
  }
576527
576805
  }
576528
- 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) => {
576529
576807
  const blurb = args.trim();
576530
576808
  if (!blurb) {
576531
576809
  const msg = await launchUltraplan2({
@@ -576588,7 +576866,7 @@ var init_ultraplan = __esm(() => {
576588
576866
  argumentHint: "<prompt>",
576589
576867
  isEnabled: () => false,
576590
576868
  load: () => Promise.resolve({
576591
- call: call29
576869
+ call: call30
576592
576870
  })
576593
576871
  };
576594
576872
  });
@@ -581359,9 +581637,9 @@ var init_BackgroundTasksDialog = __esm(() => {
581359
581637
  // src/commands/tasks/tasks.tsx
581360
581638
  var exports_tasks = {};
581361
581639
  __export(exports_tasks, {
581362
- call: () => call30
581640
+ call: () => call31
581363
581641
  });
581364
- async function call30(onDone, context2) {
581642
+ async function call31(onDone, context2) {
581365
581643
  return /* @__PURE__ */ jsx_dev_runtime270.jsxDEV(BackgroundTasksDialog, {
581366
581644
  toolUseContext: context2,
581367
581645
  onDone
@@ -581640,9 +581918,9 @@ var init_terminalSetup2 = __esm(() => {
581640
581918
  // src/commands/undo/undo.ts
581641
581919
  var exports_undo = {};
581642
581920
  __export(exports_undo, {
581643
- call: () => call31
581921
+ call: () => call32
581644
581922
  });
581645
- var call31 = async (args, context2) => {
581923
+ var call32 = async (args, context2) => {
581646
581924
  const isAll = args.trim().toLowerCase() === "all";
581647
581925
  return {
581648
581926
  type: "text",
@@ -581670,7 +581948,7 @@ var init_undo3 = __esm(() => {
581670
581948
  // src/commands/theme/theme.tsx
581671
581949
  var exports_theme = {};
581672
581950
  __export(exports_theme, {
581673
- call: () => call32
581951
+ call: () => call33
581674
581952
  });
581675
581953
  function ThemePickerCommand(t0) {
581676
581954
  const $3 = import_compiler_runtime204.c(8);
@@ -581720,7 +581998,7 @@ function ThemePickerCommand(t0) {
581720
581998
  }
581721
581999
  return t3;
581722
582000
  }
581723
- var import_compiler_runtime204, jsx_dev_runtime271, call32 = async (onDone, _context) => {
582001
+ var import_compiler_runtime204, jsx_dev_runtime271, call33 = async (onDone, _context) => {
581724
582002
  return /* @__PURE__ */ jsx_dev_runtime271.jsxDEV(ThemePickerCommand, {
581725
582003
  onDone
581726
582004
  }, undefined, false, undefined, this);
@@ -581748,9 +582026,9 @@ var init_theme4 = __esm(() => {
581748
582026
  // src/commands/vim/vim.ts
581749
582027
  var exports_vim = {};
581750
582028
  __export(exports_vim, {
581751
- call: () => call33
582029
+ call: () => call34
581752
582030
  });
581753
- var call33 = async () => {
582031
+ var call34 = async () => {
581754
582032
  const config5 = getGlobalConfig();
581755
582033
  let currentMode = config5.editorMode || "normal";
581756
582034
  if (currentMode === "emacs") {
@@ -581792,7 +582070,7 @@ var init_vim2 = __esm(() => {
581792
582070
  var exports_thinkback = {};
581793
582071
  __export(exports_thinkback, {
581794
582072
  playAnimation: () => playAnimation,
581795
- call: () => call34
582073
+ call: () => call35
581796
582074
  });
581797
582075
  import { readFile as readFile47 } from "fs/promises";
581798
582076
  import { join as join136 } from "path";
@@ -582329,7 +582607,7 @@ function ThinkbackFlow(t0) {
582329
582607
  }
582330
582608
  return t8;
582331
582609
  }
582332
- async function call34(onDone) {
582610
+ async function call35(onDone) {
582333
582611
  return /* @__PURE__ */ jsx_dev_runtime272.jsxDEV(ThinkbackFlow, {
582334
582612
  onDone
582335
582613
  }, undefined, false, undefined, this);
@@ -582377,14 +582655,14 @@ var init_thinkback2 = __esm(() => {
582377
582655
  // src/commands/thinkback-play/thinkback-play.ts
582378
582656
  var exports_thinkback_play = {};
582379
582657
  __export(exports_thinkback_play, {
582380
- call: () => call35
582658
+ call: () => call36
582381
582659
  });
582382
582660
  import { join as join137 } from "path";
582383
582661
  function getPluginId2() {
582384
582662
  const marketplaceName = OFFICIAL_MARKETPLACE_NAME;
582385
582663
  return `thinkback@${marketplaceName}`;
582386
582664
  }
582387
- async function call35() {
582665
+ async function call36() {
582388
582666
  const v2Data = loadInstalledPluginsV2();
582389
582667
  const pluginId = getPluginId2();
582390
582668
  const installations = v2Data.plugins[pluginId];
@@ -584880,9 +585158,9 @@ var init_PermissionRuleList = __esm(() => {
584880
585158
  // src/commands/permissions/permissions.tsx
584881
585159
  var exports_permissions2 = {};
584882
585160
  __export(exports_permissions2, {
584883
- call: () => call36
585161
+ call: () => call37
584884
585162
  });
584885
- var jsx_dev_runtime280, call36 = async (onDone, context2) => {
585163
+ var jsx_dev_runtime280, call37 = async (onDone, context2) => {
584886
585164
  return /* @__PURE__ */ jsx_dev_runtime280.jsxDEV(PermissionRuleList, {
584887
585165
  onExit: onDone,
584888
585166
  onRetryDenials: (commands) => {
@@ -584912,7 +585190,7 @@ var init_permissions5 = __esm(() => {
584912
585190
  // src/commands/plan/plan.tsx
584913
585191
  var exports_plan = {};
584914
585192
  __export(exports_plan, {
584915
- call: () => call37
585193
+ call: () => call38
584916
585194
  });
584917
585195
  function PlanDisplay(t0) {
584918
585196
  const $3 = import_compiler_runtime213.c(11);
@@ -585000,7 +585278,7 @@ function PlanDisplay(t0) {
585000
585278
  }
585001
585279
  return t5;
585002
585280
  }
585003
- async function call37(onDone, context2, args) {
585281
+ async function call38(onDone, context2, args) {
585004
585282
  const {
585005
585283
  getAppState,
585006
585284
  setAppState
@@ -586838,9 +587116,9 @@ var init_HooksConfigMenu = __esm(() => {
586838
587116
  // src/commands/hooks/hooks.tsx
586839
587117
  var exports_hooks = {};
586840
587118
  __export(exports_hooks, {
586841
- call: () => call38
587119
+ call: () => call39
586842
587120
  });
586843
- var jsx_dev_runtime287, call38 = async (onDone, context2) => {
587121
+ var jsx_dev_runtime287, call39 = async (onDone, context2) => {
586844
587122
  logEvent("tengu_hooks_command", {});
586845
587123
  const appState = context2.getAppState();
586846
587124
  const permissionContext = appState.toolPermissionContext;
@@ -586873,10 +587151,10 @@ var init_hooks3 = __esm(() => {
586873
587151
  // src/commands/files/files.ts
586874
587152
  var exports_files4 = {};
586875
587153
  __export(exports_files4, {
586876
- call: () => call39
587154
+ call: () => call40
586877
587155
  });
586878
587156
  import { relative as relative31 } from "path";
586879
- async function call39(_args, context2) {
587157
+ async function call40(_args, context2) {
586880
587158
  const files2 = context2.readFileState ? cacheKeys(context2.readFileState) : [];
586881
587159
  if (files2.length === 0) {
586882
587160
  return { type: "text", value: "No files in context" };
@@ -586909,7 +587187,7 @@ var init_files8 = __esm(() => {
586909
587187
  var exports_branch = {};
586910
587188
  __export(exports_branch, {
586911
587189
  deriveFirstPrompt: () => deriveFirstPrompt,
586912
- call: () => call40
587190
+ call: () => call41
586913
587191
  });
586914
587192
  import { randomUUID as randomUUID33 } from "crypto";
586915
587193
  import { mkdir as mkdir36, readFile as readFile48, writeFile as writeFile41 } from "fs/promises";
@@ -587015,7 +587293,7 @@ async function getUniqueForkName(baseName) {
587015
587293
  }
587016
587294
  return `${baseName} (Branch ${nextNumber})`;
587017
587295
  }
587018
- async function call40(onDone, context2, args) {
587296
+ async function call41(onDone, context2, args) {
587019
587297
  const customTitle = args?.trim() || undefined;
587020
587298
  const originalSessionId = getSessionId();
587021
587299
  try {
@@ -593054,9 +593332,9 @@ var init_AgentsMenu = __esm(() => {
593054
593332
  // src/commands/agents/agents.tsx
593055
593333
  var exports_agents2 = {};
593056
593334
  __export(exports_agents2, {
593057
- call: () => call41
593335
+ call: () => call42
593058
593336
  });
593059
- async function call41(onDone, context2) {
593337
+ async function call42(onDone, context2) {
593060
593338
  const appState = context2.getAppState();
593061
593339
  const permissionContext = appState.toolPermissionContext;
593062
593340
  const tools = getTools(permissionContext);
@@ -593087,9 +593365,9 @@ var init_agents3 = __esm(() => {
593087
593365
  // src/commands/plugin/plugin.tsx
593088
593366
  var exports_plugin = {};
593089
593367
  __export(exports_plugin, {
593090
- call: () => call42
593368
+ call: () => call43
593091
593369
  });
593092
- async function call42(onDone, _context, args) {
593370
+ async function call43(onDone, _context, args) {
593093
593371
  return /* @__PURE__ */ jsx_dev_runtime313.jsxDEV(PluginSettings, {
593094
593372
  onComplete: onDone,
593095
593373
  args
@@ -593257,12 +593535,12 @@ var init_refresh = __esm(() => {
593257
593535
  // src/commands/reload-plugins/reload-plugins.ts
593258
593536
  var exports_reload_plugins = {};
593259
593537
  __export(exports_reload_plugins, {
593260
- call: () => call43
593538
+ call: () => call44
593261
593539
  });
593262
593540
  function n2(count4, noun) {
593263
593541
  return `${count4} ${plural(count4, noun)}`;
593264
593542
  }
593265
- var call43 = async (_args, context2) => {
593543
+ var call44 = async (_args, context2) => {
593266
593544
  if (false) {}
593267
593545
  const r2 = await refreshActivePlugins(context2.setAppState);
593268
593546
  const parts = [
@@ -593305,9 +593583,9 @@ var init_reload_plugins2 = __esm(() => {
593305
593583
  // src/commands/rewind/rewind.ts
593306
593584
  var exports_rewind = {};
593307
593585
  __export(exports_rewind, {
593308
- call: () => call44
593586
+ call: () => call45
593309
593587
  });
593310
- async function call44(_args, context2) {
593588
+ async function call45(_args, context2) {
593311
593589
  if (context2.openMessageSelector) {
593312
593590
  context2.openMessageSelector();
593313
593591
  }
@@ -593422,7 +593700,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
593422
593700
  smapsRollup,
593423
593701
  platform: process.platform,
593424
593702
  nodeVersion: process.version,
593425
- ccVersion: "1.3.427"
593703
+ ccVersion: "1.3.429"
593426
593704
  };
593427
593705
  }
593428
593706
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -593493,9 +593771,9 @@ var init_heapDumpService = __esm(() => {
593493
593771
  // src/commands/heapdump/heapdump.ts
593494
593772
  var exports_heapdump = {};
593495
593773
  __export(exports_heapdump, {
593496
- call: () => call45
593774
+ call: () => call46
593497
593775
  });
593498
- async function call45() {
593776
+ async function call46() {
593499
593777
  const result = await performHeapDump();
593500
593778
  if (!result.success) {
593501
593779
  return {
@@ -593802,7 +594080,7 @@ var USAGE = `/bridge-kick <subcommand>
593802
594080
  reconnect-session fail next POST /bridge/reconnect fails
593803
594081
  heartbeat <status> next heartbeat throws BridgeFatalError(status)
593804
594082
  reconnect call reconnectEnvironmentWithSession directly
593805
- status print bridge state`, call46 = async (args) => {
594083
+ status print bridge state`, call47 = async (args) => {
593806
594084
  const h3 = getBridgeDebugHandle();
593807
594085
  if (!h3) {
593808
594086
  return {
@@ -593935,16 +594213,16 @@ var init_bridge_kick = __esm(() => {
593935
594213
  description: "Inject bridge failure states for manual recovery testing",
593936
594214
  isEnabled: () => false,
593937
594215
  supportsNonInteractive: false,
593938
- load: () => Promise.resolve({ call: call46 })
594216
+ load: () => Promise.resolve({ call: call47 })
593939
594217
  };
593940
594218
  bridge_kick_default = bridgeKick;
593941
594219
  });
593942
594220
 
593943
594221
  // src/commands/version.ts
593944
- var call47 = async () => {
594222
+ var call48 = async () => {
593945
594223
  return {
593946
594224
  type: "text",
593947
- value: "1.3.427"
594225
+ value: "1.3.429"
593948
594226
  };
593949
594227
  }, version2, version_default;
593950
594228
  var init_version = __esm(() => {
@@ -593954,7 +594232,7 @@ var init_version = __esm(() => {
593954
594232
  description: "Print the version this session is running (not what autoupdate downloaded)",
593955
594233
  isEnabled: () => false,
593956
594234
  supportsNonInteractive: true,
593957
- load: () => Promise.resolve({ call: call47 })
594235
+ load: () => Promise.resolve({ call: call48 })
593958
594236
  };
593959
594237
  version_default = version2;
593960
594238
  });
@@ -595088,10 +595366,10 @@ var init_SandboxSettings = __esm(() => {
595088
595366
  // src/commands/sandbox-toggle/sandbox-toggle.tsx
595089
595367
  var exports_sandbox_toggle = {};
595090
595368
  __export(exports_sandbox_toggle, {
595091
- call: () => call48
595369
+ call: () => call49
595092
595370
  });
595093
595371
  import { relative as relative32 } from "path";
595094
- async function call48(onDone, _context, args) {
595372
+ async function call49(onDone, _context, args) {
595095
595373
  const settings = getSettings_DEPRECATED();
595096
595374
  const themeName = settings.theme || "light";
595097
595375
  const platform4 = getPlatform();
@@ -595198,9 +595476,9 @@ var init_sandbox_toggle2 = __esm(() => {
595198
595476
  // src/commands/contactMe/contactMe.ts
595199
595477
  var exports_contactMe = {};
595200
595478
  __export(exports_contactMe, {
595201
- call: () => call49
595479
+ call: () => call50
595202
595480
  });
595203
- async function call49() {
595481
+ async function call50() {
595204
595482
  const linkedinOk = await openBrowser(LINKEDIN_URL);
595205
595483
  const githubOk = await openBrowser(GITHUB_URL);
595206
595484
  if (linkedinOk && githubOk) {
@@ -595237,7 +595515,7 @@ var init_contactMe2 = __esm(() => {
595237
595515
  });
595238
595516
 
595239
595517
  // src/commands/advisor.ts
595240
- var call50 = async (args, context2) => {
595518
+ var call51 = async (args, context2) => {
595241
595519
  const arg = args.trim().toLowerCase();
595242
595520
  const baseModel = parseUserSpecifiedModel(context2.getAppState().mainLoopModel ?? getDefaultMainLoopModelSetting());
595243
595521
  if (!arg) {
@@ -595323,7 +595601,7 @@ var init_advisor2 = __esm(() => {
595323
595601
  return !canUserConfigureAdvisor();
595324
595602
  },
595325
595603
  supportsNonInteractive: true,
595326
- load: () => Promise.resolve({ call: call50 })
595604
+ load: () => Promise.resolve({ call: call51 })
595327
595605
  };
595328
595606
  advisor_default = advisor;
595329
595607
  });
@@ -595731,12 +596009,12 @@ var init_ExitFlow = __esm(() => {
595731
596009
  // src/commands/exit/exit.tsx
595732
596010
  var exports_exit = {};
595733
596011
  __export(exports_exit, {
595734
- call: () => call51
596012
+ call: () => call52
595735
596013
  });
595736
596014
  function getRandomGoodbyeMessage2() {
595737
596015
  return sample_default(GOODBYE_MESSAGES2) ?? "Goodbye!";
595738
596016
  }
595739
- async function call51(onDone) {
596017
+ async function call52(onDone) {
595740
596018
  if (false) {}
595741
596019
  const showWorktree = getCurrentWorktreeSession() !== null;
595742
596020
  if (showWorktree) {
@@ -596030,7 +596308,7 @@ var exports_export = {};
596030
596308
  __export(exports_export, {
596031
596309
  sanitizeFilename: () => sanitizeFilename,
596032
596310
  extractFirstPrompt: () => extractFirstPrompt,
596033
- call: () => call52
596311
+ call: () => call53
596034
596312
  });
596035
596313
  import { join as join142 } from "path";
596036
596314
  function formatTimestamp(date6) {
@@ -596071,7 +596349,7 @@ async function exportWithReactRenderer(context2) {
596071
596349
  const tools = context2.options.tools || [];
596072
596350
  return renderMessagesToPlainText(context2.messages, tools);
596073
596351
  }
596074
- async function call52(onDone, context2, args) {
596352
+ async function call53(onDone, context2, args) {
596075
596353
  const content = await exportWithReactRenderer(context2);
596076
596354
  const filename = args.trim();
596077
596355
  if (filename) {
@@ -596346,7 +596624,10 @@ function RayuProviderSetup({
596346
596624
  setBaseURL(p.baseURL ?? "");
596347
596625
  setModel(p.defaultModel ?? "");
596348
596626
  setCursor(0);
596349
- if (p.kind === "genai")
596627
+ if (p.id === "ollama") {
596628
+ setFetchError(null);
596629
+ setPhase("ollamaDetect");
596630
+ } else if (p.kind === "genai")
596350
596631
  setPhase("genaiLogin");
596351
596632
  else if (p.kind === "vertex" || p.requiresOAuth)
596352
596633
  setPhase("vertexAuth");
@@ -596569,7 +596850,51 @@ function RayuProviderSetup({
596569
596850
  cancelled = true;
596570
596851
  };
596571
596852
  }, [phase, apiKey, region]);
596853
+ import_react180.default.useEffect(() => {
596854
+ if (phase !== "ollamaDetect")
596855
+ return;
596856
+ let cancelled = false;
596857
+ setFetchError(null);
596858
+ (async () => {
596859
+ const baseURL2 = ollamaBaseURL();
596860
+ const base2 = {
596861
+ id: "ollama",
596862
+ kind: "openai-compatible",
596863
+ baseURL: baseURL2,
596864
+ apiKey: process.env.OLLAMA_API_KEY || "ollama"
596865
+ };
596866
+ const models = await fetchProviderModels(base2).catch(() => []);
596867
+ if (cancelled)
596868
+ return;
596869
+ if (models.length === 0) {
596870
+ setFetchError(`Couldn't reach Ollama at ${baseURL2.replace(/\/v1$/, "")}. Make sure it's running ("ollama serve") and you've pulled a model ("ollama pull llama3.2"). Set OLLAMA_HOST to use a different address.`);
596871
+ setPhase("ollamaError");
596872
+ return;
596873
+ }
596874
+ const chat2 = models.filter(isLikelyChatModel);
596875
+ const list = chat2.length > 0 ? chat2 : models;
596876
+ const preferred = list.find((m3) => /coder|code/i.test(m3)) ?? list.find((m3) => /qwen|llama|gemma|mistral|deepseek|phi|gpt/i.test(m3)) ?? list[0];
596877
+ upsertProvider({ ...base2, fetchedModels: list, defaultModel: preferred }, true);
596878
+ if (cancelled)
596879
+ return;
596880
+ onDone();
596881
+ })();
596882
+ return () => {
596883
+ cancelled = true;
596884
+ };
596885
+ }, [phase]);
596572
596886
  if (phase === "pick") {
596887
+ const localIds = new Set(["ollama", "local"]);
596888
+ const pickOptions = [
596889
+ ...PRESETS.filter((p) => !localIds.has(p.id)).map((p) => ({
596890
+ label: p.label,
596891
+ value: p.id
596892
+ })),
596893
+ {
596894
+ label: "Localhost (Ollama / custom OpenAI-compatible endpoint)",
596895
+ value: "__localhost__"
596896
+ }
596897
+ ];
596573
596898
  return /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedBox_default, {
596574
596899
  flexDirection: "column",
596575
596900
  gap: 1,
@@ -596588,8 +596913,12 @@ function RayuProviderSetup({
596588
596913
  children: "Choose a model provider. You can change or add more later with /model."
596589
596914
  }, undefined, false, undefined, this),
596590
596915
  /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(Select, {
596591
- options: PRESETS.map((p) => ({ label: p.label, value: p.id })),
596916
+ options: pickOptions,
596592
596917
  onChange: (v2) => {
596918
+ if (v2 === "__localhost__") {
596919
+ setPhase("localChoice");
596920
+ return;
596921
+ }
596593
596922
  const p = PRESETS.find((x4) => x4.id === v2);
596594
596923
  if (p)
596595
596924
  pick3(p);
@@ -596599,6 +596928,97 @@ function RayuProviderSetup({
596599
596928
  ]
596600
596929
  }, undefined, true, undefined, this);
596601
596930
  }
596931
+ if (phase === "localChoice") {
596932
+ return /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedBox_default, {
596933
+ flexDirection: "column",
596934
+ gap: 1,
596935
+ paddingLeft: 1,
596936
+ children: [
596937
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596938
+ bold: true,
596939
+ children: "Localhost provider"
596940
+ }, undefined, false, undefined, this),
596941
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596942
+ dimColor: true,
596943
+ children: "Run models on your own machine. Ollama is auto-detected; or point Rayu at any local OpenAI-compatible server."
596944
+ }, undefined, false, undefined, this),
596945
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(Select, {
596946
+ options: [
596947
+ {
596948
+ label: "Ollama — auto-detect running models (localhost:11434)",
596949
+ value: "ollama"
596950
+ },
596951
+ {
596952
+ label: "Custom OpenAI-compatible endpoint (LM Studio, llama.cpp, vLLM, …)",
596953
+ value: "local"
596954
+ }
596955
+ ],
596956
+ onChange: (v2) => {
596957
+ const p = PRESETS.find((x4) => x4.id === v2);
596958
+ if (p)
596959
+ pick3(p);
596960
+ },
596961
+ onCancel: () => setPhase("pick")
596962
+ }, undefined, false, undefined, this)
596963
+ ]
596964
+ }, undefined, true, undefined, this);
596965
+ }
596966
+ if (phase === "ollamaDetect") {
596967
+ return /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedBox_default, {
596968
+ flexDirection: "column",
596969
+ gap: 1,
596970
+ paddingLeft: 1,
596971
+ children: [
596972
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596973
+ bold: true,
596974
+ children: "Connecting to Ollama…"
596975
+ }, undefined, false, undefined, this),
596976
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596977
+ dimColor: true,
596978
+ children: [
596979
+ "Detecting models from ",
596980
+ ollamaBaseURL().replace(/\/v1$/, ""),
596981
+ "."
596982
+ ]
596983
+ }, undefined, true, undefined, this)
596984
+ ]
596985
+ }, undefined, true, undefined, this);
596986
+ }
596987
+ if (phase === "ollamaError") {
596988
+ return /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedBox_default, {
596989
+ flexDirection: "column",
596990
+ gap: 1,
596991
+ paddingLeft: 1,
596992
+ children: [
596993
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596994
+ bold: true,
596995
+ children: "Ollama not reachable"
596996
+ }, undefined, false, undefined, this),
596997
+ fetchError ? /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedText, {
596998
+ color: "yellow",
596999
+ children: fetchError
597000
+ }, undefined, false, undefined, this) : null,
597001
+ /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(Select, {
597002
+ options: [
597003
+ { label: "Retry detection", value: "retry" },
597004
+ { label: "Enter a custom endpoint instead", value: "local" },
597005
+ { label: "Cancel", value: "cancel" }
597006
+ ],
597007
+ onChange: (v2) => {
597008
+ if (v2 === "retry")
597009
+ setPhase("ollamaDetect");
597010
+ else if (v2 === "local") {
597011
+ const p = PRESETS.find((x4) => x4.id === "local");
597012
+ if (p)
597013
+ pick3(p);
597014
+ } else
597015
+ onDone();
597016
+ },
597017
+ onCancel: () => setPhase("localChoice")
597018
+ }, undefined, false, undefined, this)
597019
+ ]
597020
+ }, undefined, true, undefined, this);
597021
+ }
596602
597022
  if (phase === "baseURL") {
596603
597023
  return /* @__PURE__ */ jsx_dev_runtime325.jsxDEV(ThemedBox_default, {
596604
597024
  flexDirection: "column",
@@ -597115,7 +597535,7 @@ var init_SearchableModelPicker = __esm(() => {
597115
597535
  // src/commands/connect/connect.tsx
597116
597536
  var exports_connect = {};
597117
597537
  __export(exports_connect, {
597118
- call: () => call53
597538
+ call: () => call54
597119
597539
  });
597120
597540
  function ConnectFlow({ onDone }) {
597121
597541
  const [phase, setPhase] = React100.useState("setup");
@@ -597128,7 +597548,7 @@ function ConnectFlow({ onDone }) {
597128
597548
  onDone
597129
597549
  }, undefined, false, undefined, this);
597130
597550
  }
597131
- var React100, jsx_dev_runtime327, call53 = async (onDone, _context, _args) => {
597551
+ var React100, jsx_dev_runtime327, call54 = async (onDone, _context, _args) => {
597132
597552
  return /* @__PURE__ */ jsx_dev_runtime327.jsxDEV(ConnectFlow, {
597133
597553
  onDone
597134
597554
  }, undefined, false, undefined, this);
@@ -597154,7 +597574,7 @@ var init_connect2 = __esm(() => {
597154
597574
  // src/commands/install-skill/install-skill.tsx
597155
597575
  var exports_install_skill = {};
597156
597576
  __export(exports_install_skill, {
597157
- call: () => call54
597577
+ call: () => call55
597158
597578
  });
597159
597579
  function InstallSkillFlow({
597160
597580
  source,
@@ -597249,7 +597669,7 @@ function InstallSkillFlow({
597249
597669
  ]
597250
597670
  }, undefined, true, undefined, this);
597251
597671
  }
597252
- var import_react181, jsx_dev_runtime328, call54 = async (onDone, _context, args) => {
597672
+ var import_react181, jsx_dev_runtime328, call55 = async (onDone, _context, args) => {
597253
597673
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597254
597674
  const overwrite = tokens.includes("--overwrite");
597255
597675
  const source = tokens.filter((t2) => t2 !== "--overwrite").join(" ").trim();
@@ -597300,7 +597720,7 @@ var init_immediateCommand = __esm(() => {
597300
597720
  // src/commands/model/model.tsx
597301
597721
  var exports_model2 = {};
597302
597722
  __export(exports_model2, {
597303
- call: () => call55
597723
+ call: () => call56
597304
597724
  });
597305
597725
  function ModelPickerWrapper(t0) {
597306
597726
  const $3 = import_compiler_runtime244.c(17);
@@ -597550,7 +597970,7 @@ function renderModelLabel(model) {
597550
597970
  const rendered = renderDefaultModelSetting(model ?? getDefaultMainLoopModelSetting());
597551
597971
  return model === null ? `${rendered} (default)` : rendered;
597552
597972
  }
597553
- 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) => {
597554
597974
  args = args?.trim() || "";
597555
597975
  if (COMMON_INFO_ARGS.includes(args)) {
597556
597976
  logEvent("tengu_model_command_inline_help", {
@@ -597627,7 +598047,7 @@ var init_model3 = __esm(() => {
597627
598047
  // src/commands/model-subagent/command.tsx
597628
598048
  var exports_command = {};
597629
598049
  __export(exports_command, {
597630
- call: () => call56
598050
+ call: () => call57
597631
598051
  });
597632
598052
  function resolveAgentType(token) {
597633
598053
  const t2 = token.trim().toLowerCase();
@@ -597635,7 +598055,7 @@ function resolveAgentType(token) {
597635
598055
  return;
597636
598056
  return SUBAGENT_TYPES.find((a2) => a2.toLowerCase() === t2);
597637
598057
  }
597638
- 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) => {
597639
598059
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597640
598060
  let agentType;
597641
598061
  let sub = "";
@@ -597708,7 +598128,7 @@ var init_model_subagent = __esm(() => {
597708
598128
  // src/commands/collaborator-model/command.tsx
597709
598129
  var exports_command2 = {};
597710
598130
  __export(exports_command2, {
597711
- call: () => call57
598131
+ call: () => call58
597712
598132
  });
597713
598133
  function resolveCollaborator(token) {
597714
598134
  const t2 = token.trim().toLowerCase();
@@ -597716,7 +598136,7 @@ function resolveCollaborator(token) {
597716
598136
  return;
597717
598137
  return COLLABORATOR_AGENT_TYPES.find((a2) => a2.toLowerCase() === t2);
597718
598138
  }
597719
- 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) => {
597720
598140
  const tokens = (args ?? "").trim().split(/\s+/).filter(Boolean);
597721
598141
  let collaborator;
597722
598142
  let sub = "";
@@ -597811,7 +598231,7 @@ var init_collaborator_model = __esm(() => {
597811
598231
  // src/commands/model-image-generation/command.tsx
597812
598232
  var exports_command3 = {};
597813
598233
  __export(exports_command3, {
597814
- call: () => call58
598234
+ call: () => call59
597815
598235
  });
597816
598236
  function backendLabel(provider) {
597817
598237
  return provider === "vertex" ? "Vertex (Imagen)" : "NVIDIA";
@@ -597854,7 +598274,7 @@ function ImageModelPicker({
597854
598274
  ]
597855
598275
  }, undefined, true, undefined, this);
597856
598276
  }
597857
- var jsx_dev_runtime332, call58 = async (onDone) => {
598277
+ var jsx_dev_runtime332, call59 = async (onDone) => {
597858
598278
  return /* @__PURE__ */ jsx_dev_runtime332.jsxDEV(ImageModelPicker, {
597859
598279
  onDone
597860
598280
  }, undefined, false, undefined, this);
@@ -597885,7 +598305,7 @@ var init_model_image_generation = __esm(() => {
597885
598305
  // src/commands/model-video-generation/command.tsx
597886
598306
  var exports_command4 = {};
597887
598307
  __export(exports_command4, {
597888
- call: () => call59
598308
+ call: () => call60
597889
598309
  });
597890
598310
  function backendLabel2(backend) {
597891
598311
  if (backend === "vertex")
@@ -597932,7 +598352,7 @@ function VideoModelPicker({
597932
598352
  ]
597933
598353
  }, undefined, true, undefined, this);
597934
598354
  }
597935
- var jsx_dev_runtime333, call59 = async (onDone) => {
598355
+ var jsx_dev_runtime333, call60 = async (onDone) => {
597936
598356
  return /* @__PURE__ */ jsx_dev_runtime333.jsxDEV(VideoModelPicker, {
597937
598357
  onDone
597938
598358
  }, undefined, false, undefined, this);
@@ -597963,7 +598383,7 @@ var init_model_video_generation = __esm(() => {
597963
598383
  // src/commands/tag/tag.tsx
597964
598384
  var exports_tag = {};
597965
598385
  __export(exports_tag, {
597966
- call: () => call60
598386
+ call: () => call61
597967
598387
  });
597968
598388
  function ConfirmRemoveTag(t0) {
597969
598389
  const $3 = import_compiler_runtime245.c(11);
@@ -598187,7 +598607,7 @@ Examples:
598187
598607
  React103.useEffect(t1, t2);
598188
598608
  return null;
598189
598609
  }
598190
- async function call60(onDone, _context, args) {
598610
+ async function call61(onDone, _context, args) {
598191
598611
  args = args?.trim() || "";
598192
598612
  if (COMMON_INFO_ARGS.includes(args) || COMMON_HELP_ARGS.includes(args)) {
598193
598613
  return /* @__PURE__ */ jsx_dev_runtime334.jsxDEV(ShowHelp, {
@@ -598236,9 +598656,9 @@ var init_tag2 = __esm(() => {
598236
598656
  // src/commands/output-style/output-style.tsx
598237
598657
  var exports_output_style = {};
598238
598658
  __export(exports_output_style, {
598239
- call: () => call61
598659
+ call: () => call62
598240
598660
  });
598241
- async function call61(onDone) {
598661
+ async function call62(onDone) {
598242
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.", {
598243
598663
  display: "system"
598244
598664
  });
@@ -598287,7 +598707,7 @@ var exports_effort = {};
598287
598707
  __export(exports_effort, {
598288
598708
  showCurrentEffort: () => showCurrentEffort,
598289
598709
  executeEffort: () => executeEffort,
598290
- call: () => call62
598710
+ call: () => call63
598291
598711
  });
598292
598712
  function setEffortValue(effortValue) {
598293
598713
  const persistable = toPersistableEffort(effortValue);
@@ -598438,7 +598858,7 @@ function ApplyEffortAndClose(t0) {
598438
598858
  React104.useEffect(t1, t2);
598439
598859
  return null;
598440
598860
  }
598441
- async function call62(onDone, _context, args) {
598861
+ async function call63(onDone, _context, args) {
598442
598862
  args = args?.trim() || "";
598443
598863
  if (COMMON_HELP_ARGS2.includes(args)) {
598444
598864
  onDone(`Usage: /effort [low|medium|high|max|auto]
@@ -601347,9 +601767,9 @@ var init_Stats = __esm(() => {
601347
601767
  // src/commands/stats/stats.tsx
601348
601768
  var exports_stats = {};
601349
601769
  __export(exports_stats, {
601350
- call: () => call63
601770
+ call: () => call64
601351
601771
  });
601352
- var jsx_dev_runtime337, call63 = async (onDone) => {
601772
+ var jsx_dev_runtime337, call64 = async (onDone) => {
601353
601773
  return /* @__PURE__ */ jsx_dev_runtime337.jsxDEV(Stats2, {
601354
601774
  onClose: onDone
601355
601775
  }, undefined, false, undefined, this);
@@ -602841,7 +603261,7 @@ function generateHtmlReport(data, insights) {
602841
603261
  </html>`;
602842
603262
  }
602843
603263
  function buildExportData(data, insights, facets, remoteStats) {
602844
- const version3 = typeof MACRO !== "undefined" ? "1.3.427" : "unknown";
603264
+ const version3 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
602845
603265
  const remote_hosts_collected = remoteStats?.hosts.filter((h3) => h3.sessionCount > 0).map((h3) => h3.name);
602846
603266
  const facets_summary = {
602847
603267
  total: facets.size,
@@ -603584,6 +604004,7 @@ var init_commands2 = __esm(() => {
603584
604004
  init_init2();
603585
604005
  init_init_verifiers();
603586
604006
  init_collaborator_swarm();
604007
+ init_normal2();
603587
604008
  init_keybindings2();
603588
604009
  init_keep2();
603589
604010
  init_mcp3();
@@ -603726,6 +604147,7 @@ var init_commands2 = __esm(() => {
603726
604147
  feedback_default,
603727
604148
  review_default,
603728
604149
  collaborator_swarm_default,
604150
+ normal_default,
603729
604151
  ultraplan_local_default,
603730
604152
  ultrareview_local_default,
603731
604153
  generate_image_default,
@@ -606741,7 +607163,7 @@ var init_sessionStorage = __esm(() => {
606741
607163
  init_settings2();
606742
607164
  init_slowOperations();
606743
607165
  init_uuid();
606744
- VERSION6 = typeof MACRO !== "undefined" ? "1.3.427" : "unknown";
607166
+ VERSION6 = typeof MACRO !== "undefined" ? "1.3.429" : "unknown";
606745
607167
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
606746
607168
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
606747
607169
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -607962,7 +608384,7 @@ var init_filesystem = __esm(() => {
607962
608384
  });
607963
608385
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
607964
608386
  const nonce = randomBytes18(16).toString("hex");
607965
- return join150(getClaudeTempDir(), "bundled-skills", "1.3.427", nonce);
608387
+ return join150(getClaudeTempDir(), "bundled-skills", "1.3.429", nonce);
607966
608388
  });
607967
608389
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
607968
608390
  });
@@ -613077,7 +613499,7 @@ __export(exports_update, {
613077
613499
  import { execFileSync as execFileSync3 } from "node:child_process";
613078
613500
  import { homedir as homedir33 } from "os";
613079
613501
  async function update() {
613080
- writeToStdout(`Current version: ${"1.3.427"}
613502
+ writeToStdout(`Current version: ${"1.3.429"}
613081
613503
  `);
613082
613504
  const isBundled = isInBundledMode();
613083
613505
  if (isBundled) {
@@ -613103,13 +613525,13 @@ Manual check: npm view ${"@rayu-dev/rayu-cli"} version
613103
613525
  process.exit(1);
613104
613526
  return;
613105
613527
  }
613106
- if (latestVersion === "1.3.427") {
613528
+ if (latestVersion === "1.3.429") {
613107
613529
  writeToStdout(source_default.green(`
613108
- Rayu CLI is up to date (${"1.3.427"})
613530
+ Rayu CLI is up to date (${"1.3.429"})
613109
613531
  `));
613110
613532
  process.exit(0);
613111
613533
  }
613112
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.3.427"})
613534
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.3.429"})
613113
613535
  `);
613114
613536
  writeToStdout(`Installing update...
613115
613537
 
@@ -613133,7 +613555,7 @@ Try manually:
613133
613555
  return;
613134
613556
  }
613135
613557
  writeToStdout(source_default.green(`
613136
- Successfully updated from ${"1.3.427"} to ${latestVersion}
613558
+ Successfully updated from ${"1.3.429"} to ${latestVersion}
613137
613559
  `));
613138
613560
  process.exit(0);
613139
613561
  }
@@ -613147,14 +613569,14 @@ async function updateNativeBinary() {
613147
613569
  } catch {
613148
613570
  latestVersion = "";
613149
613571
  }
613150
- if (latestVersion && latestVersion === "1.3.427") {
613572
+ if (latestVersion && latestVersion === "1.3.429") {
613151
613573
  writeToStdout(source_default.green(`
613152
- Rayu CLI is up to date (1.3.427)
613574
+ Rayu CLI is up to date (1.3.429)
613153
613575
  `));
613154
613576
  process.exit(0);
613155
613577
  }
613156
613578
  if (latestVersion) {
613157
- writeToStdout(`New version available: ${latestVersion} (current: 1.3.427)
613579
+ writeToStdout(`New version available: ${latestVersion} (current: 1.3.429)
613158
613580
  `);
613159
613581
  }
613160
613582
  writeToStdout(`Downloading and installing update...
@@ -613169,13 +613591,13 @@ Rayu CLI is up to date (1.3.427)
613169
613591
  return;
613170
613592
  }
613171
613593
  writeToStdout(source_default.green(`
613172
- Rayu CLI is up to date (1.3.427)
613594
+ Rayu CLI is up to date (1.3.429)
613173
613595
  `));
613174
613596
  process.exit(0);
613175
613597
  }
613176
613598
  const updatedTo = result.latestVersion ?? latestVersion ?? "latest";
613177
613599
  writeToStdout(source_default.green(`
613178
- Successfully updated from 1.3.427 to ${updatedTo}
613600
+ Successfully updated from 1.3.429 to ${updatedTo}
613179
613601
  `));
613180
613602
  writeToStdout(`Restart your terminal to use the new version.
613181
613603
  `);
@@ -613206,7 +613628,7 @@ __export(exports_uninstall, {
613206
613628
  import { execFileSync as execFileSync4 } from "node:child_process";
613207
613629
  import { homedir as homedir34 } from "os";
613208
613630
  async function uninstall() {
613209
- writeToStdout(`Uninstalling Rayu CLI (${"1.3.427"})...
613631
+ writeToStdout(`Uninstalling Rayu CLI (${"1.3.429"})...
613210
613632
  `);
613211
613633
  writeToStdout(`Running: npm uninstall -g ${"@rayu-dev/rayu-cli"}
613212
613634
 
@@ -613229,7 +613651,7 @@ Try running manually:
613229
613651
  process.exit(1);
613230
613652
  }
613231
613653
  writeToStdout(source_default.green(`
613232
- Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.3.427"}
613654
+ Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.3.429"}
613233
613655
  `));
613234
613656
  writeToStdout(`Thanks for using Rayu CLI!
613235
613657
  `);
@@ -613281,7 +613703,7 @@ function showFirstRunWelcome() {
613281
613703
  `);
613282
613704
  try {
613283
613705
  mkdirSync13(getRayuConfigHomeDir(), { recursive: true });
613284
- writeFileSync15(markerPath(), "1.3.427", "utf8");
613706
+ writeFileSync15(markerPath(), "1.3.429", "utf8");
613285
613707
  } catch {}
613286
613708
  }
613287
613709
  var init_firstRun = __esm(() => {
@@ -625124,7 +625546,7 @@ async function initializeBetaTracing(resource) {
625124
625546
  });
625125
625547
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
625126
625548
  setLoggerProvider(loggerProvider);
625127
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.427");
625549
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.429");
625128
625550
  setEventLogger(eventLogger);
625129
625551
  process.on("beforeExit", async () => {
625130
625552
  await loggerProvider?.forceFlush();
@@ -625164,7 +625586,7 @@ async function initializeTelemetry() {
625164
625586
  const platform4 = getPlatform();
625165
625587
  const baseAttributes = {
625166
625588
  [import_semantic_conventions2.ATTR_SERVICE_NAME]: "claude-code",
625167
- [import_semantic_conventions2.ATTR_SERVICE_VERSION]: "1.3.427"
625589
+ [import_semantic_conventions2.ATTR_SERVICE_VERSION]: "1.3.429"
625168
625590
  };
625169
625591
  if (platform4 === "wsl") {
625170
625592
  const wslVersion = getWslVersion();
@@ -625209,7 +625631,7 @@ async function initializeTelemetry() {
625209
625631
  } catch {}
625210
625632
  };
625211
625633
  registerCleanup(shutdownTelemetry2);
625212
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.3.427");
625634
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.3.429");
625213
625635
  }
625214
625636
  const meterProvider = new import_sdk_metrics2.MeterProvider({
625215
625637
  resource,
@@ -625229,7 +625651,7 @@ async function initializeTelemetry() {
625229
625651
  });
625230
625652
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
625231
625653
  setLoggerProvider(loggerProvider);
625232
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.427");
625654
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.3.429");
625233
625655
  setEventLogger(eventLogger);
625234
625656
  logForDebugging("[3P telemetry] Event logger set successfully");
625235
625657
  process.on("beforeExit", async () => {
@@ -625291,7 +625713,7 @@ Current timeout: ${timeoutMs}ms
625291
625713
  }
625292
625714
  };
625293
625715
  registerCleanup(shutdownTelemetry);
625294
- return meterProvider.getMeter("com.anthropic.claude_code", "1.3.427");
625716
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.3.429");
625295
625717
  }
625296
625718
  async function flushTelemetry() {
625297
625719
  const meterProvider = getMeterProvider();
@@ -626804,7 +627226,7 @@ function buildSystemInitMessage(inputs) {
626804
627226
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
626805
627227
  apiKeySource: getAnthropicApiKeyWithSource().source,
626806
627228
  betas: getSdkBetas(),
626807
- claude_code_version: "1.3.427",
627229
+ claude_code_version: "1.3.429",
626808
627230
  output_style: outputStyle2,
626809
627231
  agents: inputs.agents.map((agent) => agent.agentType),
626810
627232
  skills: inputs.skills.filter((s2) => s2.userInvocable !== false).map((skill) => skill.name),
@@ -643013,7 +643435,7 @@ var init_useVoiceEnabled = __esm(() => {
643013
643435
  function getSemverPart(version3) {
643014
643436
  return `${import_semver12.major(version3, { loose: true })}.${import_semver12.minor(version3, { loose: true })}.${import_semver12.patch(version3, { loose: true })}`;
643015
643437
  }
643016
- function useUpdateNotification(updatedVersion, initialVersion = "1.3.427") {
643438
+ function useUpdateNotification(updatedVersion, initialVersion = "1.3.429") {
643017
643439
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react218.useState(() => getSemverPart(initialVersion));
643018
643440
  if (!updatedVersion) {
643019
643441
  return null;
@@ -643053,7 +643475,7 @@ function AutoUpdater({
643053
643475
  return;
643054
643476
  }
643055
643477
  if (false) {}
643056
- const currentVersion = "1.3.427";
643478
+ const currentVersion = "1.3.429";
643057
643479
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
643058
643480
  let latestVersion = await getLatestVersion(channel);
643059
643481
  const isDisabled = isAutoUpdaterDisabled();
@@ -643266,12 +643688,12 @@ function NativeAutoUpdater({
643266
643688
  logEvent("tengu_native_auto_updater_start", {});
643267
643689
  try {
643268
643690
  const maxVersion = await getMaxVersion();
643269
- if (maxVersion && gt("1.3.427", maxVersion)) {
643691
+ if (maxVersion && gt("1.3.429", maxVersion)) {
643270
643692
  const msg = await getMaxVersionMessage();
643271
643693
  setMaxVersionIssue(msg ?? "affects your version");
643272
643694
  }
643273
643695
  const result = await installLatest(channel);
643274
- const currentVersion = "1.3.427";
643696
+ const currentVersion = "1.3.429";
643275
643697
  const latencyMs = Date.now() - startTime;
643276
643698
  if (result.lockFailed) {
643277
643699
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -643408,17 +643830,17 @@ function PackageManagerAutoUpdater(t0) {
643408
643830
  const maxVersion = await getMaxVersion();
643409
643831
  if (maxVersion && latest && gt(latest, maxVersion)) {
643410
643832
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
643411
- if (gte("1.3.427", maxVersion)) {
643412
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.3.427"} 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`);
643413
643835
  setUpdateAvailable(false);
643414
643836
  return;
643415
643837
  }
643416
643838
  latest = maxVersion;
643417
643839
  }
643418
- const hasUpdate = latest && !gte("1.3.427", latest) && !shouldSkipVersion(latest);
643840
+ const hasUpdate = latest && !gte("1.3.429", latest) && !shouldSkipVersion(latest);
643419
643841
  setUpdateAvailable(!!hasUpdate);
643420
643842
  if (hasUpdate) {
643421
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.3.427"} -> ${latest}`);
643843
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.3.429"} -> ${latest}`);
643422
643844
  }
643423
643845
  };
643424
643846
  $3[0] = t1;
@@ -643452,7 +643874,7 @@ function PackageManagerAutoUpdater(t0) {
643452
643874
  wrap: "truncate",
643453
643875
  children: [
643454
643876
  "currentVersion: ",
643455
- "1.3.427"
643877
+ "1.3.429"
643456
643878
  ]
643457
643879
  }, undefined, true, undefined, this);
643458
643880
  $3[3] = verbose;
@@ -651617,7 +652039,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
651617
652039
  project_dir: getOriginalCwd(),
651618
652040
  added_dirs: addedDirs
651619
652041
  },
651620
- version: "1.3.427",
652042
+ version: "1.3.429",
651621
652043
  output_style: {
651622
652044
  name: outputStyleName
651623
652045
  },
@@ -652902,6 +653324,7 @@ function ModeIndicator({
652902
653324
  } = useTerminalSize();
652903
653325
  const modeCycleShortcut = useShortcutDisplay("chat:cycleMode", "Chat", "shift+tab");
652904
653326
  const tasks2 = useAppState((s2) => s2.tasks);
653327
+ const swarmMode = useAppState((s_sw) => s_sw.swarmMode);
652905
653328
  const teamContext = useAppState((s_0) => s_0.teamContext);
652906
653329
  const store = useAppStateStore();
652907
653330
  const [remoteSessionUrl] = import_react245.useState(() => store.getState().remoteSessionUrl);
@@ -652945,7 +653368,7 @@ function ModeIndicator({
652945
653368
  const isViewingTeammate = viewSelectionMode === "viewing-agent" && viewedTask?.type === "in_process_teammate";
652946
653369
  const isViewingCompletedTeammate = isViewingTeammate && viewedTask != null && viewedTask.status !== "running";
652947
653370
  const hasBackgroundTasks = runningTaskCount > 0 || isViewingTeammate;
652948
- 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);
652949
653372
  const shouldShowPrStatus = isPrStatusEnabled() && prStatus.number !== null && prStatus.reviewState !== null && prStatus.url !== null && primaryItemCount < 2 && (primaryItemCount === 0 || columns >= 80);
652950
653373
  const shouldShowModeHint = primaryItemCount < 2;
652951
653374
  const hasInProcessTeammates = !showSpinnerTree && hasBackgroundTasks && Object.values(tasks2).some((t_1) => t_1.type === "in_process_teammate");
@@ -652970,7 +653393,18 @@ function ModeIndicator({
652970
653393
  }, undefined, true, undefined, this)
652971
653394
  ]
652972
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;
652973
653406
  const parts = [
653407
+ ...swarmPart ? [swarmPart] : [],
652974
653408
  ...remoteSessionUrl ? [/* @__PURE__ */ jsx_dev_runtime415.jsxDEV(Link, {
652975
653409
  url: remoteSessionUrl,
652976
653410
  children: /* @__PURE__ */ jsx_dev_runtime415.jsxDEV(ThemedText, {
@@ -662987,7 +663421,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
662987
663421
  } catch {}
662988
663422
  const data = {
662989
663423
  trigger,
662990
- version: "1.3.427",
663424
+ version: "1.3.429",
662991
663425
  platform: process.platform,
662992
663426
  transcript,
662993
663427
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -665517,7 +665951,7 @@ var init_tipRegistry = __esm(() => {
665517
665951
  id: "mobile-app",
665518
665952
  content: async () => "/mobile to use RAYU from the Claude app on your phone",
665519
665953
  cooldownSessions: 15,
665520
- isRelevant: async () => true
665954
+ isRelevant: async () => false
665521
665955
  },
665522
665956
  {
665523
665957
  id: "opusplan-mode-reminder",
@@ -675036,7 +675470,22 @@ function WelcomeV2() {
675036
675470
  dimColor: true,
675037
675471
  children: [
675038
675472
  "v",
675039
- "1.3.427"
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!"
675040
675489
  ]
675041
675490
  }, undefined, true, undefined, this)
675042
675491
  ]
@@ -675047,6 +675496,8 @@ function WelcomeV2() {
675047
675496
  var jsx_dev_runtime456, RAYU_BANNER2;
675048
675497
  var init_WelcomeV2 = __esm(() => {
675049
675498
  init_ink2();
675499
+ init_AnimatedAsterisk();
675500
+ init_figures2();
675050
675501
  jsx_dev_runtime456 = __toESM(require_jsx_dev_runtime(), 1);
675051
675502
  RAYU_BANNER2 = [
675052
675503
  ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#cfff7c"],
@@ -676753,7 +677204,7 @@ function completeOnboarding() {
676753
677204
  saveGlobalConfig((current) => ({
676754
677205
  ...current,
676755
677206
  hasCompletedOnboarding: true,
676756
- lastOnboardingVersion: "1.3.427"
677207
+ lastOnboardingVersion: "1.3.429"
676757
677208
  }));
676758
677209
  }
676759
677210
  function showDialog(root2, renderer) {
@@ -681053,7 +681504,7 @@ function appendToLog(path30, message) {
681053
681504
  cwd: getFsImplementation().cwd(),
681054
681505
  userType: "external",
681055
681506
  sessionId: getSessionId(),
681056
- version: "1.3.427"
681507
+ version: "1.3.429"
681057
681508
  };
681058
681509
  getLogWriter(path30).write(messageWithTimestamp);
681059
681510
  }
@@ -685161,8 +685612,8 @@ async function getEnvLessBridgeConfig() {
685161
685612
  }
685162
685613
  async function checkEnvLessBridgeMinVersion() {
685163
685614
  const cfg = await getEnvLessBridgeConfig();
685164
- if (cfg.min_version && lt("1.3.427", cfg.min_version)) {
685165
- return `Your version of RAYU (${"1.3.427"}) 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.
685166
685617
  Version ${cfg.min_version} or higher is required. Run \`claude update\` to update.`;
685167
685618
  }
685168
685619
  return null;
@@ -685636,7 +686087,7 @@ async function initBridgeCore(params) {
685636
686087
  const rawApi = createBridgeApiClient({
685637
686088
  baseUrl,
685638
686089
  getAccessToken,
685639
- runnerVersion: "1.3.427",
686090
+ runnerVersion: "1.3.429",
685640
686091
  onDebug: logForDebugging,
685641
686092
  onAuth401,
685642
686093
  getTrustedDeviceToken
@@ -690998,7 +691449,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
690998
691449
  setCwd(cwd3);
690999
691450
  const server = new Server({
691000
691451
  name: "claude/tengu",
691001
- version: "1.3.427"
691452
+ version: "1.3.429"
691002
691453
  }, {
691003
691454
  capabilities: {
691004
691455
  tools: {}
@@ -693524,7 +693975,7 @@ ${customInstructions}` : customInstructions;
693524
693975
  }
693525
693976
  }
693526
693977
  logForDiagnosticsNoPII("info", "started", {
693527
- version: "1.3.427",
693978
+ version: "1.3.429",
693528
693979
  is_native_binary: isInBundledMode()
693529
693980
  });
693530
693981
  registerCleanup(async () => {
@@ -693827,6 +694278,7 @@ ${customInstructions}` : customInstructions;
693827
694278
  snapshotSequence: 0
693828
694279
  },
693829
694280
  pendingFileChanges: [],
694281
+ swarmMode: false,
693830
694282
  attribution: createEmptyAttributionState(),
693831
694283
  thinkingEnabled,
693832
694284
  promptSuggestionEnabled: shouldEnablePromptSuggestion(),
@@ -694242,7 +694694,7 @@ Usage: rayu --remote "your task description"`, () => gracefulShutdown(1));
694242
694694
  pendingHookMessages
694243
694695
  }, renderAndRun);
694244
694696
  }
694245
- }).version("1.3.427 (Rayu-CLI)", "-v, --version", "Output the version number");
694697
+ }).version("1.3.429 (Rayu-CLI)", "-v, --version", "Output the version number");
694246
694698
  program.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
694247
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.");
694248
694700
  if (canUserConfigureAdvisor()) {
@@ -694708,7 +695160,7 @@ if (false) {}
694708
695160
  async function main2() {
694709
695161
  const args = process.argv.slice(2);
694710
695162
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694711
- console.log(`${"1.3.427"} (Rayu-CLI)`);
695163
+ console.log(`${"1.3.429"} (Rayu-CLI)`);
694712
695164
  return;
694713
695165
  }
694714
695166
  const {