@becrafter/prompt-manager 0.1.18 → 0.1.21

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 (70) hide show
  1. package/env.example +4 -8
  2. package/package.json +19 -9
  3. package/packages/resources/tools/cognitive-thinking/README.md +284 -0
  4. package/packages/resources/tools/cognitive-thinking/cognitive-thinking.tool.js +837 -0
  5. package/packages/server/api/admin.routes.js +19 -0
  6. package/packages/server/mcp/mcp.server.js +6 -6
  7. package/packages/server/server.js +6 -4
  8. package/packages/server/services/TerminalService.js +247 -13
  9. package/packages/server/services/WebSocketService.js +15 -5
  10. package/packages/server/toolm/tool-sync.service.js +8 -0
  11. package/packages/server/utils/config.js +24 -6
  12. package/packages/server/utils/util.js +63 -18
  13. package/packages/web/css/{main.3b61356b384d2f11f47f.css → main.196f434e6a88cd448158.css} +10 -0
  14. package/packages/web/css/terminal-fix.css +571 -0
  15. package/packages/web/index.html +1 -1
  16. package/packages/web/{main.77c2c4b553ca3fac223b.js → main.dceff50c7307dda04873.js} +2 -2
  17. package/app/desktop/assets/app.1.png +0 -0
  18. package/app/desktop/assets/app.png +0 -0
  19. package/app/desktop/assets/icons/icon.icns +0 -0
  20. package/app/desktop/assets/icons/icon.ico +0 -0
  21. package/app/desktop/assets/icons/icon.png +0 -0
  22. package/app/desktop/assets/icons/tray.png +0 -0
  23. package/app/desktop/assets/templates/about.html +0 -147
  24. package/app/desktop/assets/tray.1.png +0 -0
  25. package/app/desktop/assets/tray.png +0 -0
  26. package/app/desktop/docs/ASSETS_PLANNING.md +0 -351
  27. package/app/desktop/docs/REFACTORING_SUMMARY.md +0 -205
  28. package/app/desktop/main.js +0 -340
  29. package/app/desktop/package-lock.json +0 -6912
  30. package/app/desktop/package.json +0 -119
  31. package/app/desktop/preload.js +0 -7
  32. package/app/desktop/src/core/error-handler.js +0 -108
  33. package/app/desktop/src/core/event-emitter.js +0 -84
  34. package/app/desktop/src/core/logger.js +0 -130
  35. package/app/desktop/src/core/state-manager.js +0 -125
  36. package/app/desktop/src/services/module-loader.js +0 -330
  37. package/app/desktop/src/services/runtime-manager.js +0 -398
  38. package/app/desktop/src/services/service-manager.js +0 -210
  39. package/app/desktop/src/services/update-manager.js +0 -267
  40. package/app/desktop/src/ui/about-dialog-manager.js +0 -208
  41. package/app/desktop/src/ui/admin-window-manager.js +0 -757
  42. package/app/desktop/src/ui/splash-manager.js +0 -253
  43. package/app/desktop/src/ui/tray-manager.js +0 -186
  44. package/app/desktop/src/utils/icon-manager.js +0 -133
  45. package/app/desktop/src/utils/path-utils.js +0 -58
  46. package/app/desktop/src/utils/resource-paths.js +0 -49
  47. package/app/desktop/src/utils/resource-sync.js +0 -260
  48. package/app/desktop/src/utils/runtime-sync.js +0 -241
  49. package/app/desktop/src/utils/self-check.js +0 -288
  50. package/app/desktop/src/utils/template-renderer.js +0 -284
  51. package/app/desktop/src/utils/version-utils.js +0 -59
  52. package/packages/server/.eslintrc.js +0 -70
  53. package/packages/server/.husky/pre-commit +0 -8
  54. package/packages/server/.husky/pre-push +0 -8
  55. package/packages/server/.prettierrc +0 -14
  56. package/packages/server/dev-server.js +0 -90
  57. package/packages/server/jsdoc.conf.json +0 -39
  58. package/packages/server/package.json +0 -85
  59. package/packages/server/playwright.config.js +0 -62
  60. package/packages/server/scripts/generate-docs.js +0 -300
  61. package/packages/server/tests/e2e/terminal-e2e.test.js +0 -315
  62. package/packages/server/tests/integration/terminal-websocket.test.js +0 -372
  63. package/packages/server/tests/integration/tools.test.js +0 -264
  64. package/packages/server/tests/setup.js +0 -45
  65. package/packages/server/tests/unit/TerminalService.test.js +0 -410
  66. package/packages/server/tests/unit/WebSocketService.test.js +0 -403
  67. package/packages/server/tests/unit/core.test.js +0 -94
  68. package/packages/server/typedoc.json +0 -52
  69. package/packages/server/vitest.config.js +0 -74
  70. /package/packages/web/{main.77c2c4b553ca3fac223b.js.LICENSE.txt → main.dceff50c7307dda04873.js.LICENSE.txt} +0 -0
@@ -1,267 +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: 'info',
99
- title: '发现新版本',
100
- message: `发现新版本 ${latestVersion}`,
101
- detail: `当前版本:${currentVersion}\n可前往发布页下载并手动更新。`,
102
- buttons: ['打开发布页', '取消'],
103
- defaultId: 0,
104
- cancelId: 1
105
- });
106
-
107
- if (response === 0) {
108
- shell.openExternal('https://github.com/BeCrafter/prompt-manager/releases/latest');
109
- }
110
-
111
- return false;
112
- }
113
-
114
- async performUpdate(version) {
115
- this.logger.info('Starting update process', { version });
116
-
117
- try {
118
- const wasRunning = await this.stopServiceIfNeeded();
119
-
120
- await this.downloadAndInstallUpdate(version);
121
-
122
- await this.showUpdateSuccessDialog(version);
123
-
124
- if (wasRunning) {
125
- await this.startService();
126
- }
127
-
128
- this.logger.info('Update completed successfully', { version });
129
-
130
- } catch (error) {
131
- this.logger.error('Update failed', error);
132
- this.errorHandler.handleError('UPDATE_FAILED', error, { version });
133
- throw error;
134
- }
135
- }
136
-
137
- async stopServiceIfNeeded() {
138
- // TODO: 需要与服务管理器集成
139
- // 暂时假设服务未运行
140
- return false;
141
- }
142
-
143
- async startService() {
144
- // TODO: 需要与服务管理器集成
145
- this.logger.info('Service restart requested after update');
146
- }
147
-
148
- async downloadAndInstallUpdate(version) {
149
- this.logger.info('Downloading update', { version });
150
-
151
- const tarballUrl = `https://registry.npmjs.org/${this.packageName}/-/${this.packageName}-${version}.tgz`;
152
- const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'prompt-manager-update-'));
153
- const tarballPath = path.join(tmpDir, `${version}.tgz`);
154
-
155
- try {
156
- // 下载更新包
157
- await this.downloadTarball(tarballUrl, tarballPath);
158
-
159
- // 解压更新包
160
- const extractedPath = await this.extractTarball(tarballPath, tmpDir);
161
-
162
- // 执行原地升级
163
- await this.performInPlaceUpgrade(extractedPath, version);
164
-
165
- } finally {
166
- // 清理临时文件
167
- this.logger.info('Cleaning up temporary files', { tmpDir });
168
- await fs.promises.rm(tmpDir, { recursive: true, force: true });
169
- }
170
- }
171
-
172
- async downloadTarball(url, targetPath) {
173
- this.logger.info('Downloading tarball', { url, targetPath });
174
-
175
- const response = await fetch(url);
176
-
177
- if (!response.ok) {
178
- throw new Error(`Failed to download tarball: ${response.status} ${response.statusText}`);
179
- }
180
-
181
- const buffer = Buffer.from(await response.arrayBuffer());
182
- await fs.promises.writeFile(targetPath, buffer);
183
-
184
- this.logger.info('Tarball downloaded successfully', { targetPath });
185
- }
186
-
187
- async extractTarball(tarballPath, targetDir) {
188
- this.logger.info('Extracting tarball', { tarballPath, targetDir });
189
-
190
- await tar.x({ file: tarballPath, cwd: targetDir });
191
- const extractedPath = path.join(targetDir, 'package');
192
-
193
- this.logger.info('Tarball extracted successfully', { extractedPath });
194
- return extractedPath;
195
- }
196
-
197
- async performInPlaceUpgrade(extractedPath, version) {
198
- this.logger.info('Performing in-place upgrade', { extractedPath, version });
199
-
200
- const serverRoot = this.runtimeManager.getServerRoot();
201
- const examplesDir = path.join(serverRoot, 'examples', 'prompts');
202
- const examplesBackup = path.join(os.tmpdir(), 'prompt-manager-examples-backup');
203
-
204
- try {
205
- // 备份示例文件
206
- if (await ResourcePaths.pathExists(examplesDir)) {
207
- this.logger.info('Backing up examples directory', { examplesDir });
208
- await ResourcePaths.copyDir(examplesDir, examplesBackup);
209
- }
210
-
211
- // 删除旧版本
212
- this.logger.info('Removing old version', { serverRoot });
213
- await ResourcePaths.safeRemoveDir(serverRoot);
214
-
215
- // 复制新版本
216
- this.logger.info('Copying new version', { extractedPath, serverRoot });
217
- await ResourcePaths.ensureDir(serverRoot);
218
- await ResourcePaths.copyDir(extractedPath, serverRoot);
219
-
220
- // 恢复示例文件
221
- if (await ResourcePaths.pathExists(examplesBackup)) {
222
- this.logger.info('Restoring examples directory', { examplesBackup });
223
- const targetExamples = path.join(serverRoot, 'examples', 'prompts');
224
- await ResourcePaths.ensureDir(path.dirname(targetExamples));
225
- await ResourcePaths.copyDir(examplesBackup, targetExamples);
226
- }
227
-
228
- // 重新安装依赖
229
- await this.reinstallDependencies(serverRoot);
230
-
231
- // 清理模块缓存
232
- this.moduleLoader?.clearCache(serverRoot);
233
-
234
- } finally {
235
- // 清理备份文件
236
- if (await ResourcePaths.pathExists(examplesBackup)) {
237
- await ResourcePaths.safeRemoveDir(examplesBackup);
238
- }
239
- }
240
- }
241
-
242
- async reinstallDependencies(serverRoot) {
243
- this.logger.info('Reinstalling dependencies', { serverRoot });
244
-
245
- const ModuleLoader = require('./module-loader');
246
- const moduleLoader = new ModuleLoader(this.logger, this.errorHandler);
247
-
248
- await moduleLoader.installDependencies(serverRoot);
249
-
250
- this.logger.info('Dependencies reinstalled successfully');
251
- }
252
-
253
- async showUpdateSuccessDialog(version) {
254
- await dialog.showMessageBox({
255
- type: 'info',
256
- title: '升级成功',
257
- message: '升级成功',
258
- detail: `服务已升级到 ${version}`
259
- });
260
- }
261
-
262
- async pathExists(targetPath) {
263
- return ResourcePaths.pathExists(targetPath);
264
- }
265
- }
266
-
267
- 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;