@things-factory/integration-codemind 9.0.0-beta.27 → 9.0.0-beta.29

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 (54) hide show
  1. package/dist-client/bootstrap.d.ts +1 -0
  2. package/dist-client/bootstrap.js +2 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +0 -0
  5. package/dist-client/index.js +2 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/tsconfig.tsbuildinfo +1 -0
  8. package/dist-server/engine/connector/index.d.ts +0 -0
  9. package/dist-server/engine/connector/index.js +1 -0
  10. package/dist-server/engine/connector/index.js.map +1 -0
  11. package/dist-server/engine/index.d.ts +2 -0
  12. package/dist-server/engine/index.js +5 -0
  13. package/dist-server/engine/index.js.map +1 -0
  14. package/dist-server/engine/task/ai-models.d.ts +24 -0
  15. package/dist-server/engine/task/ai-models.js +78 -0
  16. package/dist-server/engine/task/ai-models.js.map +1 -0
  17. package/dist-server/engine/task/ast-parser.d.ts +10 -0
  18. package/dist-server/engine/task/ast-parser.js +50 -0
  19. package/dist-server/engine/task/ast-parser.js.map +1 -0
  20. package/dist-server/engine/task/codemind-ast-analyze.d.ts +1 -0
  21. package/dist-server/engine/task/codemind-ast-analyze.js +68 -0
  22. package/dist-server/engine/task/codemind-ast-analyze.js.map +1 -0
  23. package/dist-server/engine/task/codemind-code-classify.d.ts +1 -0
  24. package/dist-server/engine/task/codemind-code-classify.js +19 -0
  25. package/dist-server/engine/task/codemind-code-classify.js.map +1 -0
  26. package/dist-server/engine/task/codemind-code-compare.d.ts +1 -0
  27. package/dist-server/engine/task/codemind-code-compare.js +23 -0
  28. package/dist-server/engine/task/codemind-code-compare.js.map +1 -0
  29. package/dist-server/engine/task/codemind-code-review.d.ts +1 -0
  30. package/dist-server/engine/task/codemind-code-review.js +19 -0
  31. package/dist-server/engine/task/codemind-code-review.js.map +1 -0
  32. package/dist-server/engine/task/codemind-code-summary.d.ts +1 -0
  33. package/dist-server/engine/task/codemind-code-summary.js +30 -0
  34. package/dist-server/engine/task/codemind-code-summary.js.map +1 -0
  35. package/dist-server/engine/task/codemind-embedding.d.ts +1 -0
  36. package/dist-server/engine/task/codemind-embedding.js +125 -0
  37. package/dist-server/engine/task/codemind-embedding.js.map +1 -0
  38. package/dist-server/engine/task/codemind-refactor-apply.d.ts +1 -0
  39. package/dist-server/engine/task/codemind-refactor-apply.js +33 -0
  40. package/dist-server/engine/task/codemind-refactor-apply.js.map +1 -0
  41. package/dist-server/engine/task/codemind-refactor-suggestion.d.ts +1 -0
  42. package/dist-server/engine/task/codemind-refactor-suggestion.js +19 -0
  43. package/dist-server/engine/task/codemind-refactor-suggestion.js.map +1 -0
  44. package/dist-server/engine/task/embedding.d.ts +1 -0
  45. package/dist-server/engine/task/embedding.js +34 -0
  46. package/dist-server/engine/task/embedding.js.map +1 -0
  47. package/dist-server/engine/task/index.d.ts +7 -0
  48. package/dist-server/engine/task/index.js +10 -0
  49. package/dist-server/engine/task/index.js.map +1 -0
  50. package/dist-server/index.d.ts +1 -0
  51. package/dist-server/index.js +4 -0
  52. package/dist-server/index.js.map +1 -0
  53. package/dist-server/tsconfig.tsbuildinfo +1 -0
  54. package/package.json +3 -3
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const integration_base_1 = require("@things-factory/integration-base");
5
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const utils_1 = require("@things-factory/utils");
8
+ const ast_parser_js_1 = require("./ast-parser.js"); // AST 변환 모듈
9
+ const embedding_js_1 = require("./embedding.js"); // AI 임베딩 모듈
10
+ async function processFile(filePath, results) {
11
+ try {
12
+ console.log(`[DEBUG] Processing file: ${filePath}`);
13
+ const code = await fs_extra_1.default.readFile(filePath, 'utf-8'); // ✅ 비동기적 처리
14
+ // 📢 AST 분석 후 벡터화
15
+ const ast = (0, ast_parser_js_1.parseAst)(code);
16
+ const jsonAst = JSON.stringify(ast);
17
+ const astEmbedding = await (0, embedding_js_1.generateEmbedding)(jsonAst);
18
+ // 📢 원본 코드 자체도 벡터화
19
+ const codeEmbedding = await (0, embedding_js_1.generateEmbedding)(code);
20
+ results.push({ file: filePath, embedding: astEmbedding, type: 'ast' });
21
+ results.push({ file: filePath, embedding: codeEmbedding, type: 'code' });
22
+ }
23
+ catch (error) {
24
+ console.error(`[ERROR] Failed to process file: ${filePath}`, error);
25
+ }
26
+ }
27
+ async function processDirectory(directoryPath, results) {
28
+ try {
29
+ console.log(`[DEBUG] Processing directory: ${directoryPath}`);
30
+ const files = await fs_extra_1.default.readdir(directoryPath); // ✅ 비동기적 처리
31
+ for (const file of files) {
32
+ const fullPath = path_1.default.join(directoryPath, file);
33
+ const stats = await fs_extra_1.default.stat(fullPath); // ✅ 비동기적 처리
34
+ if (stats.isDirectory()) {
35
+ // 🔁 재귀적으로 하위 폴더 비동기 처리
36
+ await processDirectory(fullPath, results);
37
+ }
38
+ else if (stats.isFile() && /\.(js|ts)$/i.test(fullPath)) {
39
+ // ✅ 특정 파일 비동기 처리
40
+ await processFile(fullPath, results);
41
+ }
42
+ }
43
+ }
44
+ catch (error) {
45
+ console.error(`[ERROR] Failed to process directory: ${directoryPath}`, error);
46
+ }
47
+ }
48
+ async function codemindEmbedding(step, { data }) {
49
+ const { filePath, content, astDataAccessor, searchTextAccessor } = step.params;
50
+ // ✅ 1. AST 데이터 접근
51
+ let astData = (0, utils_1.access)(astDataAccessor, data);
52
+ let searchText = (0, utils_1.access)(searchTextAccessor, data);
53
+ if (!astData && !filePath && !content && !searchText) {
54
+ throw new Error(`Either "astData", "filePath", "content", or "searchText" must be provided.`);
55
+ }
56
+ let results = [];
57
+ // ✅ 2. AST 데이터 벡터화
58
+ if (astData && Array.isArray(astData) && astData.length > 0) {
59
+ console.log(`[DEBUG] Using AST data for embedding`);
60
+ for (const fileData of astData) {
61
+ if (!fileData.ast || !fileData.file) {
62
+ console.warn(`[WARN] Skipping invalid AST data:`, fileData);
63
+ continue;
64
+ }
65
+ const jsonAst = JSON.stringify(fileData.ast);
66
+ const astEmbedding = await (0, embedding_js_1.generateEmbedding)(jsonAst);
67
+ results.push({ file: fileData.file, embedding: astEmbedding, type: 'ast' });
68
+ }
69
+ }
70
+ // ✅ 3. 파일 또는 디렉토리 벡터화
71
+ if (filePath) {
72
+ if (!fs_extra_1.default.existsSync(filePath)) {
73
+ throw new Error(`File or directory does not exist: ${filePath}`);
74
+ }
75
+ const stats = fs_extra_1.default.statSync(filePath);
76
+ if (stats.isDirectory()) {
77
+ // 🔁 **디렉토리 내부 파일들 처리**
78
+ await processDirectory(filePath, results);
79
+ }
80
+ else if (stats.isFile()) {
81
+ // ✅ **단일 파일 처리**
82
+ await processFile(filePath, results);
83
+ }
84
+ }
85
+ // ✅ 4. 직접 입력된 코드 벡터화
86
+ if (content) {
87
+ try {
88
+ console.log(`[DEBUG] Processing inline content`);
89
+ // 📢 **AST 분석 후 벡터화**
90
+ const ast = (0, ast_parser_js_1.parseAst)(content);
91
+ const jsonAst = JSON.stringify(ast);
92
+ const astEmbedding = await (0, embedding_js_1.generateEmbedding)(jsonAst);
93
+ // 📢 **원본 코드 벡터화**
94
+ const codeEmbedding = await (0, embedding_js_1.generateEmbedding)(content);
95
+ results.push({ file: 'inline-content', embedding: astEmbedding, type: 'ast' });
96
+ results.push({ file: 'inline-content', embedding: codeEmbedding, type: 'code' });
97
+ }
98
+ catch (error) {
99
+ console.error(`[ERROR] Failed to process content`, error);
100
+ }
101
+ }
102
+ // ✅ 5. 검색어(searchText) 벡터화
103
+ if (searchText) {
104
+ try {
105
+ console.log(`[DEBUG] Processing searchText: "${searchText}"`);
106
+ const queryEmbedding = await (0, embedding_js_1.generateEmbedding)(searchText);
107
+ results.push({ file: 'search-query', embedding: queryEmbedding, type: 'query' });
108
+ }
109
+ catch (error) {
110
+ console.error(`[ERROR] Failed to process searchText`, error);
111
+ }
112
+ }
113
+ return { data: results };
114
+ }
115
+ // ✅ 파라미터 정의
116
+ codemindEmbedding.parameterSpec = [
117
+ { type: 'string', name: 'astDataAccessor', label: 'codemind.ast-data-accessor' },
118
+ { type: 'string', name: 'filePath', label: 'codemind.filepath' },
119
+ { type: 'string', name: 'content', label: 'codemind.content' },
120
+ { type: 'string', name: 'searchTextAccessor', label: 'codemind.search-text-accessor' } // ✅ 검색어 추가 지원
121
+ ];
122
+ codemindEmbedding.connectorFree = true;
123
+ // ✅ 태스크 등록
124
+ integration_base_1.TaskRegistry.registerTaskHandler('codemind-embedding', codemindEmbedding);
125
+ //# sourceMappingURL=codemind-embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemind-embedding.js","sourceRoot":"","sources":["../../../server/engine/task/codemind-embedding.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, TaskRegistry } from '@things-factory/integration-base'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport { access } from '@things-factory/utils'\nimport { parseAst } from './ast-parser.js' // AST 변환 모듈\nimport { generateEmbedding } from './embedding.js' // AI 임베딩 모듈\n\nasync function processFile(filePath, results) {\n try {\n console.log(`[DEBUG] Processing file: ${filePath}`)\n const code = await fs.readFile(filePath, 'utf-8') // ✅ 비동기적 처리\n\n // 📢 AST 분석 후 벡터화\n const ast = parseAst(code)\n const jsonAst = JSON.stringify(ast)\n const astEmbedding = await generateEmbedding(jsonAst)\n\n // 📢 원본 코드 자체도 벡터화\n const codeEmbedding = await generateEmbedding(code)\n\n results.push({ file: filePath, embedding: astEmbedding, type: 'ast' })\n results.push({ file: filePath, embedding: codeEmbedding, type: 'code' })\n } catch (error) {\n console.error(`[ERROR] Failed to process file: ${filePath}`, error)\n }\n}\n\nasync function processDirectory(directoryPath, results) {\n try {\n console.log(`[DEBUG] Processing directory: ${directoryPath}`)\n const files = await fs.readdir(directoryPath) // ✅ 비동기적 처리\n\n for (const file of files) {\n const fullPath = path.join(directoryPath, file)\n const stats = await fs.stat(fullPath) // ✅ 비동기적 처리\n\n if (stats.isDirectory()) {\n // 🔁 재귀적으로 하위 폴더 비동기 처리\n await processDirectory(fullPath, results)\n } else if (stats.isFile() && /\\.(js|ts)$/i.test(fullPath)) {\n // ✅ 특정 파일 비동기 처리\n await processFile(fullPath, results)\n }\n }\n } catch (error) {\n console.error(`[ERROR] Failed to process directory: ${directoryPath}`, error)\n }\n}\n\nasync function codemindEmbedding(step, { data }: Context) {\n const { filePath, content, astDataAccessor, searchTextAccessor } = step.params\n\n // ✅ 1. AST 데이터 접근\n let astData = access(astDataAccessor, data)\n let searchText = access(searchTextAccessor, data)\n\n if (!astData && !filePath && !content && !searchText) {\n throw new Error(`Either \"astData\", \"filePath\", \"content\", or \"searchText\" must be provided.`)\n }\n\n let results = []\n\n // ✅ 2. AST 데이터 벡터화\n if (astData && Array.isArray(astData) && astData.length > 0) {\n console.log(`[DEBUG] Using AST data for embedding`)\n for (const fileData of astData) {\n if (!fileData.ast || !fileData.file) {\n console.warn(`[WARN] Skipping invalid AST data:`, fileData)\n continue\n }\n const jsonAst = JSON.stringify(fileData.ast)\n const astEmbedding = await generateEmbedding(jsonAst)\n results.push({ file: fileData.file, embedding: astEmbedding, type: 'ast' })\n }\n }\n\n // ✅ 3. 파일 또는 디렉토리 벡터화\n if (filePath) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File or directory does not exist: ${filePath}`)\n }\n\n const stats = fs.statSync(filePath)\n\n if (stats.isDirectory()) {\n // 🔁 **디렉토리 내부 파일들 처리**\n await processDirectory(filePath, results)\n } else if (stats.isFile()) {\n // ✅ **단일 파일 처리**\n await processFile(filePath, results)\n }\n }\n\n // ✅ 4. 직접 입력된 코드 벡터화\n if (content) {\n try {\n console.log(`[DEBUG] Processing inline content`)\n // 📢 **AST 분석 후 벡터화**\n const ast = parseAst(content)\n const jsonAst = JSON.stringify(ast)\n const astEmbedding = await generateEmbedding(jsonAst)\n\n // 📢 **원본 코드 벡터화**\n const codeEmbedding = await generateEmbedding(content)\n\n results.push({ file: 'inline-content', embedding: astEmbedding, type: 'ast' })\n results.push({ file: 'inline-content', embedding: codeEmbedding, type: 'code' })\n } catch (error) {\n console.error(`[ERROR] Failed to process content`, error)\n }\n }\n\n // ✅ 5. 검색어(searchText) 벡터화\n if (searchText) {\n try {\n console.log(`[DEBUG] Processing searchText: \"${searchText}\"`)\n const queryEmbedding = await generateEmbedding(searchText)\n results.push({ file: 'search-query', embedding: queryEmbedding, type: 'query' })\n } catch (error) {\n console.error(`[ERROR] Failed to process searchText`, error)\n }\n }\n\n return { data: results }\n}\n\n// ✅ 파라미터 정의\ncodemindEmbedding.parameterSpec = [\n { type: 'string', name: 'astDataAccessor', label: 'codemind.ast-data-accessor' },\n { type: 'string', name: 'filePath', label: 'codemind.filepath' },\n { type: 'string', name: 'content', label: 'codemind.content' },\n { type: 'string', name: 'searchTextAccessor', label: 'codemind.search-text-accessor' } // ✅ 검색어 추가 지원\n]\n\ncodemindEmbedding.connectorFree = true\n\n// ✅ 태스크 등록\nTaskRegistry.registerTaskHandler('codemind-embedding', codemindEmbedding)\n"]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const integration_base_1 = require("@things-factory/integration-base");
5
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const diff_1 = require("diff");
8
+ async function codemindRefactorApply(step, { data }) {
9
+ const { filePath, newCode, applyDirectly = true } = step.params;
10
+ if (!filePath || !newCode) {
11
+ throw new Error(`filePath와 newCode는 필수 파라미터입니다.`);
12
+ }
13
+ const fullPath = path_1.default.resolve(filePath);
14
+ if (!fs_extra_1.default.existsSync(fullPath)) {
15
+ throw new Error(`파일이 존재하지 않습니다: ${fullPath}`);
16
+ }
17
+ // ✅ 기존 코드 읽기
18
+ const originalCode = fs_extra_1.default.readFileSync(fullPath, 'utf-8');
19
+ // ✅ 코드 차이점 분석 (diff)
20
+ const patch = (0, diff_1.diffLines)(originalCode, newCode);
21
+ const diffText = patch
22
+ .map(change => (change.added ? `+ ${change.value}` : change.removed ? `- ${change.value}` : ` ${change.value}`))
23
+ .join('\n');
24
+ // ✅ 자동 적용 여부 확인
25
+ if (applyDirectly) {
26
+ // ✅ AI가 추천한 코드로 기존 파일 업데이트
27
+ fs_extra_1.default.writeFileSync(fullPath, newCode);
28
+ }
29
+ return { data: { success: true, filePath, diff: diffText } };
30
+ }
31
+ // ✅ 태스크 등록
32
+ integration_base_1.TaskRegistry.registerTaskHandler('codemind-refactor-apply', codemindRefactorApply);
33
+ //# sourceMappingURL=codemind-refactor-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemind-refactor-apply.js","sourceRoot":"","sources":["../../../server/engine/task/codemind-refactor-apply.ts"],"names":[],"mappings":";;;AAAA,uEAAwE;AACxE,gEAAyB;AACzB,wDAAuB;AACvB,+BAA4C;AAE5C,KAAK,UAAU,qBAAqB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAW;IAC1D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;IAE/D,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEvC,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,aAAa;IACb,MAAM,YAAY,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEvD,qBAAqB;IACrB,MAAM,KAAK,GAAG,IAAA,gBAAS,EAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,KAAK;SACnB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;SAChH,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,gBAAgB;IAChB,IAAI,aAAa,EAAE,CAAC;QAClB,2BAA2B;QAC3B,kBAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAA;AAC9D,CAAC;AAED,WAAW;AACX,+BAAY,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAA","sourcesContent":["import { Context, TaskRegistry } from '@things-factory/integration-base'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport { diffLines, applyPatch } from 'diff'\n\nasync function codemindRefactorApply(step, { data }: Context) {\n const { filePath, newCode, applyDirectly = true } = step.params\n\n if (!filePath || !newCode) {\n throw new Error(`filePath와 newCode는 필수 파라미터입니다.`)\n }\n\n const fullPath = path.resolve(filePath)\n\n if (!fs.existsSync(fullPath)) {\n throw new Error(`파일이 존재하지 않습니다: ${fullPath}`)\n }\n\n // ✅ 기존 코드 읽기\n const originalCode = fs.readFileSync(fullPath, 'utf-8')\n\n // ✅ 코드 차이점 분석 (diff)\n const patch = diffLines(originalCode, newCode)\n const diffText = patch\n .map(change => (change.added ? `+ ${change.value}` : change.removed ? `- ${change.value}` : ` ${change.value}`))\n .join('\\n')\n\n // ✅ 자동 적용 여부 확인\n if (applyDirectly) {\n // ✅ AI가 추천한 코드로 기존 파일 업데이트\n fs.writeFileSync(fullPath, newCode)\n }\n\n return { data: { success: true, filePath, diff: diffText } }\n}\n\n// ✅ 태스크 등록\nTaskRegistry.registerTaskHandler('codemind-refactor-apply', codemindRefactorApply)\n"]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const integration_base_1 = require("@things-factory/integration-base");
5
+ const ai_models_js_1 = require("./ai-models.js"); // AI 기반 코드 리팩토링 추천
6
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
7
+ async function codemindRefactorSuggestion(step, { data }) {
8
+ const { filePath, content } = step.params;
9
+ if (!filePath && !content) {
10
+ throw new Error(`Either "filePath" or "content" must be provided.`);
11
+ }
12
+ let code = content || fs_extra_1.default.readFileSync(filePath, 'utf-8');
13
+ const suggestions = await (0, ai_models_js_1.generateRefactorSuggestions)(code); // AI 리팩토링 실행
14
+ return { data: suggestions };
15
+ }
16
+ codemindRefactorSuggestion.connectorFree = true;
17
+ // ✅ 태스크 등록
18
+ integration_base_1.TaskRegistry.registerTaskHandler('codemind-refactor-suggestion', codemindRefactorSuggestion);
19
+ //# sourceMappingURL=codemind-refactor-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codemind-refactor-suggestion.js","sourceRoot":"","sources":["../../../server/engine/task/codemind-refactor-suggestion.ts"],"names":[],"mappings":";;;AAAA,uEAAwE;AACxE,iDAA4D,CAAC,mBAAmB;AAChF,gEAAyB;AAEzB,KAAK,UAAU,0BAA0B,CAAC,IAAI,EAAE,EAAE,IAAI,EAAW;IAC/D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;IAEzC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACrE,CAAC;IAED,IAAI,IAAI,GAAG,OAAO,IAAI,kBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,WAAW,GAAG,MAAM,IAAA,0CAA2B,EAAC,IAAI,CAAC,CAAA,CAAC,aAAa;IAEzE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;AAC9B,CAAC;AAED,0BAA0B,CAAC,aAAa,GAAG,IAAI,CAAA;AAE/C,WAAW;AACX,+BAAY,CAAC,mBAAmB,CAAC,8BAA8B,EAAE,0BAA0B,CAAC,CAAA","sourcesContent":["import { Context, TaskRegistry } from '@things-factory/integration-base'\nimport { generateRefactorSuggestions } from './ai-models.js' // AI 기반 코드 리팩토링 추천\nimport fs from 'fs-extra'\n\nasync function codemindRefactorSuggestion(step, { data }: Context) {\n const { filePath, content } = step.params\n\n if (!filePath && !content) {\n throw new Error(`Either \"filePath\" or \"content\" must be provided.`)\n }\n\n let code = content || fs.readFileSync(filePath, 'utf-8')\n const suggestions = await generateRefactorSuggestions(code) // AI 리팩토링 실행\n\n return { data: suggestions }\n}\n\ncodemindRefactorSuggestion.connectorFree = true\n\n// ✅ 태스크 등록\nTaskRegistry.registerTaskHandler('codemind-refactor-suggestion', codemindRefactorSuggestion)\n"]}
@@ -0,0 +1 @@
1
+ export declare function generateEmbedding(code: string): Promise<number[]>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateEmbedding = generateEmbedding;
4
+ class EmbeddingGenerator {
5
+ constructor(modelName = 'Xenova/all-MiniLM-L6-v2') {
6
+ this.modelName = modelName;
7
+ }
8
+ // 모델 초기화
9
+ async initialize() {
10
+ /*
11
+ @xenova/transformers 가 ESM 모듈이므로, 동적 import(..)를 해야함.
12
+ 그런데, tsc 나 webpack 이 컴파일하면서 require(..)로 변경하므로 이를 방지할 수 있도록 eval로 감싼다.
13
+ */
14
+ const { pipeline } = await eval('import("@xenova/transformers")');
15
+ this.model = await pipeline('feature-extraction', this.modelName);
16
+ }
17
+ // 코드 임베딩 생성
18
+ async generateEmbedding(code) {
19
+ if (!this.model) {
20
+ await this.initialize();
21
+ }
22
+ // 코드를 입력으로 사용하여 임베딩 생성
23
+ const output = await this.model(code, { pooling: 'mean' });
24
+ const embedding = Array.from(output.data); // Tensor를 배열로 변환
25
+ return embedding;
26
+ }
27
+ }
28
+ // 싱글톤 인스턴스 생성
29
+ const embeddingGenerator = new EmbeddingGenerator();
30
+ // 외부에서 사용할 수 있도록 export
31
+ async function generateEmbedding(code) {
32
+ return await embeddingGenerator.generateEmbedding(code);
33
+ }
34
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../server/engine/task/embedding.ts"],"names":[],"mappings":";;AAqCA,8CAEC;AAvCD,MAAM,kBAAkB;IAKtB,YAAY,YAAoB,yBAAyB;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,SAAS;IACT,KAAK,CAAC,UAAU;QACd;;;UAGE;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,gCAAgC,CAAC,CAAA;QACjE,IAAI,CAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACnE,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1D,MAAM,SAAS,GAAa,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAC,iBAAiB;QAErE,OAAO,SAAS,CAAA;IAClB,CAAC;CACF;AAED,cAAc;AACd,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAA;AAEnD,wBAAwB;AACjB,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,OAAO,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACzD,CAAC","sourcesContent":["class EmbeddingGenerator {\n private model: any\n private tokenizer: any\n private modelName: string\n\n constructor(modelName: string = 'Xenova/all-MiniLM-L6-v2') {\n this.modelName = modelName\n }\n\n // 모델 초기화\n async initialize() {\n /* \n @xenova/transformers 가 ESM 모듈이므로, 동적 import(..)를 해야함.\n 그런데, tsc 나 webpack 이 컴파일하면서 require(..)로 변경하므로 이를 방지할 수 있도록 eval로 감싼다.\n */\n const { pipeline } = await eval('import(\"@xenova/transformers\")')\n this.model = await pipeline('feature-extraction', this.modelName)\n }\n\n // 코드 임베딩 생성\n async generateEmbedding(code: string): Promise<number[]> {\n if (!this.model) {\n await this.initialize()\n }\n\n // 코드를 입력으로 사용하여 임베딩 생성\n const output = await this.model(code, { pooling: 'mean' })\n const embedding: number[] = Array.from(output.data) // Tensor를 배열로 변환\n\n return embedding\n }\n}\n\n// 싱글톤 인스턴스 생성\nconst embeddingGenerator = new EmbeddingGenerator()\n\n// 외부에서 사용할 수 있도록 export\nexport async function generateEmbedding(code: string): Promise<number[]> {\n return await embeddingGenerator.generateEmbedding(code)\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import './codemind-ast-analyze.js';
2
+ import './codemind-code-classify.js';
3
+ import './codemind-code-compare.js';
4
+ import './codemind-code-review.js';
5
+ import './codemind-code-summary.js';
6
+ import './codemind-embedding.js';
7
+ import './codemind-refactor-suggestion.js';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./codemind-ast-analyze.js");
4
+ require("./codemind-code-classify.js");
5
+ require("./codemind-code-compare.js");
6
+ require("./codemind-code-review.js");
7
+ require("./codemind-code-summary.js");
8
+ require("./codemind-embedding.js");
9
+ require("./codemind-refactor-suggestion.js");
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,qCAAkC;AAClC,uCAAoC;AACpC,sCAAmC;AACnC,qCAAkC;AAClC,sCAAmC;AACnC,mCAAgC;AAChC,6CAA0C","sourcesContent":["import './codemind-ast-analyze.js'\nimport './codemind-code-classify.js'\nimport './codemind-code-compare.js'\nimport './codemind-code-review.js'\nimport './codemind-code-summary.js'\nimport './codemind-embedding.js'\nimport './codemind-refactor-suggestion.js'\n"]}
@@ -0,0 +1 @@
1
+ import './engine/index.js';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./engine/index.js");
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;AAAA,6BAA0B","sourcesContent":["import './engine/index.js'\n"]}