diff --git a/packages/ai-tools/dist/lib/tools/fs.js b/packages/ai-tools/dist/lib/tools/fs.js index a51fa1a5..27ceacea 100644 --- a/packages/ai-tools/dist/lib/tools/fs.js +++ b/packages/ai-tools/dist/lib/tools/fs.js @@ -6,6 +6,7 @@ import { sync as write } from '@polymech/fs/write'; import { sync as read } from '@polymech/fs/read'; import { sync as rename } from '@polymech/fs/rename'; import { sync as exists } from '@polymech/fs/exists'; +import { sanitize } from "@polymech/fs/utils"; import { filesEx } from '@polymech/commons'; import { toolLogger } from '../../index.js'; import { EXCLUDE_GLOB } from '../../constants.js'; @@ -43,6 +44,45 @@ export const decode_base64 = (base64) => { throw new Error('Failed to decode base64 string'); } }; +// Helper function for smart Base64 decoding +const decodeContentSmart = (content, logger, identifier) => { + if (!content || typeof content !== 'string') { + return content; // Return original content if null, undefined, or not a string + } + const lines = content.split(/\r?\n/); + const processedLines = lines.map(line => { + const trimmedLine = line.trim(); + if (!trimmedLine) { + return ''; // Preserve empty lines between potential blocks but decode the blocks themselves + } + try { + // Attempt to decode Base64 + const decodedLine = Buffer.from(trimmedLine, 'base64').toString('utf-8'); + // Validate if it was actually Base64 by re-encoding + const reEncodedLine = Buffer.from(decodedLine, 'utf-8').toString('base64'); + // Revised Validation Check: + // Compare original trimmed line with re-encoded line. + // Allow for potential padding differences by checking both exact match and no-pad match. + const originalNoPad = trimmedLine.replace(/={1,2}$/, ''); + const reEncodedNoPad = reEncodedLine.replace(/={1,2}$/, ''); + if (reEncodedLine === trimmedLine || reEncodedNoPad === originalNoPad) { + logger.debug(`Successfully decoded Base64 line for ${identifier}`); + return decodedLine; + } + // If validation fails, treat as plain text + logger.debug(`Re-encoding mismatch for ${identifier}. Original: '${trimmedLine}', Re-encoded: '${reEncodedLine}', using original trimmed line.`); + return trimmedLine; + } + catch (decodeError) { + // If decoding throws an error, assume it's plain text + // Use debug level as this is expected for non-base64 lines + logger.debug(`Base64 decoding failed for line in ${identifier}, assuming plain text. Line: ${trimmedLine}`); + return trimmedLine; // Return original trimmed line + } + }); + // Join the processed lines back together + return processedLines.join('\n'); +}; export const tools = (target, options) => { const logger = toolLogger('fs', options); const category = 'fs'; @@ -62,7 +102,7 @@ export const tools = (target, options) => { }, function: async (params) => { try { - const directory = path.join(target, params.directory); + const directory = path.join(target, sanitize(params.directory)); if (!exists(directory)) { logger.debug(`Tool::ListFiles Directory ${directory} does not exist`); return []; @@ -144,7 +184,7 @@ export const tools = (target, options) => { }, function: async (params) => { try { - const filePath = path.join(target, params.path); + const filePath = path.join(target, sanitize(params.path)); logger.debug(`Tool::RemoveFile Removing file ${filePath}`); rm(filePath); return true; @@ -172,9 +212,10 @@ export const tools = (target, options) => { }, function: async (params) => { try { - const src = path.join(target, params.src); - logger.debug(`Tool::Rename file ${src} to ${params.dst}`); - rename(src, params.dst); + const src = path.join(target, sanitize(params.src)); + const dst = path.join(target, sanitize(params.dst)); + logger.debug(`Tool::Rename file ${src} to ${dst}`); + rename(src, dst); rm(src); return true; } @@ -221,19 +262,26 @@ export const tools = (target, options) => { } catch (error) { logger.error(`Tool::modify_project_files : Structure Error parsing files`, error, ret); - write(path.join(target, 'tools-output.json'), files); + // Consider writing the raw input for debugging if JSON parsing fails + // write(path.join(target, 'tools-output-error.json'), files) return error.message; } } for (const file of files) { - const filePath = path.join(target, file.path); + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath); logger.debug(`Tool:modify_project_files writing file ${filePath}`); try { - let content = decode_base64(file.content); - await write(filePath, content); + const contentToWrite = decodeContentSmart(file.content, logger, sanitizedPath); + try { + await write(filePath, contentToWrite); + } + catch (writeError) { + logger.error(`Tool:modify_project_files Error writing file ${filePath}`, writeError); + } } catch (error) { - logger.error(`Tool:modify_project_files Error writing file`, error); + logger.error(`Tool:modify_project_files Error processing file content for ${filePath}`, error); } } } @@ -263,30 +311,40 @@ export const tools = (target, options) => { required: ["file"], }, function: async (params) => { + let fileInfo; try { if (isString(params)) { try { params = JSON.parse(params); } catch (error) { - logger.error(`Tool::create_file : Structure Error parsing files`, error, params); + logger.error(`Tool::write_file : Structure Error parsing JSON`, error, params); return error.message; } } - let { file } = params; - if (!target || !file.path || !file.content) { - logger.error(`Tool::create_file : Path/Target/Content are required to create file`, params); - return; + fileInfo = params.file; // Keep fileInfo accessible + if (!target || !fileInfo || !fileInfo.path || typeof fileInfo.content === 'undefined') { + logger.error(`Tool::write_file : Path/Target/Content are required`, fileInfo); + return false; // Indicate failure + } + const sanitizedPath = sanitize(fileInfo.path); + const filePath = path.join(target, sanitizedPath); + logger.debug(`Tool::write_file Writing file ${filePath}`); + try { + // Use the smart decoding helper function + const contentToWrite = decodeContentSmart(fileInfo.content, logger, sanitizedPath); + await write(filePath, contentToWrite); + return true; + } + catch (error) { + // Log error related to processing or writing the file + logger.error(`Tool:write_file Error processing or writing file ${sanitizedPath}`, error); + return false; // Indicate failure } - let content = decode_base64(file.content); - logger.debug(`Tool::create_file Writing file ${file.path} in ${target}`); - const filePath = path.join(target, file.path); - write(filePath, content); - return true; } catch (error) { - logger.error(`Tool:create_file Error writing file`, error); - return false; + logger.error(`Tool:write_file Error writing file ${fileInfo?.path ? sanitize(fileInfo.path) : 'unknown'}`, error); + return false; // Indicate failure } }, parse: JSON.parse, @@ -322,10 +380,11 @@ export const tools = (target, options) => { } const { file } = ret; if (!target || !file.path) { - logger.error(`Tool::file_exists : Path is required to `, ret); + logger.error(`Tool::file_exists : Path is required`, ret); return; } - const filePath = path.join(target, file.path); + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath); const res = exists(filePath); logger.debug(`Tool::file_exists ${filePath} exists: ${res}`); return res ? true : false; @@ -358,7 +417,8 @@ export const tools = (target, options) => { function: async (ret) => { try { const { file } = ret; - const filePath = path.join(target, file.path); + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath); logger.debug(`Tool::ReadFile Reading file ${filePath}`); return read(filePath, 'string'); } @@ -371,4 +431,4 @@ export const tools = (target, options) => { } ]; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rvb2xzL2ZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDaEQsMkRBQTJEO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRXBELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFM0IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQVcsRUFBRTtJQUN0QyxtREFBbUQ7SUFDbkQsdUNBQXVDO0lBQ3ZDLGlGQUFpRjtJQUNqRixJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUM7SUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDMUIsT0FB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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rvb2xzL2ZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRTVCLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDaEQsMkRBQTJEO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRXBELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUVqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRTNCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUU7SUFDdEMsbURBQW1EO0lBQ25ELHVDQUF1QztJQUN2QyxpRkFBaUY7SUFDakYsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEMsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDO0lBQzdDLElBQUksQ0FBQyxX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 \ No newline at end of file diff --git a/packages/ai-tools/dist/types_kbot.d.ts b/packages/ai-tools/dist/types_kbot.d.ts index 1c12f76f..f7a0a0e5 100644 --- a/packages/ai-tools/dist/types_kbot.d.ts +++ b/packages/ai-tools/dist/types_kbot.d.ts @@ -25,6 +25,7 @@ export interface IKBotOptions {  01-ai/yi-large | paid aetherwiing/mn-starcannon-12b | paid + agentica-org/deepcoder-14b-preview:free | free ai21/jamba-1-5-large | paid ai21/jamba-1-5-mini | paid ai21/jamba-1.6-large | paid @@ -34,8 +35,8 @@ export interface IKBotOptions { aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid jondurbin/airoboros-l2-70b | paid + alfredpros/codellama-7b-instruct-solidity | paid allenai/molmo-7b-d:free | free - allenai/olmo-2-0325-32b-instruct | paid amazon/nova-lite-v1 | paid amazon/nova-micro-v1 | paid amazon/nova-pro-v1 | paid @@ -62,6 +63,7 @@ export interface IKBotOptions { anthropic/claude-2.0:beta | paid anthropic/claude-2.1 | paid anthropic/claude-2.1:beta | paid + arliai/qwq-32b-arliai-rpr-v1:free | free openrouter/auto | paid bytedance-research/ui-tars-72b:free | free cohere/command | paid @@ -93,23 +95,26 @@ export interface IKBotOptions { cognitivecomputations/dolphin-mixtral-8x22b | paid cognitivecomputations/dolphin3.0-mistral-24b:free | free cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free + eleutherai/llemma_7b | paid eva-unit-01/eva-llama-3.33-70b | paid eva-unit-01/eva-qwen-2.5-32b | paid eva-unit-01/eva-qwen-2.5-72b | paid sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid - google/gemini-2.0-flash-lite-001 | paid - google/gemini-2.0-flash-thinking-exp-1219:free | free - google/gemini-2.0-flash-thinking-exp:free | free google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid google/gemini-flash-1.5-8b-exp | paid + google/gemini-pro-1.5 | paid google/gemini-2.0-flash-001 | paid google/gemini-2.0-flash-exp:free | free - google/gemini-pro | paid - google/gemini-pro-1.5 | paid - google/gemini-2.0-pro-exp-02-05:free | free + google/gemini-2.0-flash-lite-001 | paid + google/gemini-2.0-flash-thinking-exp-1219:free | free + google/gemini-2.0-flash-thinking-exp:free | free + google/gemini-2.5-flash-preview | paid + google/gemini-2.5-flash-preview:thinking | paid google/gemini-2.5-pro-exp-03-25:free | free + google/gemini-2.5-pro-preview-03-25 | paid + google/gemini-pro | paid google/gemini-pro-vision | paid google/gemma-2-27b-it | paid google/gemma-2-9b-it | paid @@ -121,7 +126,6 @@ export interface IKBotOptions { google/gemma-3-27b-it:free | free google/gemma-3-4b-it | paid google/gemma-3-4b-it:free | free - google/gemma-7b-it | paid google/learnlm-1.5-pro-experimental:free | free google/palm-2-chat-bison | paid google/palm-2-chat-bison-32k | paid @@ -144,7 +148,6 @@ export interface IKBotOptions { meta-llama/llama-2-70b-chat | paid meta-llama/llama-3-70b-instruct | paid meta-llama/llama-3-8b-instruct | paid - meta-llama/llama-3-8b-instruct:free | free meta-llama/llama-3.1-405b | paid meta-llama/llama-3.1-405b-instruct | paid meta-llama/llama-3.1-70b-instruct | paid @@ -159,13 +162,15 @@ export interface IKBotOptions { meta-llama/llama-3.2-90b-vision-instruct | paid meta-llama/llama-3.3-70b-instruct | paid meta-llama/llama-3.3-70b-instruct:free | free + meta-llama/llama-4-maverick | paid + meta-llama/llama-4-maverick:free | free + meta-llama/llama-4-scout | paid + meta-llama/llama-4-scout:free | free meta-llama/llama-guard-2-8b | paid microsoft/phi-4 | paid microsoft/phi-4-multimodal-instruct | paid microsoft/phi-3-medium-128k-instruct | paid - microsoft/phi-3-medium-128k-instruct:free | free microsoft/phi-3-mini-128k-instruct | paid - microsoft/phi-3-mini-128k-instruct:free | free microsoft/phi-3.5-mini-128k-instruct | paid sophosympatheia/midnight-rose-70b | paid minimax/minimax-01 | paid @@ -193,14 +198,13 @@ export interface IKBotOptions { mistralai/mistral-small-3.1-24b-instruct | paid mistralai/mistral-small-3.1-24b-instruct:free | free mistralai/mixtral-8x22b-instruct | paid - mistralai/mixtral-8x7b | paid mistralai/mixtral-8x7b-instruct | paid mistralai/pixtral-12b | paid mistralai/pixtral-large-2411 | paid mistralai/mistral-saba | paid + moonshotai/kimi-vl-a3b-thinking:free | free moonshotai/moonlight-16b-a3b-instruct:free | free gryphe/mythomax-l2-13b | paid - gryphe/mythomax-l2-13b:free | free neversleep/llama-3-lumimaid-70b | paid neversleep/llama-3-lumimaid-8b | paid neversleep/llama-3-lumimaid-8b:extended | paid @@ -215,6 +219,9 @@ export interface IKBotOptions { nousresearch/hermes-2-pro-llama-3-8b | paid nvidia/llama-3.1-nemotron-70b-instruct | paid nvidia/llama-3.1-nemotron-70b-instruct:free | free + nvidia/llama-3.1-nemotron-nano-8b-v1:free | free + nvidia/llama-3.1-nemotron-ultra-253b-v1:free | free + nvidia/llama-3.3-nemotron-super-49b-v1:free | free open-r1/olympiccoder-32b:free | free open-r1/olympiccoder-7b:free | free openai/chatgpt-4o-latest | paid @@ -231,6 +238,9 @@ export interface IKBotOptions { openai/gpt-4-turbo | paid openai/gpt-4-1106-preview | paid openai/gpt-4-turbo-preview | paid + openai/gpt-4.1 | paid + openai/gpt-4.1-mini | paid + openai/gpt-4.1-nano | paid openai/gpt-4.5-preview | paid openai/gpt-4o | paid openai/gpt-4o-2024-05-13 | paid @@ -247,11 +257,13 @@ export interface IKBotOptions { openai/o1-preview | paid openai/o1-preview-2024-09-12 | paid openai/o1-pro | paid + openai/o3 | paid openai/o3-mini | paid openai/o3-mini-high | paid + openai/o4-mini | paid + openai/o4-mini-high | paid openchat/openchat-7b | paid - openchat/openchat-7b:free | free - teknium/openhermes-2.5-mistral-7b | paid + all-hands/openhands-lm-32b-v0.1 | paid perplexity/llama-3.1-sonar-large-128k-online | paid perplexity/llama-3.1-sonar-small-128k-online | paid perplexity/r1-1776 | paid @@ -262,14 +274,13 @@ export interface IKBotOptions { perplexity/sonar-reasoning-pro | paid pygmalionai/mythalion-13b | paid qwen/qwen-2-72b-instruct | paid - qwen/qwen-2-7b-instruct | paid - qwen/qwen-2-7b-instruct:free | free qwen/qwen-vl-max | paid qwen/qwen-vl-plus | paid qwen/qwen-max | paid qwen/qwen-plus | paid qwen/qwen-turbo | paid - qwen/qwen2.5-32b-instruct | paid + qwen/qwen2.5-coder-7b-instruct | paid + qwen/qwen2.5-vl-32b-instruct | paid qwen/qwen2.5-vl-32b-instruct:free | free qwen/qwen2.5-vl-3b-instruct:free | free qwen/qwen2.5-vl-72b-instruct | paid @@ -284,6 +295,7 @@ export interface IKBotOptions { qwen/qwen-2.5-72b-instruct | paid qwen/qwen-2.5-72b-instruct:free | free qwen/qwen-2.5-7b-instruct | paid + qwen/qwen-2.5-7b-instruct:free | free qwen/qwen-2.5-coder-32b-instruct | paid qwen/qwen-2.5-coder-32b-instruct:free | free featherless/qwerky-72b:free | free @@ -296,13 +308,14 @@ export interface IKBotOptions { sao10k/l3.1-70b-hanami-x1 | paid sao10k/l3.1-euryale-70b | paid sao10k/l3.3-euryale-70b | paid + shisa-ai/shisa-v2-llama3.3-70b:free | free raifle/sorcererlm-8x22b | paid steelskull/l3.3-electra-r1-70b | paid - tokyotech-llm/llama-3.1-swallow-70b-instruct-v0.3 | paid thedrummer/anubis-pro-105b-v1 | paid thedrummer/skyfall-36b-v2 | paid + thudm/glm-4-32b:free | free + thudm/glm-z1-32b:free | free undi95/toppy-m-7b | paid - undi95/toppy-m-7b:free | free scb10x/llama3.1-typhoon2-70b-instruct | paid scb10x/llama3.1-typhoon2-8b-instruct | paid thedrummer/unslopnemo-12b | paid @@ -310,6 +323,8 @@ export interface IKBotOptions { microsoft/wizardlm-2-8x22b | paid x-ai/grok-2-1212 | paid x-ai/grok-2-vision-1212 | paid + x-ai/grok-3-beta | paid + x-ai/grok-3-mini-beta | paid x-ai/grok-beta | paid x-ai/grok-vision-beta | paid xwin-lm/xwin-lm-70b | paid @@ -334,6 +349,12 @@ export interface IKBotOptions { gpt-4-turbo gpt-4-turbo-2024-04-09 gpt-4-turbo-preview + gpt-4.1 + gpt-4.1-2025-04-14 + gpt-4.1-mini + gpt-4.1-mini-2025-04-14 + gpt-4.1-nano + gpt-4.1-nano-2025-04-14 gpt-4.5-preview gpt-4.5-preview-2025-02-27 gpt-4o @@ -369,6 +390,8 @@ export interface IKBotOptions { o1-pro-2025-03-19 o3-mini o3-mini-2025-01-31 + o4-mini + o4-mini-2025-04-16 omni-moderation-2024-09-26 omni-moderation-latest text-embedding-3-large @@ -425,6 +448,8 @@ export interface IKBotOptions { JSON,JSONUnescape,JSONPretty,AlphaSort,code,JSONParse,trim */ filters?: (string | ("JSON" | "JSONUnescape" | "JSONPretty" | "AlphaSort" | "code" | "JSONParse" | "trim")[] | string[] | ((...args_0: unknown[]) => unknown)[]); + /** JSONPath query to be used to transform input objects */ + query?: (string | null); /** Dry run - only write out parameters without making API calls */ dry?: (boolean | string); /** Format for structured outputs. Can be a Zod schema, a Zod schema string, a JSON schema string, or a path to a JSON file. */ diff --git a/packages/ai-tools/src/lib/tools/fs.ts b/packages/ai-tools/src/lib/tools/fs.ts index 955ef002..ecdfcf30 100644 --- a/packages/ai-tools/src/lib/tools/fs.ts +++ b/packages/ai-tools/src/lib/tools/fs.ts @@ -7,7 +7,8 @@ import { sync as write } from '@polymech/fs/write' import { sync as read } from '@polymech/fs/read' import { sync as rename } from '@polymech/fs/rename' import { sync as exists } from '@polymech/fs/exists' - +import { sanitizeFilename } from "@polymech/fs/utils" +import { sanitize } from "@polymech/fs/utils" import { filesEx } from '@polymech/commons' import { toolLogger } from '../../index.js' @@ -52,6 +53,51 @@ export const decode_base64 = (base64: string): string => { } }; +// Helper function for smart Base64 decoding +const decodeContentSmart = (content: string, logger: any, identifier: string): string => { + if (!content || typeof content !== 'string') { + return content; // Return original content if null, undefined, or not a string + } + + const lines = content.split(/\r?\n/); + const processedLines = lines.map(line => { + const trimmedLine = line.trim(); + if (!trimmedLine) { + return ''; // Preserve empty lines between potential blocks but decode the blocks themselves + } + + try { + // Attempt to decode Base64 + const decodedLine = Buffer.from(trimmedLine, 'base64').toString('utf-8'); + // Validate if it was actually Base64 by re-encoding + const reEncodedLine = Buffer.from(decodedLine, 'utf-8').toString('base64'); + + // Revised Validation Check: + // Compare original trimmed line with re-encoded line. + // Allow for potential padding differences by checking both exact match and no-pad match. + const originalNoPad = trimmedLine.replace(/={1,2}$/, ''); + const reEncodedNoPad = reEncodedLine.replace(/={1,2}$/, ''); + + if (reEncodedLine === trimmedLine || reEncodedNoPad === originalNoPad) { + logger.debug(`Successfully decoded Base64 line for ${identifier}`); + return decodedLine; + } + // If validation fails, treat as plain text + logger.debug(`Re-encoding mismatch for ${identifier}. Original: '${trimmedLine}', Re-encoded: '${reEncodedLine}', using original trimmed line.`); + return trimmedLine; + } catch (decodeError) { + // If decoding throws an error, assume it's plain text + // Use debug level as this is expected for non-base64 lines + logger.debug(`Base64 decoding failed for line in ${identifier}, assuming plain text. Line: ${trimmedLine}`); + return trimmedLine; // Return original trimmed line + } + }); + + + // Join the processed lines back together + return processedLines.join('\n'); +}; + export const tools = (target: string, options: IKBotTask): Array => { const logger = toolLogger('fs', options) const category = 'fs' @@ -71,7 +117,7 @@ export const tools = (target: string, options: IKBotTask): Array => { }, function: async (params: any) => { try { - const directory = path.join(target, params.directory); + const directory = path.join(target, sanitize(params.directory)); if (!exists(directory)) { logger.debug(`Tool::ListFiles Directory ${directory} does not exist`); return [] @@ -150,7 +196,7 @@ export const tools = (target: string, options: IKBotTask): Array => { }, function: async (params: any) => { try { - const filePath = path.join(target, params.path); + const filePath = path.join(target, sanitize(params.path)); logger.debug(`Tool::RemoveFile Removing file ${filePath}`); rm(filePath); return true; @@ -177,9 +223,10 @@ export const tools = (target: string, options: IKBotTask): Array => { }, function: async (params: any) => { try { - const src = path.join(target, params.src) - logger.debug(`Tool::Rename file ${src} to ${params.dst}`) - rename(src, params.dst) + const src = path.join(target, sanitize(params.src)) + const dst = path.join(target, sanitize(params.dst)) + logger.debug(`Tool::Rename file ${src} to ${dst}`) + rename(src, dst) rm(src) return true } catch (error) { @@ -224,24 +271,31 @@ export const tools = (target: string, options: IKBotTask): Array => { files = JSON.parse(files) } catch (error: any) { logger.error(`Tool::modify_project_files : Structure Error parsing files`, error, ret) - write(path.join(target, 'tools-output.json'), files) + // Consider writing the raw input for debugging if JSON parsing fails + // write(path.join(target, 'tools-output-error.json'), files) return error.message } } for (const file of files) { - const filePath = path.join(target, file.path); + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath); logger.debug(`Tool:modify_project_files writing file ${filePath}`) try { - let content = decode_base64(file.content) - await write(filePath, content) + const contentToWrite = decodeContentSmart(file.content, logger, sanitizedPath); + try { + await write(filePath, contentToWrite) + } catch (writeError) { + logger.error(`Tool:modify_project_files Error writing file ${filePath}`, writeError) + } } catch (error) { - logger.error(`Tool:modify_project_files Error writing file`, error) + logger.error(`Tool:modify_project_files Error processing file content for ${filePath}`, error) } } } catch (error) { logger.error(`Error creating project structure`, error) } }, + parse: JSON.parse, }, } as RunnableToolFunction<{ id: string }>, @@ -264,28 +318,42 @@ export const tools = (target: string, options: IKBotTask): Array => { required: ["file"], }, function: async (params) => { + let fileInfo; try { if (isString(params)) { try { params = JSON.parse(params) } catch (error: any) { - logger.error(`Tool::create_file : Structure Error parsing files`, error, params) + logger.error(`Tool::write_file : Structure Error parsing JSON`, error, params) return error.message } } - let { file } = params as any - if (!target || !file.path || !file.content) { - logger.error(`Tool::create_file : Path/Target/Content are required to create file`, params) - return + + fileInfo = (params as any).file; // Keep fileInfo accessible + + if (!target || !fileInfo || !fileInfo.path || typeof fileInfo.content === 'undefined') { + logger.error(`Tool::write_file : Path/Target/Content are required`, fileInfo) + return false; // Indicate failure + } + + const sanitizedPath = sanitize(fileInfo.path); + const filePath = path.join(target, sanitizedPath) + logger.debug(`Tool::write_file Writing file ${filePath}`) + + try { + // Use the smart decoding helper function + const contentToWrite = decodeContentSmart(fileInfo.content, logger, sanitizedPath); + + await write(filePath, contentToWrite) + return true + } catch (error) { + // Log error related to processing or writing the file + logger.error(`Tool:write_file Error processing or writing file ${sanitizedPath}`, error) + return false // Indicate failure } - let content = decode_base64(file.content) - logger.debug(`Tool::create_file Writing file ${file.path} in ${target}`) - const filePath = path.join(target, file.path) - write(filePath, content) - return true } catch (error) { - logger.error(`Tool:create_file Error writing file`, error) - return false + logger.error(`Tool:write_file Error writing file ${fileInfo?.path ? sanitize(fileInfo.path) : 'unknown'}`, error) + return false // Indicate failure } }, parse: JSON.parse, @@ -320,10 +388,11 @@ export const tools = (target: string, options: IKBotTask): Array => { } const { file } = ret as any if (!target || !file.path) { - logger.error(`Tool::file_exists : Path is required to `, ret) + logger.error(`Tool::file_exists : Path is required`, ret) return } - const filePath = path.join(target, file.path) + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath) const res = exists(filePath) logger.debug(`Tool::file_exists ${filePath} exists: ${res}`) return res ? true : false @@ -355,7 +424,8 @@ export const tools = (target: string, options: IKBotTask): Array => { function: async (ret) => { try { const { file } = ret as any - const filePath = path.join(target, file.path) + const sanitizedPath = sanitize(file.path); + const filePath = path.join(target, sanitizedPath) logger.debug(`Tool::ReadFile Reading file ${filePath}`) return read(filePath, 'string') } catch (error) { diff --git a/packages/ai-tools/src/types_kbot.ts b/packages/ai-tools/src/types_kbot.ts index f9fd90ec..011bfa63 100644 --- a/packages/ai-tools/src/types_kbot.ts +++ b/packages/ai-tools/src/types_kbot.ts @@ -25,6 +25,7 @@ export interface IKBotOptions {  01-ai/yi-large | paid aetherwiing/mn-starcannon-12b | paid + agentica-org/deepcoder-14b-preview:free | free ai21/jamba-1-5-large | paid ai21/jamba-1-5-mini | paid ai21/jamba-1.6-large | paid @@ -34,8 +35,8 @@ export interface IKBotOptions { aion-labs/aion-1.0-mini | paid aion-labs/aion-rp-llama-3.1-8b | paid jondurbin/airoboros-l2-70b | paid + alfredpros/codellama-7b-instruct-solidity | paid allenai/molmo-7b-d:free | free - allenai/olmo-2-0325-32b-instruct | paid amazon/nova-lite-v1 | paid amazon/nova-micro-v1 | paid amazon/nova-pro-v1 | paid @@ -62,6 +63,7 @@ export interface IKBotOptions { anthropic/claude-2.0:beta | paid anthropic/claude-2.1 | paid anthropic/claude-2.1:beta | paid + arliai/qwq-32b-arliai-rpr-v1:free | free openrouter/auto | paid bytedance-research/ui-tars-72b:free | free cohere/command | paid @@ -93,23 +95,26 @@ export interface IKBotOptions { cognitivecomputations/dolphin-mixtral-8x22b | paid cognitivecomputations/dolphin3.0-mistral-24b:free | free cognitivecomputations/dolphin3.0-r1-mistral-24b:free | free + eleutherai/llemma_7b | paid eva-unit-01/eva-llama-3.33-70b | paid eva-unit-01/eva-qwen-2.5-32b | paid eva-unit-01/eva-qwen-2.5-72b | paid sao10k/fimbulvetr-11b-v2 | paid alpindale/goliath-120b | paid - google/gemini-2.0-flash-lite-001 | paid - google/gemini-2.0-flash-thinking-exp-1219:free | free - google/gemini-2.0-flash-thinking-exp:free | free google/gemini-flash-1.5 | paid google/gemini-flash-1.5-8b | paid google/gemini-flash-1.5-8b-exp | paid + google/gemini-pro-1.5 | paid google/gemini-2.0-flash-001 | paid google/gemini-2.0-flash-exp:free | free - google/gemini-pro | paid - google/gemini-pro-1.5 | paid - google/gemini-2.0-pro-exp-02-05:free | free + google/gemini-2.0-flash-lite-001 | paid + google/gemini-2.0-flash-thinking-exp-1219:free | free + google/gemini-2.0-flash-thinking-exp:free | free + google/gemini-2.5-flash-preview | paid + google/gemini-2.5-flash-preview:thinking | paid google/gemini-2.5-pro-exp-03-25:free | free + google/gemini-2.5-pro-preview-03-25 | paid + google/gemini-pro | paid google/gemini-pro-vision | paid google/gemma-2-27b-it | paid google/gemma-2-9b-it | paid @@ -121,7 +126,6 @@ export interface IKBotOptions { google/gemma-3-27b-it:free | free google/gemma-3-4b-it | paid google/gemma-3-4b-it:free | free - google/gemma-7b-it | paid google/learnlm-1.5-pro-experimental:free | free google/palm-2-chat-bison | paid google/palm-2-chat-bison-32k | paid @@ -144,7 +148,6 @@ export interface IKBotOptions { meta-llama/llama-2-70b-chat | paid meta-llama/llama-3-70b-instruct | paid meta-llama/llama-3-8b-instruct | paid - meta-llama/llama-3-8b-instruct:free | free meta-llama/llama-3.1-405b | paid meta-llama/llama-3.1-405b-instruct | paid meta-llama/llama-3.1-70b-instruct | paid @@ -159,13 +162,15 @@ export interface IKBotOptions { meta-llama/llama-3.2-90b-vision-instruct | paid meta-llama/llama-3.3-70b-instruct | paid meta-llama/llama-3.3-70b-instruct:free | free + meta-llama/llama-4-maverick | paid + meta-llama/llama-4-maverick:free | free + meta-llama/llama-4-scout | paid + meta-llama/llama-4-scout:free | free meta-llama/llama-guard-2-8b | paid microsoft/phi-4 | paid microsoft/phi-4-multimodal-instruct | paid microsoft/phi-3-medium-128k-instruct | paid - microsoft/phi-3-medium-128k-instruct:free | free microsoft/phi-3-mini-128k-instruct | paid - microsoft/phi-3-mini-128k-instruct:free | free microsoft/phi-3.5-mini-128k-instruct | paid sophosympatheia/midnight-rose-70b | paid minimax/minimax-01 | paid @@ -193,14 +198,13 @@ export interface IKBotOptions { mistralai/mistral-small-3.1-24b-instruct | paid mistralai/mistral-small-3.1-24b-instruct:free | free mistralai/mixtral-8x22b-instruct | paid - mistralai/mixtral-8x7b | paid mistralai/mixtral-8x7b-instruct | paid mistralai/pixtral-12b | paid mistralai/pixtral-large-2411 | paid mistralai/mistral-saba | paid + moonshotai/kimi-vl-a3b-thinking:free | free moonshotai/moonlight-16b-a3b-instruct:free | free gryphe/mythomax-l2-13b | paid - gryphe/mythomax-l2-13b:free | free neversleep/llama-3-lumimaid-70b | paid neversleep/llama-3-lumimaid-8b | paid neversleep/llama-3-lumimaid-8b:extended | paid @@ -215,6 +219,9 @@ export interface IKBotOptions { nousresearch/hermes-2-pro-llama-3-8b | paid nvidia/llama-3.1-nemotron-70b-instruct | paid nvidia/llama-3.1-nemotron-70b-instruct:free | free + nvidia/llama-3.1-nemotron-nano-8b-v1:free | free + nvidia/llama-3.1-nemotron-ultra-253b-v1:free | free + nvidia/llama-3.3-nemotron-super-49b-v1:free | free open-r1/olympiccoder-32b:free | free open-r1/olympiccoder-7b:free | free openai/chatgpt-4o-latest | paid @@ -231,6 +238,9 @@ export interface IKBotOptions { openai/gpt-4-turbo | paid openai/gpt-4-1106-preview | paid openai/gpt-4-turbo-preview | paid + openai/gpt-4.1 | paid + openai/gpt-4.1-mini | paid + openai/gpt-4.1-nano | paid openai/gpt-4.5-preview | paid openai/gpt-4o | paid openai/gpt-4o-2024-05-13 | paid @@ -247,11 +257,13 @@ export interface IKBotOptions { openai/o1-preview | paid openai/o1-preview-2024-09-12 | paid openai/o1-pro | paid + openai/o3 | paid openai/o3-mini | paid openai/o3-mini-high | paid + openai/o4-mini | paid + openai/o4-mini-high | paid openchat/openchat-7b | paid - openchat/openchat-7b:free | free - teknium/openhermes-2.5-mistral-7b | paid + all-hands/openhands-lm-32b-v0.1 | paid perplexity/llama-3.1-sonar-large-128k-online | paid perplexity/llama-3.1-sonar-small-128k-online | paid perplexity/r1-1776 | paid @@ -262,14 +274,13 @@ export interface IKBotOptions { perplexity/sonar-reasoning-pro | paid pygmalionai/mythalion-13b | paid qwen/qwen-2-72b-instruct | paid - qwen/qwen-2-7b-instruct | paid - qwen/qwen-2-7b-instruct:free | free qwen/qwen-vl-max | paid qwen/qwen-vl-plus | paid qwen/qwen-max | paid qwen/qwen-plus | paid qwen/qwen-turbo | paid - qwen/qwen2.5-32b-instruct | paid + qwen/qwen2.5-coder-7b-instruct | paid + qwen/qwen2.5-vl-32b-instruct | paid qwen/qwen2.5-vl-32b-instruct:free | free qwen/qwen2.5-vl-3b-instruct:free | free qwen/qwen2.5-vl-72b-instruct | paid @@ -284,6 +295,7 @@ export interface IKBotOptions { qwen/qwen-2.5-72b-instruct | paid qwen/qwen-2.5-72b-instruct:free | free qwen/qwen-2.5-7b-instruct | paid + qwen/qwen-2.5-7b-instruct:free | free qwen/qwen-2.5-coder-32b-instruct | paid qwen/qwen-2.5-coder-32b-instruct:free | free featherless/qwerky-72b:free | free @@ -296,13 +308,14 @@ export interface IKBotOptions { sao10k/l3.1-70b-hanami-x1 | paid sao10k/l3.1-euryale-70b | paid sao10k/l3.3-euryale-70b | paid + shisa-ai/shisa-v2-llama3.3-70b:free | free raifle/sorcererlm-8x22b | paid steelskull/l3.3-electra-r1-70b | paid - tokyotech-llm/llama-3.1-swallow-70b-instruct-v0.3 | paid thedrummer/anubis-pro-105b-v1 | paid thedrummer/skyfall-36b-v2 | paid + thudm/glm-4-32b:free | free + thudm/glm-z1-32b:free | free undi95/toppy-m-7b | paid - undi95/toppy-m-7b:free | free scb10x/llama3.1-typhoon2-70b-instruct | paid scb10x/llama3.1-typhoon2-8b-instruct | paid thedrummer/unslopnemo-12b | paid @@ -310,6 +323,8 @@ export interface IKBotOptions { microsoft/wizardlm-2-8x22b | paid x-ai/grok-2-1212 | paid x-ai/grok-2-vision-1212 | paid + x-ai/grok-3-beta | paid + x-ai/grok-3-mini-beta | paid x-ai/grok-beta | paid x-ai/grok-vision-beta | paid xwin-lm/xwin-lm-70b | paid @@ -334,6 +349,12 @@ export interface IKBotOptions { gpt-4-turbo gpt-4-turbo-2024-04-09 gpt-4-turbo-preview + gpt-4.1 + gpt-4.1-2025-04-14 + gpt-4.1-mini + gpt-4.1-mini-2025-04-14 + gpt-4.1-nano + gpt-4.1-nano-2025-04-14 gpt-4.5-preview gpt-4.5-preview-2025-02-27 gpt-4o @@ -369,6 +390,8 @@ export interface IKBotOptions { o1-pro-2025-03-19 o3-mini o3-mini-2025-01-31 + o4-mini + o4-mini-2025-04-16 omni-moderation-2024-09-26 omni-moderation-latest text-embedding-3-large @@ -425,6 +448,8 @@ export interface IKBotOptions { JSON,JSONUnescape,JSONPretty,AlphaSort,code,JSONParse,trim */ filters?: (string | ("JSON" | "JSONUnescape" | "JSONPretty" | "AlphaSort" | "code" | "JSONParse" | "trim")[] | string[] | ((...args_0: unknown[]) => unknown)[]); + /** JSONPath query to be used to transform input objects */ + query?: (string | null); /** Dry run - only write out parameters without making API calls */ dry?: (boolean | string); /** Format for structured outputs. Can be a Zod schema, a Zod schema string, a JSON schema string, or a path to a JSON file. */