@vedangiitb/qwintly-core 1.4.11 → 1.4.13
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/dist/ai/generate/gemini.client.js +1 -1
- package/dist/ai/generate/gemini.client.js.map +1 -1
- package/dist/ai/generate/generateClient.d.ts.map +1 -1
- package/dist/ai/generate/generateClient.js +7 -3
- package/dist/ai/generate/generateClient.js.map +1 -1
- package/dist/ai/prompts/codegen.prompt.js +1 -1
- package/dist/ai/prompts/codegen.prompt.js.map +1 -1
- package/dist/ai/prompts/helpers/promptParts.helper.d.ts +1 -1
- package/dist/ai/prompts/helpers/promptParts.helper.d.ts.map +1 -1
- package/dist/ai/prompts/helpers/promptParts.helper.js +1 -1
- package/dist/ai/prompts/helpers/promptParts.helper.js.map +1 -1
- package/dist/ai/prompts/planner.prompt.d.ts.map +1 -1
- package/dist/ai/prompts/planner.prompt.js +1 -0
- package/dist/ai/prompts/planner.prompt.js.map +1 -1
- package/dist/ai/toolLoop/helpers/aiCall.helper.d.ts +16 -0
- package/dist/ai/toolLoop/helpers/aiCall.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/aiCall.helper.js +23 -0
- package/dist/ai/toolLoop/helpers/aiCall.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/applyPatch.helper.d.ts +6 -0
- package/dist/ai/toolLoop/helpers/applyPatch.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/applyPatch.helper.js +10 -0
- package/dist/ai/toolLoop/helpers/applyPatch.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/errors.helper.d.ts +15 -0
- package/dist/ai/toolLoop/helpers/errors.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/errors.helper.js +50 -0
- package/dist/ai/toolLoop/helpers/errors.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/fsHelpers.d.ts +5 -0
- package/dist/ai/toolLoop/helpers/fsHelpers.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/fsHelpers.js +28 -0
- package/dist/ai/toolLoop/helpers/fsHelpers.js.map +1 -0
- package/dist/ai/toolLoop/helpers/patchRetry.helper.d.ts +11 -0
- package/dist/ai/toolLoop/helpers/patchRetry.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/patchRetry.helper.js +30 -0
- package/dist/ai/toolLoop/helpers/patchRetry.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/persistTokens.helpers.d.ts +7 -0
- package/dist/ai/toolLoop/helpers/persistTokens.helpers.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/persistTokens.helpers.js +25 -0
- package/dist/ai/toolLoop/helpers/persistTokens.helpers.js.map +1 -0
- package/dist/ai/toolLoop/{plannerTaskParser.d.ts → helpers/plannerTaskParser.d.ts} +1 -1
- package/dist/ai/toolLoop/helpers/plannerTaskParser.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/plannerTaskParser.js.map +1 -0
- package/dist/ai/toolLoop/helpers/readFile.helpers.d.ts +10 -0
- package/dist/ai/toolLoop/helpers/readFile.helpers.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/readFile.helpers.js +26 -0
- package/dist/ai/toolLoop/helpers/readFile.helpers.js.map +1 -0
- package/dist/ai/toolLoop/helpers/signatures.helper.d.ts +2 -0
- package/dist/ai/toolLoop/helpers/signatures.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/signatures.helper.js +23 -0
- package/dist/ai/toolLoop/helpers/signatures.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/toolArgs.helper.d.ts +12 -0
- package/dist/ai/toolLoop/helpers/toolArgs.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/toolArgs.helper.js +40 -0
- package/dist/ai/toolLoop/helpers/toolArgs.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/toolExecution.helper.d.ts +22 -0
- package/dist/ai/toolLoop/helpers/toolExecution.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/toolExecution.helper.js +75 -0
- package/dist/ai/toolLoop/helpers/toolExecution.helper.js.map +1 -0
- package/dist/ai/toolLoop/helpers/toolHandlers.helper.d.ts +6 -0
- package/dist/ai/toolLoop/helpers/toolHandlers.helper.d.ts.map +1 -0
- package/dist/ai/toolLoop/helpers/toolHandlers.helper.js +86 -0
- package/dist/ai/toolLoop/helpers/toolHandlers.helper.js.map +1 -0
- package/dist/ai/toolLoop/toolEventSummary.d.ts +28 -0
- package/dist/ai/toolLoop/toolEventSummary.d.ts.map +1 -0
- package/dist/ai/toolLoop/toolEventSummary.js +253 -0
- package/dist/ai/toolLoop/toolEventSummary.js.map +1 -0
- package/dist/ai/toolLoop/toolLoopContext.d.ts +0 -14
- package/dist/ai/toolLoop/toolLoopContext.d.ts.map +1 -1
- package/dist/ai/toolLoop/toolLoopContext.js +7 -50
- package/dist/ai/toolLoop/toolLoopContext.js.map +1 -1
- package/dist/ai/toolLoop/toolLoopRunner.d.ts +7 -6
- package/dist/ai/toolLoop/toolLoopRunner.d.ts.map +1 -1
- package/dist/ai/toolLoop/toolLoopRunner.js +49 -284
- package/dist/ai/toolLoop/toolLoopRunner.js.map +1 -1
- package/dist/ai/toolLoop/toolStatusMessage.d.ts +6 -0
- package/dist/ai/toolLoop/toolStatusMessage.d.ts.map +1 -0
- package/dist/ai/toolLoop/toolStatusMessage.js +140 -0
- package/dist/ai/toolLoop/toolStatusMessage.js.map +1 -0
- package/dist/ai/tools/helpers/applyPatch.helpers.d.ts.map +1 -1
- package/dist/ai/tools/helpers/applyPatch.helpers.js +9 -4
- package/dist/ai/tools/helpers/applyPatch.helpers.js.map +1 -1
- package/dist/ai/tools/helpers/fileSystem.helpers.d.ts.map +1 -1
- package/dist/ai/tools/helpers/fileSystem.helpers.js +7 -1
- package/dist/ai/tools/helpers/fileSystem.helpers.js.map +1 -1
- package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts +13 -0
- package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts.map +1 -1
- package/dist/ai/tools/helpers/pageConfigJson.helpers.js +51 -21
- package/dist/ai/tools/helpers/pageConfigJson.helpers.js.map +1 -1
- package/dist/ai/tools/implementations/applyPatch.impl.js +2 -2
- package/dist/ai/tools/implementations/applyPatch.impl.js.map +1 -1
- package/dist/ai/tools/implementations/createNewRoute.impl.js +1 -1
- package/dist/ai/tools/implementations/createNewRoute.impl.js.map +1 -1
- package/dist/ai/tools/implementations/deleteElement.impl.d.ts.map +1 -1
- package/dist/ai/tools/implementations/deleteElement.impl.js +5 -37
- package/dist/ai/tools/implementations/deleteElement.impl.js.map +1 -1
- package/dist/ai/tools/implementations/insertElement.impl.d.ts.map +1 -1
- package/dist/ai/tools/implementations/insertElement.impl.js +9 -46
- package/dist/ai/tools/implementations/insertElement.impl.js.map +1 -1
- package/dist/ai/tools/implementations/updateClassName.impl.d.ts.map +1 -1
- package/dist/ai/tools/implementations/updateClassName.impl.js +5 -37
- package/dist/ai/tools/implementations/updateClassName.impl.js.map +1 -1
- package/dist/ai/tools/implementations/updateGlobalStyles.impl.d.ts.map +1 -1
- package/dist/ai/tools/implementations/updateGlobalStyles.impl.js +4 -3
- package/dist/ai/tools/implementations/updateGlobalStyles.impl.js.map +1 -1
- package/dist/ai/tools/implementations/updateProps.impl.d.ts.map +1 -1
- package/dist/ai/tools/implementations/updateProps.impl.js +5 -37
- package/dist/ai/tools/implementations/updateProps.impl.js.map +1 -1
- package/dist/ai/tools/schemas/createNewRoute.schema.d.ts.map +1 -1
- package/dist/ai/tools/schemas/createNewRoute.schema.js +1 -1
- package/dist/ai/tools/schemas/createNewRoute.schema.js.map +1 -1
- package/dist/ai/tools/schemas/deleteElement.schema.d.ts.map +1 -1
- package/dist/ai/tools/schemas/deleteElement.schema.js +1 -2
- package/dist/ai/tools/schemas/deleteElement.schema.js.map +1 -1
- package/dist/ai/tools/schemas/elementProps.schema.d.ts +101 -0
- package/dist/ai/tools/schemas/elementProps.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/elementProps.schema.js +74 -0
- package/dist/ai/tools/schemas/elementProps.schema.js.map +1 -0
- package/dist/ai/tools/schemas/insertElement.schema.d.ts.map +1 -1
- package/dist/ai/tools/schemas/insertElement.schema.js +2 -74
- package/dist/ai/tools/schemas/insertElement.schema.js.map +1 -1
- package/dist/ai/tools/schemas/updateClassName.schema.d.ts.map +1 -1
- package/dist/ai/tools/schemas/updateClassName.schema.js +1 -2
- package/dist/ai/tools/schemas/updateClassName.schema.js.map +1 -1
- package/dist/ai/tools/schemas/updateProps.schema.d.ts +9 -9
- package/dist/ai/tools/schemas/updateProps.schema.d.ts.map +1 -1
- package/dist/ai/tools/schemas/updateProps.schema.js +3 -69
- package/dist/ai/tools/schemas/updateProps.schema.js.map +1 -1
- package/dist/image/unsplash.service.d.ts.map +1 -1
- package/dist/image/unsplash.service.js +6 -2
- package/dist/image/unsplash.service.js.map +1 -1
- package/dist/indexer/projectInfoIndex.d.ts.map +1 -1
- package/dist/indexer/projectInfoIndex.js +33 -25
- package/dist/indexer/projectInfoIndex.js.map +1 -1
- package/dist/types/styleConfig.d.ts.map +1 -1
- package/dist/types/styleConfig.js +2 -3
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/utils.d.ts +3 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +8 -0
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/workspace.d.ts +1 -1
- package/dist/utils/workspace.d.ts.map +1 -1
- package/dist/utils/workspace.js +6 -11
- package/dist/utils/workspace.js.map +1 -1
- package/package.json +1 -1
- package/dist/ai/toolLoop/plannerTaskParser.d.ts.map +0 -1
- package/dist/ai/toolLoop/plannerTaskParser.js.map +0 -1
- package/dist/ai/toolLoop/toolLoopRunnerUtils.d.ts +0 -51
- package/dist/ai/toolLoop/toolLoopRunnerUtils.d.ts.map +0 -1
- package/dist/ai/toolLoop/toolLoopRunnerUtils.js +0 -306
- package/dist/ai/toolLoop/toolLoopRunnerUtils.js.map +0 -1
- /package/dist/ai/toolLoop/{plannerTaskParser.js → helpers/plannerTaskParser.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolEventSummary.js","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolEventSummary.ts"],"names":[],"mappings":"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","sourcesContent":["import { STYLE_TOKEN_KEYS } from \"../../types/styleConfig.js\";\nimport { getApplyPatchEventMeta } from \"./helpers/applyPatch.helper.js\";\nimport { ToolEvent } from \"./toolLoopContext.js\";\n\nexport type ToolEventSummaryInput = {\n name: string;\n effectiveArgs: Record<string, unknown>;\n modelArgs: Record<string, unknown>;\n readFileMeta: { start: number; end: number; wasCapped: boolean } | null;\n toolResult: unknown;\n toolResultRaw: unknown;\n};\n\nconst oneLine = (value: unknown, maxLen = 140) => {\n let raw = \"\";\n if (typeof value === \"string\") {\n raw = value;\n } else if (value === undefined) {\n raw = \"\";\n } else if (value === null) {\n raw = \"null\";\n } else {\n raw = JSON.stringify(value);\n }\n const collapsed = raw.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLen) return collapsed;\n return `${collapsed.slice(0, Math.max(0, maxLen - 1))}…`;\n};\n\nconst getStringArg = (effectiveArgs: Record<string, unknown>, key: string) =>\n oneLine(effectiveArgs[key] ?? \"\");\n\ntype ToolEventSummarizer = (input: ToolEventSummaryInput) => ToolEvent | null;\n\nconst summarizeReadFile: ToolEventSummarizer = (input) => {\n if (input.name !== \"read_file\") return null;\n\n const path = typeof input.effectiveArgs.path === \"string\" ? input.effectiveArgs.path : \"\";\n const start =\n input.readFileMeta?.start ?? Number(input.effectiveArgs.start_line ?? 1);\n const end =\n input.readFileMeta?.end ?? Number(input.effectiveArgs.end_line ?? start);\n\n return {\n name: input.name,\n summary: `read_file ${path}:${start}-${end}${\n input.readFileMeta?.wasCapped ? \" (capped)\" : \"\"\n }`,\n };\n};\n\nconst summarizeApplyPatch: ToolEventSummarizer = (input) => {\n if (input.name !== \"apply_patch\") return null;\n\n const meta =\n typeof (input.modelArgs as any).patch_string === \"object\"\n ? ((input.modelArgs as any).patch_string as any)\n : null;\n const fallback = getApplyPatchEventMeta(input.effectiveArgs);\n let ok = \"done\";\n if ((input.toolResult as any)?.success === true) {\n ok = \"success\";\n } else if ((input.toolResult as any)?.success === false) {\n ok = \"failure\";\n }\n\n return {\n name: input.name,\n summary: `apply_patch files=${JSON.stringify(\n meta?.files ?? fallback.files,\n )} sha256=${String(meta?.sha256 ?? fallback.sha256).slice(0, 12)} chars=${\n meta?.chars ?? fallback.chars\n } result=${ok}`,\n };\n};\n\nconst summarizeCreateNewRoute: ToolEventSummarizer = (input) => {\n if (input.name !== \"create_new_route\") return null;\n\n const parentRoute = getStringArg(input.effectiveArgs, \"parent_route\") || \"/\";\n const routeName = getStringArg(input.effectiveArgs, \"route_name\");\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const route = oneLine((input.toolResult as any)?.route ?? \"\");\n const createdFiles = Array.isArray((input.toolResult as any)?.created_files)\n ? ((input.toolResult as any).created_files as unknown[])\n : [];\n\n const filesText =\n successVal === true ? ` created_files=${createdFiles.length}` : \"\";\n const routeText = route ? ` route=${route}` : \"\";\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `create_new_route ${successVal ? \"success\" : \"failure\"} parent_route=${parentRoute} route_name=${routeName}${routeText}${filesText}${errText}`,\n };\n};\n\nconst summarizeInsertElement: ToolEventSummarizer = (input) => {\n if (input.name !== \"insert_element\") return null;\n\n const route = getStringArg(input.effectiveArgs, \"route\");\n const parentId = getStringArg(input.effectiveArgs, \"parent_id\");\n const beforeId = getStringArg(input.effectiveArgs, \"before_id\");\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const insertedId = oneLine((input.toolResult as any)?.inserted_id ?? \"\");\n const changedVal = (input.toolResult as any)?.changed;\n const changedText =\n typeof changedVal === \"boolean\" ? ` changed=${changedVal}` : \"\";\n const beforeText = beforeId ? ` before_id=${beforeId}` : \"\";\n const insertedText = insertedId ? ` inserted_id=${insertedId}` : \"\";\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `insert_element ${successVal ? \"success\" : \"failure\"} route=${route} parent_id=${parentId}${beforeText}${insertedText}${changedText}${errText}`,\n };\n};\n\nconst summarizeUpdateClassname: ToolEventSummarizer = (input) => {\n if (input.name !== \"update_classname\") return null;\n\n const route = getStringArg(input.effectiveArgs, \"route\");\n const elementId = getStringArg(input.effectiveArgs, \"element_id\");\n const className = oneLine((input.effectiveArgs as any).className ?? \"\", 160);\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const changedVal = (input.toolResult as any)?.changed;\n const changedText =\n typeof changedVal === \"boolean\" ? ` changed=${changedVal}` : \"\";\n const updatedId = oneLine((input.toolResult as any)?.updated_id ?? \"\");\n const updatedText = updatedId ? ` updated_id=${updatedId}` : \"\";\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `update_classname ${successVal ? \"success\" : \"failure\"} route=${route} element_id=${elementId} className=\"${className}\"${updatedText}${changedText}${errText}`,\n };\n};\n\nconst summarizeUpdateProps: ToolEventSummarizer = (input) => {\n if (input.name !== \"update_props\") return null;\n\n const route = getStringArg(input.effectiveArgs, \"route\");\n const elementId = getStringArg(input.effectiveArgs, \"element_id\");\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const changedVal = (input.toolResult as any)?.changed;\n const changedText =\n typeof changedVal === \"boolean\" ? ` changed=${changedVal}` : \"\";\n const updatedId = oneLine((input.toolResult as any)?.updated_id ?? \"\");\n const updatedText = updatedId ? ` updated_id=${updatedId}` : \"\";\n\n const patchKeys = Object.keys(input.effectiveArgs ?? {}).filter((k) => {\n if (k === \"route\" || k === \"element_id\") return false;\n const v = (input.effectiveArgs as any)[k];\n return v !== undefined && v !== null;\n });\n patchKeys.sort((a, b) => a.localeCompare(b));\n const keysText =\n patchKeys.length > 0\n ? ` keys=${oneLine(patchKeys.join(\",\"), 140)}`\n : \"\";\n\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `update_props ${successVal ? \"success\" : \"failure\"} route=${route} element_id=${elementId}${keysText}${updatedText}${changedText}${errText}`,\n };\n};\n\nconst summarizeUpdateGlobalStyles: ToolEventSummarizer = (input) => {\n if (input.name !== \"update_global_styles\") return null;\n\n const tokenKeySet = new Set<string>(STYLE_TOKEN_KEYS as unknown as string[]);\n const tokenKeys = Object.keys(input.effectiveArgs ?? {}).filter((k) =>\n tokenKeySet.has(k),\n );\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const changedVal = (input.toolResult as any)?.changed;\n const changedText =\n typeof changedVal === \"boolean\" ? ` changed=${changedVal}` : \"\";\n const version = (input.toolResult as any)?.version;\n const versionText =\n typeof version === \"number\" && Number.isFinite(version)\n ? ` version=${version}`\n : \"\";\n const created = (input.toolResult as any)?.created;\n const createdText = typeof created === \"boolean\" ? ` created=${created}` : \"\";\n tokenKeys.sort((a, b) => a.localeCompare(b));\n const keysText =\n tokenKeys.length > 0\n ? ` tokens=${oneLine(tokenKeys.join(\",\"), 160)}`\n : \"\";\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `update_global_styles ${successVal ? \"success\" : \"failure\"}${keysText}${versionText}${createdText}${changedText}${errText}`,\n };\n};\n\nconst summarizeSearch: ToolEventSummarizer = (input) => {\n if (input.name !== \"search\") return null;\n\n const q = typeof input.effectiveArgs.search_query === \"string\" ? input.effectiveArgs.search_query.trim() : \"\";\n const results = Array.isArray((input.toolResultRaw as any)?.results)\n ? (input.toolResultRaw as any).results\n : [];\n\n return {\n name: input.name,\n summary: `search \"${q}\" -> ${results.length} results`,\n };\n};\n\nconst summarizeListDir: ToolEventSummarizer = (input) => {\n if (input.name !== \"list_dir\") return null;\n\n const p = typeof input.effectiveArgs.path === \"string\" ? input.effectiveArgs.path : \"\";\n const d = Number(input.effectiveArgs.depth ?? 1);\n return { name: input.name, summary: `list_dir ${p} depth=${d}` };\n};\n\nconst summarizeCreateFile: ToolEventSummarizer = (input) => {\n if (input.name !== \"create_file\") return null;\n const p = typeof input.effectiveArgs.path === \"string\" ? input.effectiveArgs.path : \"\";\n return { name: input.name, summary: `create_file ${p}` };\n};\n\nconst summarizeDeleteFile: ToolEventSummarizer = (input) => {\n if (input.name !== \"delete_file\") return null;\n const p = typeof input.effectiveArgs.path === \"string\" ? input.effectiveArgs.path : \"\";\n return { name: input.name, summary: `delete_file ${p}` };\n};\n\nconst summarizeGenericSuccessFailure: ToolEventSummarizer = (input) => {\n const successVal = (input.toolResult as any)?.success;\n if (typeof successVal !== \"boolean\") return null;\n\n const changedVal = (input.toolResult as any)?.changed;\n const changedText =\n typeof changedVal === \"boolean\" ? ` changed=${changedVal}` : \"\";\n const errText =\n successVal === false\n ? ` error=${oneLine((input.toolResult as any)?.error ?? \"unknown\", 160)}`\n : \"\";\n\n return {\n name: input.name,\n summary: `${input.name} ${successVal ? \"success\" : \"failure\"}${changedText}${errText}`,\n };\n};\n\nconst SUMMARIZERS: ToolEventSummarizer[] = [\n summarizeReadFile,\n summarizeApplyPatch,\n summarizeCreateNewRoute,\n summarizeInsertElement,\n summarizeUpdateClassname,\n summarizeUpdateProps,\n summarizeUpdateGlobalStyles,\n summarizeSearch,\n summarizeListDir,\n summarizeCreateFile,\n summarizeDeleteFile,\n summarizeGenericSuccessFailure,\n];\n\nexport const buildToolEventSummary = (\n input: ToolEventSummaryInput,\n): ToolEvent => {\n for (const summarizer of SUMMARIZERS) {\n const evt = summarizer(input);\n if (evt) return evt;\n }\n return { name: input.name, summary: `${input.name} called` };\n};\n\nexport const recordToolEvent = (params: {\n name: string;\n effectiveArgs: Record<string, unknown>;\n modelArgs: Record<string, unknown>;\n readFileMeta: { start: number; end: number; wasCapped: boolean } | null;\n toolEvents: ToolEvent[];\n toolResult: unknown;\n toolResultRaw: unknown;\n}) => {\n const { toolEvents, name } = params;\n try {\n toolEvents.push(buildToolEventSummary(params));\n } catch {\n toolEvents.push({ name, summary: `${name} called` });\n return;\n }\n};\n"]}
|
|
@@ -16,18 +16,4 @@ export declare const compactForModel: (input: {
|
|
|
16
16
|
toolEvents: ToolEvent[];
|
|
17
17
|
policy: Required<ToolLoopContextPolicy>;
|
|
18
18
|
}) => any[];
|
|
19
|
-
export declare const normalizeReadFileArgs: (args: Record<string, unknown>, maxLines: number) => {
|
|
20
|
-
effectiveArgs: {
|
|
21
|
-
start_line: number;
|
|
22
|
-
end_line: number;
|
|
23
|
-
};
|
|
24
|
-
start: number;
|
|
25
|
-
end: number;
|
|
26
|
-
wasCapped: boolean;
|
|
27
|
-
};
|
|
28
|
-
export declare const getApplyPatchEventMeta: (args: Record<string, unknown>) => {
|
|
29
|
-
chars: number;
|
|
30
|
-
sha256: string;
|
|
31
|
-
files: string[];
|
|
32
|
-
};
|
|
33
19
|
//# sourceMappingURL=toolLoopContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolLoopContext.d.ts","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopContext.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,qBAAqB,CAKlE,CAAC;
|
|
1
|
+
{"version":3,"file":"toolLoopContext.d.ts","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopContext.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,qBAAqB,CAKlE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,EACZ,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,4BA0B9B,CAAC;AAiBF,eAAO,MAAM,eAAe,GAAI,OAAO;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;CACzC,UA8BA,CAAC"}
|
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { extractPatchFiles, sha256Hex } from "./helpers/fsHelpers.js";
|
|
2
2
|
export const DEFAULT_CONTEXT_POLICY = {
|
|
3
3
|
readFileDefaultMaxLines: 200,
|
|
4
4
|
tailMessages: 8,
|
|
5
5
|
maxModelChars: 120000,
|
|
6
6
|
logApproxModelChars: false,
|
|
7
7
|
};
|
|
8
|
-
const sha256Hex = (value) => crypto.createHash("sha256").update(value, "utf8").digest("hex");
|
|
9
|
-
const extractPatchFiles = (patchString) => {
|
|
10
|
-
const lines = patchString.replace(/\r\n/g, "\n").split("\n");
|
|
11
|
-
const files = new Set();
|
|
12
|
-
for (const line of lines) {
|
|
13
|
-
const match = /^\*\*\* (Update File|Add File|Delete File):\s+(.+)$/.exec(line) ??
|
|
14
|
-
/^\*\*\* Move to:\s+(.+)$/.exec(line);
|
|
15
|
-
if (!match)
|
|
16
|
-
continue;
|
|
17
|
-
const filePath = (match[2] ?? match[1] ?? "").trim();
|
|
18
|
-
if (filePath)
|
|
19
|
-
files.add(filePath);
|
|
20
|
-
}
|
|
21
|
-
return [...files];
|
|
22
|
-
};
|
|
23
8
|
export const redactFunctionCallArgs = (name, args) => {
|
|
24
9
|
if (name !== "apply_patch")
|
|
25
10
|
return args;
|
|
@@ -27,7 +12,12 @@ export const redactFunctionCallArgs = (name, args) => {
|
|
|
27
12
|
if (!patch) {
|
|
28
13
|
return {
|
|
29
14
|
...args,
|
|
30
|
-
patch_string: {
|
|
15
|
+
patch_string: {
|
|
16
|
+
omitted: true,
|
|
17
|
+
chars: 0,
|
|
18
|
+
sha256: sha256Hex(""),
|
|
19
|
+
files: [],
|
|
20
|
+
},
|
|
31
21
|
};
|
|
32
22
|
}
|
|
33
23
|
return {
|
|
@@ -76,37 +66,4 @@ export const compactForModel = (input) => {
|
|
|
76
66
|
}
|
|
77
67
|
return compacted;
|
|
78
68
|
};
|
|
79
|
-
export const normalizeReadFileArgs = (args, maxLines) => {
|
|
80
|
-
const requestedStart = args.start_line === undefined || args.start_line === null
|
|
81
|
-
? 1
|
|
82
|
-
: Number(args.start_line);
|
|
83
|
-
const requestedEnd = args.end_line === undefined || args.end_line === null
|
|
84
|
-
? undefined
|
|
85
|
-
: Number(args.end_line);
|
|
86
|
-
const start = Number.isFinite(requestedStart) && requestedStart > 0 ? requestedStart : 1;
|
|
87
|
-
const cap = Math.max(1, Math.floor(maxLines));
|
|
88
|
-
const desiredEnd = requestedEnd === undefined ||
|
|
89
|
-
!Number.isFinite(requestedEnd) ||
|
|
90
|
-
requestedEnd < start
|
|
91
|
-
? start + cap - 1
|
|
92
|
-
: requestedEnd;
|
|
93
|
-
const cappedEnd = Math.min(desiredEnd, start + cap - 1);
|
|
94
|
-
const wasCapped = requestedEnd === undefined ||
|
|
95
|
-
desiredEnd !== requestedEnd ||
|
|
96
|
-
cappedEnd !== desiredEnd;
|
|
97
|
-
return {
|
|
98
|
-
effectiveArgs: { ...args, start_line: start, end_line: cappedEnd },
|
|
99
|
-
start,
|
|
100
|
-
end: cappedEnd,
|
|
101
|
-
wasCapped,
|
|
102
|
-
};
|
|
103
|
-
};
|
|
104
|
-
export const getApplyPatchEventMeta = (args) => {
|
|
105
|
-
const patch = typeof args.patch_string === "string" ? args.patch_string : "";
|
|
106
|
-
return {
|
|
107
|
-
chars: patch.length,
|
|
108
|
-
sha256: sha256Hex(patch),
|
|
109
|
-
files: extractPatchFiles(patch),
|
|
110
|
-
};
|
|
111
|
-
};
|
|
112
69
|
//# sourceMappingURL=toolLoopContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolLoopContext.js","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopContext.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"toolLoopContext.js","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchFiles, sha256Hex } from \"./helpers/fsHelpers.js\";\n\nexport type ToolEvent = {\n name: string;\n summary: string;\n};\n\nexport type ToolLoopContextPolicy = {\n readFileDefaultMaxLines?: number;\n tailMessages?: number;\n maxModelChars?: number;\n logApproxModelChars?: boolean;\n};\n\nexport const DEFAULT_CONTEXT_POLICY: Required<ToolLoopContextPolicy> = {\n readFileDefaultMaxLines: 200,\n tailMessages: 8,\n maxModelChars: 120_000,\n logApproxModelChars: false,\n};\n\nexport const redactFunctionCallArgs = (\n name: string,\n args: Record<string, unknown>,\n) => {\n if (name !== \"apply_patch\") return args;\n\n const patch = typeof args.patch_string === \"string\" ? args.patch_string : \"\";\n if (!patch) {\n return {\n ...args,\n patch_string: {\n omitted: true,\n chars: 0,\n sha256: sha256Hex(\"\"),\n files: [],\n },\n };\n }\n\n return {\n ...args,\n patch_string: {\n omitted: true,\n chars: patch.length,\n sha256: sha256Hex(patch),\n files: extractPatchFiles(patch),\n },\n };\n};\n\nconst isMemoryMessage = (item: any) => {\n const text = item?.parts?.[0]?.text;\n return (\n item?.role === \"model\" &&\n typeof text === \"string\" &&\n text.startsWith(\"MEMORY (tool trace summary):\")\n );\n};\n\nconst buildMemoryText = (events: ToolEvent[]) => {\n if (events.length === 0) return \"\";\n const lines = events.map((e) => `- ${e.summary}`);\n return `MEMORY (tool trace summary):\\n${lines.join(\"\\n\")}`;\n};\n\nexport const compactForModel = (input: {\n initialCount: number;\n modelContents: any[];\n toolEvents: ToolEvent[];\n policy: Required<ToolLoopContextPolicy>;\n}) => {\n const { initialCount, modelContents, toolEvents, policy } = input;\n\n const withoutOldMemory = modelContents.filter((c) => !isMemoryMessage(c));\n const tailStart = Math.max(\n initialCount,\n withoutOldMemory.length - policy.tailMessages,\n );\n\n const initial = withoutOldMemory.slice(0, initialCount);\n const tail = withoutOldMemory.slice(tailStart);\n const memoryText = buildMemoryText(toolEvents);\n const memory = memoryText\n ? [{ role: \"model\", parts: [{ text: memoryText }] }]\n : [];\n\n let compacted = [...initial, ...memory, ...tail];\n\n const maxChars = Math.max(10_000, policy.maxModelChars);\n while (JSON.stringify(compacted).length > maxChars) {\n const minLen = initial.length + memory.length + 1;\n if (compacted.length <= minLen) break;\n compacted = [\n ...initial,\n ...memory,\n ...compacted.slice(initial.length + memory.length + 1),\n ];\n }\n\n return compacted;\n};\n"]}
|
|
@@ -13,7 +13,7 @@ export type ToolLoopResult = {
|
|
|
13
13
|
response: unknown;
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
-
export type Logger = (message: string, eventType: EventType) => Promise<void>;
|
|
16
|
+
export type Logger = (message: string, eventType: EventType, displayedSummary?: boolean) => Promise<void>;
|
|
17
17
|
export type AiCallResponse = {
|
|
18
18
|
functionCalls?: any[];
|
|
19
19
|
text?: string;
|
|
@@ -23,6 +23,11 @@ export type AiCallFn = (request: unknown, options: {
|
|
|
23
23
|
model?: string;
|
|
24
24
|
toolCallingMode?: FunctionCallingConfigMode;
|
|
25
25
|
}) => Promise<AiCallResponse>;
|
|
26
|
+
export type TokenPersistence = {
|
|
27
|
+
repository: Pick<GenTokensRepository, "persistGenTokens">;
|
|
28
|
+
sessionId: string;
|
|
29
|
+
model: string;
|
|
30
|
+
};
|
|
26
31
|
export type RunToolLoopOptions = {
|
|
27
32
|
initialContents: any[];
|
|
28
33
|
tools: Tool[];
|
|
@@ -39,11 +44,7 @@ export type RunToolLoopOptions = {
|
|
|
39
44
|
aiCallAutoRetryBaseMs?: number;
|
|
40
45
|
aiCallAutoRetryMaxMs?: number;
|
|
41
46
|
persistResponse?: (modelInput: any, modelOutput: any) => Promise<void>;
|
|
42
|
-
tokenPersistence?:
|
|
43
|
-
repository: Pick<GenTokensRepository, "persistGenTokens">;
|
|
44
|
-
sessionId: string;
|
|
45
|
-
model: string;
|
|
46
|
-
};
|
|
47
|
+
tokenPersistence?: TokenPersistence;
|
|
47
48
|
};
|
|
48
49
|
export declare function runToolLoop(options: RunToolLoopOptions): Promise<ToolLoopResult>;
|
|
49
50
|
//# sourceMappingURL=toolLoopRunner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolLoopRunner.d.ts","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"toolLoopRunner.d.ts","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolLoopRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,OAAO,EAAe,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAmB/D,OAAO,EAKL,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,aAAa,EAAE,GAAG,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,CACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,gBAAgB,CAAC,EAAE,OAAO,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,yBAAyB,CAAC;CAC7C,KACE,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,GAAG,EAAE,CAAC;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAsXzB"}
|
|
@@ -1,139 +1,35 @@
|
|
|
1
1
|
import { FunctionCallingConfigMode } from "@google/genai";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
2
|
import { persistToolCall } from "../../services/toolcallPersist.service.js";
|
|
4
3
|
import { EVENT_TYPES } from "../../types/events.js";
|
|
5
4
|
import { STYLE_TOKEN_KEYS } from "../../types/styleConfig.js";
|
|
6
|
-
import { getAvailableRoutes } from "../tools/helpers/pageConfigJson.helpers.js";
|
|
7
5
|
import { createWorkspaceToolImpls } from "../tools/implementations/factories.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
6
|
+
import { aiCallWithRetry } from "./helpers/aiCall.helper.js";
|
|
7
|
+
import { serializeError } from "./helpers/errors.helper.js";
|
|
8
|
+
import { nodeFs } from "./helpers/fsHelpers.js";
|
|
9
|
+
import { handleApplyPatchFailure } from "./helpers/patchRetry.helper.js";
|
|
10
|
+
import { extractUsageTokenCounts, persistTokensOnce, } from "./helpers/persistTokens.helpers.js";
|
|
11
|
+
import { extractThoughtSignatures } from "./helpers/signatures.helper.js";
|
|
12
|
+
import { normalizeToolArgs } from "./helpers/toolArgs.helper.js";
|
|
13
|
+
import { executeToolHandler, postProcessToolResult, } from "./helpers/toolExecution.helper.js";
|
|
14
|
+
import { createToolHandlers } from "./helpers/toolHandlers.helper.js";
|
|
15
|
+
import { recordToolEvent } from "./toolEventSummary.js";
|
|
16
|
+
import { compactForModel, DEFAULT_CONTEXT_POLICY, redactFunctionCallArgs, } from "./toolLoopContext.js";
|
|
17
|
+
import { buildToolStatusMessage } from "./toolStatusMessage.js";
|
|
11
18
|
export async function runToolLoop(options) {
|
|
12
|
-
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
13
19
|
const styleTokenKeySet = new Set(STYLE_TOKEN_KEYS);
|
|
14
20
|
const { initialContents, tools, workspaceRoot, maxSteps = 30, toolCallingMode = FunctionCallingConfigMode.ANY, terminalToolNames = [], keepFullTrace = true, contextPolicy, aiCall, logger, applyPatchAutoRetryMax = 2, aiCallAutoRetryMax = 3, // must have it to try 3 times as gemini errors a lot due to high demand sometimes
|
|
15
21
|
aiCallAutoRetryBaseMs = 400, aiCallAutoRetryMaxMs = 10000, persistResponse, tokenPersistence, } = options;
|
|
16
|
-
const extractUsageTokenCounts = (rawResponse) => {
|
|
17
|
-
const usage = rawResponse?.usageMetadata;
|
|
18
|
-
const promptTokenCount = usage?.promptTokenCount;
|
|
19
|
-
const candidatesTokenCount = usage?.candidatesTokenCount;
|
|
20
|
-
const inputTokens = Number(promptTokenCount);
|
|
21
|
-
const outputTokens = Number(candidatesTokenCount);
|
|
22
|
-
if (!Number.isFinite(inputTokens) || inputTokens < 0)
|
|
23
|
-
return null;
|
|
24
|
-
if (!Number.isFinite(outputTokens) || outputTokens < 0)
|
|
25
|
-
return null;
|
|
26
|
-
return { inputTokens, outputTokens };
|
|
27
|
-
};
|
|
28
22
|
let totalInputTokens = 0;
|
|
29
23
|
let totalOutputTokens = 0;
|
|
30
24
|
let sawAnyTokenUsage = false;
|
|
31
|
-
const persistTokensOnce = async () => {
|
|
32
|
-
if (!tokenPersistence)
|
|
33
|
-
return;
|
|
34
|
-
if (!sawAnyTokenUsage)
|
|
35
|
-
return;
|
|
36
|
-
try {
|
|
37
|
-
await tokenPersistence.repository.persistGenTokens(tokenPersistence.sessionId, totalInputTokens, totalOutputTokens, tokenPersistence.model);
|
|
38
|
-
}
|
|
39
|
-
catch (err) {
|
|
40
|
-
console.error("Tool loop: failed to persist gen tokens", err);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const nodeFs = {
|
|
44
|
-
readFile: async (absolutePath) => fs.readFile(absolutePath, "utf-8"),
|
|
45
|
-
writeFile: async (absolutePath, content) => fs.writeFile(absolutePath, content ?? "", "utf-8"),
|
|
46
|
-
mkdirp: async (absoluteDir) => {
|
|
47
|
-
await fs.mkdir(absoluteDir, { recursive: true });
|
|
48
|
-
},
|
|
49
|
-
rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),
|
|
50
|
-
stat: async (absolutePath) => fs.stat(absolutePath),
|
|
51
|
-
safeReadDir: async (absoluteDir) => fs.readdir(absoluteDir, { withFileTypes: true }),
|
|
52
|
-
};
|
|
53
25
|
const impls = createWorkspaceToolImpls({
|
|
54
26
|
workspaceRoot,
|
|
55
27
|
fs: nodeFs,
|
|
56
28
|
});
|
|
57
|
-
const toolHandlers = {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const endLine = args.end_line === undefined ? undefined : Number(args.end_line);
|
|
62
|
-
const content = await impls.readFileImpl(path, startLine, endLine);
|
|
63
|
-
return { path, content };
|
|
64
|
-
},
|
|
65
|
-
write_file: (args) => impls.writeFileImpl(String(args.path ?? ""), String(args.content ?? "")),
|
|
66
|
-
list_dir: async (args) => {
|
|
67
|
-
const content = await impls.listDirImpl(String(args.path ?? ""), Number(args.depth ?? 1));
|
|
68
|
-
return { content };
|
|
69
|
-
},
|
|
70
|
-
search: async (args) => {
|
|
71
|
-
const results = await impls.searchImpl(String(args.search_query ?? ""));
|
|
72
|
-
return { results };
|
|
73
|
-
},
|
|
74
|
-
apply_patch: (args) => impls.applyPatchImpl(String(args.patch_string ?? "")),
|
|
75
|
-
update_global_styles: async (args) => {
|
|
76
|
-
const result = await impls.updateGlobalStylesImpl(args);
|
|
77
|
-
return result;
|
|
78
|
-
},
|
|
79
|
-
create_new_route: async (args) => {
|
|
80
|
-
const parentRoute = String(args.parent_route ?? "");
|
|
81
|
-
const routeName = String(args.route_name ?? "");
|
|
82
|
-
const result = await impls.createNewRouteImpl(parentRoute, routeName);
|
|
83
|
-
return result;
|
|
84
|
-
},
|
|
85
|
-
delete_element: async (args) => {
|
|
86
|
-
const route = String(args.route ?? "");
|
|
87
|
-
const element_id = String(args.element_id ?? "");
|
|
88
|
-
const result = await impls.deleteElementImpl(route, element_id);
|
|
89
|
-
return result;
|
|
90
|
-
},
|
|
91
|
-
insert_element: async (args) => {
|
|
92
|
-
const result = await impls.insertElementImpl(args);
|
|
93
|
-
if (!result.success) {
|
|
94
|
-
const available = await getAvailableRoutes({
|
|
95
|
-
workspaceRoot,
|
|
96
|
-
fs: nodeFs,
|
|
97
|
-
});
|
|
98
|
-
return {
|
|
99
|
-
success: false,
|
|
100
|
-
error: `insert_element failed: ${result.error}. Available routes are: ${JSON.stringify(available)}. If you intend to create a new route, create it using the 'create_new_route' tool.`,
|
|
101
|
-
available_routes: available,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
return result;
|
|
105
|
-
},
|
|
106
|
-
update_props: async (args) => {
|
|
107
|
-
const route = String(args.route ?? "");
|
|
108
|
-
const element_id = String(args.element_id ?? "");
|
|
109
|
-
const props = args.props;
|
|
110
|
-
const result = await impls.updatePropsImpl({
|
|
111
|
-
route,
|
|
112
|
-
element_id,
|
|
113
|
-
...props,
|
|
114
|
-
});
|
|
115
|
-
return result;
|
|
116
|
-
},
|
|
117
|
-
update_classname: async (args) => {
|
|
118
|
-
const route = String(args.route ?? "");
|
|
119
|
-
const element_id = String(args.element_id ?? "");
|
|
120
|
-
const class_name = String(args.class_name ?? "");
|
|
121
|
-
const result = await impls.updateClassNameImpl(route, element_id, class_name);
|
|
122
|
-
return result;
|
|
123
|
-
},
|
|
124
|
-
get_available_routes: async (args) => {
|
|
125
|
-
const routes = await getAvailableRoutes({ workspaceRoot, fs: nodeFs });
|
|
126
|
-
return { success: true, routes };
|
|
127
|
-
},
|
|
128
|
-
submit_codegen_done: async (args) => ({
|
|
129
|
-
success: true,
|
|
130
|
-
summary: String(args.summary ?? "").trim(),
|
|
131
|
-
}),
|
|
132
|
-
submit_planner_tasks: async (args) => {
|
|
133
|
-
const tasks = parsePlannerTasksUnknown(args.planner_tasks);
|
|
134
|
-
return { success: true, count: tasks.length };
|
|
135
|
-
},
|
|
136
|
-
};
|
|
29
|
+
const toolHandlers = createToolHandlers({
|
|
30
|
+
impls,
|
|
31
|
+
workspaceRoot,
|
|
32
|
+
});
|
|
137
33
|
if (typeof aiCall !== "function") {
|
|
138
34
|
throw new Error("Tool loop: aiCall is required.");
|
|
139
35
|
}
|
|
@@ -236,7 +132,7 @@ export async function runToolLoop(options) {
|
|
|
236
132
|
}
|
|
237
133
|
const functionCalls = response.functionCalls ?? [];
|
|
238
134
|
if (functionCalls.length === 0) {
|
|
239
|
-
await persistTokensOnce();
|
|
135
|
+
await persistTokensOnce(tokenPersistence, sawAnyTokenUsage, totalInputTokens, totalOutputTokens);
|
|
240
136
|
return {
|
|
241
137
|
contents: keepFullTrace ? fullTraceContents : modelContents,
|
|
242
138
|
modelContents,
|
|
@@ -244,28 +140,7 @@ export async function runToolLoop(options) {
|
|
|
244
140
|
steps: step + 1,
|
|
245
141
|
};
|
|
246
142
|
}
|
|
247
|
-
const signatureById = (
|
|
248
|
-
try {
|
|
249
|
-
const candidates = Array.isArray(response?.candidates)
|
|
250
|
-
? response.candidates
|
|
251
|
-
: [];
|
|
252
|
-
const parts = candidates?.[0]?.content?.parts;
|
|
253
|
-
const arr = Array.isArray(parts) ? parts : [];
|
|
254
|
-
const map = new Map();
|
|
255
|
-
for (const p of arr) {
|
|
256
|
-
const fc = p?.functionCall;
|
|
257
|
-
const id = fc?.id;
|
|
258
|
-
const sig = p?.thoughtSignature ?? p?.thought_signature;
|
|
259
|
-
if (typeof id === "string" && typeof sig === "string" && sig) {
|
|
260
|
-
map.set(id, sig);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return map;
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
return new Map();
|
|
267
|
-
}
|
|
268
|
-
})();
|
|
143
|
+
const signatureById = extractThoughtSignatures(response);
|
|
269
144
|
for (let callIndex = 0; callIndex < functionCalls.length; callIndex++) {
|
|
270
145
|
const call = functionCalls[callIndex];
|
|
271
146
|
const name = call.name?.toString() ?? "";
|
|
@@ -298,51 +173,11 @@ export async function runToolLoop(options) {
|
|
|
298
173
|
continue;
|
|
299
174
|
}
|
|
300
175
|
const handler = toolHandlers[name];
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
name: "MissingToolHandlerError",
|
|
307
|
-
message: `No handler registered for "${name}".`,
|
|
308
|
-
},
|
|
309
|
-
}
|
|
310
|
-
: null;
|
|
311
|
-
let effectiveArgs = args;
|
|
312
|
-
let readFileMeta = null;
|
|
313
|
-
if (name === "read_file") {
|
|
314
|
-
const normalized = normalizeReadFileArgs(effectiveArgs, policy.readFileDefaultMaxLines);
|
|
315
|
-
effectiveArgs = normalized.effectiveArgs;
|
|
316
|
-
readFileMeta = {
|
|
317
|
-
start: normalized.start,
|
|
318
|
-
end: normalized.end,
|
|
319
|
-
wasCapped: normalized.wasCapped,
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
if (name === "update_global_styles") {
|
|
323
|
-
// Be forgiving: models sometimes include a legacy "tokens" key or other junk.
|
|
324
|
-
// We accept the call as long as at least one valid token key/value is provided.
|
|
325
|
-
const tokensMaybe = effectiveArgs?.tokens;
|
|
326
|
-
const normalized = {};
|
|
327
|
-
if (isPlainObject(tokensMaybe)) {
|
|
328
|
-
for (const [k, v] of Object.entries(tokensMaybe)) {
|
|
329
|
-
if (!styleTokenKeySet.has(k))
|
|
330
|
-
continue;
|
|
331
|
-
if (typeof v !== "string")
|
|
332
|
-
continue;
|
|
333
|
-
normalized[k] = v;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
for (const [k, v] of Object.entries(effectiveArgs ?? {})) {
|
|
337
|
-
if (!styleTokenKeySet.has(k))
|
|
338
|
-
continue;
|
|
339
|
-
if (typeof v !== "string")
|
|
340
|
-
continue;
|
|
341
|
-
normalized[k] = v;
|
|
342
|
-
}
|
|
343
|
-
effectiveArgs = normalized;
|
|
344
|
-
}
|
|
345
|
-
logger(buildToolStatusMessage(name, effectiveArgs, readFileMeta), EVENT_TYPES.STEP_STARTED);
|
|
176
|
+
const { effectiveArgs, readFileMeta } = normalizeToolArgs(name, args, {
|
|
177
|
+
readFileDefaultMaxLines: policy.readFileDefaultMaxLines,
|
|
178
|
+
styleTokenKeySet,
|
|
179
|
+
});
|
|
180
|
+
logger(buildToolStatusMessage(name, effectiveArgs, readFileMeta), EVENT_TYPES.STEP_STARTED, true);
|
|
346
181
|
const modelArgs = redactFunctionCallArgs(name, effectiveArgs);
|
|
347
182
|
const functionCallPart = {
|
|
348
183
|
functionCall: {
|
|
@@ -390,75 +225,21 @@ export async function runToolLoop(options) {
|
|
|
390
225
|
else {
|
|
391
226
|
pushModelOnly(assistantModel);
|
|
392
227
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
},
|
|
409
|
-
note: "Resend update_global_styles with at least one token key/value, or skip this tool call.",
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
toolResultRaw = await handler(effectiveArgs);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
toolResultRaw = await handler(effectiveArgs);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
catch (err) {
|
|
421
|
-
logger(`AI tool: ${name} failed`, EVENT_TYPES.STEP_ERROR);
|
|
422
|
-
console.error("Tool loop: handler threw", err, {
|
|
423
|
-
tool: name,
|
|
424
|
-
step: step + 1,
|
|
425
|
-
});
|
|
426
|
-
toolResultRaw = {
|
|
427
|
-
success: false,
|
|
428
|
-
error: err instanceof Error ? err.message : String(err),
|
|
429
|
-
error_detail: serializeError(err),
|
|
430
|
-
note: "Tool handler threw. Inspect error_detail and retry with corrected args or a different approach.",
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
let toolResult = toolResultRaw;
|
|
435
|
-
if (name === "read_file" && readFileMeta) {
|
|
436
|
-
const path = String(effectiveArgs.path ?? "");
|
|
437
|
-
const jsonPayload = toolResultRaw?.kind === "json"
|
|
438
|
-
? toolResultRaw?.json
|
|
439
|
-
: undefined;
|
|
440
|
-
if (jsonPayload !== undefined) {
|
|
441
|
-
// Token-efficient: return JSON as structured data (no double-stringifying).
|
|
442
|
-
toolResult = { path, json: jsonPayload };
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
const rawContent = typeof toolResultRaw?.content === "string"
|
|
446
|
-
? String(toolResultRaw.content)
|
|
447
|
-
: typeof toolResultRaw === "string"
|
|
448
|
-
? toolResultRaw
|
|
449
|
-
: JSON.stringify(toolResultRaw ?? null);
|
|
450
|
-
toolResult = {
|
|
451
|
-
path,
|
|
452
|
-
start_line: readFileMeta.start,
|
|
453
|
-
end_line: readFileMeta.end,
|
|
454
|
-
truncated: readFileMeta.wasCapped,
|
|
455
|
-
content: rawContent,
|
|
456
|
-
note: readFileMeta.wasCapped
|
|
457
|
-
? `Capped to ${policy.readFileDefaultMaxLines} lines. Request more with start_line/end_line.`
|
|
458
|
-
: undefined,
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
}
|
|
228
|
+
const toolResultRaw = await executeToolHandler({
|
|
229
|
+
name,
|
|
230
|
+
handler,
|
|
231
|
+
effectiveArgs,
|
|
232
|
+
styleTokenKeySet,
|
|
233
|
+
step: step + 1,
|
|
234
|
+
logger,
|
|
235
|
+
});
|
|
236
|
+
const toolResult = postProcessToolResult({
|
|
237
|
+
name,
|
|
238
|
+
toolResultRaw,
|
|
239
|
+
effectiveArgs,
|
|
240
|
+
readFileMeta,
|
|
241
|
+
readFileDefaultMaxLines: policy.readFileDefaultMaxLines,
|
|
242
|
+
});
|
|
462
243
|
try {
|
|
463
244
|
await persistToolCall(name, modelArgs, toolResult);
|
|
464
245
|
}
|
|
@@ -487,31 +268,15 @@ export async function runToolLoop(options) {
|
|
|
487
268
|
toolResult?.success === false &&
|
|
488
269
|
applyPatchAutoRetryMax > 0 &&
|
|
489
270
|
applyPatchRetryCount < applyPatchAutoRetryMax) {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
.join("\n\n")}`
|
|
500
|
-
: "";
|
|
501
|
-
const retryInstruction = {
|
|
502
|
-
role: "user",
|
|
503
|
-
parts: [
|
|
504
|
-
{
|
|
505
|
-
text: `apply_patch failed (attempt ${applyPatchRetryCount}/${applyPatchAutoRetryMax}): ${error}\n` +
|
|
506
|
-
`Regenerate a patch that matches the current file contents. ` +
|
|
507
|
-
`For large rewrites, prefer write_file(path, content) or Delete+Add instead of Update.` +
|
|
508
|
-
debugText,
|
|
509
|
-
},
|
|
510
|
-
],
|
|
511
|
-
};
|
|
512
|
-
if (keepFullTrace)
|
|
513
|
-
fullTraceContents.push(retryInstruction);
|
|
514
|
-
modelContents.push(retryInstruction);
|
|
271
|
+
const failureResult = handleApplyPatchFailure({
|
|
272
|
+
toolResult,
|
|
273
|
+
applyPatchAutoRetryMax,
|
|
274
|
+
applyPatchRetryCount,
|
|
275
|
+
keepFullTrace,
|
|
276
|
+
fullTraceContents,
|
|
277
|
+
modelContents,
|
|
278
|
+
});
|
|
279
|
+
applyPatchRetryCount = failureResult.applyPatchRetryCount;
|
|
515
280
|
}
|
|
516
281
|
recordToolEvent({
|
|
517
282
|
toolEvents,
|
|
@@ -523,7 +288,7 @@ export async function runToolLoop(options) {
|
|
|
523
288
|
toolResultRaw,
|
|
524
289
|
});
|
|
525
290
|
if (terminalToolNames.includes(name)) {
|
|
526
|
-
await persistTokensOnce();
|
|
291
|
+
await persistTokensOnce(tokenPersistence, sawAnyTokenUsage, totalInputTokens, totalOutputTokens);
|
|
527
292
|
return {
|
|
528
293
|
contents: keepFullTrace ? fullTraceContents : modelContents,
|
|
529
294
|
modelContents,
|
|
@@ -534,7 +299,7 @@ export async function runToolLoop(options) {
|
|
|
534
299
|
}
|
|
535
300
|
}
|
|
536
301
|
}
|
|
537
|
-
await persistTokensOnce();
|
|
302
|
+
await persistTokensOnce(tokenPersistence, sawAnyTokenUsage, totalInputTokens, totalOutputTokens);
|
|
538
303
|
return {
|
|
539
304
|
contents: keepFullTrace ? fullTraceContents : modelContents,
|
|
540
305
|
modelContents,
|