{"record":{"id":"16a4131762622e46","repo":"JuliusBrussee/caveman","slug":"initialtoolcount-must-be-a-non-negative-integer","errorCode":null,"errorMessage":"initialToolCount must be a non-negative integer","messagePattern":"initialToolCount must be a non-negative integer","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/sdk/typescript/src/index.ts","lineNumber":475,"sourceCode":"\n  /**\n   * Build a tool-catalog handle with server-side search via /sdk/v1/tool-search.\n   *\n   * strategy \"all\"      → initial = whole catalog; search() still calls the server.\n   * strategy \"deferred\" → initial = alwaysLoad tools (subset sent on first turn);\n   *                       search() calls the server to load relevant tools on demand.\n   *\n   * Breaking change from 1.0: search() is now async and returns ToolSearchResult\n   * (previously sync, returning CaveTool[]). Callers must await search().\n   */\n  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    }","sourceCodeStart":457,"sourceCodeEnd":493,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/sdk/typescript/src/index.ts#L457-L493","documentation":"Error \"initialToolCount must be a non-negative integer\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/sdk/typescript/src/index.ts:475 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set initialToolCount to a non-negative 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-15T17:31:12.345Z"}