@bike4mind/cli 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { t as ConfigStore } from "../ConfigStore-RHqyXcSS.mjs";
3
- import { t as version } from "../package-DsG8Tgvs.mjs";
2
+ import { t as ConfigStore } from "../ConfigStore-DUATzLxB.mjs";
3
+ import { t as version } from "../package-DYPVrada.mjs";
4
4
  //#region src/commands/mcpCommand.ts
5
5
  /**
6
6
  * External MCP commands (b4m mcp list, b4m mcp add, etc.)
@@ -70,7 +70,7 @@ async function handleMcpCommand(subcommand, argv) {
70
70
  await handleDisable(config, argv.name, configStore);
71
71
  break;
72
72
  case "serve": {
73
- const { handleMcpServeCommand } = await import("../serve-CAfCQose.mjs");
73
+ const { handleMcpServeCommand } = await import("../serve-w6v3rZiR.mjs");
74
74
  await handleMcpServeCommand({
75
75
  http: Boolean(argv.http),
76
76
  port: typeof argv.port === "number" ? argv.port : void 0,
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as ConfigStore } from "../ConfigStore-RHqyXcSS.mjs";
2
+ import { t as ConfigStore } from "../ConfigStore-DUATzLxB.mjs";
3
3
  import { n as getDefaultPluginsDir, r as isFeatureEnabled, t as PluginStore } from "../PluginStore-DwvOJ-G3.mjs";
4
4
  import { promises } from "fs";
5
5
  import path from "path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "../package-DsG8Tgvs.mjs";
2
+ import { t as version } from "../package-DYPVrada.mjs";
3
3
  import { a as forceCheckForUpdate, c as isNpmPrefixWritable, d as shouldAttemptAutoUpdate, l as readCachedUpdate, n as REEXEC_GUARD_ENV, o as getAutoUpdatePreference, t as INSTALL_CMD, u as setAutoUpdatePreference } from "../updateChecker-CCLVVdH0.mjs";
4
4
  import { t as checkRipgrep } from "../ripgrepCheck-BmkyTK2i.mjs";
5
5
  import { execSync, spawnSync } from "child_process";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { _ as logger, f as AuthenticatedApiClient, p as DeviceFlowClient, t as ConfigStore } from "./ConfigStore-RHqyXcSS.mjs";
3
- import { t as version } from "./package-DsG8Tgvs.mjs";
2
+ import { b as logger, g as DeviceFlowClient, h as AuthenticatedApiClient, t as ConfigStore } from "./ConfigStore-DUATzLxB.mjs";
3
+ import { t as version } from "./package-DYPVrada.mjs";
4
4
  import { isAxiosError } from "axios";
5
5
  import { Readable } from "node:stream";
6
6
  import { createParser } from "eventsource-parser";
package/dist/index.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { $ as processFileReferences, A as createAgentDelegateTool, C as createTodoStore, D as createCoordinateTaskTool, E as parseAgentConfig, F as PermissionManager, G as DEFAULT_THOROUGHNESS, H as DEFAULT_AGENT_MODEL, I as buildCliToolList, J as getPlanModeFilePath, M as substituteArguments, O as createResumeAgentTool, P as findIterationBoundary, Q as CustomCommandStore, S as createFindDefinitionTool, T as createSkillTool, U as DEFAULT_MAX_ITERATIONS, V as ALWAYS_DENIED_FOR_AGENTS, W as DEFAULT_RETRY_CONFIG, X as buildSkillsPromptSection, Y as buildSystemPrompt, Z as RemoteSkillSource, _ as createDecisionLogTool, at as rewireReservedNames, b as createGetFileStructureTool, ct as warmFileCache, d as createReviewGateStore, et as hasFileReferences, f as createReviewGateTool, ft as MAX_PASTE_SIZE, g as formatBlockersOutput, h as createBlockerTools, it as mergeCommands, j as FallbackLlmBackend, k as createBackgroundAgentTools, m as createBlockerStore, nt as SessionStore, ot as formatFileSize, p as formatReviewGatesOutput, q as setWebSocketToolExecutor, rt as searchCommands, s as buildSandbox, st as searchFiles, tt as CheckpointStore, u as isConnectionDrop, ut as COMPACTION_SUMMARY_MARKER, v as createDecisionStore, w as createWriteTodosTool, x as createWorkItemTools, y as formatDecisionsOutput, z as getProcessHooks } from "./AgentHistoryStore-O2gKB5YG.mjs";
2
+ import { $ as CustomCommandStore, A as createAgentDelegateTool, B as DEFAULT_THOROUGHNESS, C as createTodoStore, D as createCoordinateTaskTool, E as parseAgentConfig, G as setWebSocketToolExecutor, H as buildSkillsPromptSection, I as ALWAYS_DENIED_FOR_AGENTS, L as DEFAULT_AGENT_MODEL, M as substituteArguments, N as PermissionManager, O as createResumeAgentTool, P as buildCliToolList, Q as RemoteSkillSource, R as DEFAULT_MAX_ITERATIONS, S as createFindDefinitionTool, T as createSkillTool, V as buildSystemPrompt, W as getProcessHooks, X as createToolSearchTool, Z as findIterationBoundary, _ as createDecisionLogTool, at as mergeCommands, b as createGetFileStructureTool, ct as searchFiles, d as createReviewGateStore, dt as COMPACTION_SUMMARY_MARKER, et as processFileReferences, f as createReviewGateTool, g as formatBlockersOutput, h as createBlockerTools, it as searchCommands, j as FallbackLlmBackend, k as createBackgroundAgentTools, lt as warmFileCache, m as createBlockerStore, nt as CheckpointStore, ot as rewireReservedNames, p as formatReviewGatesOutput, pt as MAX_PASTE_SIZE, q as getPlanModeFilePath, rt as SessionStore, s as buildSandbox, st as formatFileSize, tt as hasFileReferences, u as isConnectionDrop, v as createDecisionStore, w as createWriteTodosTool, x as createWorkItemTools, y as formatDecisionsOutput, z as DEFAULT_RETRY_CONFIG } from "./AgentHistoryStore-CLidbOHG.mjs";
3
3
  import { a as selectLiveSubagentTokens, i as selectLiveSubagentCredits, n as selectActiveBackgroundShells, o as useCliStore, r as selectCompletedBackgroundShells, t as selectActiveBackgroundAgents } from "./store-BxmPEI3v.mjs";
4
- import { At as tokenEstimateMultiplier, Bt as delegationPayloadSchema, F as ChatModels, Ft as ACTOR_COLOR_SLOTS, It as DELEGATION_PAYLOAD_SCHEMA_NAME, Lt as actorColorIndex, P as CREDIT_DEDUCT_TRANSACTION_TYPES, Q as REVIEW_GATE_STATUS_VALUES, Rt as actorKindMarker, Vt as selfClaimedActorKindSchema, _ as logger, c as getCreditsUrl, d as resolveApiEndpoint, g as parseApiUrl, gt as isEarlyStop, l as getEnvironmentName, m as LOCAL_DEV_URL, n as extractCompactInstructions, o as isReadOnlyTool, s as ApiEndpointUnconfiguredError, t as ConfigStore, tt as SUBQUEST_STATUS_VALUES, u as requireApiUrl, v as SESSION_ID_PATTERN, y as isValidSessionId, zt as actorKindSchema } from "./ConfigStore-RHqyXcSS.mjs";
4
+ import { Bt as DELEGATION_PAYLOAD_SCHEMA_NAME, Gt as selfClaimedActorKindSchema, Ht as actorKindMarker, L as CREDIT_DEDUCT_TRANSACTION_TYPES, Pt as tokenEstimateMultiplier, R as ChatModels, S as isValidSessionId, Ut as actorKindSchema, Vt as actorColorIndex, Wt as delegationPayloadSchema, _ as LOCAL_DEV_URL, b as logger, bt as isEarlyStop, d as getCreditsUrl, f as getEnvironmentName, i as ToolCatalog, it as SUBQUEST_STATUS_VALUES, m as resolveApiEndpoint, n as extractCompactInstructions, p as requireApiUrl, t as ConfigStore, tt as REVIEW_GATE_STATUS_VALUES, u as ApiEndpointUnconfiguredError, x as SESSION_ID_PATTERN, y as parseApiUrl, zt as ACTOR_COLOR_SLOTS } from "./ConfigStore-DUATzLxB.mjs";
5
5
  import { r as isFeatureEnabled, t as PluginStore } from "./PluginStore-DwvOJ-G3.mjs";
6
- import { i as getTokenCounter, n as ConversationContext, r as reconstructTurnBlocks, t as WorkItemsClient } from "./WorkItemsClient-cmw7WYBy.mjs";
7
- import { a as deferredToolRegistry, i as createToolSearchTool, n as buildSupportingStores, o as NotifyingLlmBackend, r as buildLlmBackend, t as buildAgent } from "./buildAgent-C0jmyDL4.mjs";
6
+ import { i as getTokenCounter, n as ConversationContext, r as reconstructTurnBlocks, t as WorkItemsClient } from "./WorkItemsClient-BSoOblGp.mjs";
7
+ import { a as NotifyingLlmBackend, i as deferredToolRegistry, n as buildSupportingStores, r as buildLlmBackend, t as buildAgent } from "./buildAgent-DyZWK0LW.mjs";
8
8
  import { t as getShellSessionManager } from "./ShellSessionManager-6o8KZzl1-vrbPAUTq.mjs";
9
- import { a as ApiClient, s as OAuthClient } from "./dist-B1bGf-yn.mjs";
10
- import { t as version } from "./package-DsG8Tgvs.mjs";
9
+ import { a as ApiClient, s as OAuthClient } from "./dist-DPP7UmK9.mjs";
10
+ import { t as version } from "./package-DYPVrada.mjs";
11
11
  import { s as getStartupUpdateStatus } from "./updateChecker-CCLVVdH0.mjs";
12
12
  import React, { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
13
13
  import { Box, Static, Text, measureElement, render, useApp, useInput, usePaste, useStdout } from "ink";
@@ -1145,9 +1145,23 @@ const TOOLS_WITH_HIDDEN_ARGS$1 = /* @__PURE__ */ new Set(["edit_local_file", "ba
1145
1145
  * Displays when a tool needs permission before execution.
1146
1146
  * Waits indefinitely for user response (like Claude Code).
1147
1147
  */
1148
- function PermissionPrompt({ toolName, toolDescription, args, preview, canBeTrusted, onResponse }) {
1148
+ function PermissionPrompt({ toolName, toolDescription, args, preview, canBeTrusted, kind, onResponse }) {
1149
+ const isSandboxEscalation = kind === "sandbox-escalation";
1149
1150
  const hideArgs = TOOLS_WITH_HIDDEN_ARGS$1.has(toolName);
1150
- const items = canBeTrusted ? [
1151
+ const items = isSandboxEscalation ? [
1152
+ {
1153
+ label: "✓ Retry once without sandbox",
1154
+ value: "allow-once"
1155
+ },
1156
+ {
1157
+ label: "✓ Allow this command unsandboxed for the session",
1158
+ value: "allow-session"
1159
+ },
1160
+ {
1161
+ label: "✗ Deny",
1162
+ value: "deny"
1163
+ }
1164
+ ] : canBeTrusted ? [
1151
1165
  {
1152
1166
  label: "✓ Allow once",
1153
1167
  value: "allow-once"
@@ -1251,7 +1265,7 @@ function PermissionPrompt({ toolName, toolDescription, args, preview, canBeTrust
1251
1265
  borderColor: "gray",
1252
1266
  paddingX: 1,
1253
1267
  flexDirection: "column"
1254
- }, renderDiffPreview(preview))), !canBeTrusted && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
1268
+ }, renderDiffPreview(preview))), !canBeTrusted && !isSandboxEscalation && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
1255
1269
  color: "red",
1256
1270
  dimColor: true
1257
1271
  }, "Note: This tool cannot be trusted due to its dangerous nature.")), /* @__PURE__ */ React.createElement(Box, {
@@ -2834,6 +2848,7 @@ function App({ onMessage, onBackgroundCompletion, onCommand, onBashCommand, onPe
2834
2848
  args: permissionPrompt.args,
2835
2849
  preview: permissionPrompt.preview,
2836
2850
  canBeTrusted: permissionPrompt.canBeTrusted,
2851
+ kind: permissionPrompt.kind,
2837
2852
  onResponse: (response) => onPermissionResponse(response, permissionPrompt.id)
2838
2853
  })), userQuestionPrompt && /* @__PURE__ */ React.createElement(Box, {
2839
2854
  key: userQuestionPrompt.id,
@@ -5768,7 +5783,7 @@ const HandoffSchema = z$1.object({
5768
5783
  updatedAt: z$1.string()
5769
5784
  });
5770
5785
  z$1.object({
5771
- _id: z$1.string(),
5786
+ id: z$1.string(),
5772
5787
  notebookId: z$1.string(),
5773
5788
  goal: z$1.string(),
5774
5789
  quests: z$1.array(QuestDataSchema),
@@ -8405,7 +8420,7 @@ async function runTurn(message, ctx) {
8405
8420
  }
8406
8421
  }
8407
8422
  async function runHeldTurn(message, ctx) {
8408
- const { agent, sessionStore, configStore, commandHistoryStore, customCommandStore, messageBuilder, config, availableModels, agentStore, contextContent, additionalDirectories, featureRegistry, backgroundManager, todoStore, decisionStore, blockerStore, postEditDiagnostics, workflowStores, setCommandHistory, setAbortController } = ctx;
8423
+ const { agent, sessionStore, configStore, commandHistoryStore, customCommandStore, messageBuilder, config, availableModels, agentStore, contextContent, additionalDirectories, featureRegistry, backgroundManager, toolCatalog, todoStore, decisionStore, blockerStore, postEditDiagnostics, workflowStores, setCommandHistory, setAbortController } = ctx;
8409
8424
  const storeSession = useCliStore.getState().session;
8410
8425
  if (!agent || !storeSession) {
8411
8426
  console.error("❌ CLI failed to initialize. Try restarting b4m.\n");
@@ -8523,7 +8538,7 @@ async function runHeldTurn(message, ctx) {
8523
8538
  previousMessages: previousMessages.length > 0 ? previousMessages : void 0,
8524
8539
  signal: abortController.signal,
8525
8540
  parallelExecution: cliConfig.preferences.enableParallelToolExecution === true,
8526
- isReadOnlyTool,
8541
+ isReadOnlyTool: (toolName) => toolCatalog.isReadOnly(toolName),
8527
8542
  workflowReminder,
8528
8543
  drainFeedback: diagnostics ? (phase) => diagnostics.drain(DRAIN_BUDGET_MS[phase], abortController.signal) : void 0,
8529
8544
  onContextLimit: createReactiveCompactionHandler(agent, activeSession)
@@ -8957,6 +8972,7 @@ function CliApp() {
8957
8972
  agent: null,
8958
8973
  mcpManager: null,
8959
8974
  permissionManager: null,
8975
+ toolCatalog: new ToolCatalog(),
8960
8976
  permissionPrompt: null,
8961
8977
  trustLocationSelector: null,
8962
8978
  folderTrustPrompt: null,
@@ -9214,7 +9230,7 @@ function CliApp() {
9214
9230
  error: () => {},
9215
9231
  debug: () => {}
9216
9232
  };
9217
- const permissionManager = new PermissionManager(config.trustedTools || [], void 0, config.tools.disabled || []);
9233
+ const permissionManager = new PermissionManager(state.toolCatalog, config.trustedTools || [], config.tools.disabled || []);
9218
9234
  const checkpointProjectDir = state.configStore.getProjectConfigDir() || process.cwd();
9219
9235
  const checkpointStore = new CheckpointStore(checkpointProjectDir);
9220
9236
  const { sandboxOrchestrator } = await buildSandbox({
@@ -9224,7 +9240,7 @@ function CliApp() {
9224
9240
  checkpointStore
9225
9241
  });
9226
9242
  let permissionPromptCounter = 0;
9227
- const promptFn = (toolName, args, preview) => {
9243
+ const promptFn = (toolName, args, preview, kind) => {
9228
9244
  return new Promise((resolve) => {
9229
9245
  getProcessHooks()?.fireNotificationPermissionPrompt(toolName);
9230
9246
  const canBeTrusted = permissionManager.canBeTrusted(toolName);
@@ -9235,6 +9251,7 @@ function CliApp() {
9235
9251
  args,
9236
9252
  preview,
9237
9253
  canBeTrusted,
9254
+ kind,
9238
9255
  resolve
9239
9256
  };
9240
9257
  setState((prev) => ({
@@ -9374,9 +9391,13 @@ function CliApp() {
9374
9391
  }) : null;
9375
9392
  const workItemTools = config.preferences.enableWorkItemTools ? createWorkItemTools(new WorkItemsClient(apiClient)) : [];
9376
9393
  const agentToolsRef = { current: null };
9377
- const toolSearchTool = deferredToolRegistry.size() > 0 ? createToolSearchTool(() => {
9378
- if (!agentToolsRef.current) throw new Error("tool_search invoked before agent context was wired");
9379
- return agentToolsRef.current;
9394
+ const toolSearchTool = deferredToolRegistry.size() > 0 ? createToolSearchTool({
9395
+ registry: deferredToolRegistry,
9396
+ logger,
9397
+ toolListAccessor: () => {
9398
+ if (!agentToolsRef.current) throw new Error("tool_search invoked before agent context was wired");
9399
+ return agentToolsRef.current;
9400
+ }
9380
9401
  }) : null;
9381
9402
  const cliTools = buildCliToolList({
9382
9403
  toolSearchTool,
@@ -9662,7 +9683,7 @@ function CliApp() {
9662
9683
  previousMessages: previousMessages.length > 0 ? previousMessages : void 0,
9663
9684
  signal: abortController.signal,
9664
9685
  parallelExecution: cliConfig.preferences.enableParallelToolExecution === true,
9665
- isReadOnlyTool,
9686
+ isReadOnlyTool: (toolName) => state.toolCatalog.isReadOnly(toolName),
9666
9687
  onContextLimit: createReactiveCompactionHandler(state.agent, session)
9667
9688
  });
9668
9689
  } finally {
@@ -9797,6 +9818,7 @@ function CliApp() {
9797
9818
  additionalDirectories: state.additionalDirectories,
9798
9819
  featureRegistry: state.featureRegistry,
9799
9820
  backgroundManager: state.backgroundManager,
9821
+ toolCatalog: state.toolCatalog,
9800
9822
  todoStore: todoStoreRef.current,
9801
9823
  decisionStore: decisionStoreRef.current,
9802
9824
  blockerStore: blockerStoreRef.current,
@@ -9864,7 +9886,7 @@ function CliApp() {
9864
9886
  previousMessages: previousMessages.length > 0 ? previousMessages : void 0,
9865
9887
  signal: abortController.signal,
9866
9888
  parallelExecution: cliConfig.preferences.enableParallelToolExecution === true,
9867
- isReadOnlyTool
9889
+ isReadOnlyTool: (toolName) => state.toolCatalog.isReadOnly(toolName)
9868
9890
  });
9869
9891
  const successfulToolCalls = result.steps.filter((s) => s.type === "observation").length;
9870
9892
  const currentSession = useCliStore.getState().session;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  //#region package.json
3
- var version = "3.1.0";
3
+ var version = "3.3.0";
4
4
  //#endregion
5
5
  export { version as t };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { A as BRIEFCASE_CATALOG_QUERIES, B as GENERATED_IMAGE_EXTENSION_RE, C as AGENT_QUEST_ID, Ct as replacePromptVariables, H as ImagePromptResolutionSchema, L as CreateArtifactRequestSchema, M as BriefcasePromptIdSchema, Mt as ttsRequestSchema, Nt as ttsResponseTooLargeSchema, R as DEFAULT_TTS_PROVIDER, St as questReplyText, T as AGENT_QUEST_MCP_URI, V as ImageModels, X as PROMPT_TEXT_MAX, _ as logger, bt as joinReplySlots, dt as generatedAudioResponseSchema, g as parseApiUrl, h as NotAuthenticatedError, jt as ttsBase64ResponseSchema, k as ArtifactTypeSchema, kt as supportedVoiceGenerationVendor, rt as VisibilitySchema, st as buildPromptContext, t as ConfigStore, u as requireApiUrl, w as AGENT_QUEST_MANIFEST } from "./ConfigStore-RHqyXcSS.mjs";
3
- import { a as ApiClient, i as parseRetryAfterSeconds, o as isProviderKeyFailure, r as createClient, t as B4mApiError } from "./dist-B1bGf-yn.mjs";
2
+ import { $ as PROMPT_TEXT_MAX, B as CreateArtifactRequestSchema, D as AGENT_QUEST_MANIFEST, Dt as replacePromptVariables, E as AGENT_QUEST_ID, Et as questReplyText, F as BriefcasePromptIdSchema, Ft as ttsBase64ResponseSchema, G as ImagePromptResolutionSchema, It as ttsRequestSchema, Lt as ttsResponseTooLargeSchema, M as ArtifactTypeSchema, N as BRIEFCASE_CATALOG_QUERIES, Nt as supportedVoiceGenerationVendor, O as AGENT_QUEST_MCP_URI, U as GENERATED_IMAGE_EXTENSION_RE, V as DEFAULT_TTS_PROVIDER, W as ImageModels, b as logger, dt as buildPromptContext, ht as generatedAudioResponseSchema, p as requireApiUrl, st as VisibilitySchema, t as ConfigStore, v as NotAuthenticatedError, wt as joinReplySlots, y as parseApiUrl } from "./ConfigStore-DUATzLxB.mjs";
3
+ import { a as ApiClient, i as parseRetryAfterSeconds, o as isProviderKeyFailure, r as createClient, t as B4mApiError } from "./dist-DPP7UmK9.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  import { isAxiosError } from "axios";
6
6
  import { createHash, randomUUID } from "node:crypto";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "3.1.0",
4
- "mcpName": "io.github.bike4mind/bike4mind",
3
+ "version": "3.3.0",
4
+ "mcpName": "io.github.Bike4Mind/bike4mind",
5
5
  "type": "module",
6
6
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
7
7
  "license": "BUSL-1.1",
@@ -124,17 +124,17 @@
124
124
  "tsx": "^4.23.0",
125
125
  "typescript": "^5.9.3",
126
126
  "vitest": "^4.1.11",
127
- "@bike4mind/agents": "1.2.1",
128
- "@bike4mind/client-auth": "0.2.0",
129
- "@bike4mind/common": "15.1.0",
130
- "@bike4mind/fab-pipeline": "2.1.1",
131
- "@bike4mind/llm-adapters": "1.1.1",
127
+ "@bike4mind/agents": "1.2.8",
128
+ "@bike4mind/client-auth": "0.2.1",
129
+ "@bike4mind/common": "18.0.0",
130
+ "@bike4mind/fab-pipeline": "2.1.8",
132
131
  "@bike4mind/hearth": "0.3.1",
133
- "@bike4mind/mcp": "2.1.1",
132
+ "@bike4mind/llm-adapters": "1.5.0",
133
+ "@bike4mind/mcp": "2.1.8",
134
134
  "@bike4mind/observability": "0.2.3",
135
- "@bike4mind/sdk": "1.0.1",
136
- "@bike4mind/services": "17.1.0",
137
- "@bike4mind/utils": "7.1.1"
135
+ "@bike4mind/sdk": "1.2.0",
136
+ "@bike4mind/services": "19.2.0",
137
+ "@bike4mind/utils": "8.1.3"
138
138
  },
139
139
  "optionalDependencies": {
140
140
  "@vscode/ripgrep": "^1.18.0"