genaicode 0.2.1 → 0.3.0
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/README.md +2 -0
- package/bin/genaicode-dev.js +2 -1
- package/bin/genaicode.cjs +4 -4
- package/dist/ai-service/ai-studio.js +8 -2
- package/dist/ai-service/ai-studio.js.map +1 -1
- package/dist/ai-service/anthropic.js +21 -8
- package/dist/ai-service/anthropic.js.map +1 -1
- package/dist/ai-service/chat-gpt.js +21 -10
- package/dist/ai-service/chat-gpt.js.map +1 -1
- package/dist/ai-service/common.d.ts +9 -5
- package/dist/ai-service/common.js +6 -4
- package/dist/ai-service/common.js.map +1 -1
- package/dist/ai-service/common.test.js +3 -3
- package/dist/ai-service/common.test.js.map +1 -1
- package/dist/ai-service/vertex-ai-claude.js +5 -4
- package/dist/ai-service/vertex-ai-claude.js.map +1 -1
- package/dist/ai-service/vertex-ai.js +11 -2
- package/dist/ai-service/vertex-ai.js.map +1 -1
- package/dist/cli/cli-params.d.ts +2 -0
- package/dist/cli/cli-params.js +14 -2
- package/dist/cli/cli-params.js.map +1 -1
- package/dist/cli/validate-cli-params.js +3 -1
- package/dist/cli/validate-cli-params.js.map +1 -1
- package/dist/files/find-files.d.ts +1 -0
- package/dist/files/find-files.js +7 -2
- package/dist/files/find-files.js.map +1 -1
- package/dist/files/read-files.d.ts +2 -2
- package/dist/files/read-files.js +2 -2
- package/dist/files/read-files.js.map +1 -1
- package/dist/files/read-files.test.js +1 -1
- package/dist/files/read-files.test.js.map +1 -1
- package/dist/main/codegen-types.d.ts +13 -0
- package/dist/main/codegen.d.ts +2 -2
- package/dist/main/codegen.js +86 -52
- package/dist/main/codegen.js.map +1 -1
- package/dist/main/codegen.test.js +7 -4
- package/dist/main/codegen.test.js.map +1 -1
- package/dist/main/common/content-bus-types.d.ts +16 -0
- package/dist/main/common/content-bus-types.js +7 -0
- package/dist/main/common/content-bus-types.js.map +1 -0
- package/dist/main/common/content-bus.d.ts +9 -0
- package/dist/main/common/content-bus.js +25 -0
- package/dist/main/common/content-bus.js.map +1 -0
- package/dist/main/common/cost-collector.d.ts +15 -0
- package/dist/main/common/cost-collector.js +24 -0
- package/dist/main/common/cost-collector.js.map +1 -0
- package/dist/main/common/user-actions.d.ts +7 -0
- package/dist/main/common/user-actions.js +15 -0
- package/dist/main/common/user-actions.js.map +1 -0
- package/dist/main/config-lib.d.ts +19 -0
- package/dist/main/config-lib.js.map +1 -1
- package/dist/main/config.d.ts +2 -1
- package/dist/main/config.js +3 -0
- package/dist/main/config.js.map +1 -1
- package/dist/main/interactive/codegen-interactive.js +8 -2
- package/dist/main/interactive/codegen-interactive.js.map +1 -1
- package/dist/main/interactive/codegen-worker.d.ts +1 -1
- package/dist/main/interactive/codegen-worker.js +5 -2
- package/dist/main/interactive/codegen-worker.js.map +1 -1
- package/dist/main/interactive/task-file.js +9 -2
- package/dist/main/interactive/task-file.js.map +1 -1
- package/dist/main/interactive/user-action-handlers.d.ts +1 -0
- package/dist/main/interactive/user-action-handlers.js +13 -0
- package/dist/main/interactive/user-action-handlers.js.map +1 -0
- package/dist/main/interactive/user-interrupt.js +1 -1
- package/dist/main/interactive/user-interrupt.js.map +1 -1
- package/dist/main/ui/backend/api-utils.d.ts +2 -0
- package/dist/main/ui/backend/api-utils.js +18 -0
- package/dist/main/ui/backend/api-utils.js.map +1 -0
- package/dist/main/ui/backend/api.d.ts +2 -0
- package/dist/main/ui/backend/api.js +186 -0
- package/dist/main/ui/backend/api.js.map +1 -0
- package/dist/main/ui/backend/server.d.ts +2 -0
- package/dist/main/ui/backend/server.js +81 -0
- package/dist/main/ui/backend/server.js.map +1 -0
- package/dist/main/ui/backend/service.d.ts +47 -0
- package/dist/main/ui/backend/service.js +161 -0
- package/dist/main/ui/backend/service.js.map +1 -0
- package/dist/main/ui/codegen-ui.d.ts +2 -0
- package/dist/main/ui/codegen-ui.js +13 -0
- package/dist/main/ui/codegen-ui.js.map +1 -0
- package/dist/main/ui/frontend/assets/index-D9wcaSJU.js +598 -0
- package/dist/main/ui/frontend/assets/index-S_ocA1xG.css +1 -0
- package/dist/main/ui/frontend/assets/logo-BGHkG1-J.png +0 -0
- package/dist/main/ui/frontend/assets/logo-dark-KAsU1C78.png +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-400-normal-oElOGqNf.woff2 +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-ext-400-normal-COIQET2s.woff2 +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-greek-400-normal-DUIT0YPZ.woff2 +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-B18ub5-k.woff +0 -0
- package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-DDIa4im3.woff2 +0 -0
- package/dist/main/ui/frontend/index.html +16 -0
- package/dist/main/ui/user-action-handlers.d.ts +2 -0
- package/dist/main/ui/user-action-handlers.js +9 -0
- package/dist/main/ui/user-action-handlers.js.map +1 -0
- package/dist/prompt/ai-service-fallback.d.ts +3 -0
- package/dist/prompt/ai-service-fallback.js +79 -0
- package/dist/prompt/ai-service-fallback.js.map +1 -0
- package/dist/prompt/function-calling.js +3 -1
- package/dist/prompt/function-calling.js.map +1 -1
- package/dist/prompt/function-defs/ask-question.d.ts +13 -13
- package/dist/prompt/function-defs/ask-question.js +13 -14
- package/dist/prompt/function-defs/ask-question.js.map +1 -1
- package/dist/prompt/function-defs/codegen-summary.d.ts +23 -21
- package/dist/prompt/function-defs/codegen-summary.js +28 -28
- package/dist/prompt/function-defs/codegen-summary.js.map +1 -1
- package/dist/prompt/function-defs/create-file.d.ts +4 -4
- package/dist/prompt/function-defs/create-file.js +4 -4
- package/dist/prompt/function-defs/create-file.js.map +1 -1
- package/dist/prompt/function-defs/delete-file.d.ts +4 -4
- package/dist/prompt/function-defs/delete-file.js +4 -4
- package/dist/prompt/function-defs/delete-file.js.map +1 -1
- package/dist/prompt/function-defs/generate-image.d.ts +4 -4
- package/dist/prompt/function-defs/generate-image.js +4 -4
- package/dist/prompt/function-defs/generate-image.js.map +1 -1
- package/dist/prompt/function-defs/get-source-code.d.ts +1 -1
- package/dist/prompt/function-defs/get-source-code.js +2 -1
- package/dist/prompt/function-defs/get-source-code.js.map +1 -1
- package/dist/prompt/function-defs/move-file.d.ts +4 -4
- package/dist/prompt/function-defs/move-file.js +4 -4
- package/dist/prompt/function-defs/move-file.js.map +1 -1
- package/dist/prompt/function-defs/optimize-context.d.ts +41 -0
- package/dist/prompt/function-defs/optimize-context.js +42 -0
- package/dist/prompt/function-defs/optimize-context.js.map +1 -0
- package/dist/prompt/function-defs/patch-file.d.ts +4 -4
- package/dist/prompt/function-defs/patch-file.js +4 -4
- package/dist/prompt/function-defs/patch-file.js.map +1 -1
- package/dist/prompt/function-defs/update-file.d.ts +4 -4
- package/dist/prompt/function-defs/update-file.js +4 -4
- package/dist/prompt/function-defs/update-file.js.map +1 -1
- package/dist/prompt/limits.d.ts +3 -3
- package/dist/prompt/limits.js +10 -8
- package/dist/prompt/limits.js.map +1 -1
- package/dist/prompt/limits.test.js +6 -6
- package/dist/prompt/limits.test.js.map +1 -1
- package/dist/prompt/prompt-codegen.js +38 -23
- package/dist/prompt/prompt-codegen.js.map +1 -1
- package/dist/prompt/prompt-codegen.test.js +2 -2
- package/dist/prompt/prompt-codegen.test.js.map +1 -1
- package/dist/prompt/prompt-service-ask-question.test.js +12 -5
- package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
- package/dist/prompt/prompt-service.d.ts +3 -9
- package/dist/prompt/prompt-service.js +30 -7
- package/dist/prompt/prompt-service.js.map +1 -1
- package/dist/prompt/prompt-service.test.js +40 -25
- package/dist/prompt/prompt-service.test.js.map +1 -1
- package/dist/prompt/steps/step-ask-question.d.ts +1 -1
- package/dist/prompt/steps/step-ask-question.js +34 -17
- package/dist/prompt/steps/step-ask-question.js.map +1 -1
- package/dist/prompt/steps/step-context-optimization.d.ts +6 -0
- package/dist/prompt/steps/step-context-optimization.js +146 -0
- package/dist/prompt/steps/step-context-optimization.js.map +1 -0
- package/dist/prompt/systemprompt.d.ts +1 -1
- package/dist/prompt/systemprompt.js +82 -32
- package/dist/prompt/systemprompt.js.map +1 -1
- package/dist/prompt/systemprompt.test.js +5 -8
- package/dist/prompt/systemprompt.test.js.map +1 -1
- package/dist/prompt/token-estimator.d.ts +8 -0
- package/dist/prompt/token-estimator.js +31 -0
- package/dist/prompt/token-estimator.js.map +1 -0
- package/package.json +24 -4
- package/dist/main/codegen-interactive-utils.d.ts +0 -8
- package/dist/main/codegen-interactive-utils.js +0 -148
- package/dist/main/codegen-interactive-utils.js.map +0 -1
- package/dist/main/codegen-interactive.d.ts +0 -2
- package/dist/main/codegen-interactive.js +0 -68
- package/dist/main/codegen-interactive.js.map +0 -1
- package/dist/main/interactive/worker-script.d.ts +0 -1
- package/dist/main/interactive/worker-script.js +0 -24
- package/dist/main/interactive/worker-script.js.map +0 -1
- package/dist/main/interactive/worker.d.ts +0 -2
- package/dist/main/interactive/worker.js +0 -55
- package/dist/main/interactive/worker.js.map +0 -1
|
@@ -37,7 +37,7 @@ describe('getCodeGenPrompt', () => {
|
|
|
37
37
|
vi.mocked(cliParams).allowFileDelete = false;
|
|
38
38
|
vi.mocked(cliParams).allowDirectoryCreate = false;
|
|
39
39
|
vi.mocked(cliParams).allowFileMove = false;
|
|
40
|
-
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() =>
|
|
40
|
+
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() => 0); // Return 0 instead of void
|
|
41
41
|
const prompt = getCodeGenPrompt({
|
|
42
42
|
considerAllFiles: true,
|
|
43
43
|
aiService: 'vertex-ai',
|
|
@@ -55,7 +55,7 @@ describe('getCodeGenPrompt', () => {
|
|
|
55
55
|
describe('getLintFixPrompt', () => {
|
|
56
56
|
beforeEach(() => {
|
|
57
57
|
vi.mocked(cliParams).verbosePrompt = false;
|
|
58
|
-
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() =>
|
|
58
|
+
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() => 0); // Return 0 instead of void
|
|
59
59
|
});
|
|
60
60
|
it('should generate a lint fix prompt with provided command, stdout, and stderr', () => {
|
|
61
61
|
const command = 'eslint --fix';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-codegen.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-codegen.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,wBAAwB,CAAC;AAEhC,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CACxB,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;CAC1B,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,mBAAmB,EAAE,KAAK;IAC1B,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,KAAK;IACrB,iBAAiB,EAAE,KAAK;IACxB,eAAe,EAAE,KAAK;IACtB,eAAe,EAAE,KAAK;IACtB,oBAAoB,EAAE,KAAK;IAC3B,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;IACpB,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;CACd,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAEvB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QAChF,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClD,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3C,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"prompt-codegen.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-codegen.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import '../cli/cli-params.js';
|
|
|
7
7
|
import '../files/read-files.js';
|
|
8
8
|
import '../files/find-files.js';
|
|
9
9
|
import { getCodeGenPrompt } from './prompt-codegen.js';
|
|
10
|
+
import { registerUserActionHandlers } from '../main/interactive/user-action-handlers.js';
|
|
10
11
|
vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
|
|
11
12
|
vi.mock('@inquirer/prompts', () => ({
|
|
12
13
|
input: vi.fn(),
|
|
@@ -52,6 +53,7 @@ describe('promptService with askQuestion', () => {
|
|
|
52
53
|
beforeEach(() => {
|
|
53
54
|
vi.resetAllMocks();
|
|
54
55
|
console.log = vi.fn();
|
|
56
|
+
registerUserActionHandlers();
|
|
55
57
|
});
|
|
56
58
|
afterEach(() => {
|
|
57
59
|
vi.clearAllMocks();
|
|
@@ -94,11 +96,16 @@ describe('promptService with askQuestion', () => {
|
|
|
94
96
|
.mockResolvedValueOnce(mockAskQuestionCall2)
|
|
95
97
|
.mockResolvedValueOnce(mockCodegenSummary);
|
|
96
98
|
vi.mocked(prompts.input).mockImplementationOnce(() => CancelablePromise.resolve('Yes'));
|
|
97
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
99
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
100
|
+
aiService: 'vertex-ai',
|
|
101
|
+
disableContextOptimization: true,
|
|
102
|
+
interactive: true,
|
|
103
|
+
askQuestion: true,
|
|
104
|
+
}));
|
|
98
105
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
|
|
99
106
|
expect(prompts.input).toHaveBeenCalledWith({ message: 'Your answer' });
|
|
100
107
|
expect(console.log).toHaveBeenCalledWith('Assistant asks:', expect.any(Object));
|
|
101
|
-
expect(console.log).toHaveBeenCalledWith('
|
|
108
|
+
expect(console.log).toHaveBeenCalledWith('Proceeding with code generation.', undefined);
|
|
102
109
|
});
|
|
103
110
|
it('should stop code generation when askQuestion returns stopCodegen: true', async () => {
|
|
104
111
|
const mockAskQuestionCall = [
|
|
@@ -113,10 +120,10 @@ describe('promptService with askQuestion', () => {
|
|
|
113
120
|
},
|
|
114
121
|
];
|
|
115
122
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockAskQuestionCall);
|
|
116
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ aiService: 'vertex-ai', interactive: true }));
|
|
123
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ aiService: 'vertex-ai', disableContextOptimization: true, interactive: true }));
|
|
117
124
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
|
|
118
125
|
expect(result).toEqual([]);
|
|
119
|
-
expect(console.log).toHaveBeenCalledWith('Assistant requested to stop code generation. Exiting...');
|
|
126
|
+
expect(console.log).toHaveBeenCalledWith('Assistant requested to stop code generation. Exiting...', undefined);
|
|
120
127
|
});
|
|
121
128
|
it('should proceed with code generation when askQuestion returns shouldPrompt: false', async () => {
|
|
122
129
|
const mockAskQuestionCall = [];
|
|
@@ -133,7 +140,7 @@ describe('promptService with askQuestion', () => {
|
|
|
133
140
|
vi.mocked(vertexAi.generateContent)
|
|
134
141
|
.mockResolvedValueOnce(mockAskQuestionCall)
|
|
135
142
|
.mockResolvedValueOnce(mockCodegenSummary);
|
|
136
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ aiService: 'vertex-ai', interactive: true }));
|
|
143
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ aiService: 'vertex-ai', disableContextOptimization: true, interactive: true }));
|
|
137
144
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
138
145
|
expect(prompts.input).not.toHaveBeenCalled();
|
|
139
146
|
expect(console.log).toHaveBeenCalledWith('Assistant did not ask a question. Proceeding with code generation.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-service-ask-question.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-service-ask-question.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAEvD,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-service-ask-question.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-service-ask-question.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import { FunctionCall, GenerateContentFunction } from '../ai-service/common.js';
|
|
1
|
+
import { FunctionCall, GenerateContentFunction, GenerateImageFunction } from '../ai-service/common.js';
|
|
2
2
|
import { AiServiceType, ImagenType } from '../main/codegen-types.js';
|
|
3
|
-
interface GenerateImageFunction {
|
|
4
|
-
(prompt: string, contextImagePath: string | undefined, size: {
|
|
5
|
-
width: number;
|
|
6
|
-
height: number;
|
|
7
|
-
}, cheap: boolean): Promise<string>;
|
|
8
|
-
}
|
|
9
3
|
import { CodegenPrompt } from './prompt-codegen.js';
|
|
10
4
|
/** A function that communicates with model using */
|
|
11
|
-
export declare function promptService(generateContentFns: Record<AiServiceType, GenerateContentFunction>, generateImageFns: Record<ImagenType, GenerateImageFunction>, codegenPrompt: CodegenPrompt): Promise<FunctionCall[]>;
|
|
5
|
+
export declare function promptService(generateContentFns: Record<AiServiceType, GenerateContentFunction>, generateImageFns: Record<ImagenType, GenerateImageFunction>, codegenPrompt: CodegenPrompt, waitIfPaused?: () => Promise<void>): Promise<FunctionCall[]>;
|
|
12
6
|
export type PromptMessages = ReturnType<typeof prepareMessages>;
|
|
13
7
|
/**
|
|
14
8
|
* Function to prepare messages for AI services
|
|
@@ -20,7 +14,7 @@ declare function prepareMessages(codegen: CodegenPrompt): {
|
|
|
20
14
|
requestImageAssets: string;
|
|
21
15
|
prompt: string;
|
|
22
16
|
sourceCode: string;
|
|
23
|
-
contextSourceCode: (paths: string[]) => string;
|
|
17
|
+
contextSourceCode: (paths: string[], pathsOnly?: boolean) => string;
|
|
24
18
|
imageAssets: string;
|
|
25
19
|
partialPromptTemplate(path: string): string;
|
|
26
20
|
invalidFunctionCall: string;
|
|
@@ -9,11 +9,16 @@ import { executeStepAskQuestion } from './steps/step-ask-question.js';
|
|
|
9
9
|
import { validateAndRecoverSingleResult } from './steps/step-validate-recover.js';
|
|
10
10
|
import { executeStepVerifyPatch } from './steps/step-verify-patch.js';
|
|
11
11
|
import { executeStepGenerateImage } from './steps/step-generate-image.js';
|
|
12
|
+
import { executeStepContextOptimization } from './steps/step-context-optimization.js';
|
|
12
13
|
import { StepResult } from './steps/steps-types.js';
|
|
14
|
+
import { putSystemMessage } from '../main/common/content-bus.js';
|
|
15
|
+
import { handleAiServiceFallback } from './ai-service-fallback.js';
|
|
13
16
|
/** A function that communicates with model using */
|
|
14
|
-
export async function promptService(generateContentFns, generateImageFns, codegenPrompt) {
|
|
17
|
+
export async function promptService(generateContentFns, generateImageFns, codegenPrompt, waitIfPaused = () => Promise.resolve()) {
|
|
15
18
|
const messages = prepareMessages(codegenPrompt);
|
|
16
|
-
const generateContentFn = (...args) =>
|
|
19
|
+
const generateContentFn = async (...args) => {
|
|
20
|
+
return await handleAiServiceFallback(generateContentFns, codegenPrompt.options.aiService, codegenPrompt.options, ...args);
|
|
21
|
+
};
|
|
17
22
|
const generateImageFn = (...args) => {
|
|
18
23
|
assert(codegenPrompt.options.imagen, 'imagen value must be provided');
|
|
19
24
|
return generateImageFns[codegenPrompt.options.imagen](...args);
|
|
@@ -36,9 +41,24 @@ export async function promptService(generateContentFns, generateImageFns, codege
|
|
|
36
41
|
prompt.push({ type: 'assistant', text: messages.requestImageAssets, functionCalls: [{ name: 'getImageAssets' }] }, { type: 'user', functionResponses: [{ name: 'getImageAssets', content: messages.imageAssets }] });
|
|
37
42
|
}
|
|
38
43
|
prompt.slice(-1)[0].text = messages.prompt;
|
|
44
|
+
// Add uploaded images to the prompt if available
|
|
45
|
+
if (codegenPrompt.options.images && codegenPrompt.options.images.length > 0 && codegenPrompt.options.vision) {
|
|
46
|
+
prompt.slice(-1)[0].images = codegenPrompt.options.images.map((img) => ({
|
|
47
|
+
base64url: img.base64url,
|
|
48
|
+
mediaType: img.mediaType,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
// Execute the context optimization step
|
|
52
|
+
if (!codegenPrompt.options.disableContextOptimization) {
|
|
53
|
+
const sourceCode = JSON.parse(messages.sourceCode);
|
|
54
|
+
const optimizationResult = await executeStepContextOptimization(generateContentFn, prompt, sourceCode, codegenPrompt.options);
|
|
55
|
+
if (optimizationResult === StepResult.BREAK) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
39
59
|
// Execute the ask question step
|
|
40
60
|
if (codegenPrompt.options.askQuestion !== false &&
|
|
41
|
-
codegenPrompt.options.interactive &&
|
|
61
|
+
(codegenPrompt.options.interactive || codegenPrompt.options.ui) &&
|
|
42
62
|
(await executeStepAskQuestion(generateContentFn, prompt, functionDefs, codegenPrompt.options.temperature ?? 0.7, codegenPrompt.options.cheap ?? false, messages, codegenPrompt.options)) === StepResult.BREAK) {
|
|
43
63
|
return [];
|
|
44
64
|
}
|
|
@@ -57,7 +77,7 @@ export async function promptService(generateContentFns, generateImageFns, codege
|
|
|
57
77
|
let codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
|
|
58
78
|
if (codegenSummaryRequest) {
|
|
59
79
|
// Second stage: for each file request the actual code updates
|
|
60
|
-
|
|
80
|
+
putSystemMessage('Received codegen summary, will collect partial updates', codegenSummaryRequest.args);
|
|
61
81
|
baseResult = await validateAndRecoverSingleResult(baseRequest, baseResult, messages, generateContentFn);
|
|
62
82
|
codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
|
|
63
83
|
// Sometimes the result happens to be a string
|
|
@@ -85,13 +105,15 @@ export async function promptService(generateContentFns, generateImageFns, codege
|
|
|
85
105
|
});
|
|
86
106
|
const result = [];
|
|
87
107
|
for (const file of codegenSummaryRequest.args.fileUpdates) {
|
|
88
|
-
|
|
108
|
+
putSystemMessage('Collecting partial update for: ' + file.path + ' using tool: ' + file.updateToolName, file);
|
|
89
109
|
console.log('- Prompt:', file.prompt);
|
|
90
110
|
console.log('- Temperature', file.temperature);
|
|
91
111
|
console.log('- Cheap', file.cheap);
|
|
92
112
|
if (codegenPrompt.options.vision) {
|
|
93
113
|
console.log('- Context image assets', file.contextImageAssets);
|
|
94
114
|
}
|
|
115
|
+
// Check if execution is paused before proceeding
|
|
116
|
+
await waitIfPaused();
|
|
95
117
|
// this is needed, otherwise we will get an error
|
|
96
118
|
if (prompt.slice(-1)[0].type === 'user') {
|
|
97
119
|
prompt.slice(-1)[0].text = file.prompt ?? messages.partialPromptTemplate(file.path);
|
|
@@ -115,6 +137,7 @@ export async function promptService(generateContentFns, generateImageFns, codege
|
|
|
115
137
|
codegenPrompt.options,
|
|
116
138
|
];
|
|
117
139
|
let partialResult = await generateContentFn(...partialRequest);
|
|
140
|
+
putSystemMessage('Received partial update', partialResult);
|
|
118
141
|
// Validate if function call is compliant with the schema
|
|
119
142
|
partialResult = await validateAndRecoverSingleResult(partialRequest, partialResult, messages, generateContentFn);
|
|
120
143
|
// Handle image generation requests
|
|
@@ -138,7 +161,7 @@ export async function promptService(generateContentFns, generateImageFns, codege
|
|
|
138
161
|
}
|
|
139
162
|
else {
|
|
140
163
|
// This is unexpected, if happens probably means no code updates.
|
|
141
|
-
|
|
164
|
+
putSystemMessage('Did not receive codegen summary, returning result.');
|
|
142
165
|
return baseResult;
|
|
143
166
|
}
|
|
144
167
|
}
|
|
@@ -154,7 +177,7 @@ function prepareMessages(codegen) {
|
|
|
154
177
|
prompt: codegen.prompt +
|
|
155
178
|
'\n Start from generating codegen summary, this summary will be used as a context to generate updates, so make sure that it contains useful information.',
|
|
156
179
|
sourceCode: JSON.stringify(getSourceCode({ taskFile: codegen.options.taskFile }, codegen.options)),
|
|
157
|
-
contextSourceCode: (paths) => JSON.stringify(getSourceCode({ filterPaths: paths, taskFile: codegen.options.taskFile, forceAll: true }, codegen.options)),
|
|
180
|
+
contextSourceCode: (paths, pathsOnly = false) => JSON.stringify(Object.fromEntries(Object.entries(getSourceCode({ filterPaths: paths, taskFile: codegen.options.taskFile, forceAll: true }, codegen.options)).filter(([path]) => !pathsOnly || paths.includes(path)))),
|
|
158
181
|
imageAssets: JSON.stringify(getImageAssets()),
|
|
159
182
|
partialPromptTemplate(path) {
|
|
160
183
|
return `Thank you for providing the summary, now suggest changes for the \`${path}\` file using appropriate tools.`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-service.js","sourceRoot":"","sources":["../../src/prompt/prompt-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-service.js","sourceRoot":"","sources":["../../src/prompt/prompt-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,kBAAkE,EAClE,gBAA2D,EAC3D,aAA4B,EAC5B,eAAoC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;IAE3D,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAEhD,MAAM,iBAAiB,GAA4B,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;QACnE,OAAO,MAAM,uBAAuB,CAClC,kBAAkB,EAClB,aAAa,CAAC,OAAO,CAAC,SAAS,EAC/B,aAAa,CAAC,OAAO,EACrB,GAAG,IAAI,CACR,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,eAAe,GAA0B,CAAC,GAAG,IAAI,EAAE,EAAE;QACzD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QACtE,OAAO,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,8FAA8F;IAC9F,MAAM,oBAAoB,GAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAErE,MAAM,MAAM,GAAiB;QAC3B,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAC9E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAAE;QAClD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC,oBAAoB,CAAC,EAAE;KAC/F,CAAC;IAEF,MAAM,qBAAqB,GAAe;QACxC,IAAI,EAAE,MAAM;QACZ,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5E,KAAK,EAAE,IAAI;KACZ,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAEnC,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACvD,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,EAAE,EACrG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE3C,iDAAiD;IACjD,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtE,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,kBAAkB,GAAG,MAAM,8BAA8B,CAC7D,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,aAAa,CAAC,OAAO,CACtB,CAAC;QAEF,IAAI,kBAAkB,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IACE,aAAa,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK;QAC3C,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,CAAC,MAAM,sBAAsB,CAC3B,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,aAAa,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,EACxC,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,EACpC,QAAQ,EACR,aAAa,CAAC,OAAO,CACtB,CAAC,KAAK,UAAU,CAAC,KAAK,EACvB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;SAAM,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAA2E;QAC1F,MAAM;QACN,YAAY;QACZ,gBAAgB;QAChB,aAAa,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG;QACxC,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK;QACpC,aAAa,CAAC,OAAO;KACtB,CAAC;IACF,IAAI,UAAU,GAAG,MAAM,iBAAiB,CAAC,GAAG,WAAW,CAAC,CAAC;IAEzD,IAAI,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;IAEtF,IAAI,qBAAqB,EAAE,CAAC;QAC1B,8DAA8D;QAC9D,gBAAgB,CAAC,wDAAwD,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAEvG,UAAU,GAAG,MAAM,8BAA8B,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACxG,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAElF,8CAA8C;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAEhG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,wGAAwG;YACxG,oBAAoB,CAAC,IAAI,GAAG;gBAC1B,SAAS,EAAE;oBACT,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBACpF,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY;oBAC1C,GAAG,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;iBAClC;aACF,CAAC;YACF,qBAAqB,CAAC,iBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAE,CAAC,OAAO;gBAC7F,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAqB,CAAC,CAAC;QACjF,CAAC;QAED,kEAAkE;QAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,iBAAiB,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAmB,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,qBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3D,gBAAgB,CAAC,iCAAiC,GAAG,IAAI,CAAC,IAAI,GAAG,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC9G,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACjE,CAAC;YAED,iDAAiD;YACjD,MAAM,YAAY,EAAE,CAAC;YAErB,iDAAiD;YACjD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChG,CAAC;YAED,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;oBAC1E,IAAI;oBACJ,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAC1C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;iBACnC,CAAC,CAAC,CAAC;YACN,CAAC;YAED,MAAM,cAAc,GAA2E;gBAC7F,MAAM;gBACN,YAAY;gBACZ,IAAI,CAAC,cAAc;gBACnB,IAAI,CAAC,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW;gBACrD,IAAI,CAAC,KAAK,KAAK,IAAI;gBACnB,aAAa,CAAC,OAAO;aACtB,CAAC;YACF,IAAI,aAAa,GAAG,MAAM,iBAAiB,CAAC,GAAG,cAAc,CAAC,CAAC;YAE/D,gBAAgB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAE3D,yDAAyD;YACzD,aAAa,GAAG,MAAM,8BAA8B,CAAC,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YAEjH,mCAAmC;YACnC,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;YACtF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,aAAa,CAAC,IAAI,CAAC,MAAM,wBAAwB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;YACzF,CAAC;YAED,iHAAiH;YACjH,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YAC9E,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,GAAG,MAAM,sBAAsB,CAC1C,aAAa,CAAC,IAA2C,EACzD,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,IAAI,CAAC,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,EACrD,IAAI,CAAC,KAAK,KAAK,IAAI,EACnB,QAAQ,EACR,aAAa,CAAC,OAAO,CACtB,CAAC;YACJ,CAAC;YAED,8FAA8F;YAC9F,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EACnD;gBACE,IAAI,EAAE,MAAM;gBACZ,iBAAiB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;aACxF,CACF,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,gBAAgB,CAAC,oDAAoD,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC;AAID;;GAEG;AACH,SAAS,eAAe,CAAC,OAAsB;IAC7C,OAAO;QACL,iBAAiB,EAAE,oDAAoD;QACvE,iBAAiB,EAAE,yCAAyC;QAC5D,kBAAkB,EAAE,sEAAsE;QAC1F,kBAAkB,EAAE,qDAAqD;QACzE,MAAM,EACJ,OAAO,CAAC,MAAM;YACd,yJAAyJ;QAC3J,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClG,iBAAiB,EAAE,CAAC,KAAe,EAAE,YAAqB,KAAK,EAAE,EAAE,CACjE,IAAI,CAAC,SAAS,CACZ,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CACZ,aAAa,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAC3G,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzD,CACF;QACH,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QAC7C,qBAAqB,CAAC,IAAY;YAChC,OAAO,sEAAsE,IAAI,kCAAkC,CAAC;QACtH,CAAC;QACD,mBAAmB,EACjB,+FAA+F;KAClG,CAAC;AACJ,CAAC"}
|
|
@@ -28,7 +28,7 @@ vi.mock('../cli/cli-params.js', () => ({
|
|
|
28
28
|
allowDirectoryCreate: false,
|
|
29
29
|
allowFileMove: false,
|
|
30
30
|
verbosePrompt: false,
|
|
31
|
-
disableContextOptimization:
|
|
31
|
+
disableContextOptimization: true,
|
|
32
32
|
vision: false,
|
|
33
33
|
imagen: false,
|
|
34
34
|
temperature: 0.7,
|
|
@@ -86,7 +86,7 @@ describe('promptService', () => {
|
|
|
86
86
|
{ name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Hello");' } },
|
|
87
87
|
];
|
|
88
88
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
89
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
89
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
90
90
|
expect(result).toEqual(mockFunctionCalls);
|
|
91
91
|
expect(vertexAi.generateContent).toHaveBeenCalled();
|
|
92
92
|
});
|
|
@@ -94,7 +94,7 @@ describe('promptService', () => {
|
|
|
94
94
|
vi.mocked(cliParams).chatGpt = true;
|
|
95
95
|
const mockFunctionCalls = [{ name: 'createFile', args: { filePath: 'new.js', newContent: 'const x = 5;' } }];
|
|
96
96
|
vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
97
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt' }));
|
|
97
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'chat-gpt' }));
|
|
98
98
|
expect(result).toEqual(mockFunctionCalls);
|
|
99
99
|
expect(chatGpt.generateContent).toHaveBeenCalled();
|
|
100
100
|
});
|
|
@@ -102,7 +102,7 @@ describe('promptService', () => {
|
|
|
102
102
|
vi.mocked(cliParams).anthropic = true;
|
|
103
103
|
const mockFunctionCalls = [{ name: 'deleteFile', args: { filePath: 'obsolete.js' } }];
|
|
104
104
|
vi.mocked(anthropic.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
105
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'anthropic' }));
|
|
105
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'anthropic' }));
|
|
106
106
|
expect(result).toEqual(mockFunctionCalls);
|
|
107
107
|
expect(anthropic.generateContent).toHaveBeenCalled();
|
|
108
108
|
});
|
|
@@ -113,7 +113,7 @@ describe('promptService', () => {
|
|
|
113
113
|
{ name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Dry run");' } },
|
|
114
114
|
];
|
|
115
115
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
116
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
116
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
117
117
|
expect(result).toEqual(mockFunctionCalls);
|
|
118
118
|
expect(vertexAi.generateContent).toHaveBeenCalled();
|
|
119
119
|
});
|
|
@@ -123,7 +123,7 @@ describe('promptService', () => {
|
|
|
123
123
|
{
|
|
124
124
|
name: 'codegenSummary',
|
|
125
125
|
args: {
|
|
126
|
-
fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
|
|
126
|
+
fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile', prompt: 'Generate file' }],
|
|
127
127
|
contextPaths: [],
|
|
128
128
|
explanation: 'Mock summary',
|
|
129
129
|
},
|
|
@@ -157,7 +157,7 @@ describe('promptService', () => {
|
|
|
157
157
|
vi.mocked(fs.readFileSync).mockReturnValue('Original content');
|
|
158
158
|
// Mock diff.applyPatch to fail for the invalid patch
|
|
159
159
|
vi.mocked(diff.applyPatch).mockReturnValue(false);
|
|
160
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
160
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
161
161
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
|
|
162
162
|
expect(fs.readFileSync).toHaveBeenCalledWith('test.js', 'utf-8');
|
|
163
163
|
expect(diff.applyPatch).toHaveBeenCalledWith('Original content', 'invalid patch');
|
|
@@ -175,7 +175,7 @@ describe('promptService', () => {
|
|
|
175
175
|
];
|
|
176
176
|
vi.mocked(getImageAssets).mockReturnValue(mockImageAssets);
|
|
177
177
|
vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
178
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt', vision: true }));
|
|
178
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'chat-gpt', vision: true }));
|
|
179
179
|
expect(chatGpt.generateContent).toHaveBeenCalled();
|
|
180
180
|
const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
|
|
181
181
|
expect(calls[0]).toEqual(expect.arrayContaining([
|
|
@@ -205,6 +205,7 @@ describe('promptService', () => {
|
|
|
205
205
|
path: 'test.js',
|
|
206
206
|
updateToolName: 'updateFile',
|
|
207
207
|
contextImageAssets: ['/path/to/image1.png', '/path/to/image2.jpg'],
|
|
208
|
+
prompt: 'Generate file update',
|
|
208
209
|
},
|
|
209
210
|
],
|
|
210
211
|
contextPaths: [],
|
|
@@ -225,13 +226,13 @@ describe('promptService', () => {
|
|
|
225
226
|
vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockUpdateCall);
|
|
226
227
|
vi.mocked(fs.readFileSync).mockImplementation((path) => `mock-base64-data-for-${path}`);
|
|
227
228
|
vi.mocked(mime.lookup).mockImplementation((path) => (path.endsWith('.png') ? 'image/png' : 'image/jpeg'));
|
|
228
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt', vision: true }));
|
|
229
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'chat-gpt', vision: true }));
|
|
229
230
|
expect(chatGpt.generateContent).toHaveBeenCalledTimes(2);
|
|
230
231
|
const secondCall = vi.mocked(chatGpt.generateContent).mock.calls[1];
|
|
231
232
|
expect(secondCall[0]).toEqual(expect.arrayContaining([
|
|
232
233
|
expect.objectContaining({
|
|
233
234
|
type: 'user',
|
|
234
|
-
text: expect.stringContaining('
|
|
235
|
+
text: expect.stringContaining('Generate file update'),
|
|
235
236
|
images: [
|
|
236
237
|
{
|
|
237
238
|
path: '/path/to/image1.png',
|
|
@@ -254,7 +255,7 @@ describe('promptService', () => {
|
|
|
254
255
|
{ name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("No vision test");' } },
|
|
255
256
|
];
|
|
256
257
|
vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
|
|
257
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt' }));
|
|
258
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'chat-gpt' }));
|
|
258
259
|
expect(chatGpt.generateContent).toHaveBeenCalled();
|
|
259
260
|
const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
|
|
260
261
|
expect(calls[0]).not.toEqual(expect.arrayContaining([
|
|
@@ -270,7 +271,7 @@ describe('promptService', () => {
|
|
|
270
271
|
{
|
|
271
272
|
name: 'codegenSummary',
|
|
272
273
|
args: {
|
|
273
|
-
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
|
|
274
|
+
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile', prompt: 'Generate file' }],
|
|
274
275
|
contextPaths: ['context1.js', 'context2.js'],
|
|
275
276
|
explanation: 'Mock summary with context',
|
|
276
277
|
},
|
|
@@ -287,7 +288,7 @@ describe('promptService', () => {
|
|
|
287
288
|
];
|
|
288
289
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
|
|
289
290
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
|
|
290
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
291
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
291
292
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
292
293
|
const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
|
|
293
294
|
expect(firstCall[0]).toEqual(expect.arrayContaining([
|
|
@@ -309,7 +310,7 @@ describe('promptService', () => {
|
|
|
309
310
|
{
|
|
310
311
|
name: 'codegenSummary',
|
|
311
312
|
args: {
|
|
312
|
-
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
|
|
313
|
+
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile', prompt: 'Generate file' }],
|
|
313
314
|
contextPaths: ['context1.js', 'context2.js'],
|
|
314
315
|
explanation: 'Mock summary without context optimization',
|
|
315
316
|
},
|
|
@@ -326,7 +327,7 @@ describe('promptService', () => {
|
|
|
326
327
|
];
|
|
327
328
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
|
|
328
329
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
|
|
329
|
-
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
330
|
+
await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
330
331
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
331
332
|
const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
|
|
332
333
|
expect(firstCall[0]).not.toEqual(expect.arrayContaining([
|
|
@@ -348,7 +349,9 @@ describe('promptService', () => {
|
|
|
348
349
|
{
|
|
349
350
|
name: 'codegenSummary',
|
|
350
351
|
args: {
|
|
351
|
-
fileUpdates: [
|
|
352
|
+
fileUpdates: [
|
|
353
|
+
{ path: '/path/to/generated/image.png', updateToolName: 'generateImage', prompt: 'Generate file' },
|
|
354
|
+
],
|
|
352
355
|
contextPaths: [],
|
|
353
356
|
explanation: 'Mock summary with image generation',
|
|
354
357
|
},
|
|
@@ -378,7 +381,12 @@ describe('promptService', () => {
|
|
|
378
381
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
|
|
379
382
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
|
|
380
383
|
vi.mocked(dalleService.generateImage).mockResolvedValue('https://example.com/generated-image.png');
|
|
381
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
384
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
385
|
+
askQuestion: false,
|
|
386
|
+
disableContextOptimization: true,
|
|
387
|
+
aiService: 'vertex-ai',
|
|
388
|
+
imagen: 'dall-e',
|
|
389
|
+
}));
|
|
382
390
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
383
391
|
expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
|
|
384
392
|
expect(result).toEqual(expect.arrayContaining(mockDownloadFileCall));
|
|
@@ -390,7 +398,9 @@ describe('promptService', () => {
|
|
|
390
398
|
{
|
|
391
399
|
name: 'codegenSummary',
|
|
392
400
|
args: {
|
|
393
|
-
fileUpdates: [
|
|
401
|
+
fileUpdates: [
|
|
402
|
+
{ path: '/path/to/generated/image.png', updateToolName: 'generateImage', prompt: 'Generate file' },
|
|
403
|
+
],
|
|
394
404
|
contextPaths: [],
|
|
395
405
|
explanation: 'Mock summary with image generation failure',
|
|
396
406
|
},
|
|
@@ -410,7 +420,12 @@ describe('promptService', () => {
|
|
|
410
420
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
|
|
411
421
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
|
|
412
422
|
vi.mocked(dalleService.generateImage).mockRejectedValue(new Error('Image generation failed'));
|
|
413
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
423
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({
|
|
424
|
+
askQuestion: false,
|
|
425
|
+
disableContextOptimization: true,
|
|
426
|
+
aiService: 'vertex-ai',
|
|
427
|
+
imagen: 'dall-e',
|
|
428
|
+
}));
|
|
414
429
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
415
430
|
expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
|
|
416
431
|
expect(result).toEqual(expect.arrayContaining([
|
|
@@ -434,7 +449,7 @@ describe('promptService', () => {
|
|
|
434
449
|
},
|
|
435
450
|
];
|
|
436
451
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUnexpectedResponse);
|
|
437
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
452
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
438
453
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
|
|
439
454
|
expect(result).toEqual(mockUnexpectedResponse);
|
|
440
455
|
});
|
|
@@ -455,7 +470,7 @@ describe('promptService', () => {
|
|
|
455
470
|
{
|
|
456
471
|
name: 'codegenSummary',
|
|
457
472
|
args: {
|
|
458
|
-
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
|
|
473
|
+
fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile', prompt: 'Generate file' }],
|
|
459
474
|
contextPaths: [],
|
|
460
475
|
explanation: 'Mock summary',
|
|
461
476
|
},
|
|
@@ -473,7 +488,7 @@ describe('promptService', () => {
|
|
|
473
488
|
},
|
|
474
489
|
},
|
|
475
490
|
]);
|
|
476
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
491
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
477
492
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
|
|
478
493
|
expect(result).toEqual([
|
|
479
494
|
{
|
|
@@ -498,7 +513,7 @@ describe('promptService', () => {
|
|
|
498
513
|
{
|
|
499
514
|
name: 'codegenSummary',
|
|
500
515
|
args: {
|
|
501
|
-
fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
|
|
516
|
+
fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile', prompt: 'Generate file' }],
|
|
502
517
|
contextPaths: [],
|
|
503
518
|
explanation: 'Mock summary',
|
|
504
519
|
},
|
|
@@ -506,7 +521,7 @@ describe('promptService', () => {
|
|
|
506
521
|
])
|
|
507
522
|
.mockResolvedValueOnce(mockInvalidCall)
|
|
508
523
|
.mockResolvedValueOnce(mockInvalidCall); // Second call also returns invalid result
|
|
509
|
-
await expect(promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }))).rejects.toThrow('Recovery failed');
|
|
524
|
+
await expect(promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }))).rejects.toThrow('Recovery failed');
|
|
510
525
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
|
|
511
526
|
});
|
|
512
527
|
it('should not attempt recovery for multiple valid function calls', async () => {
|
|
@@ -522,7 +537,7 @@ describe('promptService', () => {
|
|
|
522
537
|
},
|
|
523
538
|
];
|
|
524
539
|
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockValidCalls);
|
|
525
|
-
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
|
|
540
|
+
const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, disableContextOptimization: true, aiService: 'vertex-ai' }));
|
|
526
541
|
expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
|
|
527
542
|
expect(result).toEqual(mockValidCalls);
|
|
528
543
|
});
|