{"record":{"id":"9e33008b943e79e9","repo":"JuliusBrussee/caveman","slug":"maxloadedtools-must-be-at-least-the-alwaysload-too","errorCode":null,"errorMessage":"maxLoadedTools must be at least the alwaysLoad tool count","messagePattern":"maxLoadedTools must be at least the alwaysLoad tool count","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/sdk/typescript/src/index.ts","lineNumber":486,"sourceCode":"  tools(config: { catalog: CaveTool[]; strategy?: \"all\" | \"deferred\"; initialToolCount?: number; maxLoadedTools?: number }) {\n    const strategy = config.strategy ?? \"all\";\n    if (strategy !== \"all\" && strategy !== \"deferred\") {\n      throw new Error(\"strategy must be all or deferred\");\n    }\n    const initialToolCount = config.initialToolCount ?? 8;\n    if (!Number.isSafeInteger(initialToolCount) || initialToolCount < 0) {\n      throw new Error(\"initialToolCount must be a non-negative integer\");\n    }\n    if (config.maxLoadedTools !== undefined && (!Number.isSafeInteger(config.maxLoadedTools) || config.maxLoadedTools < 1)) {\n      throw new Error(\"maxLoadedTools must be a positive integer\");\n    }\n    let initial: CaveTool[];\n    if (strategy === \"all\") {\n      initial = config.catalog.slice();\n    } else {\n      const always = config.catalog.filter((tool) => tool.alwaysLoad);\n      if (config.maxLoadedTools !== undefined && always.length > config.maxLoadedTools) {\n        throw new Error(\"maxLoadedTools must be at least the alwaysLoad tool count\");\n      }\n      const lazy = config.catalog.filter((tool) => !tool.alwaysLoad);\n      const lazyLimit = config.maxLoadedTools === undefined\n        ? initialToolCount\n        : Math.min(initialToolCount, config.maxLoadedTools - always.length);\n      initial = always.concat(lazy.slice(0, lazyLimit));\n    }\n    const cave = this;\n\n    return {\n      strategy,\n      initial,\n      /**\n       * Search the full catalog via the gateway's /sdk/v1/tool-search endpoint.\n       * Returns a ToolSearchResult with the reduced tool list and token counts.\n       *\n       * @param query   The user's current intent / task description.\n       * @param options.maxTools Optional cap on returned tools.","sourceCodeStart":468,"sourceCodeEnd":504,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/sdk/typescript/src/index.ts#L468-L504","documentation":"Error \"maxLoadedTools must be at least the alwaysLoad tool count\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/sdk/typescript/src/index.ts:486 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Raise maxLoadedTools to at least the number of alwaysLoad tools."],"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-15T17:31:12.345Z"}