feat: parse CodeMode execute tool calls from JS script
Парсим JS код из аргумента execute инструмента и извлекаем вызовы tools.<server>.<tool>(...) — как это делает CodeMode. Дочерние инструменты показываются в спойлере вместе с обычными.
This commit is contained in:
parent
53e77e0608
commit
729dee2c11
34
index.ts
34
index.ts
|
|
@ -131,6 +131,26 @@ async function runPlugin(ctx: any, options: any, dataDir: string) {
|
||||||
|
|
||||||
const sessionsBySessionID = new Map<string, SessionState>()
|
const sessionsBySessionID = new Map<string, SessionState>()
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// Parse tool calls from CodeMode JS script
|
||||||
|
// CodeMode creates nested tools: tools.<server>.<tool>(...)
|
||||||
|
// e.g. tools.duckduckgo.search({ query: "..." })
|
||||||
|
// =============================================================================
|
||||||
|
|
||||||
|
function parseCodeModeTools(code: string): string[] {
|
||||||
|
const tools: string[] = []
|
||||||
|
// Match tools.<word>.<word>( — nested tool calls in CodeMode
|
||||||
|
const regex = /tools\.(\w+)\.(\w+)\s*\(/g
|
||||||
|
let match
|
||||||
|
while ((match = regex.exec(code)) !== null) {
|
||||||
|
const toolName = `${match[1]}_${match[2]}`
|
||||||
|
if (!tools.includes(toolName)) {
|
||||||
|
tools.push(toolName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tools
|
||||||
|
}
|
||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
// Event subscription — collects step data and sends messages per step
|
// Event subscription — collects step data and sends messages per step
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
@ -208,6 +228,20 @@ async function runPlugin(ctx: any, options: any, dataDir: string) {
|
||||||
const tool = step.tools.find(t => t.toolID === toolID)
|
const tool = step.tools.find(t => t.toolID === toolID)
|
||||||
if (tool) tool.args = args
|
if (tool) tool.args = args
|
||||||
}
|
}
|
||||||
|
// Parse CodeMode execute tool — extract child tool calls from JS code
|
||||||
|
if (toolID && step && args) {
|
||||||
|
let parsedArgs: any
|
||||||
|
try { parsedArgs = JSON.parse(args) } catch { continue }
|
||||||
|
const code = parsedArgs?.code || ""
|
||||||
|
if (code) {
|
||||||
|
const childTools = parseCodeModeTools(code)
|
||||||
|
for (const name of childTools) {
|
||||||
|
if (!step.tools.find(t => t.name === name)) {
|
||||||
|
step.tools.push({ toolID: `${toolID}/${name}`, name, args: "", result: "", failed: false })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue