Files
osr-mono/packages/osr-code-bot/commands/run.js
T
2025-02-02 00:15:41 +01:00

227 lines
18 KiB
JavaScript

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = exports.processRun = void 0;
const path = __importStar(require("path"));
const glob_1 = require("glob");
const dir_1 = require("@plastichub/fs/dir");
const exists_1 = require("@plastichub/fs/exists");
const write_1 = require("@plastichub/fs/write");
const read_1 = require("@plastichub/fs/read");
const osr_commons_1 = require("@plastichub/osr-commons");
const primitives_1 = require("@plastichub/core/primitives");
const __1 = require("../");
const client_1 = require("../client");
const zod_schema_1 = require("../zod_schema");
const source_1 = require("../source");
const array_1 = require("../utils/array");
const collector_1 = require("../collector");
const profile_1 = require("../profile");
const tools_1 = require("../tools");
const prompt_1 = require("../prompt");
const variables_1 = require("../variables");
const zod_schema_2 = require("../zod_schema");
const run_completion_1 = require("./run-completion");
const run_tools_1 = require("./run-tools");
const run_assistant_1 = require("./run-assistant");
const models_1 = require("../models");
const processRun = async (opts) => {
let options = null;
const target = path.resolve(opts.output || opts.path);
if (!(0, exists_1.sync)(target)) {
(0, dir_1.sync)(target);
}
opts.disable = (0, array_1.flatten)(opts.disable);
opts.disableTools = (0, array_1.flatten)(opts.disableTools);
opts.include = (0, array_1.flatten)(opts.include);
opts.variables = await (0, profile_1.load)(opts);
try {
options = (0, zod_schema_1.OptionsSchema)().parse(opts);
}
catch (error) {
__1.logger.error('Failed to parse options:', error.message, error.issues);
return;
}
const client = (0, client_1.createClient)(options);
options.variables = { ...options.variables, ...(0, variables_1.variables)(options) };
if (!client) {
__1.logger.error('Failed to create client');
return;
}
options.client = client;
options.collector = (0, collector_1.collector)(options, client);
let messages = [];
messages.push(await (0, prompt_1.prompt)(opts));
messages.push(await (0, prompt_1.preferences)(opts));
let files = await (0, source_1.get)(path.resolve(options.path), options.include) || [];
files = files.map(f => { return { ...f, role: 'user' }; });
messages = [...messages, ...files];
const params = {
model: options.model,
messages,
tools: []
};
if (options.mode === zod_schema_2.ChatCompletionType.TOOLS || options.mode === zod_schema_2.ChatCompletionType.ASSISTANT) {
params.tools = await (0, tools_1.load)(options);
params.tool_choice = 'auto';
params.parallel_tool_calls = false;
}
const logDir = path.resolve((0, osr_commons_1.resolve)(opts.logs));
const paramsPath = path.join(logDir, 'params.json');
(0, write_1.sync)(paramsPath, JSON.stringify({ ...params }, null, 2));
__1.logger.debug(`Read ${files.length} files from project ${path.resolve(options.path)} with ${options.include}`, files.map(f => f.path), options.variables, params.tools.map(t => `${t.function.name} : ${t.function.description}`));
let ret = null;
try {
switch (options.mode) {
case zod_schema_2.ChatCompletionType.COMPLETION:
ret = await (0, run_completion_1.runCompletion)(client, params, options);
break;
case zod_schema_2.ChatCompletionType.TOOLS:
ret = await (0, run_tools_1.runTools)(client, params, options);
break;
case zod_schema_2.ChatCompletionType.ASSISTANT:
ret = await (0, run_assistant_1.runAssistant)(client, params, options);
break;
default:
throw new Error(`Unsupported mode: ${options.mode}`);
}
}
catch (e) {
__1.logger.error(`Error running ${options.mode} mode: ${e.message}`);
}
opts.variables['LAST'] = ret;
return ret;
};
exports.processRun = processRun;
/**
* Extract file paths (Windows or POSIX style) from a single string,
* preserving any spaces within the paths. Needed for Salamand File Manager selections (eg: kbot "summarize, as json" -i "$(ListOfSelectedFullNames)")
* - For Windows, it looks for patterns like "C:\" (any drive letter).
* - For POSIX, it looks for a leading slash "/".
*
* Returns an array of path strings. If no matches are found, returns [].
*
*/
function extractPaths(input) {
if ((0, exists_1.sync)(path.resolve((0, osr_commons_1.resolve)(input)))) {
return [input];
}
// Matches either a Windows drive pattern like "C:\" or a forward slash "/".
// Parentheses group with `|` to match either part correctly.
const pathStartRegex = /([A-Za-z]:\\)|\//g;
const matchIndices = [];
let match;
// Collect the start index of each path
while ((match = pathStartRegex.exec(input)) !== null) {
matchIndices.push(match.index);
}
// If none found, return empty
if (!matchIndices.length) {
return [];
}
// Slice from each index to just before the next
const paths = [];
for (let i = 0; i < matchIndices.length; i++) {
const start = matchIndices[i];
const end = i < matchIndices.length - 1 ? matchIndices[i + 1] : input.length;
const path = input.substring(start, end).trim();
if (path) {
paths.push(path);
}
}
return paths;
}
function flattenArrays(arrays) {
return arrays.reduce((accumulator, current) => {
return accumulator.concat(current);
}, []);
}
const run = async (opts) => {
const ret = [];
if (opts.include) {
if ((0, primitives_1.isString)(opts.include)) {
opts.include = [opts.include];
}
if ((0, primitives_1.isArray)(opts.include)) {
opts.include = flattenArrays(opts.include.map(extractPaths));
}
opts.include = Array.from(new Set(opts.include));
}
if (opts.each) {
let items = [];
if ((0, primitives_1.isArray)(opts.each)) {
items = opts.each;
}
else if ((0, exists_1.sync)(opts.each) && (0, osr_commons_1.isFile)(opts.each) && path.parse(opts.each).ext === '.json') {
items = (0, read_1.sync)(opts.each, 'json') || [];
}
else if ((0, glob_1.hasMagic)(opts.each)) {
const info = (0, osr_commons_1.pathInfoEx)((0, osr_commons_1.forward_slash)(path.resolve((0, osr_commons_1.resolve)(opts.each))));
items = info.FILES;
}
else if ((0, osr_commons_1.isFile)(opts.each) && (0, exists_1.sync)(opts.each)) {
items = [opts.each];
}
else if ((0, primitives_1.isString)(opts.each)) {
items = opts.each.split(',');
}
if (items.length === 0) {
__1.logger.warn(`No files matching pattern ${opts.each} found in ${opts.path}`);
return ret;
}
__1.logger.info(`Processing ${items.length} items matching pattern ${opts.each}...`);
const _models = (0, models_1.all)();
for (const item of items) {
const itemOpts = {
...opts,
ITEM: item,
variables: { ITEM: item }
};
//override model if item is a model id
const model = _models.find(m => m.id === item);
if (model) {
itemOpts.model = item;
}
itemOpts.include = [...opts.include, ...[(0, osr_commons_1.forward_slash)(item)]];
ret.push(await (0, exports.processRun)(itemOpts));
}
}
else {
ret.push(await (0, exports.processRun)(opts));
}
return ret;
};
exports.run = run;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEI7QUFDNUIsK0JBQStCO0FBQy9CLDRDQUFnRDtBQUNoRCxrREFBc0Q7QUFDdEQsZ0RBQW9EO0FBQ3BELDhDQUFrRDtBQUNsRCx5REFBOEY7QUFDOUYsNERBQStEO0FBRy9ELDJCQUE0QjtBQUM1QixzQ0FBd0M7QUFDeEMsOENBQTZDO0FBQzdDLHNDQUErQjtBQUMvQiwwQ0FBd0M7QUFDeEMsNENBQXdDO0FBQ3hDLHdDQUFnRDtBQUNoRCxvQ0FBNEM7QUFDNUMsc0NBQStDO0FBQy9DLDRDQUF3QztBQUN4Qyw4Q0FBa0Q7QUFFbEQscURBQWdEO0FBQ2hELDJDQUFzQztBQUN0QyxtREFBOEM7QUFFOUMsc0NBQStCO0FBRXhCLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxJQUFlLEVBQUUsRUFBRTtJQUVsRCxJQUFJLE9BQU8sR0FBYyxJQUFJLENBQUE7SUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsSUFBQSxhQUFNLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFBLFVBQUcsRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUNiLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNw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