cursor-feedback 2.1.2 → 2.3.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.
- package/CHANGELOG.md +14 -0
- package/README.md +1 -0
- package/README_CN.md +1 -0
- package/dist/extension.js +250 -18
- package/dist/feishu.js +132 -2
- package/dist/i18n/en.json +23 -1
- package/dist/i18n/index.js +23 -1
- package/dist/i18n/zh-CN.json +23 -1
- package/dist/mcp-server.js +422 -13
- package/dist/webview/index.html +40 -4
- package/dist/webview/script.js +412 -21
- package/dist/webview/styles.css +215 -19
- package/package.json +4 -1
package/dist/webview/styles.css
CHANGED
|
@@ -126,15 +126,12 @@ svg {
|
|
|
126
126
|
outline: none;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
/* ---------- Tooltips (data-tip) ----------
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
position: absolute;
|
|
136
|
-
bottom: calc(100% + 6px);
|
|
137
|
-
right: 0;
|
|
129
|
+
/* ---------- Tooltips (data-tip) ----------
|
|
130
|
+
由 script.js 用单例浮层 + fixed 定位渲染(自动上下翻转、水平钳制在视口内),
|
|
131
|
+
不再用 ::after——绝对定位的伪元素会被任何 overflow 祖先裁切(曾致多处 tooltip 缺角) */
|
|
132
|
+
.tip-float {
|
|
133
|
+
position: fixed;
|
|
134
|
+
z-index: 1000;
|
|
138
135
|
padding: 4px 8px;
|
|
139
136
|
background: var(--vscode-editorWidget-background, #252526);
|
|
140
137
|
color: var(--vscode-editorWidget-foreground, var(--vscode-foreground));
|
|
@@ -142,19 +139,14 @@ svg {
|
|
|
142
139
|
border-radius: var(--radius-sm);
|
|
143
140
|
font-size: 11px;
|
|
144
141
|
white-space: nowrap;
|
|
145
|
-
|
|
142
|
+
max-width: calc(100vw - 16px);
|
|
143
|
+
overflow: hidden;
|
|
144
|
+
text-overflow: ellipsis;
|
|
146
145
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
147
146
|
pointer-events: none;
|
|
148
147
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
bottom: auto;
|
|
152
|
-
top: calc(100% + 6px);
|
|
153
|
-
}
|
|
154
|
-
/* 弹窗头部(关闭按钮)在面板顶部,且面板 overflow-y:auto 会裁掉朝上的 tooltip,改为向下展开 */
|
|
155
|
-
.feishu-modal__head [data-tip]:hover::after {
|
|
156
|
-
bottom: auto;
|
|
157
|
-
top: calc(100% + 6px);
|
|
148
|
+
.tip-float.hidden {
|
|
149
|
+
display: none;
|
|
158
150
|
}
|
|
159
151
|
|
|
160
152
|
/* ---------- Status bar ---------- */
|
|
@@ -240,6 +232,7 @@ svg {
|
|
|
240
232
|
.empty__icon {
|
|
241
233
|
display: grid;
|
|
242
234
|
place-items: center;
|
|
235
|
+
flex: none; /* 高度受限(如排队列表占位)时不被压扁 */
|
|
243
236
|
width: 56px;
|
|
244
237
|
height: 56px;
|
|
245
238
|
border-radius: 50%;
|
|
@@ -268,6 +261,132 @@ svg {
|
|
|
268
261
|
50% { transform: translateY(-3px); opacity: 1; }
|
|
269
262
|
}
|
|
270
263
|
|
|
264
|
+
/* ---------- Queue mode(AI 忙时排队) ----------
|
|
265
|
+
等待提示压缩为顶部小条,下方保留可用的输入框与队列列表 */
|
|
266
|
+
.queue-mode .empty {
|
|
267
|
+
flex: 0 0 auto;
|
|
268
|
+
padding: 14px var(--sp-4);
|
|
269
|
+
gap: var(--sp-1);
|
|
270
|
+
overflow: hidden; /* 拖到最小高度时裁剪而非溢出 */
|
|
271
|
+
/* 高度由 JS 设定(与摘要卡同一比例),队列消息只在卡片内滚动,不挤压下方输入框 */
|
|
272
|
+
/* 与下方反馈卡片一致的卡片外观,避免裸内容悬空 */
|
|
273
|
+
background: var(--surface-raised);
|
|
274
|
+
border: 1px solid var(--line);
|
|
275
|
+
border-radius: var(--radius-lg);
|
|
276
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
277
|
+
}
|
|
278
|
+
.queue-mode .empty__icon {
|
|
279
|
+
width: 34px;
|
|
280
|
+
height: 34px;
|
|
281
|
+
}
|
|
282
|
+
.queue-mode .empty__icon svg {
|
|
283
|
+
width: 16px;
|
|
284
|
+
height: 16px;
|
|
285
|
+
}
|
|
286
|
+
.queue-mode .empty__hint {
|
|
287
|
+
max-width: 260px;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* 排队中的消息列表(内嵌在等待卡片里:卡片高度固定由分隔条控制,列表内部滚动,
|
|
291
|
+
不会随消息增多挤压下方输入框) */
|
|
292
|
+
.waiting-queue {
|
|
293
|
+
align-self: stretch;
|
|
294
|
+
flex: 1 1 auto;
|
|
295
|
+
min-height: 0;
|
|
296
|
+
display: flex;
|
|
297
|
+
flex-direction: column;
|
|
298
|
+
margin-top: var(--sp-2);
|
|
299
|
+
padding-top: var(--sp-2);
|
|
300
|
+
border-top: 1px solid var(--line-soft);
|
|
301
|
+
text-align: left;
|
|
302
|
+
}
|
|
303
|
+
.waiting-queue__head {
|
|
304
|
+
display: flex;
|
|
305
|
+
align-items: center;
|
|
306
|
+
gap: var(--sp-2);
|
|
307
|
+
margin-bottom: 6px;
|
|
308
|
+
}
|
|
309
|
+
.waiting-queue__title {
|
|
310
|
+
font-size: 11px;
|
|
311
|
+
font-weight: 600;
|
|
312
|
+
color: var(--muted);
|
|
313
|
+
}
|
|
314
|
+
.waiting-queue .queue-list {
|
|
315
|
+
flex: 1 1 auto;
|
|
316
|
+
min-height: 0;
|
|
317
|
+
overflow-y: auto;
|
|
318
|
+
}
|
|
319
|
+
.queue-count {
|
|
320
|
+
margin-left: auto;
|
|
321
|
+
font-size: 11px;
|
|
322
|
+
line-height: 16px;
|
|
323
|
+
padding: 0 6px;
|
|
324
|
+
border-radius: 999px;
|
|
325
|
+
color: var(--muted);
|
|
326
|
+
background: var(--surface-sunken);
|
|
327
|
+
border: 1px solid var(--line-soft);
|
|
328
|
+
font-variant-numeric: tabular-nums;
|
|
329
|
+
}
|
|
330
|
+
.queue-list {
|
|
331
|
+
display: flex;
|
|
332
|
+
flex-direction: column;
|
|
333
|
+
gap: 4px;
|
|
334
|
+
}
|
|
335
|
+
.queue-item {
|
|
336
|
+
display: flex;
|
|
337
|
+
align-items: center;
|
|
338
|
+
gap: 6px;
|
|
339
|
+
font-size: 11px;
|
|
340
|
+
padding: 4px 6px;
|
|
341
|
+
border-radius: var(--radius-sm);
|
|
342
|
+
background: var(--surface-sunken);
|
|
343
|
+
border: 1px solid var(--line-soft);
|
|
344
|
+
}
|
|
345
|
+
.queue-item__source {
|
|
346
|
+
flex: none;
|
|
347
|
+
font-size: 10px;
|
|
348
|
+
line-height: 15px;
|
|
349
|
+
padding: 0 5px;
|
|
350
|
+
border-radius: 999px;
|
|
351
|
+
color: var(--muted);
|
|
352
|
+
border: 1px solid var(--line);
|
|
353
|
+
}
|
|
354
|
+
.queue-item__source.is-feishu {
|
|
355
|
+
color: var(--accent);
|
|
356
|
+
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
357
|
+
}
|
|
358
|
+
.queue-item__text {
|
|
359
|
+
flex: 1 1 auto;
|
|
360
|
+
min-width: 0;
|
|
361
|
+
overflow: hidden;
|
|
362
|
+
text-overflow: ellipsis;
|
|
363
|
+
white-space: nowrap;
|
|
364
|
+
color: var(--vscode-foreground);
|
|
365
|
+
}
|
|
366
|
+
.queue-item__meta {
|
|
367
|
+
flex: none;
|
|
368
|
+
color: var(--muted);
|
|
369
|
+
}
|
|
370
|
+
.queue-item__time {
|
|
371
|
+
flex: none;
|
|
372
|
+
color: var(--muted);
|
|
373
|
+
font-variant-numeric: tabular-nums;
|
|
374
|
+
}
|
|
375
|
+
.queue-item .chip-remove.queue-item__remove {
|
|
376
|
+
position: static;
|
|
377
|
+
flex: none;
|
|
378
|
+
width: 14px;
|
|
379
|
+
height: 14px;
|
|
380
|
+
opacity: 0.5;
|
|
381
|
+
background: transparent;
|
|
382
|
+
color: var(--muted);
|
|
383
|
+
}
|
|
384
|
+
.queue-item .chip-remove.queue-item__remove:hover {
|
|
385
|
+
opacity: 1;
|
|
386
|
+
background: transparent;
|
|
387
|
+
color: var(--vscode-errorForeground, #e51400);
|
|
388
|
+
}
|
|
389
|
+
|
|
271
390
|
/* ---------- Form ---------- */
|
|
272
391
|
.form {
|
|
273
392
|
flex: 1;
|
|
@@ -316,6 +435,37 @@ svg {
|
|
|
316
435
|
color: var(--vscode-foreground);
|
|
317
436
|
}
|
|
318
437
|
|
|
438
|
+
/* 历史摘要导航(摘要卡头部右侧的 ‹ n/m › ) */
|
|
439
|
+
.summary-nav {
|
|
440
|
+
margin-left: auto;
|
|
441
|
+
display: flex;
|
|
442
|
+
align-items: center;
|
|
443
|
+
gap: 2px;
|
|
444
|
+
}
|
|
445
|
+
.summary-nav__btn {
|
|
446
|
+
width: 18px;
|
|
447
|
+
height: 18px;
|
|
448
|
+
}
|
|
449
|
+
.summary-nav__btn svg {
|
|
450
|
+
width: 12px;
|
|
451
|
+
height: 12px;
|
|
452
|
+
}
|
|
453
|
+
.summary-nav__btn:disabled {
|
|
454
|
+
opacity: 0.3;
|
|
455
|
+
cursor: default;
|
|
456
|
+
}
|
|
457
|
+
.summary-nav__pos {
|
|
458
|
+
font-size: 10px;
|
|
459
|
+
color: var(--muted);
|
|
460
|
+
font-variant-numeric: tabular-nums;
|
|
461
|
+
min-width: 26px;
|
|
462
|
+
text-align: center;
|
|
463
|
+
}
|
|
464
|
+
/* 正在查看历史轮次的摘要:内容淡化以示区分 */
|
|
465
|
+
.summary--past {
|
|
466
|
+
opacity: 0.72;
|
|
467
|
+
}
|
|
468
|
+
|
|
319
469
|
/* ---------- Resizable panels ---------- */
|
|
320
470
|
/* Summary keeps a user-adjustable height; input flexes to fill the rest,
|
|
321
471
|
so the panel always fills the viewport and the submit button hugs bottom. */
|
|
@@ -809,6 +959,8 @@ body.vscode-light .hljs-regexp { color: #811f3f; }
|
|
|
809
959
|
gap: var(--sp-2);
|
|
810
960
|
}
|
|
811
961
|
.countdown[hidden] { display: none; }
|
|
962
|
+
/* 排队态占位:整行不可见但保留高度,避免反馈态 ↔ 排队态切换时提交栏高度跳动 */
|
|
963
|
+
.countdown--idle { visibility: hidden; }
|
|
812
964
|
.countdown__pause {
|
|
813
965
|
width: 22px;
|
|
814
966
|
height: 22px;
|
|
@@ -1075,6 +1227,50 @@ body.vscode-light .hljs-regexp { color: #811f3f; }
|
|
|
1075
1227
|
cursor: pointer;
|
|
1076
1228
|
}
|
|
1077
1229
|
.feishu-link:hover { text-decoration: underline; }
|
|
1230
|
+
|
|
1231
|
+
/* 扫码创建是配置飞书的首选路径,做成实心小按钮突出 */
|
|
1232
|
+
.feishu-link--primary {
|
|
1233
|
+
padding: 5px 12px;
|
|
1234
|
+
border-radius: 6px;
|
|
1235
|
+
background: var(--vscode-button-background, var(--accent));
|
|
1236
|
+
color: var(--vscode-button-foreground, #fff);
|
|
1237
|
+
font-weight: 600;
|
|
1238
|
+
}
|
|
1239
|
+
.feishu-link--primary:hover {
|
|
1240
|
+
text-decoration: none;
|
|
1241
|
+
background: var(--vscode-button-hoverBackground, var(--accent));
|
|
1242
|
+
filter: brightness(1.08);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/* 扫码一键创建应用(点「扫码快速创建」后展开的二维码区) */
|
|
1246
|
+
.feishu-register {
|
|
1247
|
+
display: flex;
|
|
1248
|
+
flex-direction: column;
|
|
1249
|
+
align-items: center;
|
|
1250
|
+
gap: 8px;
|
|
1251
|
+
padding: 12px;
|
|
1252
|
+
border: 1px dashed var(--line);
|
|
1253
|
+
border-radius: var(--radius-md);
|
|
1254
|
+
}
|
|
1255
|
+
.feishu-register__qr {
|
|
1256
|
+
width: 180px;
|
|
1257
|
+
height: 180px;
|
|
1258
|
+
padding: 6px;
|
|
1259
|
+
background: #fff;
|
|
1260
|
+
border-radius: var(--radius-md);
|
|
1261
|
+
}
|
|
1262
|
+
.feishu-register__hint {
|
|
1263
|
+
margin: 0;
|
|
1264
|
+
font-size: 11px;
|
|
1265
|
+
line-height: 1.5;
|
|
1266
|
+
color: var(--muted);
|
|
1267
|
+
text-align: center;
|
|
1268
|
+
word-break: break-all;
|
|
1269
|
+
}
|
|
1270
|
+
.feishu-register__actions {
|
|
1271
|
+
display: flex;
|
|
1272
|
+
gap: 12px;
|
|
1273
|
+
}
|
|
1078
1274
|
.feishu-modal__hint {
|
|
1079
1275
|
margin: 0;
|
|
1080
1276
|
font-size: 11px;
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "cursor-feedback",
|
|
3
3
|
"displayName": "Cursor Feedback",
|
|
4
4
|
"description": "One Cursor conversation, unlimited AI interactions - Save your monthly request quota! Interactive feedback loop for AI chat via MCP",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.3.0",
|
|
6
6
|
"icon": "icon.png",
|
|
7
7
|
"author": "jianger666",
|
|
8
8
|
"license": "MIT",
|
|
@@ -147,6 +147,7 @@
|
|
|
147
147
|
"watch": "tsc -watch -p ./",
|
|
148
148
|
"lint": "eslint src --ext ts",
|
|
149
149
|
"start:mcp": "node dist/mcp-server.js",
|
|
150
|
+
"test:smoke": "npm run compile && node scripts/smoke-queue.js",
|
|
150
151
|
"prepublishOnly": "npm run check-changelog && npm run compile",
|
|
151
152
|
"check-changelog": "node scripts/check-changelog.js",
|
|
152
153
|
"release": "standard-version",
|
|
@@ -157,6 +158,7 @@
|
|
|
157
158
|
},
|
|
158
159
|
"devDependencies": {
|
|
159
160
|
"@types/node": "^20.10.0",
|
|
161
|
+
"@types/qrcode": "^1.5.6",
|
|
160
162
|
"@types/vscode": "^1.85.0",
|
|
161
163
|
"@types/ws": "^8.5.10",
|
|
162
164
|
"@typescript-eslint/eslint-plugin": "^6.13.0",
|
|
@@ -170,6 +172,7 @@
|
|
|
170
172
|
"dependencies": {
|
|
171
173
|
"@larksuiteoapi/node-sdk": "^1.67.0",
|
|
172
174
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
175
|
+
"qrcode": "^1.5.4",
|
|
173
176
|
"ws": "^8.14.0"
|
|
174
177
|
}
|
|
175
178
|
}
|