@bike4mind/cli 0.2.60-fix-bfl-422-null-params.21650 → 0.2.60-fix-7468-stream-idle-timeout-json-parse.21653

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.
@@ -3394,6 +3394,16 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3394
3394
  if (idleTimer)
3395
3395
  clearTimeout(idleTimer);
3396
3396
  }
3397
+ if (isIdleTimeout) {
3398
+ this.logger.error("[AnthropicBackend] Stream ended after idle timeout - rejecting to avoid processing partial data", {
3399
+ model,
3400
+ toolCount: options.tools?.length || 0,
3401
+ idleTimeoutMs: idleTimeoutMsForError,
3402
+ funcEntries: func.filter((f) => f?.name).length
3403
+ });
3404
+ reject(new Error(`Anthropic API stream timeout - no response received within ${idleTimeoutMsForError / 1e3} seconds. The model may be overloaded. Try simplifying your request or using fewer tools.`));
3405
+ return;
3406
+ }
3397
3407
  if (this.isThinkingEnabled && collectedContent.length > 0) {
3398
3408
  this.lastAssistantContent = collectedContent.filter((c) => c != null);
3399
3409
  }
@@ -3474,16 +3484,18 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3474
3484
  const toolFn = toolDef?.toolFn;
3475
3485
  const isMcpTool = toolDef?._isMcpTool ?? false;
3476
3486
  if (name && toolFn) {
3487
+ const parsedParams = this.tryParseToolParams(parameters, { id, name, model, isMcpTool, streaming: true }, messages);
3488
+ if (!parsedParams)
3489
+ continue;
3477
3490
  this.logger.info("[Tool Execution] Executing tool", {
3478
3491
  model,
3479
3492
  toolName: name,
3480
3493
  isMcpTool,
3481
3494
  toolCallIteration: toolCallCount + 1,
3482
- parameterKeys: Object.keys(JSON.parse(parameters))
3495
+ parameterKeys: Object.keys(parsedParams)
3483
3496
  });
3484
3497
  const toolStartTime = Date.now();
3485
3498
  try {
3486
- const parsedParams = JSON.parse(parameters);
3487
3499
  const result = await toolFn(parsedParams);
3488
3500
  const resultStr = result.toString();
3489
3501
  const toolDuration = Date.now() - toolStartTime;
@@ -3502,7 +3514,7 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3502
3514
  toolsUsed
3503
3515
  });
3504
3516
  });
3505
- const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
3517
+ const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
3506
3518
  this.pushToolMessages(messages, { id: toolId, name, parameters }, resultStr);
3507
3519
  } catch (error) {
3508
3520
  const toolDuration = Date.now() - toolStartTime;
@@ -3516,7 +3528,7 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3516
3528
  durationMs: toolDuration,
3517
3529
  error: error instanceof Error ? error.message : "Unknown error"
3518
3530
  });
3519
- const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
3531
+ const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
3520
3532
  this.pushToolMessages(messages, { id: toolId, name, parameters }, `Error processing ${name} tool: ${error instanceof Error ? error.message : "Unknown error"}`);
3521
3533
  }
3522
3534
  } else if (name && !toolFn) {
@@ -3624,16 +3636,18 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3624
3636
  const toolFn = toolDef?.toolFn;
3625
3637
  const isMcpTool = toolDef?._isMcpTool ?? false;
3626
3638
  if (name && toolFn) {
3639
+ const parsedParams = this.tryParseToolParams(parameters, { id, name, model, isMcpTool, streaming: false }, messages);
3640
+ if (!parsedParams)
3641
+ continue;
3627
3642
  this.logger.info("[Tool Execution] Executing tool (non-streaming)", {
3628
3643
  model,
3629
3644
  toolName: name,
3630
3645
  isMcpTool,
3631
3646
  toolCallIteration: toolCallCount + 1,
3632
- parameterKeys: Object.keys(JSON.parse(parameters))
3647
+ parameterKeys: Object.keys(parsedParams)
3633
3648
  });
3634
3649
  const toolStartTime = Date.now();
3635
3650
  try {
3636
- const parsedParams = JSON.parse(parameters);
3637
3651
  const result = await toolFn(parsedParams);
3638
3652
  const resultStr = result.toString();
3639
3653
  const toolDuration = Date.now() - toolStartTime;
@@ -3648,7 +3662,7 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3648
3662
  await handleToolResultStreaming(name, result, async (results) => {
3649
3663
  await cb(results, { toolsUsed });
3650
3664
  });
3651
- const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
3665
+ const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
3652
3666
  this.pushToolMessages(messages, { id: toolId, name, parameters }, resultStr);
3653
3667
  } catch (error) {
3654
3668
  const toolDuration = Date.now() - toolStartTime;
@@ -3662,7 +3676,7 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3662
3676
  durationMs: toolDuration,
3663
3677
  error: error instanceof Error ? error.message : "Unknown error"
3664
3678
  });
3665
- const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
3679
+ const toolId = id || `tool_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
3666
3680
  this.pushToolMessages(messages, { id: toolId, name, parameters }, `Error processing ${name} tool: ${error instanceof Error ? error.message : "Unknown error"}`);
3667
3681
  }
3668
3682
  } else if (name && !toolFn) {
@@ -3755,6 +3769,28 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3755
3769
  };
3756
3770
  });
3757
3771
  }
3772
+ /**
3773
+ * Attempt to parse tool parameters JSON. On failure, logs the error and pushes
3774
+ * a descriptive error as the tool result so the model can retry.
3775
+ * Returns parsed params on success, or null to signal the caller should skip execution.
3776
+ */
3777
+ tryParseToolParams(parameters, context, messages) {
3778
+ try {
3779
+ return JSON.parse(parameters);
3780
+ } catch (parseError) {
3781
+ const label = context.streaming ? "streaming" : "non-streaming";
3782
+ this.logger.error(`[Tool Execution] Invalid tool parameters - skipping execution (${label})`, {
3783
+ model: context.model,
3784
+ toolName: context.name,
3785
+ isMcpTool: context.isMcpTool,
3786
+ parametersPreview: parameters.substring(0, 100),
3787
+ error: parseError instanceof Error ? parseError.message : String(parseError)
3788
+ });
3789
+ const toolId = context.id || `tool_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
3790
+ this.pushToolMessages(messages, { id: toolId, name: context.name, parameters: "{}" }, `Error: Tool parameters were corrupted due to a stream interruption. Please retry.`);
3791
+ return null;
3792
+ }
3793
+ }
3758
3794
  pushToolMessages(messages, tool, result, thinkingBlocks) {
3759
3795
  if (this.isThinkingEnabled && this.lastAssistantContent.length > 0) {
3760
3796
  messages.push({
@@ -3763,6 +3799,17 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3763
3799
  });
3764
3800
  this.logger.debug(`[AnthropicBackend] Including ${this.lastAssistantContent.length} content blocks (thinking + tool_use) in assistant message`);
3765
3801
  } else if (thinkingBlocks && thinkingBlocks.length > 0) {
3802
+ let parsedInput;
3803
+ try {
3804
+ parsedInput = JSON.parse(tool.parameters || "{}");
3805
+ } catch (parseError) {
3806
+ this.logger.warn("[AnthropicBackend] Failed to parse tool parameters in pushToolMessages, using empty object", {
3807
+ toolName: tool.name,
3808
+ parametersPreview: (tool.parameters || "").substring(0, 100),
3809
+ error: parseError instanceof Error ? parseError.message : String(parseError)
3810
+ });
3811
+ parsedInput = {};
3812
+ }
3766
3813
  messages.push({
3767
3814
  role: "assistant",
3768
3815
  content: [
@@ -3771,12 +3818,23 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3771
3818
  type: "tool_use",
3772
3819
  id: tool.id,
3773
3820
  name: tool.name,
3774
- input: JSON.parse(tool.parameters || "{}")
3821
+ input: parsedInput
3775
3822
  }
3776
3823
  ]
3777
3824
  });
3778
3825
  this.logger.debug(`[AnthropicBackend] Including ${thinkingBlocks.length} explicit thinking blocks in assistant message`);
3779
3826
  } else {
3827
+ let parsedInput;
3828
+ try {
3829
+ parsedInput = JSON.parse(tool.parameters || "{}");
3830
+ } catch (parseError) {
3831
+ this.logger.warn("[AnthropicBackend] Failed to parse tool parameters in pushToolMessages, using empty object", {
3832
+ toolName: tool.name,
3833
+ parametersPreview: (tool.parameters || "").substring(0, 100),
3834
+ error: parseError instanceof Error ? parseError.message : String(parseError)
3835
+ });
3836
+ parsedInput = {};
3837
+ }
3780
3838
  messages.push({
3781
3839
  role: "assistant",
3782
3840
  content: [
@@ -3784,7 +3842,7 @@ IMPORTANT! Only when someone asks, remember that you are specifically the ${mode
3784
3842
  type: "tool_use",
3785
3843
  id: tool.id,
3786
3844
  name: tool.name,
3787
- input: JSON.parse(tool.parameters || "{}")
3845
+ input: parsedInput
3788
3846
  }
3789
3847
  ]
3790
3848
  });
@@ -11366,10 +11424,6 @@ var TestImageService = class extends AIImageService {
11366
11424
  import axios3 from "axios";
11367
11425
  var BFLImageService = class extends AIImageService {
11368
11426
  baseUrl = "https://api.bfl.ai/v1";
11369
- /** Strip null and undefined values from an object to avoid 422 rejections from BFL API */
11370
- stripNullFields(obj) {
11371
- return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null));
11372
- }
11373
11427
  constructor(apiKey, logger, imageProcessorLambdaName) {
11374
11428
  super(apiKey, logger, imageProcessorLambdaName);
11375
11429
  }
@@ -11402,9 +11456,8 @@ var BFLImageService = class extends AIImageService {
11402
11456
  requestBody.height = height;
11403
11457
  }
11404
11458
  }
11405
- const cleanedBody = this.stripNullFields(requestBody);
11406
- console.log("[DEBUG] BFL Image generation request body:", cleanedBody);
11407
- const submitResponse = await axios3.post(`${this.baseUrl}/${model}`, cleanedBody, {
11459
+ console.log("[DEBUG] BFL Image generation request body:", requestBody);
11460
+ const submitResponse = await axios3.post(`${this.baseUrl}/${model}`, requestBody, {
11408
11461
  headers: {
11409
11462
  accept: "application/json",
11410
11463
  "x-key": this.apiKey,
@@ -11438,7 +11491,7 @@ var BFLImageService = class extends AIImageService {
11438
11491
  if (axios3.isAxiosError(error)) {
11439
11492
  console.error("[DEBUG] Axios error details:", {
11440
11493
  status: error.response?.status,
11441
- data: JSON.stringify(error.response?.data, null, 2),
11494
+ data: error.response?.data,
11442
11495
  headers: error.response?.headers,
11443
11496
  endpoint: `${this.baseUrl}/${model}`
11444
11497
  });
@@ -11459,9 +11512,8 @@ var BFLImageService = class extends AIImageService {
11459
11512
  guidance,
11460
11513
  output_format
11461
11514
  };
11462
- const cleanedBody = this.stripNullFields(requestBody);
11463
- console.log("[DEBUG] BFL Image edit request body:", cleanedBody);
11464
- const submitResponse = await axios3.post(`${this.baseUrl}/${model}`, cleanedBody, {
11515
+ console.log("[DEBUG] BFL Image edit request body:", requestBody);
11516
+ const submitResponse = await axios3.post(`${this.baseUrl}/${model}`, requestBody, {
11465
11517
  headers: {
11466
11518
  accept: "application/json",
11467
11519
  "x-key": this.apiKey,
@@ -11489,7 +11541,7 @@ var BFLImageService = class extends AIImageService {
11489
11541
  if (axios3.isAxiosError(error)) {
11490
11542
  console.error("[DEBUG] Axios error details:", {
11491
11543
  status: error.response?.status,
11492
- data: JSON.stringify(error.response?.data, null, 2),
11544
+ data: error.response?.data,
11493
11545
  headers: error.response?.headers,
11494
11546
  endpoint: `${this.baseUrl}/${model}`
11495
11547
  });
@@ -11527,16 +11579,15 @@ var BFLImageService = class extends AIImageService {
11527
11579
  requestBody.aspect_ratio = aspect_ratio;
11528
11580
  console.log(`[DEBUG] \u2705 Added aspect_ratio: ${aspect_ratio} for Kontext model`);
11529
11581
  }
11530
- const cleanedBody = this.stripNullFields(requestBody);
11531
11582
  const safeRequestBody = {
11532
- ...cleanedBody,
11583
+ ...requestBody,
11533
11584
  input_image: `[BASE64_DATA_${requestBody.input_image.length}_CHARS]`
11534
11585
  };
11535
11586
  console.log("[DEBUG] BFL Kontext transformation request body (sanitized):", safeRequestBody);
11536
11587
  const endpoint = `${this.baseUrl}/${model}`;
11537
11588
  console.log(`[DEBUG] Making request to BFL endpoint: ${endpoint}`);
11538
11589
  try {
11539
- const submitResponse = await axios3.post(endpoint, cleanedBody, {
11590
+ const submitResponse = await axios3.post(endpoint, requestBody, {
11540
11591
  headers: {
11541
11592
  accept: "application/json",
11542
11593
  "x-key": this.apiKey,
@@ -11586,7 +11637,7 @@ var BFLImageService = class extends AIImageService {
11586
11637
  if (axios3.isAxiosError(error)) {
11587
11638
  console.error("[DEBUG] Axios error details:", {
11588
11639
  status: error.response?.status,
11589
- data: JSON.stringify(error.response?.data, null, 2),
11640
+ data: error.response?.data,
11590
11641
  headers: error.response?.headers,
11591
11642
  endpoint: `${this.baseUrl}/${model}`
11592
11643
  });
@@ -4,7 +4,7 @@ import {
4
4
  getOpenWeatherKey,
5
5
  getSerperKey,
6
6
  getWolframAlphaKey
7
- } from "./chunk-6PYA7E33.js";
7
+ } from "./chunk-VQOOKWTV.js";
8
8
  import {
9
9
  BFLImageService,
10
10
  BaseStorage,
@@ -16,7 +16,7 @@ import {
16
16
  OpenAIBackend,
17
17
  OpenAIImageService,
18
18
  XAIImageService
19
- } from "./chunk-E5YQBSTA.js";
19
+ } from "./chunk-EJKNCVWO.js";
20
20
  import {
21
21
  Logger
22
22
  } from "./chunk-PFBYGCOW.js";
@@ -6,7 +6,7 @@ import {
6
6
  getSettingsByNames,
7
7
  obfuscateApiKey,
8
8
  secureParameters
9
- } from "./chunk-E5YQBSTA.js";
9
+ } from "./chunk-EJKNCVWO.js";
10
10
  import {
11
11
  ApiKeyType,
12
12
  MementoTier,
@@ -3,7 +3,7 @@
3
3
  // package.json
4
4
  var package_default = {
5
5
  name: "@bike4mind/cli",
6
- version: "0.2.60-fix-bfl-422-null-params.21650+9ebb0d9aa",
6
+ version: "0.2.60-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
7
7
  type: "module",
8
8
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
9
9
  license: "UNLICENSED",
@@ -118,11 +118,11 @@ var package_default = {
118
118
  zustand: "^4.5.4"
119
119
  },
120
120
  devDependencies: {
121
- "@bike4mind/agents": "0.2.4-fix-bfl-422-null-params.21650+9ebb0d9aa",
122
- "@bike4mind/common": "2.72.1-fix-bfl-422-null-params.21650+9ebb0d9aa",
123
- "@bike4mind/mcp": "1.33.18-fix-bfl-422-null-params.21650+9ebb0d9aa",
124
- "@bike4mind/services": "2.67.1-fix-bfl-422-null-params.21650+9ebb0d9aa",
125
- "@bike4mind/utils": "2.15.12-fix-bfl-422-null-params.21650+9ebb0d9aa",
121
+ "@bike4mind/agents": "0.2.4-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
122
+ "@bike4mind/common": "2.72.1-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
123
+ "@bike4mind/mcp": "1.33.18-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
124
+ "@bike4mind/services": "2.67.1-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
125
+ "@bike4mind/utils": "2.15.12-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
126
126
  "@types/better-sqlite3": "^7.6.13",
127
127
  "@types/jsonwebtoken": "^9.0.4",
128
128
  "@types/node": "^22.9.0",
@@ -139,7 +139,7 @@ var package_default = {
139
139
  optionalDependencies: {
140
140
  "@vscode/ripgrep": "^1.17.1"
141
141
  },
142
- gitHead: "9ebb0d9aa4dcb483fd96b2a278352cd5056f15a2"
142
+ gitHead: "abce7291cda874f63c1925536a4bf6f548326f30"
143
143
  };
144
144
 
145
145
  // src/utils/updateChecker.ts
@@ -7,7 +7,7 @@ import {
7
7
  getSettingsMap,
8
8
  getSettingsValue,
9
9
  secureParameters
10
- } from "./chunk-E5YQBSTA.js";
10
+ } from "./chunk-EJKNCVWO.js";
11
11
  import {
12
12
  KnowledgeType,
13
13
  SupportedFabFileMimeTypes
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BadRequestError,
4
4
  secureParameters
5
- } from "./chunk-E5YQBSTA.js";
5
+ } from "./chunk-EJKNCVWO.js";
6
6
  import {
7
7
  CompletionApiUsageTransaction,
8
8
  GenericCreditDeductTransaction,
@@ -3,7 +3,7 @@ import {
3
3
  fetchLatestVersion,
4
4
  forceCheckForUpdate,
5
5
  package_default
6
- } from "../chunk-NAEXHQZQ.js";
6
+ } from "../chunk-XN7L7DV3.js";
7
7
 
8
8
  // src/commands/doctorCommand.ts
9
9
  import { execSync } from "child_process";
@@ -36,13 +36,13 @@ import {
36
36
  isReadOnlyTool,
37
37
  loadContextFiles,
38
38
  setWebSocketToolExecutor
39
- } from "../chunk-TBPKJ7LL.js";
39
+ } from "../chunk-TWNZBSVT.js";
40
40
  import "../chunk-BDQBOLYG.js";
41
- import "../chunk-6PYA7E33.js";
41
+ import "../chunk-VQOOKWTV.js";
42
42
  import "../chunk-GQGOWACU.js";
43
- import "../chunk-YYFDXZTX.js";
44
- import "../chunk-TBNKPTUX.js";
45
- import "../chunk-E5YQBSTA.js";
43
+ import "../chunk-YW2MS7NL.js";
44
+ import "../chunk-YRSSZC5P.js";
45
+ import "../chunk-EJKNCVWO.js";
46
46
  import "../chunk-PFBYGCOW.js";
47
47
  import "../chunk-BPFEGDC7.js";
48
48
  import {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  forceCheckForUpdate,
4
4
  package_default
5
- } from "../chunk-NAEXHQZQ.js";
5
+ } from "../chunk-XN7L7DV3.js";
6
6
 
7
7
  // src/commands/updateCommand.ts
8
8
  import { execSync } from "child_process";
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  createFabFile,
4
4
  createFabFileSchema
5
- } from "./chunk-TBNKPTUX.js";
6
- import "./chunk-E5YQBSTA.js";
5
+ } from "./chunk-YRSSZC5P.js";
6
+ import "./chunk-EJKNCVWO.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-GW7BH2V4.js";
9
9
  export {
package/dist/index.js CHANGED
@@ -48,15 +48,15 @@ import {
48
48
  setWebSocketToolExecutor,
49
49
  substituteArguments,
50
50
  warmFileCache
51
- } from "./chunk-TBPKJ7LL.js";
51
+ } from "./chunk-TWNZBSVT.js";
52
52
  import "./chunk-BDQBOLYG.js";
53
- import "./chunk-6PYA7E33.js";
53
+ import "./chunk-VQOOKWTV.js";
54
54
  import "./chunk-GQGOWACU.js";
55
- import "./chunk-YYFDXZTX.js";
56
- import "./chunk-TBNKPTUX.js";
55
+ import "./chunk-YW2MS7NL.js";
56
+ import "./chunk-YRSSZC5P.js";
57
57
  import {
58
58
  OllamaBackend
59
- } from "./chunk-E5YQBSTA.js";
59
+ } from "./chunk-EJKNCVWO.js";
60
60
  import "./chunk-PFBYGCOW.js";
61
61
  import "./chunk-BPFEGDC7.js";
62
62
  import {
@@ -66,7 +66,7 @@ import {
66
66
  import {
67
67
  checkForUpdate,
68
68
  package_default
69
- } from "./chunk-NAEXHQZQ.js";
69
+ } from "./chunk-XN7L7DV3.js";
70
70
  import {
71
71
  selectActiveBackgroundAgents,
72
72
  useCliStore
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  findMostSimilarMemento,
4
4
  getRelevantMementos
5
- } from "./chunk-6PYA7E33.js";
6
- import "./chunk-E5YQBSTA.js";
5
+ } from "./chunk-VQOOKWTV.js";
6
+ import "./chunk-EJKNCVWO.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-GW7BH2V4.js";
9
9
  export {
@@ -143,7 +143,7 @@ import {
143
143
  validateUrlForFetch,
144
144
  warmUpSettingsCache,
145
145
  withRetry
146
- } from "./chunk-E5YQBSTA.js";
146
+ } from "./chunk-EJKNCVWO.js";
147
147
  import {
148
148
  Logger,
149
149
  NotificationDeduplicator,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  SubtractCreditsSchema,
4
4
  subtractCredits
5
- } from "./chunk-YYFDXZTX.js";
6
- import "./chunk-E5YQBSTA.js";
5
+ } from "./chunk-YW2MS7NL.js";
6
+ import "./chunk-EJKNCVWO.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-GW7BH2V4.js";
9
9
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.60-fix-bfl-422-null-params.21650+9ebb0d9aa",
3
+ "version": "0.2.60-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -115,11 +115,11 @@
115
115
  "zustand": "^4.5.4"
116
116
  },
117
117
  "devDependencies": {
118
- "@bike4mind/agents": "0.2.4-fix-bfl-422-null-params.21650+9ebb0d9aa",
119
- "@bike4mind/common": "2.72.1-fix-bfl-422-null-params.21650+9ebb0d9aa",
120
- "@bike4mind/mcp": "1.33.18-fix-bfl-422-null-params.21650+9ebb0d9aa",
121
- "@bike4mind/services": "2.67.1-fix-bfl-422-null-params.21650+9ebb0d9aa",
122
- "@bike4mind/utils": "2.15.12-fix-bfl-422-null-params.21650+9ebb0d9aa",
118
+ "@bike4mind/agents": "0.2.4-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
119
+ "@bike4mind/common": "2.72.1-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
120
+ "@bike4mind/mcp": "1.33.18-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
121
+ "@bike4mind/services": "2.67.1-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
122
+ "@bike4mind/utils": "2.15.12-fix-7468-stream-idle-timeout-json-parse.21653+abce7291c",
123
123
  "@types/better-sqlite3": "^7.6.13",
124
124
  "@types/jsonwebtoken": "^9.0.4",
125
125
  "@types/node": "^22.9.0",
@@ -136,5 +136,5 @@
136
136
  "optionalDependencies": {
137
137
  "@vscode/ripgrep": "^1.17.1"
138
138
  },
139
- "gitHead": "9ebb0d9aa4dcb483fd96b2a278352cd5056f15a2"
139
+ "gitHead": "abce7291cda874f63c1925536a4bf6f548326f30"
140
140
  }