@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
|
@@ -10,7 +10,7 @@ export class GenerateGeminiReponse {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
async aiResponse(request, options = {}) {
|
|
13
|
-
const { tools, schema, toolCallingMode = FunctionCallingConfigMode.
|
|
13
|
+
const { tools, schema, toolCallingMode = FunctionCallingConfigMode.ANY, } = options;
|
|
14
14
|
const config = {};
|
|
15
15
|
if (tools && tools.length > 0) {
|
|
16
16
|
config.tools = tools;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.client.js","sourceRoot":"","sources":["../../../src/ai/generate/gemini.client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAEzB,WAAW,GAEZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAQrD,MAAM,OAAO,qBAAqB;IAIhC,YAAY,YAAoB,EAAE,KAAc;QAFzC,UAAK,GAAW,aAAa,CAAC;QAGnC,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,UAA6B,EAAE;QACvE,MAAM,EACJ,KAAK,EACL,MAAM,EACN,eAAe,GAAG,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"gemini.client.js","sourceRoot":"","sources":["../../../src/ai/generate/gemini.client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAEzB,WAAW,GAEZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAQrD,MAAM,OAAO,qBAAqB;IAIhC,YAAY,YAAoB,EAAE,KAAc;QAFzC,UAAK,GAAW,aAAa,CAAC;QAGnC,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,UAA6B,EAAE;QACvE,MAAM,EACJ,KAAK,EACL,MAAM,EACN,eAAe,GAAG,yBAAyB,CAAC,GAAG,GAChD,GAAG,OAAO,CAAC;QAEZ,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,MAAM,CAAC,UAAU,GAAG;gBAClB,qBAAqB,EAAE;oBACrB,IAAI,EAAE,eAAe;iBACtB;aACF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;YAC7C,MAAM,CAAC,kBAAkB,GAAG,eAAe,CAAC,MAAa,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,OAAc;gBACxB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,yBAAyB,GAAG,EAAE,OAAO,IAAI,eAAe,EAAE,CAC3D,CAAC;YACD,OAAe,CAAC,KAAK,GAAG,GAAG,CAAC;YAC7B,MAAM,OAAO,CAAC;QAChB,CAAC;IACH,CAAC;CACF","sourcesContent":["import {\n FunctionCallingConfigMode,\n GenerateContentConfig,\n GoogleGenAI,\n Tool,\n} from \"@google/genai\";\nimport type { ZodSchema } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport const DEFAULT_MODEL = \"gemini-3.1-flash-lite\";\n\ntype AIResponseOptions = {\n tools?: Tool[];\n schema?: ZodSchema;\n toolCallingMode?: FunctionCallingConfigMode;\n};\n\nexport class GenerateGeminiReponse {\n public gemini: GoogleGenAI;\n public model: string = DEFAULT_MODEL;\n\n constructor(geminiApiKey: string, model?: string) {\n this.gemini = new GoogleGenAI({ apiKey: geminiApiKey });\n if (model) {\n this.model = model;\n }\n }\n\n public async aiResponse(request: unknown, options: AIResponseOptions = {}) {\n const {\n tools,\n schema,\n toolCallingMode = FunctionCallingConfigMode.ANY,\n } = options;\n\n const config: GenerateContentConfig = {};\n\n if (tools && tools.length > 0) {\n config.tools = tools;\n config.toolConfig = {\n functionCallingConfig: {\n mode: toolCallingMode,\n },\n };\n }\n\n if (schema) {\n config.responseMimeType = \"application/json\";\n config.responseJsonSchema = zodToJsonSchema(schema as any);\n }\n\n try {\n return await this.gemini.models.generateContent({\n model: this.model,\n contents: request as any,\n ...(Object.keys(config).length > 0 && { config }),\n });\n } catch (err: any) {\n const wrapped = new Error(\n `AI generation failed: ${err?.message || \"Unknown error\"}`,\n );\n (wrapped as any).cause = err;\n throw wrapped;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateClient.d.ts","sourceRoot":"","sources":["../../../src/ai/generate/generateClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"generateClient.d.ts","sourceRoot":"","sources":["../../../src/ai/generate/generateClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAM3D,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ,MAAM,0BAOzE,CAAC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { GenerateGeminiReponse } from "./gemini.client.js";
|
|
2
|
+
const providerFactory = {
|
|
3
|
+
gemini: GenerateGeminiReponse,
|
|
4
|
+
};
|
|
2
5
|
export const getClient = (provider, apiKey, model) => {
|
|
3
|
-
|
|
4
|
-
|
|
6
|
+
const GenerateReponse = providerFactory[provider];
|
|
7
|
+
if (!GenerateReponse) {
|
|
8
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
5
9
|
}
|
|
6
|
-
|
|
10
|
+
return new GenerateReponse(apiKey, model);
|
|
7
11
|
};
|
|
8
12
|
//# sourceMappingURL=generateClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateClient.js","sourceRoot":"","sources":["../../../src/ai/generate/generateClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"generateClient.js","sourceRoot":"","sources":["../../../src/ai/generate/generateClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,qBAAqB;CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAc,EAAE,EAAE;IAC5E,MAAM,eAAe,GACnB,eAAe,CAAC,QAAwC,CAAC,CAAC;IAC5D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC","sourcesContent":["import { GenerateGeminiReponse } from \"./gemini.client.js\";\r\n\r\nconst providerFactory = {\r\n gemini: GenerateGeminiReponse,\r\n};\r\n\r\nexport const getClient = (provider: string, apiKey: string, model?: string) => {\r\n const GenerateReponse =\r\n providerFactory[provider as keyof typeof providerFactory];\r\n if (!GenerateReponse) {\r\n throw new Error(`Unknown provider: ${provider}`);\r\n }\r\n return new GenerateReponse(apiKey, model);\r\n};\r\n"]}
|
|
@@ -32,7 +32,7 @@ export const codegenPrompt = (params) => {
|
|
|
32
32
|
- Use \`insert_element\` to insert an entire UI tree at once. Pass a flat array of elements under \`elements\`. The root element of your new subtree must have \`parentId\` set to \`\"parent\"\`. All other elements in the array must set \`parentId\` matching the temporary \`id\` of their parent in that same array.
|
|
33
33
|
- Create missing routes with create_new_route.
|
|
34
34
|
- For any tool arg named route, always use URL paths with forward slashes (e.g. '/', '/pricing'); never use '\\' or filesystem paths like 'app/pricing'.
|
|
35
|
-
- insert_element supports optional before_id to insert before an existing sibling; if omitted or not found, it appends to the end.
|
|
35
|
+
- insert_element supports optional before_id to insert before an existing sibling; if omitted or not found, it appends to the end. Use this to do things like inserting navbar before the main content area, etc.
|
|
36
36
|
- Include images whenever mentoned to be included. Just use alt tag for images. image src auto-generated from alt
|
|
37
37
|
- lucide-react icons only
|
|
38
38
|
- Prefer semantic Tailwind tokens (bg-background, text-foreground, border-border, ring-ring, etc.) over hardcoded colors (e.g. slate-*, bg-white) for global styles. If you need different global colors/radius, call update_global_styles first, then use token-based classes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/codegen.prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AASzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA+B,EAAE,EAAE;IAC/D,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAEtE,MAAM,MAAM,GAAG;;;;;;;;;MASX,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;GAC5C,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,QAAQ,GAAG,SAAS,CACxB,mBAAmB,EACnB,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAChC,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CACzB,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2BE,CAAC,IAAI,EAAE,CACT,CAAC;IAEH,MAAM,oBAAoB,GAAG,SAAS,CACpC,gBAAgB,EAChB;QACE,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;QAEnE,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC;QAE/D,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;KACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,SAAS,CACvB,kBAAkB,EAClB,SAAS,CAAC,SAAS,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAC7C,CAAC;IAEF,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,oBAAoB;QACpB,OAAO;QACP,eAAe;KAChB,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC,CAAC","sourcesContent":["import { CodegenIndex, CollectedContext } from \"../../types/public.js\";\r\nimport { codegenExamples } from \"./examples/codegen.examples.js\";\r\nimport {\r\n jsonBlock,\r\n mdSection,\r\n projectStateNote,\r\n} from \"./helpers/promptParts.helper.js\";\r\n\r\nexport type CodegenNodePromptParams = {\r\n task: any;\r\n codegenIndex: CodegenIndex;\r\n collectedContext: CollectedContext;\r\n isNewProject: boolean;\r\n};\r\n\r\nexport const codegenPrompt = (params: CodegenNodePromptParams) => {\r\n const { task, codegenIndex, collectedContext, isNewProject } = params;\r\n\r\n const system = `\r\n You are a senior software engineer implementing tasks in an existing codebase.\r\n\r\n Rules:\r\n - Implement ONLY the requested task.\r\n - Prefer incremental edits over rewrites.\r\n - Be concise and deterministic.\r\n - Do not output code directly; use tools.\r\n\r\n ${projectStateNote(isNewProject, \"codegen\")}\r\n `.trim();\r\n\r\n const taskInfo = mdSection(\r\n \"Task to implement\",\r\n jsonBlock(\"task\", task ?? null),\r\n );\r\n\r\n const toolsInfo = mdSection(\r\n \"Tools\",\r\n `\r\n Available tools:\r\n\r\n - read_file: Read file\r\n - update_global_styles: Update app/styleConfig.json global design tokens\r\n - list_dir: List directory\r\n - create_new_route: Create route with page.tsx + pageConfig.json\r\n - insert_element: Insert element tree (using flat array of elements)\r\n - delete_element: Delete element\r\n - update_classname: Update className\r\n - update_props: Update props\r\n - get_available_routes: Get available routes\r\n - submit_codegen_done: Finish task\r\n\r\n Rules:\r\n - Use \\`insert_element\\` to insert an entire UI tree at once. Pass a flat array of elements under \\`elements\\`. The root element of your new subtree must have \\`parentId\\` set to \\`\\\"parent\\\"\\`. All other elements in the array must set \\`parentId\\` matching the temporary \\`id\\` of their parent in that same array.\r\n - Create missing routes with create_new_route.\r\n - For any tool arg named route, always use URL paths with forward slashes (e.g. '/', '/pricing'); never use '\\\\' or filesystem paths like 'app/pricing'.\r\n - insert_element supports optional before_id to insert before an existing sibling; if omitted or not found, it appends to the end.\r\n - Include images whenever mentoned to be included. Just use alt tag for images. image src auto-generated from alt\r\n - lucide-react icons only\r\n - Prefer semantic Tailwind tokens (bg-background, text-foreground, border-border, ring-ring, etc.) over hardcoded colors (e.g. slate-*, bg-white) for global styles. If you need different global colors/radius, call update_global_styles first, then use token-based classes.\r\n - update_global_styles args MUST be a flat JSON object with token keys as optional params. Include at least 1 key.\r\n - While updating global styles make sure that the styles updating (ex. background, foreground) are used in the right places (using bg-background, text-foreground, etc.). If not include them by updating the classname using update_classname tool\r\n - Never call update_global_styles with {} (empty object). If you don't need to change styles, do not call this tool.\r\n - Example: {\"radius\":\"0.75rem\",\"background\":\"oklch(0.98 0.01 80)\"}.\r\n\r\n `.trim(),\r\n );\r\n\r\n const projectConfiguration = mdSection(\r\n \"Project Config\",\r\n [\r\n jsonBlock(\"framework\", codegenIndex.projectConfigs.frameworkConfig),\r\n\r\n jsonBlock(\"runtime\", codegenIndex.projectConfigs.runtimeConfig),\r\n\r\n jsonBlock(\"rendering\", codegenIndex.projectConfigs.renderingConfig),\r\n ].join(\"\\n\"),\r\n );\r\n\r\n const context = mdSection(\r\n \"Relevant Context\",\r\n jsonBlock(\"context\", collectedContext ?? {}),\r\n );\r\n\r\n const sections = [\r\n system,\r\n taskInfo,\r\n toolsInfo,\r\n projectConfiguration,\r\n context,\r\n codegenExamples,\r\n ];\r\n\r\n return sections.join(\"\\n\\n---\\n\\n\");\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"codegen.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/codegen.prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AASzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA+B,EAAE,EAAE;IAC/D,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAEtE,MAAM,MAAM,GAAG;;;;;;;;;MASX,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;GAC5C,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,QAAQ,GAAG,SAAS,CACxB,mBAAmB,EACnB,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAChC,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CACzB,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2BE,CAAC,IAAI,EAAE,CACT,CAAC;IAEH,MAAM,oBAAoB,GAAG,SAAS,CACpC,gBAAgB,EAChB;QACE,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;QAEnE,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC;QAE/D,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;KACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,SAAS,CACvB,kBAAkB,EAClB,SAAS,CAAC,SAAS,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAC7C,CAAC;IAEF,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,QAAQ;QACR,SAAS;QACT,oBAAoB;QACpB,OAAO;QACP,eAAe;KAChB,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC,CAAC","sourcesContent":["import { CodegenIndex, CollectedContext } from \"../../types/public.js\";\r\nimport { codegenExamples } from \"./examples/codegen.examples.js\";\r\nimport {\r\n jsonBlock,\r\n mdSection,\r\n projectStateNote,\r\n} from \"./helpers/promptParts.helper.js\";\r\n\r\nexport type CodegenNodePromptParams = {\r\n task: any;\r\n codegenIndex: CodegenIndex;\r\n collectedContext: CollectedContext;\r\n isNewProject: boolean;\r\n};\r\n\r\nexport const codegenPrompt = (params: CodegenNodePromptParams) => {\r\n const { task, codegenIndex, collectedContext, isNewProject } = params;\r\n\r\n const system = `\r\n You are a senior software engineer implementing tasks in an existing codebase.\r\n\r\n Rules:\r\n - Implement ONLY the requested task.\r\n - Prefer incremental edits over rewrites.\r\n - Be concise and deterministic.\r\n - Do not output code directly; use tools.\r\n\r\n ${projectStateNote(isNewProject, \"codegen\")}\r\n `.trim();\r\n\r\n const taskInfo = mdSection(\r\n \"Task to implement\",\r\n jsonBlock(\"task\", task ?? null),\r\n );\r\n\r\n const toolsInfo = mdSection(\r\n \"Tools\",\r\n `\r\n Available tools:\r\n\r\n - read_file: Read file\r\n - update_global_styles: Update app/styleConfig.json global design tokens\r\n - list_dir: List directory\r\n - create_new_route: Create route with page.tsx + pageConfig.json\r\n - insert_element: Insert element tree (using flat array of elements)\r\n - delete_element: Delete element\r\n - update_classname: Update className\r\n - update_props: Update props\r\n - get_available_routes: Get available routes\r\n - submit_codegen_done: Finish task\r\n\r\n Rules:\r\n - Use \\`insert_element\\` to insert an entire UI tree at once. Pass a flat array of elements under \\`elements\\`. The root element of your new subtree must have \\`parentId\\` set to \\`\\\"parent\\\"\\`. All other elements in the array must set \\`parentId\\` matching the temporary \\`id\\` of their parent in that same array.\r\n - Create missing routes with create_new_route.\r\n - For any tool arg named route, always use URL paths with forward slashes (e.g. '/', '/pricing'); never use '\\\\' or filesystem paths like 'app/pricing'.\r\n - insert_element supports optional before_id to insert before an existing sibling; if omitted or not found, it appends to the end. Use this to do things like inserting navbar before the main content area, etc.\r\n - Include images whenever mentoned to be included. Just use alt tag for images. image src auto-generated from alt\r\n - lucide-react icons only\r\n - Prefer semantic Tailwind tokens (bg-background, text-foreground, border-border, ring-ring, etc.) over hardcoded colors (e.g. slate-*, bg-white) for global styles. If you need different global colors/radius, call update_global_styles first, then use token-based classes.\r\n - update_global_styles args MUST be a flat JSON object with token keys as optional params. Include at least 1 key.\r\n - While updating global styles make sure that the styles updating (ex. background, foreground) are used in the right places (using bg-background, text-foreground, etc.). If not include them by updating the classname using update_classname tool\r\n - Never call update_global_styles with {} (empty object). If you don't need to change styles, do not call this tool.\r\n - Example: {\"radius\":\"0.75rem\",\"background\":\"oklch(0.98 0.01 80)\"}.\r\n\r\n `.trim(),\r\n );\r\n\r\n const projectConfiguration = mdSection(\r\n \"Project Config\",\r\n [\r\n jsonBlock(\"framework\", codegenIndex.projectConfigs.frameworkConfig),\r\n\r\n jsonBlock(\"runtime\", codegenIndex.projectConfigs.runtimeConfig),\r\n\r\n jsonBlock(\"rendering\", codegenIndex.projectConfigs.renderingConfig),\r\n ].join(\"\\n\"),\r\n );\r\n\r\n const context = mdSection(\r\n \"Relevant Context\",\r\n jsonBlock(\"context\", collectedContext ?? {}),\r\n );\r\n\r\n const sections = [\r\n system,\r\n taskInfo,\r\n toolsInfo,\r\n projectConfiguration,\r\n context,\r\n codegenExamples,\r\n ];\r\n\r\n return sections.join(\"\\n\\n---\\n\\n\");\r\n};\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type PromptRole = "planner" | "codegen" | "validator";
|
|
2
2
|
export declare const mdSection: (title: string, body: string) => string;
|
|
3
3
|
export declare const jsonBlock: (label: string, value: unknown) => string;
|
|
4
|
-
export declare const projectStateNote: (isNewProject: boolean, role: PromptRole) => "The project you are given is currently a boilerplate project that contains some existing code. Create tasks to modify project according to PM plan and context; remove boilerplate traces." | "
|
|
4
|
+
export declare const projectStateNote: (isNewProject: boolean, role: PromptRole) => "The project you are given is currently a boilerplate project that contains some existing code. Create tasks to modify project according to PM plan and context; remove boilerplate traces." | "Only create plans to implement changes which are not existing. Avoid rework. For example, if PM plan asks to create a new route or section which already exists, do not create a task for that" | "The project is currently a boilerplate. Implement task cleanly while removing boilerplate patterns." | "Implement task incrementally without breaking existing architecture.";
|
|
5
5
|
export declare const renderPlannerTaskFormatSection: () => string;
|
|
6
6
|
//# sourceMappingURL=promptParts.helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptParts.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/prompts/helpers/promptParts.helper.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7D,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,WAGpD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,WACR,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAAI,cAAc,OAAO,EAAE,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"promptParts.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/prompts/helpers/promptParts.helper.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7D,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,WAGpD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,WACR,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAAI,cAAc,OAAO,EAAE,MAAM,UAAU,qjBAUvE,CAAC;AAEF,eAAO,MAAM,8BAA8B,cAexC,CAAC"}
|
|
@@ -7,7 +7,7 @@ export const projectStateNote = (isNewProject, role) => {
|
|
|
7
7
|
if (role === "planner") {
|
|
8
8
|
return isNewProject
|
|
9
9
|
? "The project you are given is currently a boilerplate project that contains some existing code. Create tasks to modify project according to PM plan and context; remove boilerplate traces."
|
|
10
|
-
: "
|
|
10
|
+
: "Only create plans to implement changes which are not existing. Avoid rework. For example, if PM plan asks to create a new route or section which already exists, do not create a task for that";
|
|
11
11
|
}
|
|
12
12
|
return isNewProject
|
|
13
13
|
? "The project is currently a boilerplate. Implement task cleanly while removing boilerplate patterns."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptParts.helper.js","sourceRoot":"","sources":["../../../../src/ai/prompts/helpers/promptParts.helper.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,GAAG,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAc,EAAE,EAAE,CACzD,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;AAEhD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,YAAqB,EAAE,IAAgB,EAAE,EAAE;IAC1E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,YAAY;YACjB,CAAC,CAAC,4LAA4L;YAC9L,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"promptParts.helper.js","sourceRoot":"","sources":["../../../../src/ai/prompts/helpers/promptParts.helper.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,GAAG,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAc,EAAE,EAAE,CACzD,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;AAEhD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,YAAqB,EAAE,IAAgB,EAAE,EAAE;IAC1E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,YAAY;YACjB,CAAC,CAAC,4LAA4L;YAC9L,CAAC,CAAC,gMAAgM,CAAC;IACvM,CAAC;IAED,OAAO,YAAY;QACjB,CAAC,CAAC,qGAAqG;QACvG,CAAC,CAAC,sEAAsE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,EAAE,CACjD,SAAS,CACP,sBAAsB,EACtB;;;;;;;;;;;KAWC,CAAC,IAAI,EAAE,CACT,CAAC","sourcesContent":["export type PromptRole = \"planner\" | \"codegen\" | \"validator\";\n\nexport const mdSection = (title: string, body: string) => {\n const trimmed = body.trim();\n return `<${title}>${trimmed}</${title}>`;\n};\n\nexport const jsonBlock = (label: string, value: unknown) =>\n `${label}:${JSON.stringify(value ?? null)}\\n`;\n\nexport const projectStateNote = (isNewProject: boolean, role: PromptRole) => {\n if (role === \"planner\") {\n return isNewProject\n ? \"The project you are given is currently a boilerplate project that contains some existing code. Create tasks to modify project according to PM plan and context; remove boilerplate traces.\"\n : \"Only create plans to implement changes which are not existing. Avoid rework. For example, if PM plan asks to create a new route or section which already exists, do not create a task for that\";\n }\n\n return isNewProject\n ? \"The project is currently a boilerplate. Implement task cleanly while removing boilerplate patterns.\"\n : \"Implement task incrementally without breaking existing architecture.\";\n};\n\nexport const renderPlannerTaskFormatSection = () =>\n mdSection(\n \"Task Format (STRICT)\",\n `\nAfter planning, Call submit_planner_tasks with:\n\n{\n \"planner_tasks\": [\n {\n \"description\": \"Exact changes + paths. No code\",\n \"targets\": [\"Paths that to be modified or referenced\"]\n }\n ]\n}\n `.trim(),\n );\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/planner.prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,oBAAoB,
|
|
1
|
+
{"version":3,"file":"planner.prompt.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/planner.prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,oBAAoB,WAwEzD,CAAC"}
|
|
@@ -30,6 +30,7 @@ export const plannerPrompt = (params) => {
|
|
|
30
30
|
- While updating global styles make sure that the styles updating (ex. background, foreground) are used in the right places. If not try including them by updating the classname
|
|
31
31
|
- If a task requires changing theme tokens, specify exact update_global_styles args as a flat object: {"<tokenKey>":"<cssString>"} (never {}).
|
|
32
32
|
- Try including images whereever needed in the task description. Also tell what the image should be.
|
|
33
|
+
- Task creation order must follow the visual reading flow of the interface, from top to bottom, if an incremental change needs to add a section before an existing section, explicitly mention to use "before_id" param to codegen agent.
|
|
33
34
|
`);
|
|
34
35
|
const rendering = renderPlannerTaskFormatSection();
|
|
35
36
|
const projectConfiguration = mdSection("Project Config", [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/planner.prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,iCAAiC,CAAC;AASzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA4B,EAAE,EAAE;IAC5D,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE3E,MAAM,MAAM,GAAG;;;;;;;;;;;;MAYX,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;GAC5C,CAAC,IAAI,EAAE,CAAC;IACT,MAAM,aAAa,GAAG,SAAS,CAC7B,UAAU,EACV,SAAS,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,CACpC,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CACzB,OAAO,EACP
|
|
1
|
+
{"version":3,"file":"planner.prompt.js","sourceRoot":"","sources":["../../../src/ai/prompts/planner.prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,8BAA8B,GAC/B,MAAM,iCAAiC,CAAC;AASzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA4B,EAAE,EAAE;IAC5D,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE3E,MAAM,MAAM,GAAG;;;;;;;;;;;;MAYX,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;GAC5C,CAAC,IAAI,EAAE,CAAC;IACT,MAAM,aAAa,GAAG,SAAS,CAC7B,UAAU,EACV,SAAS,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,CACpC,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CACzB,OAAO,EACP;;;;;;;;;;;;;;KAcC,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,8BAA8B,EAAE,CAAC;IAEnD,MAAM,oBAAoB,GAAG,SAAS,CACpC,gBAAgB,EAChB;QACE,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;QAEnE,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC;QAE/D,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC;QAE/D,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC;KACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,MAAM,OAAO,GAAG,SAAS,CACvB,kBAAkB,EAClB,SAAS,CAAC,SAAS,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAC7C,CAAC;IAEF,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,aAAa;QACb,SAAS;QACT,SAAS;QACT,oBAAoB;QACpB,OAAO;QACP,eAAe;KAChB,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC,CAAC","sourcesContent":["import { CollectedContext } from \"../../types/context.types.js\";\r\nimport { PlannerIndex } from \"../../types/public.js\";\r\nimport { plannerExamples } from \"./examples/planner.examples.js\";\r\nimport {\r\n jsonBlock,\r\n mdSection,\r\n projectStateNote,\r\n renderPlannerTaskFormatSection,\r\n} from \"./helpers/promptParts.helper.js\";\r\n\r\nexport type PlanNodePromptParams = {\r\n planTasks: unknown[];\r\n collectedContext: CollectedContext;\r\n plannerIndex: PlannerIndex;\r\n isNewProject: boolean;\r\n};\r\n\r\nexport const plannerPrompt = (params: PlanNodePromptParams) => {\r\n const { planTasks, collectedContext, plannerIndex, isNewProject } = params;\r\n\r\n const system = `\r\n You are a senior software architect creating implementation tasks.\r\n\r\n Rules:\r\n - Create atomic, deterministic tasks.\r\n - Include exact file paths to create/modify.\r\n - Prefer incremental edits over rewrites.\r\n - Reuse existing code/patterns.\r\n - Be concise but complete.\r\n - Do not write code.\r\n - Tasks must be directly executable by codegen agents.\r\n\r\n ${projectStateNote(isNewProject, \"planner\")}\r\n `.trim();\r\n const planTasksInfo = mdSection(\r\n \"PM Tasks\",\r\n jsonBlock(\"Tasks\", planTasks ?? []),\r\n );\r\n\r\n const toolsInfo = mdSection(\r\n \"Tools\",\r\n `\r\n - read_file: read file\r\n - search: search codebase\r\n - list_dir: list dirs\r\n - get_available_routes: Get available routes\r\n - submit_planner_tasks: Finalize planner output\r\n\r\n Styling guidance:\r\n - Codegen can call update_global_styles to modify app/styleConfig.json (global design tokens).\r\n - Prefer semantic Tailwind token classes (bg-background, text-foreground, border-border, ring-ring, etc.) so global styles are utilized.\r\n - While updating global styles make sure that the styles updating (ex. background, foreground) are used in the right places. If not try including them by updating the classname\r\n - If a task requires changing theme tokens, specify exact update_global_styles args as a flat object: {\"<tokenKey>\":\"<cssString>\"} (never {}).\r\n - Try including images whereever needed in the task description. Also tell what the image should be.\r\n - Task creation order must follow the visual reading flow of the interface, from top to bottom, if an incremental change needs to add a section before an existing section, explicitly mention to use \"before_id\" param to codegen agent.\r\n `,\r\n );\r\n\r\n const rendering = renderPlannerTaskFormatSection();\r\n\r\n const projectConfiguration = mdSection(\r\n \"Project Config\",\r\n [\r\n jsonBlock(\"framework\", plannerIndex.projectConfigs.frameworkConfig),\r\n\r\n jsonBlock(\"runtime\", plannerIndex.projectConfigs.runtimeConfig),\r\n\r\n jsonBlock(\"tooling\", plannerIndex.projectConfigs.toolingConfig),\r\n\r\n jsonBlock(\"rendering\", plannerIndex.projectConfigs.renderingConfig),\r\n ].join(\"\\n\"),\r\n );\r\n\r\n const context = mdSection(\r\n \"Relevant Context\",\r\n jsonBlock(\"context\", collectedContext ?? {}),\r\n );\r\n\r\n const sections = [\r\n system,\r\n planTasksInfo,\r\n toolsInfo,\r\n rendering,\r\n projectConfiguration,\r\n context,\r\n plannerExamples,\r\n ];\r\n\r\n return sections.join(\"\\n\\n---\\n\\n\");\r\n};\r\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FunctionCallingConfigMode, Tool } from "@google/genai";
|
|
2
|
+
import { AiCallFn, Logger } from "../toolLoopRunner.js";
|
|
3
|
+
export declare const aiCallWithRetry: (params: {
|
|
4
|
+
aiCall: AiCallFn;
|
|
5
|
+
request: unknown;
|
|
6
|
+
options: {
|
|
7
|
+
tools?: Tool[];
|
|
8
|
+
toolCallingMode?: FunctionCallingConfigMode;
|
|
9
|
+
};
|
|
10
|
+
retryMax: number;
|
|
11
|
+
retryBaseMs: number;
|
|
12
|
+
retryMaxMs: number;
|
|
13
|
+
step: number;
|
|
14
|
+
logger: Logger;
|
|
15
|
+
}) => Promise<import("../toolLoopRunner.js").AiCallResponse>;
|
|
16
|
+
//# sourceMappingURL=aiCall.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiCall.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/aiCall.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIhE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,eAAe,GAAU,QAAQ;IAC5C,MAAM,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAAC,eAAe,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,2DA2BA,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EVENT_TYPES } from "../../../types/events.js";
|
|
2
|
+
import { computeBackoffMs, sleep } from "../../../utils/utils.js";
|
|
3
|
+
import { isTransientAiCallError } from "./errors.helper.js";
|
|
4
|
+
export const aiCallWithRetry = async (params) => {
|
|
5
|
+
const { aiCall, request, options, retryMax, retryBaseMs, retryMaxMs, logger, } = params;
|
|
6
|
+
let retryCount = 0;
|
|
7
|
+
while (true) {
|
|
8
|
+
try {
|
|
9
|
+
return await aiCall(request, options);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
const transient = isTransientAiCallError(err);
|
|
13
|
+
if (!transient || retryMax <= 0 || retryCount >= retryMax) {
|
|
14
|
+
throw err;
|
|
15
|
+
}
|
|
16
|
+
retryCount += 1;
|
|
17
|
+
const delayMs = computeBackoffMs(retryCount, retryBaseMs, retryMaxMs);
|
|
18
|
+
logger("Tool loop: aiCall failed; retrying", EVENT_TYPES.STEP_RETRY);
|
|
19
|
+
await sleep(delayMs);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=aiCall.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiCall.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/aiCall.helper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,MASrC,EAAE,EAAE;IACH,MAAM,EACJ,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,MAAM,GACP,GAAG,MAAM,CAAC;IAEX,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS,IAAI,QAAQ,IAAI,CAAC,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;gBAC1D,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,UAAU,IAAI,CAAC,CAAC;YAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACtE,MAAM,CAAC,oCAAoC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { FunctionCallingConfigMode, Tool } from \"@google/genai\";\nimport { EVENT_TYPES } from \"../../../types/events.js\";\nimport { computeBackoffMs, sleep } from \"../../../utils/utils.js\";\nimport { isTransientAiCallError } from \"./errors.helper.js\";\nimport { AiCallFn, Logger } from \"../toolLoopRunner.js\";\n\nexport const aiCallWithRetry = async (params: {\n aiCall: AiCallFn;\n request: unknown;\n options: { tools?: Tool[]; toolCallingMode?: FunctionCallingConfigMode };\n retryMax: number;\n retryBaseMs: number;\n retryMaxMs: number;\n step: number;\n logger: Logger;\n}) => {\n const {\n aiCall,\n request,\n options,\n retryMax,\n retryBaseMs,\n retryMaxMs,\n logger,\n } = params;\n\n let retryCount = 0;\n while (true) {\n try {\n return await aiCall(request, options);\n } catch (err) {\n const transient = isTransientAiCallError(err);\n if (!transient || retryMax <= 0 || retryCount >= retryMax) {\n throw err;\n }\n\n retryCount += 1;\n const delayMs = computeBackoffMs(retryCount, retryBaseMs, retryMaxMs);\n logger(\"Tool loop: aiCall failed; retrying\", EVENT_TYPES.STEP_RETRY);\n await sleep(delayMs);\n }\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyPatch.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/applyPatch.helper.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;CAOnE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { extractPatchFiles, sha256Hex } from "./fsHelpers.js";
|
|
2
|
+
export const getApplyPatchEventMeta = (args) => {
|
|
3
|
+
const patch = typeof args.patch_string === "string" ? args.patch_string : "";
|
|
4
|
+
return {
|
|
5
|
+
chars: patch.length,
|
|
6
|
+
sha256: sha256Hex(patch),
|
|
7
|
+
files: extractPatchFiles(patch),
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=applyPatch.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyPatch.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/applyPatch.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAA6B,EAAE,EAAE;IACtE,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;QACxB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { extractPatchFiles, sha256Hex } from \"./fsHelpers.js\";\r\n\r\nexport const getApplyPatchEventMeta = (args: Record<string, unknown>) => {\r\n const patch = typeof args.patch_string === \"string\" ? args.patch_string : \"\";\r\n return {\r\n chars: patch.length,\r\n sha256: sha256Hex(patch),\r\n files: extractPatchFiles(patch),\r\n };\r\n};\r\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const serializeError: (err: unknown) => {
|
|
2
|
+
name: string;
|
|
3
|
+
message: string;
|
|
4
|
+
stack: string | undefined;
|
|
5
|
+
cause: unknown;
|
|
6
|
+
value?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
name: "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function";
|
|
9
|
+
message: string;
|
|
10
|
+
value: unknown;
|
|
11
|
+
stack?: undefined;
|
|
12
|
+
cause?: undefined;
|
|
13
|
+
};
|
|
14
|
+
export declare const isTransientAiCallError: (err: unknown) => boolean;
|
|
15
|
+
//# sourceMappingURL=errors.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/errors.helper.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO;;;;;;;;;;;;CAuB1C,CAAC;AA6BF,eAAO,MAAM,sBAAsB,GAAI,KAAK,OAAO,YAQlD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const serializeError = (err) => {
|
|
2
|
+
if (err instanceof Error) {
|
|
3
|
+
const cause = err.cause;
|
|
4
|
+
return {
|
|
5
|
+
name: err.name,
|
|
6
|
+
message: err.message,
|
|
7
|
+
stack: err.stack,
|
|
8
|
+
cause: cause instanceof Error
|
|
9
|
+
? {
|
|
10
|
+
name: cause.name,
|
|
11
|
+
message: cause.message,
|
|
12
|
+
stack: cause.stack,
|
|
13
|
+
}
|
|
14
|
+
: cause,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
name: typeof err,
|
|
19
|
+
message: typeof err === "string" ? err : "Non-Error thrown",
|
|
20
|
+
value: err,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
const isSingleNodeTransient = (node) => {
|
|
24
|
+
if (!node)
|
|
25
|
+
return false;
|
|
26
|
+
const code = node.error?.code ?? node.code ?? node.statusCode ?? node.response?.status;
|
|
27
|
+
const status = node.error?.status ?? node.status ?? node.response?.data?.error?.status;
|
|
28
|
+
const message = node.error?.message ??
|
|
29
|
+
node.message ??
|
|
30
|
+
node.response?.data?.error?.message;
|
|
31
|
+
const msg = typeof message === "string" ? message.toLowerCase() : "";
|
|
32
|
+
const stat = typeof status === "string" ? status.toUpperCase() : "";
|
|
33
|
+
return (code === 503 ||
|
|
34
|
+
code === 429 ||
|
|
35
|
+
stat === "UNAVAILABLE" ||
|
|
36
|
+
stat === "RESOURCE_EXHAUSTED" ||
|
|
37
|
+
msg.includes("high demand") ||
|
|
38
|
+
msg.includes("try again later") ||
|
|
39
|
+
msg.includes("temporar"));
|
|
40
|
+
};
|
|
41
|
+
export const isTransientAiCallError = (err) => {
|
|
42
|
+
let cur = err;
|
|
43
|
+
for (let depth = 0; depth < 4 && cur; depth++) {
|
|
44
|
+
if (isSingleNodeTransient(cur))
|
|
45
|
+
return true;
|
|
46
|
+
cur = cur.cause;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=errors.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/errors.helper.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAE,EAAE;IAC7C,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAI,GAAW,CAAC,KAAgB,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EACH,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC;oBACE,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB;gBACH,CAAC,CAAC,KAAK;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO,GAAG;QAChB,OAAO,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB;QAC3D,KAAK,EAAE,GAAG;KACX,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,IAAS,EAAW,EAAE;IACnD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GACR,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE5E,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;IAE1E,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,EAAE,OAAO;QACnB,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IAEtC,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpE,OAAO,CACL,IAAI,KAAK,GAAG;QACZ,IAAI,KAAK,GAAG;QACZ,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,oBAAoB;QAC7B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC/B,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAY,EAAE,EAAE;IACrD,IAAI,GAAG,GAAQ,GAAU,CAAC;IAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,qBAAqB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["export const serializeError = (err: unknown) => {\r\n if (err instanceof Error) {\r\n const cause = (err as any).cause as unknown;\r\n return {\r\n name: err.name,\r\n message: err.message,\r\n stack: err.stack,\r\n cause:\r\n cause instanceof Error\r\n ? {\r\n name: cause.name,\r\n message: cause.message,\r\n stack: cause.stack,\r\n }\r\n : cause,\r\n };\r\n }\r\n\r\n return {\r\n name: typeof err,\r\n message: typeof err === \"string\" ? err : \"Non-Error thrown\",\r\n value: err,\r\n };\r\n};\r\n\r\nconst isSingleNodeTransient = (node: any): boolean => {\r\n if (!node) return false;\r\n const code =\r\n node.error?.code ?? node.code ?? node.statusCode ?? node.response?.status;\r\n\r\n const status =\r\n node.error?.status ?? node.status ?? node.response?.data?.error?.status;\r\n\r\n const message =\r\n node.error?.message ??\r\n node.message ??\r\n node.response?.data?.error?.message;\r\n\r\n const msg = typeof message === \"string\" ? message.toLowerCase() : \"\";\r\n const stat = typeof status === \"string\" ? status.toUpperCase() : \"\";\r\n\r\n return (\r\n code === 503 ||\r\n code === 429 ||\r\n stat === \"UNAVAILABLE\" ||\r\n stat === \"RESOURCE_EXHAUSTED\" ||\r\n msg.includes(\"high demand\") ||\r\n msg.includes(\"try again later\") ||\r\n msg.includes(\"temporar\")\r\n );\r\n};\r\n\r\nexport const isTransientAiCallError = (err: unknown) => {\r\n let cur: any = err as any;\r\n for (let depth = 0; depth < 4 && cur; depth++) {\r\n if (isSingleNodeTransient(cur)) return true;\r\n cur = cur.cause;\r\n }\r\n\r\n return false;\r\n};\r\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CoreFs } from "../../tools/implementations/workspaceDeps.js";
|
|
2
|
+
export declare const sha256Hex: (value: string) => string;
|
|
3
|
+
export declare const extractPatchFiles: (patchString: string) => string[];
|
|
4
|
+
export declare const nodeFs: CoreFs;
|
|
5
|
+
//# sourceMappingURL=fsHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fsHelpers.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/fsHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,8CAA8C,CAAC;AAEtE,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,WAC0B,CAAC;AAElE,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,MAAM,EAgB7D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,MAWpB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
export const sha256Hex = (value) => crypto.createHash("sha256").update(value, "utf8").digest("hex");
|
|
4
|
+
export const extractPatchFiles = (patchString) => {
|
|
5
|
+
const lines = patchString.replace(/\r\n/g, "\n").split("\n");
|
|
6
|
+
const files = new Set();
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
const match = /^\*\*\* (Update File|Add File|Delete File):\s+(\S.*)$/.exec(line) ??
|
|
9
|
+
/^\*\*\* Move to:\s+(\S.*)$/.exec(line);
|
|
10
|
+
if (!match)
|
|
11
|
+
continue;
|
|
12
|
+
const filePath = (match[2] ?? match[1] ?? "").trim();
|
|
13
|
+
if (filePath)
|
|
14
|
+
files.add(filePath);
|
|
15
|
+
}
|
|
16
|
+
return [...files];
|
|
17
|
+
};
|
|
18
|
+
export const nodeFs = {
|
|
19
|
+
readFile: async (absolutePath) => fs.readFile(absolutePath, "utf-8"),
|
|
20
|
+
writeFile: async (absolutePath, content) => fs.writeFile(absolutePath, content ?? "", "utf-8"),
|
|
21
|
+
mkdirp: async (absoluteDir) => {
|
|
22
|
+
await fs.mkdir(absoluteDir, { recursive: true });
|
|
23
|
+
},
|
|
24
|
+
rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),
|
|
25
|
+
stat: async (absolutePath) => fs.stat(absolutePath),
|
|
26
|
+
safeReadDir: async (absoluteDir) => fs.readdir(absoluteDir, { withFileTypes: true }),
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=fsHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fsHelpers.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/fsHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CACzC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAY,EAAE;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GACT,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC;YAClE,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IACpE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CACzC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC;IACpD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACpE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;IACnD,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CACjC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;CACnD,CAAC","sourcesContent":["import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport { CoreFs } from \"../../tools/implementations/workspaceDeps.js\";\r\n\r\nexport const sha256Hex = (value: string) =>\r\n crypto.createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\r\n\r\nexport const extractPatchFiles = (patchString: string): string[] => {\r\n const lines = patchString.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\r\n const files = new Set<string>();\r\n\r\n for (const line of lines) {\r\n const match =\r\n /^\\*\\*\\* (Update File|Add File|Delete File):\\s+(\\S.*)$/.exec(line) ??\r\n /^\\*\\*\\* Move to:\\s+(\\S.*)$/.exec(line);\r\n\r\n if (!match) continue;\r\n\r\n const filePath = (match[2] ?? match[1] ?? \"\").trim();\r\n if (filePath) files.add(filePath);\r\n }\r\n\r\n return [...files];\r\n};\r\n\r\nexport const nodeFs: CoreFs = {\r\n readFile: async (absolutePath) => fs.readFile(absolutePath, \"utf-8\"),\r\n writeFile: async (absolutePath, content) =>\r\n fs.writeFile(absolutePath, content ?? \"\", \"utf-8\"),\r\n mkdirp: async (absoluteDir) => {\r\n await fs.mkdir(absoluteDir, { recursive: true });\r\n },\r\n rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),\r\n stat: async (absolutePath) => fs.stat(absolutePath),\r\n safeReadDir: async (absoluteDir) =>\r\n fs.readdir(absoluteDir, { withFileTypes: true }),\r\n};\r\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function handleApplyPatchFailure(params: {
|
|
2
|
+
toolResult: any;
|
|
3
|
+
applyPatchAutoRetryMax: number;
|
|
4
|
+
applyPatchRetryCount: number;
|
|
5
|
+
keepFullTrace: boolean;
|
|
6
|
+
fullTraceContents: any[];
|
|
7
|
+
modelContents: any[];
|
|
8
|
+
}): {
|
|
9
|
+
applyPatchRetryCount: number;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=patchRetry.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patchRetry.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/patchRetry.helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,GAAG,CAAC;IAChB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,aAAa,EAAE,GAAG,EAAE,CAAC;CACtB,GAAG;IAAE,oBAAoB,EAAE,MAAM,CAAA;CAAE,CA2CnC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function handleApplyPatchFailure(params) {
|
|
2
|
+
let { applyPatchRetryCount, toolResult, applyPatchAutoRetryMax, keepFullTrace, fullTraceContents, modelContents } = params;
|
|
3
|
+
applyPatchRetryCount += 1;
|
|
4
|
+
const error = String(toolResult?.error ?? "unknown error");
|
|
5
|
+
const debugFiles = Array.isArray(toolResult?.debug?.files)
|
|
6
|
+
? toolResult.debug.files
|
|
7
|
+
: [];
|
|
8
|
+
const debugText = debugFiles.length > 0
|
|
9
|
+
? `\n\nFILE SNAPSHOTS (for regenerating the patch):\n${debugFiles
|
|
10
|
+
.slice(0, 3)
|
|
11
|
+
.map((f) => `--- ${String(f.path ?? "")} ---\n${String(f.head ?? "")}\n--- end ---`)
|
|
12
|
+
.join("\n\n")}`
|
|
13
|
+
: "";
|
|
14
|
+
const retryInstruction = {
|
|
15
|
+
role: "user",
|
|
16
|
+
parts: [
|
|
17
|
+
{
|
|
18
|
+
text: `apply_patch failed (attempt ${applyPatchRetryCount}/${applyPatchAutoRetryMax}): ${error}\n` +
|
|
19
|
+
`Regenerate a patch that matches the current file contents. ` +
|
|
20
|
+
`For large rewrites, prefer write_file(path, content) or Delete+Add instead of Update.` +
|
|
21
|
+
debugText,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
if (keepFullTrace)
|
|
26
|
+
fullTraceContents.push(retryInstruction);
|
|
27
|
+
modelContents.push(retryInstruction);
|
|
28
|
+
return { applyPatchRetryCount };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=patchRetry.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patchRetry.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/patchRetry.helper.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,MAOvC;IACC,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,sBAAsB,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE3H,oBAAoB,IAAI,CAAC,CAAC;IAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,IAAI,eAAe,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC;QACxD,CAAC,CAAE,UAAU,CAAC,KAAK,CAAC,KAGf;QACL,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,GAAG,CAAC;QACnB,CAAC,CAAC,qDAAqD,UAAU;aAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,MAAM,CACxC,CAAC,CAAC,IAAI,IAAI,EAAE,CACb,eAAe,CACnB;aACA,IAAI,CAAC,MAAM,CAAC,EAAE;QACnB,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,gBAAgB,GAAG;QACvB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE;YACL;gBACE,IAAI,EACF,+BAA+B,oBAAoB,IAAI,sBAAsB,MAAM,KAAK,IAAI;oBAC5F,6DAA6D;oBAC7D,uFAAuF;oBACvF,SAAS;aACZ;SACF;KACF,CAAC;IAEF,IAAI,aAAa;QAAE,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAErC,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAClC,CAAC","sourcesContent":["export function handleApplyPatchFailure(params: {\n toolResult: any;\n applyPatchAutoRetryMax: number;\n applyPatchRetryCount: number;\n keepFullTrace: boolean;\n fullTraceContents: any[];\n modelContents: any[];\n}): { applyPatchRetryCount: number } {\n let { applyPatchRetryCount, toolResult, applyPatchAutoRetryMax, keepFullTrace, fullTraceContents, modelContents } = params;\n\n applyPatchRetryCount += 1;\n\n const error = String(toolResult?.error ?? \"unknown error\");\n const debugFiles = Array.isArray(toolResult?.debug?.files)\n ? (toolResult.debug.files as Array<{\n path?: string;\n head?: string;\n }>)\n : [];\n\n const debugText =\n debugFiles.length > 0\n ? `\\n\\nFILE SNAPSHOTS (for regenerating the patch):\\n${debugFiles\n .slice(0, 3)\n .map(\n (f) =>\n `--- ${String(f.path ?? \"\")} ---\\n${String(\n f.head ?? \"\",\n )}\\n--- end ---`,\n )\n .join(\"\\n\\n\")}`\n : \"\";\n\n const retryInstruction = {\n role: \"user\",\n parts: [\n {\n text:\n `apply_patch failed (attempt ${applyPatchRetryCount}/${applyPatchAutoRetryMax}): ${error}\\n` +\n `Regenerate a patch that matches the current file contents. ` +\n `For large rewrites, prefer write_file(path, content) or Delete+Add instead of Update.` +\n debugText,\n },\n ],\n };\n\n if (keepFullTrace) fullTraceContents.push(retryInstruction);\n modelContents.push(retryInstruction);\n\n return { applyPatchRetryCount };\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TokenPersistence } from "../toolLoopRunner.js";
|
|
2
|
+
export declare const persistTokensOnce: (tokenPersistence: TokenPersistence | undefined, sawAnyTokenUsage: boolean, totalInputTokens: number, totalOutputTokens: number) => Promise<void>;
|
|
3
|
+
export declare const extractUsageTokenCounts: (rawResponse: unknown) => {
|
|
4
|
+
inputTokens: number;
|
|
5
|
+
outputTokens: number;
|
|
6
|
+
} | null;
|
|
7
|
+
//# sourceMappingURL=persistTokens.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistTokens.helpers.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/persistTokens.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,iBAAiB,GAC5B,kBAAkB,gBAAgB,GAAG,SAAS,EAC9C,kBAAkB,OAAO,EACzB,kBAAkB,MAAM,EACxB,mBAAmB,MAAM,kBAe1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,aAAa,OAAO;;;QAY3D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const persistTokensOnce = async (tokenPersistence, sawAnyTokenUsage, totalInputTokens, totalOutputTokens) => {
|
|
2
|
+
if (!tokenPersistence)
|
|
3
|
+
return;
|
|
4
|
+
if (!sawAnyTokenUsage)
|
|
5
|
+
return;
|
|
6
|
+
try {
|
|
7
|
+
await tokenPersistence.repository.persistGenTokens(tokenPersistence.sessionId, totalInputTokens, totalOutputTokens, tokenPersistence.model);
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
console.error("Tool loop: failed to persist gen tokens", err);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export const extractUsageTokenCounts = (rawResponse) => {
|
|
14
|
+
const usage = rawResponse?.usageMetadata;
|
|
15
|
+
const promptTokenCount = usage?.promptTokenCount;
|
|
16
|
+
const candidatesTokenCount = usage?.candidatesTokenCount;
|
|
17
|
+
const inputTokens = Number(promptTokenCount);
|
|
18
|
+
const outputTokens = Number(candidatesTokenCount);
|
|
19
|
+
if (!Number.isFinite(inputTokens) || inputTokens < 0)
|
|
20
|
+
return null;
|
|
21
|
+
if (!Number.isFinite(outputTokens) || outputTokens < 0)
|
|
22
|
+
return null;
|
|
23
|
+
return { inputTokens, outputTokens };
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=persistTokens.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistTokens.helpers.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/persistTokens.helpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,gBAA8C,EAC9C,gBAAyB,EACzB,gBAAwB,EACxB,iBAAyB,EACzB,EAAE;IACF,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAC9B,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9B,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAChD,gBAAgB,CAAC,SAAS,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,CAAC,KAAK,CACvB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,WAAoB,EAAE,EAAE;IAC9D,MAAM,KAAK,GAAI,WAAmB,EAAE,aAAa,CAAC;IAClD,MAAM,gBAAgB,GAAG,KAAK,EAAE,gBAAgB,CAAC;IACjD,MAAM,oBAAoB,GAAG,KAAK,EAAE,oBAAoB,CAAC;IAEzD,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACvC,CAAC,CAAC","sourcesContent":["import { TokenPersistence } from \"../toolLoopRunner.js\";\r\n\r\nexport const persistTokensOnce = async (\r\n tokenPersistence: TokenPersistence | undefined,\r\n sawAnyTokenUsage: boolean,\r\n totalInputTokens: number,\r\n totalOutputTokens: number,\r\n) => {\r\n if (!tokenPersistence) return;\r\n if (!sawAnyTokenUsage) return;\r\n\r\n try {\r\n await tokenPersistence.repository.persistGenTokens(\r\n tokenPersistence.sessionId,\r\n totalInputTokens,\r\n totalOutputTokens,\r\n tokenPersistence.model,\r\n );\r\n } catch (err) {\r\n console.error(\"Tool loop: failed to persist gen tokens\", err);\r\n }\r\n};\r\n\r\nexport const extractUsageTokenCounts = (rawResponse: unknown) => {\r\n const usage = (rawResponse as any)?.usageMetadata;\r\n const promptTokenCount = usage?.promptTokenCount;\r\n const candidatesTokenCount = usage?.candidatesTokenCount;\r\n\r\n const inputTokens = Number(promptTokenCount);\r\n const outputTokens = Number(candidatesTokenCount);\r\n\r\n if (!Number.isFinite(inputTokens) || inputTokens < 0) return null;\r\n if (!Number.isFinite(outputTokens) || outputTokens < 0) return null;\r\n\r\n return { inputTokens, outputTokens };\r\n};\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { PlannerTask } from "
|
|
2
|
+
import { PlannerTask } from "../../../types/plannerTasks.types.js";
|
|
3
3
|
export declare const PlannerTaskSchema: z.ZodObject<{
|
|
4
4
|
description: z.ZodString;
|
|
5
5
|
targets: z.ZodArray<z.ZodString>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plannerTaskParser.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;kBAA6B,CAAC;AAQ7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAEtE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plannerTaskParser.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/plannerTaskParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAE7D,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAkB,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { PlannerTask } from \"../../../types/plannerTasks.types.js\";\n\nexport const PlannerTaskSchema = z.object({\n description: z.string().min(1),\n targets: z.array(z.string().min(1)),\n});\n\nexport const PlannerTasksSchema = z.array(PlannerTaskSchema);\n\nfunction stripCodeFences(input: string) {\n const trimmed = (input ?? \"\").trim();\n const withoutStart = trimmed.replace(/^```(?:json)?\\s*/i, \"\");\n return withoutStart.replace(/```$/i, \"\").trim();\n}\n\nexport function parsePlannerTasksUnknown(value: unknown): PlannerTask[] {\n return PlannerTasksSchema.parse(value) as PlannerTask[];\n}\n\nexport function parsePlannerTasksJson(text: string): PlannerTask[] {\n const cleaned = stripCodeFences(text);\n if (!cleaned) {\n throw new Error(\"Planner tasks parse failed: empty response text.\");\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch (err) {\n throw new Error(\n `Planner tasks parse failed: invalid JSON. First 200 chars: ${cleaned.slice(0, 200)}`,\n );\n }\n\n return parsePlannerTasksUnknown(parsed);\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const normalizeReadFileArgs: (args: Record<string, unknown>, maxLines: number) => {
|
|
2
|
+
effectiveArgs: {
|
|
3
|
+
start_line: number;
|
|
4
|
+
end_line: number;
|
|
5
|
+
};
|
|
6
|
+
start: number;
|
|
7
|
+
end: number;
|
|
8
|
+
wasCapped: boolean;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=readFile.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readFile.helpers.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/readFile.helpers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,MAAM;;;;;;;;CAmCjB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const normalizeReadFileArgs = (args, maxLines) => {
|
|
2
|
+
const requestedStart = args.start_line === undefined || args.start_line === null
|
|
3
|
+
? 1
|
|
4
|
+
: Number(args.start_line);
|
|
5
|
+
const requestedEnd = args.end_line === undefined || args.end_line === null
|
|
6
|
+
? undefined
|
|
7
|
+
: Number(args.end_line);
|
|
8
|
+
const start = Number.isFinite(requestedStart) && requestedStart > 0 ? requestedStart : 1;
|
|
9
|
+
const cap = Math.max(1, Math.floor(maxLines));
|
|
10
|
+
const desiredEnd = requestedEnd === undefined ||
|
|
11
|
+
!Number.isFinite(requestedEnd) ||
|
|
12
|
+
requestedEnd < start
|
|
13
|
+
? start + cap - 1
|
|
14
|
+
: requestedEnd;
|
|
15
|
+
const cappedEnd = Math.min(desiredEnd, start + cap - 1);
|
|
16
|
+
const wasCapped = requestedEnd === undefined ||
|
|
17
|
+
desiredEnd !== requestedEnd ||
|
|
18
|
+
cappedEnd !== desiredEnd;
|
|
19
|
+
return {
|
|
20
|
+
effectiveArgs: { ...args, start_line: start, end_line: cappedEnd },
|
|
21
|
+
start,
|
|
22
|
+
end: cappedEnd,
|
|
23
|
+
wasCapped,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=readFile.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readFile.helpers.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/readFile.helpers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAA6B,EAC7B,QAAgB,EAChB,EAAE;IACF,MAAM,cAAc,GAClB,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;QACvD,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE9B,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,KAAK,GACT,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9C,MAAM,UAAU,GACd,YAAY,KAAK,SAAS;QAC1B,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,YAAY,GAAG,KAAK;QAClB,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC;QACjB,CAAC,CAAC,YAAY,CAAC;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GACb,YAAY,KAAK,SAAS;QAC1B,UAAU,KAAK,YAAY;QAC3B,SAAS,KAAK,UAAU,CAAC;IAE3B,OAAO;QACL,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;QAClE,KAAK;QACL,GAAG,EAAE,SAAS;QACd,SAAS;KACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["export const normalizeReadFileArgs = (\r\n args: Record<string, unknown>,\r\n maxLines: number,\r\n) => {\r\n const requestedStart =\r\n args.start_line === undefined || args.start_line === null\r\n ? 1\r\n : Number(args.start_line);\r\n\r\n const requestedEnd =\r\n args.end_line === undefined || args.end_line === null\r\n ? undefined\r\n : Number(args.end_line);\r\n\r\n const start =\r\n Number.isFinite(requestedStart) && requestedStart > 0 ? requestedStart : 1;\r\n const cap = Math.max(1, Math.floor(maxLines));\r\n\r\n const desiredEnd =\r\n requestedEnd === undefined ||\r\n !Number.isFinite(requestedEnd) ||\r\n requestedEnd < start\r\n ? start + cap - 1\r\n : requestedEnd;\r\n\r\n const cappedEnd = Math.min(desiredEnd, start + cap - 1);\r\n const wasCapped =\r\n requestedEnd === undefined ||\r\n desiredEnd !== requestedEnd ||\r\n cappedEnd !== desiredEnd;\r\n\r\n return {\r\n effectiveArgs: { ...args, start_line: start, end_line: cappedEnd },\r\n start,\r\n end: cappedEnd,\r\n wasCapped,\r\n };\r\n};\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signatures.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/signatures.helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB3E"}
|