@zhanngning/hecode 0.8.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -270
- package/bin/hecode +2 -0
- package/dist/index.js +103 -14693
- package/package.json +20 -38
- package/dist/chunk-5WRI5ZAA.js +0 -31
- package/dist/chunk-5WRI5ZAA.js.map +0 -1
- package/dist/chunk-I4W33CWB.js +0 -670
- package/dist/chunk-I4W33CWB.js.map +0 -1
- package/dist/chunk-YTG4MQHX.js +0 -10177
- package/dist/chunk-YTG4MQHX.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/node-JCJZZBSH.js +0 -872
- package/dist/node-JCJZZBSH.js.map +0 -1
- package/dist/orchestrator-2GXELO2X.js +0 -8
- package/dist/orchestrator-2GXELO2X.js.map +0 -1
- package/skills/code-review/SKILL.md +0 -69
- package/skills/coding/SKILL.md +0 -11
- package/skills/content/SKILL.md +0 -77
- package/skills/data-analysis/SKILL.md +0 -76
- package/skills/docs/SKILL.md +0 -63
- package/skills/explain/SKILL.md +0 -67
- package/skills/finance/SKILL.md +0 -51
- package/skills/git/SKILL.md +0 -81
- package/skills/perf/SKILL.md +0 -89
- package/skills/planning/SKILL.md +0 -84
- package/skills/ppt/SKILL.md +0 -47
- package/skills/refactor/SKILL.md +0 -73
- package/skills/security/SKILL.md +0 -86
- package/skills/testing/SKILL.md +0 -36
- package/skills/translate/SKILL.md +0 -75
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/read_file.ts","../src/tools/write_file.ts","../src/tools/edit_file.ts","../src/tools/bash.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/datasources/akshare.ts","../src/workflow/state.ts","../src/workflow/engine.ts","../src/workflow/nodes/data-collection.ts","../src/workflow/nodes/analysis.ts","../src/workflow/nodes/report.ts","../src/tools/finance.ts","../src/tools/index.ts","../src/core/orchestrator.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const readFileTool: Tool = {\n name: \"read_file\",\n description: \"Read file content. Supports offset and limit for large files.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\", description: \"Absolute path to the file\" },\n offset: { type: \"number\", description: \"Line number to start from (1-indexed)\" },\n limit: { type: \"number\", description: \"Max lines to read (default 2000)\" },\n },\n required: [\"file_path\"],\n },\n async execute(params): Promise<ToolResult> {\n try {\n const content = await readFile(params.file_path as string, \"utf-8\");\n const lines = content.split(\"\\n\");\n const offset = (params.offset as number) || 1;\n const limit = (params.limit as number) || 2000;\n const sliced = lines.slice(offset - 1, offset - 1 + limit);\n const numbered = sliced.map((line, i) => `${offset + i}: ${line}`).join(\"\\n\");\n return { output: numbered };\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n },\n};\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const writeFileTool: Tool = {\n name: \"write_file\",\n description: \"Write content to a file. Creates parent directories if needed.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\", description: \"Absolute path to the file\" },\n content: { type: \"string\", description: \"Content to write\" },\n },\n required: [\"file_path\", \"content\"],\n },\n async execute(params): Promise<ToolResult> {\n try {\n await mkdir(dirname(params.file_path as string), { recursive: true });\n await writeFile(params.file_path as string, params.content as string, \"utf-8\");\n return { output: `File written: ${params.file_path}` };\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const editFileTool: Tool = {\n name: \"edit_file\",\n description:\n \"Replace exact string match in a file. Fails if old_string not found or matches multiple times.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\", description: \"Absolute path to the file\" },\n old_string: { type: \"string\", description: \"Exact string to replace\" },\n new_string: { type: \"string\", description: \"Replacement string\" },\n replace_all: { type: \"boolean\", description: \"Replace all occurrences (default false)\" },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n },\n async execute(params): Promise<ToolResult> {\n try {\n const content = await readFile(params.file_path as string, \"utf-8\");\n const oldStr = params.old_string as string;\n const newStr = params.new_string as string;\n const replaceAll = params.replace_all as boolean;\n\n if (!content.includes(oldStr)) {\n return { output: \"\", error: `old_string not found in ${params.file_path}` };\n }\n\n let result: string;\n if (replaceAll) {\n result = content.replaceAll(oldStr, newStr);\n } else {\n const count = content.split(oldStr).length - 1;\n if (count > 1) {\n return {\n output: \"\",\n error: `Found ${count} matches for old_string. Provide more context or set replace_all=true.`,\n };\n }\n result = content.replace(oldStr, newStr);\n }\n\n await writeFile(params.file_path as string, result, \"utf-8\");\n return { output: `Edited: ${params.file_path}` };\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n },\n};\n","import { exec } from \"node:child_process\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const bashTool: Tool = {\n name: \"bash\",\n description: \"Execute a shell command. Returns stdout and stderr.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\", description: \"The command to execute\" },\n timeout: { type: \"number\", description: \"Timeout in ms (default 120000)\" },\n workdir: { type: \"string\", description: \"Working directory\" },\n },\n required: [\"command\"],\n },\n async execute(params): Promise<ToolResult> {\n return new Promise((resolve) => {\n const timeout = (params.timeout as number) || 120_000;\n exec(\n params.command as string,\n {\n timeout,\n cwd: (params.workdir as string) || process.cwd(),\n encoding: \"utf-8\",\n },\n (error, stdout, stderr) => {\n if (error && error.killed) {\n resolve({\n output: stdout ?? \"\",\n error: `Command timed out after ${timeout}ms`,\n });\n } else if (error && !stdout && !stderr) {\n resolve({ output: \"\", error: error.message });\n } else {\n resolve({ output: [stdout, stderr].filter(Boolean).join(\"\\n\").trim() });\n }\n },\n );\n });\n },\n};\n","import { glob } from \"node:fs/promises\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const globTool: Tool = {\n name: \"glob\",\n description: \"Find files matching a glob pattern.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description: \"Glob pattern (e.g. '**/*.ts', 'src/**/*.test.*')\",\n },\n path: { type: \"string\", description: \"Directory to search in (default: cwd)\" },\n },\n required: [\"pattern\"],\n },\n async execute(params): Promise<ToolResult> {\n try {\n const files: string[] = [];\n for await (const f of glob(params.pattern as string, {\n cwd: (params.path as string) || process.cwd(),\n })) {\n files.push(f);\n }\n files.sort();\n return { output: files.join(\"\\n\") || \"No files found\" };\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n },\n};\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const grepTool: Tool = {\n name: \"grep\",\n description:\n \"Search file contents using regex. Returns file paths and matching line numbers.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"Regex pattern to search for\" },\n path: { type: \"string\", description: \"Directory to search in (default: cwd)\" },\n include: { type: \"string\", description: \"File pattern to include (e.g. '*.ts')\" },\n },\n required: [\"pattern\"],\n },\n async execute(params): Promise<ToolResult> {\n try {\n const regex = new RegExp(params.pattern as string, \"gi\");\n const rootDir = (params.path as string) || process.cwd();\n const includePattern = params.include as string | undefined;\n const results: string[] = [];\n\n async function searchDir(dir: string, depth: number) {\n if (depth > 10 || results.length >= 200) return;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await searchDir(fullPath, depth + 1);\n } else if (entry.isFile()) {\n if (includePattern && !matchGlob(entry.name, includePattern)) continue;\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) {\n results.push(`${fullPath}:${i + 1}: ${lines[i]!.trim()}`);\n if (results.length >= 200) return;\n }\n regex.lastIndex = 0;\n }\n } catch {\n /* skip binary/unreadable files */\n }\n }\n }\n }\n\n await searchDir(rootDir, 0);\n return { output: results.join(\"\\n\") || \"No matches found\" };\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n },\n};\n\nfunction matchGlob(filename: string, pattern: string): boolean {\n const regexStr = \"^\" + pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\") + \"$\";\n return new RegExp(regexStr, \"i\").test(filename);\n}\n","import { exec } from \"child_process\";\nimport { promisify } from \"util\";\nimport path from \"path\";\nimport { DataSource, StockInfo, FinancialData, HistoryData } from \"./index.js\";\n\nconst execAsync = promisify(exec);\n\nexport class AkshareDataSource implements DataSource {\n private scriptPath: string;\n\n constructor() {\n this.scriptPath = path.join(import.meta.dirname, \"akshare_datasource.py\");\n }\n\n async getStockInfo(code: string, market: string = \"A\"): Promise<StockInfo> {\n const { stdout } = await execAsync(\n `python ${this.scriptPath} info ${code} ${market}`\n );\n const data = JSON.parse(stdout);\n if (data.error) throw new Error(data.error);\n \n return {\n code,\n name: data[0]?.name || code,\n market,\n date: data[0]?.date,\n open: data[0]?.open,\n close: data[0]?.close,\n high: data[0]?.high,\n low: data[0]?.low,\n volume: data[0]?.volume,\n amount: data[0]?.amount,\n change_pct: data[0]?.change_pct,\n };\n }\n\n async getFinancialData(code: string, market: string = \"A\"): Promise<FinancialData> {\n const { stdout } = await execAsync(\n `python ${this.scriptPath} financial ${code} ${market}`\n );\n const data = JSON.parse(stdout);\n if (data.error) throw new Error(data.error);\n \n return {\n code,\n price: data[0]?.price,\n change_pct: data[0]?.change_pct,\n volume: data[0]?.volume,\n amount: data[0]?.amount,\n turnover: data[0]?.turnover,\n };\n }\n\n async getStockHistory(code: string, market: string = \"A\", days: number = 30): Promise<HistoryData[]> {\n const { stdout } = await execAsync(\n `python ${this.scriptPath} history ${code} ${market} ${days}`\n );\n const data = JSON.parse(stdout);\n if (data.error) throw new Error(data.error);\n \n return data.map((item: any) => ({\n date: item.date,\n open: item.open,\n close: item.close,\n high: item.high,\n low: item.low,\n volume: item.volume,\n change_pct: item.change_pct,\n }));\n }\n}\n","export interface TargetInfo {\n company: string;\n code: string;\n market: string;\n}\n\nexport interface CollectedData {\n stockInfo?: any;\n financial?: any;\n history?: any[];\n shareholder?: any;\n industry?: any;\n}\n\nexport interface AnalysisResult {\n financial?: {\n revenue?: number;\n netProfit?: number;\n roe?: number;\n growth?: number;\n price?: number;\n change_pct?: number;\n volume?: number;\n amount?: number;\n turnover?: number;\n };\n valuation?: {\n pe?: number;\n pb?: number;\n dcf?: number;\n };\n comparison?: {\n industry?: string;\n peers?: any[];\n trendSignal?: string;\n };\n trend?: {\n ma5?: number;\n ma10?: number;\n ma20?: number;\n rsi?: number;\n macd?: number;\n };\n}\n\nexport interface OutputResult {\n report?: string;\n charts?: string[];\n format?: \"markdown\" | \"word\";\n}\n\nexport interface WorkflowState {\n target: TargetInfo;\n data: CollectedData;\n analysis: AnalysisResult;\n output: OutputResult;\n status: \"pending\" | \"collecting\" | \"analyzing\" | \"generating\" | \"done\" | \"error\";\n error?: string;\n}\n\nexport function createInitialState(target: TargetInfo): WorkflowState {\n return {\n target,\n data: {},\n analysis: {},\n output: {},\n status: \"pending\",\n };\n}\n","import { WorkflowState, createInitialState, TargetInfo } from \"./state.js\";\n\nexport type NodeFunction = (state: WorkflowState) => Promise<WorkflowState>;\n\nexport interface WorkflowConfig {\n nodes: NodeFunction[];\n onStateChange?: (state: WorkflowState) => void;\n}\n\nexport class WorkflowEngine {\n private nodes: NodeFunction[];\n private onStateChange?: (state: WorkflowState) => void;\n\n constructor(config: WorkflowConfig) {\n this.nodes = config.nodes;\n this.onStateChange = config.onStateChange;\n }\n\n async execute(target: TargetInfo): Promise<WorkflowState> {\n let state = createInitialState(target);\n\n for (const node of this.nodes) {\n state = await node(state);\n this.onStateChange?.(state);\n\n if (state.status === \"error\") {\n throw new Error(state.error);\n }\n }\n\n return state;\n }\n}\n","import { WorkflowState } from \"../state.js\";\nimport { DataSource } from \"../../datasources/index.js\";\n\nexport async function dataCollectionNode(\n state: WorkflowState,\n dataSource: DataSource\n): Promise<WorkflowState> {\n const { code, market } = state.target;\n \n try {\n const [stockInfo, financial, history] = await Promise.all([\n dataSource.getStockInfo(code, market),\n dataSource.getFinancialData(code, market),\n dataSource.getStockHistory(code, market, 30),\n ]);\n\n return {\n ...state,\n data: {\n stockInfo,\n financial,\n history,\n },\n status: \"collecting\",\n };\n } catch (error: any) {\n return {\n ...state,\n status: \"error\",\n error: `数据采集失败: ${error.message}`,\n };\n }\n}\n","import { WorkflowState } from \"../state.js\";\n\nfunction calculateMA(data: number[], period: number): number | undefined {\n if (data.length < period) return undefined;\n const slice = data.slice(-period);\n return slice.reduce((a, b) => a + b, 0) / period;\n}\n\nfunction calculateRSI(prices: number[], period: number = 14): number | undefined {\n if (prices.length < period + 1) return undefined;\n \n let gains = 0;\n let losses = 0;\n \n for (let i = prices.length - period; i < prices.length; i++) {\n const change = prices[i] - prices[i - 1];\n if (change > 0) {\n gains += change;\n } else {\n losses -= change;\n }\n }\n \n const avgGain = gains / period;\n const avgLoss = losses / period;\n \n if (avgLoss === 0) return 100;\n \n const rs = avgGain / avgLoss;\n return 100 - (100 / (1 + rs));\n}\n\nexport async function analysisNode(state: WorkflowState): Promise<WorkflowState> {\n if (state.status === \"error\") return state;\n\n const { financial, history, stockInfo } = state.data;\n\n try {\n // 价格数据\n const prices = history?.map((h: any) => h.close) || [];\n \n // 计算技术指标\n const ma5 = calculateMA(prices, 5);\n const ma10 = calculateMA(prices, 10);\n const ma20 = calculateMA(prices, 20);\n const rsi = calculateRSI(prices);\n\n // 财务分析\n const financialAnalysis = {\n price: financial?.price,\n change_pct: financial?.change_pct,\n volume: financial?.volume,\n amount: financial?.amount,\n turnover: financial?.turnover,\n };\n\n // 趋势分析\n const trend = {\n ma5: ma5 ? Math.round(ma5 * 100) / 100 : undefined,\n ma10: ma10 ? Math.round(ma10 * 100) / 100 : undefined,\n ma20: ma20 ? Math.round(ma20 * 100) / 100 : undefined,\n rsi: rsi ? Math.round(rsi * 100) / 100 : undefined,\n };\n\n // 趋势判断\n let trendSignal = \"中性\";\n if (ma5 && ma10 && ma20) {\n if (ma5 > ma10 && ma10 > ma20) {\n trendSignal = \"上升趋势\";\n } else if (ma5 < ma10 && ma10 < ma20) {\n trendSignal = \"下降趋势\";\n }\n }\n\n return {\n ...state,\n analysis: {\n financial: financialAnalysis,\n trend,\n comparison: {\n industry: stockInfo?.industry || \"未知\",\n trendSignal,\n },\n },\n status: \"analyzing\",\n };\n } catch (error: any) {\n return {\n ...state,\n status: \"error\",\n error: `分析失败: ${error.message}`,\n };\n }\n}\n","import { WorkflowState } from \"../state.js\";\n\nexport async function reportNode(state: WorkflowState): Promise<WorkflowState> {\n if (state.status === \"error\") return state;\n\n const { target, analysis, data } = state;\n\n try {\n const report = `# ${target.company} (${target.code}) 研究报告\n\n## 公司概况\n- **股票代码**: ${target.code}\n- **市场**: ${target.market}\n- **行业**: ${analysis.comparison?.industry || \"未知\"}\n\n## 价格信息\n- **当前价格**: ¥${analysis.financial?.price || \"N/A\"}\n- **涨跌幅**: ${analysis.financial?.change_pct || \"N/A\"}%\n- **成交量**: ${analysis.financial?.volume ? (analysis.financial.volume / 10000).toFixed(2) + \"万手\" : \"N/A\"}\n- **成交额**: ${analysis.financial?.amount ? (analysis.financial.amount / 100000000).toFixed(2) + \"亿\" : \"N/A\"}\n\n## 技术分析\n- **5日均线**: ¥${analysis.trend?.ma5 || \"N/A\"}\n- **10日均线**: ¥${analysis.trend?.ma10 || \"N/A\"}\n- **20日均线**: ¥${analysis.trend?.ma20 || \"N/A\"}\n- **RSI(14)**: ${analysis.trend?.rsi || \"N/A\"}\n- **趋势信号**: ${analysis.comparison?.trendSignal || \"中性\"}\n\n## 近期走势\n${data.history ? data.history.slice(-5).map((h: any) => \n `- ${h.date}: 开盘 ¥${h.open} | 收盘 ¥${h.close} | 涨跌 ${h.change_pct}%`\n).join(\"\\n\") : \"无数据\"}\n\n## 投资建议\n基于技术分析,${target.company} 当前处于 **${analysis.comparison?.trendSignal || \"中性\"}**。\n\n${analysis.trend?.rsi && analysis.trend.rsi > 70 ? \"⚠️ RSI 超买区域,注意回调风险\" : \"\"}\n${analysis.trend?.rsi && analysis.trend.rsi < 30 ? \"✅ RSI 超卖区域,可能存在反弹机会\" : \"\"}\n\n---\n*报告生成时间: ${new Date().toISOString()}*\n*数据来源: akshare (免费数据)*\n`;\n\n return {\n ...state,\n output: {\n report,\n format: \"markdown\",\n },\n status: \"done\",\n };\n } catch (error: any) {\n return {\n ...state,\n status: \"error\",\n error: `报告生成失败: ${error.message}`,\n };\n }\n}\n","import { AkshareDataSource } from \"../datasources/akshare.js\";\nimport { WorkflowEngine } from \"../workflow/engine.js\";\nimport { dataCollectionNode } from \"../workflow/nodes/data-collection.js\";\nimport { analysisNode } from \"../workflow/nodes/analysis.js\";\nimport { reportNode } from \"../workflow/nodes/report.js\";\nimport type { Tool, ToolResult } from \"../core/types.js\";\n\nexport const financeTool: Tool = {\n name: \"finance_analyze\",\n description: \"分析上市公司财务数据并生成研究报告\",\n parameters: {\n type: \"object\",\n properties: {\n company: {\n type: \"string\",\n description: \"公司名称\",\n },\n code: {\n type: \"string\",\n description: \"股票代码\",\n },\n market: {\n type: \"string\",\n enum: [\"A\", \"HK\"],\n description: \"市场类型 (A: A股, HK: 港股)\",\n },\n },\n required: [\"company\", \"code\"],\n },\n execute: async (params: Record<string, unknown>): Promise<ToolResult> => {\n try {\n const dataSource = new AkshareDataSource();\n \n const engine = new WorkflowEngine({\n nodes: [\n (state) => dataCollectionNode(state, dataSource),\n analysisNode,\n reportNode,\n ],\n });\n\n const result = await engine.execute({\n company: params.company as string,\n code: params.code as string,\n market: (params.market as string) || \"A\",\n });\n\n return {\n output: result.output.report || \"分析完成\",\n };\n } catch (error: any) {\n return {\n output: \"\",\n error: error.message,\n };\n }\n },\n};\n\nexport const financeTools = [financeTool];\n","import type { Tool } from \"../core/types.js\";\nimport { readFileTool } from \"./read_file.js\";\nimport { writeFileTool } from \"./write_file.js\";\nimport { editFileTool } from \"./edit_file.js\";\nimport { bashTool } from \"./bash.js\";\nimport { globTool } from \"./glob.js\";\nimport { grepTool } from \"./grep.js\";\nimport { financeTool } from \"./finance.js\";\n\nexport const builtinTools: Tool[] = [\n readFileTool,\n writeFileTool,\n editFileTool,\n bashTool,\n globTool,\n grepTool,\n financeTool,\n];\n\nexport function getToolsByNames(names: string[]): Tool[] {\n return builtinTools.filter((t) => names.includes(t.name));\n}\n\nexport { readFileTool } from \"./read_file.js\";\nexport { writeFileTool } from \"./write_file.js\";\nexport { editFileTool } from \"./edit_file.js\";\nexport { bashTool } from \"./bash.js\";\nexport { globTool } from \"./glob.js\";\nexport { grepTool } from \"./grep.js\";\nexport { financeTool } from \"./finance.js\";\n","import type { ModelProvider, Message, Tool, ToolCall, ToolResult } from \"./types.js\";\nimport { builtinTools } from \"../tools/index.js\";\n\nexport interface OrchestratorOptions {\n model: ModelProvider;\n systemPrompt?: string;\n skillInstructions?: string;\n tools?: Tool[];\n maxIterations?: number;\n onToken?: (token: string) => void;\n onToolStart?: (name: string, params: Record<string, unknown>) => void;\n onToolEnd?: (name: string, result: ToolResult) => void;\n}\n\nexport class Orchestrator {\n private messages: Message[] = [];\n private tools: Tool[];\n private model: ModelProvider;\n private systemPrompt: string;\n private maxIterations: number;\n private callbacks: Pick<\n OrchestratorOptions,\n \"onToken\" | \"onToolStart\" | \"onToolEnd\"\n >;\n\n constructor(opts: OrchestratorOptions) {\n this.model = opts.model;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n if (opts.skillInstructions) {\n this.systemPrompt += \"\\n\\n\" + opts.skillInstructions;\n }\n this.tools = opts.tools ?? builtinTools;\n this.maxIterations = opts.maxIterations ?? 20;\n this.callbacks = {\n onToken: opts.onToken,\n onToolStart: opts.onToolStart,\n onToolEnd: opts.onToolEnd,\n };\n\n if (this.systemPrompt) {\n this.messages.push({ role: \"system\", content: this.systemPrompt });\n }\n }\n\n async run(userMessage: string): Promise<string> {\n this.messages.push({ role: \"user\", content: userMessage });\n\n for (let i = 0; i < this.maxIterations; i++) {\n const response = await this.model.chat(this.messages, this.tools);\n\n if (response.content) {\n this.messages.push({\n role: \"assistant\",\n content: response.content,\n tool_calls: response.tool_calls,\n });\n }\n\n if (!response.tool_calls?.length) {\n return response.content;\n }\n\n for (const tc of response.tool_calls) {\n this.callbacks.onToolStart?.(\n tc.function.name,\n JSON.parse(tc.function.arguments),\n );\n const result = await this.executeTool(tc);\n this.callbacks.onToolEnd?.(tc.function.name, result);\n this.messages.push({\n role: \"tool\",\n content: result.error ? `Error: ${result.error}` : result.output,\n tool_call_id: tc.id,\n });\n }\n }\n\n return \"Max iterations reached.\";\n }\n\n async *runStream(userMessage: string): AsyncIterable<string> {\n this.messages.push({ role: \"user\", content: userMessage });\n\n for (let i = 0; i < this.maxIterations; i++) {\n let fullContent = \"\";\n let toolCalls: ToolCall[] = [];\n\n for await (const chunk of this.model.stream(this.messages, this.tools)) {\n if (chunk.content) {\n fullContent += chunk.content;\n yield chunk.content;\n }\n if (chunk.tool_calls) {\n toolCalls = chunk.tool_calls;\n }\n }\n\n if (!toolCalls.length) {\n this.messages.push({ role: \"assistant\", content: fullContent });\n return;\n }\n\n this.messages.push({\n role: \"assistant\",\n content: fullContent,\n tool_calls: toolCalls,\n });\n\n for (const tc of toolCalls) {\n this.callbacks.onToolStart?.(\n tc.function.name,\n JSON.parse(tc.function.arguments),\n );\n const result = await this.executeTool(tc);\n this.callbacks.onToolEnd?.(tc.function.name, result);\n this.messages.push({\n role: \"tool\",\n content: result.error ? `Error: ${result.error}` : result.output,\n tool_call_id: tc.id,\n });\n }\n }\n }\n\n private async executeTool(tc: ToolCall): Promise<ToolResult> {\n const tool = this.tools.find((t) => t.name === tc.function.name);\n if (!tool) return { output: \"\", error: `Unknown tool: ${tc.function.name}` };\n try {\n const params = JSON.parse(tc.function.arguments);\n return await tool.execute(params);\n } catch (e: any) {\n return { output: \"\", error: e.message };\n }\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n clearMessages(): void {\n this.messages = [];\n if (this.systemPrompt) {\n this.messages.push({ role: \"system\", content: this.systemPrompt });\n }\n }\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are Hecode, an AI coding assistant. You help users with software engineering tasks using the tools available to you.\n\nKey principles:\n- Be concise and direct\n- Use tools to read/write files, execute commands, and search code\n- Verify your work by running tests or checks when possible\n- Follow existing code conventions in the project`;\n"],"mappings":"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","names":["readFile","writeFile","readFile","exec"]}
|