cursor-feedback 2.0.5 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/extension.js +152 -19
- package/dist/i18n/en.json +19 -1
- package/dist/i18n/index.js +19 -1
- package/dist/i18n/zh-CN.json +19 -1
- package/dist/mcp-server.js +297 -44
- package/dist/webview/index.html +22 -0
- package/dist/webview/script.js +351 -10
- package/dist/webview/styles.css +163 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [2.1.1](https://github.com/jianger666/cursor-feedback-extension/compare/v2.1.0...v2.1.1) (2026-07-02)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **mcp:** 等待反馈期间不再被僵尸判定误杀——Connection closed 断连根因修复 ([39cc9d5](https://github.com/jianger666/cursor-feedback-extension/commit/39cc9d5fe5730023069014c8a749841993117efa))
|
|
11
|
+
|
|
12
|
+
## [2.1.0](https://github.com/jianger666/cursor-feedback-extension/compare/v2.0.5...v2.1.0) (2026-07-02)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* 快捷回复短语、暂停倒计时、反馈历史、提交轻提示与通知点击唤起 Cursor ([a508754](https://github.com/jianger666/cursor-feedback-extension/commit/a508754d78b72f2673ed2ce625b63ed0bda51a6e))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* **mcp:** 超时空窗的提交/飞书回复不再丢失——暂存续接下一轮 + 多窗口路由修复 ([c136ff3](https://github.com/jianger666/cursor-feedback-extension/commit/c136ff371fb87b57737202ba4dc122e7e3eaa40a))
|
|
23
|
+
|
|
5
24
|
### [2.0.5](https://github.com/jianger666/cursor-feedback-extension/compare/v2.0.4...v2.0.5) (2026-06-23)
|
|
6
25
|
|
|
7
26
|
|
package/dist/extension.js
CHANGED
|
@@ -46,6 +46,12 @@ let feedbackViewProvider = null;
|
|
|
46
46
|
function normalizePath(p) {
|
|
47
47
|
return (p || '').replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
|
|
48
48
|
}
|
|
49
|
+
/** 两个已归一化的路径互为前缀(相等 / 一方是另一方的子目录)即视为同一窗口语境 */
|
|
50
|
+
function pathsRelated(a, b) {
|
|
51
|
+
if (!a || !b)
|
|
52
|
+
return false;
|
|
53
|
+
return a === b || a.startsWith(b + '/') || b.startsWith(a + '/');
|
|
54
|
+
}
|
|
49
55
|
function activate(context) {
|
|
50
56
|
// 注册侧边栏 WebView(端口从 61927 开始自动扫描)
|
|
51
57
|
feedbackViewProvider = new FeedbackViewProvider(context.extensionUri, 61927, context.globalState);
|
|
@@ -54,6 +60,15 @@ function activate(context) {
|
|
|
54
60
|
context.subscriptions.push(vscode.commands.registerCommand('cursorFeedback.showPanel', () => {
|
|
55
61
|
vscode.commands.executeCommand('cursorFeedback.feedbackView.focus');
|
|
56
62
|
}));
|
|
63
|
+
// 注册 URI Handler:系统通知点击后通过 deep link(cursor://jianger666.cursor-feedback/focus)
|
|
64
|
+
// 打开/聚焦 IDE 并定位到反馈面板
|
|
65
|
+
context.subscriptions.push(vscode.window.registerUriHandler({
|
|
66
|
+
handleUri(uri) {
|
|
67
|
+
if (uri.path === '/focus') {
|
|
68
|
+
vscode.commands.executeCommand('cursorFeedback.feedbackView.focus');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
57
72
|
// 注册命令:启动轮询
|
|
58
73
|
context.subscriptions.push(vscode.commands.registerCommand('cursorFeedback.startPolling', () => {
|
|
59
74
|
if (feedbackViewProvider) {
|
|
@@ -100,8 +115,9 @@ function getWorkspacePaths() {
|
|
|
100
115
|
return folders.map(f => f.uri.fsPath);
|
|
101
116
|
}
|
|
102
117
|
/**
|
|
103
|
-
*
|
|
104
|
-
* -
|
|
118
|
+
* 检查路径是否匹配当前工作区
|
|
119
|
+
* - 有工作区的窗口:接收匹配工作区路径的消息(相等或互为子目录——AI 传的
|
|
120
|
+
* project_directory 常是工作区的子目录,精确匹配会漏收,面板收不到、心跳也失配)
|
|
105
121
|
* - 没有工作区的窗口:只接收没有指定项目路径的消息
|
|
106
122
|
*/
|
|
107
123
|
function isPathInWorkspace(targetPath) {
|
|
@@ -119,9 +135,7 @@ function isPathInWorkspace(targetPath) {
|
|
|
119
135
|
return false;
|
|
120
136
|
}
|
|
121
137
|
for (const wsPath of workspacePaths) {
|
|
122
|
-
|
|
123
|
-
// 精确匹配:只匹配完全相同的路径
|
|
124
|
-
if (normalizedTarget === normalizedWs) {
|
|
138
|
+
if (pathsRelated(normalizedTarget, normalizePath(wsPath))) {
|
|
125
139
|
return true;
|
|
126
140
|
}
|
|
127
141
|
}
|
|
@@ -138,6 +152,10 @@ class FeedbackViewProvider {
|
|
|
138
152
|
this._pollTimer = null;
|
|
139
153
|
this._pollDelay = 1000;
|
|
140
154
|
this._currentRequest = null;
|
|
155
|
+
// 当前请求所在的 server 端口:请求与端口强绑定。多项目多窗口时各 server 占不同端口,
|
|
156
|
+
// 绝不能用 _activePort || basePort 兜底提交——activePort 被瞬时网络抖动置空后,
|
|
157
|
+
// basePort 可能是别的项目的 server,提交过去就是 "Request not found"(用户反馈的 bug)。
|
|
158
|
+
this._currentRequestPort = null;
|
|
141
159
|
// webview 脚本是否就绪;插入上下文消息需等就绪后再发,否则 focus 唤起重建时会丢消息
|
|
142
160
|
this._webviewReady = false;
|
|
143
161
|
this._pendingInsert = null;
|
|
@@ -227,6 +245,9 @@ class FeedbackViewProvider {
|
|
|
227
245
|
case 'toggleAutoRetry':
|
|
228
246
|
await this._handleToggleAutoRetry();
|
|
229
247
|
break;
|
|
248
|
+
case 'togglePause':
|
|
249
|
+
await this._handleTogglePause(data.payload);
|
|
250
|
+
break;
|
|
230
251
|
case 'searchFiles':
|
|
231
252
|
await this._handleSearchFiles();
|
|
232
253
|
break;
|
|
@@ -251,6 +272,9 @@ class FeedbackViewProvider {
|
|
|
251
272
|
case 'toggleFeishuAck':
|
|
252
273
|
await this._handleToggleFeishuAck(!!data.payload?.enabled);
|
|
253
274
|
break;
|
|
275
|
+
case 'testNotification':
|
|
276
|
+
this._sendTestNotification();
|
|
277
|
+
break;
|
|
254
278
|
}
|
|
255
279
|
});
|
|
256
280
|
// 当 view 变为可见时,检查当前请求
|
|
@@ -312,10 +336,10 @@ class FeedbackViewProvider {
|
|
|
312
336
|
// 如果有活跃端口,先尝试只轮询该端口
|
|
313
337
|
if (this._activePort) {
|
|
314
338
|
const result = await this._checkPortForRequest(this._activePort);
|
|
315
|
-
// 检查是否仍然是我们的 Server
|
|
339
|
+
// 检查是否仍然是我们的 Server(owner 可能是本工作区的子目录:AI 传的 project_directory)
|
|
316
340
|
if (result.connected) {
|
|
317
341
|
const serverOwner = result.ownerWorkspace ? normalizePath(result.ownerWorkspace) : '';
|
|
318
|
-
const isMyServer = !serverOwner || serverOwner
|
|
342
|
+
const isMyServer = !serverOwner || pathsRelated(serverOwner, normalizedCurrentWorkspace);
|
|
319
343
|
if (isMyServer) {
|
|
320
344
|
// 端口仍然有效,保持使用
|
|
321
345
|
this._debugInfo.connectedPorts = [this._activePort];
|
|
@@ -357,7 +381,7 @@ class FeedbackViewProvider {
|
|
|
357
381
|
return false;
|
|
358
382
|
}
|
|
359
383
|
const serverOwner = r.ownerWorkspace ? normalizePath(r.ownerWorkspace) : '';
|
|
360
|
-
return !serverOwner || serverOwner
|
|
384
|
+
return !serverOwner || pathsRelated(serverOwner, normalizedCurrentWorkspace);
|
|
361
385
|
}).sort((a, b) => b.request.timestamp - a.request.timestamp);
|
|
362
386
|
// 处理最新的请求
|
|
363
387
|
if (myRequests.length > 0) {
|
|
@@ -369,6 +393,17 @@ class FeedbackViewProvider {
|
|
|
369
393
|
this._updateDebugInfo();
|
|
370
394
|
return;
|
|
371
395
|
}
|
|
396
|
+
// 找回当前请求所在的端口:活跃端口被瞬时抖动重置后,当前请求的 id 已进 _seenRequestIds、
|
|
397
|
+
// 不会再出现在 myRequests 里,必须从扫描结果里按 id 找回,否则提交会 fallback 到
|
|
398
|
+
// basePort——多项目时那可能是别的项目的 server,导致 "Request not found"。
|
|
399
|
+
if (this._currentRequest && !this._activePort) {
|
|
400
|
+
const cur = this._currentRequest;
|
|
401
|
+
const holder = results.find(r => r.connected && r.request && r.request.id === cur.id);
|
|
402
|
+
if (holder) {
|
|
403
|
+
this._activePort = holder.port;
|
|
404
|
+
this._currentRequestPort = holder.port;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
372
407
|
// 没有新请求,检查是否有当前请求
|
|
373
408
|
if (this._currentRequest && this._activePort) {
|
|
374
409
|
this._debugInfo.activePort = this._activePort;
|
|
@@ -415,6 +450,7 @@ class FeedbackViewProvider {
|
|
|
415
450
|
feishuResolvedId = parsed.feishuResolvedId ?? null;
|
|
416
451
|
this._maybeSyncFeishu(port, parsed.feishu);
|
|
417
452
|
this._maybeSyncAutoRetry(parsed.autoRetry);
|
|
453
|
+
this._maybeSyncPause(parsed.pause);
|
|
418
454
|
}
|
|
419
455
|
else {
|
|
420
456
|
// 旧格式(兼容 npm 上的旧版本)
|
|
@@ -455,6 +491,7 @@ class FeedbackViewProvider {
|
|
|
455
491
|
if (!this._currentRequest || request.id !== this._currentRequest.id) {
|
|
456
492
|
this._currentRequest = request;
|
|
457
493
|
this._activePort = port;
|
|
494
|
+
this._currentRequestPort = port;
|
|
458
495
|
// 「插件通知」主开关(配置 key 历史原因仍叫 systemNotification):关掉后本窗口完全静默——
|
|
459
496
|
// 不推送内容、不弹面板、不抢焦点、不发系统通知;连用户之后主动切回 / 打开面板也不显示
|
|
460
497
|
// (见 resolveWebviewView 里 ready 与 onDidChangeVisibility 的同款判断)。
|
|
@@ -492,21 +529,59 @@ class FeedbackViewProvider {
|
|
|
492
529
|
if (vscode.window.state.focused) {
|
|
493
530
|
return;
|
|
494
531
|
}
|
|
495
|
-
const withSound = config.get('notificationSound', true);
|
|
496
532
|
const projectName = path.basename(request.projectDir || '')
|
|
497
533
|
|| vscode.workspace.workspaceFolders?.[0]?.name
|
|
498
534
|
|| '';
|
|
499
535
|
const title = projectName ? `Cursor Feedback · ${projectName}` : 'Cursor Feedback';
|
|
500
|
-
|
|
536
|
+
this._fireOsNotification(title, this._i18n.aiWaitingFeedback);
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* 发送测试通知(设置弹窗里的「发送测试通知」按钮):
|
|
540
|
+
* 绕过开关与失焦判断,让用户随时一键验证系统通知链路是否通(含权限被拒排查)。
|
|
541
|
+
*/
|
|
542
|
+
_sendTestNotification() {
|
|
543
|
+
this._fireOsNotification('Cursor Feedback', this._i18n.notifyTestBody);
|
|
544
|
+
}
|
|
545
|
+
/** 真正发系统通知的平台分支(macOS / Windows / Linux) */
|
|
546
|
+
_fireOsNotification(title, body) {
|
|
547
|
+
const config = vscode.workspace.getConfiguration('cursorFeedback');
|
|
548
|
+
const withSound = config.get('notificationSound', true);
|
|
549
|
+
// 点击通知的 deep link:唤起 IDE(Cursor 为 cursor://,VSCode 为 vscode://)并聚焦反馈面板。
|
|
550
|
+
// 由 activate() 里注册的 UriHandler 处理 /focus 路径。
|
|
551
|
+
const deepLink = `${vscode.env.uriScheme}://jianger666.cursor-feedback/focus`;
|
|
501
552
|
try {
|
|
502
553
|
if (process.platform === 'darwin') {
|
|
503
|
-
//
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
554
|
+
// 点击通知打开 deep link 依赖 terminal-notifier(osascript 通知点击无法挂动作,系统限制)。
|
|
555
|
+
// 插件内置了一份(resources/terminal-notifier.app,x86_64,Apple Silicon 走 Rosetta),
|
|
556
|
+
// 用户零安装即可用;内置的跑不起来(如无 Rosetta)→ 试 PATH 里 brew 装的原生版 → 最后
|
|
557
|
+
// 回退 osascript(通知照弹,只是点击无动作)。
|
|
558
|
+
const tnArgs = ['-title', title, '-message', body, '-open', deepLink];
|
|
559
|
+
if (withSound)
|
|
560
|
+
tnArgs.push('-sound', 'Glass');
|
|
561
|
+
const bundledTn = vscode.Uri.joinPath(this._extensionUri, 'resources', 'terminal-notifier.app', 'Contents', 'MacOS', 'terminal-notifier').fsPath;
|
|
562
|
+
const fallbackOsascript = () => {
|
|
563
|
+
// AppleScript 字符串转义(execFile 不经过 shell,无注入风险)
|
|
564
|
+
const esc = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
565
|
+
let script = `display notification "${esc(body)}" with title "${esc(title)}"`;
|
|
566
|
+
if (withSound) {
|
|
567
|
+
script += ' sound name "Glass"';
|
|
568
|
+
}
|
|
569
|
+
(0, child_process_1.execFile)('osascript', ['-e', script], () => { });
|
|
570
|
+
};
|
|
571
|
+
// vsix 解包可能丢失可执行位,先补一把(失败无妨,走后续回退)
|
|
572
|
+
try {
|
|
573
|
+
fs.chmodSync(bundledTn, 0o755);
|
|
508
574
|
}
|
|
509
|
-
|
|
575
|
+
catch { /* ignore */ }
|
|
576
|
+
(0, child_process_1.execFile)(bundledTn, tnArgs, (err) => {
|
|
577
|
+
if (!err)
|
|
578
|
+
return;
|
|
579
|
+
(0, child_process_1.execFile)('terminal-notifier', tnArgs, (err2) => {
|
|
580
|
+
if (!err2)
|
|
581
|
+
return;
|
|
582
|
+
fallbackOsascript();
|
|
583
|
+
});
|
|
584
|
+
});
|
|
510
585
|
}
|
|
511
586
|
else if (process.platform === 'win32') {
|
|
512
587
|
// PowerShell 单引号字符串转义
|
|
@@ -519,6 +594,9 @@ class FeedbackViewProvider {
|
|
|
519
594
|
"$texts = $template.GetElementsByTagName('text');",
|
|
520
595
|
`$null = $texts.Item(0).AppendChild($template.CreateTextNode('${esc(title)}'));`,
|
|
521
596
|
`$null = $texts.Item(1).AppendChild($template.CreateTextNode('${esc(body)}'));`,
|
|
597
|
+
// 点击 toast 通过 protocol 激活 deep link,把 IDE 带回前台并聚焦反馈面板
|
|
598
|
+
`$template.DocumentElement.SetAttribute('activationType', 'protocol');`,
|
|
599
|
+
`$template.DocumentElement.SetAttribute('launch', '${esc(deepLink)}');`,
|
|
522
600
|
...(withSound ? [] : [
|
|
523
601
|
"$audio = $template.CreateElement('audio');",
|
|
524
602
|
"$audio.SetAttribute('silent', 'true');",
|
|
@@ -610,6 +688,7 @@ class FeedbackViewProvider {
|
|
|
610
688
|
return;
|
|
611
689
|
this._seenRequestIds.add(this._currentRequest.id);
|
|
612
690
|
this._currentRequest = null;
|
|
691
|
+
this._currentRequestPort = null;
|
|
613
692
|
this._showWaitingState();
|
|
614
693
|
this._view?.webview.postMessage({ type: 'externalResolved' });
|
|
615
694
|
}
|
|
@@ -628,8 +707,9 @@ class FeedbackViewProvider {
|
|
|
628
707
|
* 处理反馈提交
|
|
629
708
|
*/
|
|
630
709
|
async _handleFeedbackSubmit(payload) {
|
|
631
|
-
//
|
|
632
|
-
|
|
710
|
+
// 提交到「当前请求所属」的端口:请求与端口强绑定,绝不能退回 basePort——
|
|
711
|
+
// 多项目同时触发时 basePort 可能是别的项目的 server,会得到 "Request not found"
|
|
712
|
+
const port = this._currentRequestPort || this._activePort || this._basePort;
|
|
633
713
|
try {
|
|
634
714
|
const response = await this._httpPost(`http://127.0.0.1:${port}/api/feedback/submit`, JSON.stringify({
|
|
635
715
|
requestId: payload.requestId,
|
|
@@ -643,7 +723,14 @@ class FeedbackViewProvider {
|
|
|
643
723
|
const result = JSON.parse(response);
|
|
644
724
|
if (result.success) {
|
|
645
725
|
this._currentRequest = null;
|
|
726
|
+
this._currentRequestPort = null;
|
|
646
727
|
this._showWaitingState();
|
|
728
|
+
// 提交结果轻提示:区分「已直接送达」与「撞上超时空窗、已暂存待下一轮」,
|
|
729
|
+
// 让用户确定反馈发出去了(webview 同时借此把本次提交写入历史记录)
|
|
730
|
+
this._view?.webview.postMessage({
|
|
731
|
+
type: 'feedbackSubmitted',
|
|
732
|
+
payload: { queued: !!result.queued }
|
|
733
|
+
});
|
|
647
734
|
}
|
|
648
735
|
else {
|
|
649
736
|
vscode.window.showErrorMessage(this._i18n.submitFailed + ': ' + result.error);
|
|
@@ -802,6 +889,44 @@ class FeedbackViewProvider {
|
|
|
802
889
|
this._memento?.update('autoRetry', v);
|
|
803
890
|
this._postAutoRetryState();
|
|
804
891
|
}
|
|
892
|
+
/**
|
|
893
|
+
* 暂停/恢复当前请求的超时倒计时:转发给 MCP server(真实计时器在 server 端),
|
|
894
|
+
* server 确认后把最新暂停态回推 WebView 刷新显示。
|
|
895
|
+
*/
|
|
896
|
+
async _handleTogglePause(payload) {
|
|
897
|
+
const requestId = payload?.requestId;
|
|
898
|
+
if (!requestId || typeof payload?.paused !== 'boolean')
|
|
899
|
+
return;
|
|
900
|
+
const port = this._currentRequestPort || this._activePort || this._basePort;
|
|
901
|
+
try {
|
|
902
|
+
const response = await this._httpPost(`http://127.0.0.1:${port}/api/feedback/pause`, JSON.stringify({ requestId, paused: payload.paused }));
|
|
903
|
+
const result = JSON.parse(response);
|
|
904
|
+
if (result.success) {
|
|
905
|
+
this._view?.webview.postMessage({
|
|
906
|
+
type: 'pauseState',
|
|
907
|
+
payload: { requestId, paused: result.paused, remainingMs: result.remainingMs }
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
catch {
|
|
912
|
+
// server 不支持(旧版本)或未连接:静默降级,倒计时照常走
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* 轮询时把 server 的暂停态回推 WebView(server 为真相源;每秒校准一次,
|
|
917
|
+
* 面板重建 / 切换侧边栏后也能恢复正确的暂停显示与剩余时间)
|
|
918
|
+
*/
|
|
919
|
+
_maybeSyncPause(pause) {
|
|
920
|
+
if (!pause || typeof pause !== 'object')
|
|
921
|
+
return;
|
|
922
|
+
const p = pause;
|
|
923
|
+
if (!this._currentRequest || p.requestId !== this._currentRequest.id)
|
|
924
|
+
return;
|
|
925
|
+
this._view?.webview.postMessage({
|
|
926
|
+
type: 'pauseState',
|
|
927
|
+
payload: { requestId: p.requestId, paused: !!p.paused, remainingMs: p.remainingMs }
|
|
928
|
+
});
|
|
929
|
+
}
|
|
805
930
|
/**
|
|
806
931
|
* 把飞书配置状态推给 WebView(含 secret 明文,前端用小眼睛切换显示/隐藏)
|
|
807
932
|
*/
|
|
@@ -1063,6 +1188,12 @@ class FeedbackViewProvider {
|
|
|
1063
1188
|
? v.replace(/\{(\w+)\}/g, (m, name) => placeholders[name] ?? m)
|
|
1064
1189
|
: v;
|
|
1065
1190
|
}
|
|
1191
|
+
// 通知权限排查提示按平台注入(linux 的 notify-send 基本不会被拒,留空则前端整行隐藏)
|
|
1192
|
+
i18nResolved['notifyTroubleshoot'] = process.platform === 'darwin'
|
|
1193
|
+
? this._i18n.notifyTroubleshootMac
|
|
1194
|
+
: process.platform === 'win32'
|
|
1195
|
+
? this._i18n.notifyTroubleshootWin
|
|
1196
|
+
: '';
|
|
1066
1197
|
// 替换占位符
|
|
1067
1198
|
htmlTemplate = htmlTemplate
|
|
1068
1199
|
.replace(/\{\{CSP\}\}/g, csp)
|
|
@@ -1073,7 +1204,9 @@ class FeedbackViewProvider {
|
|
|
1073
1204
|
.replace(/\{\{SCRIPT_JS_URI\}\}/g, scriptJsUri.toString())
|
|
1074
1205
|
.replace(/\{\{I18N_JSON\}\}/g, JSON.stringify(i18nResolved))
|
|
1075
1206
|
.replace(/\{\{i18n\.(\w+)\}\}/g, (_, key) => {
|
|
1076
|
-
|
|
1207
|
+
// 用 undefined 判断而非 ||:空字符串是合法值(如 linux 的 notifyTroubleshoot 留空以隐藏整行),
|
|
1208
|
+
// 用 || 会把 key 名渲染到界面上
|
|
1209
|
+
return i18nResolved[key] !== undefined ? i18nResolved[key] : key;
|
|
1077
1210
|
});
|
|
1078
1211
|
return htmlTemplate;
|
|
1079
1212
|
}
|
package/dist/i18n/en.json
CHANGED
|
@@ -72,5 +72,23 @@
|
|
|
72
72
|
"osNotifyLabel": "Notify when in background",
|
|
73
73
|
"osNotifyDesc": "Sends a system notification when the IDE is in the background.",
|
|
74
74
|
"feishuAckLabel": "Get emoji acknowledgement",
|
|
75
|
-
"feishuAckDesc": "After you reply in Feishu, the bot adds a Get emoji as acknowledgement."
|
|
75
|
+
"feishuAckDesc": "After you reply in Feishu, the bot adds a Get emoji as acknowledgement.",
|
|
76
|
+
"quickReplyDefault1": "Keep waiting for my feedback",
|
|
77
|
+
"quickReplyDefault2": "End the task",
|
|
78
|
+
"quickReplyEdit": "Edit quick replies",
|
|
79
|
+
"quickReplyDone": "Done editing",
|
|
80
|
+
"quickReplyAddPlaceholder": "Type a phrase and press Enter",
|
|
81
|
+
"quickReplySendTip": "Click to send",
|
|
82
|
+
"pauseCountdown": "Pause countdown",
|
|
83
|
+
"resumeCountdown": "Resume countdown",
|
|
84
|
+
"pausedLabel": "Paused",
|
|
85
|
+
"notifyTroubleshootMac": "Not seeing system notifications? If you denied permission before, enable it in System Settings → Notifications → terminal-notifier.",
|
|
86
|
+
"notifyTroubleshootWin": "Not seeing system notifications? Enable them in System Settings → Notifications → Windows PowerShell.",
|
|
87
|
+
"notifyTestBtn": "Send test notification",
|
|
88
|
+
"notifyTestSentHint": "Sent — check your system notifications. If nothing shows, see the tip above.",
|
|
89
|
+
"notifyTestBody": "This is a test notification · click to open Cursor",
|
|
90
|
+
"toastSubmitted": "✓ Feedback sent",
|
|
91
|
+
"toastQueued": "✓ Queued — AI will receive it next round",
|
|
92
|
+
"historyBtn": "Feedback history",
|
|
93
|
+
"historyEmpty": "No history yet — submitted feedback will show up here"
|
|
76
94
|
}
|
package/dist/i18n/index.js
CHANGED
|
@@ -163,7 +163,25 @@ function getDefaultMessages() {
|
|
|
163
163
|
osNotifyLabel: "Notify when in background",
|
|
164
164
|
osNotifyDesc: "Sends a system notification when the IDE is in the background.",
|
|
165
165
|
feishuAckLabel: "Get emoji acknowledgement",
|
|
166
|
-
feishuAckDesc: "After you reply in Feishu, the bot adds a Get emoji as acknowledgement."
|
|
166
|
+
feishuAckDesc: "After you reply in Feishu, the bot adds a Get emoji as acknowledgement.",
|
|
167
|
+
quickReplyDefault1: "Keep waiting for my feedback",
|
|
168
|
+
quickReplyDefault2: "End the task",
|
|
169
|
+
quickReplyEdit: "Edit quick replies",
|
|
170
|
+
quickReplyDone: "Done editing",
|
|
171
|
+
quickReplyAddPlaceholder: "Type a phrase and press Enter",
|
|
172
|
+
quickReplySendTip: "Click to send",
|
|
173
|
+
pauseCountdown: "Pause countdown",
|
|
174
|
+
resumeCountdown: "Resume countdown",
|
|
175
|
+
pausedLabel: "Paused",
|
|
176
|
+
notifyTroubleshootMac: "Not seeing system notifications? If you denied permission before, enable it in System Settings → Notifications → terminal-notifier.",
|
|
177
|
+
notifyTroubleshootWin: "Not seeing system notifications? Enable them in System Settings → Notifications → Windows PowerShell.",
|
|
178
|
+
notifyTestBtn: "Send test notification",
|
|
179
|
+
notifyTestSentHint: "Sent — check your system notifications. If nothing shows, see the tip above.",
|
|
180
|
+
notifyTestBody: "This is a test notification · click to open Cursor",
|
|
181
|
+
toastSubmitted: "✓ Feedback sent",
|
|
182
|
+
toastQueued: "✓ Queued — AI will receive it next round",
|
|
183
|
+
historyBtn: "Feedback history",
|
|
184
|
+
historyEmpty: "No history yet — submitted feedback will show up here"
|
|
167
185
|
};
|
|
168
186
|
}
|
|
169
187
|
//# sourceMappingURL=index.js.map
|
package/dist/i18n/zh-CN.json
CHANGED
|
@@ -72,5 +72,23 @@
|
|
|
72
72
|
"osNotifyLabel": "切到后台时提醒",
|
|
73
73
|
"osNotifyDesc": "IDE 切到后台时,用系统通知提醒你。",
|
|
74
74
|
"feishuAckLabel": "Get 表情回执",
|
|
75
|
-
"feishuAckDesc": "你在飞书回复后,机器人加个 Get 表情表示「已收到」。"
|
|
75
|
+
"feishuAckDesc": "你在飞书回复后,机器人加个 Get 表情表示「已收到」。",
|
|
76
|
+
"quickReplyDefault1": "继续等待我的反馈",
|
|
77
|
+
"quickReplyDefault2": "结束任务",
|
|
78
|
+
"quickReplyEdit": "编辑快捷短语",
|
|
79
|
+
"quickReplyDone": "完成编辑",
|
|
80
|
+
"quickReplyAddPlaceholder": "输入短语后回车添加",
|
|
81
|
+
"quickReplySendTip": "点击直接发送",
|
|
82
|
+
"pauseCountdown": "暂停倒计时",
|
|
83
|
+
"resumeCountdown": "继续倒计时",
|
|
84
|
+
"pausedLabel": "已暂停",
|
|
85
|
+
"notifyTroubleshootMac": "收不到系统通知?若曾拒绝过授权,去 系统设置 → 通知 → terminal-notifier 手动开启。",
|
|
86
|
+
"notifyTroubleshootWin": "收不到系统通知?去 系统设置 → 通知 → Windows PowerShell 手动开启。",
|
|
87
|
+
"notifyTestBtn": "发送测试通知",
|
|
88
|
+
"notifyTestSentHint": "已发送,请留意系统通知;没收到就按上面的提示检查权限。",
|
|
89
|
+
"notifyTestBody": "这是一条测试通知 · 点击试试能否唤起 Cursor",
|
|
90
|
+
"toastSubmitted": "✓ 反馈已发送",
|
|
91
|
+
"toastQueued": "✓ 已暂存,AI 下一轮将自动收到",
|
|
92
|
+
"historyBtn": "反馈历史",
|
|
93
|
+
"historyEmpty": "还没有历史记录,提交过的反馈会出现在这里"
|
|
76
94
|
}
|