@bike4mind/cli 0.2.49-fix-cli-stream-resilience-v2.21033 → 0.2.49-fix-telemetry-alert-debug.21031

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.
@@ -4,7 +4,7 @@ import {
4
4
  getOpenWeatherKey,
5
5
  getSerperKey,
6
6
  getWolframAlphaKey
7
- } from "./chunk-7VEI22BF.js";
7
+ } from "./chunk-F6IY547T.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-UDBM5N7V.js";
19
+ } from "./chunk-M7QGYBN7.js";
20
20
  import {
21
21
  Logger
22
22
  } from "./chunk-PFBYGCOW.js";
@@ -14017,25 +14017,40 @@ var AnomalyAlertService = class _AnomalyAlertService {
14017
14017
  * Check if an alert should be sent and send it if appropriate
14018
14018
  */
14019
14019
  async checkAndAlert(telemetry) {
14020
+ console.log("[AnomalyAlert] DEBUG: checkAndAlert called", {
14021
+ enabled: this.config.enabled,
14022
+ isSlackConfigured: this.isSlackConfigured()
14023
+ });
14020
14024
  if (!this.config.enabled || !this.isSlackConfigured()) {
14025
+ console.log("[AnomalyAlert] DEBUG: Early return - not enabled or Slack not configured");
14021
14026
  return false;
14022
14027
  }
14023
14028
  const { anomalies } = telemetry;
14024
14029
  const threshold = this.config.alertThreshold ?? ALERT_THRESHOLDS.warning;
14030
+ console.log("[AnomalyAlert] DEBUG: Threshold check", {
14031
+ anomalyScore: anomalies.anomalyScore,
14032
+ threshold
14033
+ });
14025
14034
  if (anomalies.anomalyScore < threshold) {
14035
+ console.log("[AnomalyAlert] DEBUG: Score below threshold");
14026
14036
  return false;
14027
14037
  }
14038
+ console.log("[AnomalyAlert] DEBUG: Checking deduplication", { dedupKey: anomalies.dedupKey });
14028
14039
  const isDup = await this.checkDeduplication(anomalies.dedupKey);
14040
+ console.log("[AnomalyAlert] DEBUG: Dedup result", { isDup });
14029
14041
  if (isDup) {
14030
14042
  this.logger.info(`\u{1F4CA} [AnomalyAlert] Suppressed duplicate alert: ${anomalies.dedupKey}`);
14031
14043
  return false;
14032
14044
  }
14033
14045
  try {
14046
+ console.log("[AnomalyAlert] DEBUG: Sending Slack alert");
14034
14047
  const message = this.formatSlackMessage(telemetry);
14035
14048
  await this.sendSlackAlert(message);
14036
14049
  this.logger.info(`\u{1F4CA} [AnomalyAlert] Alert sent for ${anomalies.primaryAnomaly} (score: ${anomalies.anomalyScore})`);
14050
+ console.log("[AnomalyAlert] DEBUG: Alert sent successfully");
14037
14051
  return true;
14038
14052
  } catch (error) {
14053
+ console.log("[AnomalyAlert] DEBUG: Failed to send alert", { error: String(error) });
14039
14054
  this.logger.error(`\u{1F4CA} [AnomalyAlert] Failed to send alert:`, error);
14040
14055
  return false;
14041
14056
  }
@@ -16142,48 +16157,17 @@ function extractUsageInfo(parsed) {
16142
16157
  usdCost: parsed.credits?.usdCost
16143
16158
  };
16144
16159
  }
16145
- var ServerLlmBackend = class _ServerLlmBackend {
16160
+ var ServerLlmBackend = class {
16146
16161
  constructor(options) {
16147
16162
  this.completionsEndpoint = "/api/ai/v1/completions";
16148
16163
  this.apiClient = options.apiClient;
16149
16164
  this.currentModel = options.model;
16150
16165
  }
16151
- static {
16152
- /** Max retries for transient stream failures (e.g. missing [DONE]) */
16153
- this.MAX_STREAM_RETRIES = 2;
16154
- }
16155
16166
  /**
16156
16167
  * Make authenticated LLM completion request via server
16157
- * Parses SSE stream and invokes callback for each event.
16158
- * Automatically retries on transient stream failures (e.g. stream ending prematurely).
16168
+ * Parses SSE stream and invokes callback for each event
16159
16169
  */
16160
16170
  async complete(model, messages, options, callback) {
16161
- let lastError;
16162
- for (let attempt = 0; attempt <= _ServerLlmBackend.MAX_STREAM_RETRIES; attempt++) {
16163
- if (attempt > 0) {
16164
- logger.warn(
16165
- `[ServerLlmBackend] Retrying stream (attempt ${attempt + 1}/${_ServerLlmBackend.MAX_STREAM_RETRIES + 1})...`
16166
- );
16167
- }
16168
- try {
16169
- await this.completeOnce(model, messages, options, callback);
16170
- return;
16171
- } catch (error) {
16172
- lastError = error instanceof Error ? error : new Error(String(error));
16173
- const isTransientStreamError = lastError.message.includes("Stream ended prematurely");
16174
- const isAborted = options.abortSignal?.aborted;
16175
- if (!isTransientStreamError || isAborted) {
16176
- throw lastError;
16177
- }
16178
- logger.warn(`[ServerLlmBackend] Transient stream failure: ${lastError.message}`);
16179
- }
16180
- }
16181
- throw lastError ?? new Error("Stream failed after all retry attempts");
16182
- }
16183
- /**
16184
- * Single attempt at completing a streaming request.
16185
- */
16186
- async completeOnce(model, messages, options, callback) {
16187
16171
  logger.debug(`[ServerLlmBackend] Starting complete() with model: ${model}`);
16188
16172
  if (options.abortSignal?.aborted) {
16189
16173
  logger.debug("[ServerLlmBackend] Request aborted before start");
@@ -16384,30 +16368,8 @@ var ServerLlmBackend = class _ServerLlmBackend {
16384
16368
  });
16385
16369
  response.data.on("end", () => {
16386
16370
  if (!receivedDone) {
16387
- const hasAccumulatedData = accumulatedText.trim().length > 0 || toolsUsed.length > 0;
16388
- logger.warn(
16389
- `[ServerLlmBackend] Stream ended without [DONE] signal. Accumulated text: ${accumulatedText.length} chars, tools: ${toolsUsed.length}`
16390
- );
16391
- if (hasAccumulatedData) {
16392
- const cleanedText = stripThinkingBlocks(accumulatedText);
16393
- streamLogger.streamComplete(accumulatedText);
16394
- if (toolsUsed.length > 0) {
16395
- const info = {
16396
- toolsUsed,
16397
- thinking: thinkingBlocks.length > 0 ? thinkingBlocks : void 0,
16398
- ...lastUsageInfo
16399
- };
16400
- callback([cleanedText], info).catch((err) => reject(err)).then(() => resolve3());
16401
- } else if (cleanedText) {
16402
- callback([cleanedText], lastUsageInfo).catch((err) => reject(err)).then(() => resolve3());
16403
- } else {
16404
- resolve3();
16405
- }
16406
- } else {
16407
- reject(
16408
- new Error("Stream ended prematurely without receiving any data. The server may be experiencing issues.")
16409
- );
16410
- }
16371
+ logger.debug("[ServerLlmBackend] Stream ended without [DONE], resolving anyway");
16372
+ resolve3();
16411
16373
  } else {
16412
16374
  logger.debug("[ServerLlmBackend] Stream ended, [DONE] handler will resolve");
16413
16375
  }
@@ -3,7 +3,7 @@
3
3
  // package.json
4
4
  var package_default = {
5
5
  name: "@bike4mind/cli",
6
- version: "0.2.49-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
6
+ version: "0.2.49-fix-telemetry-alert-debug.21031+766fdd35a",
7
7
  type: "module",
8
8
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
9
9
  license: "UNLICENSED",
@@ -118,10 +118,10 @@ var package_default = {
118
118
  },
119
119
  devDependencies: {
120
120
  "@bike4mind/agents": "0.1.0",
121
- "@bike4mind/common": "2.67.1-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
122
- "@bike4mind/mcp": "1.33.11-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
123
- "@bike4mind/services": "2.63.1-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
124
- "@bike4mind/utils": "2.15.4-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
121
+ "@bike4mind/common": "2.67.1-fix-telemetry-alert-debug.21031+766fdd35a",
122
+ "@bike4mind/mcp": "1.33.11-fix-telemetry-alert-debug.21031+766fdd35a",
123
+ "@bike4mind/services": "2.63.1-fix-telemetry-alert-debug.21031+766fdd35a",
124
+ "@bike4mind/utils": "2.15.4-fix-telemetry-alert-debug.21031+766fdd35a",
125
125
  "@types/better-sqlite3": "^7.6.13",
126
126
  "@types/diff": "^5.0.9",
127
127
  "@types/jsonwebtoken": "^9.0.4",
@@ -140,7 +140,7 @@ var package_default = {
140
140
  optionalDependencies: {
141
141
  "@vscode/ripgrep": "^1.17.0"
142
142
  },
143
- gitHead: "6a9f2b5b5ef81c255f95f35bdbdc6339fe2f7c3f"
143
+ gitHead: "766fdd35a8018f32ebf70db963625dcc6ea2d653"
144
144
  };
145
145
 
146
146
  // src/utils/updateChecker.ts
@@ -6,7 +6,7 @@ import {
6
6
  getSettingsByNames,
7
7
  obfuscateApiKey,
8
8
  secureParameters
9
- } from "./chunk-UDBM5N7V.js";
9
+ } from "./chunk-M7QGYBN7.js";
10
10
  import {
11
11
  ApiKeyType,
12
12
  MementoTier,
@@ -6578,57 +6578,6 @@ var GeminiBackend = class {
6578
6578
  // ../../b4m-core/packages/utils/dist/src/llm/ollamaBackend.js
6579
6579
  import { Ollama } from "ollama";
6580
6580
  import { Agent as Agent2 } from "undici";
6581
-
6582
- // ../../b4m-core/packages/utils/dist/src/llm/messageFormatConverter.js
6583
- function convertMessageToOpenAIFormat(msg) {
6584
- if (msg.role === "assistant" && msg.tool_calls) {
6585
- return [
6586
- {
6587
- ...msg,
6588
- content: null,
6589
- tool_calls: msg.tool_calls
6590
- }
6591
- ];
6592
- }
6593
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
6594
- const contentBlocks = msg.content;
6595
- const toolUseBlocks = contentBlocks.filter((b) => b.type === "tool_use");
6596
- if (toolUseBlocks.length > 0) {
6597
- const textParts = contentBlocks.filter((b) => b.type === "text").map((b) => b.text).filter(Boolean);
6598
- return [
6599
- {
6600
- role: "assistant",
6601
- content: textParts.length > 0 ? textParts.join("\n") : null,
6602
- tool_calls: toolUseBlocks.map((b) => ({
6603
- id: b.id,
6604
- type: "function",
6605
- function: {
6606
- name: b.name,
6607
- arguments: typeof b.input === "string" ? b.input : JSON.stringify(b.input)
6608
- }
6609
- }))
6610
- }
6611
- ];
6612
- }
6613
- }
6614
- if (msg.role === "user" && Array.isArray(msg.content)) {
6615
- const contentBlocks = msg.content;
6616
- const toolResultBlocks = contentBlocks.filter((b) => b.type === "tool_result");
6617
- if (toolResultBlocks.length > 0) {
6618
- return toolResultBlocks.map((b) => ({
6619
- role: "tool",
6620
- content: typeof b.content === "string" ? b.content : JSON.stringify(b.content),
6621
- tool_call_id: b.tool_use_id
6622
- }));
6623
- }
6624
- }
6625
- return [msg];
6626
- }
6627
- function convertMessagesToOpenAIFormat(messages) {
6628
- return messages.flatMap(convertMessageToOpenAIFormat);
6629
- }
6630
-
6631
- // ../../b4m-core/packages/utils/dist/src/llm/ollamaBackend.js
6632
6581
  var OllamaBackend = class {
6633
6582
  _host;
6634
6583
  _api;
@@ -6792,12 +6741,9 @@ var OllamaBackend = class {
6792
6741
  /**
6793
6742
  * Map IMessage[] to Ollama's Message[], preserving tool_calls for multi-turn
6794
6743
  * tool conversations (added by pushToolMessages).
6795
- * First converts B4M standard format (tool_use/tool_result) to OpenAI-compatible
6796
- * format since Ollama uses the same tool_calls/role:tool convention.
6797
6744
  */
6798
6745
  buildMessages(messages) {
6799
- const converted = convertMessagesToOpenAIFormat(messages);
6800
- return converted.map((msg) => {
6746
+ return messages.map((msg) => {
6801
6747
  const raw = msg;
6802
6748
  const mapped = {
6803
6749
  role: msg.role,
@@ -7891,8 +7837,16 @@ Only when someone asks, remember that you are specifically the ${model} model.`;
7891
7837
  role: "system",
7892
7838
  content: systemContent
7893
7839
  };
7894
- const convertedMessages = convertMessagesToOpenAIFormat(filteredMessages);
7895
- const formattedMessages = convertedMessages;
7840
+ const formattedMessages = filteredMessages.map((msg) => {
7841
+ if (msg.role === "assistant" && msg.tool_calls) {
7842
+ return {
7843
+ ...msg,
7844
+ content: null,
7845
+ tool_calls: msg.tool_calls
7846
+ };
7847
+ }
7848
+ return msg;
7849
+ });
7896
7850
  return isO1Model ? formattedMessages : [systemMessage, ...formattedMessages];
7897
7851
  }
7898
7852
  pushToolMessages(messages, tool, result, _thinkingBlocks) {
@@ -8415,7 +8369,17 @@ var XAIBackend = class {
8415
8369
  }
8416
8370
  }
8417
8371
  formatMessages(messages) {
8418
- return convertMessagesToOpenAIFormat(messages);
8372
+ const formattedMessages = messages.map((msg) => {
8373
+ if (msg.role === "assistant" && msg.tool_calls) {
8374
+ return {
8375
+ ...msg,
8376
+ content: null,
8377
+ tool_calls: msg.tool_calls
8378
+ };
8379
+ }
8380
+ return msg;
8381
+ });
8382
+ return formattedMessages;
8419
8383
  }
8420
8384
  formatTools(tools = []) {
8421
8385
  return tools.map((tool) => ({
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BadRequestError,
4
4
  secureParameters
5
- } from "./chunk-UDBM5N7V.js";
5
+ } from "./chunk-M7QGYBN7.js";
6
6
  import {
7
7
  CompletionApiUsageTransaction,
8
8
  GenericCreditDeductTransaction,
@@ -7,7 +7,7 @@ import {
7
7
  getSettingsMap,
8
8
  getSettingsValue,
9
9
  secureParameters
10
- } from "./chunk-UDBM5N7V.js";
10
+ } from "./chunk-M7QGYBN7.js";
11
11
  import {
12
12
  KnowledgeType,
13
13
  SupportedFabFileMimeTypes
@@ -3,7 +3,7 @@ import {
3
3
  fetchLatestVersion,
4
4
  forceCheckForUpdate,
5
5
  package_default
6
- } from "../chunk-AINGID72.js";
6
+ } from "../chunk-5SZI2XFM.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-2WNNPZZS.js";
39
+ } from "../chunk-4ZO5RNWO.js";
40
40
  import "../chunk-BDQBOLYG.js";
41
- import "../chunk-7VEI22BF.js";
41
+ import "../chunk-F6IY547T.js";
42
42
  import "../chunk-GQGOWACU.js";
43
- import "../chunk-X26VCD3A.js";
44
- import "../chunk-MP3FYWMR.js";
45
- import "../chunk-UDBM5N7V.js";
43
+ import "../chunk-OFKZXY6L.js";
44
+ import "../chunk-WKPO5JDF.js";
45
+ import "../chunk-M7QGYBN7.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-AINGID72.js";
5
+ } from "../chunk-5SZI2XFM.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-MP3FYWMR.js";
6
- import "./chunk-UDBM5N7V.js";
5
+ } from "./chunk-WKPO5JDF.js";
6
+ import "./chunk-M7QGYBN7.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-QLY3LGPA.js";
9
9
  export {
package/dist/index.js CHANGED
@@ -46,15 +46,15 @@ import {
46
46
  setWebSocketToolExecutor,
47
47
  substituteArguments,
48
48
  warmFileCache
49
- } from "./chunk-2WNNPZZS.js";
49
+ } from "./chunk-4ZO5RNWO.js";
50
50
  import "./chunk-BDQBOLYG.js";
51
- import "./chunk-7VEI22BF.js";
51
+ import "./chunk-F6IY547T.js";
52
52
  import "./chunk-GQGOWACU.js";
53
- import "./chunk-X26VCD3A.js";
54
- import "./chunk-MP3FYWMR.js";
53
+ import "./chunk-OFKZXY6L.js";
54
+ import "./chunk-WKPO5JDF.js";
55
55
  import {
56
56
  OllamaBackend
57
- } from "./chunk-UDBM5N7V.js";
57
+ } from "./chunk-M7QGYBN7.js";
58
58
  import "./chunk-PFBYGCOW.js";
59
59
  import "./chunk-BPFEGDC7.js";
60
60
  import {
@@ -64,7 +64,7 @@ import {
64
64
  import {
65
65
  checkForUpdate,
66
66
  package_default
67
- } from "./chunk-AINGID72.js";
67
+ } from "./chunk-5SZI2XFM.js";
68
68
  import {
69
69
  selectActiveBackgroundAgents,
70
70
  useCliStore
@@ -2940,10 +2940,11 @@ function CliApp() {
2940
2940
  throw new Error("No websocketUrl or wsCompletionUrl in server config");
2941
2941
  }
2942
2942
  } catch (wsError) {
2943
- logger.info("\u26A0\uFE0F WebSocket unavailable, using SSE fallback");
2944
- logger.debug(`[WebSocket] Fallback reason: ${wsError instanceof Error ? wsError.message : String(wsError)}`);
2943
+ console.error(
2944
+ `\u26A0\uFE0F WebSocket unavailable, using SSE fallback: ${wsError instanceof Error ? wsError.message : String(wsError)}`
2945
+ );
2945
2946
  if (wsError instanceof Error && wsError.stack) {
2946
- logger.debug(`[WebSocket] Stack: ${wsError.stack}`);
2947
+ console.error(wsError.stack);
2947
2948
  }
2948
2949
  wsManager = null;
2949
2950
  setWebSocketToolExecutor(null);
@@ -3727,11 +3728,7 @@ Pull a model: ollama pull qwen3.5`
3727
3728
  return;
3728
3729
  }
3729
3730
  }
3730
- const errorMessage = error instanceof Error ? error.message : String(error);
3731
- console.error(`
3732
- \u274C ${errorMessage}
3733
- `);
3734
- logger.debug(`Full error details: ${error instanceof Error ? error.stack || error.message : String(error)}`);
3731
+ console.error("Error processing message:", error);
3735
3732
  } finally {
3736
3733
  setState((prev) => ({ ...prev, abortController: null }));
3737
3734
  useCliStore.getState().setIsThinking(false);
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  findMostSimilarMemento,
4
4
  getRelevantMementos
5
- } from "./chunk-7VEI22BF.js";
6
- import "./chunk-UDBM5N7V.js";
5
+ } from "./chunk-F6IY547T.js";
6
+ import "./chunk-M7QGYBN7.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-QLY3LGPA.js";
9
9
  export {
@@ -143,7 +143,7 @@ import {
143
143
  validateUrlForFetch,
144
144
  warmUpSettingsCache,
145
145
  withRetry
146
- } from "./chunk-UDBM5N7V.js";
146
+ } from "./chunk-M7QGYBN7.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-X26VCD3A.js";
6
- import "./chunk-UDBM5N7V.js";
5
+ } from "./chunk-OFKZXY6L.js";
6
+ import "./chunk-M7QGYBN7.js";
7
7
  import "./chunk-PFBYGCOW.js";
8
8
  import "./chunk-QLY3LGPA.js";
9
9
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.49-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
3
+ "version": "0.2.49-fix-telemetry-alert-debug.21031+766fdd35a",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -115,10 +115,10 @@
115
115
  },
116
116
  "devDependencies": {
117
117
  "@bike4mind/agents": "0.1.0",
118
- "@bike4mind/common": "2.67.1-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
119
- "@bike4mind/mcp": "1.33.11-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
120
- "@bike4mind/services": "2.63.1-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
121
- "@bike4mind/utils": "2.15.4-fix-cli-stream-resilience-v2.21033+6a9f2b5b5",
118
+ "@bike4mind/common": "2.67.1-fix-telemetry-alert-debug.21031+766fdd35a",
119
+ "@bike4mind/mcp": "1.33.11-fix-telemetry-alert-debug.21031+766fdd35a",
120
+ "@bike4mind/services": "2.63.1-fix-telemetry-alert-debug.21031+766fdd35a",
121
+ "@bike4mind/utils": "2.15.4-fix-telemetry-alert-debug.21031+766fdd35a",
122
122
  "@types/better-sqlite3": "^7.6.13",
123
123
  "@types/diff": "^5.0.9",
124
124
  "@types/jsonwebtoken": "^9.0.4",
@@ -137,5 +137,5 @@
137
137
  "optionalDependencies": {
138
138
  "@vscode/ripgrep": "^1.17.0"
139
139
  },
140
- "gitHead": "6a9f2b5b5ef81c255f95f35bdbdc6339fe2f7c3f"
140
+ "gitHead": "766fdd35a8018f32ebf70db963625dcc6ea2d653"
141
141
  }