genaicode 0.7.0 → 0.8.1

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 (114) hide show
  1. package/dist/cli/cli-params.d.ts +1 -1
  2. package/dist/cli/cli-params.js +1 -1
  3. package/dist/cli/cli-params.js.map +1 -1
  4. package/dist/eval/codegen-summary.test.js +3 -1
  5. package/dist/eval/codegen-summary.test.js.map +1 -1
  6. package/dist/eval/data/current-prompt.d.ts +0 -17
  7. package/dist/eval/data/current-prompt.js +23 -23
  8. package/dist/eval/data/current-prompt.js.map +1 -1
  9. package/dist/eval/prompt-debug.test.js +6 -1
  10. package/dist/eval/prompt-debug.test.js.map +1 -1
  11. package/dist/files/read-files.d.ts +27 -4
  12. package/dist/files/read-files.js +20 -5
  13. package/dist/files/read-files.js.map +1 -1
  14. package/dist/files/read-files.test.js +4 -4
  15. package/dist/files/read-files.test.js.map +1 -1
  16. package/dist/files/source-code-tree.d.ts +11 -6
  17. package/dist/files/source-code-tree.js +45 -2
  18. package/dist/files/source-code-tree.js.map +1 -1
  19. package/dist/main/codegen-types.d.ts +1 -1
  20. package/dist/main/config-lib.js +20 -2
  21. package/dist/main/config-lib.js.map +1 -1
  22. package/dist/main/config.js +4 -28
  23. package/dist/main/config.js.map +1 -1
  24. package/dist/main/interactive/codegen-interactive.test.js +1 -1
  25. package/dist/main/interactive/codegen-interactive.test.js.map +1 -1
  26. package/dist/main/plugin-loader.d.ts +5 -0
  27. package/dist/main/plugin-loader.js +53 -0
  28. package/dist/main/plugin-loader.js.map +1 -1
  29. package/dist/main/ui/frontend/assets/index-QOcNx5ac.js +812 -0
  30. package/dist/main/ui/frontend/index.html +1 -1
  31. package/dist/project-profiles/detection.d.ts +40 -0
  32. package/dist/project-profiles/detection.js +131 -0
  33. package/dist/project-profiles/detection.js.map +1 -0
  34. package/dist/project-profiles/index.d.ts +35 -0
  35. package/dist/project-profiles/index.js +72 -0
  36. package/dist/project-profiles/index.js.map +1 -0
  37. package/dist/project-profiles/profiles/golang.d.ts +65 -0
  38. package/dist/project-profiles/profiles/golang.js +208 -0
  39. package/dist/project-profiles/profiles/golang.js.map +1 -0
  40. package/dist/project-profiles/profiles/java-maven.d.ts +80 -0
  41. package/dist/project-profiles/profiles/java-maven.js +165 -0
  42. package/dist/project-profiles/profiles/java-maven.js.map +1 -0
  43. package/dist/project-profiles/profiles/javascript-npm.d.ts +40 -0
  44. package/dist/project-profiles/profiles/javascript-npm.js +118 -0
  45. package/dist/project-profiles/profiles/javascript-npm.js.map +1 -0
  46. package/dist/project-profiles/profiles/javascript-react.d.ts +46 -0
  47. package/dist/project-profiles/profiles/javascript-react.js +147 -0
  48. package/dist/project-profiles/profiles/javascript-react.js.map +1 -0
  49. package/dist/project-profiles/profiles/python-django.d.ts +58 -0
  50. package/dist/project-profiles/profiles/python-django.js +200 -0
  51. package/dist/project-profiles/profiles/python-django.js.map +1 -0
  52. package/dist/project-profiles/types.d.ts +122 -0
  53. package/dist/project-profiles/types.js +77 -0
  54. package/dist/project-profiles/types.js.map +1 -0
  55. package/dist/prompt/function-defs/set-summaries.js +20 -1
  56. package/dist/prompt/function-defs/set-summaries.js.map +1 -1
  57. package/dist/prompt/prompt-codegen.test.js +5 -4
  58. package/dist/prompt/prompt-codegen.test.js.map +1 -1
  59. package/dist/prompt/prompt-service-ask-question.test.js +2 -0
  60. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
  61. package/dist/prompt/prompt-service.js +13 -106
  62. package/dist/prompt/prompt-service.js.map +1 -1
  63. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js +0 -2
  64. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js.map +1 -1
  65. package/dist/prompt/steps/step-ask-question/handlers/code-generation.d.ts +2 -0
  66. package/dist/prompt/steps/step-ask-question/handlers/code-generation.js +58 -0
  67. package/dist/prompt/steps/step-ask-question/handlers/code-generation.js.map +1 -0
  68. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js +1 -3
  69. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js.map +1 -1
  70. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js +0 -2
  71. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js.map +1 -1
  72. package/dist/prompt/steps/step-ask-question/handlers/default-action.js +0 -2
  73. package/dist/prompt/steps/step-ask-question/handlers/default-action.js.map +1 -1
  74. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js +0 -6
  75. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js.map +1 -1
  76. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js +0 -2
  77. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js.map +1 -1
  78. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js +0 -3
  79. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js.map +1 -1
  80. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js +2 -5
  81. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js.map +1 -1
  82. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js +0 -3
  83. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js.map +1 -1
  84. package/dist/prompt/steps/step-ask-question/step-ask-question-types.d.ts +4 -3
  85. package/dist/prompt/steps/step-ask-question/step-ask-question.d.ts +2 -3
  86. package/dist/prompt/steps/step-ask-question/step-ask-question.js +20 -6
  87. package/dist/prompt/steps/step-ask-question/step-ask-question.js.map +1 -1
  88. package/dist/prompt/steps/step-codegen-planning.js +1 -1
  89. package/dist/prompt/steps/step-codegen-planning.js.map +1 -1
  90. package/dist/prompt/steps/step-codegen-summary.d.ts +7 -0
  91. package/dist/prompt/steps/step-codegen-summary.js +106 -0
  92. package/dist/prompt/steps/step-codegen-summary.js.map +1 -0
  93. package/dist/prompt/steps/step-codegen-summary.test.d.ts +1 -0
  94. package/dist/prompt/steps/step-codegen-summary.test.js +136 -0
  95. package/dist/prompt/steps/step-codegen-summary.test.js.map +1 -0
  96. package/dist/prompt/steps/step-context-optimization.js +159 -71
  97. package/dist/prompt/steps/step-context-optimization.js.map +1 -1
  98. package/dist/prompt/steps/step-context-optimization.test.js +24 -5
  99. package/dist/prompt/steps/step-context-optimization.test.js.map +1 -1
  100. package/dist/prompt/steps/step-ensure-context.d.ts +15 -0
  101. package/dist/prompt/steps/step-ensure-context.js +102 -0
  102. package/dist/prompt/steps/step-ensure-context.js.map +1 -0
  103. package/dist/prompt/steps/step-ensure-context.test.d.ts +1 -0
  104. package/dist/prompt/steps/step-ensure-context.test.js +242 -0
  105. package/dist/prompt/steps/step-ensure-context.test.js.map +1 -0
  106. package/dist/prompt/steps/step-summarization.d.ts +2 -1
  107. package/dist/prompt/steps/step-summarization.js +44 -11
  108. package/dist/prompt/steps/step-summarization.js.map +1 -1
  109. package/dist/prompt/steps/steps-types.d.ts +2 -0
  110. package/dist/prompt/steps/steps-types.js.map +1 -1
  111. package/dist/prompt/systemprompt.test.js +2 -2
  112. package/dist/prompt/systemprompt.test.js.map +1 -1
  113. package/package.json +6 -2
  114. package/dist/main/ui/frontend/assets/index-5e3ykhy6.js +0 -808
@@ -1,8 +1,7 @@
1
1
  import { FunctionCall, GenerateContentFunction, GenerateImageFunction, PromptItem, PromptItemImage } from '../../../ai-service/common.js';
2
2
  import { CodegenOptions } from '../../../main/codegen-types.js';
3
- import { StepResult } from '../steps-types.js';
4
3
  import { PluginActionType } from '../../../main/codegen-types.js';
5
- export type ActionType = 'sendMessage' | 'sendMessageWithImage' | 'requestPermissions' | 'requestFilesContent' | 'removeFilesFromContext' | 'confirmCodeGeneration' | 'cancelCodeGeneration' | 'contextOptimization' | PluginActionType;
4
+ export type ActionType = 'codeGeneration' | 'sendMessage' | 'sendMessageWithImage' | 'requestPermissions' | 'requestFilesContent' | 'removeFilesFromContext' | 'confirmCodeGeneration' | 'cancelCodeGeneration' | 'contextOptimization' | PluginActionType;
6
5
  type AskQuestionArgs = {
7
6
  actionType: ActionType;
8
7
  message: string;
@@ -42,7 +41,8 @@ export interface UserItem {
42
41
  }
43
42
  export interface ActionResult {
44
43
  breakLoop: boolean;
45
- stepResult: StepResult;
44
+ executeCodegen?: boolean;
45
+ stepResult?: FunctionCall[];
46
46
  items: Array<{
47
47
  assistant: AssistantItem;
48
48
  user: UserItem;
@@ -54,6 +54,7 @@ export type ActionHandlerProps = {
54
54
  options: CodegenOptions;
55
55
  generateContentFn: GenerateContentFunction;
56
56
  generateImageFn: GenerateImageFunction;
57
+ waitIfPaused: () => Promise<void>;
57
58
  };
58
59
  export type ActionHandler = (props: ActionHandlerProps) => Promise<ActionResult>;
59
60
  export {};
@@ -1,4 +1,3 @@
1
- import { FunctionDef, GenerateContentFunction, PromptItem, GenerateImageFunction } from '../../../ai-service/common.js';
2
- import { StepResult } from '../steps-types.js';
1
+ import { FunctionDef, GenerateContentFunction, PromptItem, GenerateImageFunction, FunctionCall } from '../../../ai-service/common.js';
3
2
  import { CodegenOptions } from '../../../main/codegen-types.js';
4
- export declare function executeStepAskQuestion(generateContentFn: GenerateContentFunction, generateImageFn: GenerateImageFunction, prompt: PromptItem[], functionDefs: FunctionDef[], temperature: number, options: CodegenOptions): Promise<StepResult>;
3
+ export declare function executeStepAskQuestion(generateContentFn: GenerateContentFunction, generateImageFn: GenerateImageFunction, prompt: PromptItem[], functionDefs: FunctionDef[], waitIfPaused: () => Promise<void>, temperature: number, options: CodegenOptions): Promise<FunctionCall[]>;
@@ -1,4 +1,3 @@
1
- import { StepResult } from '../steps-types.js';
2
1
  import { putAssistantMessage, putSystemMessage, putUserMessage } from '../../../main/common/content-bus.js';
3
2
  import { abortController } from '../../../main/interactive/codegen-worker.js';
4
3
  import { validateAndRecoverSingleResult } from '../step-validate-recover.js';
@@ -12,7 +11,8 @@ import { handleSendMessageWithImage } from './handlers/handle-send-message-with-
12
11
  import { handleConfirmCodeGeneration } from './handlers/confirm-code-generation.js';
13
12
  import { handleCancelCodeGeneration } from './handlers/cancel-code-generation.js';
14
13
  import { getRegisteredActionHandlers } from '../../../main/plugin-loader.js';
15
- export async function executeStepAskQuestion(generateContentFn, generateImageFn, prompt, functionDefs, temperature, options) {
14
+ import { handleCodeGeneration } from './handlers/code-generation.js';
15
+ export async function executeStepAskQuestion(generateContentFn, generateImageFn, prompt, functionDefs, waitIfPaused, temperature, options) {
16
16
  console.log('Allowing the assistant to ask a question...');
17
17
  while (!abortController?.signal.aborted) {
18
18
  try {
@@ -27,18 +27,31 @@ export async function executeStepAskQuestion(generateContentFn, generateImageFn,
27
27
  const actionType = askQuestionCall.args?.actionType;
28
28
  if (actionType) {
29
29
  const actionHandler = getActionHandler(actionType);
30
- const result = await actionHandler({
30
+ let result = await actionHandler({
31
31
  askQuestionCall,
32
32
  prompt,
33
33
  options,
34
34
  generateContentFn,
35
35
  generateImageFn,
36
+ waitIfPaused,
36
37
  });
37
38
  // This is important to display the content to the user interface (ui or interactive cli)
38
39
  putUserMessage(result.items.slice(-1)[0].user.text);
39
40
  prompt.push(...result.items.map(({ assistant, user }) => [assistant, user]).flat());
41
+ if (result.executeCodegen) {
42
+ result = await getActionHandler('codeGeneration')({
43
+ askQuestionCall,
44
+ prompt,
45
+ options,
46
+ generateContentFn,
47
+ generateImageFn,
48
+ waitIfPaused,
49
+ });
50
+ putUserMessage(result.items.slice(-1)[0].user.text);
51
+ prompt.push(...result.items.map(({ assistant, user }) => [assistant, user]).flat());
52
+ }
40
53
  if (result.breakLoop) {
41
- return result.stepResult;
54
+ return result.stepResult ?? [];
42
55
  }
43
56
  console.log('The question was answered');
44
57
  }
@@ -50,11 +63,11 @@ export async function executeStepAskQuestion(generateContentFn, generateImageFn,
50
63
  catch (error) {
51
64
  console.error('Error in executeStepAskQuestion:', error);
52
65
  putSystemMessage(`An error occurred: ${error instanceof Error ? error.message : String(error)}`);
53
- return StepResult.BREAK;
66
+ return [];
54
67
  }
55
68
  }
56
69
  putSystemMessage('Assistant did not ask a question. This unexpected, we need to abort.');
57
- return StepResult.BREAK;
70
+ return [];
58
71
  }
59
72
  async function getAskQuestionCall(generateContentFn, prompt, functionDefs, temperature, options) {
60
73
  const askQuestionRequest = [prompt, functionDefs, 'askQuestion', temperature, true, options];
@@ -70,6 +83,7 @@ function getActionHandler(actionType) {
70
83
  }
71
84
  // If no plugin handler is found, use the built-in handlers
72
85
  const handlers = {
86
+ codeGeneration: handleCodeGeneration,
73
87
  cancelCodeGeneration: handleCancelCodeGeneration,
74
88
  confirmCodeGeneration: handleConfirmCodeGeneration,
75
89
  requestFilesContent: handleRequestFilesContent,
@@ -1 +1 @@
1
- {"version":3,"file":"step-ask-question.js","sourceRoot":"","sources":["../../../../src/prompt/steps/step-ask-question/step-ask-question.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step-ask-question.js","sourceRoot":"","sources":["../../../../src/prompt/steps/step-ask-question/step-ask-question.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@ export async function executeStepCodegenPlanning(generateContentFn, prompt, opti
45
45
  planningResult = await validateAndRecoverSingleResult(planningRequest, planningResult, generateContentFn);
46
46
  const codegenPlanningRequest = planningResult.find((call) => call.name === 'codegenPlanning');
47
47
  if (codegenPlanningRequest) {
48
- putSystemMessage('Planning phase completed successfully', codegenPlanningRequest.args);
48
+ putSystemMessage('Planning phase completed successfully', codegenPlanningRequest);
49
49
  // Store the planning response in conversation history
50
50
  prompt.push({ type: 'assistant', functionCalls: planningResult });
51
51
  prompt.push({
@@ -1 +1 @@
1
- {"version":3,"file":"step-codegen-planning.js","sourceRoot":"","sources":["../../../src/prompt/steps/step-codegen-planning.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;qFAcsD,CAAC;AAEtF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,iBAA0C,EAC1C,MAAoB,EACpB,OAAuB;IAEvB,gBAAgB,CAAC,oCAAoC,CAAC,CAAC;IAEvD,8CAA8C;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,GAAG,eAAe,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,eAAe,GAA2E;QAC9F,MAAM;QACN,eAAe,EAAE;QACjB,iBAAiB;QACjB,OAAO,CAAC,WAAW,IAAI,GAAG;QAC1B,OAAO,CAAC,KAAK,IAAI,IAAI;QACrB,OAAO;KACR,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,cAAc,GAAG,MAAM,iBAAiB,CAAC,GAAG,eAAe,CAAC,CAAC;QACjE,cAAc,GAAG,MAAM,8BAA8B,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAE1G,MAAM,sBAAsB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;QAE9F,IAAI,sBAAsB,EAAE,CAAC;YAC3B,gBAAgB,CAAC,uCAAuC,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAEvF,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxF,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,yCAAyC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,CAAC,+BAA+B,GAAI,KAAe,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"step-codegen-planning.js","sourceRoot":"","sources":["../../../src/prompt/steps/step-codegen-planning.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;qFAcsD,CAAC;AAEtF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,iBAA0C,EAC1C,MAAoB,EACpB,OAAuB;IAEvB,gBAAgB,CAAC,oCAAoC,CAAC,CAAC;IAEvD,8CAA8C;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,GAAG,eAAe,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,eAAe,GAA2E;QAC9F,MAAM;QACN,eAAe,EAAE;QACjB,iBAAiB;QACjB,OAAO,CAAC,WAAW,IAAI,GAAG;QAC1B,OAAO,CAAC,KAAK,IAAI,IAAI;QACrB,OAAO;KACR,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,cAAc,GAAG,MAAM,iBAAiB,CAAC,GAAG,eAAe,CAAC,CAAC;QACjE,cAAc,GAAG,MAAM,8BAA8B,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAE1G,MAAM,sBAAsB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;QAE9F,IAAI,sBAAsB,EAAE,CAAC;YAC3B,gBAAgB,CAAC,uCAAuC,EAAE,sBAAsB,CAAC,CAAC;YAElF,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxF,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,yCAAyC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,CAAC,+BAA+B,GAAI,KAAe,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FunctionCall, FunctionDef, GenerateContentFunction, GenerateImageFunction, PromptItem } from '../../ai-service/common.js';
2
+ import { CodegenOptions } from '../../main/codegen-types.js';
3
+ /**
4
+ * Executes the codegen summary step.
5
+ * This step generates a summary of the planned code changes and processes each file update.
6
+ */
7
+ export declare function executeStepCodegenSummary(generateContentFn: GenerateContentFunction, prompt: PromptItem[], functionDefs: FunctionDef[], options: CodegenOptions, waitIfPaused?: () => Promise<void>, generateImageFn?: GenerateImageFunction): Promise<FunctionCall[]>;
@@ -0,0 +1,106 @@
1
+ import assert from 'node:assert';
2
+ import fs from 'fs';
3
+ import mime from 'mime-types';
4
+ import { validateAndRecoverSingleResult } from './step-validate-recover.js';
5
+ import { putSystemMessage } from '../../main/common/content-bus.js';
6
+ import { executeStepGenerateImage } from './step-generate-image.js';
7
+ import { executeStepVerifyPatch } from './step-verify-patch.js';
8
+ import { getPartialPromptTemplate } from '../static-prompts.js';
9
+ import { executeStepEnsureContext } from './step-ensure-context.js';
10
+ import { StepResult } from './steps-types.js';
11
+ /**
12
+ * Executes the codegen summary step.
13
+ * This step generates a summary of the planned code changes and processes each file update.
14
+ */
15
+ export async function executeStepCodegenSummary(generateContentFn, prompt, functionDefs, options, waitIfPaused = () => Promise.resolve(), generateImageFn) {
16
+ const baseRequest = [
17
+ prompt,
18
+ functionDefs,
19
+ 'codegenSummary',
20
+ options.temperature ?? 0.7,
21
+ options.cheap ?? false,
22
+ options,
23
+ ];
24
+ let baseResult = await generateContentFn(...baseRequest);
25
+ let codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
26
+ if (codegenSummaryRequest) {
27
+ // Second stage: for each file request the actual code updates
28
+ baseResult = await validateAndRecoverSingleResult(baseRequest, baseResult, generateContentFn);
29
+ codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
30
+ putSystemMessage('Received codegen summary, will collect partial updates', codegenSummaryRequest);
31
+ // Sometimes the result happens to be a string
32
+ assert(Array.isArray(codegenSummaryRequest?.args?.fileUpdates), 'fileUpdates is not an array');
33
+ assert(Array.isArray(codegenSummaryRequest?.args.contextPaths), 'contextPaths is not an array');
34
+ // Ensure all necessary files are in context
35
+ const contextResult = await executeStepEnsureContext(prompt, codegenSummaryRequest, options);
36
+ if (contextResult === StepResult.BREAK) {
37
+ return baseResult;
38
+ }
39
+ // Store the first stage response entirely in conversation history
40
+ prompt.push({ type: 'assistant', functionCalls: baseResult });
41
+ prompt.push({
42
+ type: 'user',
43
+ functionResponses: baseResult.map((call) => ({ name: call.name, call_id: call.id })),
44
+ cache: true,
45
+ });
46
+ const result = [];
47
+ for (const file of codegenSummaryRequest.args.fileUpdates) {
48
+ putSystemMessage('Collecting partial update for: ' + file.filePath + ' using tool: ' + file.updateToolName, file);
49
+ // Check if execution is paused before proceeding
50
+ await waitIfPaused();
51
+ // this is needed, otherwise we will get an error
52
+ if (prompt.slice(-1)[0].type === 'user') {
53
+ prompt.slice(-1)[0].text = file.prompt ?? getPartialPromptTemplate(file.filePath);
54
+ }
55
+ else {
56
+ prompt.push({ type: 'user', text: file.prompt ?? getPartialPromptTemplate(file.filePath) });
57
+ }
58
+ if (options.vision && file.contextImageAssets) {
59
+ prompt.slice(-1)[0].images = file.contextImageAssets.map((path) => ({
60
+ path,
61
+ base64url: fs.readFileSync(path, 'base64'),
62
+ mediaType: mime.lookup(path) || '',
63
+ }));
64
+ }
65
+ const partialRequest = [
66
+ prompt,
67
+ functionDefs,
68
+ file.updateToolName,
69
+ file.temperature ?? options.temperature,
70
+ file.cheap === true,
71
+ options,
72
+ ];
73
+ let partialResult = await generateContentFn(...partialRequest);
74
+ // Validate if function call is compliant with the schema
75
+ partialResult = await validateAndRecoverSingleResult(partialRequest, partialResult, generateContentFn);
76
+ putSystemMessage('Received partial update', partialResult);
77
+ // Handle image generation requests
78
+ const generateImageCall = partialResult.find((call) => call.name === 'generateImage');
79
+ if (generateImageCall && generateImageFn) {
80
+ partialResult.push(await executeStepGenerateImage(generateImageFn, generateImageCall));
81
+ }
82
+ else if (generateImageCall) {
83
+ console.warn('Image generation requested but generateImageFn not provided');
84
+ }
85
+ // Verify if patchFile is one of the functions called, and test if patch is valid and can be applied successfully
86
+ const patchFileCall = partialResult.find((call) => call.name === 'patchFile');
87
+ if (patchFileCall) {
88
+ partialResult = await executeStepVerifyPatch(patchFileCall.args, generateContentFn, prompt, functionDefs, file.temperature ?? options.temperature, file.cheap === true, options);
89
+ }
90
+ // add the code gen result to the context, as the subsequent code gen may depend on the result
91
+ prompt.push({ type: 'assistant', functionCalls: partialResult }, {
92
+ type: 'user',
93
+ text: 'Update applied.',
94
+ functionResponses: partialResult.map((call) => ({ name: call.name, call_id: call.id })),
95
+ });
96
+ result.push(...partialResult);
97
+ }
98
+ return result;
99
+ }
100
+ else {
101
+ // This is unexpected, if happens probably means no code updates.
102
+ putSystemMessage('Did not receive codegen summary, returning result.');
103
+ return baseResult;
104
+ }
105
+ }
106
+ //# sourceMappingURL=step-codegen-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-codegen-summary.js","sourceRoot":"","sources":["../../../src/prompt/steps/step-codegen-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,136 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { executeStepCodegenSummary } from './step-codegen-summary.js';
3
+ import { getSourceCode } from '../../files/read-files.js';
4
+ vi.mock('../../files/find-files.js', () => ({
5
+ refreshFiles: vi.fn(),
6
+ }));
7
+ vi.mock('../../files/read-files.js', () => ({
8
+ getSourceCode: vi.fn(),
9
+ }));
10
+ vi.mock('../../main/config.js', () => ({
11
+ rootDir: '/test',
12
+ rcConfig: {
13
+ rootDir: '/test',
14
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
15
+ },
16
+ importantContext: {},
17
+ }));
18
+ describe('executeStepCodegenSummary', () => {
19
+ const mockGenerateContentFn = vi.fn();
20
+ const mockWaitIfPaused = vi.fn();
21
+ // Mock data
22
+ const mockPrompt = [{ type: 'user', text: 'test prompt' }];
23
+ const mockFunctionDefs = [
24
+ {
25
+ name: 'codegenSummary',
26
+ description: 'Function for generating codegen summary',
27
+ parameters: {
28
+ type: 'object',
29
+ properties: {
30
+ explanation: { type: 'string', description: 'Explanation of changes' },
31
+ fileUpdates: { type: 'array', description: 'List of file updates' },
32
+ contextPaths: { type: 'array', description: 'List of context paths' },
33
+ },
34
+ required: ['explanation', 'fileUpdates', 'contextPaths'],
35
+ },
36
+ },
37
+ ];
38
+ const mockOptions = {
39
+ aiService: 'vertex-ai',
40
+ temperature: 0.7,
41
+ askQuestion: false,
42
+ };
43
+ beforeEach(() => {
44
+ vi.clearAllMocks();
45
+ mockWaitIfPaused.mockResolvedValue(undefined);
46
+ vi.mocked(getSourceCode).mockReturnValue({});
47
+ });
48
+ it('should handle successful codegen summary generation', async () => {
49
+ const mockCodegenSummary = {
50
+ name: 'codegenSummary',
51
+ args: {
52
+ explanation: 'Test explanation',
53
+ fileUpdates: [
54
+ {
55
+ filePath: '/test/path.ts',
56
+ updateToolName: 'updateFile',
57
+ prompt: 'Update test file',
58
+ },
59
+ ],
60
+ contextPaths: ['/test/context.ts'],
61
+ },
62
+ };
63
+ const mockUpdateResult = {
64
+ name: 'updateFile',
65
+ args: {
66
+ filePath: '/test/path.ts',
67
+ newContent: 'updated content',
68
+ explanation: 'Updated file',
69
+ },
70
+ };
71
+ mockGenerateContentFn.mockResolvedValueOnce([mockCodegenSummary]).mockResolvedValueOnce([mockUpdateResult]);
72
+ const result = await executeStepCodegenSummary(mockGenerateContentFn, mockPrompt, mockFunctionDefs, mockOptions, mockWaitIfPaused);
73
+ expect(result).toHaveLength(1);
74
+ expect(result[0]).toEqual(mockUpdateResult);
75
+ expect(mockGenerateContentFn).toHaveBeenCalledTimes(2);
76
+ });
77
+ it('should handle validation and recovery of invalid codegen summary', async () => {
78
+ const invalidCodegenSummary = {
79
+ name: 'codegenSummary',
80
+ args: {
81
+ // Missing required fields
82
+ },
83
+ };
84
+ const validCodegenSummary = {
85
+ name: 'codegenSummary',
86
+ args: {
87
+ explanation: 'Recovered explanation',
88
+ fileUpdates: [],
89
+ contextPaths: [],
90
+ },
91
+ };
92
+ mockGenerateContentFn.mockResolvedValueOnce([invalidCodegenSummary]).mockResolvedValueOnce([validCodegenSummary]);
93
+ const result = await executeStepCodegenSummary(mockGenerateContentFn, mockPrompt, mockFunctionDefs, mockOptions, mockWaitIfPaused);
94
+ expect(result).toHaveLength(0);
95
+ expect(mockGenerateContentFn).toHaveBeenCalledTimes(2);
96
+ });
97
+ it('should handle errors in generate content function', async () => {
98
+ mockGenerateContentFn.mockRejectedValueOnce(new Error('Test error'));
99
+ await expect(executeStepCodegenSummary(mockGenerateContentFn, mockPrompt, mockFunctionDefs, mockOptions, mockWaitIfPaused)).rejects.toThrow('Test error');
100
+ });
101
+ it('should handle no codegen summary in response', async () => {
102
+ mockGenerateContentFn.mockResolvedValueOnce([
103
+ {
104
+ name: 'explanation',
105
+ args: { text: 'No changes needed' },
106
+ },
107
+ ]);
108
+ const result = await executeStepCodegenSummary(mockGenerateContentFn, mockPrompt, mockFunctionDefs, mockOptions, mockWaitIfPaused);
109
+ expect(result).toHaveLength(1);
110
+ expect(result[0].name).toBe('explanation');
111
+ });
112
+ it('should respect waitIfPaused during file updates', async () => {
113
+ const mockCodegenSummary = {
114
+ name: 'codegenSummary',
115
+ args: {
116
+ explanation: 'Test pause handling',
117
+ fileUpdates: [
118
+ { filePath: '/test/file1.ts', updateToolName: 'updateFile', prompt: 'Update 1' },
119
+ { filePath: '/test/file2.ts', updateToolName: 'updateFile', prompt: 'Update 2' },
120
+ ],
121
+ contextPaths: [],
122
+ },
123
+ };
124
+ mockGenerateContentFn
125
+ .mockResolvedValueOnce([mockCodegenSummary])
126
+ .mockResolvedValueOnce([
127
+ { name: 'updateFile', args: { filePath: '/test/file1.ts', newContent: 'test', explanation: 'test' } },
128
+ ])
129
+ .mockResolvedValueOnce([
130
+ { name: 'updateFile', args: { filePath: '/test/file2.ts', newContent: 'test', explanation: 'test' } },
131
+ ]);
132
+ await executeStepCodegenSummary(mockGenerateContentFn, mockPrompt, mockFunctionDefs, mockOptions, mockWaitIfPaused);
133
+ expect(mockWaitIfPaused).toHaveBeenCalledTimes(2);
134
+ });
135
+ });
136
+ //# sourceMappingURL=step-codegen-summary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-codegen-summary.test.js","sourceRoot":"","sources":["../../../src/prompt/steps/step-codegen-summary.test.ts"],"names":[],"mappings":"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"}