{"record":{"id":"76547fcbbe62c61b","repo":"JuliusBrussee/caveman","slug":"maxtools-must-be-a-positive-integer","errorCode":null,"errorMessage":"maxTools must be a positive integer","messagePattern":"maxTools must be a positive integer","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/sdk/typescript/src/index.ts","lineNumber":1577,"sourceCode":"  }\n}\n\n/** The local kill switch, read at decide() time so an operator can flip it mid-process. */\nfunction envKillSet(name: string): boolean {\n  const raw = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env?.[name];\n  if (typeof raw !== \"string\") return false;\n  const value = raw.trim().toLowerCase();\n  return value !== \"\" && value !== \"0\" && value !== \"false\" && value !== \"no\" && value !== \"off\";\n}\n\nasync function toolSearch(\n  cave: Cave,\n  catalog: CaveTool[],\n  query: string,\n  options?: { maxTools?: number; context?: string; workflow?: string; ranker?: \"bm25\" | \"embeddings\"; toolSessionId?: string }\n): Promise<ToolSearchResult> {\n  if (options?.maxTools !== undefined && (!Number.isSafeInteger(options.maxTools) || options.maxTools < 1)) {\n    throw new Error(\"maxTools must be a positive integer\");\n  }\n  const body: Record<string, unknown> = {\n    tools: catalog.map((t) => ({\n      name: t.name,\n      description: t.description,\n      input_schema: t.inputSchema,\n      read_only: t.readOnly,\n      idempotent: t.idempotent,\n      always_load: t.alwaysLoad ?? false\n    })),\n    query\n  };\n  if (options?.context !== undefined) body[\"context\"] = options.context;\n  if (options?.maxTools !== undefined) body[\"max_tools\"] = options.maxTools;\n  if (options?.toolSessionId !== undefined) body[\"session_id\"] = options.toolSessionId;\n  // Embedding-similarity is a pure passthrough: the SDK forwards the ranker\n  // choice and the gateway honors \"embeddings\" only when it has an embedding\n  // provider wired. The SDK never computes similarity itself (byte-safe, no","sourceCodeStart":1559,"sourceCodeEnd":1595,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/sdk/typescript/src/index.ts#L1559-L1595","documentation":"Error \"maxTools must be a positive integer\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/sdk/typescript/src/index.ts:1577 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set maxTools to a positive integer."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}