@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.
Files changed (151) hide show
  1. package/dist/ai/generate/gemini.client.js +1 -1
  2. package/dist/ai/generate/gemini.client.js.map +1 -1
  3. package/dist/ai/generate/generateClient.d.ts.map +1 -1
  4. package/dist/ai/generate/generateClient.js +7 -3
  5. package/dist/ai/generate/generateClient.js.map +1 -1
  6. package/dist/ai/prompts/codegen.prompt.js +1 -1
  7. package/dist/ai/prompts/codegen.prompt.js.map +1 -1
  8. package/dist/ai/prompts/helpers/promptParts.helper.d.ts +1 -1
  9. package/dist/ai/prompts/helpers/promptParts.helper.d.ts.map +1 -1
  10. package/dist/ai/prompts/helpers/promptParts.helper.js +1 -1
  11. package/dist/ai/prompts/helpers/promptParts.helper.js.map +1 -1
  12. package/dist/ai/prompts/planner.prompt.d.ts.map +1 -1
  13. package/dist/ai/prompts/planner.prompt.js +1 -0
  14. package/dist/ai/prompts/planner.prompt.js.map +1 -1
  15. package/dist/ai/toolLoop/helpers/aiCall.helper.d.ts +16 -0
  16. package/dist/ai/toolLoop/helpers/aiCall.helper.d.ts.map +1 -0
  17. package/dist/ai/toolLoop/helpers/aiCall.helper.js +23 -0
  18. package/dist/ai/toolLoop/helpers/aiCall.helper.js.map +1 -0
  19. package/dist/ai/toolLoop/helpers/applyPatch.helper.d.ts +6 -0
  20. package/dist/ai/toolLoop/helpers/applyPatch.helper.d.ts.map +1 -0
  21. package/dist/ai/toolLoop/helpers/applyPatch.helper.js +10 -0
  22. package/dist/ai/toolLoop/helpers/applyPatch.helper.js.map +1 -0
  23. package/dist/ai/toolLoop/helpers/errors.helper.d.ts +15 -0
  24. package/dist/ai/toolLoop/helpers/errors.helper.d.ts.map +1 -0
  25. package/dist/ai/toolLoop/helpers/errors.helper.js +50 -0
  26. package/dist/ai/toolLoop/helpers/errors.helper.js.map +1 -0
  27. package/dist/ai/toolLoop/helpers/fsHelpers.d.ts +5 -0
  28. package/dist/ai/toolLoop/helpers/fsHelpers.d.ts.map +1 -0
  29. package/dist/ai/toolLoop/helpers/fsHelpers.js +28 -0
  30. package/dist/ai/toolLoop/helpers/fsHelpers.js.map +1 -0
  31. package/dist/ai/toolLoop/helpers/patchRetry.helper.d.ts +11 -0
  32. package/dist/ai/toolLoop/helpers/patchRetry.helper.d.ts.map +1 -0
  33. package/dist/ai/toolLoop/helpers/patchRetry.helper.js +30 -0
  34. package/dist/ai/toolLoop/helpers/patchRetry.helper.js.map +1 -0
  35. package/dist/ai/toolLoop/helpers/persistTokens.helpers.d.ts +7 -0
  36. package/dist/ai/toolLoop/helpers/persistTokens.helpers.d.ts.map +1 -0
  37. package/dist/ai/toolLoop/helpers/persistTokens.helpers.js +25 -0
  38. package/dist/ai/toolLoop/helpers/persistTokens.helpers.js.map +1 -0
  39. package/dist/ai/toolLoop/{plannerTaskParser.d.ts → helpers/plannerTaskParser.d.ts} +1 -1
  40. package/dist/ai/toolLoop/helpers/plannerTaskParser.d.ts.map +1 -0
  41. package/dist/ai/toolLoop/helpers/plannerTaskParser.js.map +1 -0
  42. package/dist/ai/toolLoop/helpers/readFile.helpers.d.ts +10 -0
  43. package/dist/ai/toolLoop/helpers/readFile.helpers.d.ts.map +1 -0
  44. package/dist/ai/toolLoop/helpers/readFile.helpers.js +26 -0
  45. package/dist/ai/toolLoop/helpers/readFile.helpers.js.map +1 -0
  46. package/dist/ai/toolLoop/helpers/signatures.helper.d.ts +2 -0
  47. package/dist/ai/toolLoop/helpers/signatures.helper.d.ts.map +1 -0
  48. package/dist/ai/toolLoop/helpers/signatures.helper.js +23 -0
  49. package/dist/ai/toolLoop/helpers/signatures.helper.js.map +1 -0
  50. package/dist/ai/toolLoop/helpers/toolArgs.helper.d.ts +12 -0
  51. package/dist/ai/toolLoop/helpers/toolArgs.helper.d.ts.map +1 -0
  52. package/dist/ai/toolLoop/helpers/toolArgs.helper.js +40 -0
  53. package/dist/ai/toolLoop/helpers/toolArgs.helper.js.map +1 -0
  54. package/dist/ai/toolLoop/helpers/toolExecution.helper.d.ts +22 -0
  55. package/dist/ai/toolLoop/helpers/toolExecution.helper.d.ts.map +1 -0
  56. package/dist/ai/toolLoop/helpers/toolExecution.helper.js +75 -0
  57. package/dist/ai/toolLoop/helpers/toolExecution.helper.js.map +1 -0
  58. package/dist/ai/toolLoop/helpers/toolHandlers.helper.d.ts +6 -0
  59. package/dist/ai/toolLoop/helpers/toolHandlers.helper.d.ts.map +1 -0
  60. package/dist/ai/toolLoop/helpers/toolHandlers.helper.js +86 -0
  61. package/dist/ai/toolLoop/helpers/toolHandlers.helper.js.map +1 -0
  62. package/dist/ai/toolLoop/toolEventSummary.d.ts +28 -0
  63. package/dist/ai/toolLoop/toolEventSummary.d.ts.map +1 -0
  64. package/dist/ai/toolLoop/toolEventSummary.js +253 -0
  65. package/dist/ai/toolLoop/toolEventSummary.js.map +1 -0
  66. package/dist/ai/toolLoop/toolLoopContext.d.ts +0 -14
  67. package/dist/ai/toolLoop/toolLoopContext.d.ts.map +1 -1
  68. package/dist/ai/toolLoop/toolLoopContext.js +7 -50
  69. package/dist/ai/toolLoop/toolLoopContext.js.map +1 -1
  70. package/dist/ai/toolLoop/toolLoopRunner.d.ts +7 -6
  71. package/dist/ai/toolLoop/toolLoopRunner.d.ts.map +1 -1
  72. package/dist/ai/toolLoop/toolLoopRunner.js +49 -284
  73. package/dist/ai/toolLoop/toolLoopRunner.js.map +1 -1
  74. package/dist/ai/toolLoop/toolStatusMessage.d.ts +6 -0
  75. package/dist/ai/toolLoop/toolStatusMessage.d.ts.map +1 -0
  76. package/dist/ai/toolLoop/toolStatusMessage.js +140 -0
  77. package/dist/ai/toolLoop/toolStatusMessage.js.map +1 -0
  78. package/dist/ai/tools/helpers/applyPatch.helpers.d.ts.map +1 -1
  79. package/dist/ai/tools/helpers/applyPatch.helpers.js +9 -4
  80. package/dist/ai/tools/helpers/applyPatch.helpers.js.map +1 -1
  81. package/dist/ai/tools/helpers/fileSystem.helpers.d.ts.map +1 -1
  82. package/dist/ai/tools/helpers/fileSystem.helpers.js +7 -1
  83. package/dist/ai/tools/helpers/fileSystem.helpers.js.map +1 -1
  84. package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts +13 -0
  85. package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts.map +1 -1
  86. package/dist/ai/tools/helpers/pageConfigJson.helpers.js +51 -21
  87. package/dist/ai/tools/helpers/pageConfigJson.helpers.js.map +1 -1
  88. package/dist/ai/tools/implementations/applyPatch.impl.js +2 -2
  89. package/dist/ai/tools/implementations/applyPatch.impl.js.map +1 -1
  90. package/dist/ai/tools/implementations/createNewRoute.impl.js +1 -1
  91. package/dist/ai/tools/implementations/createNewRoute.impl.js.map +1 -1
  92. package/dist/ai/tools/implementations/deleteElement.impl.d.ts.map +1 -1
  93. package/dist/ai/tools/implementations/deleteElement.impl.js +5 -37
  94. package/dist/ai/tools/implementations/deleteElement.impl.js.map +1 -1
  95. package/dist/ai/tools/implementations/insertElement.impl.d.ts.map +1 -1
  96. package/dist/ai/tools/implementations/insertElement.impl.js +9 -46
  97. package/dist/ai/tools/implementations/insertElement.impl.js.map +1 -1
  98. package/dist/ai/tools/implementations/updateClassName.impl.d.ts.map +1 -1
  99. package/dist/ai/tools/implementations/updateClassName.impl.js +5 -37
  100. package/dist/ai/tools/implementations/updateClassName.impl.js.map +1 -1
  101. package/dist/ai/tools/implementations/updateGlobalStyles.impl.d.ts.map +1 -1
  102. package/dist/ai/tools/implementations/updateGlobalStyles.impl.js +4 -3
  103. package/dist/ai/tools/implementations/updateGlobalStyles.impl.js.map +1 -1
  104. package/dist/ai/tools/implementations/updateProps.impl.d.ts.map +1 -1
  105. package/dist/ai/tools/implementations/updateProps.impl.js +5 -37
  106. package/dist/ai/tools/implementations/updateProps.impl.js.map +1 -1
  107. package/dist/ai/tools/schemas/createNewRoute.schema.d.ts.map +1 -1
  108. package/dist/ai/tools/schemas/createNewRoute.schema.js +1 -1
  109. package/dist/ai/tools/schemas/createNewRoute.schema.js.map +1 -1
  110. package/dist/ai/tools/schemas/deleteElement.schema.d.ts.map +1 -1
  111. package/dist/ai/tools/schemas/deleteElement.schema.js +1 -2
  112. package/dist/ai/tools/schemas/deleteElement.schema.js.map +1 -1
  113. package/dist/ai/tools/schemas/elementProps.schema.d.ts +101 -0
  114. package/dist/ai/tools/schemas/elementProps.schema.d.ts.map +1 -0
  115. package/dist/ai/tools/schemas/elementProps.schema.js +74 -0
  116. package/dist/ai/tools/schemas/elementProps.schema.js.map +1 -0
  117. package/dist/ai/tools/schemas/insertElement.schema.d.ts.map +1 -1
  118. package/dist/ai/tools/schemas/insertElement.schema.js +2 -74
  119. package/dist/ai/tools/schemas/insertElement.schema.js.map +1 -1
  120. package/dist/ai/tools/schemas/updateClassName.schema.d.ts.map +1 -1
  121. package/dist/ai/tools/schemas/updateClassName.schema.js +1 -2
  122. package/dist/ai/tools/schemas/updateClassName.schema.js.map +1 -1
  123. package/dist/ai/tools/schemas/updateProps.schema.d.ts +9 -9
  124. package/dist/ai/tools/schemas/updateProps.schema.d.ts.map +1 -1
  125. package/dist/ai/tools/schemas/updateProps.schema.js +3 -69
  126. package/dist/ai/tools/schemas/updateProps.schema.js.map +1 -1
  127. package/dist/image/unsplash.service.d.ts.map +1 -1
  128. package/dist/image/unsplash.service.js +6 -2
  129. package/dist/image/unsplash.service.js.map +1 -1
  130. package/dist/indexer/projectInfoIndex.d.ts.map +1 -1
  131. package/dist/indexer/projectInfoIndex.js +33 -25
  132. package/dist/indexer/projectInfoIndex.js.map +1 -1
  133. package/dist/types/styleConfig.d.ts.map +1 -1
  134. package/dist/types/styleConfig.js +2 -3
  135. package/dist/types/styleConfig.js.map +1 -1
  136. package/dist/utils/utils.d.ts +3 -0
  137. package/dist/utils/utils.d.ts.map +1 -1
  138. package/dist/utils/utils.js +8 -0
  139. package/dist/utils/utils.js.map +1 -1
  140. package/dist/utils/workspace.d.ts +1 -1
  141. package/dist/utils/workspace.d.ts.map +1 -1
  142. package/dist/utils/workspace.js +6 -11
  143. package/dist/utils/workspace.js.map +1 -1
  144. package/package.json +1 -1
  145. package/dist/ai/toolLoop/plannerTaskParser.d.ts.map +0 -1
  146. package/dist/ai/toolLoop/plannerTaskParser.js.map +0 -1
  147. package/dist/ai/toolLoop/toolLoopRunnerUtils.d.ts +0 -51
  148. package/dist/ai/toolLoop/toolLoopRunnerUtils.d.ts.map +0 -1
  149. package/dist/ai/toolLoop/toolLoopRunnerUtils.js +0 -306
  150. package/dist/ai/toolLoop/toolLoopRunnerUtils.js.map +0 -1
  151. /package/dist/ai/toolLoop/{plannerTaskParser.js → helpers/plannerTaskParser.js} +0 -0
@@ -0,0 +1,23 @@
1
+ export function extractThoughtSignatures(response) {
2
+ try {
3
+ const candidates = Array.isArray(response?.candidates)
4
+ ? response.candidates
5
+ : [];
6
+ const parts = candidates?.[0]?.content?.parts;
7
+ const arr = Array.isArray(parts) ? parts : [];
8
+ const map = new Map();
9
+ for (const p of arr) {
10
+ const fc = p?.functionCall;
11
+ const id = fc?.id;
12
+ const sig = p?.thoughtSignature ?? p?.thought_signature;
13
+ if (typeof id === "string" && typeof sig === "string" && sig) {
14
+ map.set(id, sig);
15
+ }
16
+ }
17
+ return map;
18
+ }
19
+ catch {
20
+ return new Map();
21
+ }
22
+ }
23
+ //# sourceMappingURL=signatures.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/signatures.helper.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,QAAa;IACpD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;YACpD,CAAC,CAAE,QAAQ,CAAC,UAAoB;YAChC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,CAAC,EAAE,gBAAgB,IAAI,CAAC,EAAE,iBAAiB,CAAC;YACxD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,CAAC;gBAC7D,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAkB,CAAC;IACnC,CAAC;AACH,CAAC","sourcesContent":["export function extractThoughtSignatures(response: any): Map<string, string> {\n try {\n const candidates = Array.isArray(response?.candidates)\n ? (response.candidates as any[])\n : [];\n const parts = candidates?.[0]?.content?.parts;\n const arr = Array.isArray(parts) ? (parts as any[]) : [];\n const map = new Map<string, string>();\n for (const p of arr) {\n const fc = p?.functionCall;\n const id = fc?.id;\n const sig = p?.thoughtSignature ?? p?.thought_signature;\n if (typeof id === \"string\" && typeof sig === \"string\" && sig) {\n map.set(id, sig);\n }\n }\n return map;\n } catch {\n return new Map<string, string>();\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare function normalizeToolArgs(name: string, args: Record<string, unknown>, options: {
2
+ readFileDefaultMaxLines: number;
3
+ styleTokenKeySet: Set<string>;
4
+ }): {
5
+ effectiveArgs: Record<string, unknown>;
6
+ readFileMeta: {
7
+ start: number;
8
+ end: number;
9
+ wasCapped: boolean;
10
+ } | null;
11
+ };
12
+ //# sourceMappingURL=toolArgs.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolArgs.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolArgs.helper.ts"],"names":[],"mappings":"AA2BA,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE;IACP,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B,GACA;IACD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,OAAO,CAAC;KACpB,GAAG,IAAI,CAAC;CACV,CAwBA"}
@@ -0,0 +1,40 @@
1
+ import { isPlainObject } from "../../../utils/utils.js";
2
+ import { normalizeReadFileArgs } from "./readFile.helpers.js";
3
+ function normalizeUpdateGlobalStylesArgs(args, styleTokenKeySet) {
4
+ const normalized = {};
5
+ const tokensMaybe = args?.tokens;
6
+ if (isPlainObject(tokensMaybe)) {
7
+ for (const [k, v] of Object.entries(tokensMaybe)) {
8
+ if (styleTokenKeySet.has(k) && typeof v === "string") {
9
+ normalized[k] = v;
10
+ }
11
+ }
12
+ }
13
+ for (const [k, v] of Object.entries(args ?? {})) {
14
+ if (styleTokenKeySet.has(k) && typeof v === "string") {
15
+ normalized[k] = v;
16
+ }
17
+ }
18
+ return normalized;
19
+ }
20
+ export function normalizeToolArgs(name, args, options) {
21
+ if (name === "read_file") {
22
+ const normalized = normalizeReadFileArgs(args, options.readFileDefaultMaxLines);
23
+ return {
24
+ effectiveArgs: normalized.effectiveArgs,
25
+ readFileMeta: {
26
+ start: normalized.start,
27
+ end: normalized.end,
28
+ wasCapped: normalized.wasCapped,
29
+ },
30
+ };
31
+ }
32
+ if (name === "update_global_styles") {
33
+ return {
34
+ effectiveArgs: normalizeUpdateGlobalStylesArgs(args, options.styleTokenKeySet),
35
+ readFileMeta: null,
36
+ };
37
+ }
38
+ return { effectiveArgs: args, readFileMeta: null };
39
+ }
40
+ //# sourceMappingURL=toolArgs.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolArgs.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolArgs.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,SAAS,+BAA+B,CACtC,IAA6B,EAC7B,gBAA6B;IAE7B,MAAM,UAAU,GAA4B,EAAE,CAAC;IAE/C,MAAM,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC;IACjC,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACjD,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACrD,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAChD,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrD,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,IAA6B,EAC7B,OAGC;IASD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,qBAAqB,CACtC,IAAI,EACJ,OAAO,CAAC,uBAAuB,CAChC,CAAC;QACF,OAAO;YACL,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,YAAY,EAAE;gBACZ,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,GAAG,EAAE,UAAU,CAAC,GAAG;gBACnB,SAAS,EAAE,UAAU,CAAC,SAAS;aAChC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;QACpC,OAAO;YACL,aAAa,EAAE,+BAA+B,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC;YAC9E,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC","sourcesContent":["import { isPlainObject } from \"../../../utils/utils.js\";\nimport { normalizeReadFileArgs } from \"./readFile.helpers.js\";\n\nfunction normalizeUpdateGlobalStylesArgs(\n args: Record<string, unknown>,\n styleTokenKeySet: Set<string>\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {};\n\n const tokensMaybe = args?.tokens;\n if (isPlainObject(tokensMaybe)) {\n for (const [k, v] of Object.entries(tokensMaybe)) {\n if (styleTokenKeySet.has(k) && typeof v === \"string\") {\n normalized[k] = v;\n }\n }\n }\n\n for (const [k, v] of Object.entries(args ?? {})) {\n if (styleTokenKeySet.has(k) && typeof v === \"string\") {\n normalized[k] = v;\n }\n }\n\n return normalized;\n}\n\nexport function normalizeToolArgs(\n name: string,\n args: Record<string, unknown>,\n options: {\n readFileDefaultMaxLines: number;\n styleTokenKeySet: Set<string>;\n }\n): {\n effectiveArgs: Record<string, unknown>;\n readFileMeta: {\n start: number;\n end: number;\n wasCapped: boolean;\n } | null;\n} {\n if (name === \"read_file\") {\n const normalized = normalizeReadFileArgs(\n args,\n options.readFileDefaultMaxLines,\n );\n return {\n effectiveArgs: normalized.effectiveArgs,\n readFileMeta: {\n start: normalized.start,\n end: normalized.end,\n wasCapped: normalized.wasCapped,\n },\n };\n }\n\n if (name === \"update_global_styles\") {\n return {\n effectiveArgs: normalizeUpdateGlobalStylesArgs(args, options.styleTokenKeySet),\n readFileMeta: null,\n };\n }\n\n return { effectiveArgs: args, readFileMeta: null };\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { EventType } from "../../../types/events.js";
2
+ export type Logger = (message: string, eventType: EventType, displayedSummary?: boolean) => Promise<void>;
3
+ export declare function executeToolHandler(params: {
4
+ name: string;
5
+ handler: ((args: any) => Promise<any>) | undefined;
6
+ effectiveArgs: Record<string, unknown>;
7
+ styleTokenKeySet: Set<string>;
8
+ step: number;
9
+ logger: Logger;
10
+ }): Promise<unknown>;
11
+ export declare function postProcessToolResult(params: {
12
+ name: string;
13
+ toolResultRaw: unknown;
14
+ effectiveArgs: Record<string, unknown>;
15
+ readFileMeta: {
16
+ start: number;
17
+ end: number;
18
+ wasCapped: boolean;
19
+ } | null;
20
+ readFileDefaultMaxLines?: number;
21
+ }): unknown;
22
+ //# sourceMappingURL=toolExecution.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolExecution.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolExecution.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGlE,MAAM,MAAM,MAAM,GAAG,CACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,gBAAgB,CAAC,EAAE,OAAO,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8CnB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG,OAAO,CAoCV"}
@@ -0,0 +1,75 @@
1
+ import { EVENT_TYPES } from "../../../types/events.js";
2
+ import { serializeError } from "./errors.helper.js";
3
+ export async function executeToolHandler(params) {
4
+ const { name, handler, effectiveArgs, styleTokenKeySet, step, logger } = params;
5
+ if (!handler) {
6
+ return {
7
+ success: false,
8
+ error: `No handler registered for "${name}".`,
9
+ error_detail: {
10
+ name: "MissingToolHandlerError",
11
+ message: `No handler registered for "${name}".`,
12
+ },
13
+ };
14
+ }
15
+ try {
16
+ if (name === "update_global_styles") {
17
+ const flatKeys = Object.keys(effectiveArgs ?? {}).filter((k) => styleTokenKeySet.has(k));
18
+ if (flatKeys.length === 0) {
19
+ return {
20
+ success: false,
21
+ error: "must include at least one token key/value",
22
+ error_detail: {
23
+ name: "InvalidToolArgumentsError",
24
+ message: 'update_global_styles requires at least one token key/value (e.g. { radius: "0.75rem" }).',
25
+ },
26
+ note: "Resend update_global_styles with at least one token key/value, or skip this tool call.",
27
+ };
28
+ }
29
+ }
30
+ return await handler(effectiveArgs);
31
+ }
32
+ catch (err) {
33
+ logger(`AI tool: ${name} failed`, EVENT_TYPES.STEP_ERROR, true);
34
+ console.error("Tool loop: handler threw", err, {
35
+ tool: name,
36
+ step,
37
+ });
38
+ return {
39
+ success: false,
40
+ error: err instanceof Error ? err.message : String(err),
41
+ error_detail: serializeError(err),
42
+ note: "Tool handler threw. Inspect error_detail and retry with corrected args or a different approach.",
43
+ };
44
+ }
45
+ }
46
+ export function postProcessToolResult(params) {
47
+ const { name, toolResultRaw, effectiveArgs, readFileMeta, readFileDefaultMaxLines } = params;
48
+ if (name === "read_file" && readFileMeta) {
49
+ const path = typeof effectiveArgs.path === "string" ? effectiveArgs.path : "";
50
+ const originalJsonPayload = toolResultRaw?.kind === "json"
51
+ ? toolResultRaw?.json
52
+ : undefined;
53
+ if (originalJsonPayload !== undefined) {
54
+ // Token-efficient: return JSON as structured data (no double-stringifying).
55
+ return { path, json: originalJsonPayload };
56
+ }
57
+ const rawContent = typeof toolResultRaw?.content === "string"
58
+ ? String(toolResultRaw.content)
59
+ : typeof toolResultRaw === "string"
60
+ ? toolResultRaw
61
+ : JSON.stringify(toolResultRaw ?? null);
62
+ return {
63
+ path,
64
+ start_line: readFileMeta.start,
65
+ end_line: readFileMeta.end,
66
+ truncated: readFileMeta.wasCapped,
67
+ content: rawContent,
68
+ note: readFileMeta.wasCapped
69
+ ? `Capped to ${readFileDefaultMaxLines} lines. Request more with start_line/end_line.`
70
+ : undefined,
71
+ };
72
+ }
73
+ return toolResultRaw;
74
+ }
75
+ //# sourceMappingURL=toolExecution.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolExecution.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolExecution.helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { EVENT_TYPES, EventType } from \"../../../types/events.js\";\nimport { serializeError } from \"./errors.helper.js\";\n\nexport type Logger = (\n message: string,\n eventType: EventType,\n displayedSummary?: boolean,\n) => Promise<void>;\n\nexport async function executeToolHandler(params: {\n name: string;\n handler: ((args: any) => Promise<any>) | undefined;\n effectiveArgs: Record<string, unknown>;\n styleTokenKeySet: Set<string>;\n step: number;\n logger: Logger;\n}): Promise<unknown> {\n const { name, handler, effectiveArgs, styleTokenKeySet, step, logger } = params;\n\n if (!handler) {\n return {\n success: false,\n error: `No handler registered for \"${name}\".`,\n error_detail: {\n name: \"MissingToolHandlerError\",\n message: `No handler registered for \"${name}\".`,\n },\n };\n }\n\n try {\n if (name === \"update_global_styles\") {\n const flatKeys = Object.keys(effectiveArgs ?? {}).filter((k) =>\n styleTokenKeySet.has(k),\n );\n if (flatKeys.length === 0) {\n return {\n success: false,\n error: \"must include at least one token key/value\",\n error_detail: {\n name: \"InvalidToolArgumentsError\",\n message:\n 'update_global_styles requires at least one token key/value (e.g. { radius: \"0.75rem\" }).',\n },\n note: \"Resend update_global_styles with at least one token key/value, or skip this tool call.\",\n };\n }\n }\n return await handler(effectiveArgs);\n } catch (err) {\n logger(`AI tool: ${name} failed`, EVENT_TYPES.STEP_ERROR, true);\n console.error(\"Tool loop: handler threw\", err, {\n tool: name,\n step,\n });\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n error_detail: serializeError(err),\n note: \"Tool handler threw. Inspect error_detail and retry with corrected args or a different approach.\",\n };\n }\n}\n\nexport function postProcessToolResult(params: {\n name: string;\n toolResultRaw: unknown;\n effectiveArgs: Record<string, unknown>;\n readFileMeta: { start: number; end: number; wasCapped: boolean } | null;\n readFileDefaultMaxLines?: number;\n}): unknown {\n const { name, toolResultRaw, effectiveArgs, readFileMeta, readFileDefaultMaxLines } = params;\n\n if (name === \"read_file\" && readFileMeta) {\n const path = typeof effectiveArgs.path === \"string\" ? effectiveArgs.path : \"\";\n\n const originalJsonPayload =\n (toolResultRaw as any)?.kind === \"json\"\n ? (toolResultRaw as any)?.json\n : undefined;\n\n if (originalJsonPayload !== undefined) {\n // Token-efficient: return JSON as structured data (no double-stringifying).\n return { path, json: originalJsonPayload };\n }\n\n const rawContent =\n typeof (toolResultRaw as any)?.content === \"string\"\n ? String((toolResultRaw as any).content)\n : typeof toolResultRaw === \"string\"\n ? toolResultRaw\n : JSON.stringify(toolResultRaw ?? null);\n\n return {\n path,\n start_line: readFileMeta.start,\n end_line: readFileMeta.end,\n truncated: readFileMeta.wasCapped,\n content: rawContent,\n note: readFileMeta.wasCapped\n ? `Capped to ${readFileDefaultMaxLines} lines. Request more with start_line/end_line.`\n : undefined,\n };\n }\n\n return toolResultRaw;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { createWorkspaceToolImpls } from "../../tools/implementations/factories.js";
2
+ export declare function createToolHandlers(params: {
3
+ impls: ReturnType<typeof createWorkspaceToolImpls>;
4
+ workspaceRoot: string;
5
+ }): Record<string, (args: any) => Promise<any>>;
6
+ //# sourceMappingURL=toolHandlers.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolHandlers.helper.d.ts","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolHandlers.helper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAIpF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,KAAK,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CA4F9C"}
@@ -0,0 +1,86 @@
1
+ import { getAvailableRoutes } from "../../tools/helpers/pageConfigJson.helpers.js";
2
+ import { nodeFs } from "./fsHelpers.js";
3
+ import { parsePlannerTasksUnknown } from "./plannerTaskParser.js";
4
+ export function createToolHandlers(params) {
5
+ return {
6
+ read_file: async (args) => {
7
+ const path = String(args.path ?? "");
8
+ const startLine = args.start_line === undefined ? undefined : Number(args.start_line);
9
+ const endLine = args.end_line === undefined ? undefined : Number(args.end_line);
10
+ const content = await params.impls.readFileImpl(path, startLine, endLine);
11
+ return { path, content };
12
+ },
13
+ write_file: (args) => params.impls.writeFileImpl(String(args.path ?? ""), String(args.content ?? "")),
14
+ list_dir: async (args) => {
15
+ const content = await params.impls.listDirImpl(String(args.path ?? ""), Number(args.depth ?? 1));
16
+ return { content };
17
+ },
18
+ search: async (args) => {
19
+ const results = await params.impls.searchImpl(String(args.search_query ?? ""));
20
+ return { results };
21
+ },
22
+ apply_patch: (args) => params.impls.applyPatchImpl(String(args.patch_string ?? "")),
23
+ update_global_styles: async (args) => {
24
+ const result = await params.impls.updateGlobalStylesImpl(args);
25
+ return result;
26
+ },
27
+ create_new_route: async (args) => {
28
+ const parentRoute = String(args.parent_route ?? "");
29
+ const routeName = String(args.route_name ?? "");
30
+ const result = await params.impls.createNewRouteImpl(parentRoute, routeName);
31
+ return result;
32
+ },
33
+ delete_element: async (args) => {
34
+ const route = String(args.route ?? "");
35
+ const element_id = String(args.element_id ?? "");
36
+ const result = await params.impls.deleteElementImpl(route, element_id);
37
+ return result;
38
+ },
39
+ insert_element: async (args) => {
40
+ const result = await params.impls.insertElementImpl(args);
41
+ if (!result.success) {
42
+ const available = await getAvailableRoutes({
43
+ workspaceRoot: params.workspaceRoot,
44
+ fs: nodeFs,
45
+ });
46
+ return {
47
+ success: false,
48
+ 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.`,
49
+ available_routes: available,
50
+ };
51
+ }
52
+ return result;
53
+ },
54
+ update_props: async (args) => {
55
+ const route = String(args.route ?? "");
56
+ const element_id = String(args.element_id ?? "");
57
+ const props = args.props;
58
+ const result = await params.impls.updatePropsImpl({
59
+ route,
60
+ element_id,
61
+ ...props,
62
+ });
63
+ return result;
64
+ },
65
+ update_classname: async (args) => {
66
+ const route = String(args.route ?? "");
67
+ const element_id = String(args.element_id ?? "");
68
+ const class_name = String(args.class_name ?? "");
69
+ const result = await params.impls.updateClassNameImpl(route, element_id, class_name);
70
+ return result;
71
+ },
72
+ get_available_routes: async (args) => {
73
+ const routes = await getAvailableRoutes({ workspaceRoot: params.workspaceRoot, fs: nodeFs });
74
+ return { success: true, routes };
75
+ },
76
+ submit_codegen_done: async (args) => ({
77
+ success: true,
78
+ summary: String(args.summary ?? "").trim(),
79
+ }),
80
+ submit_planner_tasks: async (args) => {
81
+ const tasks = parsePlannerTasksUnknown(args.planner_tasks);
82
+ return { success: true, count: tasks.length };
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=toolHandlers.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolHandlers.helper.js","sourceRoot":"","sources":["../../../../src/ai/toolLoop/helpers/toolHandlers.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAEnF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,UAAU,kBAAkB,CAAC,MAGlC;IACC,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrC,MAAM,SAAS,GACb,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjF,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EACvB,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CACxB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC9D,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;oBACzC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,EAAE,EAAE,MAAM;iBACX,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,0BAA0B,MAAM,CAAC,KAAK,2BAA2B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,qFAAqF;oBACtL,gBAAgB,EAAE,SAAS;iBAC5B,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,KAAK,GAAQ,IAAI,CAAC,KAAK,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;gBAChD,KAAK;gBACL,UAAU;gBACV,GAAG,KAAK;aACT,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,CACnD,KAAK,EACL,UAAU,EACV,UAAU,CACX,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC3C,CAAC;QACF,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { getAvailableRoutes } from \"../../tools/helpers/pageConfigJson.helpers.js\";\nimport { createWorkspaceToolImpls } from \"../../tools/implementations/factories.js\";\nimport { nodeFs } from \"./fsHelpers.js\";\nimport { parsePlannerTasksUnknown } from \"./plannerTaskParser.js\";\n\nexport function createToolHandlers(params: {\n impls: ReturnType<typeof createWorkspaceToolImpls>;\n workspaceRoot: string;\n}): Record<string, (args: any) => Promise<any>> {\n return {\n read_file: async (args) => {\n const path = String(args.path ?? \"\");\n const startLine =\n args.start_line === undefined ? undefined : Number(args.start_line);\n const endLine =\n args.end_line === undefined ? undefined : Number(args.end_line);\n const content = await params.impls.readFileImpl(path, startLine, endLine);\n return { path, content };\n },\n write_file: (args) =>\n params.impls.writeFileImpl(String(args.path ?? \"\"), String(args.content ?? \"\")),\n list_dir: async (args) => {\n const content = await params.impls.listDirImpl(\n String(args.path ?? \"\"),\n Number(args.depth ?? 1),\n );\n return { content };\n },\n search: async (args) => {\n const results = await params.impls.searchImpl(String(args.search_query ?? \"\"));\n return { results };\n },\n apply_patch: (args) =>\n params.impls.applyPatchImpl(String(args.patch_string ?? \"\")),\n update_global_styles: async (args) => {\n const result = await params.impls.updateGlobalStylesImpl(args);\n return result;\n },\n create_new_route: async (args) => {\n const parentRoute = String(args.parent_route ?? \"\");\n const routeName = String(args.route_name ?? \"\");\n const result = await params.impls.createNewRouteImpl(parentRoute, routeName);\n return result;\n },\n delete_element: async (args) => {\n const route = String(args.route ?? \"\");\n const element_id = String(args.element_id ?? \"\");\n const result = await params.impls.deleteElementImpl(route, element_id);\n return result;\n },\n insert_element: async (args) => {\n const result = await params.impls.insertElementImpl(args);\n if (!result.success) {\n const available = await getAvailableRoutes({\n workspaceRoot: params.workspaceRoot,\n fs: nodeFs,\n });\n return {\n success: false,\n 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.`,\n available_routes: available,\n };\n }\n return result;\n },\n update_props: async (args) => {\n const route = String(args.route ?? \"\");\n const element_id = String(args.element_id ?? \"\");\n const props: any = args.props;\n const result = await params.impls.updatePropsImpl({\n route,\n element_id,\n ...props,\n });\n return result;\n },\n update_classname: async (args) => {\n const route = String(args.route ?? \"\");\n const element_id = String(args.element_id ?? \"\");\n const class_name = String(args.class_name ?? \"\");\n const result = await params.impls.updateClassNameImpl(\n route,\n element_id,\n class_name,\n );\n return result;\n },\n get_available_routes: async (args) => {\n const routes = await getAvailableRoutes({ workspaceRoot: params.workspaceRoot, fs: nodeFs });\n return { success: true, routes };\n },\n submit_codegen_done: async (args) => ({\n success: true,\n summary: String(args.summary ?? \"\").trim(),\n }),\n submit_planner_tasks: async (args) => {\n const tasks = parsePlannerTasksUnknown(args.planner_tasks);\n return { success: true, count: tasks.length };\n },\n };\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { ToolEvent } from "./toolLoopContext.js";
2
+ export type ToolEventSummaryInput = {
3
+ name: string;
4
+ effectiveArgs: Record<string, unknown>;
5
+ modelArgs: Record<string, unknown>;
6
+ readFileMeta: {
7
+ start: number;
8
+ end: number;
9
+ wasCapped: boolean;
10
+ } | null;
11
+ toolResult: unknown;
12
+ toolResultRaw: unknown;
13
+ };
14
+ export declare const buildToolEventSummary: (input: ToolEventSummaryInput) => ToolEvent;
15
+ export declare const recordToolEvent: (params: {
16
+ name: string;
17
+ effectiveArgs: Record<string, unknown>;
18
+ modelArgs: Record<string, unknown>;
19
+ readFileMeta: {
20
+ start: number;
21
+ end: number;
22
+ wasCapped: boolean;
23
+ } | null;
24
+ toolEvents: ToolEvent[];
25
+ toolResult: unknown;
26
+ toolResultRaw: unknown;
27
+ }) => void;
28
+ //# sourceMappingURL=toolEventSummary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolEventSummary.d.ts","sourceRoot":"","sources":["../../../src/ai/toolLoop/toolEventSummary.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AA0RF,eAAO,MAAM,qBAAqB,GAChC,OAAO,qBAAqB,KAC3B,SAMF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB,SAQA,CAAC"}
@@ -0,0 +1,253 @@
1
+ import { STYLE_TOKEN_KEYS } from "../../types/styleConfig.js";
2
+ import { getApplyPatchEventMeta } from "./helpers/applyPatch.helper.js";
3
+ const oneLine = (value, maxLen = 140) => {
4
+ let raw = "";
5
+ if (typeof value === "string") {
6
+ raw = value;
7
+ }
8
+ else if (value === undefined) {
9
+ raw = "";
10
+ }
11
+ else if (value === null) {
12
+ raw = "null";
13
+ }
14
+ else {
15
+ raw = JSON.stringify(value);
16
+ }
17
+ const collapsed = raw.replace(/\s+/g, " ").trim();
18
+ if (collapsed.length <= maxLen)
19
+ return collapsed;
20
+ return `${collapsed.slice(0, Math.max(0, maxLen - 1))}…`;
21
+ };
22
+ const getStringArg = (effectiveArgs, key) => oneLine(effectiveArgs[key] ?? "");
23
+ const summarizeReadFile = (input) => {
24
+ if (input.name !== "read_file")
25
+ return null;
26
+ const path = typeof input.effectiveArgs.path === "string" ? input.effectiveArgs.path : "";
27
+ const start = input.readFileMeta?.start ?? Number(input.effectiveArgs.start_line ?? 1);
28
+ const end = input.readFileMeta?.end ?? Number(input.effectiveArgs.end_line ?? start);
29
+ return {
30
+ name: input.name,
31
+ summary: `read_file ${path}:${start}-${end}${input.readFileMeta?.wasCapped ? " (capped)" : ""}`,
32
+ };
33
+ };
34
+ const summarizeApplyPatch = (input) => {
35
+ if (input.name !== "apply_patch")
36
+ return null;
37
+ const meta = typeof input.modelArgs.patch_string === "object"
38
+ ? input.modelArgs.patch_string
39
+ : null;
40
+ const fallback = getApplyPatchEventMeta(input.effectiveArgs);
41
+ let ok = "done";
42
+ if (input.toolResult?.success === true) {
43
+ ok = "success";
44
+ }
45
+ else if (input.toolResult?.success === false) {
46
+ ok = "failure";
47
+ }
48
+ return {
49
+ name: input.name,
50
+ summary: `apply_patch files=${JSON.stringify(meta?.files ?? fallback.files)} sha256=${String(meta?.sha256 ?? fallback.sha256).slice(0, 12)} chars=${meta?.chars ?? fallback.chars} result=${ok}`,
51
+ };
52
+ };
53
+ const summarizeCreateNewRoute = (input) => {
54
+ if (input.name !== "create_new_route")
55
+ return null;
56
+ const parentRoute = getStringArg(input.effectiveArgs, "parent_route") || "/";
57
+ const routeName = getStringArg(input.effectiveArgs, "route_name");
58
+ const successVal = input.toolResult?.success;
59
+ if (typeof successVal !== "boolean")
60
+ return null;
61
+ const route = oneLine(input.toolResult?.route ?? "");
62
+ const createdFiles = Array.isArray(input.toolResult?.created_files)
63
+ ? input.toolResult.created_files
64
+ : [];
65
+ const filesText = successVal === true ? ` created_files=${createdFiles.length}` : "";
66
+ const routeText = route ? ` route=${route}` : "";
67
+ const errText = successVal === false
68
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
69
+ : "";
70
+ return {
71
+ name: input.name,
72
+ summary: `create_new_route ${successVal ? "success" : "failure"} parent_route=${parentRoute} route_name=${routeName}${routeText}${filesText}${errText}`,
73
+ };
74
+ };
75
+ const summarizeInsertElement = (input) => {
76
+ if (input.name !== "insert_element")
77
+ return null;
78
+ const route = getStringArg(input.effectiveArgs, "route");
79
+ const parentId = getStringArg(input.effectiveArgs, "parent_id");
80
+ const beforeId = getStringArg(input.effectiveArgs, "before_id");
81
+ const successVal = input.toolResult?.success;
82
+ if (typeof successVal !== "boolean")
83
+ return null;
84
+ const insertedId = oneLine(input.toolResult?.inserted_id ?? "");
85
+ const changedVal = input.toolResult?.changed;
86
+ const changedText = typeof changedVal === "boolean" ? ` changed=${changedVal}` : "";
87
+ const beforeText = beforeId ? ` before_id=${beforeId}` : "";
88
+ const insertedText = insertedId ? ` inserted_id=${insertedId}` : "";
89
+ const errText = successVal === false
90
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
91
+ : "";
92
+ return {
93
+ name: input.name,
94
+ summary: `insert_element ${successVal ? "success" : "failure"} route=${route} parent_id=${parentId}${beforeText}${insertedText}${changedText}${errText}`,
95
+ };
96
+ };
97
+ const summarizeUpdateClassname = (input) => {
98
+ if (input.name !== "update_classname")
99
+ return null;
100
+ const route = getStringArg(input.effectiveArgs, "route");
101
+ const elementId = getStringArg(input.effectiveArgs, "element_id");
102
+ const className = oneLine(input.effectiveArgs.className ?? "", 160);
103
+ const successVal = input.toolResult?.success;
104
+ if (typeof successVal !== "boolean")
105
+ return null;
106
+ const changedVal = input.toolResult?.changed;
107
+ const changedText = typeof changedVal === "boolean" ? ` changed=${changedVal}` : "";
108
+ const updatedId = oneLine(input.toolResult?.updated_id ?? "");
109
+ const updatedText = updatedId ? ` updated_id=${updatedId}` : "";
110
+ const errText = successVal === false
111
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
112
+ : "";
113
+ return {
114
+ name: input.name,
115
+ summary: `update_classname ${successVal ? "success" : "failure"} route=${route} element_id=${elementId} className="${className}"${updatedText}${changedText}${errText}`,
116
+ };
117
+ };
118
+ const summarizeUpdateProps = (input) => {
119
+ if (input.name !== "update_props")
120
+ return null;
121
+ const route = getStringArg(input.effectiveArgs, "route");
122
+ const elementId = getStringArg(input.effectiveArgs, "element_id");
123
+ const successVal = input.toolResult?.success;
124
+ if (typeof successVal !== "boolean")
125
+ return null;
126
+ const changedVal = input.toolResult?.changed;
127
+ const changedText = typeof changedVal === "boolean" ? ` changed=${changedVal}` : "";
128
+ const updatedId = oneLine(input.toolResult?.updated_id ?? "");
129
+ const updatedText = updatedId ? ` updated_id=${updatedId}` : "";
130
+ const patchKeys = Object.keys(input.effectiveArgs ?? {}).filter((k) => {
131
+ if (k === "route" || k === "element_id")
132
+ return false;
133
+ const v = input.effectiveArgs[k];
134
+ return v !== undefined && v !== null;
135
+ });
136
+ patchKeys.sort((a, b) => a.localeCompare(b));
137
+ const keysText = patchKeys.length > 0
138
+ ? ` keys=${oneLine(patchKeys.join(","), 140)}`
139
+ : "";
140
+ const errText = successVal === false
141
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
142
+ : "";
143
+ return {
144
+ name: input.name,
145
+ summary: `update_props ${successVal ? "success" : "failure"} route=${route} element_id=${elementId}${keysText}${updatedText}${changedText}${errText}`,
146
+ };
147
+ };
148
+ const summarizeUpdateGlobalStyles = (input) => {
149
+ if (input.name !== "update_global_styles")
150
+ return null;
151
+ const tokenKeySet = new Set(STYLE_TOKEN_KEYS);
152
+ const tokenKeys = Object.keys(input.effectiveArgs ?? {}).filter((k) => tokenKeySet.has(k));
153
+ const successVal = input.toolResult?.success;
154
+ if (typeof successVal !== "boolean")
155
+ return null;
156
+ const changedVal = input.toolResult?.changed;
157
+ const changedText = typeof changedVal === "boolean" ? ` changed=${changedVal}` : "";
158
+ const version = input.toolResult?.version;
159
+ const versionText = typeof version === "number" && Number.isFinite(version)
160
+ ? ` version=${version}`
161
+ : "";
162
+ const created = input.toolResult?.created;
163
+ const createdText = typeof created === "boolean" ? ` created=${created}` : "";
164
+ tokenKeys.sort((a, b) => a.localeCompare(b));
165
+ const keysText = tokenKeys.length > 0
166
+ ? ` tokens=${oneLine(tokenKeys.join(","), 160)}`
167
+ : "";
168
+ const errText = successVal === false
169
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
170
+ : "";
171
+ return {
172
+ name: input.name,
173
+ summary: `update_global_styles ${successVal ? "success" : "failure"}${keysText}${versionText}${createdText}${changedText}${errText}`,
174
+ };
175
+ };
176
+ const summarizeSearch = (input) => {
177
+ if (input.name !== "search")
178
+ return null;
179
+ const q = typeof input.effectiveArgs.search_query === "string" ? input.effectiveArgs.search_query.trim() : "";
180
+ const results = Array.isArray(input.toolResultRaw?.results)
181
+ ? input.toolResultRaw.results
182
+ : [];
183
+ return {
184
+ name: input.name,
185
+ summary: `search "${q}" -> ${results.length} results`,
186
+ };
187
+ };
188
+ const summarizeListDir = (input) => {
189
+ if (input.name !== "list_dir")
190
+ return null;
191
+ const p = typeof input.effectiveArgs.path === "string" ? input.effectiveArgs.path : "";
192
+ const d = Number(input.effectiveArgs.depth ?? 1);
193
+ return { name: input.name, summary: `list_dir ${p} depth=${d}` };
194
+ };
195
+ const summarizeCreateFile = (input) => {
196
+ if (input.name !== "create_file")
197
+ return null;
198
+ const p = typeof input.effectiveArgs.path === "string" ? input.effectiveArgs.path : "";
199
+ return { name: input.name, summary: `create_file ${p}` };
200
+ };
201
+ const summarizeDeleteFile = (input) => {
202
+ if (input.name !== "delete_file")
203
+ return null;
204
+ const p = typeof input.effectiveArgs.path === "string" ? input.effectiveArgs.path : "";
205
+ return { name: input.name, summary: `delete_file ${p}` };
206
+ };
207
+ const summarizeGenericSuccessFailure = (input) => {
208
+ const successVal = input.toolResult?.success;
209
+ if (typeof successVal !== "boolean")
210
+ return null;
211
+ const changedVal = input.toolResult?.changed;
212
+ const changedText = typeof changedVal === "boolean" ? ` changed=${changedVal}` : "";
213
+ const errText = successVal === false
214
+ ? ` error=${oneLine(input.toolResult?.error ?? "unknown", 160)}`
215
+ : "";
216
+ return {
217
+ name: input.name,
218
+ summary: `${input.name} ${successVal ? "success" : "failure"}${changedText}${errText}`,
219
+ };
220
+ };
221
+ const SUMMARIZERS = [
222
+ summarizeReadFile,
223
+ summarizeApplyPatch,
224
+ summarizeCreateNewRoute,
225
+ summarizeInsertElement,
226
+ summarizeUpdateClassname,
227
+ summarizeUpdateProps,
228
+ summarizeUpdateGlobalStyles,
229
+ summarizeSearch,
230
+ summarizeListDir,
231
+ summarizeCreateFile,
232
+ summarizeDeleteFile,
233
+ summarizeGenericSuccessFailure,
234
+ ];
235
+ export const buildToolEventSummary = (input) => {
236
+ for (const summarizer of SUMMARIZERS) {
237
+ const evt = summarizer(input);
238
+ if (evt)
239
+ return evt;
240
+ }
241
+ return { name: input.name, summary: `${input.name} called` };
242
+ };
243
+ export const recordToolEvent = (params) => {
244
+ const { toolEvents, name } = params;
245
+ try {
246
+ toolEvents.push(buildToolEventSummary(params));
247
+ }
248
+ catch {
249
+ toolEvents.push({ name, summary: `${name} called` });
250
+ return;
251
+ }
252
+ };
253
+ //# sourceMappingURL=toolEventSummary.js.map