tabby-ai-assistant 1.0.13 → 1.0.16

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 (42) hide show
  1. package/.editorconfig +18 -0
  2. package/README.md +40 -10
  3. package/dist/index.js +1 -1
  4. package/package.json +5 -3
  5. package/src/components/chat/ai-sidebar.component.scss +220 -9
  6. package/src/components/chat/ai-sidebar.component.ts +379 -29
  7. package/src/components/chat/chat-input.component.ts +36 -4
  8. package/src/components/chat/chat-interface.component.ts +225 -5
  9. package/src/components/chat/chat-message.component.ts +6 -1
  10. package/src/components/settings/context-settings.component.ts +91 -91
  11. package/src/components/terminal/ai-toolbar-button.component.ts +4 -2
  12. package/src/components/terminal/command-suggestion.component.ts +148 -6
  13. package/src/index.ts +81 -19
  14. package/src/providers/tabby/ai-toolbar-button.provider.ts +7 -3
  15. package/src/services/chat/ai-sidebar.service.ts +448 -410
  16. package/src/services/chat/chat-session.service.ts +36 -12
  17. package/src/services/context/compaction.ts +110 -134
  18. package/src/services/context/manager.ts +27 -7
  19. package/src/services/context/memory.ts +17 -33
  20. package/src/services/context/summary.service.ts +136 -0
  21. package/src/services/core/ai-assistant.service.ts +1060 -37
  22. package/src/services/core/ai-provider-manager.service.ts +154 -25
  23. package/src/services/core/checkpoint.service.ts +218 -18
  24. package/src/services/core/toast.service.ts +106 -106
  25. package/src/services/providers/anthropic-provider.service.ts +126 -30
  26. package/src/services/providers/base-provider.service.ts +90 -7
  27. package/src/services/providers/glm-provider.service.ts +151 -38
  28. package/src/services/providers/minimax-provider.service.ts +55 -40
  29. package/src/services/providers/ollama-provider.service.ts +117 -28
  30. package/src/services/providers/openai-compatible.service.ts +164 -34
  31. package/src/services/providers/openai-provider.service.ts +169 -34
  32. package/src/services/providers/vllm-provider.service.ts +116 -28
  33. package/src/services/terminal/terminal-context.service.ts +265 -5
  34. package/src/services/terminal/terminal-manager.service.ts +845 -748
  35. package/src/services/terminal/terminal-tools.service.ts +612 -441
  36. package/src/types/ai.types.ts +156 -3
  37. package/src/utils/cost.utils.ts +249 -0
  38. package/src/utils/validation.utils.ts +306 -2
  39. package/dist/index.js.LICENSE.txt +0 -18
  40. package/src/services/terminal/command-analyzer.service.ts +0 -43
  41. package/src/services/terminal/context-menu.service.ts +0 -45
  42. package/src/services/terminal/hotkey.service.ts +0 -53
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabby-ai-assistant",
3
- "version": "1.0.13",
3
+ "version": "1.0.16",
4
4
  "description": "Tabby终端AI助手插件 - 支持多AI提供商(OpenAI、Anthropic、Minimax、GLM、Ollama、vLLM)",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -38,6 +38,8 @@
38
38
  "@ng-bootstrap/ng-bootstrap": "~14.2.0",
39
39
  "axios": "^1.6.0",
40
40
  "crypto-js": "^4.2.0",
41
+ "marked": "^4.3.0",
42
+ "pako": "^2.1.0",
41
43
  "rxjs": "^7.8.1",
42
44
  "tabby-core": "*",
43
45
  "tabby-settings": "*",
@@ -48,8 +50,8 @@
48
50
  "@types/crypto-js": "^4.2.2",
49
51
  "@types/jest": "^29.5.11",
50
52
  "@types/node": "^20.11.5",
53
+ "@types/pako": "^2.0.3",
51
54
  "angular2-template-loader": "^0.6.2",
52
- "awesome-typescript-loader": "^5.2.1",
53
55
  "css-loader": "^7.1.2",
54
56
  "identity-obj-proxy": "^3.0.0",
55
57
  "jest": "^29.7.0",
@@ -64,7 +66,7 @@
64
66
  "to-string-loader": "^1.2.0",
65
67
  "ts-jest": "^29.1.1",
66
68
  "ts-loader": "^9.5.2",
67
- "typescript": "^4.2.3",
69
+ "typescript": "~5.3.3",
68
70
  "webpack": "^5.24.4",
69
71
  "webpack-cli": "^4.5.0"
70
72
  }
@@ -161,6 +161,7 @@
161
161
  opacity: 0;
162
162
  transform: translateY(10px);
163
163
  }
164
+
164
165
  to {
165
166
  opacity: 1;
166
167
  transform: translateY(0);
@@ -253,7 +254,93 @@
253
254
  line-height: 1.6;
254
255
  color: var(--ai-text-primary, #f8f9fa);
255
256
  word-wrap: break-word;
256
- white-space: pre-wrap;
257
+
258
+ // 重置 pre-wrap,让 marked 渲染的内容正常显示
259
+ p {
260
+ margin: 0 0 8px 0;
261
+
262
+ &:last-child {
263
+ margin-bottom: 0;
264
+ }
265
+ }
266
+
267
+ // 标题样式
268
+ h1,
269
+ h2,
270
+ h3,
271
+ h4,
272
+ h5,
273
+ h6 {
274
+ margin: 12px 0 8px 0;
275
+ font-weight: 600;
276
+ color: var(--ai-primary, #4dabf7);
277
+ }
278
+
279
+ h1 {
280
+ font-size: 1.4em;
281
+ }
282
+
283
+ h2 {
284
+ font-size: 1.25em;
285
+ }
286
+
287
+ h3 {
288
+ font-size: 1.1em;
289
+ }
290
+
291
+ h4,
292
+ h5,
293
+ h6 {
294
+ font-size: 1em;
295
+ }
296
+
297
+ // 列表样式
298
+ ul,
299
+ ol {
300
+ margin: 8px 0;
301
+ padding-left: 20px;
302
+ }
303
+
304
+ li {
305
+ margin: 4px 0;
306
+ }
307
+
308
+ // 链接样式
309
+ a {
310
+ color: var(--ai-primary, #4dabf7);
311
+ text-decoration: none;
312
+
313
+ &:hover {
314
+ text-decoration: underline;
315
+ }
316
+ }
317
+
318
+ // 引用块样式
319
+ blockquote {
320
+ margin: 8px 0;
321
+ padding: 8px 12px;
322
+ border-left: 3px solid var(--ai-primary, #4dabf7);
323
+ background: var(--ai-bg-tertiary, #3d3d3d);
324
+ border-radius: 0 4px 4px 0;
325
+ color: var(--ai-text-secondary, #adb5bd);
326
+ }
327
+
328
+ // 分隔线
329
+ hr {
330
+ border: none;
331
+ border-top: 1px solid var(--ai-border, #4a4a4a);
332
+ margin: 12px 0;
333
+ }
334
+
335
+ // 粗体和斜体
336
+ strong {
337
+ font-weight: 600;
338
+ color: var(--ai-text-primary, #f8f9fa);
339
+ }
340
+
341
+ em {
342
+ font-style: italic;
343
+ }
257
344
 
258
345
  // 代码块样式
259
346
  code {
@@ -285,7 +372,8 @@
285
372
  margin: 8px 0;
286
373
  font-size: 12px;
287
374
 
288
- th, td {
375
+ th,
376
+ td {
289
377
  border: 1px solid var(--ai-border, #4a4a4a);
290
378
  padding: 6px 10px;
291
379
  text-align: left;
@@ -300,6 +388,126 @@
300
388
  background: rgba(var(--ai-bg-secondary, #2d2d2d), 0.3);
301
389
  }
302
390
  }
391
+
392
+ // 复选框样式(GitHub 风格)
393
+ input[type="checkbox"] {
394
+ margin-right: 6px;
395
+ }
396
+
397
+ // 工具调用卡片样式
398
+ .tool-call-card {
399
+ margin: 12px 0;
400
+ border-radius: 8px;
401
+ border: 1px solid var(--ai-border, #4a4a4a);
402
+ overflow: hidden;
403
+ background: var(--ai-bg-tertiary, #3d3d3d);
404
+
405
+ .tool-header {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: 8px;
409
+ padding: 8px 12px;
410
+ background: rgba(0, 0, 0, 0.2);
411
+ border-bottom: 1px solid var(--ai-border, #4a4a4a);
412
+
413
+ .tool-icon {
414
+ font-size: 14px;
415
+ }
416
+
417
+ .tool-name {
418
+ font-weight: 600;
419
+ font-family: 'Courier New', 'Consolas', monospace;
420
+ color: var(--ai-primary, #4dabf7);
421
+ }
422
+
423
+ .tool-status {
424
+ font-size: 12px;
425
+ color: var(--ai-text-secondary, #adb5bd);
426
+ margin-left: auto;
427
+ }
428
+
429
+ .tool-duration {
430
+ font-size: 11px;
431
+ color: var(--ai-text-secondary, #adb5bd);
432
+ background: rgba(0, 0, 0, 0.3);
433
+ padding: 2px 6px;
434
+ border-radius: 4px;
435
+ margin-left: auto;
436
+ }
437
+ }
438
+
439
+ .tool-output {
440
+ padding: 8px 12px;
441
+
442
+ .tool-output-header {
443
+ font-size: 11px;
444
+ font-weight: 600;
445
+ color: var(--ai-text-secondary, #adb5bd);
446
+ margin-bottom: 4px;
447
+ }
448
+
449
+ .tool-output-content {
450
+ margin: 0;
451
+ padding: 8px;
452
+ background: rgba(0, 0, 0, 0.2);
453
+ border-radius: 4px;
454
+ font-size: 12px;
455
+ overflow-x: auto;
456
+ max-height: 200px;
457
+ overflow-y: auto;
458
+ white-space: pre-wrap;
459
+ word-break: break-word;
460
+ }
461
+ }
462
+
463
+ // 执行中状态
464
+ &.tool-executing {
465
+ border-color: var(--ai-warning, #fcc419);
466
+
467
+ .tool-header {
468
+ background: rgba(252, 196, 25, 0.15);
469
+ }
470
+
471
+ .tool-status {
472
+ color: var(--ai-warning, #fcc419);
473
+ animation: pulse 1.5s infinite;
474
+ }
475
+ }
476
+
477
+ // 成功状态
478
+ &.tool-success {
479
+ border-color: var(--ai-success, #51cf66);
480
+
481
+ .tool-header {
482
+ background: rgba(81, 207, 102, 0.15);
483
+ }
484
+ }
485
+
486
+ // 失败状态
487
+ &.tool-error {
488
+ border-color: var(--ai-danger, #ff6b6b);
489
+
490
+ .tool-header {
491
+ background: rgba(255, 107, 107, 0.15);
492
+ }
493
+
494
+ .tool-error-message .tool-output-content {
495
+ color: var(--ai-danger, #ff6b6b);
496
+ }
497
+ }
498
+ }
499
+
500
+ @keyframes pulse {
501
+
502
+ 0%,
503
+ 100% {
504
+ opacity: 1;
505
+ }
506
+
507
+ 50% {
508
+ opacity: 0.5;
509
+ }
510
+ }
303
511
  }
304
512
  }
305
513
  }
@@ -332,10 +540,14 @@
332
540
  }
333
541
 
334
542
  @keyframes loadingDot {
335
- 0%, 80%, 100% {
543
+
544
+ 0%,
545
+ 80%,
546
+ 100% {
336
547
  transform: scale(0.6);
337
548
  opacity: 0.5;
338
549
  }
550
+
339
551
  40% {
340
552
  transform: scale(1);
341
553
  opacity: 1;
@@ -483,11 +695,10 @@
483
695
 
484
696
  &:hover {
485
697
  background: linear-gradient(to right,
486
- transparent,
487
- var(--ai-primary, #4dabf7) 40%,
488
- var(--ai-primary, #4dabf7) 60%,
489
- transparent
490
- ) !important;
698
+ transparent,
699
+ var(--ai-primary, #4dabf7) 40%,
700
+ var(--ai-primary, #4dabf7) 60%,
701
+ transparent) !important;
491
702
  }
492
703
 
493
704
  &:active {
@@ -508,4 +719,4 @@
508
719
  .ai-sidebar-input {
509
720
  padding: 10px 12px;
510
721
  }
511
- }
722
+ }