@botbotgo/better-call 0.1.18 → 0.1.20

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.
package/README.md CHANGED
@@ -4,9 +4,13 @@
4
4
 
5
5
  # BetterCall
6
6
 
7
- **A small runtime reliability layer for LangChain and LLM tool calls.**
7
+ [![npm version](https://img.shields.io/npm/v/@botbotgo/better-call.svg)](https://www.npmjs.com/package/@botbotgo/better-call)
8
+ [![license](https://img.shields.io/npm/l/@botbotgo/better-call.svg)](LICENSE)
9
+ [![release](https://github.com/botbotgo/better-call/actions/workflows/release.yml/badge.svg)](https://github.com/botbotgo/better-call/actions/workflows/release.yml)
8
10
 
9
- BetterCall wraps existing LangChain-style tools, validates model-generated calls before execution, and can optionally ask a repair model to fix rejected calls. In full BFCL v4 remote Ollama runs, the best measured lift was `granite4.1:3b`: **73.4% raw -> 83.8% with BetterCall**.
11
+ BetterCall is a small runtime reliability layer for LangChain and LLM tool calls.
12
+
13
+ Wrap your existing tools, validate model-generated calls before execution, and optionally ask a repair model to fix rejected calls. In full BFCL v4 remote Ollama runs, the best measured lift was `granite4.1:3b`: **73.4% raw -> 83.8% with BetterCall**.
10
14
 
11
15
  ```ts
12
16
  import { betterTools } from "@botbotgo/better-call";
@@ -16,7 +20,17 @@ const tools = betterTools([searchTool, calculatorTool]);
16
20
 
17
21
  No model means validate and block only. Add `repairModel` when you want automatic repair.
18
22
 
19
- ## Install
23
+ ## Why BetterCall?
24
+
25
+ Small models often know that a tool is needed but still fail at the boundary: wrong tool names, malformed arguments, schema drift, extra fields, or raw tool-call-shaped text. BetterCall sits at that boundary and gives you a typed, auditable way to accept, repair, or reject the call before the real tool runs.
26
+
27
+ - Use your existing LangChain-style tools.
28
+ - Accept JSON Schema, Zod object schemas, or Zod-shaped records.
29
+ - Block invalid calls when no repair model is configured.
30
+ - Repair rejected calls with a LangChain chat model or custom callback.
31
+ - Keep lower-level primitives available for custom runtimes and gateways.
32
+
33
+ ## Installation
20
34
 
21
35
  ```bash
22
36
  npm install @botbotgo/better-call
@@ -45,7 +59,6 @@ The same wrapper works for any tool with `name`, `schema`, and `invoke(input)`:
45
59
  ```ts
46
60
  import { betterTools } from "@botbotgo/better-call";
47
61
 
48
- // Validate and block bad calls before execution.
49
62
  const tools = betterTools([searchTool, calculatorTool]);
50
63
  ```
51
64
 
@@ -53,6 +66,7 @@ To repair rejected calls automatically, pass a LangChain chat model or any model
53
66
 
54
67
  ```ts
55
68
  import { ChatOpenAI } from "@langchain/openai";
69
+ import { betterTools } from "@botbotgo/better-call";
56
70
 
57
71
  const repairModel = new ChatOpenAI({ model: "gpt-4.1-mini" });
58
72
 
@@ -124,10 +138,46 @@ const tools = betterTools([
124
138
  ]);
125
139
  ```
126
140
 
127
- Lower-level exports are available for custom runtimes:
141
+ ### `repairToolCall(input)`
142
+
143
+ Use this at an upstream adapter or tool gateway boundary when the model emitted an invalid tool call, unavailable tool name, or raw tool-call-shaped text before execution:
144
+
145
+ ```ts
146
+ import { repairToolCall } from "@botbotgo/better-call";
147
+
148
+ const repaired = await repairToolCall({
149
+ userInput: "Research this market.",
150
+ visibleTools: [taskTool],
151
+ hiddenTools: blockedTools,
152
+ invalidToolName: "ls",
153
+ args: { name: "research", query: "Research this market." },
154
+ repairModel,
155
+ });
156
+ ```
157
+
158
+ The result is structured for runtime traces and audit decisions:
159
+
160
+ ```ts
161
+ {
162
+ status: "repaired", // "repaired" | "rejected" | "unchanged"
163
+ toolName: "task",
164
+ args: { subagent_type: "research", description: "Research this market." },
165
+ confidence: 0.8,
166
+ reason: "repair function selected a visible tool and schema-compatible arguments",
167
+ originalToolName: "ls",
168
+ originalArgs: { name: "research", query: "Research this market." },
169
+ violations: []
170
+ }
171
+ ```
172
+
173
+ BetterCall only repairs an existing tool call or tool-call-shaped intent. It does not invent a tool call from an ordinary final answer.
174
+
175
+ ### Lower-level exports
128
176
 
129
177
  - `guardToolCalls(...)`
130
178
  - `reliableToolCalls(...)`
179
+ - `repairToolCall(...)`
180
+ - `parseToolIntent(...)`
131
181
  - `normalizeToolSchema(schema)`
132
182
  - `defaultRepair(model)`
133
183
  - `BetterToolValidationError`
@@ -180,6 +230,24 @@ Latest completed remote run artifact: `benchmarks/bfcl-real-remote-completed-sum
180
230
  | `qwen3.5:4b` | 3,625 | 43.6% | 43.4% | -0.2pp | 1,847 |
181
231
  | `gemma4:e2b` | 3,625 | 24.3% | 24.7% | +0.4pp | 2,641 |
182
232
 
233
+ ## Requirements
234
+
235
+ BetterCall is an ESM package for modern Node.js runtimes. It has one runtime dependency: `zod`.
236
+
237
+ ## Contributing
238
+
239
+ Install dependencies and run the local checks:
240
+
241
+ ```bash
242
+ npm ci
243
+ npm test
244
+ npm run release:pack
245
+ ```
246
+
247
+ ## Security
248
+
249
+ If you believe you have found a security issue, please do not include sensitive details in a public issue. Open a minimal report first, or contact the maintainers through the repository owner.
250
+
183
251
  ## License
184
252
 
185
253
  Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
package/dist/index.d.ts CHANGED
@@ -2,8 +2,9 @@ export { guardToolCalls } from "./guard.js";
2
2
  export { buildRepairPrompt, buildReviewPrompt } from "./prompts.js";
3
3
  export { defaultRepair } from "./default-repair.js";
4
4
  export type { RepairModelLike } from "./default-repair.js";
5
+ export { parseToolIntent, repairToolCall } from "./inventory-repair.js";
5
6
  export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
6
7
  export { reliableToolCalls } from "./reliable.js";
7
8
  export { BetterToolValidationError, betterTools } from "./better-tool.js";
8
9
  export type { BetterToolLike, BetterToolsOptions } from "./better-tool.js";
9
- export type { GuardPolicy, GuardResult, IssueKind, JsonSchema, ArgsNormalizationOptions, ArgsNormalizationResult, ReliableToolCallsInput, ReliableToolCallsResult, RepairDiagnostics, RepairFunction, RepairInput, RepairPolicy, RepairProposal, SchemaDescriptor, SemanticValidator, ToolCall, ToolCallIssue, ToolDefinition, ToolSchema, } from "./types.js";
10
+ export type { GuardPolicy, GuardResult, InventoryRepairInput, InventoryRepairResult, InventoryRepairStatus, IssueKind, JsonSchema, ArgsNormalizationOptions, ArgsNormalizationResult, ReliableToolCallsInput, ReliableToolCallsResult, RepairDiagnostics, RepairFunction, RepairInput, RepairPolicy, RepairProposal, SchemaDescriptor, SemanticValidator, ToolCall, ToolCallIssue, ToolDefinition, ToolSchema, } from "./types.js";
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export { guardToolCalls } from "./guard.js";
2
2
  export { buildRepairPrompt, buildReviewPrompt } from "./prompts.js";
3
3
  export { defaultRepair } from "./default-repair.js";
4
+ export { parseToolIntent, repairToolCall } from "./inventory-repair.js";
4
5
  export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
5
6
  export { reliableToolCalls } from "./reliable.js";
6
7
  export { BetterToolValidationError, betterTools } from "./better-tool.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InventoryRepairInput, InventoryRepairResult, ToolCall } from "./types.js";
2
+ export declare function repairToolCall(input: InventoryRepairInput): Promise<InventoryRepairResult>;
3
+ export declare function parseToolIntent(value: unknown): ToolCall | undefined;
@@ -0,0 +1,353 @@
1
+ import { defaultRepair } from "./default-repair.js";
2
+ import { guardToolCalls } from "./guard.js";
3
+ import { normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
4
+ export async function repairToolCall(input) {
5
+ const visibleTools = normalizeTools(input.visibleTools);
6
+ const hiddenTools = normalizeTools(input.hiddenTools ?? []);
7
+ const original = extractOriginalCall(input);
8
+ if (!original) {
9
+ return rejected("no tool-call intent was provided", undefined, undefined, [{
10
+ kind: "parse",
11
+ path: "$.rawIntent",
12
+ message: "could not extract a tool call from the provided intent",
13
+ }]);
14
+ }
15
+ const originalToolName = original.tool;
16
+ const originalArgs = original.args;
17
+ const hiddenTool = hiddenTools.find((tool) => tool.name === original.tool);
18
+ if (hiddenTool) {
19
+ return rejected("model selected a hidden or blocked tool", originalToolName, originalArgs, [{
20
+ kind: "blocked_tool",
21
+ path: "$.tool",
22
+ message: `blocked tool ${original.tool}`,
23
+ tool: original.tool,
24
+ }]);
25
+ }
26
+ const visibleTool = visibleTools.find((tool) => tool.name === original.tool);
27
+ if (visibleTool) {
28
+ return repairKnownTool(input, visibleTools, visibleTool, original, originalToolName, originalArgs);
29
+ }
30
+ const inventoryProposal = await repairUnavailableToolFromInventory(input, visibleTools, original, originalToolName, originalArgs);
31
+ if (inventoryProposal)
32
+ return inventoryProposal;
33
+ const modelProposal = await repairWithModelOrCallback(input, visibleTools, original, [{
34
+ kind: "unknown_tool",
35
+ path: "$.tool",
36
+ message: `unknown tool ${original.tool}`,
37
+ tool: original.tool,
38
+ }]);
39
+ if (modelProposal) {
40
+ return {
41
+ status: "repaired",
42
+ toolName: modelProposal.tool,
43
+ args: modelProposal.args,
44
+ confidence: 0.8,
45
+ reason: "repair function selected a visible tool and schema-compatible arguments",
46
+ originalToolName,
47
+ originalArgs,
48
+ violations: [],
49
+ };
50
+ }
51
+ return rejected("no unambiguous visible tool repair was found", originalToolName, originalArgs, [{
52
+ kind: "unknown_tool",
53
+ path: "$.tool",
54
+ message: `unknown tool ${original.tool}`,
55
+ tool: original.tool,
56
+ }]);
57
+ }
58
+ export function parseToolIntent(value) {
59
+ if (isRecord(value))
60
+ return toolCallFromRecord(value);
61
+ if (typeof value !== "string")
62
+ return undefined;
63
+ const text = stripToolCode(value.trim());
64
+ const jsonCall = parseJsonToolCall(text);
65
+ if (jsonCall)
66
+ return jsonCall;
67
+ return parseFunctionStyleToolCall(text);
68
+ }
69
+ async function repairKnownTool(input, visibleTools, tool, original, originalToolName, originalArgs) {
70
+ const first = await guardToolCalls({ tools: visibleTools, calls: [original] });
71
+ if (first.ok) {
72
+ return {
73
+ status: "unchanged",
74
+ toolName: original.tool,
75
+ args: original.args,
76
+ confidence: 1,
77
+ reason: "tool call already matched the visible inventory and selected schema",
78
+ originalToolName,
79
+ originalArgs,
80
+ violations: [],
81
+ };
82
+ }
83
+ const aliasArgs = repairArgumentAliases(tool.schema, original.args);
84
+ const normalizedArgs = normalizeArgsBySchema(tool.schema, aliasArgs, input.repairPolicy).args;
85
+ const proposed = { tool: original.tool, args: normalizedArgs };
86
+ const second = await guardToolCalls({ tools: visibleTools, calls: [proposed] });
87
+ if (second.ok && !sameCall(original, proposed)) {
88
+ return {
89
+ status: "repaired",
90
+ toolName: proposed.tool,
91
+ args: proposed.args,
92
+ confidence: 0.85,
93
+ reason: "arguments were repaired using the selected tool schema",
94
+ originalToolName,
95
+ originalArgs,
96
+ violations: first.issues,
97
+ };
98
+ }
99
+ const modelProposal = await repairWithModelOrCallback(input, visibleTools, original, first.issues);
100
+ if (modelProposal) {
101
+ return {
102
+ status: "repaired",
103
+ toolName: modelProposal.tool,
104
+ args: modelProposal.args,
105
+ confidence: 0.8,
106
+ reason: "repair function returned a schema-compatible visible tool call",
107
+ originalToolName,
108
+ originalArgs,
109
+ violations: first.issues,
110
+ };
111
+ }
112
+ return rejected("selected tool arguments could not be repaired", originalToolName, originalArgs, first.issues);
113
+ }
114
+ async function repairUnavailableToolFromInventory(input, visibleTools, original, originalToolName, originalArgs) {
115
+ const candidates = [];
116
+ for (const tool of visibleTools) {
117
+ const aliasArgs = repairArgumentAliases(tool.schema, original.args);
118
+ const normalizedArgs = normalizeArgsBySchema(tool.schema, aliasArgs, input.repairPolicy).args;
119
+ const proposed = { tool: tool.name, args: normalizedArgs };
120
+ const result = await guardToolCalls({ tools: visibleTools, calls: [proposed] });
121
+ if (result.ok)
122
+ candidates.push(proposed);
123
+ }
124
+ if (candidates.length !== 1)
125
+ return undefined;
126
+ const [candidate] = candidates;
127
+ return {
128
+ status: "repaired",
129
+ toolName: candidate.tool,
130
+ args: candidate.args,
131
+ confidence: 0.75,
132
+ reason: "exactly one visible tool accepted the repaired argument shape",
133
+ originalToolName,
134
+ originalArgs,
135
+ violations: [{
136
+ kind: "unknown_tool",
137
+ path: "$.tool",
138
+ message: `unknown tool ${original.tool}`,
139
+ tool: original.tool,
140
+ }],
141
+ };
142
+ }
143
+ async function repairWithModelOrCallback(input, visibleTools, original, issues) {
144
+ const repair = input.repair ?? (input.repairModel ? defaultRepair(input.repairModel) : undefined);
145
+ if (!repair)
146
+ return undefined;
147
+ const repaired = await repair({
148
+ userInput: input.userInput,
149
+ tools: visibleTools,
150
+ hiddenTools: normalizeTools(input.hiddenTools ?? []),
151
+ calls: [original],
152
+ issues,
153
+ runtimePolicy: input.runtimePolicy,
154
+ });
155
+ for (const call of repaired) {
156
+ if (!visibleTools.some((tool) => tool.name === call.tool))
157
+ continue;
158
+ const result = await guardToolCalls({ tools: visibleTools, calls: [call] });
159
+ if (result.ok)
160
+ return call;
161
+ }
162
+ return undefined;
163
+ }
164
+ function extractOriginalCall(input) {
165
+ const fromCall = input.call ? toolCallFromRecord(input.call) : undefined;
166
+ if (fromCall)
167
+ return fromCall;
168
+ const fromRaw = parseToolIntent(input.rawIntent);
169
+ if (fromRaw)
170
+ return fromRaw;
171
+ const name = input.invalidToolName;
172
+ if (name)
173
+ return { tool: name, args: input.args ?? {} };
174
+ return undefined;
175
+ }
176
+ function repairArgumentAliases(schema, args) {
177
+ const normalized = normalizeToolSchema(schema);
178
+ if (!normalized?.properties)
179
+ return args;
180
+ let next = { ...args };
181
+ const properties = normalized.properties;
182
+ for (const key of Object.keys(args)) {
183
+ const canonical = findCanonicalKey(key, properties);
184
+ if (canonical && canonical !== key && !(canonical in next)) {
185
+ next[canonical] = next[key];
186
+ delete next[key];
187
+ }
188
+ }
189
+ next = repairSingleRequiredString(normalized, next);
190
+ if (normalized.additionalProperties === false) {
191
+ for (const key of Object.keys(next)) {
192
+ if (!(key in properties))
193
+ delete next[key];
194
+ }
195
+ }
196
+ return next;
197
+ }
198
+ function repairSingleRequiredString(schema, args) {
199
+ const properties = schema.properties ?? {};
200
+ const missingRequired = (schema.required ?? []).filter((key) => !(key in args));
201
+ if (missingRequired.length !== 1)
202
+ return args;
203
+ const [missingKey] = missingRequired;
204
+ const missingSchema = properties[missingKey];
205
+ if (!missingSchema || !expectsString(missingSchema))
206
+ return args;
207
+ const extras = Object.entries(args).filter(([key, value]) => !(key in properties) && typeof value === "string");
208
+ if (extras.length !== 1)
209
+ return args;
210
+ const [[extraKey, extraValue]] = extras;
211
+ const next = { ...args, [missingKey]: extraValue };
212
+ delete next[extraKey];
213
+ return next;
214
+ }
215
+ function findCanonicalKey(key, properties) {
216
+ const normalizedKey = normalizeKey(key);
217
+ return Object.keys(properties).find((candidate) => normalizeKey(candidate) === normalizedKey);
218
+ }
219
+ function normalizeKey(value) {
220
+ return value.toLowerCase().replace(/[^a-z0-9]/gu, "");
221
+ }
222
+ function expectsString(schema) {
223
+ return schema.type === "string" || (Array.isArray(schema.type) && schema.type.includes("string")) || !schema.type;
224
+ }
225
+ function parseJsonToolCall(value) {
226
+ try {
227
+ return toolCallFromRecord(JSON.parse(stripCodeFence(value)));
228
+ }
229
+ catch {
230
+ return undefined;
231
+ }
232
+ }
233
+ function parseFunctionStyleToolCall(value) {
234
+ const match = /^\s*([A-Za-z_$][\w$.-]*)\s*\(([\s\S]*)\)\s*;?\s*$/u.exec(value);
235
+ if (!match)
236
+ return undefined;
237
+ return { tool: match[1], args: parseFunctionArgs(match[2]) };
238
+ }
239
+ function parseFunctionArgs(value) {
240
+ const args = {};
241
+ for (const part of splitTopLevelCommas(value)) {
242
+ const match = /^\s*([A-Za-z_$][\w$.-]*)\s*=\s*([\s\S]*?)\s*$/u.exec(part);
243
+ if (match)
244
+ args[match[1]] = parseScalar(match[2]);
245
+ }
246
+ return args;
247
+ }
248
+ function splitTopLevelCommas(value) {
249
+ const parts = [];
250
+ let current = "";
251
+ let quote;
252
+ let escaped = false;
253
+ for (const char of value) {
254
+ if (escaped) {
255
+ current += char;
256
+ escaped = false;
257
+ continue;
258
+ }
259
+ if (char === "\\") {
260
+ current += char;
261
+ escaped = true;
262
+ continue;
263
+ }
264
+ if (quote) {
265
+ current += char;
266
+ if (char === quote)
267
+ quote = undefined;
268
+ continue;
269
+ }
270
+ if (char === "\"" || char === "'") {
271
+ current += char;
272
+ quote = char;
273
+ continue;
274
+ }
275
+ if (char === ",") {
276
+ parts.push(current);
277
+ current = "";
278
+ continue;
279
+ }
280
+ current += char;
281
+ }
282
+ if (current.trim() !== "")
283
+ parts.push(current);
284
+ return parts;
285
+ }
286
+ function parseScalar(value) {
287
+ const trimmed = value.trim();
288
+ try {
289
+ return JSON.parse(trimmed);
290
+ }
291
+ catch {
292
+ return trimmed.replace(/^["']|["']$/gu, "");
293
+ }
294
+ }
295
+ function stripToolCode(value) {
296
+ const match = /<tool_code>\s*([\s\S]*?)\s*<\/tool_code>/iu.exec(value);
297
+ return match ? match[1].trim() : value;
298
+ }
299
+ function stripCodeFence(value) {
300
+ const match = /^```(?:json)?\s*([\s\S]*?)\s*```$/u.exec(value.trim());
301
+ return match ? match[1] : value;
302
+ }
303
+ function toolCallFromRecord(value) {
304
+ if (!isRecord(value))
305
+ return undefined;
306
+ if (typeof value.tool === "string" && isRecord(value.args))
307
+ return { tool: value.tool, args: value.args };
308
+ if (typeof value.name === "string" && isRecord(value.args))
309
+ return { tool: value.name, args: value.args };
310
+ if (typeof value.name === "string" && isRecord(value.arguments))
311
+ return { tool: value.name, args: value.arguments };
312
+ if (typeof value.name === "string" && typeof value.arguments === "string") {
313
+ const parsed = parseJsonObject(value.arguments);
314
+ if (parsed)
315
+ return { tool: value.name, args: parsed };
316
+ }
317
+ if (isRecord(value.function))
318
+ return toolCallFromRecord(value.function);
319
+ if (Array.isArray(value.calls))
320
+ return value.calls.map(toolCallFromRecord).find(Boolean);
321
+ if (Array.isArray(value.tool_calls))
322
+ return value.tool_calls.map(toolCallFromRecord).find(Boolean);
323
+ return undefined;
324
+ }
325
+ function parseJsonObject(value) {
326
+ try {
327
+ const parsed = JSON.parse(value);
328
+ return isRecord(parsed) ? parsed : undefined;
329
+ }
330
+ catch {
331
+ return undefined;
332
+ }
333
+ }
334
+ function rejected(reason, originalToolName, originalArgs, violations) {
335
+ return {
336
+ status: "rejected",
337
+ confidence: 0,
338
+ reason,
339
+ originalToolName,
340
+ originalArgs,
341
+ violations,
342
+ };
343
+ }
344
+ function normalizeTools(tools) {
345
+ return tools.map((tool) => ({ ...tool, schema: normalizeToolSchema(tool.schema) }));
346
+ }
347
+ function sameCall(left, right) {
348
+ return left.tool === right.tool && JSON.stringify(left.args) === JSON.stringify(right.args);
349
+ }
350
+ function isRecord(value) {
351
+ return typeof value === "object" && value !== null && !Array.isArray(value);
352
+ }
353
+ //# sourceMappingURL=inventory-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory-repair.js","sourceRoot":"","sources":["../src/inventory-repair.ts"],"names":[],"mappings":"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"}
package/dist/prompts.js CHANGED
@@ -6,6 +6,8 @@ export function buildRepairPrompt(input) {
6
6
  "",
7
7
  `User request: ${input.userInput}`,
8
8
  `Tools: ${JSON.stringify(input.tools)}`,
9
+ `Hidden or blocked tools: ${JSON.stringify(input.hiddenTools ?? [])}`,
10
+ `Runtime policy: ${JSON.stringify(input.runtimePolicy ?? {})}`,
9
11
  `Rejected calls: ${JSON.stringify(input.calls)}`,
10
12
  `Issues: ${JSON.stringify(input.issues)}`,
11
13
  ].join("\n");
@@ -18,6 +20,8 @@ export function buildReviewPrompt(input) {
18
20
  "",
19
21
  `User request: ${input.userInput}`,
20
22
  `Tools: ${JSON.stringify(input.tools)}`,
23
+ `Hidden or blocked tools: ${JSON.stringify(input.hiddenTools ?? [])}`,
24
+ `Runtime policy: ${JSON.stringify(input.runtimePolicy ?? {})}`,
21
25
  `Previous calls: ${JSON.stringify(input.calls)}`,
22
26
  `Validation issues, if any: ${JSON.stringify(input.issues)}`,
23
27
  ].join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,2DAA2D;QAC3D,8EAA8E;QAC9E,qDAAqD;QACrD,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,sEAAsE;QACtE,8FAA8F;QAC9F,0EAA0E;QAC1E,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,8BAA8B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,2DAA2D;QAC3D,8EAA8E;QAC9E,qDAAqD;QACrD,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;QACrE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;QAC9D,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,sEAAsE;QACtE,8FAA8F;QAC9F,0EAA0E;QAC1E,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;QACrE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;QAC9D,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,8BAA8B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
package/dist/types.d.ts CHANGED
@@ -39,7 +39,7 @@ export type ToolCall = {
39
39
  tool: string;
40
40
  args: Record<string, unknown>;
41
41
  };
42
- export type IssueKind = "unknown_tool" | "irrelevant_call" | "missing_call" | "schema" | "type" | "semantic";
42
+ export type IssueKind = "unknown_tool" | "blocked_tool" | "irrelevant_call" | "missing_call" | "parse" | "schema" | "type" | "semantic";
43
43
  export type ToolCallIssue = {
44
44
  kind: IssueKind;
45
45
  path: string;
@@ -94,8 +94,10 @@ export type SemanticValidator = (input: {
94
94
  export type RepairInput = {
95
95
  userInput: string;
96
96
  tools: ToolDefinition[];
97
+ hiddenTools?: ToolDefinition[];
97
98
  calls: ToolCall[];
98
99
  issues: ToolCallIssue[];
100
+ runtimePolicy?: Record<string, unknown>;
99
101
  };
100
102
  export type RepairFunction = (input: RepairInput) => Promise<ToolCall[]> | ToolCall[];
101
103
  export type ReliableToolCallsInput = {
@@ -113,3 +115,32 @@ export type ReliableToolCallsResult = GuardResult & {
113
115
  original: ToolCall[];
114
116
  diagnostics?: RepairDiagnostics[];
115
117
  };
118
+ export type InventoryRepairStatus = "repaired" | "rejected" | "unchanged";
119
+ export type InventoryRepairInput = {
120
+ userInput: string;
121
+ visibleTools: ToolDefinition[];
122
+ hiddenTools?: ToolDefinition[];
123
+ call?: Partial<ToolCall> & {
124
+ name?: string;
125
+ arguments?: unknown;
126
+ };
127
+ rawIntent?: string;
128
+ invalidToolName?: string;
129
+ args?: Record<string, unknown>;
130
+ runtimePolicy?: Record<string, unknown>;
131
+ repairPolicy?: RepairPolicy;
132
+ repair?: RepairFunction;
133
+ repairModel?: {
134
+ invoke(input: unknown): Promise<unknown> | unknown;
135
+ };
136
+ };
137
+ export type InventoryRepairResult = {
138
+ status: InventoryRepairStatus;
139
+ toolName?: string;
140
+ args?: Record<string, unknown>;
141
+ confidence: number;
142
+ reason: string;
143
+ originalToolName?: string;
144
+ originalArgs?: Record<string, unknown>;
145
+ violations: ToolCallIssue[];
146
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbotgo/better-call",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "LLM tool-call reliability layer.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -46,7 +46,7 @@
46
46
  "prepack": "npm run test"
47
47
  },
48
48
  "devDependencies": {
49
- "@types/node": "^24.10.1",
49
+ "@types/node": "^25.6.2",
50
50
  "typescript": "^5.9.3"
51
51
  },
52
52
  "dependencies": {