UNPKG

@2501-ai/cli

Version:

[![npm version](https://img.shields.io/npm/v/@2501-ai/cli.svg)](https://www.npmjs.com/package/@2501-ai/cli) [![HumanEval Score](https://img.shields.io/badge/HumanEval-96.95%25-brightgreen.svg)](https://www.2501.ai/research/full-humaneval-benchmark) [![Lic

204 lines (203 loc) 9.19 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __asyncValues = (this && this.__asyncValues) || function (o) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isStreamingContext = exports.parseStreamedResponse = exports.getSubActionMessage = exports.getActionPostfix = exports.toItalic = exports.parseChunkedMessages = void 0; const logger_1 = __importDefault(require("../utils/logger")); const messaging_1 = require("../utils/messaging"); const chalk_1 = __importDefault(require("chalk")); const actions_1 = require("../utils/actions"); const path_1 = __importDefault(require("path")); function parseChunkedMessages(input) { const parsed = []; let currentJson = ''; let braceCount = 0; let inString = false; let escapeNext = false; for (let i = 0; i < input.length; i++) { const char = input[i]; currentJson += char; if (char === '"' && !escapeNext) { inString = !inString; } escapeNext = char === '\\' && !escapeNext; if (inString) { continue; } if (char === '{') braceCount++; if (char === '}') { if (--braceCount === 0 && currentJson.trim().length > 0) { try { parsed.push(JSON.parse(currentJson)); currentJson = ''; } catch (_a) { } } } } return { parsed, remaining: currentJson }; } exports.parseChunkedMessages = parseChunkedMessages; function toItalic(text) { return chalk_1.default.italic.gray(text.trim()); } exports.toItalic = toItalic; function getActionPostfix(action) { const functionName = (0, actions_1.getFunctionName)(action); const args = (0, actions_1.getFunctionArgs)(action); switch (functionName) { case 'read_file': return toItalic(` (Reading file: ${path_1.default.basename(args.path)})`); case 'write_file': return toItalic(` (Writing to file: ${path_1.default.basename(args.path)})`); case 'update_file': return toItalic(` (Updating file: ${path_1.default.basename(args.path)})`); case 'run_shell': const formatted = args.command.startsWith('cd') && args.command.indexOf('&&') > 0 ? args.command .split('&&') .slice(args.command.indexOf('&&') + 1) : args.command; return toItalic(` (Executing command: ${formatted})`); case 'browse_url': return toItalic(` (Browsing URL: ${args.url})`); default: return ''; } } exports.getActionPostfix = getActionPostfix; function getSubActionMessage(message, action, success) { let actionMsg = `${message}\n${chalk_1.default.gray('│')} `; const functionName = (0, actions_1.getFunctionName)(action); const args = (0, actions_1.getFunctionArgs)(action); logger_1.default.debug('Args', args); switch (functionName) { case 'read_file': actionMsg += toItalic(`└ File ${success ? 'read' : 'read failed'}: ${args.path}`); break; case 'write_file': actionMsg += toItalic(`└ File ${success ? 'written' : 'write failed'}: ${args.path}`); break; case 'update_file': actionMsg += toItalic(`└ File ${success ? 'updated' : 'update failed'}: ${args.path}`); break; case 'run_shell': actionMsg += toItalic(`└ Command ${success ? 'executed' : 'execution failed'}: ${args.command}`); break; case 'browse_url': actionMsg += toItalic(`└ URL ${success ? 'browsed' : 'browsing failed'}: ${args.url}`); break; default: actionMsg = message; } return actionMsg.trim(); } exports.getSubActionMessage = getSubActionMessage; let totalTokens = 0; function parseStreamContent(content, currentChunks = []) { try { return { streamEvents: [JSON.parse(content)], chunks: [], }; } catch (e) { const { parsed, remaining } = parseChunkedMessages(content); return { streamEvents: parsed, chunks: remaining ? [remaining, ...currentChunks] : currentChunks, }; } } function parseStreamedResponse(agentResponse) { var _a, agentResponse_1, agentResponse_1_1; var _b, e_1, _c, _d; return __awaiter(this, void 0, void 0, function* () { const actions = []; let message = ''; let chunks = []; try { for (_a = true, agentResponse_1 = __asyncValues(agentResponse); agentResponse_1_1 = yield agentResponse_1.next(), _b = agentResponse_1_1.done, !_b;) { _d = agentResponse_1_1.value; _a = false; try { const chunk = _d; let content = ''; chunks.push(chunk.toString('utf-8')); content = chunks.join(''); const { streamEvents, chunks: remainingChunks } = parseStreamContent(content, chunks); chunks = remainingChunks; streamEvents.forEach((streamEvent) => { var _a, _b; if (streamEvent.status !== 'chunked_message') { logger_1.default.debug('StreamEvent', streamEvent); } switch (streamEvent.status) { case 'requires_action': message = ''; actions.push(...((_a = streamEvent.actions) !== null && _a !== void 0 ? _a : [])); break; case 'message': message = streamEvent.message; break; case 'completed': case 'failed': message = streamEvent.message || `Task ${streamEvent.status}`; break; case 'chunked_message': if (streamEvent.message.includes(messaging_1.CHUNK_MESSAGE_CLEAR)) { message = streamEvent.message.replace(messaging_1.CHUNK_MESSAGE_CLEAR, ''); } else { message += streamEvent.message; } break; case 'usage': if (process.env.SHOW_USAGE) { totalTokens += ((_b = streamEvent.usage) === null || _b === void 0 ? void 0 : _b.total_tokens) || 0; message = `[${totalTokens} tokens used] ${message || streamEvent.message}`; } break; default: } }); } finally { _a = true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (!_a && !_b && (_c = agentResponse_1.return)) yield _c.call(agentResponse_1); } finally { if (e_1) throw e_1.error; } } return { actions, message }; }); } exports.parseStreamedResponse = parseStreamedResponse; function isStreamingContext(stream, agentResponse) { return stream && !!agentResponse; } exports.isStreamingContext = isStreamingContext;