@bike4mind/cli 0.2.11-feat-secops-packages-check.17324 → 0.2.11-feat-api-key-rate-limiting.17328

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.
@@ -36,16 +36,24 @@ const argv = yargs(hideBin(process.argv))
36
36
  description: 'Show debug logs in console',
37
37
  default: false,
38
38
  })
39
+ .option('no-project-config', {
40
+ type: 'boolean',
41
+ description: 'Disable loading project-specific configuration (.bike4mind/)',
42
+ default: false,
43
+ })
39
44
  .help()
40
45
  .alias('help', 'h')
41
46
  .version()
42
47
  .alias('version', 'V')
43
48
  .parse();
44
49
 
45
- // Set environment variable for verbose mode
50
+ // Set environment variables from CLI flags
46
51
  if (argv.verbose) {
47
52
  process.env.B4M_VERBOSE = '1';
48
53
  }
54
+ if (argv['no-project-config']) {
55
+ process.env.B4M_NO_PROJECT_CONFIG = '1';
56
+ }
49
57
 
50
58
  // Auto-detect environment: prefer production mode when dist exists
51
59
  const distPath = join(__dirname, '../dist/index.js');
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CurationArtifactType
4
- } from "./chunk-3OX632TE.js";
4
+ } from "./chunk-332RE6EY.js";
5
5
  import "./chunk-PDX44BCA.js";
6
6
 
7
7
  // ../../b4m-core/packages/services/dist/src/notebookCurationService/artifactExtractor.js
@@ -228,6 +228,7 @@ var b4mLLMTools = z3.enum([
228
228
  // File operation tools
229
229
  "file_read",
230
230
  "create_file",
231
+ "edit_local_file",
231
232
  "glob_files",
232
233
  "grep_search",
233
234
  "delete_file",
@@ -672,6 +673,14 @@ var RealtimeVoiceUsageTransaction = BaseCreditTransaction.extend({
672
673
  model: z7.string(),
673
674
  sessionId: z7.string()
674
675
  });
676
+ var CompletionApiUsageTransaction = BaseCreditTransaction.extend({
677
+ type: z7.literal("completion_api_usage"),
678
+ model: z7.string(),
679
+ apiKeyId: z7.string().optional(),
680
+ // Optional - present for API key auth, undefined for JWT
681
+ inputTokens: z7.number(),
682
+ outputTokens: z7.number()
683
+ });
675
684
  var TransferCreditTransaction = BaseCreditTransaction.extend({
676
685
  type: z7.literal("transfer_credit"),
677
686
  recipientId: z7.string(),
@@ -686,6 +695,7 @@ var CreditTransaction = z7.discriminatedUnion("type", [
686
695
  ImageGenerationUsageTransaction,
687
696
  ImageEditUsageTransaction,
688
697
  RealtimeVoiceUsageTransaction,
698
+ CompletionApiUsageTransaction,
689
699
  TransferCreditTransaction,
690
700
  ReceivedCreditTransaction
691
701
  ]);
@@ -700,6 +710,7 @@ var CREDIT_DEDUCT_TRANSACTION_TYPES = [
700
710
  "image_generation_usage",
701
711
  "image_edit_usage",
702
712
  "realtime_voice_usage",
713
+ "completion_api_usage",
703
714
  "transfer_credit",
704
715
  "generic_deduct"
705
716
  ];
@@ -3830,6 +3841,8 @@ var AiEvents;
3830
3841
  AiEvents2["NOTEBOOK_SUMMARIZATION"] = "Notebook Summarization Completed";
3831
3842
  AiEvents2["AI_VOICE_SESSION_STARTED"] = "AI Voice Session Started";
3832
3843
  AiEvents2["WHATS_NEW_MODAL_GENERATED"] = "What's New Modal Generated";
3844
+ AiEvents2["COMPLETION_API_COMPLETED"] = "Completion API Completed";
3845
+ AiEvents2["COMPLETION_API_FAILED"] = "Completion API Failed";
3833
3846
  })(AiEvents || (AiEvents = {}));
3834
3847
 
3835
3848
  // ../../b4m-core/packages/common/dist/src/schemas/analytics/events/apiKeys.js
@@ -6001,6 +6014,7 @@ export {
6001
6014
  ImageGenerationUsageTransaction,
6002
6015
  ImageEditUsageTransaction,
6003
6016
  RealtimeVoiceUsageTransaction,
6017
+ CompletionApiUsageTransaction,
6004
6018
  TransferCreditTransaction,
6005
6019
  CreditTransaction,
6006
6020
  CREDIT_ADD_TRANSACTION_TYPES,
@@ -7,11 +7,11 @@ import {
7
7
  getSettingsMap,
8
8
  getSettingsValue,
9
9
  secureParameters
10
- } from "./chunk-JYH72REB.js";
10
+ } from "./chunk-XYK5DZUN.js";
11
11
  import {
12
12
  KnowledgeType,
13
13
  SupportedFabFileMimeTypes
14
- } from "./chunk-3OX632TE.js";
14
+ } from "./chunk-332RE6EY.js";
15
15
 
16
16
  // ../../b4m-core/packages/services/dist/src/fabFileService/create.js
17
17
  import { z } from "zod";
@@ -6,12 +6,12 @@ import {
6
6
  getSettingsByNames,
7
7
  obfuscateApiKey,
8
8
  secureParameters
9
- } from "./chunk-JYH72REB.js";
9
+ } from "./chunk-XYK5DZUN.js";
10
10
  import {
11
11
  ApiKeyType,
12
12
  MementoTier,
13
13
  isSupportedEmbeddingModel
14
- } from "./chunk-3OX632TE.js";
14
+ } from "./chunk-332RE6EY.js";
15
15
 
16
16
  // ../../b4m-core/packages/services/dist/src/apiKeyService/get.js
17
17
  import { z } from "zod";
@@ -2,15 +2,16 @@
2
2
  import {
3
3
  BadRequestError,
4
4
  secureParameters
5
- } from "./chunk-JYH72REB.js";
5
+ } from "./chunk-XYK5DZUN.js";
6
6
  import {
7
+ CompletionApiUsageTransaction,
7
8
  GenericCreditDeductTransaction,
8
9
  ImageEditUsageTransaction,
9
10
  ImageGenerationUsageTransaction,
10
11
  RealtimeVoiceUsageTransaction,
11
12
  TextGenerationUsageTransaction,
12
13
  TransferCreditTransaction
13
- } from "./chunk-3OX632TE.js";
14
+ } from "./chunk-332RE6EY.js";
14
15
 
15
16
  // ../../b4m-core/packages/services/dist/src/creditService/subtractCredits.js
16
17
  import { z } from "zod";
@@ -20,6 +21,7 @@ var SubtractCreditsSchema = z.discriminatedUnion("type", [
20
21
  ImageGenerationUsageTransaction.omit({ createdAt: true, updatedAt: true }),
21
22
  RealtimeVoiceUsageTransaction.omit({ createdAt: true, updatedAt: true }),
22
23
  ImageEditUsageTransaction.omit({ createdAt: true, updatedAt: true }),
24
+ CompletionApiUsageTransaction.omit({ createdAt: true, updatedAt: true }),
23
25
  TransferCreditTransaction.omit({ createdAt: true, updatedAt: true })
24
26
  ]);
25
27
  async function subtractCredits(parameters, { db, creditHolderMethods, skipBalanceUpdate, currentCreditHolder }) {
@@ -63,6 +65,20 @@ async function subtractCredits(parameters, { db, creditHolderMethods, skipBalanc
63
65
  inputTokens: params.inputTokens,
64
66
  outputTokens: params.outputTokens
65
67
  });
68
+ } else if (type === "completion_api_usage") {
69
+ await db.creditTransactions.createTransaction("completion_api_usage", {
70
+ ownerId,
71
+ ownerType,
72
+ credits: -Math.abs(credits),
73
+ // Negative for usage
74
+ description: description || "Completion API usage",
75
+ metadata,
76
+ model: params.model,
77
+ apiKeyId: params.apiKeyId,
78
+ // Optional - present for API key auth, undefined for JWT
79
+ inputTokens: params.inputTokens,
80
+ outputTokens: params.outputTokens
81
+ });
66
82
  } else if (type === "image_generation_usage") {
67
83
  await db.creditTransactions.createTransaction("image_generation_usage", {
68
84
  ownerId,
@@ -16,7 +16,7 @@ import {
16
16
  dayjsConfig_default,
17
17
  extractSnippetMeta,
18
18
  settingsMap
19
- } from "./chunk-3OX632TE.js";
19
+ } from "./chunk-332RE6EY.js";
20
20
 
21
21
  // ../../b4m-core/packages/utils/dist/src/storage/S3Storage.js
22
22
  import { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand, HeadObjectCommand } from "@aws-sdk/client-s3";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  createFabFile,
4
4
  createFabFileSchema
5
- } from "./chunk-HPYQM2B7.js";
6
- import "./chunk-JYH72REB.js";
5
+ } from "./chunk-A6NFKGUG.js";
6
+ import "./chunk-XYK5DZUN.js";
7
7
  import "./chunk-AMDXHL6S.js";
8
- import "./chunk-3OX632TE.js";
8
+ import "./chunk-332RE6EY.js";
9
9
  import "./chunk-PDX44BCA.js";
10
10
  export {
11
11
  createFabFile,
package/dist/index.js CHANGED
@@ -4,9 +4,9 @@ import {
4
4
  getEffectiveApiKey,
5
5
  getOpenWeatherKey,
6
6
  getSerperKey
7
- } from "./chunk-7JR6VASX.js";
8
- import "./chunk-7ORA6KGN.js";
9
- import "./chunk-HPYQM2B7.js";
7
+ } from "./chunk-BFO3VHFZ.js";
8
+ import "./chunk-IEDWDSMG.js";
9
+ import "./chunk-A6NFKGUG.js";
10
10
  import {
11
11
  BFLImageService,
12
12
  BaseStorage,
@@ -15,7 +15,7 @@ import {
15
15
  OpenAIBackend,
16
16
  OpenAIImageService,
17
17
  XAIImageService
18
- } from "./chunk-JYH72REB.js";
18
+ } from "./chunk-XYK5DZUN.js";
19
19
  import {
20
20
  Logger
21
21
  } from "./chunk-AMDXHL6S.js";
@@ -73,7 +73,7 @@ import {
73
73
  XAI_IMAGE_MODELS,
74
74
  b4mLLMTools,
75
75
  getMcpProviderMetadata
76
- } from "./chunk-3OX632TE.js";
76
+ } from "./chunk-332RE6EY.js";
77
77
  import {
78
78
  __require
79
79
  } from "./chunk-PDX44BCA.js";
@@ -988,8 +988,8 @@ import { Box as Box6 } from "ink";
988
988
  import React6 from "react";
989
989
  import { Box as Box5, Text as Text6 } from "ink";
990
990
  import Spinner from "ink-spinner";
991
- var ThoughtStream = React6.memo(function ThoughtStream2({ steps }) {
992
- return /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column", gap: 1 }, steps.map((step, index) => /* @__PURE__ */ React6.createElement(Box5, { key: index, flexDirection: "column" }, step.type === "thought" && /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "magenta" }, "\u{1F914} Thought: "), /* @__PURE__ */ React6.createElement(Text6, null, step.content)), step.type === "action" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, "\u26A1 Action: "), /* @__PURE__ */ React6.createElement(Text6, { bold: true }, step.metadata?.toolName || "unknown")), step.metadata?.toolInput && /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, JSON.stringify(step.metadata.toolInput, null, 2)))), step.type === "observation" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "blue" }, "\u{1F4CA} Observation: ")), /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, null, step.content))), step.type === "final_answer" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "green", bold: true }, "\u2705 Final Answer:", " ")), /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, null, step.content)), step.metadata?.tokenUsage && /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, "(", step.metadata.tokenUsage.total, " tokens)"))))), !steps.some((s) => s.type === "final_answer") && /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, /* @__PURE__ */ React6.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React6.createElement(Text6, null, " ", steps.length === 0 ? "Thinking..." : "Processing...")));
991
+ var ThoughtStream = React6.memo(function ThoughtStream2({ isThinking }) {
992
+ return /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column", gap: 1 }, isThinking && /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, /* @__PURE__ */ React6.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React6.createElement(Text6, null, " Thinking...")));
993
993
  });
994
994
 
995
995
  // src/store/index.ts
@@ -1034,12 +1034,6 @@ var useCliStore = create((set) => ({
1034
1034
  // UI state
1035
1035
  isThinking: false,
1036
1036
  setIsThinking: (thinking) => set({ isThinking: thinking }),
1037
- agentSteps: [],
1038
- addAgentStep: (step) => set((state) => ({
1039
- agentSteps: [...state.agentSteps, step]
1040
- })),
1041
- setAgentSteps: (steps) => set({ agentSteps: steps }),
1042
- clearAgentSteps: () => set({ agentSteps: [] }),
1043
1037
  // Permission prompt
1044
1038
  permissionPrompt: null,
1045
1039
  setPermissionPrompt: (prompt) => set({ permissionPrompt: prompt }),
@@ -1054,11 +1048,10 @@ var useCliStore = create((set) => ({
1054
1048
  // src/components/AgentThinking.tsx
1055
1049
  var AgentThinking = React7.memo(function AgentThinking2() {
1056
1050
  const isThinking = useCliStore((state) => state.isThinking);
1057
- const agentSteps = useCliStore((state) => state.agentSteps);
1058
1051
  if (!isThinking) {
1059
1052
  return null;
1060
1053
  }
1061
- return /* @__PURE__ */ React7.createElement(Box6, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React7.createElement(ThoughtStream, { steps: agentSteps }));
1054
+ return /* @__PURE__ */ React7.createElement(Box6, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React7.createElement(ThoughtStream, { isThinking }));
1062
1055
  });
1063
1056
 
1064
1057
  // src/components/PermissionPrompt.tsx
@@ -1096,7 +1089,10 @@ function PermissionPrompt({
1096
1089
  { label: "\u2713 Allow once", value: "allow-once" },
1097
1090
  { label: "\u2717 Deny", value: "deny" }
1098
1091
  ];
1099
- const argsString = typeof args === "string" ? args : JSON.stringify(args, null, 2);
1092
+ const MAX_ARGS_LENGTH = 500;
1093
+ const rawArgsString = typeof args === "string" ? args : JSON.stringify(args, null, 2);
1094
+ const argsString = rawArgsString.length > MAX_ARGS_LENGTH ? rawArgsString.slice(0, MAX_ARGS_LENGTH) + `
1095
+ ... (${rawArgsString.length - MAX_ARGS_LENGTH} more chars)` : rawArgsString;
1100
1096
  return /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column", borderStyle: "bold", borderColor: "yellow", padding: 1, marginY: 1 }, /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text7, { bold: true, color: "yellow" }, "\u26A0\uFE0F Permission Required")), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, "Tool: "), /* @__PURE__ */ React8.createElement(Text7, { bold: true, color: "cyan" }, toolName)), toolDescription && /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, "Action: "), /* @__PURE__ */ React8.createElement(Text7, null, toolDescription)), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { bold: true }, "Arguments:"), /* @__PURE__ */ React8.createElement(Box7, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, argsString))), preview && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { bold: true }, "Preview:"), /* @__PURE__ */ React8.createElement(Box7, { borderStyle: "single", borderColor: "gray", paddingX: 1, flexDirection: "column" }, renderDiffPreview(preview))), !canBeTrusted && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(Text7, { color: "red", dimColor: true }, "Note: This tool cannot be trusted due to its dangerous nature.")), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(SelectInput, { items, onSelect: (item) => onResponse(item.value) })));
1101
1097
  }
1102
1098
 
@@ -2381,15 +2377,19 @@ var ConfigStore = class {
2381
2377
  throw error;
2382
2378
  }
2383
2379
  }
2384
- this.projectConfigDir = findProjectConfigDir();
2385
2380
  let projectConfig = null;
2386
2381
  let projectLocalConfig = null;
2387
- if (this.projectConfigDir) {
2388
- projectConfig = await loadProjectConfig(this.projectConfigDir);
2389
- projectLocalConfig = await loadProjectLocalConfig(this.projectConfigDir);
2390
- if (projectConfig) {
2391
- console.log(`\u{1F4C1} Project config loaded from: ${this.projectConfigDir}/.bike4mind/`);
2382
+ if (process.env.B4M_NO_PROJECT_CONFIG !== "1") {
2383
+ this.projectConfigDir = findProjectConfigDir();
2384
+ if (this.projectConfigDir) {
2385
+ projectConfig = await loadProjectConfig(this.projectConfigDir);
2386
+ projectLocalConfig = await loadProjectLocalConfig(this.projectConfigDir);
2387
+ if (projectConfig) {
2388
+ console.log(`\u{1F4C1} Project config loaded from: ${this.projectConfigDir}/.bike4mind/`);
2389
+ }
2392
2390
  }
2391
+ } else {
2392
+ this.projectConfigDir = null;
2393
2393
  }
2394
2394
  this.config = mergeConfigs(globalConfig, projectConfig, projectLocalConfig);
2395
2395
  return this.config;
@@ -5489,8 +5489,8 @@ async function processAndStoreImages(images, context) {
5489
5489
  const buffer = await downloadImage(image);
5490
5490
  const fileType = await fileTypeFromBuffer2(buffer);
5491
5491
  const filename = `${uuidv46()}.${fileType?.ext}`;
5492
- const path16 = await context.imageGenerateStorage.upload(buffer, filename, {});
5493
- return path16;
5492
+ const path17 = await context.imageGenerateStorage.upload(buffer, filename, {});
5493
+ return path17;
5494
5494
  }));
5495
5495
  }
5496
5496
  async function updateQuestAndReturnMarkdown(storedImageUrls, context) {
@@ -6702,8 +6702,8 @@ async function processAndStoreImage(imageUrl, context) {
6702
6702
  const buffer = await downloadImage2(imageUrl);
6703
6703
  const fileType = await fileTypeFromBuffer3(buffer);
6704
6704
  const filename = `${uuidv47()}.${fileType?.ext}`;
6705
- const path16 = await context.imageGenerateStorage.upload(buffer, filename, {});
6706
- return path16;
6705
+ const path17 = await context.imageGenerateStorage.upload(buffer, filename, {});
6706
+ return path17;
6707
6707
  }
6708
6708
  async function updateQuestAndReturnMarkdown2(storedImagePath, context) {
6709
6709
  await context.onFinish?.("edit_image", storedImagePath);
@@ -9491,6 +9491,104 @@ BLOCKED OPERATIONS:
9491
9491
  })
9492
9492
  };
9493
9493
 
9494
+ // ../../b4m-core/packages/services/dist/src/llm/tools/implementation/editLocalFile/index.js
9495
+ import { promises as fs11 } from "fs";
9496
+ import { existsSync as existsSync7 } from "fs";
9497
+ import path13 from "path";
9498
+ import { diffLines as diffLines3 } from "diff";
9499
+ function generateDiff(original, modified) {
9500
+ const differences = diffLines3(original, modified);
9501
+ let diffString = "";
9502
+ let additions = 0;
9503
+ let deletions = 0;
9504
+ differences.forEach((part) => {
9505
+ if (part.added) {
9506
+ additions += part.count || 0;
9507
+ diffString += part.value.split("\n").filter((line) => line).map((line) => `+ ${line}`).join("\n");
9508
+ if (diffString && !diffString.endsWith("\n"))
9509
+ diffString += "\n";
9510
+ } else if (part.removed) {
9511
+ deletions += part.count || 0;
9512
+ diffString += part.value.split("\n").filter((line) => line).map((line) => `- ${line}`).join("\n");
9513
+ if (diffString && !diffString.endsWith("\n"))
9514
+ diffString += "\n";
9515
+ }
9516
+ });
9517
+ return { additions, deletions, diff: diffString.trim() };
9518
+ }
9519
+ async function editLocalFile(params) {
9520
+ const { path: filePath, old_string, new_string } = params;
9521
+ const normalizedPath = path13.normalize(filePath);
9522
+ const resolvedPath = path13.resolve(process.cwd(), normalizedPath);
9523
+ const cwd = path13.resolve(process.cwd());
9524
+ if (!resolvedPath.startsWith(cwd)) {
9525
+ throw new Error(`Access denied: Cannot edit files outside of current working directory`);
9526
+ }
9527
+ if (!existsSync7(resolvedPath)) {
9528
+ throw new Error(`File not found: ${filePath}`);
9529
+ }
9530
+ const currentContent = await fs11.readFile(resolvedPath, "utf-8");
9531
+ if (!currentContent.includes(old_string)) {
9532
+ const preview = old_string.length > 100 ? old_string.substring(0, 100) + "..." : old_string;
9533
+ throw new Error(`String to replace not found in file. Make sure the old_string matches exactly (including whitespace and line endings). Searched for: "${preview}"`);
9534
+ }
9535
+ const occurrences = currentContent.split(old_string).length - 1;
9536
+ if (occurrences > 1) {
9537
+ throw new Error(`Found ${occurrences} occurrences of the string to replace. Please provide a more specific old_string that matches exactly one location.`);
9538
+ }
9539
+ const newContent = currentContent.replace(old_string, new_string);
9540
+ await fs11.writeFile(resolvedPath, newContent, "utf-8");
9541
+ const diffResult = generateDiff(old_string, new_string);
9542
+ return `File edited successfully: ${filePath}
9543
+ Changes: +${diffResult.additions} lines, -${diffResult.deletions} lines
9544
+
9545
+ Diff:
9546
+ ${diffResult.diff}`;
9547
+ }
9548
+ var editLocalFileTool = {
9549
+ name: "edit_local_file",
9550
+ implementation: (context) => ({
9551
+ toolFn: async (value) => {
9552
+ const params = value;
9553
+ context.logger.info(`\u{1F4DD} EditLocalFile: Editing file`, {
9554
+ path: params.path,
9555
+ oldStringLength: params.old_string.length,
9556
+ newStringLength: params.new_string.length
9557
+ });
9558
+ try {
9559
+ const result = await editLocalFile(params);
9560
+ context.logger.info("\u2705 EditLocalFile: Success", { path: params.path });
9561
+ return result;
9562
+ } catch (error) {
9563
+ context.logger.error("\u274C EditLocalFile: Failed", error);
9564
+ throw error;
9565
+ }
9566
+ },
9567
+ toolSchema: {
9568
+ name: "edit_local_file",
9569
+ description: "Edit a file by replacing a specific string with new content. The old_string must match exactly one location in the file (including whitespace). Use this for precise edits to existing files. For creating new files or complete rewrites, use create_file instead.",
9570
+ parameters: {
9571
+ type: "object",
9572
+ properties: {
9573
+ path: {
9574
+ type: "string",
9575
+ description: "Path to the file to edit (relative to current working directory)"
9576
+ },
9577
+ old_string: {
9578
+ type: "string",
9579
+ description: "The exact string to find and replace. Must match exactly one location in the file, including all whitespace and line endings."
9580
+ },
9581
+ new_string: {
9582
+ type: "string",
9583
+ description: "The string to replace old_string with. Can be empty to delete the old_string."
9584
+ }
9585
+ },
9586
+ required: ["path", "old_string", "new_string"]
9587
+ }
9588
+ }
9589
+ })
9590
+ };
9591
+
9494
9592
  // ../../b4m-core/packages/services/dist/src/llm/tools/index.js
9495
9593
  var tools = {
9496
9594
  dice_roll: diceRollTool,
@@ -9516,6 +9614,7 @@ var tools = {
9516
9614
  planet_visibility: planetVisibilityTool,
9517
9615
  file_read: fileReadTool,
9518
9616
  create_file: createFileTool,
9617
+ edit_local_file: editLocalFileTool,
9519
9618
  glob_files: globFilesTool,
9520
9619
  grep_search: grepSearchTool,
9521
9620
  delete_file: deleteFileTool,
@@ -9759,10 +9858,10 @@ var ToolErrorType;
9759
9858
  // src/utils/diffPreview.ts
9760
9859
  import * as Diff from "diff";
9761
9860
  import { readFile } from "fs/promises";
9762
- import { existsSync as existsSync7 } from "fs";
9861
+ import { existsSync as existsSync8 } from "fs";
9763
9862
  async function generateFileDiffPreview(args) {
9764
9863
  try {
9765
- if (!existsSync7(args.path)) {
9864
+ if (!existsSync8(args.path)) {
9766
9865
  const lines2 = args.content.split("\n");
9767
9866
  const preview = lines2.slice(0, 20).join("\n");
9768
9867
  const hasMore = lines2.length > 20;
@@ -9784,18 +9883,26 @@ ${preview}${hasMore ? `
9784
9883
  // Show 3 lines of context around changes
9785
9884
  );
9786
9885
  const lines = patch.split("\n");
9787
- const diffLines3 = lines.slice(4);
9788
- return diffLines3.join("\n");
9886
+ const diffLines4 = lines.slice(4);
9887
+ return diffLines4.join("\n");
9789
9888
  } catch (error) {
9790
9889
  return `[Error generating diff preview: ${error instanceof Error ? error.message : "Unknown error"}]`;
9791
9890
  }
9792
9891
  }
9892
+ function generateEditLocalFilePreview(args) {
9893
+ const patch = Diff.createPatch(args.path, args.old_string, args.new_string, "Current", "Proposed", { context: 3 });
9894
+ const lines = patch.split("\n");
9895
+ const diffLines4 = lines.slice(4);
9896
+ return `[Edit in: ${args.path}]
9897
+
9898
+ ${diffLines4.join("\n")}`;
9899
+ }
9793
9900
  async function generateFileDeletePreview(args) {
9794
9901
  try {
9795
- if (!existsSync7(args.path)) {
9902
+ if (!existsSync8(args.path)) {
9796
9903
  return `[File does not exist: ${args.path}]`;
9797
9904
  }
9798
- const stats = await import("fs/promises").then((fs13) => fs13.stat(args.path));
9905
+ const stats = await import("fs/promises").then((fs14) => fs14.stat(args.path));
9799
9906
  return `[File will be deleted]
9800
9907
 
9801
9908
  Path: ${args.path}
@@ -9807,8 +9914,8 @@ Last modified: ${stats.mtime.toLocaleString()}`;
9807
9914
  }
9808
9915
 
9809
9916
  // src/utils/Logger.ts
9810
- import fs11 from "fs/promises";
9811
- import path13 from "path";
9917
+ import fs12 from "fs/promises";
9918
+ import path14 from "path";
9812
9919
  import os2 from "os";
9813
9920
  var Logger2 = class _Logger {
9814
9921
  constructor() {
@@ -9831,9 +9938,9 @@ var Logger2 = class _Logger {
9831
9938
  */
9832
9939
  async initialize(sessionId) {
9833
9940
  this.sessionId = sessionId;
9834
- const debugDir = path13.join(os2.homedir(), ".bike4mind", "debug");
9835
- await fs11.mkdir(debugDir, { recursive: true });
9836
- this.logFilePath = path13.join(debugDir, `${sessionId}.txt`);
9941
+ const debugDir = path14.join(os2.homedir(), ".bike4mind", "debug");
9942
+ await fs12.mkdir(debugDir, { recursive: true });
9943
+ this.logFilePath = path14.join(debugDir, `${sessionId}.txt`);
9837
9944
  await this.writeToFile("INFO", "=== CLI SESSION START ===");
9838
9945
  }
9839
9946
  /**
@@ -9897,7 +10004,7 @@ var Logger2 = class _Logger {
9897
10004
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").substring(0, 19);
9898
10005
  const logEntry = `[${timestamp}] [${level}] ${message}
9899
10006
  `;
9900
- await fs11.appendFile(this.logFilePath, logEntry, "utf-8");
10007
+ await fs12.appendFile(this.logFilePath, logEntry, "utf-8");
9901
10008
  } catch (error) {
9902
10009
  console.error("File logging failed:", error);
9903
10010
  }
@@ -10043,15 +10150,15 @@ var Logger2 = class _Logger {
10043
10150
  async cleanupOldLogs() {
10044
10151
  if (!this.fileLoggingEnabled) return;
10045
10152
  try {
10046
- const debugDir = path13.join(os2.homedir(), ".bike4mind", "debug");
10047
- const files = await fs11.readdir(debugDir);
10153
+ const debugDir = path14.join(os2.homedir(), ".bike4mind", "debug");
10154
+ const files = await fs12.readdir(debugDir);
10048
10155
  const now = Date.now();
10049
10156
  const thirtyDaysAgo = now - 30 * 24 * 60 * 60 * 1e3;
10050
10157
  for (const file of files) {
10051
- const filePath = path13.join(debugDir, file);
10052
- const stats = await fs11.stat(filePath);
10158
+ const filePath = path14.join(debugDir, file);
10159
+ const stats = await fs12.stat(filePath);
10053
10160
  if (stats.mtime.getTime() < thirtyDaysAgo) {
10054
- await fs11.unlink(filePath);
10161
+ await fs12.unlink(filePath);
10055
10162
  }
10056
10163
  }
10057
10164
  } catch (error) {
@@ -10108,10 +10215,10 @@ var SERVER_TOOLS = ["weather_info", "web_search"];
10108
10215
  var LOCAL_TOOLS = [
10109
10216
  "file_read",
10110
10217
  "create_file",
10218
+ "edit_local_file",
10111
10219
  "glob_files",
10112
10220
  "grep_search",
10113
10221
  "delete_file",
10114
- "edit_file",
10115
10222
  "dice_roll",
10116
10223
  "math_evaluate",
10117
10224
  "current_datetime",
@@ -10145,21 +10252,21 @@ var NoOpStorage = class extends BaseStorage {
10145
10252
  async upload(input, destination, options) {
10146
10253
  return `/tmp/${destination}`;
10147
10254
  }
10148
- async download(path16) {
10255
+ async download(path17) {
10149
10256
  throw new Error("Download not supported in CLI");
10150
10257
  }
10151
- async delete(path16) {
10258
+ async delete(path17) {
10152
10259
  }
10153
- async getSignedUrl(path16) {
10154
- return `/tmp/${path16}`;
10260
+ async getSignedUrl(path17) {
10261
+ return `/tmp/${path17}`;
10155
10262
  }
10156
- getPublicUrl(path16) {
10157
- return `/tmp/${path16}`;
10263
+ getPublicUrl(path17) {
10264
+ return `/tmp/${path17}`;
10158
10265
  }
10159
- async getPreview(path16) {
10160
- return `/tmp/${path16}`;
10266
+ async getPreview(path17) {
10267
+ return `/tmp/${path17}`;
10161
10268
  }
10162
- async getMetadata(path16) {
10269
+ async getMetadata(path17) {
10163
10270
  return { size: 0, contentType: "application/octet-stream" };
10164
10271
  }
10165
10272
  };
@@ -10191,11 +10298,12 @@ function wrapToolWithPermission(tool, permissionManager, showPermissionPrompt, a
10191
10298
  return result2;
10192
10299
  }
10193
10300
  let preview;
10194
- if (toolName === "edit_file" && args?.path && args?.content) {
10301
+ if (toolName === "edit_local_file" && args?.path && args?.old_string && typeof args?.new_string === "string") {
10195
10302
  try {
10196
- preview = await generateFileDiffPreview({
10303
+ preview = generateEditLocalFilePreview({
10197
10304
  path: args.path,
10198
- content: args.content
10305
+ old_string: args.old_string,
10306
+ new_string: args.new_string
10199
10307
  });
10200
10308
  } catch (error) {
10201
10309
  preview = `[Could not generate preview: ${error instanceof Error ? error.message : "Unknown error"}]`;
@@ -10312,6 +10420,7 @@ function generateCliTools(userId, llm, model, permissionManager, showPermissionP
10312
10420
  // File operation tools (CLI-specific, local execution)
10313
10421
  file_read: {},
10314
10422
  create_file: {},
10423
+ edit_local_file: {},
10315
10424
  glob_files: {},
10316
10425
  grep_search: {},
10317
10426
  delete_file: {},
@@ -10394,6 +10503,7 @@ var DEFAULT_TOOL_CATEGORIES = {
10394
10503
  // These tools can modify files, execute code, or have other dangerous side effects
10395
10504
  // They ALWAYS require permission and cannot be trusted automatically
10396
10505
  edit_file: "prompt_always",
10506
+ edit_local_file: "prompt_always",
10397
10507
  create_file: "prompt_always",
10398
10508
  delete_file: "prompt_always",
10399
10509
  shell_execute: "prompt_always",
@@ -10560,8 +10670,8 @@ function getEnvironmentName(configApiConfig) {
10560
10670
  }
10561
10671
 
10562
10672
  // src/utils/contextLoader.ts
10563
- import * as fs12 from "fs";
10564
- import * as path14 from "path";
10673
+ import * as fs13 from "fs";
10674
+ import * as path15 from "path";
10565
10675
  import { homedir as homedir4 } from "os";
10566
10676
  var CONTEXT_FILE_SIZE_LIMIT = 100 * 1024;
10567
10677
  var PROJECT_CONTEXT_FILES = [
@@ -10582,9 +10692,9 @@ function formatFileSize2(bytes) {
10582
10692
  return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
10583
10693
  }
10584
10694
  function tryReadContextFile(dir, filename, source) {
10585
- const filePath = path14.join(dir, filename);
10695
+ const filePath = path15.join(dir, filename);
10586
10696
  try {
10587
- const stats = fs12.lstatSync(filePath);
10697
+ const stats = fs13.lstatSync(filePath);
10588
10698
  if (stats.isDirectory()) {
10589
10699
  return null;
10590
10700
  }
@@ -10598,7 +10708,7 @@ function tryReadContextFile(dir, filename, source) {
10598
10708
  error: `${source === "global" ? "Global" : "Project"} ${filename} exceeds 100KB limit (${formatFileSize2(stats.size)})`
10599
10709
  };
10600
10710
  }
10601
- const content = fs12.readFileSync(filePath, "utf-8");
10711
+ const content = fs13.readFileSync(filePath, "utf-8");
10602
10712
  return {
10603
10713
  filename,
10604
10714
  content,
@@ -10650,7 +10760,7 @@ ${project.content}`;
10650
10760
  }
10651
10761
  async function loadContextFiles(projectDir) {
10652
10762
  const errors = [];
10653
- const globalDir = path14.join(homedir4(), ".bike4mind");
10763
+ const globalDir = path15.join(homedir4(), ".bike4mind");
10654
10764
  const projectDirectory = projectDir || process.cwd();
10655
10765
  const [globalResult, projectResult] = await Promise.all([
10656
10766
  Promise.resolve(findContextFile(globalDir, GLOBAL_CONTEXT_FILES, "global")),
@@ -10686,8 +10796,8 @@ function substituteArguments(template, args) {
10686
10796
  // ../../b4m-core/packages/mcp/dist/src/client.js
10687
10797
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
10688
10798
  import { Client as Client2 } from "@modelcontextprotocol/sdk/client/index.js";
10689
- import path15 from "path";
10690
- import { existsSync as existsSync8, readdirSync as readdirSync3 } from "fs";
10799
+ import path16 from "path";
10800
+ import { existsSync as existsSync9, readdirSync as readdirSync3 } from "fs";
10691
10801
  var MCPClient = class {
10692
10802
  // Note: This class handles MCP server communication with repository filtering
10693
10803
  mcp;
@@ -10727,18 +10837,18 @@ var MCPClient = class {
10727
10837
  const root = process.env.INIT_CWD || process.cwd();
10728
10838
  const candidatePaths = [
10729
10839
  // When running from SST Lambda with node_modules structure (copyFiles)
10730
- path15.join(root, `node_modules/@bike4mind/mcp/dist/src/${this.serverName}/index.js`),
10840
+ path16.join(root, `node_modules/@bike4mind/mcp/dist/src/${this.serverName}/index.js`),
10731
10841
  // When running from SST Lambda deployed environment (/var/task)
10732
- path15.join(root, `b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10842
+ path16.join(root, `b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10733
10843
  // When running from SST Lambda (.sst/artifacts/mcpHandler-dev), navigate to monorepo root (3 levels up)
10734
- path15.join(root, `../../../b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10844
+ path16.join(root, `../../../b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10735
10845
  // When running from packages/client (Next.js app), navigate to monorepo root (2 levels up)
10736
- path15.join(root, `../../b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10846
+ path16.join(root, `../../b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10737
10847
  // Original paths (backward compatibility)
10738
- path15.join(root, `/b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10739
- path15.join(root, "core", "mcp", "servers", this.serverName, "dist", "index.js")
10848
+ path16.join(root, `/b4m-core/packages/mcp/dist/src/${this.serverName}/index.js`),
10849
+ path16.join(root, "core", "mcp", "servers", this.serverName, "dist", "index.js")
10740
10850
  ];
10741
- const serverScriptPath = candidatePaths.find((p) => existsSync8(p));
10851
+ const serverScriptPath = candidatePaths.find((p) => existsSync9(p));
10742
10852
  if (!serverScriptPath) {
10743
10853
  const getDirectories = (source) => readdirSync3(source, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
10744
10854
  console.error(`[MCP] Server script not found. Tried paths:`, candidatePaths);
@@ -11548,7 +11658,7 @@ import { isAxiosError as isAxiosError2 } from "axios";
11548
11658
  // package.json
11549
11659
  var package_default = {
11550
11660
  name: "@bike4mind/cli",
11551
- version: "0.2.11-feat-secops-packages-check.17324+a30b7d649",
11661
+ version: "0.2.11-feat-api-key-rate-limiting.17328+476e364c5",
11552
11662
  type: "module",
11553
11663
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
11554
11664
  license: "UNLICENSED",
@@ -11652,10 +11762,10 @@ var package_default = {
11652
11762
  },
11653
11763
  devDependencies: {
11654
11764
  "@bike4mind/agents": "0.1.0",
11655
- "@bike4mind/common": "2.40.1-feat-secops-packages-check.17324+a30b7d649",
11656
- "@bike4mind/mcp": "1.20.5-feat-secops-packages-check.17324+a30b7d649",
11657
- "@bike4mind/services": "2.35.1-feat-secops-packages-check.17324+a30b7d649",
11658
- "@bike4mind/utils": "2.1.5-feat-secops-packages-check.17324+a30b7d649",
11765
+ "@bike4mind/common": "2.40.1-feat-api-key-rate-limiting.17328+476e364c5",
11766
+ "@bike4mind/mcp": "1.20.5-feat-api-key-rate-limiting.17328+476e364c5",
11767
+ "@bike4mind/services": "2.35.1-feat-api-key-rate-limiting.17328+476e364c5",
11768
+ "@bike4mind/utils": "2.1.5-feat-api-key-rate-limiting.17328+476e364c5",
11659
11769
  "@types/better-sqlite3": "^7.6.13",
11660
11770
  "@types/diff": "^5.0.9",
11661
11771
  "@types/jsonwebtoken": "^9.0.4",
@@ -11668,7 +11778,7 @@ var package_default = {
11668
11778
  typescript: "^5.9.3",
11669
11779
  vitest: "^3.2.4"
11670
11780
  },
11671
- gitHead: "a30b7d6498f01e216154845b33550563e8dc85df"
11781
+ gitHead: "476e364c5486a9f154f1b3fb67d4dc77cbcc34ee"
11672
11782
  };
11673
11783
 
11674
11784
  // src/config/constants.ts
@@ -11910,6 +12020,7 @@ Focus on:
11910
12020
  - Creating logical sequence of steps
11911
12021
  - Estimating scope and priorities
11912
12022
 
12023
+ You have read-only access to analyze code.
11913
12024
  You can explore the codebase to understand the current architecture before planning.
11914
12025
 
11915
12026
  Provide a structured plan that the main agent can execute.`,
@@ -12376,20 +12487,38 @@ Remember: Use context from previous messages to understand follow-up questions.$
12376
12487
  const lastIdx = pendingMessages.length - 1;
12377
12488
  if (lastIdx >= 0 && pendingMessages[lastIdx].role === "assistant") {
12378
12489
  const existingSteps = pendingMessages[lastIdx].metadata?.steps || [];
12490
+ const MAX_INPUT_LENGTH = 500;
12491
+ let truncatedStep = step;
12492
+ if (step.type === "action" && step.metadata?.toolInput) {
12493
+ const inputStr = typeof step.metadata.toolInput === "string" ? step.metadata.toolInput : JSON.stringify(step.metadata.toolInput);
12494
+ if (inputStr.length > MAX_INPUT_LENGTH) {
12495
+ const truncatedInput = inputStr.slice(0, MAX_INPUT_LENGTH) + `... (${inputStr.length - MAX_INPUT_LENGTH} more chars)`;
12496
+ truncatedStep = {
12497
+ ...step,
12498
+ metadata: {
12499
+ ...step.metadata,
12500
+ toolInput: truncatedInput
12501
+ }
12502
+ };
12503
+ }
12504
+ }
12379
12505
  updatePendingMessage(lastIdx, {
12380
12506
  ...pendingMessages[lastIdx],
12381
12507
  metadata: {
12382
12508
  ...pendingMessages[lastIdx].metadata,
12383
- steps: [...existingSteps, step]
12509
+ steps: [...existingSteps, truncatedStep]
12384
12510
  }
12385
12511
  });
12386
12512
  }
12387
12513
  };
12514
+ agent.on("thought", stepHandler);
12388
12515
  agent.on("action", stepHandler);
12389
12516
  orchestrator.setBeforeRunCallback((subagent, _subagentType) => {
12517
+ subagent.on("thought", stepHandler);
12390
12518
  subagent.on("action", stepHandler);
12391
12519
  });
12392
12520
  orchestrator.setAfterRunCallback((subagent, _subagentType) => {
12521
+ subagent.off("thought", stepHandler);
12393
12522
  subagent.off("action", stepHandler);
12394
12523
  });
12395
12524
  setState((prev) => ({
@@ -12458,6 +12587,7 @@ Remember: Use context from previous messages to understand follow-up questions.$
12458
12587
  }
12459
12588
  }
12460
12589
  };
12590
+ state.agent.on("thought", stepHandler);
12461
12591
  state.agent.on("action", stepHandler);
12462
12592
  try {
12463
12593
  let messageContent = fullTemplate;
@@ -12579,6 +12709,7 @@ Remember: Use context from previous messages to understand follow-up questions.$
12579
12709
  setState((prev) => ({ ...prev, session: sessionWithError }));
12580
12710
  setStoreSession(sessionWithError);
12581
12711
  } finally {
12712
+ state.agent.off("thought", stepHandler);
12582
12713
  state.agent.off("action", stepHandler);
12583
12714
  }
12584
12715
  };
@@ -12900,7 +13031,6 @@ Custom Commands:
12900
13031
  logger.debug("=== Session Resumed ===");
12901
13032
  setState((prev) => ({ ...prev, session: loadedSession }));
12902
13033
  setStoreSession(loadedSession);
12903
- useCliStore.getState().clearAgentSteps();
12904
13034
  useCliStore.getState().clearPendingMessages();
12905
13035
  usageCache = null;
12906
13036
  console.log(`
@@ -13136,7 +13266,6 @@ Custom Commands:
13136
13266
  logger.debug("=== New Session Started via /clear ===");
13137
13267
  setState((prev) => ({ ...prev, session: newSession }));
13138
13268
  setStoreSession(newSession);
13139
- useCliStore.getState().clearAgentSteps();
13140
13269
  useCliStore.getState().clearPendingMessages();
13141
13270
  usageCache = null;
13142
13271
  console.log("New session started.");
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CurationArtifactType
4
- } from "./chunk-3OX632TE.js";
4
+ } from "./chunk-332RE6EY.js";
5
5
  import "./chunk-PDX44BCA.js";
6
6
 
7
7
  // ../../b4m-core/packages/services/dist/src/notebookCurationService/llmMarkdownGenerator.js
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CurationArtifactType
4
- } from "./chunk-3OX632TE.js";
4
+ } from "./chunk-332RE6EY.js";
5
5
  import "./chunk-PDX44BCA.js";
6
6
 
7
7
  // ../../b4m-core/packages/services/dist/src/notebookCurationService/markdownGenerator.js
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  findMostSimilarMemento,
4
4
  getRelevantMementos
5
- } from "./chunk-7JR6VASX.js";
6
- import "./chunk-JYH72REB.js";
5
+ } from "./chunk-BFO3VHFZ.js";
6
+ import "./chunk-XYK5DZUN.js";
7
7
  import "./chunk-AMDXHL6S.js";
8
- import "./chunk-3OX632TE.js";
8
+ import "./chunk-332RE6EY.js";
9
9
  import "./chunk-PDX44BCA.js";
10
10
  export {
11
11
  findMostSimilarMemento,
@@ -120,7 +120,7 @@ import {
120
120
  validateMermaidSyntax,
121
121
  warmUpSettingsCache,
122
122
  withRetry
123
- } from "./chunk-JYH72REB.js";
123
+ } from "./chunk-XYK5DZUN.js";
124
124
  import {
125
125
  Logger,
126
126
  NotificationDeduplicator,
@@ -129,7 +129,7 @@ import {
129
129
  postLowCreditsNotificationToSlack,
130
130
  postMessageToSlack
131
131
  } from "./chunk-AMDXHL6S.js";
132
- import "./chunk-3OX632TE.js";
132
+ import "./chunk-332RE6EY.js";
133
133
  import "./chunk-PDX44BCA.js";
134
134
  export {
135
135
  AWSBackend,
@@ -40,6 +40,7 @@ import {
40
40
  CitableSourceSchema,
41
41
  ClaudeArtifactMimeTypes,
42
42
  CollectionType,
43
+ CompletionApiUsageTransaction,
43
44
  CompletionRequestSchema,
44
45
  ConfluenceApi,
45
46
  CreateFabFileRequestInput,
@@ -293,7 +294,7 @@ import {
293
294
  validateQuestMasterArtifactV2,
294
295
  validateReactArtifactV2,
295
296
  validateSvgArtifactV2
296
- } from "./chunk-3OX632TE.js";
297
+ } from "./chunk-332RE6EY.js";
297
298
  import "./chunk-PDX44BCA.js";
298
299
  export {
299
300
  ALL_IMAGE_MODELS,
@@ -336,6 +337,7 @@ export {
336
337
  CitableSourceSchema,
337
338
  ClaudeArtifactMimeTypes,
338
339
  CollectionType,
340
+ CompletionApiUsageTransaction,
339
341
  CompletionRequestSchema,
340
342
  ConfluenceApi,
341
343
  CreateFabFileRequestInput,
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  SubtractCreditsSchema,
4
4
  subtractCredits
5
- } from "./chunk-7ORA6KGN.js";
6
- import "./chunk-JYH72REB.js";
5
+ } from "./chunk-IEDWDSMG.js";
6
+ import "./chunk-XYK5DZUN.js";
7
7
  import "./chunk-AMDXHL6S.js";
8
- import "./chunk-3OX632TE.js";
8
+ import "./chunk-332RE6EY.js";
9
9
  import "./chunk-PDX44BCA.js";
10
10
  export {
11
11
  SubtractCreditsSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.11-feat-secops-packages-check.17324+a30b7d649",
3
+ "version": "0.2.11-feat-api-key-rate-limiting.17328+476e364c5",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -104,10 +104,10 @@
104
104
  },
105
105
  "devDependencies": {
106
106
  "@bike4mind/agents": "0.1.0",
107
- "@bike4mind/common": "2.40.1-feat-secops-packages-check.17324+a30b7d649",
108
- "@bike4mind/mcp": "1.20.5-feat-secops-packages-check.17324+a30b7d649",
109
- "@bike4mind/services": "2.35.1-feat-secops-packages-check.17324+a30b7d649",
110
- "@bike4mind/utils": "2.1.5-feat-secops-packages-check.17324+a30b7d649",
107
+ "@bike4mind/common": "2.40.1-feat-api-key-rate-limiting.17328+476e364c5",
108
+ "@bike4mind/mcp": "1.20.5-feat-api-key-rate-limiting.17328+476e364c5",
109
+ "@bike4mind/services": "2.35.1-feat-api-key-rate-limiting.17328+476e364c5",
110
+ "@bike4mind/utils": "2.1.5-feat-api-key-rate-limiting.17328+476e364c5",
111
111
  "@types/better-sqlite3": "^7.6.13",
112
112
  "@types/diff": "^5.0.9",
113
113
  "@types/jsonwebtoken": "^9.0.4",
@@ -120,5 +120,5 @@
120
120
  "typescript": "^5.9.3",
121
121
  "vitest": "^3.2.4"
122
122
  },
123
- "gitHead": "a30b7d6498f01e216154845b33550563e8dc85df"
123
+ "gitHead": "476e364c5486a9f154f1b3fb67d4dc77cbcc34ee"
124
124
  }