@becrafter/prompt-manager 0.1.1 → 0.1.8

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 (110) hide show
  1. package/README.md +304 -121
  2. package/app/cli/commands/start.js +28 -4
  3. package/app/cli/support/argv.js +6 -0
  4. package/env.example +32 -0
  5. package/package.json +36 -6
  6. package/packages/server/api/admin.routes.js +409 -1
  7. package/packages/server/api/open.routes.js +7 -2
  8. package/packages/server/api/tool.routes.js +479 -0
  9. package/packages/server/app.js +97 -25
  10. package/packages/server/configs/models/built-in/bigmodel.yaml +6 -0
  11. package/packages/server/configs/models/providers.yaml +50 -0
  12. package/packages/server/configs/templates/built-in/general-iteration.yaml +60 -0
  13. package/packages/server/configs/templates/built-in/general-optimize.yaml +63 -0
  14. package/packages/server/configs/templates/built-in/output-format-optimize.yaml +95 -0
  15. package/packages/server/mcp/heartbeat-patch.js +73 -0
  16. package/packages/server/mcp/mcp.server.js +63 -314
  17. package/packages/server/mcp/prompt.handler.js +26 -0
  18. package/packages/server/mcp/thinking-toolkit.handler.js +380 -0
  19. package/packages/server/package.json +35 -3
  20. package/packages/server/server.js +114 -12
  21. package/packages/server/services/TerminalService.js +498 -0
  22. package/packages/server/services/WebSocketService.js +484 -0
  23. package/packages/server/services/manager.js +38 -7
  24. package/packages/server/services/model.service.js +473 -0
  25. package/packages/server/services/optimization.service.js +457 -0
  26. package/packages/server/services/template.service.js +333 -0
  27. package/packages/server/toolm/tool-description-generator-optimized.service.js +5 -2
  28. package/packages/server/toolm/tool-sync.service.js +47 -3
  29. package/packages/server/utils/config.js +8 -1
  30. package/packages/server/utils/port-checker.js +63 -0
  31. package/packages/server/utils/util.js +27 -0
  32. package/IFLOW.md +0 -175
  33. package/app/desktop/assets/app.1.png +0 -0
  34. package/app/desktop/assets/app.png +0 -0
  35. package/app/desktop/assets/icons/icon.icns +0 -0
  36. package/app/desktop/assets/icons/icon.ico +0 -0
  37. package/app/desktop/assets/icons/icon.png +0 -0
  38. package/app/desktop/assets/icons/tray.png +0 -0
  39. package/app/desktop/assets/templates/about.html +0 -147
  40. package/app/desktop/assets/tray.1.png +0 -0
  41. package/app/desktop/assets/tray.png +0 -0
  42. package/app/desktop/main.js +0 -241
  43. package/app/desktop/package-lock.json +0 -4997
  44. package/app/desktop/package.json +0 -100
  45. package/app/desktop/preload.js +0 -7
  46. package/app/desktop/src/core/error-handler.js +0 -108
  47. package/app/desktop/src/core/event-emitter.js +0 -84
  48. package/app/desktop/src/core/logger.js +0 -108
  49. package/app/desktop/src/core/state-manager.js +0 -125
  50. package/app/desktop/src/services/module-loader.js +0 -214
  51. package/app/desktop/src/services/runtime-manager.js +0 -301
  52. package/app/desktop/src/services/service-manager.js +0 -169
  53. package/app/desktop/src/services/update-manager.js +0 -268
  54. package/app/desktop/src/ui/about-dialog-manager.js +0 -208
  55. package/app/desktop/src/ui/admin-window-manager.js +0 -757
  56. package/app/desktop/src/ui/splash-manager.js +0 -253
  57. package/app/desktop/src/ui/tray-manager.js +0 -186
  58. package/app/desktop/src/utils/icon-manager.js +0 -133
  59. package/app/desktop/src/utils/path-utils.js +0 -58
  60. package/app/desktop/src/utils/resource-paths.js +0 -49
  61. package/app/desktop/src/utils/resource-sync.js +0 -260
  62. package/app/desktop/src/utils/runtime-sync.js +0 -241
  63. package/app/desktop/src/utils/template-renderer.js +0 -284
  64. package/app/desktop/src/utils/version-utils.js +0 -59
  65. package/examples/prompts/developer/code-review.yaml +0 -32
  66. package/examples/prompts/developer/code_refactoring.yaml +0 -31
  67. package/examples/prompts/developer/doc-generator.yaml +0 -36
  68. package/examples/prompts/developer/error-code-fixer.yaml +0 -35
  69. package/examples/prompts/engineer/engineer-professional.yaml +0 -92
  70. package/examples/prompts/engineer/laowang-engineer.yaml +0 -132
  71. package/examples/prompts/engineer/nekomata-engineer.yaml +0 -123
  72. package/examples/prompts/engineer/ojousama-engineer.yaml +0 -124
  73. package/examples/prompts/generator/gen_3d_edu_webpage_html.yaml +0 -117
  74. package/examples/prompts/generator/gen_3d_webpage_html.yaml +0 -75
  75. package/examples/prompts/generator/gen_bento_grid_html.yaml +0 -112
  76. package/examples/prompts/generator/gen_html_web_page.yaml +0 -88
  77. package/examples/prompts/generator/gen_knowledge_card_html.yaml +0 -83
  78. package/examples/prompts/generator/gen_magazine_card_html.yaml +0 -82
  79. package/examples/prompts/generator/gen_mimeng_headline_title.yaml +0 -71
  80. package/examples/prompts/generator/gen_podcast_script.yaml +0 -69
  81. package/examples/prompts/generator/gen_prd_prototype_html.yaml +0 -175
  82. package/examples/prompts/generator/gen_summarize.yaml +0 -157
  83. package/examples/prompts/generator/gen_title.yaml +0 -119
  84. package/examples/prompts/generator/others/api_documentation.yaml +0 -32
  85. package/examples/prompts/generator/others/build_mcp_server.yaml +0 -26
  86. package/examples/prompts/generator/others/project_architecture.yaml +0 -31
  87. package/examples/prompts/generator/others/test_case_generator.yaml +0 -30
  88. package/examples/prompts/generator/others/writing_assistant.yaml +0 -72
  89. package/examples/prompts/recommend/human_3-0_growth_diagnostic_coach_prompt.yaml +0 -105
  90. package/examples/prompts/workflow/sixstep-workflow.yaml +0 -192
  91. package/packages/admin-ui/.babelrc +0 -3
  92. package/packages/admin-ui/admin.html +0 -412
  93. package/packages/admin-ui/css/codemirror-theme_xq-light.css +0 -43
  94. package/packages/admin-ui/css/codemirror.css +0 -344
  95. package/packages/admin-ui/css/main.css +0 -2592
  96. package/packages/admin-ui/css/recommended-prompts.css +0 -610
  97. package/packages/admin-ui/package-lock.json +0 -6981
  98. package/packages/admin-ui/package.json +0 -36
  99. package/packages/admin-ui/src/codemirror.js +0 -53
  100. package/packages/admin-ui/src/index.js +0 -3188
  101. package/packages/admin-ui/webpack.config.js +0 -76
  102. package/packages/server/toolm/test-tools.js +0 -264
  103. package/scripts/build-icons.js +0 -135
  104. package/scripts/build.sh +0 -57
  105. package/scripts/postinstall.js +0 -34
  106. package/scripts/surge/CNAME +0 -1
  107. package/scripts/surge/README.md +0 -47
  108. package/scripts/surge/package-lock.json +0 -34
  109. package/scripts/surge/package.json +0 -20
  110. package/scripts/surge/sync-to-surge.js +0 -151
@@ -1,268 +0,0 @@
1
- const { dialog, shell } = require('electron');
2
- const fs = require('fs');
3
- const path = require('path');
4
- const tar = require('tar');
5
- const os = require('os');
6
- const VersionUtils = require('../utils/version-utils');
7
- const ResourcePaths = require('../utils/resource-paths');
8
-
9
- class UpdateManager {
10
- constructor(logger, errorHandler, runtimeManager) {
11
- this.logger = logger;
12
- this.errorHandler = errorHandler;
13
- this.runtimeManager = runtimeManager;
14
- this.packageName = '@becrafter/prompt-manager';
15
- }
16
-
17
- async checkForUpdates() {
18
- this.logger.info('Starting update check');
19
-
20
- try {
21
- const currentVersion = await this.getCurrentVersion();
22
- const latestVersion = await this.fetchLatestVersion();
23
-
24
- this.logger.info('Version comparison', { currentVersion, latestVersion });
25
-
26
- if (this.compareVersions(latestVersion, currentVersion) <= 0) {
27
- await this.showAlreadyLatestDialog(currentVersion);
28
- return false;
29
- }
30
-
31
- const shouldUpdate = await this.showUpdateAvailableDialog(latestVersion, currentVersion);
32
-
33
- if (shouldUpdate) {
34
- await this.performUpdate(latestVersion);
35
- return true;
36
- }
37
-
38
- return false;
39
-
40
- } catch (error) {
41
- this.logger.error('Update check failed', error);
42
- this.errorHandler.handleError('UPDATE_CHECK_FAILED', error);
43
- return false;
44
- }
45
- }
46
-
47
- async getCurrentVersion() {
48
- try {
49
- const packageInfo = this.runtimeManager.getPackageInfo();
50
- return packageInfo.version || 'unknown';
51
- } catch (error) {
52
- this.logger.error('Failed to get current version', error);
53
- return 'unknown';
54
- }
55
- }
56
-
57
- async fetchLatestVersion() {
58
- this.logger.info('Fetching latest version from npm registry');
59
-
60
- try {
61
- const response = await fetch(`https://registry.npmjs.org/${this.packageName}`);
62
-
63
- if (!response.ok) {
64
- throw new Error(`NPM registry request failed: ${response.status} ${response.statusText}`);
65
- }
66
-
67
- const metadata = await response.json();
68
- const latestVersion = metadata?.['dist-tags']?.latest;
69
-
70
- if (!latestVersion) {
71
- throw new Error('Could not parse latest version from npm registry response');
72
- }
73
-
74
- this.logger.info('Latest version fetched', { latestVersion });
75
- return latestVersion;
76
-
77
- } catch (error) {
78
- this.logger.error('Failed to fetch latest version', error);
79
- throw new Error(`无法获取最新版本信息: ${error.message}`);
80
- }
81
- }
82
-
83
- compareVersions(a, b) {
84
- return VersionUtils.compareVersions(a, b);
85
- }
86
-
87
- async showAlreadyLatestDialog(currentVersion) {
88
- await dialog.showMessageBox({
89
- type: 'info',
90
- title: '已是最新版本',
91
- message: '已是最新版本',
92
- detail: `服务当前版本:${currentVersion}`
93
- });
94
- }
95
-
96
- async showUpdateAvailableDialog(latestVersion, currentVersion) {
97
- const { response } = await dialog.showMessageBox({
98
- type: 'question',
99
- title: '发现新版本',
100
- message: `发现新版本 ${latestVersion}`,
101
- detail: '升级期间服务会短暂停止,是否继续?',
102
- buttons: ['立即升级', '打开发布页', '取消'],
103
- defaultId: 0,
104
- cancelId: 2
105
- });
106
-
107
- if (response === 1) {
108
- shell.openExternal('https://github.com/BeCrafter/prompt-manager/releases/latest');
109
- return false;
110
- }
111
-
112
- return response === 0;
113
- }
114
-
115
- async performUpdate(version) {
116
- this.logger.info('Starting update process', { version });
117
-
118
- try {
119
- const wasRunning = await this.stopServiceIfNeeded();
120
-
121
- await this.downloadAndInstallUpdate(version);
122
-
123
- await this.showUpdateSuccessDialog(version);
124
-
125
- if (wasRunning) {
126
- await this.startService();
127
- }
128
-
129
- this.logger.info('Update completed successfully', { version });
130
-
131
- } catch (error) {
132
- this.logger.error('Update failed', error);
133
- this.errorHandler.handleError('UPDATE_FAILED', error, { version });
134
- throw error;
135
- }
136
- }
137
-
138
- async stopServiceIfNeeded() {
139
- // TODO: 需要与服务管理器集成
140
- // 暂时假设服务未运行
141
- return false;
142
- }
143
-
144
- async startService() {
145
- // TODO: 需要与服务管理器集成
146
- this.logger.info('Service restart requested after update');
147
- }
148
-
149
- async downloadAndInstallUpdate(version) {
150
- this.logger.info('Downloading update', { version });
151
-
152
- const tarballUrl = `https://registry.npmjs.org/${this.packageName}/-/${this.packageName}-${version}.tgz`;
153
- const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'prompt-manager-update-'));
154
- const tarballPath = path.join(tmpDir, `${version}.tgz`);
155
-
156
- try {
157
- // 下载更新包
158
- await this.downloadTarball(tarballUrl, tarballPath);
159
-
160
- // 解压更新包
161
- const extractedPath = await this.extractTarball(tarballPath, tmpDir);
162
-
163
- // 执行原地升级
164
- await this.performInPlaceUpgrade(extractedPath, version);
165
-
166
- } finally {
167
- // 清理临时文件
168
- this.logger.info('Cleaning up temporary files', { tmpDir });
169
- await fs.promises.rm(tmpDir, { recursive: true, force: true });
170
- }
171
- }
172
-
173
- async downloadTarball(url, targetPath) {
174
- this.logger.info('Downloading tarball', { url, targetPath });
175
-
176
- const response = await fetch(url);
177
-
178
- if (!response.ok) {
179
- throw new Error(`Failed to download tarball: ${response.status} ${response.statusText}`);
180
- }
181
-
182
- const buffer = Buffer.from(await response.arrayBuffer());
183
- await fs.promises.writeFile(targetPath, buffer);
184
-
185
- this.logger.info('Tarball downloaded successfully', { targetPath });
186
- }
187
-
188
- async extractTarball(tarballPath, targetDir) {
189
- this.logger.info('Extracting tarball', { tarballPath, targetDir });
190
-
191
- await tar.x({ file: tarballPath, cwd: targetDir });
192
- const extractedPath = path.join(targetDir, 'package');
193
-
194
- this.logger.info('Tarball extracted successfully', { extractedPath });
195
- return extractedPath;
196
- }
197
-
198
- async performInPlaceUpgrade(extractedPath, version) {
199
- this.logger.info('Performing in-place upgrade', { extractedPath, version });
200
-
201
- const serverRoot = this.runtimeManager.getServerRoot();
202
- const examplesDir = path.join(serverRoot, 'examples', 'prompts');
203
- const examplesBackup = path.join(os.tmpdir(), 'prompt-manager-examples-backup');
204
-
205
- try {
206
- // 备份示例文件
207
- if (await ResourcePaths.pathExists(examplesDir)) {
208
- this.logger.info('Backing up examples directory', { examplesDir });
209
- await ResourcePaths.copyDir(examplesDir, examplesBackup);
210
- }
211
-
212
- // 删除旧版本
213
- this.logger.info('Removing old version', { serverRoot });
214
- await ResourcePaths.safeRemoveDir(serverRoot);
215
-
216
- // 复制新版本
217
- this.logger.info('Copying new version', { extractedPath, serverRoot });
218
- await ResourcePaths.ensureDir(serverRoot);
219
- await ResourcePaths.copyDir(extractedPath, serverRoot);
220
-
221
- // 恢复示例文件
222
- if (await ResourcePaths.pathExists(examplesBackup)) {
223
- this.logger.info('Restoring examples directory', { examplesBackup });
224
- const targetExamples = path.join(serverRoot, 'examples', 'prompts');
225
- await ResourcePaths.ensureDir(path.dirname(targetExamples));
226
- await ResourcePaths.copyDir(examplesBackup, targetExamples);
227
- }
228
-
229
- // 重新安装依赖
230
- await this.reinstallDependencies(serverRoot);
231
-
232
- // 清理模块缓存
233
- this.moduleLoader?.clearCache(serverRoot);
234
-
235
- } finally {
236
- // 清理备份文件
237
- if (await ResourcePaths.pathExists(examplesBackup)) {
238
- await ResourcePaths.safeRemoveDir(examplesBackup);
239
- }
240
- }
241
- }
242
-
243
- async reinstallDependencies(serverRoot) {
244
- this.logger.info('Reinstalling dependencies', { serverRoot });
245
-
246
- const ModuleLoader = require('./module-loader');
247
- const moduleLoader = new ModuleLoader(this.logger, this.errorHandler);
248
-
249
- await moduleLoader.installDependencies(serverRoot);
250
-
251
- this.logger.info('Dependencies reinstalled successfully');
252
- }
253
-
254
- async showUpdateSuccessDialog(version) {
255
- await dialog.showMessageBox({
256
- type: 'info',
257
- title: '升级成功',
258
- message: '升级成功',
259
- detail: `服务已升级到 ${version}`
260
- });
261
- }
262
-
263
- async pathExists(targetPath) {
264
- return ResourcePaths.pathExists(targetPath);
265
- }
266
- }
267
-
268
- module.exports = UpdateManager;
@@ -1,208 +0,0 @@
1
- const { BrowserWindow, dialog, ipcMain } = require('electron');
2
- const fs = require('fs');
3
- const path = require('path');
4
- const TemplateRenderer = require('../utils/template-renderer');
5
- const IconManager = require('../utils/icon-manager');
6
-
7
- class AboutDialogManager {
8
- constructor(logger, runtimeManager, iconManager) {
9
- this.logger = logger;
10
- this.runtimeManager = runtimeManager;
11
- this.iconManager = iconManager;
12
- this.aboutWindow = null;
13
- this.clickCount = 0;
14
- this.lastClickTime = 0;
15
- this.templateRenderer = new TemplateRenderer();
16
- }
17
-
18
- async showAboutDialog() {
19
- this.logger.info('Showing about dialog');
20
-
21
- // 如果窗口已存在,直接聚焦
22
- if (this.aboutWindow) {
23
- this.aboutWindow.focus();
24
- return;
25
- }
26
-
27
- try {
28
- const packageInfo = await this.getPackageInfo();
29
- const electronVersion = process.versions.electron;
30
- const nodeVersion = process.versions.node;
31
- const debugEnabled = this.logger.debugEnabled;
32
-
33
- this.aboutWindow = this.createAboutWindow();
34
-
35
- // 获取图标数据
36
- const logoIcon = this.iconManager.getAboutDialogIcon();
37
- const logoData = logoIcon ? logoIcon.toPNG().toString('base64') : '';
38
-
39
- // 准备模板数据
40
- const templateData = {
41
- version: packageInfo.version,
42
- electronVersion: electronVersion,
43
- nodeVersion: nodeVersion,
44
- logoData: logoData,
45
- debugLogEnabled: debugEnabled,
46
- clickCount: 3 - this.clickCount,
47
- logFilePath: debugEnabled ? this.logger.getLogFilePath() : ''
48
- };
49
-
50
- // 使用TemplateRenderer渲染模板
51
- const htmlContent = this.templateRenderer.render('about', templateData);
52
-
53
- this.aboutWindow.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
54
-
55
- this.setupWindowEvents();
56
- this.setupClickTracking();
57
-
58
- this.logger.info('About dialog opened successfully');
59
-
60
- } catch (error) {
61
- this.logger.error('Failed to show about dialog', error);
62
- this.showFallbackAboutDialog(error);
63
- }
64
- }
65
-
66
- createAboutWindow() {
67
- const ResourcePaths = require('../utils/resource-paths');
68
-
69
- return new BrowserWindow({
70
- width: 400,
71
- height: 320,
72
- title: '关于 Prompt Manager',
73
- resizable: false,
74
- webPreferences: {
75
- contextIsolation: true,
76
- nodeIntegration: false,
77
- sandbox: false,
78
- preload: ResourcePaths.preload
79
- }
80
- });
81
- }
82
-
83
- setupWindowEvents() {
84
- this.aboutWindow.on('closed', () => {
85
- this.aboutWindow = null;
86
- this.clickCount = 0;
87
- this.lastClickTime = 0;
88
- this.logger.info('About dialog closed');
89
- });
90
- }
91
-
92
- setupClickTracking() {
93
- this.aboutWindow.webContents.on('did-finish-load', () => {
94
- this.aboutWindow.webContents.executeJavaScript(`
95
- document.addEventListener('click', (event) => {
96
- const currentTime = Date.now();
97
- if (window.electronAPI) {
98
- window.electronAPI.sendAboutWindowClick({
99
- currentTime: currentTime
100
- });
101
- }
102
- });
103
- `);
104
- });
105
- }
106
-
107
- handleAboutWindowClick(data) {
108
- const currentTime = data.currentTime;
109
-
110
- // 如果距离上次点击超过3秒,重置计数器
111
- if (currentTime - this.lastClickTime > 3000) {
112
- this.clickCount = 0;
113
- }
114
-
115
- // 更新点击时间和计数器
116
- this.lastClickTime = currentTime;
117
- this.clickCount++;
118
-
119
- // 如果点击了3次,切换调试日志状态
120
- if (this.clickCount >= 3) {
121
- this.clickCount = 0; // 重置计数器
122
- const debugEnabled = !this.logger.debugEnabled;
123
- this.logger.setDebugEnabled(debugEnabled);
124
-
125
- // 更新窗口内容
126
- this.updateAboutWindowContent();
127
-
128
- this.logger.info('Debug logging toggled', { enabled: debugEnabled });
129
-
130
- // 如果开启了调试日志,显示日志文件路径
131
- // if (debugEnabled) {
132
- // const logFilePath = this.logger.getLogFilePath();
133
- // dialog.showMessageBox({
134
- // type: 'info',
135
- // title: '调试日志已开启',
136
- // message: '调试日志已开启',
137
- // detail: `日志文件路径: ${logFilePath}\n\n现在将记录更多详细信息。`
138
- // });
139
- // }
140
- } else {
141
- // 更新窗口内容显示剩余点击次数
142
- this.updateAboutWindowContent();
143
- }
144
- }
145
-
146
- async getPackageInfo() {
147
- try {
148
- return this.runtimeManager.getPackageInfo();
149
- } catch (error) {
150
- this.logger.warn('Failed to get package info, using fallback', error);
151
- return { version: 'unknown' };
152
- }
153
- }
154
-
155
-
156
-
157
- updateAboutWindowContent() {
158
- if (!this.aboutWindow) return;
159
-
160
- try {
161
- const packageInfo = this.runtimeManager.getPackageInfo();
162
- const electronVersion = process.versions.electron;
163
- const nodeVersion = process.versions.node;
164
- const debugEnabled = this.logger.debugEnabled;
165
-
166
- // 获取图标数据
167
- const logoIcon = this.iconManager.getAboutDialogIcon();
168
- const logoData = logoIcon ? logoIcon.toPNG().toString('base64') : '';
169
-
170
- // 准备模板数据
171
- const templateData = {
172
- version: packageInfo.version,
173
- electronVersion: electronVersion,
174
- nodeVersion: nodeVersion,
175
- logoData: logoData,
176
- debugLogEnabled: debugEnabled,
177
- clickCount: 3 - this.clickCount,
178
- logFilePath: debugEnabled ? this.logger.getLogFilePath() : ''
179
- };
180
-
181
- // 使用TemplateRenderer重新渲染模板
182
- const htmlContent = this.templateRenderer.render('about', templateData);
183
-
184
- this.aboutWindow.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
185
-
186
- } catch (error) {
187
- this.logger.error('Failed to update about window content', error);
188
- }
189
- }
190
-
191
- showFallbackAboutDialog(error) {
192
- dialog.showMessageBox({
193
- type: 'info',
194
- title: '关于 Prompt Manager',
195
- message: 'Prompt Manager',
196
- detail: `版本信息获取失败: ${error.message}\n\nElectron: ${process.versions.electron}\nNode.js: ${process.versions.node}`
197
- });
198
- }
199
-
200
- async closeAboutDialog() {
201
- if (this.aboutWindow) {
202
- this.aboutWindow.close();
203
- this.aboutWindow = null;
204
- }
205
- }
206
- }
207
-
208
- module.exports = AboutDialogManager;