genaicode 0.0.37 → 0.1.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.
- package/bin/genaicode-dev.js +11 -0
- package/bin/genaicode.cjs +8 -1
- package/dist/ai-service/ai-studio.d.ts +5 -0
- package/dist/ai-service/ai-studio.js +135 -0
- package/dist/ai-service/ai-studio.js.map +1 -0
- package/dist/ai-service/anthropic.d.ts +5 -0
- package/dist/ai-service/anthropic.js +133 -0
- package/dist/ai-service/anthropic.js.map +1 -0
- package/dist/ai-service/chat-gpt.d.ts +5 -0
- package/dist/ai-service/chat-gpt.js +131 -0
- package/dist/ai-service/chat-gpt.js.map +1 -0
- package/dist/ai-service/common.d.ts +57 -0
- package/dist/ai-service/common.js +38 -0
- package/dist/ai-service/common.js.map +1 -0
- package/dist/ai-service/common.test.d.ts +1 -0
- package/dist/ai-service/common.test.js +85 -0
- package/dist/ai-service/common.test.js.map +1 -0
- package/dist/ai-service/dall-e.d.ts +14 -0
- package/dist/ai-service/dall-e.js +47 -0
- package/dist/ai-service/dall-e.js.map +1 -0
- package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
- package/dist/ai-service/vertex-ai-claude.js +93 -0
- package/dist/ai-service/vertex-ai-claude.js.map +1 -0
- package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
- package/dist/ai-service/vertex-ai-imagen.js +74 -0
- package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
- package/dist/ai-service/vertex-ai.d.ts +7 -0
- package/dist/ai-service/vertex-ai.js +147 -0
- package/dist/ai-service/vertex-ai.js.map +1 -0
- package/dist/cli/cli-options.d.ts +10 -0
- package/dist/cli/cli-options.js +124 -0
- package/dist/cli/cli-options.js.map +1 -0
- package/dist/cli/cli-options.test.d.ts +1 -0
- package/dist/cli/cli-options.test.js +34 -0
- package/dist/cli/cli-options.test.js.map +1 -0
- package/dist/cli/cli-params.d.ts +29 -0
- package/dist/cli/cli-params.js +103 -0
- package/dist/cli/cli-params.js.map +1 -0
- package/dist/cli/cli-params.test.d.ts +1 -0
- package/dist/cli/cli-params.test.js +38 -0
- package/dist/cli/cli-params.test.js.map +1 -0
- package/dist/cli/service-autodetect.d.ts +2 -0
- package/dist/cli/service-autodetect.js +17 -0
- package/dist/cli/service-autodetect.js.map +1 -0
- package/dist/cli/service-autodetect.test.d.ts +1 -0
- package/dist/cli/service-autodetect.test.js +38 -0
- package/dist/cli/service-autodetect.test.js.map +1 -0
- package/dist/cli/validate-cli-params.d.ts +18 -0
- package/dist/cli/validate-cli-params.js +128 -0
- package/dist/cli/validate-cli-params.js.map +1 -0
- package/dist/cli/validate-cli-params.test.d.ts +1 -0
- package/dist/cli/validate-cli-params.test.js +106 -0
- package/dist/cli/validate-cli-params.test.js.map +1 -0
- package/dist/files/file-utils.d.ts +2 -0
- package/dist/files/file-utils.js +7 -0
- package/dist/files/file-utils.js.map +1 -0
- package/dist/files/file-utils.test.d.ts +1 -0
- package/dist/files/file-utils.test.js +18 -0
- package/dist/files/file-utils.test.js.map +1 -0
- package/dist/files/find-files.d.ts +8 -0
- package/dist/files/find-files.js +76 -0
- package/dist/files/find-files.js.map +1 -0
- package/dist/files/read-files.d.ts +13 -0
- package/dist/files/read-files.js +61 -0
- package/dist/files/read-files.js.map +1 -0
- package/dist/files/read-files.test.d.ts +1 -0
- package/dist/files/read-files.test.js +89 -0
- package/dist/files/read-files.test.js.map +1 -0
- package/dist/files/temp-buffer.d.ts +2 -0
- package/dist/files/temp-buffer.js +12 -0
- package/dist/files/temp-buffer.js.map +1 -0
- package/dist/files/update-files.d.ts +5 -0
- package/dist/files/update-files.js +197 -0
- package/dist/files/update-files.js.map +1 -0
- package/dist/images/ensure-alpha.d.ts +1 -0
- package/dist/images/ensure-alpha.js +5 -0
- package/dist/images/ensure-alpha.js.map +1 -0
- package/dist/images/imgly-remove-background.d.ts +2 -0
- package/dist/images/imgly-remove-background.js +21 -0
- package/dist/images/imgly-remove-background.js.map +1 -0
- package/dist/images/resize-image.d.ts +19 -0
- package/dist/images/resize-image.js +22 -0
- package/dist/images/resize-image.js.map +1 -0
- package/dist/images/split-image.d.ts +18 -0
- package/dist/images/split-image.js +25 -0
- package/dist/images/split-image.js.map +1 -0
- package/dist/main/codegen.d.ts +2 -0
- package/dist/main/codegen.js +101 -0
- package/dist/main/codegen.js.map +1 -0
- package/dist/main/codegen.test.d.ts +2 -0
- package/dist/main/codegen.test.js +259 -0
- package/dist/main/codegen.test.js.map +1 -0
- package/dist/main/config-lib.d.ts +8 -0
- package/dist/main/config-lib.js +28 -0
- package/dist/main/config-lib.js.map +1 -0
- package/dist/main/config-lib.test.d.ts +1 -0
- package/dist/main/config-lib.test.js +64 -0
- package/dist/main/config-lib.test.js.map +1 -0
- package/dist/main/config.d.ts +5 -0
- package/{src → dist}/main/config.js +16 -22
- package/dist/main/config.js.map +1 -0
- package/dist/prompt/function-calling-validate.d.ts +3 -0
- package/dist/prompt/function-calling-validate.js +27 -0
- package/dist/prompt/function-calling-validate.js.map +1 -0
- package/dist/prompt/function-calling.d.ts +5 -0
- package/{src → dist}/prompt/function-calling.js +25 -24
- package/dist/prompt/function-calling.js.map +1 -0
- package/dist/prompt/function-defs/ask-question.d.ts +31 -0
- package/dist/prompt/function-defs/ask-question.js +32 -0
- package/dist/prompt/function-defs/ask-question.js.map +1 -0
- package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
- package/dist/prompt/function-defs/codegen-summary.js +80 -0
- package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
- package/dist/prompt/function-defs/create-directory.d.ts +21 -0
- package/dist/prompt/function-defs/create-directory.js +22 -0
- package/dist/prompt/function-defs/create-directory.js.map +1 -0
- package/dist/prompt/function-defs/create-file.d.ts +25 -0
- package/dist/prompt/function-defs/create-file.js +26 -0
- package/dist/prompt/function-defs/create-file.js.map +1 -0
- package/dist/prompt/function-defs/delete-file.d.ts +21 -0
- package/dist/prompt/function-defs/delete-file.js +22 -0
- package/dist/prompt/function-defs/delete-file.js.map +1 -0
- package/dist/prompt/function-defs/download-file.d.ts +25 -0
- package/dist/prompt/function-defs/download-file.js +26 -0
- package/dist/prompt/function-defs/download-file.js.map +1 -0
- package/dist/prompt/function-defs/explanation.d.ts +17 -0
- package/dist/prompt/function-defs/explanation.js +18 -0
- package/dist/prompt/function-defs/explanation.js.map +1 -0
- package/dist/prompt/function-defs/generate-image.d.ts +48 -0
- package/dist/prompt/function-defs/generate-image.js +49 -0
- package/dist/prompt/function-defs/generate-image.js.map +1 -0
- package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
- package/dist/prompt/function-defs/get-image-assets.js +21 -0
- package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
- package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
- package/dist/prompt/function-defs/get-source-code.js +21 -0
- package/dist/prompt/function-defs/get-source-code.js.map +1 -0
- package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
- package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
- package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
- package/dist/prompt/function-defs/move-file.d.ts +25 -0
- package/dist/prompt/function-defs/move-file.js +26 -0
- package/dist/prompt/function-defs/move-file.js.map +1 -0
- package/dist/prompt/function-defs/patch-file.d.ts +25 -0
- package/dist/prompt/function-defs/patch-file.js +39 -0
- package/dist/prompt/function-defs/patch-file.js.map +1 -0
- package/dist/prompt/function-defs/resize-image.d.ts +36 -0
- package/dist/prompt/function-defs/resize-image.js +37 -0
- package/dist/prompt/function-defs/resize-image.js.map +1 -0
- package/dist/prompt/function-defs/split-image.d.ts +57 -0
- package/dist/prompt/function-defs/split-image.js +46 -0
- package/dist/prompt/function-defs/split-image.js.map +1 -0
- package/dist/prompt/function-defs/update-file.d.ts +25 -0
- package/dist/prompt/function-defs/update-file.js +26 -0
- package/dist/prompt/function-defs/update-file.js.map +1 -0
- package/dist/prompt/limits.d.ts +3 -0
- package/dist/prompt/limits.js +19 -0
- package/dist/prompt/limits.js.map +1 -0
- package/dist/prompt/limits.test.d.ts +1 -0
- package/dist/prompt/limits.test.js +35 -0
- package/dist/prompt/limits.test.js.map +1 -0
- package/dist/prompt/prompt-codegen.d.ts +4 -0
- package/dist/prompt/prompt-codegen.js +81 -0
- package/dist/prompt/prompt-codegen.js.map +1 -0
- package/dist/prompt/prompt-codegen.test.d.ts +1 -0
- package/dist/prompt/prompt-codegen.test.js +94 -0
- package/dist/prompt/prompt-codegen.test.js.map +1 -0
- package/dist/prompt/prompt-consts.d.ts +1 -0
- package/{src → dist}/prompt/prompt-consts.js +1 -0
- package/dist/prompt/prompt-consts.js.map +1 -0
- package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
- package/dist/prompt/prompt-service-ask-question.test.js +146 -0
- package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
- package/dist/prompt/prompt-service.d.ts +13 -0
- package/dist/prompt/prompt-service.js +278 -0
- package/dist/prompt/prompt-service.js.map +1 -0
- package/dist/prompt/prompt-service.test.d.ts +1 -0
- package/dist/prompt/prompt-service.test.js +511 -0
- package/dist/prompt/prompt-service.test.js.map +1 -0
- package/dist/prompt/systemprompt.d.ts +2 -0
- package/dist/prompt/systemprompt.js +43 -0
- package/dist/prompt/systemprompt.js.map +1 -0
- package/dist/prompt/systemprompt.test.d.ts +2 -0
- package/dist/prompt/systemprompt.test.js +47 -0
- package/dist/prompt/systemprompt.test.js.map +1 -0
- package/package.json +13 -4
- package/bin/genaicode.js +0 -5
- package/src/ai-service/anthropic.js +0 -126
- package/src/ai-service/chat-gpt.js +0 -126
- package/src/ai-service/common.js +0 -49
- package/src/ai-service/common.test.js +0 -107
- package/src/ai-service/dall-e.js +0 -50
- package/src/ai-service/vertex-ai-claude.js +0 -99
- package/src/ai-service/vertex-ai-imagen.js +0 -78
- package/src/ai-service/vertex-ai.js +0 -156
- package/src/cli/cli-options.js +0 -132
- package/src/cli/cli-options.test.js +0 -50
- package/src/cli/cli-params.js +0 -114
- package/src/cli/cli-params.test.js +0 -43
- package/src/cli/service-autodetect.js +0 -11
- package/src/cli/service-autodetect.test.js +0 -43
- package/src/cli/validate-cli-params.js +0 -137
- package/src/cli/validate-cli-params.test.js +0 -134
- package/src/files/file-utils.js +0 -7
- package/src/files/file-utils.test.js +0 -21
- package/src/files/find-files.js +0 -86
- package/src/files/read-files.js +0 -65
- package/src/files/read-files.test.js +0 -103
- package/src/files/temp-buffer.js +0 -13
- package/src/files/update-files.js +0 -205
- package/src/images/ensure-alpha.js +0 -5
- package/src/images/imgly-remove-background.js +0 -23
- package/src/images/resize-image.js +0 -23
- package/src/images/split-image.js +0 -26
- package/src/main/codegen.js +0 -120
- package/src/main/codegen.test.js +0 -335
- package/src/main/config-lib.js +0 -33
- package/src/main/config-lib.test.js +0 -80
- package/src/prompt/function-calling-validate.js +0 -25
- package/src/prompt/function-defs/ask-question.js +0 -33
- package/src/prompt/function-defs/codegen-summary.js +0 -87
- package/src/prompt/function-defs/create-directory.js +0 -21
- package/src/prompt/function-defs/create-file.js +0 -26
- package/src/prompt/function-defs/delete-file.js +0 -21
- package/src/prompt/function-defs/download-file.js +0 -25
- package/src/prompt/function-defs/explanation.js +0 -17
- package/src/prompt/function-defs/generate-image.js +0 -51
- package/src/prompt/function-defs/get-image-assets.js +0 -21
- package/src/prompt/function-defs/get-source-code.js +0 -21
- package/src/prompt/function-defs/imgly-remove-background.js +0 -25
- package/src/prompt/function-defs/move-file.js +0 -25
- package/src/prompt/function-defs/patch-file.js +0 -39
- package/src/prompt/function-defs/resize-image.js +0 -36
- package/src/prompt/function-defs/split-image.js +0 -45
- package/src/prompt/function-defs/update-file.js +0 -26
- package/src/prompt/limits.js +0 -23
- package/src/prompt/limits.test.js +0 -40
- package/src/prompt/prompt-codegen.js +0 -106
- package/src/prompt/prompt-codegen.test.js +0 -116
- package/src/prompt/prompt-service-ask-question.test.js +0 -163
- package/src/prompt/prompt-service.js +0 -335
- package/src/prompt/prompt-service.test.js +0 -602
- package/src/prompt/systemprompt.js +0 -39
- package/src/prompt/systemprompt.test.js +0 -64
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { getCodeGenPrompt, getLintFixPrompt } from './prompt-codegen.js';
|
|
3
|
+
import * as findFiles from '../files/find-files.js';
|
|
4
|
+
import * as cliParams from '../cli/cli-params.js';
|
|
5
|
+
import * as limits from './limits.js';
|
|
6
|
+
import '../files/read-files.js';
|
|
7
|
+
vi.mock('../files/find-files.js', () => ({
|
|
8
|
+
rcConfig: {},
|
|
9
|
+
getSourceFiles: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
vi.mock('../files/read-files.js', () => ({
|
|
12
|
+
getSourceCode: () => ({}),
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('../cli/cli-params.js', () => ({
|
|
15
|
+
requireExplanations: false,
|
|
16
|
+
considerAllFiles: false,
|
|
17
|
+
dependencyTree: false,
|
|
18
|
+
explicitPrompt: false,
|
|
19
|
+
allowFileCreate: false,
|
|
20
|
+
allowFileDelete: false,
|
|
21
|
+
allowDirectoryCreate: false,
|
|
22
|
+
allowFileMove: false,
|
|
23
|
+
verbosePrompt: false,
|
|
24
|
+
imagen: false,
|
|
25
|
+
vision: false,
|
|
26
|
+
}));
|
|
27
|
+
vi.mock('./limits.js');
|
|
28
|
+
describe('getCodeGenPrompt', () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
vi.resetAllMocks();
|
|
31
|
+
});
|
|
32
|
+
it('should generate prompt for all files when considerAllFiles is true', () => {
|
|
33
|
+
vi.spyOn(findFiles, 'getSourceFiles').mockReturnValue(['file1.js', 'file2.js']);
|
|
34
|
+
vi.mocked(cliParams).considerAllFiles = true;
|
|
35
|
+
vi.mocked(cliParams).explicitPrompt = undefined;
|
|
36
|
+
vi.mocked(cliParams).allowFileCreate = false;
|
|
37
|
+
vi.mocked(cliParams).allowFileDelete = false;
|
|
38
|
+
vi.mocked(cliParams).allowDirectoryCreate = false;
|
|
39
|
+
vi.mocked(cliParams).allowFileMove = false;
|
|
40
|
+
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() => { });
|
|
41
|
+
const prompt = getCodeGenPrompt();
|
|
42
|
+
expect(prompt).toContain('You are allowed to modify all files in the application');
|
|
43
|
+
expect(prompt).toContain('Do not create new files.');
|
|
44
|
+
expect(prompt).toContain('Do not delete files.');
|
|
45
|
+
expect(prompt).toContain('Do not create new directories.');
|
|
46
|
+
expect(prompt).toContain('Do not move files.');
|
|
47
|
+
});
|
|
48
|
+
// Add more test cases for getCodeGenPrompt as needed
|
|
49
|
+
});
|
|
50
|
+
describe('getLintFixPrompt', () => {
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
vi.mocked(cliParams).verbosePrompt = false;
|
|
53
|
+
vi.spyOn(limits, 'verifyCodegenPromptLimit').mockImplementation(() => { });
|
|
54
|
+
});
|
|
55
|
+
it('should generate a lint fix prompt with provided command, stdout, and stderr', () => {
|
|
56
|
+
const command = 'eslint --fix';
|
|
57
|
+
const stdout = 'Fixed 2 errors';
|
|
58
|
+
const stderr = '';
|
|
59
|
+
const prompt = getLintFixPrompt(command, stdout, stderr);
|
|
60
|
+
expect(prompt).toContain('The following lint errors were encountered after the initial code generation:');
|
|
61
|
+
expect(prompt).toContain(`Lint command: ${command}`);
|
|
62
|
+
expect(prompt).toContain('Lint command stdout:');
|
|
63
|
+
expect(prompt).toContain(stdout);
|
|
64
|
+
expect(prompt).toContain('Lint command stderr:');
|
|
65
|
+
expect(prompt).toContain('Please suggest changes to fix these lint errors.');
|
|
66
|
+
});
|
|
67
|
+
it('should include stderr in the prompt when provided', () => {
|
|
68
|
+
const command = 'eslint --fix';
|
|
69
|
+
const stdout = '';
|
|
70
|
+
const stderr = 'Error: Unable to resolve path';
|
|
71
|
+
const prompt = getLintFixPrompt(command, stdout, stderr);
|
|
72
|
+
expect(prompt).toContain('Lint command stderr:');
|
|
73
|
+
expect(prompt).toContain(stderr);
|
|
74
|
+
});
|
|
75
|
+
it('should call verifyCodegenPromptLimit with the generated prompt', () => {
|
|
76
|
+
const command = 'eslint --fix';
|
|
77
|
+
const stdout = 'Fixed 1 error';
|
|
78
|
+
const stderr = '';
|
|
79
|
+
getLintFixPrompt(command, stdout, stderr);
|
|
80
|
+
expect(limits.verifyCodegenPromptLimit).toHaveBeenCalledWith(expect.any(String));
|
|
81
|
+
});
|
|
82
|
+
it('should log the prompt when verbosePrompt is true', () => {
|
|
83
|
+
vi.mocked(cliParams).verbosePrompt = true;
|
|
84
|
+
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
85
|
+
const command = 'eslint --fix';
|
|
86
|
+
const stdout = 'Fixed 1 error';
|
|
87
|
+
const stderr = '';
|
|
88
|
+
getLintFixPrompt(command, stdout, stderr);
|
|
89
|
+
expect(consoleSpy).toHaveBeenCalledWith('Lint fix prompt:');
|
|
90
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('The following lint errors were encountered'));
|
|
91
|
+
consoleSpy.mockRestore();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=prompt-codegen.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-codegen.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-codegen.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CODEGEN_TRIGGER: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-consts.js","sourceRoot":"","sources":["../../src/prompt/prompt-consts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAW,GAAG,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { promptService } from './prompt-service.js';
|
|
3
|
+
import * as vertexAi from '../ai-service/vertex-ai.js';
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
import '../cli/cli-params.js';
|
|
6
|
+
import '../files/read-files.js';
|
|
7
|
+
import '../files/find-files.js';
|
|
8
|
+
vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
|
|
9
|
+
vi.mock('readline', () => ({
|
|
10
|
+
createInterface: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
vi.mock('../cli/cli-params.js', () => ({
|
|
13
|
+
requireExplanations: false,
|
|
14
|
+
considerAllFiles: false,
|
|
15
|
+
dependencyTree: false,
|
|
16
|
+
explicitPrompt: false,
|
|
17
|
+
allowFileCreate: false,
|
|
18
|
+
allowFileDelete: false,
|
|
19
|
+
allowDirectoryCreate: false,
|
|
20
|
+
allowFileMove: false,
|
|
21
|
+
verbosePrompt: false,
|
|
22
|
+
disableContextOptimization: false,
|
|
23
|
+
vision: false,
|
|
24
|
+
imagen: false,
|
|
25
|
+
temperature: 0.7,
|
|
26
|
+
cheap: false,
|
|
27
|
+
askQuestion: true,
|
|
28
|
+
}));
|
|
29
|
+
// Mock find-files module
|
|
30
|
+
vi.mock('../files/find-files.js', () => ({
|
|
31
|
+
getSourceFiles: () => [],
|
|
32
|
+
getImageAssetFiles: () => [],
|
|
33
|
+
}));
|
|
34
|
+
// Mock read-files module
|
|
35
|
+
vi.mock('../files/read-files.js', () => ({
|
|
36
|
+
getSourceCode: () => ({}),
|
|
37
|
+
getImageAssets: vi.fn(() => ({})),
|
|
38
|
+
}));
|
|
39
|
+
vi.mock('../main/config.js', () => ({
|
|
40
|
+
rootDir: '/mocked/root/dir',
|
|
41
|
+
rcConfig: {
|
|
42
|
+
rootDir: '.',
|
|
43
|
+
extensions: ['.js', '.ts', '.tsx', '.jsx'],
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
describe('promptService with askQuestion', () => {
|
|
47
|
+
let mockReadline;
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
vi.resetAllMocks();
|
|
50
|
+
console.log = vi.fn();
|
|
51
|
+
mockReadline = {
|
|
52
|
+
question: vi.fn(),
|
|
53
|
+
close: vi.fn(),
|
|
54
|
+
};
|
|
55
|
+
// @ts-expect-error (avoid complex mock)
|
|
56
|
+
vi.spyOn(readline, 'createInterface').mockReturnValue(mockReadline);
|
|
57
|
+
});
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
vi.clearAllMocks();
|
|
60
|
+
});
|
|
61
|
+
it('should handle askQuestion when enabled', async () => {
|
|
62
|
+
const mockAskQuestionCall = [
|
|
63
|
+
{
|
|
64
|
+
name: 'askQuestion',
|
|
65
|
+
args: {
|
|
66
|
+
content: 'Do you want to proceed with code generation?',
|
|
67
|
+
shouldPrompt: true,
|
|
68
|
+
promptNecessity: 80,
|
|
69
|
+
stopCodegen: false,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
const mockAskQuestionCall2 = [
|
|
74
|
+
{
|
|
75
|
+
name: 'askQuestion',
|
|
76
|
+
args: {
|
|
77
|
+
content: 'Ok lets go',
|
|
78
|
+
shouldPrompt: false,
|
|
79
|
+
promptNecessity: 80,
|
|
80
|
+
stopCodegen: false,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
const mockCodegenSummary = [
|
|
85
|
+
{
|
|
86
|
+
name: 'codegenSummary',
|
|
87
|
+
args: {
|
|
88
|
+
fileUpdates: [],
|
|
89
|
+
contextPaths: [],
|
|
90
|
+
explanation: 'No updates needed',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
vi.mocked(vertexAi.generateContent)
|
|
95
|
+
.mockResolvedValueOnce(mockAskQuestionCall)
|
|
96
|
+
.mockResolvedValueOnce(mockAskQuestionCall2)
|
|
97
|
+
.mockResolvedValueOnce(mockCodegenSummary);
|
|
98
|
+
vi.mocked(mockReadline.question).mockImplementationOnce((_, callback) => {
|
|
99
|
+
callback('Yes');
|
|
100
|
+
});
|
|
101
|
+
await promptService(vertexAi.generateContent, undefined);
|
|
102
|
+
expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
|
|
103
|
+
expect(mockReadline.question).toHaveBeenCalledWith('Your answer: ', expect.any(Function));
|
|
104
|
+
expect(console.log).toHaveBeenCalledWith('Assistant asks:', expect.any(Object));
|
|
105
|
+
expect(console.log).toHaveBeenCalledWith('The question was answered');
|
|
106
|
+
});
|
|
107
|
+
it('should stop code generation when askQuestion returns stopCodegen: true', async () => {
|
|
108
|
+
const mockAskQuestionCall = [
|
|
109
|
+
{
|
|
110
|
+
name: 'askQuestion',
|
|
111
|
+
args: {
|
|
112
|
+
content: 'Stopping code generation as requested.',
|
|
113
|
+
shouldPrompt: false,
|
|
114
|
+
promptNecessity: 100,
|
|
115
|
+
stopCodegen: true,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockAskQuestionCall);
|
|
120
|
+
const result = await promptService(vertexAi.generateContent, undefined);
|
|
121
|
+
expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
|
|
122
|
+
expect(result).toEqual([]);
|
|
123
|
+
expect(console.log).toHaveBeenCalledWith('Assistant requested to stop code generation. Exiting...');
|
|
124
|
+
});
|
|
125
|
+
it('should proceed with code generation when askQuestion returns shouldPrompt: false', async () => {
|
|
126
|
+
const mockAskQuestionCall = [];
|
|
127
|
+
const mockCodegenSummary = [
|
|
128
|
+
{
|
|
129
|
+
name: 'codegenSummary',
|
|
130
|
+
args: {
|
|
131
|
+
fileUpdates: [],
|
|
132
|
+
contextPaths: [],
|
|
133
|
+
explanation: 'No updates needed',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
vi.mocked(vertexAi.generateContent)
|
|
138
|
+
.mockResolvedValueOnce(mockAskQuestionCall)
|
|
139
|
+
.mockResolvedValueOnce(mockCodegenSummary);
|
|
140
|
+
await promptService(vertexAi.generateContent, undefined);
|
|
141
|
+
expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
|
|
142
|
+
expect(mockReadline.question).not.toHaveBeenCalled();
|
|
143
|
+
expect(console.log).toHaveBeenCalledWith('Assistant did not ask a question. Proceeding with code generation.');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=prompt-service-ask-question.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PromptItem, FunctionDef, FunctionCall } from '../ai-service/common.js';
|
|
2
|
+
interface GenerateContentFunction {
|
|
3
|
+
(prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string, temperature: number, cheap: boolean): Promise<FunctionCall[]>;
|
|
4
|
+
}
|
|
5
|
+
interface GenerateImageFunction {
|
|
6
|
+
(prompt: string, contextImagePath: string | undefined, size: {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}, cheap: boolean): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
/** A function that communicates with model using */
|
|
12
|
+
export declare function promptService(generateContentFn: GenerateContentFunction, generateImageFn: GenerateImageFunction | undefined, codegenPrompt?: string): Promise<FunctionCall[]>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import * as diff from 'diff';
|
|
4
|
+
import mime from 'mime-types';
|
|
5
|
+
import { createInterface } from 'readline';
|
|
6
|
+
import { getSystemPrompt } from './systemprompt.js';
|
|
7
|
+
import { getCodeGenPrompt } from './prompt-codegen.js';
|
|
8
|
+
import { functionDefs } from './function-calling.js';
|
|
9
|
+
import { getSourceCode, getImageAssets } from '../files/read-files.js';
|
|
10
|
+
import { disableContextOptimization, temperature, vision, cheap, askQuestion } from '../cli/cli-params.js';
|
|
11
|
+
import { validateFunctionCall } from './function-calling-validate.js';
|
|
12
|
+
/** A function that communicates with model using */
|
|
13
|
+
export async function promptService(generateContentFn, generateImageFn, codegenPrompt = getCodeGenPrompt()) {
|
|
14
|
+
const messages = prepareMessages(codegenPrompt);
|
|
15
|
+
// First stage: generate code generation summary, which should not take a lot of output tokens
|
|
16
|
+
const getSourceCodeRequest = { name: 'getSourceCode' };
|
|
17
|
+
const prompt = [
|
|
18
|
+
{ type: 'systemPrompt', systemPrompt: getSystemPrompt() },
|
|
19
|
+
{ type: 'user', text: messages.suggestSourceCode },
|
|
20
|
+
{ type: 'assistant', text: messages.requestSourceCode, functionCalls: [getSourceCodeRequest] },
|
|
21
|
+
];
|
|
22
|
+
const getSourceCodeResponse = {
|
|
23
|
+
type: 'user',
|
|
24
|
+
functionResponses: [{ name: 'getSourceCode', content: messages.sourceCode }],
|
|
25
|
+
cache: true,
|
|
26
|
+
};
|
|
27
|
+
prompt.push(getSourceCodeResponse);
|
|
28
|
+
if (vision) {
|
|
29
|
+
prompt.slice(-1)[0].text = messages.suggestImageAssets;
|
|
30
|
+
prompt.push({ type: 'assistant', text: messages.requestImageAssets, functionCalls: [{ name: 'getImageAssets' }] }, { type: 'user', functionResponses: [{ name: 'getImageAssets', content: messages.imageAssets }] });
|
|
31
|
+
}
|
|
32
|
+
prompt.slice(-1)[0].text = messages.prompt;
|
|
33
|
+
// New step: Allow the assistant to ask a question if --ask-question is enabled
|
|
34
|
+
if (askQuestion) {
|
|
35
|
+
console.log('Allowing the assistant to ask a question...');
|
|
36
|
+
const questionAsked = false;
|
|
37
|
+
while (!questionAsked) {
|
|
38
|
+
const askQuestionResult = await generateContentFn(prompt, functionDefs, 'askQuestion', temperature, cheap);
|
|
39
|
+
const askQuestionCall = askQuestionResult.find((call) => call.name === 'askQuestion');
|
|
40
|
+
if (askQuestionCall) {
|
|
41
|
+
console.log('Assistant asks:', askQuestionCall.args);
|
|
42
|
+
const userAnswer = askQuestionCall.args?.shouldPrompt
|
|
43
|
+
? await getUserInput('Your answer: ')
|
|
44
|
+
: 'Lets proceed with code generation.';
|
|
45
|
+
prompt.push({ type: 'assistant', functionCalls: [askQuestionCall] }, {
|
|
46
|
+
type: 'user',
|
|
47
|
+
text: userAnswer,
|
|
48
|
+
functionResponses: [{ name: 'askQuestion', call_id: askQuestionCall.id }],
|
|
49
|
+
});
|
|
50
|
+
console.log('The question was answered');
|
|
51
|
+
if (askQuestionCall.args?.stopCodegen) {
|
|
52
|
+
console.log('Assistant requested to stop code generation. Exiting...');
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
if (!askQuestionCall.args?.shouldPrompt) {
|
|
56
|
+
console.log('Proceeding with code generation.');
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.log('Assistant did not ask a question. Proceeding with code generation.');
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const baseRequest = [
|
|
67
|
+
prompt,
|
|
68
|
+
functionDefs,
|
|
69
|
+
'codegenSummary',
|
|
70
|
+
temperature,
|
|
71
|
+
cheap,
|
|
72
|
+
];
|
|
73
|
+
let baseResult = await generateContentFn(...baseRequest);
|
|
74
|
+
let codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
|
|
75
|
+
if (codegenSummaryRequest) {
|
|
76
|
+
// Second stage: for each file request the actual code updates
|
|
77
|
+
console.log('Received codegen summary, will collect partial updates', codegenSummaryRequest.args);
|
|
78
|
+
baseResult = await validateAndRecoverSingleResult(baseRequest, baseResult, messages, generateContentFn);
|
|
79
|
+
codegenSummaryRequest = baseResult.find((call) => call.name === 'codegenSummary');
|
|
80
|
+
// Sometimes the result happens to be a string
|
|
81
|
+
assert(Array.isArray(codegenSummaryRequest?.args?.fileUpdates), 'fileUpdates is not an array');
|
|
82
|
+
assert(Array.isArray(codegenSummaryRequest?.args.contextPaths), 'contextPaths is not an array');
|
|
83
|
+
if (codegenSummaryRequest?.args.contextPaths.length > 0 && !disableContextOptimization) {
|
|
84
|
+
console.log('Optimize with context paths.');
|
|
85
|
+
// Monkey patch the initial getSourceCode, do not send parts of source code that are consider irrelevant
|
|
86
|
+
getSourceCodeRequest.args = {
|
|
87
|
+
filePaths: [
|
|
88
|
+
...codegenSummaryRequest.args.fileUpdates.map((file) => file.path),
|
|
89
|
+
...codegenSummaryRequest.args.contextPaths,
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
getSourceCodeResponse.functionResponses.find((item) => item.name === 'getSourceCode').content =
|
|
93
|
+
messages.contextSourceCode(getSourceCodeRequest.args?.filePaths);
|
|
94
|
+
}
|
|
95
|
+
// Store the first stage response entirely in conversation history
|
|
96
|
+
prompt.push({ type: 'assistant', functionCalls: baseResult });
|
|
97
|
+
prompt.push({
|
|
98
|
+
type: 'user',
|
|
99
|
+
functionResponses: baseResult.map((call) => ({ name: call.name, call_id: call.id })),
|
|
100
|
+
cache: true,
|
|
101
|
+
});
|
|
102
|
+
const result = [];
|
|
103
|
+
for (const file of codegenSummaryRequest.args.fileUpdates) {
|
|
104
|
+
console.log('Collecting partial update for: ' + file.path + ' using tool: ' + file.updateToolName);
|
|
105
|
+
console.log('- Prompt:', file.prompt);
|
|
106
|
+
console.log('- Temperature', file.temperature);
|
|
107
|
+
console.log('- Cheap', file.cheap);
|
|
108
|
+
if (vision) {
|
|
109
|
+
console.log('- Context image assets', file.contextImageAssets);
|
|
110
|
+
}
|
|
111
|
+
// this is needed, otherwise we will get an error
|
|
112
|
+
if (prompt.slice(-1)[0].type === 'user') {
|
|
113
|
+
prompt.slice(-1)[0].text = file.prompt ?? messages.partialPromptTemplate(file.path);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
prompt.push({ type: 'user', text: file.prompt ?? messages.partialPromptTemplate(file.path) });
|
|
117
|
+
}
|
|
118
|
+
if (vision && file.contextImageAssets) {
|
|
119
|
+
prompt.slice(-1)[0].images = file.contextImageAssets.map((path) => ({
|
|
120
|
+
path,
|
|
121
|
+
base64url: fs.readFileSync(path, 'base64'),
|
|
122
|
+
mediaType: mime.lookup(path) || '',
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
let partialRequest = [
|
|
126
|
+
prompt,
|
|
127
|
+
functionDefs,
|
|
128
|
+
file.updateToolName,
|
|
129
|
+
file.temperature ?? temperature,
|
|
130
|
+
file.cheap === true,
|
|
131
|
+
];
|
|
132
|
+
let partialResult = await generateContentFn(...partialRequest);
|
|
133
|
+
const getSourceCodeCall = partialResult.find((call) => call.name === 'getSourceCode');
|
|
134
|
+
assert(!getSourceCodeCall, 'Unexpected getSourceCode: ' + JSON.stringify(getSourceCodeCall));
|
|
135
|
+
// Handle image generation requests
|
|
136
|
+
const generateImageCall = partialResult.find((call) => call.name === 'generateImage');
|
|
137
|
+
if (generateImageCall) {
|
|
138
|
+
assert(!!generateImageFn, 'Image generation requested, but a image generation service was not provided');
|
|
139
|
+
console.log('Processing image generation request:', generateImageCall.args);
|
|
140
|
+
try {
|
|
141
|
+
const { prompt: imagePrompt, filePath, contextImagePath, size, cheap, } = generateImageCall.args;
|
|
142
|
+
const generatedImageUrl = await generateImageFn(imagePrompt, contextImagePath, size, cheap === true);
|
|
143
|
+
// Add a createFile call to the result to ensure the generated image is tracked
|
|
144
|
+
partialResult.push({
|
|
145
|
+
name: 'downloadFile',
|
|
146
|
+
args: {
|
|
147
|
+
filePath: filePath,
|
|
148
|
+
downloadUrl: generatedImageUrl,
|
|
149
|
+
explanation: `Downloading generated image`,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Error generating image:', error);
|
|
155
|
+
// Add an explanation about the failed image generation
|
|
156
|
+
partialResult.push({
|
|
157
|
+
name: 'explanation',
|
|
158
|
+
args: {
|
|
159
|
+
text: `Failed to generate image: ${error.message}`,
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
partialResult = await validateAndRecoverSingleResult(partialRequest, partialResult, messages, generateContentFn);
|
|
166
|
+
}
|
|
167
|
+
// Verify if patchFile is one of the functions called, and test if patch is valid and can be applied successfully
|
|
168
|
+
const patchFileCall = partialResult.find((call) => call.name === 'patchFile');
|
|
169
|
+
if (patchFileCall) {
|
|
170
|
+
const { filePath, patch } = patchFileCall.args;
|
|
171
|
+
console.log('Verification of patch for file:', filePath);
|
|
172
|
+
let updatedContent = false;
|
|
173
|
+
const currentContent = fs.readFileSync(filePath, 'utf-8');
|
|
174
|
+
try {
|
|
175
|
+
updatedContent = diff.applyPatch(currentContent, patch);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
console.log('Error when applying patch', e);
|
|
179
|
+
}
|
|
180
|
+
if (!updatedContent) {
|
|
181
|
+
console.log(`Patch could not be applied for ${filePath}. Retrying without patchFile function.`);
|
|
182
|
+
// Rerun content generation without patchFile function
|
|
183
|
+
partialRequest = [prompt, functionDefs, 'updateFile', file.temperature ?? temperature, file.cheap === true];
|
|
184
|
+
partialResult = await generateContentFn(...partialRequest);
|
|
185
|
+
partialResult = await validateAndRecoverSingleResult(partialRequest, partialResult, messages, generateContentFn);
|
|
186
|
+
const getSourceCodeCall = partialResult.find((call) => call.name === 'getSourceCode');
|
|
187
|
+
assert(!getSourceCodeCall, 'Unexpected getSourceCode: ' + JSON.stringify(getSourceCodeCall));
|
|
188
|
+
assert(!partialResult.find((call) => call.name === 'patchFile'), 'Unexpected patchFile in retry response');
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
console.log('Patch verified successfully');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// add the code gen result to the context, as the subsequent code gen may depend on the result
|
|
195
|
+
prompt.push({ type: 'assistant', functionCalls: partialResult }, {
|
|
196
|
+
type: 'user',
|
|
197
|
+
functionResponses: partialResult.map((call) => ({ name: call.name, call_id: call.id })),
|
|
198
|
+
});
|
|
199
|
+
result.push(...partialResult);
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// This is unexpected, if happens probably means no code updates.
|
|
205
|
+
console.log('Did not receive codegen summary, returning result.');
|
|
206
|
+
return baseResult;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async function validateAndRecoverSingleResult([prompt, functionDefs, requiredFunctionName, temperature, cheap], result, messages, generateContentFn) {
|
|
210
|
+
if (result.length !== 1) {
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
const call = result[0];
|
|
214
|
+
const validatorError = validateFunctionCall(call);
|
|
215
|
+
if (validatorError) {
|
|
216
|
+
console.log('Invalid function call', call, validatorError);
|
|
217
|
+
prompt.push({ type: 'assistant', functionCalls: [call] }, {
|
|
218
|
+
type: 'user',
|
|
219
|
+
text: messages.invalidFunctionCall,
|
|
220
|
+
functionResponses: [
|
|
221
|
+
{
|
|
222
|
+
name: call.name,
|
|
223
|
+
call_id: call.id,
|
|
224
|
+
content: JSON.stringify({ args: call.args, error: validatorError }),
|
|
225
|
+
isError: true,
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
});
|
|
229
|
+
console.log('Trying to recover...');
|
|
230
|
+
if (cheap) {
|
|
231
|
+
console.log('Disabling --cheap for recovery.');
|
|
232
|
+
}
|
|
233
|
+
result = await generateContentFn(prompt, functionDefs, requiredFunctionName, temperature, false);
|
|
234
|
+
console.log('Recover result:', result);
|
|
235
|
+
if (result.length === 1) {
|
|
236
|
+
const recoveryError = validateFunctionCall(result[0]);
|
|
237
|
+
assert(!recoveryError, 'Recovery failed');
|
|
238
|
+
console.log('Recovery was successful');
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
console.log('Unexpected number of function calls', result);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Function to prepare messages for AI services
|
|
248
|
+
*/
|
|
249
|
+
function prepareMessages(prompt) {
|
|
250
|
+
return {
|
|
251
|
+
suggestSourceCode: 'I should provide you with application source code.',
|
|
252
|
+
requestSourceCode: 'Please provide application source code.',
|
|
253
|
+
suggestImageAssets: 'I should also provide you with a summary of application image assets',
|
|
254
|
+
requestImageAssets: 'Please provide summary of application image assets.',
|
|
255
|
+
prompt: prompt +
|
|
256
|
+
'\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.',
|
|
257
|
+
sourceCode: JSON.stringify(getSourceCode()),
|
|
258
|
+
contextSourceCode: (paths) => JSON.stringify(getSourceCode(paths)),
|
|
259
|
+
imageAssets: JSON.stringify(getImageAssets()),
|
|
260
|
+
partialPromptTemplate(path) {
|
|
261
|
+
return `Thank you for providing the summary, now suggest changes for the \`${path}\` file using appropriate tools.`;
|
|
262
|
+
},
|
|
263
|
+
invalidFunctionCall: 'Function call was invalid, please analyze the error and respond with corrected function call.',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async function getUserInput(prompt) {
|
|
267
|
+
const rl = createInterface({
|
|
268
|
+
input: process.stdin,
|
|
269
|
+
output: process.stdout,
|
|
270
|
+
});
|
|
271
|
+
return new Promise((resolve) => {
|
|
272
|
+
rl.question(prompt, (answer) => {
|
|
273
|
+
rl.close();
|
|
274
|
+
resolve(answer);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=prompt-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-service.js","sourceRoot":"","sources":["../../src/prompt/prompt-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '../files/find-files.js';
|