@mathrunet/masamune_firebase_workflow_marketing 3.8.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.
Files changed (146) hide show
  1. package/CHANGELOG.md +361 -0
  2. package/LICENSE +21 -0
  3. package/README.md +70 -0
  4. package/assets/fonts/NotoSans-Bold.ttf +1439 -0
  5. package/assets/fonts/NotoSans-Regular.ttf +1439 -0
  6. package/assets/fonts/NotoSans.ttf +0 -0
  7. package/assets/fonts/NotoSansJP-Bold.ttf +0 -0
  8. package/assets/fonts/NotoSansJP-Regular.ttf +0 -0
  9. package/assets/fonts/NotoSansKR-Bold.ttf +1439 -0
  10. package/assets/fonts/NotoSansKR-Regular.ttf +1439 -0
  11. package/assets/fonts/NotoSansKR.ttf +0 -0
  12. package/assets/fonts/NotoSansSC-Bold.ttf +1439 -0
  13. package/assets/fonts/NotoSansSC-Regular.ttf +1439 -0
  14. package/assets/fonts/NotoSansSC.ttf +0 -0
  15. package/dist/clients/app_store_client.d.ts +54 -0
  16. package/dist/clients/app_store_client.js +280 -0
  17. package/dist/clients/app_store_client.js.map +1 -0
  18. package/dist/clients/firebase_analytics_client.d.ts +67 -0
  19. package/dist/clients/firebase_analytics_client.js +411 -0
  20. package/dist/clients/firebase_analytics_client.js.map +1 -0
  21. package/dist/clients/github_content_client.d.ts +83 -0
  22. package/dist/clients/github_content_client.js +443 -0
  23. package/dist/clients/github_content_client.js.map +1 -0
  24. package/dist/clients/google_play_client.d.ts +49 -0
  25. package/dist/clients/google_play_client.js +275 -0
  26. package/dist/clients/google_play_client.js.map +1 -0
  27. package/dist/functions/analyze_github_init.d.ts +37 -0
  28. package/dist/functions/analyze_github_init.js +299 -0
  29. package/dist/functions/analyze_github_init.js.map +1 -0
  30. package/dist/functions/analyze_github_process.d.ts +25 -0
  31. package/dist/functions/analyze_github_process.js +268 -0
  32. package/dist/functions/analyze_github_process.js.map +1 -0
  33. package/dist/functions/analyze_github_summary.d.ts +32 -0
  34. package/dist/functions/analyze_github_summary.js +270 -0
  35. package/dist/functions/analyze_github_summary.js.map +1 -0
  36. package/dist/functions/analyze_market_research.d.ts +40 -0
  37. package/dist/functions/analyze_market_research.js +346 -0
  38. package/dist/functions/analyze_market_research.js.map +1 -0
  39. package/dist/functions/analyze_marketing_data.d.ts +96 -0
  40. package/dist/functions/analyze_marketing_data.js +990 -0
  41. package/dist/functions/analyze_marketing_data.js.map +1 -0
  42. package/dist/functions/collect_from_app_store.d.ts +25 -0
  43. package/dist/functions/collect_from_app_store.js +148 -0
  44. package/dist/functions/collect_from_app_store.js.map +1 -0
  45. package/dist/functions/collect_from_firebase_analytics.d.ts +25 -0
  46. package/dist/functions/collect_from_firebase_analytics.js +142 -0
  47. package/dist/functions/collect_from_firebase_analytics.js.map +1 -0
  48. package/dist/functions/collect_from_google_play_console.d.ts +25 -0
  49. package/dist/functions/collect_from_google_play_console.js +142 -0
  50. package/dist/functions/collect_from_google_play_console.js.map +1 -0
  51. package/dist/functions/generate_marketing_markdown.d.ts +89 -0
  52. package/dist/functions/generate_marketing_markdown.js +653 -0
  53. package/dist/functions/generate_marketing_markdown.js.map +1 -0
  54. package/dist/functions/generate_marketing_pdf.d.ts +25 -0
  55. package/dist/functions/generate_marketing_pdf.js +175 -0
  56. package/dist/functions/generate_marketing_pdf.js.map +1 -0
  57. package/dist/functions/research_market.d.ts +56 -0
  58. package/dist/functions/research_market.js +434 -0
  59. package/dist/functions/research_market.js.map +1 -0
  60. package/dist/functions.d.ts +571 -0
  61. package/dist/functions.js +648 -0
  62. package/dist/functions.js.map +1 -0
  63. package/dist/index.d.ts +13 -0
  64. package/dist/index.js +30 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/locales/de_DE.d.ts +5 -0
  67. package/dist/locales/de_DE.js +111 -0
  68. package/dist/locales/de_DE.js.map +1 -0
  69. package/dist/locales/en.d.ts +5 -0
  70. package/dist/locales/en.js +111 -0
  71. package/dist/locales/en.js.map +1 -0
  72. package/dist/locales/es_ES.d.ts +5 -0
  73. package/dist/locales/es_ES.js +111 -0
  74. package/dist/locales/es_ES.js.map +1 -0
  75. package/dist/locales/fr_FR.d.ts +5 -0
  76. package/dist/locales/fr_FR.js +111 -0
  77. package/dist/locales/fr_FR.js.map +1 -0
  78. package/dist/locales/id_ID.d.ts +5 -0
  79. package/dist/locales/id_ID.js +111 -0
  80. package/dist/locales/id_ID.js.map +1 -0
  81. package/dist/locales/index.d.ts +59 -0
  82. package/dist/locales/index.js +155 -0
  83. package/dist/locales/index.js.map +1 -0
  84. package/dist/locales/ja.d.ts +5 -0
  85. package/dist/locales/ja.js +111 -0
  86. package/dist/locales/ja.js.map +1 -0
  87. package/dist/locales/ko_KR.d.ts +5 -0
  88. package/dist/locales/ko_KR.js +111 -0
  89. package/dist/locales/ko_KR.js.map +1 -0
  90. package/dist/locales/pt_PT.d.ts +5 -0
  91. package/dist/locales/pt_PT.js +111 -0
  92. package/dist/locales/pt_PT.js.map +1 -0
  93. package/dist/locales/ru_RU.d.ts +5 -0
  94. package/dist/locales/ru_RU.js +111 -0
  95. package/dist/locales/ru_RU.js.map +1 -0
  96. package/dist/locales/types.d.ts +105 -0
  97. package/dist/locales/types.js +8 -0
  98. package/dist/locales/types.js.map +1 -0
  99. package/dist/locales/zh_CN.d.ts +5 -0
  100. package/dist/locales/zh_CN.js +111 -0
  101. package/dist/locales/zh_CN.js.map +1 -0
  102. package/dist/models/app_store_data.d.ts +87 -0
  103. package/dist/models/app_store_data.js +8 -0
  104. package/dist/models/app_store_data.js.map +1 -0
  105. package/dist/models/chart_data.d.ts +104 -0
  106. package/dist/models/chart_data.js +8 -0
  107. package/dist/models/chart_data.js.map +1 -0
  108. package/dist/models/common.d.ts +42 -0
  109. package/dist/models/common.js +8 -0
  110. package/dist/models/common.js.map +1 -0
  111. package/dist/models/firebase_analytics_data.d.ts +134 -0
  112. package/dist/models/firebase_analytics_data.js +8 -0
  113. package/dist/models/firebase_analytics_data.js.map +1 -0
  114. package/dist/models/github_analysis_data.d.ts +266 -0
  115. package/dist/models/github_analysis_data.js +101 -0
  116. package/dist/models/github_analysis_data.js.map +1 -0
  117. package/dist/models/google_play_data.d.ts +115 -0
  118. package/dist/models/google_play_data.js +8 -0
  119. package/dist/models/google_play_data.js.map +1 -0
  120. package/dist/models/index.d.ts +14 -0
  121. package/dist/models/index.js +36 -0
  122. package/dist/models/index.js.map +1 -0
  123. package/dist/models/market_research_data.d.ts +259 -0
  124. package/dist/models/market_research_data.js +8 -0
  125. package/dist/models/market_research_data.js.map +1 -0
  126. package/dist/models/marketing_analysis_data.d.ts +200 -0
  127. package/dist/models/marketing_analysis_data.js +8 -0
  128. package/dist/models/marketing_analysis_data.js.map +1 -0
  129. package/dist/models/pdf_data.d.ts +112 -0
  130. package/dist/models/pdf_data.js +8 -0
  131. package/dist/models/pdf_data.js.map +1 -0
  132. package/dist/services/chart_service.d.ts +54 -0
  133. package/dist/services/chart_service.js +436 -0
  134. package/dist/services/chart_service.js.map +1 -0
  135. package/dist/services/github_analysis_service.d.ts +73 -0
  136. package/dist/services/github_analysis_service.js +488 -0
  137. package/dist/services/github_analysis_service.js.map +1 -0
  138. package/dist/services/pdf_service.d.ts +112 -0
  139. package/dist/services/pdf_service.js +1397 -0
  140. package/dist/services/pdf_service.js.map +1 -0
  141. package/dist/utils/github_analysis_storage.d.ts +88 -0
  142. package/dist/utils/github_analysis_storage.js +154 -0
  143. package/dist/utils/github_analysis_storage.js.map +1 -0
  144. package/package.json +64 -0
  145. package/scripts/cleanup_test_data.ts +304 -0
  146. package/scripts/list_test_data.ts +85 -0
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Analysis Process Function
4
+ *
5
+ * Processes a folder batch:
6
+ * 1. Reads all files in the folder from GitHub
7
+ * 2. Generates AI summaries for all files + folder in one call
8
+ * 3. Caches summaries in Storage JSON
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.AnalyzeGitHubProcess = void 0;
45
+ const masamune_firebase_workflow_1 = require("@mathrunet/masamune_firebase_workflow");
46
+ const admin = __importStar(require("firebase-admin"));
47
+ const github_content_client_1 = require("../clients/github_content_client");
48
+ const github_analysis_service_1 = require("../services/github_analysis_service");
49
+ const github_analysis_storage_1 = require("../utils/github_analysis_storage");
50
+ require("@mathrunet/masamune");
51
+ /**
52
+ * A function for processing a batch of GitHub files.
53
+ *
54
+ * GitHubファイルのバッチを処理するためのFunction。
55
+ */
56
+ class AnalyzeGitHubProcess extends masamune_firebase_workflow_1.WorkflowProcessFunctionBase {
57
+ /**
58
+ * The ID of the function.
59
+ */
60
+ id = "analyze_github_process";
61
+ /**
62
+ * Process the batch.
63
+ */
64
+ async process(context) {
65
+ const action = context.action;
66
+ const command = action.command;
67
+ const githubRepository = command.data?.githubRepository;
68
+ const batchIndex = command.data?.batchIndex;
69
+ if (!githubRepository) {
70
+ console.error("AnalyzeGitHubProcess: No githubRepository specified");
71
+ return {
72
+ ...action,
73
+ results: {
74
+ githubAnalysisProcess: {
75
+ error: "No githubRepository specified",
76
+ },
77
+ },
78
+ };
79
+ }
80
+ if (batchIndex === undefined) {
81
+ console.error("AnalyzeGitHubProcess: No batchIndex specified");
82
+ return {
83
+ ...action,
84
+ results: {
85
+ githubAnalysisProcess: {
86
+ error: "No batchIndex specified",
87
+ },
88
+ },
89
+ };
90
+ }
91
+ // Get project reference for GitHub token
92
+ const projectRef = action.project;
93
+ if (!projectRef) {
94
+ console.error("AnalyzeGitHubProcess: No project reference");
95
+ return {
96
+ ...action,
97
+ results: {
98
+ githubAnalysisProcess: {
99
+ error: "No project reference",
100
+ },
101
+ },
102
+ };
103
+ }
104
+ // Auto-initialize Firebase Admin if needed
105
+ if (admin.apps.length === 0) {
106
+ admin.initializeApp();
107
+ }
108
+ const projectId = projectRef.id;
109
+ try {
110
+ // 1. Load analysis data from Storage
111
+ const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
112
+ if (!analysisData) {
113
+ throw new Error("Analysis data not found. Run init first.");
114
+ }
115
+ const state = analysisData.state;
116
+ // 2. Get folder batch for this index
117
+ const folderBatches = state.folderBatches || [];
118
+ if (batchIndex >= folderBatches.length) {
119
+ console.warn(`AnalyzeGitHubProcess: Batch ${batchIndex} out of range (${folderBatches.length} batches)`);
120
+ return {
121
+ ...action,
122
+ results: {
123
+ githubAnalysisProcess: {
124
+ batchIndex: batchIndex,
125
+ filesProcessed: 0,
126
+ skipped: true,
127
+ },
128
+ },
129
+ };
130
+ }
131
+ const folderBatch = folderBatches[batchIndex];
132
+ const folderPath = folderBatch.folderPath;
133
+ const filesToProcess = folderBatch.files;
134
+ console.log(`AnalyzeGitHubProcess: Processing folder "${folderPath || "(root)"}" with ${filesToProcess.length} files`);
135
+ // 3. Check if already processed
136
+ const folderKey = folderPath || "_root";
137
+ if (analysisData.folders[folderKey]) {
138
+ console.log(`AnalyzeGitHubProcess: Folder ${folderPath} already processed, skipping`);
139
+ return {
140
+ ...action,
141
+ results: {
142
+ githubAnalysisProcess: {
143
+ batchIndex: batchIndex,
144
+ folderPath: folderPath,
145
+ filesProcessed: 0,
146
+ skipped: true,
147
+ },
148
+ },
149
+ };
150
+ }
151
+ // 4. Get GitHub token and locale from project
152
+ const projectDoc = await projectRef.load();
153
+ const projectData = projectDoc?.data();
154
+ const githubToken = projectData?.githubPersonalAccessToken;
155
+ const projectLocale = projectData?.locale;
156
+ // Extract locale string
157
+ const locale = typeof projectLocale === "object" && projectLocale
158
+ ? projectLocale["@language"]
159
+ : projectLocale;
160
+ if (!githubToken) {
161
+ throw new Error("No GitHub token in project");
162
+ }
163
+ // 5. Initialize clients
164
+ const githubClient = new github_content_client_1.GitHubContentClient({
165
+ token: githubToken,
166
+ repo: githubRepository,
167
+ });
168
+ const gcpProjectId = process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT;
169
+ if (!gcpProjectId) {
170
+ throw new Error("No GCP project ID found");
171
+ }
172
+ const analysisService = new github_analysis_service_1.GitHubAnalysisService({
173
+ projectId: gcpProjectId,
174
+ locale: locale,
175
+ });
176
+ // 6. Load all file contents in parallel
177
+ console.log(`AnalyzeGitHubProcess: Loading ${filesToProcess.length} files...`);
178
+ const fileContents = [];
179
+ await Promise.all(filesToProcess.map(async (filePath) => {
180
+ try {
181
+ const content = await githubClient.getFileContent(filePath);
182
+ fileContents.push({ path: filePath, content });
183
+ }
184
+ catch (err) {
185
+ console.warn(`AnalyzeGitHubProcess: Failed to read ${filePath}: ${err.message}`);
186
+ // Save error entry
187
+ analysisData.files[filePath] = {
188
+ path: filePath,
189
+ summary: `Error reading file: ${err.message}`,
190
+ analyzedAt: new Date().toISOString(),
191
+ };
192
+ }
193
+ }));
194
+ console.log(`AnalyzeGitHubProcess: Loaded ${fileContents.length}/${filesToProcess.length} files`);
195
+ // 7. Analyze folder batch with single AI call
196
+ let totalInputTokens = 0;
197
+ let totalOutputTokens = 0;
198
+ if (fileContents.length > 0) {
199
+ console.log(`AnalyzeGitHubProcess: Analyzing folder "${folderPath || "(root)"}" with AI...`);
200
+ const result = await analysisService.analyzeFolderBatch(fileContents, folderPath, state.framework?.framework || "unknown");
201
+ totalInputTokens = result.inputTokens;
202
+ totalOutputTokens = result.outputTokens;
203
+ // 8. Save file summaries to memory
204
+ for (const fileSummary of result.data.files) {
205
+ const cacheEntry = {
206
+ path: fileSummary.path,
207
+ language: fileSummary.language,
208
+ summary: fileSummary.summary,
209
+ features: fileSummary.features,
210
+ analyzedAt: fileSummary.analyzedAt.toISOString(),
211
+ };
212
+ analysisData.files[fileSummary.path] = cacheEntry;
213
+ }
214
+ // 9. Save folder summary to memory
215
+ analysisData.folders[folderKey] = {
216
+ path: folderPath,
217
+ summary: result.data.folder.summary,
218
+ features: result.data.folder.features,
219
+ fileCount: result.data.folder.fileCount,
220
+ analyzedAt: result.data.folder.analyzedAt.toISOString(),
221
+ };
222
+ console.log(`AnalyzeGitHubProcess: Folder "${folderPath || "(root)"}" analyzed successfully`);
223
+ }
224
+ // 10. Update state
225
+ const newProcessedCount = state.processedFiles + filesToProcess.length;
226
+ analysisData.state.processedFiles = newProcessedCount;
227
+ analysisData.state.currentBatchIndex = batchIndex + 1;
228
+ // 11. Save updated data to Storage
229
+ await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
230
+ // 12. Calculate cost
231
+ const cost = analysisService.calculateCost(totalInputTokens, totalOutputTokens);
232
+ // 13. Return results
233
+ return {
234
+ ...action,
235
+ usage: (action.usage ?? 0) + cost,
236
+ results: {
237
+ githubAnalysisProcess: {
238
+ batchIndex: batchIndex,
239
+ folderPath: folderPath,
240
+ filesProcessed: filesToProcess.length,
241
+ filesAnalyzed: fileContents.length,
242
+ totalProcessed: newProcessedCount,
243
+ totalFiles: state.totalFiles,
244
+ inputTokens: totalInputTokens,
245
+ outputTokens: totalOutputTokens,
246
+ },
247
+ },
248
+ };
249
+ }
250
+ catch (error) {
251
+ console.error("AnalyzeGitHubProcess: Failed to process batch", error);
252
+ return {
253
+ ...action,
254
+ results: {
255
+ githubAnalysisProcess: {
256
+ error: error.message,
257
+ batchIndex: batchIndex,
258
+ },
259
+ },
260
+ };
261
+ }
262
+ }
263
+ }
264
+ exports.AnalyzeGitHubProcess = AnalyzeGitHubProcess;
265
+ module.exports = (regions, options, data) => new AnalyzeGitHubProcess(options).build(regions);
266
+ // Export class for testing
267
+ module.exports.AnalyzeGitHubProcess = AnalyzeGitHubProcess;
268
+ //# sourceMappingURL=analyze_github_process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze_github_process.js","sourceRoot":"","sources":["../../src/functions/analyze_github_process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GitHub Analysis Summary Function
3
+ *
4
+ * Generates final repository analysis:
5
+ * 1. Loads all folder summaries from Storage JSON
6
+ * 2. Generates comprehensive analysis using AI
7
+ * 3. Returns final JSON to action.results.githubRepository
8
+ */
9
+ import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
10
+ /**
11
+ * A function for generating final GitHub repository analysis.
12
+ *
13
+ * GitHub リポジトリの最終解析を生成するためのFunction。
14
+ */
15
+ export declare class AnalyzeGitHubSummary extends WorkflowProcessFunctionBase {
16
+ /**
17
+ * The ID of the function.
18
+ */
19
+ id: string;
20
+ /**
21
+ * Process the summary generation.
22
+ */
23
+ process(context: WorkflowContext): Promise<Action>;
24
+ /**
25
+ * Get or create root-level summary for files not in any folder.
26
+ */
27
+ private getOrCreateRootSummary;
28
+ /**
29
+ * Generate search text for vector embedding.
30
+ */
31
+ private generateSearchText;
32
+ }
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Analysis Summary Function
4
+ *
5
+ * Generates final repository analysis:
6
+ * 1. Loads all folder summaries from Storage JSON
7
+ * 2. Generates comprehensive analysis using AI
8
+ * 3. Returns final JSON to action.results.githubRepository
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.AnalyzeGitHubSummary = void 0;
45
+ const masamune_firebase_workflow_1 = require("@mathrunet/masamune_firebase_workflow");
46
+ const admin = __importStar(require("firebase-admin"));
47
+ const github_analysis_service_1 = require("../services/github_analysis_service");
48
+ const github_analysis_storage_1 = require("../utils/github_analysis_storage");
49
+ /**
50
+ * A function for generating final GitHub repository analysis.
51
+ *
52
+ * GitHub リポジトリの最終解析を生成するためのFunction。
53
+ */
54
+ class AnalyzeGitHubSummary extends masamune_firebase_workflow_1.WorkflowProcessFunctionBase {
55
+ /**
56
+ * The ID of the function.
57
+ */
58
+ id = "analyze_github_summary";
59
+ /**
60
+ * Process the summary generation.
61
+ */
62
+ async process(context) {
63
+ const action = context.action;
64
+ const command = action.command;
65
+ const githubRepository = command.data?.githubRepository;
66
+ const githubRepositoryPath = command.data?.githubRepositoryPath || "";
67
+ if (!githubRepository) {
68
+ console.error("AnalyzeGitHubSummary: No githubRepository specified");
69
+ return {
70
+ ...action,
71
+ results: {
72
+ githubRepository: {
73
+ error: "No githubRepository specified",
74
+ },
75
+ },
76
+ };
77
+ }
78
+ // Get project reference
79
+ const projectRef = action.project;
80
+ if (!projectRef) {
81
+ console.error("AnalyzeGitHubSummary: No project reference");
82
+ return {
83
+ ...action,
84
+ results: {
85
+ githubRepository: {
86
+ error: "No project reference",
87
+ },
88
+ },
89
+ };
90
+ }
91
+ // Auto-initialize Firebase Admin if needed
92
+ if (admin.apps.length === 0) {
93
+ admin.initializeApp();
94
+ }
95
+ const projectId = projectRef.id;
96
+ try {
97
+ // 1. Load analysis data from Storage
98
+ const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
99
+ if (!analysisData) {
100
+ throw new Error("Analysis data not found");
101
+ }
102
+ const state = analysisData.state;
103
+ // 2. Get locale from project
104
+ const projectDoc = await projectRef.load();
105
+ const projectData = projectDoc?.data();
106
+ const projectLocale = projectData?.locale;
107
+ // Extract locale string
108
+ const locale = typeof projectLocale === "object" && projectLocale
109
+ ? projectLocale["@language"]
110
+ : projectLocale;
111
+ // 3. Initialize analysis service
112
+ const gcpProjectId = process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT;
113
+ if (!gcpProjectId) {
114
+ throw new Error("No GCP project ID found");
115
+ }
116
+ const analysisService = new github_analysis_service_1.GitHubAnalysisService({
117
+ projectId: gcpProjectId,
118
+ locale: locale,
119
+ });
120
+ // 4. Load all folder summaries from memory
121
+ console.log("AnalyzeGitHubSummary: Loading folder summaries...");
122
+ const folderSummaries = [];
123
+ // First, ensure root-level summary exists
124
+ const rootFiles = state.filePaths.filter((fp) => !fp.includes("/"));
125
+ if (rootFiles.length > 0) {
126
+ const rootSummary = await this.getOrCreateRootSummary(analysisData, analysisService);
127
+ if (rootSummary) {
128
+ folderSummaries.push(rootSummary);
129
+ }
130
+ }
131
+ // Load folder summaries from memory
132
+ for (const folderPath of state.folderPaths) {
133
+ const folderKey = folderPath || "_root";
134
+ const cached = analysisData.folders[folderKey];
135
+ if (cached) {
136
+ folderSummaries.push({
137
+ path: cached.path,
138
+ summary: cached.summary,
139
+ features: cached.features,
140
+ fileCount: cached.fileCount,
141
+ analyzedAt: new Date(cached.analyzedAt),
142
+ });
143
+ }
144
+ }
145
+ console.log(`AnalyzeGitHubSummary: Loaded ${folderSummaries.length} folder summaries`);
146
+ // 5. Generate final analysis
147
+ console.log("AnalyzeGitHubSummary: Generating final analysis...");
148
+ const frameworkInfo = state.framework || {
149
+ framework: "unknown",
150
+ platforms: [],
151
+ };
152
+ const result = await analysisService.generateFinalSummary(folderSummaries, frameworkInfo, githubRepository, githubRepositoryPath);
153
+ // 6. Update state to completed and save
154
+ analysisData.state.phase = "completed";
155
+ await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
156
+ // 7. Calculate cost
157
+ const cost = analysisService.calculateCost(result.inputTokens, result.outputTokens);
158
+ // 8. Return final analysis
159
+ console.log("AnalyzeGitHubSummary: Analysis complete");
160
+ return {
161
+ ...action,
162
+ usage: (action.usage ?? 0) + cost,
163
+ results: {
164
+ githubRepository: result.data,
165
+ },
166
+ // Generate search text for vector embedding
167
+ search: this.generateSearchText(result.data),
168
+ };
169
+ }
170
+ catch (error) {
171
+ console.error("AnalyzeGitHubSummary: Failed to generate summary", error);
172
+ // Update state to failed
173
+ try {
174
+ const analysisData = await (0, github_analysis_storage_1.readAnalysisData)(projectId);
175
+ if (analysisData) {
176
+ analysisData.state.phase = "failed";
177
+ analysisData.state.error = error.message;
178
+ await (0, github_analysis_storage_1.writeAnalysisData)(projectId, analysisData);
179
+ }
180
+ }
181
+ catch {
182
+ // Ignore
183
+ }
184
+ return {
185
+ ...action,
186
+ results: {
187
+ githubRepository: {
188
+ error: error.message,
189
+ },
190
+ },
191
+ };
192
+ }
193
+ }
194
+ /**
195
+ * Get or create root-level summary for files not in any folder.
196
+ */
197
+ async getOrCreateRootSummary(analysisData, analysisService) {
198
+ const state = analysisData.state;
199
+ // Check if root summary already exists
200
+ if (analysisData.folders["_root"]) {
201
+ const cached = analysisData.folders["_root"];
202
+ return {
203
+ path: "",
204
+ summary: cached.summary,
205
+ features: cached.features,
206
+ fileCount: cached.fileCount,
207
+ analyzedAt: new Date(cached.analyzedAt),
208
+ };
209
+ }
210
+ // Get root-level file summaries
211
+ const rootFiles = state.filePaths.filter((fp) => !fp.includes("/"));
212
+ if (rootFiles.length === 0) {
213
+ return null;
214
+ }
215
+ const fileSummaries = [];
216
+ for (const filePath of rootFiles) {
217
+ const cached = analysisData.files[filePath];
218
+ if (cached) {
219
+ fileSummaries.push({
220
+ path: cached.path,
221
+ summary: cached.summary,
222
+ features: cached.features,
223
+ analyzedAt: new Date(cached.analyzedAt),
224
+ });
225
+ }
226
+ }
227
+ // Generate root summary
228
+ const result = await analysisService.summarizeFolder(fileSummaries, "", state.framework?.framework || "unknown");
229
+ // Save to memory
230
+ analysisData.folders["_root"] = {
231
+ path: "",
232
+ summary: result.data.summary,
233
+ features: result.data.features,
234
+ fileCount: result.data.fileCount,
235
+ analyzedAt: result.data.analyzedAt.toISOString(),
236
+ };
237
+ return result.data;
238
+ }
239
+ /**
240
+ * Generate search text for vector embedding.
241
+ */
242
+ generateSearchText(analysis) {
243
+ const parts = [];
244
+ if (analysis.repository) {
245
+ parts.push(`Repository: ${analysis.repository}`);
246
+ }
247
+ if (analysis.framework) {
248
+ parts.push(`Framework: ${analysis.framework}`);
249
+ }
250
+ if (analysis.platforms?.length) {
251
+ parts.push(`Platforms: ${analysis.platforms.join(", ")}`);
252
+ }
253
+ if (analysis.overview) {
254
+ parts.push(`Overview: ${analysis.overview}`);
255
+ }
256
+ if (analysis.architecture) {
257
+ parts.push(`Architecture: ${analysis.architecture}`);
258
+ }
259
+ if (analysis.features?.length) {
260
+ const featureNames = analysis.features.map((f) => f.name).join(", ");
261
+ parts.push(`Features: ${featureNames}`);
262
+ }
263
+ return parts.join("\n");
264
+ }
265
+ }
266
+ exports.AnalyzeGitHubSummary = AnalyzeGitHubSummary;
267
+ module.exports = (regions, options, _data) => new AnalyzeGitHubSummary(options).build(regions);
268
+ // Export class for testing
269
+ module.exports.AnalyzeGitHubSummary = AnalyzeGitHubSummary;
270
+ //# sourceMappingURL=analyze_github_summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze_github_summary.js","sourceRoot":"","sources":["../../src/functions/analyze_github_summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Action, WorkflowProcessFunctionBase, WorkflowContext } from "@mathrunet/masamune_firebase_workflow";
2
+ /**
3
+ * A function for analyzing market research data.
4
+ *
5
+ * 市場調査データを分析するためのFunction。
6
+ */
7
+ export declare class AnalyzeMarketResearch extends WorkflowProcessFunctionBase {
8
+ /**
9
+ * The ID of the function.
10
+ *
11
+ * 関数のID。
12
+ */
13
+ id: string;
14
+ /**
15
+ * The process of the function.
16
+ *
17
+ * @param context
18
+ * The context of the function.
19
+ *
20
+ * @returns
21
+ * The action of the function.
22
+ */
23
+ process(context: WorkflowContext): Promise<Action>;
24
+ /**
25
+ * Load project data from task.project reference.
26
+ */
27
+ private loadProjectData;
28
+ /**
29
+ * Build the analysis prompt for Gemini.
30
+ */
31
+ private buildAnalysisPrompt;
32
+ /**
33
+ * Get the response schema for structured output.
34
+ */
35
+ private getResponseSchema;
36
+ /**
37
+ * Get the schema for a demand forecast period.
38
+ */
39
+ private getDemandPeriodSchema;
40
+ }