@bike4mind/cli 0.2.15 → 0.2.16-block-missing-tool-result.17608

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.
File without changes
File without changes
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BadRequestError,
4
4
  secureParameters
5
- } from "./chunk-M2CSCYOY.js";
5
+ } from "./chunk-W2GB4FA6.js";
6
6
  import {
7
7
  CompletionApiUsageTransaction,
8
8
  GenericCreditDeductTransaction,
File without changes
File without changes
File without changes
@@ -7,7 +7,7 @@ import {
7
7
  getSettingsMap,
8
8
  getSettingsValue,
9
9
  secureParameters
10
- } from "./chunk-M2CSCYOY.js";
10
+ } from "./chunk-W2GB4FA6.js";
11
11
  import {
12
12
  KnowledgeType,
13
13
  SupportedFabFileMimeTypes
@@ -6,7 +6,7 @@ import {
6
6
  getSettingsByNames,
7
7
  obfuscateApiKey,
8
8
  secureParameters
9
- } from "./chunk-M2CSCYOY.js";
9
+ } from "./chunk-W2GB4FA6.js";
10
10
  import {
11
11
  ApiKeyType,
12
12
  MementoTier,
File without changes
File without changes
@@ -6515,30 +6515,60 @@ async function buildAndSortMessages(previousMessages, fabMessages, userPrompt, m
6515
6515
  }
6516
6516
  }
6517
6517
  const imageMessages = fabMessages.filter((message) => message.role === "user" && Array.isArray(message.content) && message.content.some((obj) => obj.type.startsWith("image")));
6518
- const messages = [
6519
- ...systemMessages,
6520
- // System messages go first for instruction
6521
- ...processedPreviousMessages,
6522
- // previous message context
6523
- ...imageMessages,
6524
- // Include all image messages
6525
- ...processedContentMessages,
6526
- // fab file content (non-image messages)
6527
- ...userPrompt
6528
- // Spread the userPrompt array into the messages array
6529
- ];
6530
- const finalTokenCount = await calculateTotalTokenLength(messages, { estimateOnly: false, tokenizer });
6531
- if (finalTokenCount > maxInputTokens) {
6532
- logger.warn(`\u26A0\uFE0F Final message token count (${finalTokenCount}) exceeds maxInputTokens (${maxInputTokens}). Truncating messages.`);
6533
- const excessTokens = finalTokenCount - maxInputTokens;
6534
- const reducedContentMessagesResult = processMessages(processedContentMessages, Math.max(0, await calculateTotalTokenLength(processedContentMessages, { estimateOnly: false, tokenizer }) - excessTokens));
6535
- const truncatedMessages = [
6518
+ const lastHistoryMessage = processedPreviousMessages[processedPreviousMessages.length - 1];
6519
+ const historyEndsWithToolUse = lastHistoryMessage?.role === "assistant" && Array.isArray(lastHistoryMessage.content) && lastHistoryMessage.content.some((block) => block.type === "tool_use");
6520
+ const promptHasToolResult = userPrompt.some((msg) => msg.role === "user" && Array.isArray(msg.content) && msg.content.some((block) => block.type === "tool_result"));
6521
+ let messages;
6522
+ if (historyEndsWithToolUse && promptHasToolResult) {
6523
+ messages = [
6524
+ ...systemMessages,
6525
+ // System messages go first for instruction
6526
+ ...processedPreviousMessages,
6527
+ // previous message context
6528
+ ...userPrompt,
6529
+ // Tool result must follow tool use immediately
6530
+ ...imageMessages,
6531
+ // Include all image messages
6532
+ ...processedContentMessages
6533
+ // fab file content (non-image messages)
6534
+ ];
6535
+ } else {
6536
+ messages = [
6536
6537
  ...systemMessages,
6538
+ // System messages go first for instruction
6537
6539
  ...processedPreviousMessages,
6540
+ // previous message context
6538
6541
  ...imageMessages,
6539
- ...reducedContentMessagesResult.messages,
6542
+ // Include all image messages
6543
+ ...processedContentMessages,
6544
+ // fab file content (non-image messages)
6540
6545
  ...userPrompt
6546
+ // Spread the userPrompt array into the messages array
6541
6547
  ];
6548
+ }
6549
+ const finalTokenCount = await calculateTotalTokenLength(messages, { estimateOnly: false, tokenizer });
6550
+ if (finalTokenCount > maxInputTokens) {
6551
+ logger.warn(`\u26A0\uFE0F Final message token count (${finalTokenCount}) exceeds maxInputTokens (${maxInputTokens}). Truncating messages.`);
6552
+ const excessTokens = finalTokenCount - maxInputTokens;
6553
+ const reducedContentMessagesResult = processMessages(processedContentMessages, Math.max(0, await calculateTotalTokenLength(processedContentMessages, { estimateOnly: false, tokenizer }) - excessTokens));
6554
+ let truncatedMessages;
6555
+ if (historyEndsWithToolUse && promptHasToolResult) {
6556
+ truncatedMessages = [
6557
+ ...systemMessages,
6558
+ ...processedPreviousMessages,
6559
+ ...userPrompt,
6560
+ ...imageMessages,
6561
+ ...reducedContentMessagesResult.messages
6562
+ ];
6563
+ } else {
6564
+ truncatedMessages = [
6565
+ ...systemMessages,
6566
+ ...processedPreviousMessages,
6567
+ ...imageMessages,
6568
+ ...reducedContentMessagesResult.messages,
6569
+ ...userPrompt
6570
+ ];
6571
+ }
6542
6572
  return ensureToolPairingIntegrity(truncatedMessages, logger);
6543
6573
  }
6544
6574
  const VERBOSE_MESSAGE_BUILDING = process.env.VERBOSE_MESSAGE_BUILDING === "true";
@@ -8732,8 +8762,20 @@ var QuestMaster = class {
8732
8762
  * @param prompt - The user's request to break down into quests
8733
8763
  * @returns The parsed quest plan result
8734
8764
  */
8735
- async createQuestPlanWithFunctionCalling(model, prompt, retryCount = 0) {
8765
+ async createQuestPlanWithFunctionCalling(model, prompt, planOptions = {}, retryCount = 0) {
8736
8766
  const MAX_RETRIES = 2;
8767
+ const { history = [] } = planOptions;
8768
+ const hasHistory = history.length > 0;
8769
+ const historyContext = hasHistory ? `
8770
+
8771
+ CONVERSATION CONTEXT:
8772
+ You have access to the user's conversation history. Use this context to:
8773
+ - Understand what the user has already discussed or learned
8774
+ - Reference previous decisions or preferences mentioned
8775
+ - Build upon prior context when creating quests
8776
+ - Avoid suggesting steps the user has already completed
8777
+
8778
+ The conversation history is included before the user's current request.` : "";
8737
8779
  const messages = [
8738
8780
  {
8739
8781
  role: "system",
@@ -8759,8 +8801,10 @@ TITLE REQUIREMENTS (CRITICAL):
8759
8801
  HANDLING VERBOSE INPUT:
8760
8802
  - When given detailed or verbose input, extract the core objective and key requirements
8761
8803
  - Do not try to incorporate every detail verbatim - summarize and structure appropriately
8762
- - Focus on actionable steps rather than preserving all user context`
8804
+ - Focus on actionable steps rather than preserving all user context${historyContext}`
8763
8805
  },
8806
+ // Include conversation history BEFORE the current user request
8807
+ ...history,
8764
8808
  { role: "user", content: prompt }
8765
8809
  ];
8766
8810
  const toolDef = {
@@ -8768,7 +8812,7 @@ HANDLING VERBOSE INPUT:
8768
8812
  // Not executed, just captured
8769
8813
  toolSchema: createQuestPlanToolSchema
8770
8814
  };
8771
- const options = {
8815
+ const completionOptions = {
8772
8816
  temperature: retryCount > 0 ? 0.5 : 0.7,
8773
8817
  // Lower temperature for structured JSON outputs; even lower on retries
8774
8818
  n: 1,
@@ -8784,7 +8828,7 @@ HANDLING VERBOSE INPUT:
8784
8828
  let functionResult = null;
8785
8829
  let lastError = null;
8786
8830
  try {
8787
- await this.llm.complete(model, messages, options, async (text, completionInfo) => {
8831
+ await this.llm.complete(model, messages, completionOptions, async (text, completionInfo) => {
8788
8832
  if (completionInfo?.toolsUsed?.length) {
8789
8833
  const toolCall = completionInfo.toolsUsed[0];
8790
8834
  if (toolCall.name === "create_quest_plan" && toolCall.arguments) {
@@ -8805,7 +8849,7 @@ HANDLING VERBOSE INPUT:
8805
8849
  if (!functionResult) {
8806
8850
  if (retryCount < MAX_RETRIES) {
8807
8851
  this.logger.warn(`GPT-5 did not return function call, retrying (attempt ${retryCount + 1}/${MAX_RETRIES})...`);
8808
- return this.createQuestPlanWithFunctionCalling(model, prompt, retryCount + 1);
8852
+ return this.createQuestPlanWithFunctionCalling(model, prompt, planOptions, retryCount + 1);
8809
8853
  }
8810
8854
  throw lastError || new Error("GPT-5 did not call create_quest_plan function after retries");
8811
8855
  }
@@ -8814,7 +8858,7 @@ HANDLING VERBOSE INPUT:
8814
8858
  if (questsWithoutSubquests.length > 0) {
8815
8859
  if (retryCount < MAX_RETRIES) {
8816
8860
  this.logger.warn(`Some quests missing subquests: ${questsWithoutSubquests.map((q) => q.id).join(", ")}, retrying...`);
8817
- return this.createQuestPlanWithFunctionCalling(model, prompt, retryCount + 1);
8861
+ return this.createQuestPlanWithFunctionCalling(model, prompt, planOptions, retryCount + 1);
8818
8862
  } else {
8819
8863
  this.logger.warn(`Returning quest plan with ${questsWithoutSubquests.length} quests missing subquests after max retries (${MAX_RETRIES}): ${questsWithoutSubquests.map((q) => q.id).join(", ")}`);
8820
8864
  }
@@ -8826,22 +8870,35 @@ HANDLING VERBOSE INPUT:
8826
8870
  });
8827
8871
  return result;
8828
8872
  }
8829
- async createQuestPlan(model, prompt) {
8873
+ async createQuestPlan(model, prompt, options = {}) {
8830
8874
  try {
8831
8875
  if (!this.quest) {
8832
8876
  throw new Error("No quest context available");
8833
8877
  }
8878
+ const { history = [] } = options;
8879
+ this.logger.log(`Creating quest plan with ${history.length} history messages for context`);
8834
8880
  await this.onStatusUpdate(this.quest, "Creating quest plan...");
8835
8881
  if (isGPT5ModelWithToolSupport(model)) {
8836
8882
  this.logger.log(`Using function calling approach for GPT-5 model: ${model}`);
8837
8883
  try {
8838
- const result = await this.createQuestPlanWithFunctionCalling(model, prompt);
8884
+ const result = await this.createQuestPlanWithFunctionCalling(model, prompt, options);
8839
8885
  await this.processQuestPlan(result);
8840
8886
  return;
8841
8887
  } catch (functionCallError) {
8842
8888
  this.logger.error("Function calling failed, falling back to HTML approach:", functionCallError);
8843
8889
  }
8844
8890
  }
8891
+ const hasHistory = history.length > 0;
8892
+ const historyContext = hasHistory ? `
8893
+
8894
+ CONVERSATION CONTEXT:
8895
+ You have access to the user's conversation history. Use this context to:
8896
+ - Understand what the user has already discussed or learned
8897
+ - Reference previous decisions or preferences mentioned
8898
+ - Build upon prior context when creating quests
8899
+ - Avoid suggesting steps the user has already completed
8900
+
8901
+ The conversation history is included before the user's current request.` : "";
8845
8902
  const messages = [
8846
8903
  {
8847
8904
  role: "system",
@@ -8904,11 +8961,13 @@ Remember:
8904
8961
  - Each quest and subquest must have a unique, descriptive ID
8905
8962
  - Keep JSON properly formatted
8906
8963
  - The client UI depends on this exact structure
8907
- - Never return a response without proper subquests`
8964
+ - Never return a response without proper subquests${historyContext}`
8908
8965
  },
8966
+ // Include conversation history BEFORE the current user request
8967
+ ...history,
8909
8968
  { role: "user", content: prompt }
8910
8969
  ];
8911
- const options = {
8970
+ const completionOptions = {
8912
8971
  temperature: 0.9,
8913
8972
  n: 1,
8914
8973
  stream: false
@@ -9007,7 +9066,7 @@ Remember:
9007
9066
  return tryGenerateQuestPlan(retryMessages, retryOptions, retryCount + 1);
9008
9067
  }
9009
9068
  };
9010
- return await tryGenerateQuestPlan(messages, options);
9069
+ return await tryGenerateQuestPlan(messages, completionOptions);
9011
9070
  } catch (error) {
9012
9071
  this.logger.error("Error in createQuestPlan:", error);
9013
9072
  throw error;
@@ -10856,6 +10915,53 @@ async function withRetry(fn, options = {}) {
10856
10915
  }
10857
10916
  }
10858
10917
 
10918
+ // ../../b4m-core/packages/utils/dist/src/voiceHistory.js
10919
+ function truncateText(text, maxLength) {
10920
+ if (text.length <= maxLength)
10921
+ return text;
10922
+ return text.slice(0, maxLength - 3) + "...";
10923
+ }
10924
+ function formatMessage(role, content, maxChars) {
10925
+ const truncated = truncateText(content.trim(), maxChars);
10926
+ return `${role === "user" ? "User" : "Assistant"}: ${truncated}`;
10927
+ }
10928
+ function formatVoiceHistory(historyItems, options = {}) {
10929
+ const { maxChars = 3e3, recentMessageCount = 10, maxCharsPerMessage = 300 } = options;
10930
+ if (!historyItems || historyItems.length === 0) {
10931
+ return "";
10932
+ }
10933
+ const recentItems = historyItems.slice(-recentMessageCount);
10934
+ const lines = [
10935
+ "\n\nCONVERSATION CONTEXT:",
10936
+ "You are continuing a conversation with this user. Here is the recent chat history:",
10937
+ ""
10938
+ ];
10939
+ for (const item of recentItems) {
10940
+ if (item.prompt) {
10941
+ lines.push(formatMessage("user", item.prompt, maxCharsPerMessage));
10942
+ }
10943
+ if (item.replies && Array.isArray(item.replies)) {
10944
+ const validReply = item.replies.find((reply) => !reply.trim().startsWith("<think>"));
10945
+ if (validReply) {
10946
+ lines.push(formatMessage("assistant", validReply, maxCharsPerMessage));
10947
+ }
10948
+ }
10949
+ }
10950
+ lines.push("");
10951
+ lines.push("Use this context to maintain continuity. Reference previous topics naturally when relevant.");
10952
+ let result = lines.join("\n");
10953
+ if (result.length > maxChars) {
10954
+ result = truncateText(result, maxChars);
10955
+ }
10956
+ return result;
10957
+ }
10958
+ function buildVoiceInstructions(baseInstructions, historyContext) {
10959
+ if (!historyContext) {
10960
+ return baseInstructions;
10961
+ }
10962
+ return `${baseInstructions}${historyContext}`;
10963
+ }
10964
+
10859
10965
  export {
10860
10966
  BaseStorage,
10861
10967
  S3Storage,
@@ -10983,5 +11089,7 @@ export {
10983
11089
  isRetryableError,
10984
11090
  getRetryAfterMs,
10985
11091
  calculateRetryDelay,
10986
- withRetry
11092
+ withRetry,
11093
+ formatVoiceHistory,
11094
+ buildVoiceInstructions
10987
11095
  };
File without changes
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  createFabFile,
4
4
  createFabFileSchema
5
- } from "./chunk-O7G3G3FD.js";
6
- import "./chunk-M2CSCYOY.js";
5
+ } from "./chunk-HG7OEWJG.js";
6
+ import "./chunk-W2GB4FA6.js";
7
7
  import "./chunk-LL5J3SVB.js";
8
8
  import "./chunk-OCYRD7D6.js";
9
9
  export {
File without changes
package/dist/index.js CHANGED
@@ -4,12 +4,12 @@ import {
4
4
  getEffectiveApiKey,
5
5
  getOpenWeatherKey,
6
6
  getSerperKey
7
- } from "./chunk-ECSELHYP.js";
7
+ } from "./chunk-ISY2LX2J.js";
8
8
  import {
9
9
  ConfigStore
10
10
  } from "./chunk-FFJX3FF3.js";
11
- import "./chunk-I3CPL4SJ.js";
12
- import "./chunk-O7G3G3FD.js";
11
+ import "./chunk-32MIJDKQ.js";
12
+ import "./chunk-HG7OEWJG.js";
13
13
  import {
14
14
  BFLImageService,
15
15
  BaseStorage,
@@ -21,7 +21,7 @@ import {
21
21
  OpenAIBackend,
22
22
  OpenAIImageService,
23
23
  XAIImageService
24
- } from "./chunk-M2CSCYOY.js";
24
+ } from "./chunk-W2GB4FA6.js";
25
25
  import {
26
26
  AiEvents,
27
27
  ApiKeyEvents,
@@ -11430,7 +11430,7 @@ import { isAxiosError as isAxiosError2 } from "axios";
11430
11430
  // package.json
11431
11431
  var package_default = {
11432
11432
  name: "@bike4mind/cli",
11433
- version: "0.2.15",
11433
+ version: "0.2.16-block-missing-tool-result.17608+13b93034b",
11434
11434
  type: "module",
11435
11435
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
11436
11436
  license: "UNLICENSED",
@@ -11536,11 +11536,11 @@ var package_default = {
11536
11536
  zustand: "^4.5.4"
11537
11537
  },
11538
11538
  devDependencies: {
11539
- "@bike4mind/agents": "workspace:*",
11540
- "@bike4mind/common": "workspace:*",
11541
- "@bike4mind/mcp": "workspace:*",
11542
- "@bike4mind/services": "workspace:*",
11543
- "@bike4mind/utils": "workspace:*",
11539
+ "@bike4mind/agents": "0.1.0",
11540
+ "@bike4mind/common": "2.42.2-block-missing-tool-result.17608+13b93034b",
11541
+ "@bike4mind/mcp": "1.22.2-block-missing-tool-result.17608+13b93034b",
11542
+ "@bike4mind/services": "2.39.1-block-missing-tool-result.17608+13b93034b",
11543
+ "@bike4mind/utils": "2.1.10-block-missing-tool-result.17608+13b93034b",
11544
11544
  "@types/better-sqlite3": "^7.6.13",
11545
11545
  "@types/diff": "^5.0.9",
11546
11546
  "@types/jsonwebtoken": "^9.0.4",
@@ -11553,7 +11553,8 @@ var package_default = {
11553
11553
  tsx: "^4.21.0",
11554
11554
  typescript: "^5.9.3",
11555
11555
  vitest: "^3.2.4"
11556
- }
11556
+ },
11557
+ gitHead: "13b93034ba30ba48dd597037effa64bd812b76b0"
11557
11558
  };
11558
11559
 
11559
11560
  // src/config/constants.ts
File without changes
File without changes
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  findMostSimilarMemento,
4
4
  getRelevantMementos
5
- } from "./chunk-ECSELHYP.js";
6
- import "./chunk-M2CSCYOY.js";
5
+ } from "./chunk-ISY2LX2J.js";
6
+ import "./chunk-W2GB4FA6.js";
7
7
  import "./chunk-LL5J3SVB.js";
8
8
  import "./chunk-OCYRD7D6.js";
9
9
  export {
File without changes
File without changes
@@ -64,6 +64,7 @@ import {
64
64
  XAIImageService,
65
65
  aiImageService,
66
66
  buildAndSortMessages,
67
+ buildVoiceInstructions,
67
68
  calculateRetryDelay,
68
69
  calculateTotalTokenLength,
69
70
  checkOrganizationStorageLimit,
@@ -82,6 +83,7 @@ import {
82
83
  fetchAndConvertFabFiles,
83
84
  fetchAndParseURL,
84
85
  fetchAndProcessPreviousMessages,
86
+ formatVoiceHistory,
85
87
  generateSafeEmbedding,
86
88
  getAvailableModels,
87
89
  getCachedSignedUrl,
@@ -127,7 +129,7 @@ import {
127
129
  validateMermaidSyntax,
128
130
  warmUpSettingsCache,
129
131
  withRetry
130
- } from "./chunk-M2CSCYOY.js";
132
+ } from "./chunk-W2GB4FA6.js";
131
133
  import "./chunk-LL5J3SVB.js";
132
134
  import {
133
135
  Logger,
@@ -204,6 +206,7 @@ export {
204
206
  XAIImageService,
205
207
  aiImageService,
206
208
  buildAndSortMessages,
209
+ buildVoiceInstructions,
207
210
  calculateRetryDelay,
208
211
  calculateTotalTokenLength,
209
212
  checkOrganizationStorageLimit,
@@ -222,6 +225,7 @@ export {
222
225
  fetchAndConvertFabFiles,
223
226
  fetchAndParseURL,
224
227
  fetchAndProcessPreviousMessages,
228
+ formatVoiceHistory,
225
229
  generateSafeEmbedding,
226
230
  getAvailableModels,
227
231
  getCachedSignedUrl,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  SubtractCreditsSchema,
4
4
  subtractCredits
5
- } from "./chunk-I3CPL4SJ.js";
6
- import "./chunk-M2CSCYOY.js";
5
+ } from "./chunk-32MIJDKQ.js";
6
+ import "./chunk-W2GB4FA6.js";
7
7
  import "./chunk-LL5J3SVB.js";
8
8
  import "./chunk-OCYRD7D6.js";
9
9
  export {
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.15",
3
+ "version": "0.2.16-block-missing-tool-result.17608+13b93034b",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -30,6 +30,16 @@
30
30
  "dist",
31
31
  "bin"
32
32
  ],
33
+ "scripts": {
34
+ "dev": "tsx src/index.tsx",
35
+ "build": "tsup",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "start": "node dist/index.js",
40
+ "prepublishOnly": "pnpm build",
41
+ "postinstall": "node -e \"try { require('better-sqlite3') } catch(e) { if(e.message.includes('bindings')) { console.log('\\n⚠️ Rebuilding better-sqlite3 native bindings...'); require('child_process').execSync('pnpm rebuild better-sqlite3', {stdio:'inherit'}) } }\""
42
+ },
33
43
  "dependencies": {
34
44
  "@anthropic-ai/sdk": "^0.22.0",
35
45
  "@aws-sdk/client-apigatewaymanagementapi": "3.654.0",
@@ -96,6 +106,11 @@
96
106
  "zustand": "^4.5.4"
97
107
  },
98
108
  "devDependencies": {
109
+ "@bike4mind/agents": "0.1.0",
110
+ "@bike4mind/common": "2.42.2-block-missing-tool-result.17608+13b93034b",
111
+ "@bike4mind/mcp": "1.22.2-block-missing-tool-result.17608+13b93034b",
112
+ "@bike4mind/services": "2.39.1-block-missing-tool-result.17608+13b93034b",
113
+ "@bike4mind/utils": "2.1.10-block-missing-tool-result.17608+13b93034b",
99
114
  "@types/better-sqlite3": "^7.6.13",
100
115
  "@types/diff": "^5.0.9",
101
116
  "@types/jsonwebtoken": "^9.0.4",
@@ -107,20 +122,7 @@
107
122
  "tsup": "^8.5.1",
108
123
  "tsx": "^4.21.0",
109
124
  "typescript": "^5.9.3",
110
- "vitest": "^3.2.4",
111
- "@bike4mind/agents": "0.1.0",
112
- "@bike4mind/common": "2.42.1",
113
- "@bike4mind/mcp": "1.22.1",
114
- "@bike4mind/services": "2.39.0",
115
- "@bike4mind/utils": "2.1.9"
125
+ "vitest": "^3.2.4"
116
126
  },
117
- "scripts": {
118
- "dev": "tsx src/index.tsx",
119
- "build": "tsup",
120
- "typecheck": "tsc --noEmit",
121
- "test": "vitest run",
122
- "test:watch": "vitest",
123
- "start": "node dist/index.js",
124
- "postinstall": "node -e \"try { require('better-sqlite3') } catch(e) { if(e.message.includes('bindings')) { console.log('\\n⚠️ Rebuilding better-sqlite3 native bindings...'); require('child_process').execSync('pnpm rebuild better-sqlite3', {stdio:'inherit'}) } }\""
125
- }
126
- }
127
+ "gitHead": "13b93034ba30ba48dd597037effa64bd812b76b0"
128
+ }