koishi-plugin-chat-patch 1.0.10 → 1.0.12

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.
@@ -65,6 +65,9 @@
65
65
  color: #7276b7;
66
66
  line-height: 1.3;
67
67
  word-wrap: break-word;
68
+ word-break: break-all;
69
+ overflow-wrap: anywhere;
70
+ hyphens: auto;
68
71
  }
69
72
 
70
73
  .quote-content .message-image {
@@ -422,6 +425,9 @@
422
425
  display: inline-block;
423
426
  max-width: 80%;
424
427
  text-align: left;
428
+ word-wrap: break-word;
429
+ word-break: break-all;
430
+ overflow-wrap: anywhere;
425
431
  }
426
432
 
427
433
  @keyframes highlight {
@@ -486,10 +492,11 @@
486
492
  color: currentColor;
487
493
  line-height: 1.4;
488
494
  word-wrap: break-word;
489
- word-break: break-word;
495
+ word-break: break-all;
490
496
  white-space: pre-wrap;
491
497
  max-width: 100%;
492
- overflow-wrap: break-word;
498
+ overflow-wrap: anywhere;
499
+ hyphens: auto;
493
500
  }
494
501
 
495
502
  .message-item:not(.bot-message) .message-text {
@@ -499,6 +506,9 @@
499
506
  border-bottom-left-radius: 4px;
500
507
  display: inline-block;
501
508
  max-width: 80%;
509
+ word-wrap: break-word;
510
+ word-break: break-all;
511
+ overflow-wrap: anywhere;
502
512
  }
503
513
 
504
514
  .message-input {
@@ -641,6 +651,10 @@
641
651
 
642
652
  .message-text-content {
643
653
  display: inline;
654
+ word-wrap: break-word;
655
+ word-break: break-all;
656
+ overflow-wrap: anywhere;
657
+ hyphens: auto;
644
658
  }
645
659
 
646
660
  .message-paragraph {
@@ -683,6 +697,9 @@
683
697
  font-size: 13px;
684
698
  margin: 2px 0;
685
699
  line-height: 1.4;
700
+ word-wrap: break-word;
701
+ word-break: break-all;
702
+ overflow-wrap: anywhere;
686
703
  }
687
704
 
688
705
  .forward-message-footer {
@@ -742,6 +759,9 @@
742
759
  color: #555;
743
760
  font-size: 13px;
744
761
  line-height: 1.4;
762
+ word-wrap: break-word;
763
+ word-break: break-all;
764
+ overflow-wrap: anywhere;
745
765
  }
746
766
 
747
767
  .message-at {
@@ -839,6 +859,10 @@
839
859
 
840
860
  .message-text-content {
841
861
  display: inline;
862
+ word-wrap: break-word;
863
+ word-break: break-all;
864
+ overflow-wrap: anywhere;
865
+ hyphens: auto;
842
866
  }
843
867
 
844
868
  .message-image-container {
@@ -1241,6 +1265,8 @@ body.dragging-bubble-global {
1241
1265
  opacity: .8;
1242
1266
  white-space: pre-wrap;
1243
1267
  word-wrap: break-word;
1268
+ word-break: break-all;
1269
+ overflow-wrap: anywhere;
1244
1270
  max-height: 200px;
1245
1271
  overflow-y: auto;
1246
1272
  border: 1px solid rgba(128, 128, 128, .2);
@@ -1376,6 +1402,10 @@ body.dragging-bubble-global {
1376
1402
  padding: 6px;
1377
1403
  }
1378
1404
 
1405
+ .message-text {
1406
+ max-width: 90% !important;
1407
+ }
1408
+
1379
1409
  .message-avatar {
1380
1410
  width: 28px;
1381
1411
  height: 28px;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .message-quote[data-v-323dce07]{margin:8px 0;padding:8px 12px;background-color:#bebebe1a;border-left:4px solid rgba(151,152,152,.45);border-radius:6px;font-size:.9em;position:relative}.quote-indicator[data-v-323dce07]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-323dce07]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-323dce07]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#6c757d;color:#fff;font-size:10px;font-weight:700}.quote-username[data-v-323dce07]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-323dce07]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-323dce07]{color:#7276b7;line-height:1.3;word-wrap:break-word}.quote-content .message-image[data-v-323dce07]{max-width:200px;max-height:100px}.quote-content .message-image-container[data-v-323dce07]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-323dce07]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-323dce07]{color:#adb5bd}.quote-username[data-v-323dce07]{color:#0d6efd}}.chat-container[data-v-323dce07]{display:flex;height:100vh;background:transparent;margin-left:0%;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{display:flex;flex-direction:column;background:transparent;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-323dce07]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-323dce07]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-323dce07]{flex:1;border-right:none}.panel-header[data-v-323dce07]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:transparent;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-323dce07]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-323dce07]{display:none;background:none;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-323dce07]:hover{background:#8080801a}.bot-items[data-v-323dce07],.channel-items[data-v-323dce07]{flex:1;overflow-y:auto;max-height:calc(100vh - 60px)}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{display:flex;align-items:center;padding:12px 16px;cursor:pointer;border-bottom:1px solid rgba(128,128,128,.1);transition:background-color .2s}.bot-item[data-v-323dce07]:hover,.channel-item[data-v-323dce07]:hover{background:#8080801a}.bot-item.active[data-v-323dce07],.channel-item.active[data-v-323dce07]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-323dce07]{width:40px;height:40px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0}.bot-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-323dce07]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-323dce07]{flex:1}.bot-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-323dce07]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-323dce07]{background:#4caf50}.bot-status.offline[data-v-323dce07]{background:#f44336}.channel-info[data-v-323dce07]{flex:1}.channel-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-323dce07]{background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;position:relative;transition:all .2s ease}.channel-message-count.draggable-bubble[data-v-323dce07]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble[data-v-323dce07]:active,.channel-message-count.draggable-bubble.dragging[data-v-323dce07]{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-323dce07]{position:fixed;z-index:1000;pointer-events:none;transition:none;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;box-shadow:0 4px 12px #2196f366}.dragging-clone.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes pulseThreshold-323dce07{0%,to{opacity:.4;transform:scale(.9);border-color:#f4433699;box-shadow:0 0 15px #f4433633}50%{opacity:.8;transform:scale(1.1);border-color:#f44336;box-shadow:0 0 25px #f4433666}}@keyframes menuSlideIn-323dce07{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-323dce07]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-323dce07]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-323dce07]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-323dce07]:hover{background-color:#8080801a}.message-item.new-message[data-v-323dce07]{background-color:#4caf5033;animation:highlight-323dce07 2s ease-out}.message-item.bot-message[data-v-323dce07]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-323dce07]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-323dce07]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-323dce07]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-323dce07]{order:1}.message-item.bot-message .message-text[data-v-323dce07]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left}@keyframes highlight-323dce07{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-323dce07]{width:32px;height:32px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0;flex-shrink:0}.message-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-323dce07]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-323dce07]{flex:1}.message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-323dce07]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-323dce07]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-word;white-space:pre-wrap;max-width:100%;overflow-wrap:break-word}.message-item:not(.bot-message) .message-text[data-v-323dce07]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%}.message-input[data-v-323dce07]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:transparent;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-323dce07]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-323dce07]{position:absolute;right:24px;bottom:18%;width:48px;height:48px;background:#2196f3;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #2196f34d;color:#fff;transition:all .3s ease;z-index:100;border:2px solid rgba(255,255,255,.2)}.floating-scroll-button[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-323dce07]:active{transform:scale(.95)}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-323dce07]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-323dce07]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease}.message-image-loading[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#f443361a;border:1px solid rgba(244,67,54,.3);border-radius:4px;color:#f44336;font-size:12px;max-width:300px;word-break:break-word}.message-paragraph[data-v-323dce07]{display:block;margin-bottom:4px}.message-paragraph[data-v-323dce07]:last-child{margin-bottom:0}.forward-message-container[data-v-323dce07]{border:1px solid #ffffff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-323dce07]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-323dce07]:hover{background:#f0f0f0}.forward-message-title[data-v-323dce07]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-323dce07]{color:#666;font-size:13px;margin:2px 0;line-height:1.4}.forward-message-footer[data-v-323dce07]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-323dce07]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-323dce07]{color:#666;font-size:12px}.forward-message-expanded[data-v-323dce07]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-323dce07]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-323dce07]:last-child{border-bottom:none}.forwarded-message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-323dce07]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-323dce07]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-323dce07]{color:#555;font-size:13px;line-height:1.4}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-323dce07]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:none;background:transparent;color:currentColor}.input-row input[data-v-323dce07]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-323dce07]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;flex-shrink:0;white-space:nowrap}.input-row button[data-v-323dce07]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-323dce07]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-323dce07]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-323dce07]{display:inline}.message-image-container[data-v-323dce07]{display:block;margin:4px 0}.message-image[data-v-323dce07]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-323dce07]:hover{transform:scale(1.02)}.message-image-loading[data-v-323dce07]{height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3)}.message-image-error[data-v-323dce07]{min-height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3);padding:8px;text-align:center}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 6px;border-radius:4px;font-weight:500;cursor:pointer;display:inline-block;margin:0 2px}.message-at[data-v-323dce07]:hover{background:#2196f333}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-323dce07{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes shake-323dce07{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-323dce07]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-323dce07]{position:fixed;pointer-events:none;border:3px dashed rgba(244,67,54,.8);border-radius:50%;z-index:999;background:#f443361a;box-shadow:0 0 20px #f443364d;animation:pulseThreshold-323dce07 1.5s ease-in-out infinite}.context-menu[data-v-323dce07]{position:fixed;background:#ffffffa6;border:1px solid rgba(0,0,0,.1);border-radius:8px;box-shadow:0 8px 32px #00000026;z-index:10000;min-width:180px;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);overflow:hidden}.context-menu-item[data-v-323dce07]{padding:12px 16px;cursor:pointer;color:#333;font-size:14px;font-weight:500;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.08);position:relative}.context-menu-item[data-v-323dce07]:last-child{border-bottom:none}.context-menu-item[data-v-323dce07]:hover{background:#2196f31a;color:#1976d2;transform:translate(2px)}.context-menu-item.danger[data-v-323dce07]{color:#d32f2f}.context-menu-item.danger[data-v-323dce07]:hover{background:#f443361a;color:#c62828}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-323dce07]:before,.channel-item.pinned[data-v-323dce07]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-323dce07]{background:#ffffff26;border-color:#fff3;box-shadow:0 8px 32px #0006}.context-menu-item[data-v-323dce07]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-323dce07]:hover{background:#2196f333;color:#64b5f6}.context-menu-item.danger[data-v-323dce07]{color:#ff8a80}.context-menu-item.danger[data-v-323dce07]:hover{background:#f4433633;color:#ffab91}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc10726}}.message-share-card[data-v-323dce07]{display:inline-block;width:75px;margin:8px 0;border:1px solid rgba(128,128,128,.2);border-radius:12px;background:#ffffff0d;transition:all .3s ease;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.message-share-card[data-v-323dce07]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-323dce07]{width:100%;position:relative;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:12px 12px 0 0}.share-card-image[data-v-323dce07]{max-width:calc(100% - 8px);width:auto;height:auto;object-fit:contain;transition:transform .3s ease;display:block;border-radius:4px}.message-share-card:hover .share-card-image[data-v-323dce07]{transform:scale(1.05)}.share-card-content[data-v-323dce07]{padding:8px}.share-card-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-323dce07]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-323dce07]{flex:1;min-width:0}.share-card-app-name[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-323dce07]{font-size:10px;font-weight:600;color:currentColor;line-height:1.2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.share-card-desc[data-v-323dce07]{font-size:14px;color:currentColor;opacity:.8;line-height:1.4;margin-bottom:12px;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.share-card-link-hint[data-v-323dce07]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-323dce07]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-323dce07]:after{transform:translate(2px)}.message-json-error[data-v-323dce07],.message-json-raw[data-v-323dce07]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-323dce07]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-323dce07]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-323dce07]{margin-top:8px}.json-raw-data summary[data-v-323dce07]{cursor:pointer;font-size:12px;color:#2196f3;font-weight:500;padding:4px 8px;border-radius:4px;background:#2196f31a;display:inline-block;transition:background-color .2s ease}.json-raw-data summary[data-v-323dce07]:hover{background:#2196f333}.json-raw-content[data-v-323dce07]{margin-top:8px;padding:12px;background:#8080801a;border-radius:8px;font-family:Courier New,monospace;font-size:12px;color:currentColor;opacity:.8;white-space:pre-wrap;word-wrap:break-word;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-323dce07]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-323dce07]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-323dce07]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-323dce07]{position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-323dce07]{transform:translate(0);z-index:3}.channel-list[data-v-323dce07]{transform:translate(100%);z-index:2}.message-area[data-v-323dce07]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-323dce07]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-323dce07]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-323dce07]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-323dce07]{transform:translate(0);z-index:3}.back-button[data-v-323dce07]{display:none!important}.panel-header[data-v-323dce07]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-323dce07]{text-align:right}.floating-scroll-button[data-v-323dce07]{right:16px;bottom:70px;width:40px;height:40px}.message-input[data-v-323dce07]{padding:8px 12px 12px;position:fixed;bottom:0;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10}.input-row input[data-v-323dce07]{font-size:16px;padding:10px 12px}.input-row button[data-v-323dce07]{padding:10px 16px;font-size:16px}.message-history[data-v-323dce07]{padding:12px 12px 80px;max-height:calc(100vh - 140px)}.message-item[data-v-323dce07]{margin-bottom:12px;padding:6px}.message-avatar[data-v-323dce07]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-left:8px}.message-image[data-v-323dce07]{max-width:280px;max-height:160px}.quote-content .message-image[data-v-323dce07]{max-width:150px;max-height:80px}.context-menu[data-v-323dce07]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-323dce07]{padding:14px 16px;font-size:16px}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{padding:14px 16px}.bot-avatar[data-v-323dce07]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-323dce07],.channel-name[data-v-323dce07]{font-size:15px}.bot-platform[data-v-323dce07],.channel-type[data-v-323dce07]{font-size:13px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-323dce07]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-323dce07]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-323dce07]{max-width:350px;max-height:180px}}.chat-container.swiping[data-v-323dce07]{overflow:hidden}.bot-list.swiping[data-v-323dce07],.channel-list.swiping[data-v-323dce07],.message-area.swiping[data-v-323dce07]{transition:none!important}.swipe-indicator[data-v-323dce07]{position:fixed;top:50%;left:20px;transform:translateY(-50%);background:#2196f3cc;color:#fff;padding:8px 12px;border-radius:20px;font-size:14px;z-index:1000;opacity:0;transition:opacity .2s ease;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.swipe-indicator.show[data-v-323dce07]{opacity:1}.message-area .message-content[data-v-323dce07]{padding-bottom:80px}.image-preview-container[data-v-323dce07]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-323dce07]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-323dce07]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-323dce07]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-323dce07]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-323dce07]{position:relative;margin-right:8px}.add-button[data-v-323dce07]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-323dce07]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-323dce07]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-323dce07]:hover:before{opacity:1}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#f093fb,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-323dce07]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-323dce07]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-323dce07 .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-323dce07]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:none;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-323dce07]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#667eea14,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-323dce07]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-323dce07]{flex-shrink:0}@media (prefers-color-scheme: dark){.action-menu[data-v-323dce07]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-323dce07]{color:#fff}.action-menu-item[data-v-323dce07]:before{background:linear-gradient(135deg,#4facfe,#00f2fe)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#4facfe1f,#00f2fe1f);color:#4facfe}.add-button[data-v-323dce07]{background:linear-gradient(135deg,#4facfe,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-323dce07]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#fa709a,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-323dce07]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width: 768px){.image-preview-container[data-v-323dce07]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-323dce07]{width:50px;height:50px}.add-button[data-v-323dce07]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-323dce07]{min-width:100px}.action-menu-item[data-v-323dce07]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-323dce07]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-323dce07]::-webkit-scrollbar{width:6px}.message-history[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.bot-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.channel-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.channel-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-323dce07]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme: dark){.message-history[data-v-323dce07]::-webkit-scrollbar-thumb,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#fff3}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#fff6}}.layout-iframe{width:100%;height:100%;border:none}
1
+ .message-quote[data-v-323dce07]{margin:8px 0;padding:8px 12px;background-color:#bebebe1a;border-left:4px solid rgba(151,152,152,.45);border-radius:6px;font-size:.9em;position:relative}.quote-indicator[data-v-323dce07]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-323dce07]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-323dce07]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#6c757d;color:#fff;font-size:10px;font-weight:700}.quote-username[data-v-323dce07]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-323dce07]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-323dce07]{color:#7276b7;line-height:1.3;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.quote-content .message-image[data-v-323dce07]{max-width:200px;max-height:100px}.quote-content .message-image-container[data-v-323dce07]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-323dce07]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-323dce07]{color:#adb5bd}.quote-username[data-v-323dce07]{color:#0d6efd}}.chat-container[data-v-323dce07]{display:flex;height:100vh;background:transparent;margin-left:0%;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{display:flex;flex-direction:column;background:transparent;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-323dce07]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-323dce07]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-323dce07]{flex:1;border-right:none}.panel-header[data-v-323dce07]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:transparent;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-323dce07]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-323dce07]{display:none;background:none;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-323dce07]:hover{background:#8080801a}.bot-items[data-v-323dce07],.channel-items[data-v-323dce07]{flex:1;overflow-y:auto;max-height:calc(100vh - 60px)}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{display:flex;align-items:center;padding:12px 16px;cursor:pointer;border-bottom:1px solid rgba(128,128,128,.1);transition:background-color .2s}.bot-item[data-v-323dce07]:hover,.channel-item[data-v-323dce07]:hover{background:#8080801a}.bot-item.active[data-v-323dce07],.channel-item.active[data-v-323dce07]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-323dce07]{width:40px;height:40px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0}.bot-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-323dce07]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-323dce07]{flex:1}.bot-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-323dce07]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-323dce07]{background:#4caf50}.bot-status.offline[data-v-323dce07]{background:#f44336}.channel-info[data-v-323dce07]{flex:1}.channel-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-323dce07]{background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;position:relative;transition:all .2s ease}.channel-message-count.draggable-bubble[data-v-323dce07]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble[data-v-323dce07]:active,.channel-message-count.draggable-bubble.dragging[data-v-323dce07]{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-323dce07]{position:fixed;z-index:1000;pointer-events:none;transition:none;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;box-shadow:0 4px 12px #2196f366}.dragging-clone.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes pulseThreshold-323dce07{0%,to{opacity:.4;transform:scale(.9);border-color:#f4433699;box-shadow:0 0 15px #f4433633}50%{opacity:.8;transform:scale(1.1);border-color:#f44336;box-shadow:0 0 25px #f4433666}}@keyframes menuSlideIn-323dce07{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-323dce07]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-323dce07]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-323dce07]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-323dce07]:hover{background-color:#8080801a}.message-item.new-message[data-v-323dce07]{background-color:#4caf5033;animation:highlight-323dce07 2s ease-out}.message-item.bot-message[data-v-323dce07]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-323dce07]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-323dce07]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-323dce07]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-323dce07]{order:1}.message-item.bot-message .message-text[data-v-323dce07]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}@keyframes highlight-323dce07{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-323dce07]{width:32px;height:32px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0;flex-shrink:0}.message-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-323dce07]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-323dce07]{flex:1}.message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-323dce07]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-323dce07]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-all;white-space:pre-wrap;max-width:100%;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-item:not(.bot-message) .message-text[data-v-323dce07]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-input[data-v-323dce07]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:transparent;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-323dce07]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-323dce07]{position:absolute;right:24px;bottom:18%;width:48px;height:48px;background:#2196f3;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #2196f34d;color:#fff;transition:all .3s ease;z-index:100;border:2px solid rgba(255,255,255,.2)}.floating-scroll-button[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-323dce07]:active{transform:scale(.95)}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-323dce07]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-323dce07]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease}.message-image-loading[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#f443361a;border:1px solid rgba(244,67,54,.3);border-radius:4px;color:#f44336;font-size:12px;max-width:300px;word-break:break-word}.message-paragraph[data-v-323dce07]{display:block;margin-bottom:4px}.message-paragraph[data-v-323dce07]:last-child{margin-bottom:0}.forward-message-container[data-v-323dce07]{border:1px solid #ffffff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-323dce07]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-323dce07]:hover{background:#f0f0f0}.forward-message-title[data-v-323dce07]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-323dce07]{color:#666;font-size:13px;margin:2px 0;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.forward-message-footer[data-v-323dce07]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-323dce07]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-323dce07]{color:#666;font-size:12px}.forward-message-expanded[data-v-323dce07]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-323dce07]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-323dce07]:last-child{border-bottom:none}.forwarded-message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-323dce07]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-323dce07]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-323dce07]{color:#555;font-size:13px;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-323dce07]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:none;background:transparent;color:currentColor}.input-row input[data-v-323dce07]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-323dce07]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;flex-shrink:0;white-space:nowrap}.input-row button[data-v-323dce07]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-323dce07]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-323dce07]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-323dce07]{display:inline;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-image-container[data-v-323dce07]{display:block;margin:4px 0}.message-image[data-v-323dce07]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-323dce07]:hover{transform:scale(1.02)}.message-image-loading[data-v-323dce07]{height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3)}.message-image-error[data-v-323dce07]{min-height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3);padding:8px;text-align:center}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 6px;border-radius:4px;font-weight:500;cursor:pointer;display:inline-block;margin:0 2px}.message-at[data-v-323dce07]:hover{background:#2196f333}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-323dce07{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes shake-323dce07{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-323dce07]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-323dce07]{position:fixed;pointer-events:none;border:3px dashed rgba(244,67,54,.8);border-radius:50%;z-index:999;background:#f443361a;box-shadow:0 0 20px #f443364d;animation:pulseThreshold-323dce07 1.5s ease-in-out infinite}.context-menu[data-v-323dce07]{position:fixed;background:#ffffffa6;border:1px solid rgba(0,0,0,.1);border-radius:8px;box-shadow:0 8px 32px #00000026;z-index:10000;min-width:180px;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);overflow:hidden}.context-menu-item[data-v-323dce07]{padding:12px 16px;cursor:pointer;color:#333;font-size:14px;font-weight:500;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.08);position:relative}.context-menu-item[data-v-323dce07]:last-child{border-bottom:none}.context-menu-item[data-v-323dce07]:hover{background:#2196f31a;color:#1976d2;transform:translate(2px)}.context-menu-item.danger[data-v-323dce07]{color:#d32f2f}.context-menu-item.danger[data-v-323dce07]:hover{background:#f443361a;color:#c62828}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-323dce07]:before,.channel-item.pinned[data-v-323dce07]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-323dce07]{background:#ffffff26;border-color:#fff3;box-shadow:0 8px 32px #0006}.context-menu-item[data-v-323dce07]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-323dce07]:hover{background:#2196f333;color:#64b5f6}.context-menu-item.danger[data-v-323dce07]{color:#ff8a80}.context-menu-item.danger[data-v-323dce07]:hover{background:#f4433633;color:#ffab91}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc10726}}.message-share-card[data-v-323dce07]{display:inline-block;width:75px;margin:8px 0;border:1px solid rgba(128,128,128,.2);border-radius:12px;background:#ffffff0d;transition:all .3s ease;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.message-share-card[data-v-323dce07]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-323dce07]{width:100%;position:relative;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:12px 12px 0 0}.share-card-image[data-v-323dce07]{max-width:calc(100% - 8px);width:auto;height:auto;object-fit:contain;transition:transform .3s ease;display:block;border-radius:4px}.message-share-card:hover .share-card-image[data-v-323dce07]{transform:scale(1.05)}.share-card-content[data-v-323dce07]{padding:8px}.share-card-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-323dce07]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-323dce07]{flex:1;min-width:0}.share-card-app-name[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-323dce07]{font-size:10px;font-weight:600;color:currentColor;line-height:1.2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.share-card-desc[data-v-323dce07]{font-size:14px;color:currentColor;opacity:.8;line-height:1.4;margin-bottom:12px;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.share-card-link-hint[data-v-323dce07]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-323dce07]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-323dce07]:after{transform:translate(2px)}.message-json-error[data-v-323dce07],.message-json-raw[data-v-323dce07]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-323dce07]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-323dce07]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-323dce07]{margin-top:8px}.json-raw-data summary[data-v-323dce07]{cursor:pointer;font-size:12px;color:#2196f3;font-weight:500;padding:4px 8px;border-radius:4px;background:#2196f31a;display:inline-block;transition:background-color .2s ease}.json-raw-data summary[data-v-323dce07]:hover{background:#2196f333}.json-raw-content[data-v-323dce07]{margin-top:8px;padding:12px;background:#8080801a;border-radius:8px;font-family:Courier New,monospace;font-size:12px;color:currentColor;opacity:.8;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-323dce07]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-323dce07]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-323dce07]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-323dce07]{position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-323dce07]{transform:translate(0);z-index:3}.channel-list[data-v-323dce07]{transform:translate(100%);z-index:2}.message-area[data-v-323dce07]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-323dce07]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-323dce07]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-323dce07]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-323dce07]{transform:translate(0);z-index:3}.back-button[data-v-323dce07]{display:none!important}.panel-header[data-v-323dce07]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-323dce07]{text-align:right}.floating-scroll-button[data-v-323dce07]{right:16px;bottom:70px;width:40px;height:40px}.message-input[data-v-323dce07]{padding:8px 12px 12px;position:fixed;bottom:0;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10}.input-row input[data-v-323dce07]{font-size:16px;padding:10px 12px}.input-row button[data-v-323dce07]{padding:10px 16px;font-size:16px}.message-history[data-v-323dce07]{padding:12px 12px 80px;max-height:calc(100vh - 140px)}.message-item[data-v-323dce07]{margin-bottom:12px;padding:6px}.message-text[data-v-323dce07]{max-width:90%!important}.message-avatar[data-v-323dce07]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-left:8px}.message-image[data-v-323dce07]{max-width:280px;max-height:160px}.quote-content .message-image[data-v-323dce07]{max-width:150px;max-height:80px}.context-menu[data-v-323dce07]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-323dce07]{padding:14px 16px;font-size:16px}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{padding:14px 16px}.bot-avatar[data-v-323dce07]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-323dce07],.channel-name[data-v-323dce07]{font-size:15px}.bot-platform[data-v-323dce07],.channel-type[data-v-323dce07]{font-size:13px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-323dce07]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-323dce07]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-323dce07]{max-width:350px;max-height:180px}}.chat-container.swiping[data-v-323dce07]{overflow:hidden}.bot-list.swiping[data-v-323dce07],.channel-list.swiping[data-v-323dce07],.message-area.swiping[data-v-323dce07]{transition:none!important}.swipe-indicator[data-v-323dce07]{position:fixed;top:50%;left:20px;transform:translateY(-50%);background:#2196f3cc;color:#fff;padding:8px 12px;border-radius:20px;font-size:14px;z-index:1000;opacity:0;transition:opacity .2s ease;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.swipe-indicator.show[data-v-323dce07]{opacity:1}.message-area .message-content[data-v-323dce07]{padding-bottom:80px}.image-preview-container[data-v-323dce07]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-323dce07]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-323dce07]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-323dce07]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-323dce07]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-323dce07]{position:relative;margin-right:8px}.add-button[data-v-323dce07]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-323dce07]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-323dce07]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-323dce07]:hover:before{opacity:1}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#f093fb,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-323dce07]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-323dce07]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-323dce07 .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-323dce07]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:none;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-323dce07]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#667eea14,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-323dce07]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-323dce07]{flex-shrink:0}@media (prefers-color-scheme: dark){.action-menu[data-v-323dce07]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-323dce07]{color:#fff}.action-menu-item[data-v-323dce07]:before{background:linear-gradient(135deg,#4facfe,#00f2fe)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#4facfe1f,#00f2fe1f);color:#4facfe}.add-button[data-v-323dce07]{background:linear-gradient(135deg,#4facfe,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-323dce07]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#fa709a,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-323dce07]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width: 768px){.image-preview-container[data-v-323dce07]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-323dce07]{width:50px;height:50px}.add-button[data-v-323dce07]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-323dce07]{min-width:100px}.action-menu-item[data-v-323dce07]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-323dce07]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-323dce07]::-webkit-scrollbar{width:6px}.message-history[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.bot-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.channel-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.channel-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-323dce07]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme: dark){.message-history[data-v-323dce07]::-webkit-scrollbar-thumb,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#fff3}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#fff6}}.layout-iframe{width:100%;height:100%;border:none}
@@ -0,0 +1,17 @@
1
+ import { FileManager } from './file-manager';
2
+ import { Context } from 'koishi';
3
+ import { Config } from './config';
4
+ export declare class ApiHandlers {
5
+ private ctx;
6
+ private config;
7
+ private fileManager;
8
+ private logger;
9
+ constructor(ctx: Context, config: Config, fileManager: FileManager);
10
+ registerApiHandlers(): void;
11
+ private isFileUrl;
12
+ private createFileUrl;
13
+ private handleLocalFileRequest;
14
+ private setupTempFileCleanup;
15
+ private cleanupTempImagesByCount;
16
+ private logInfo;
17
+ }
@@ -0,0 +1,18 @@
1
+ import { ChatData, MessageInfo } from './types';
2
+ import { Context } from 'koishi';
3
+ import { Config } from './config';
4
+ export declare class FileManager {
5
+ private ctx;
6
+ private config;
7
+ private dataFilePath;
8
+ private fileOperationLock;
9
+ private logger;
10
+ private utils;
11
+ constructor(ctx: Context, config: Config);
12
+ private ensureDataDir;
13
+ readChatDataFromFile(): ChatData;
14
+ writeChatDataToFile(data: ChatData): void;
15
+ cleanExcessMessages(data: ChatData): ChatData;
16
+ addMessageToFile(messageInfo: MessageInfo): Promise<void>;
17
+ private logInfo;
18
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { Context } from 'koishi';
2
+ import { Config } from './config';
3
+ export declare const name = "chat-patch";
4
+ export declare const reusable = false;
5
+ export declare const filter = true;
6
+ export declare const inject: {
7
+ required: string[];
8
+ };
9
+ export declare const usage = "\n\n---\n\n\u5F00\u542F\u540E\uFF0C\u5373\u53EF\u5728koishi\u63A7\u5236\u53F0\u64CD\u4F5C\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u5566\n\n\u6682\u65F6\u53EA\u652F\u6301\u63A5\u53D7\u56FE\u6587\u6D88\u606F / \u53D1\u9001\u6587\u5B57\u6D88\u606F\n\n---\n";
10
+ export { Config } from './config';
11
+ export declare function apply(ctx: Context, config: Config): Promise<void>;
package/lib/index.js CHANGED
@@ -41,10 +41,6 @@ __export(src_exports, {
41
41
  module.exports = __toCommonJS(src_exports);
42
42
  var import_node_path2 = __toESM(require("node:path"));
43
43
 
44
- // src/file-manager.ts
45
- var import_node_path = __toESM(require("node:path"));
46
- var import_node_fs = __toESM(require("node:fs"));
47
-
48
44
  // src/utils.ts
49
45
  var Utils = class {
50
46
  constructor(config) {
@@ -128,147 +124,6 @@ var Utils = class {
128
124
  }
129
125
  };
130
126
 
131
- // src/file-manager.ts
132
- var FileManager = class {
133
- constructor(ctx, config) {
134
- this.ctx = ctx;
135
- this.config = config;
136
- this.dataFilePath = import_node_path.default.resolve(ctx.baseDir, "data", "chat-patch", "chat-data.json");
137
- this.logger = ctx.logger("chat-patch");
138
- this.utils = new Utils(config);
139
- }
140
- static {
141
- __name(this, "FileManager");
142
- }
143
- dataFilePath;
144
- fileOperationLock = Promise.resolve();
145
- logger;
146
- utils;
147
- // 确保目录存在
148
- ensureDataDir() {
149
- const dir = import_node_path.default.dirname(this.dataFilePath);
150
- if (!import_node_fs.default.existsSync(dir)) {
151
- import_node_fs.default.mkdirSync(dir, { recursive: true });
152
- }
153
- }
154
- // 从JSON文件读取数据
155
- readChatDataFromFile() {
156
- try {
157
- if (import_node_fs.default.existsSync(this.dataFilePath)) {
158
- const jsonData = import_node_fs.default.readFileSync(this.dataFilePath, "utf8");
159
- const data = JSON.parse(jsonData);
160
- return {
161
- bots: data.bots || {},
162
- channels: data.channels || {},
163
- messages: data.messages || {},
164
- pinnedBots: data.pinnedBots || [],
165
- pinnedChannels: data.pinnedChannels || [],
166
- lastSaveTime: data.lastSaveTime
167
- };
168
- }
169
- } catch (error) {
170
- this.logger.error("读取聊天数据失败:", error);
171
- }
172
- return {
173
- bots: {},
174
- channels: {},
175
- messages: {},
176
- pinnedBots: [],
177
- pinnedChannels: []
178
- };
179
- }
180
- // 写入数据到JSON文件
181
- writeChatDataToFile(data) {
182
- try {
183
- this.ensureDataDir();
184
- data.lastSaveTime = Date.now();
185
- const jsonData = JSON.stringify(data, null, 2);
186
- import_node_fs.default.writeFileSync(this.dataFilePath, jsonData, "utf8");
187
- } catch (error) {
188
- this.logger.error("写入聊天数据失败:", error);
189
- }
190
- }
191
- // 清理超量消息
192
- cleanExcessMessages(data) {
193
- let cleanedCount = 0;
194
- const cleanedMessages = {};
195
- for (const [channelKey, messages] of Object.entries(data.messages)) {
196
- if (messages.length > this.config.maxMessagesPerChannel) {
197
- const sortedMessages = [...messages].sort((a, b) => a.timestamp - b.timestamp);
198
- const keptMessages = sortedMessages.slice(-this.config.maxMessagesPerChannel);
199
- cleanedCount += messages.length - keptMessages.length;
200
- cleanedMessages[channelKey] = keptMessages;
201
- this.logInfo(`频道 ${channelKey} 清理了 ${messages.length - keptMessages.length} 条旧消息,保留最新 ${keptMessages.length} 条`);
202
- } else {
203
- cleanedMessages[channelKey] = messages;
204
- }
205
- }
206
- if (cleanedCount > 0) {
207
- this.logInfo("总共清理超量消息:", cleanedCount, "条");
208
- }
209
- return {
210
- ...data,
211
- messages: cleanedMessages
212
- };
213
- }
214
- // 添加消息到JSON文件(使用锁机制防止并发冲突)
215
- async addMessageToFile(messageInfo) {
216
- this.fileOperationLock = this.fileOperationLock.then(async () => {
217
- const data = this.readChatDataFromFile();
218
- const channelKey = `${messageInfo.selfId}:${messageInfo.channelId}`;
219
- if (!data.messages[channelKey]) {
220
- data.messages[channelKey] = [];
221
- }
222
- const existingMessage = data.messages[channelKey].find((m) => m.id === messageInfo.id);
223
- if (existingMessage) {
224
- this.logInfo("消息已存在,跳过保存:", {
225
- channelKey,
226
- messageId: messageInfo.id,
227
- existingType: existingMessage.type,
228
- existingContent: existingMessage.content,
229
- newType: messageInfo.type,
230
- newContent: messageInfo.content
231
- });
232
- return;
233
- }
234
- if (!messageInfo.timestamp) {
235
- messageInfo.timestamp = Date.now();
236
- }
237
- const cleanedMessageInfo = this.utils.cleanBase64Content(messageInfo);
238
- const beforeCount = data.messages[channelKey].length;
239
- data.messages[channelKey].push(cleanedMessageInfo);
240
- const afterCount = data.messages[channelKey].length;
241
- if (data.messages[channelKey].length > this.config.maxMessagesPerChannel) {
242
- data.messages[channelKey].sort((a, b) => a.timestamp - b.timestamp);
243
- const removedCount = data.messages[channelKey].length - this.config.maxMessagesPerChannel;
244
- data.messages[channelKey] = data.messages[channelKey].slice(-this.config.maxMessagesPerChannel);
245
- this.logInfo(`频道 ${channelKey} 达到消息上限,清理了 ${removedCount} 条旧消息`);
246
- }
247
- this.writeChatDataToFile(data);
248
- const isCommandMessage = messageInfo.content?.startsWith("++") || messageInfo.content?.startsWith(".");
249
- this.logInfo("添加消息到文件:", {
250
- channelKey,
251
- messageId: messageInfo.id,
252
- content: messageInfo.content,
253
- type: messageInfo.type,
254
- userId: messageInfo.userId,
255
- username: messageInfo.username,
256
- timestamp: messageInfo.timestamp,
257
- isCommandMessage,
258
- 消息数变化: `${beforeCount} -> ${afterCount} -> ${data.messages[channelKey].length}`
259
- });
260
- }).catch((error) => {
261
- this.logger.error("保存消息时发生错误:", error);
262
- });
263
- await this.fileOperationLock;
264
- }
265
- logInfo(...args) {
266
- if (this.config.loggerinfo) {
267
- this.logger.info(...args);
268
- }
269
- }
270
- };
271
-
272
127
  // src/message-handler.ts
273
128
  var MessageHandler = class {
274
129
  constructor(ctx, config, fileManager) {
@@ -472,6 +327,149 @@ var MessageHandler = class {
472
327
  }
473
328
  };
474
329
 
330
+ // src/file-manager.ts
331
+ var import_node_path = __toESM(require("node:path"));
332
+ var import_node_fs = __toESM(require("node:fs"));
333
+ var FileManager = class {
334
+ constructor(ctx, config) {
335
+ this.ctx = ctx;
336
+ this.config = config;
337
+ this.dataFilePath = import_node_path.default.resolve(ctx.baseDir, "data", "chat-patch", "chat-data.json");
338
+ this.logger = ctx.logger("chat-patch");
339
+ this.utils = new Utils(config);
340
+ }
341
+ static {
342
+ __name(this, "FileManager");
343
+ }
344
+ dataFilePath;
345
+ fileOperationLock = Promise.resolve();
346
+ logger;
347
+ utils;
348
+ // 确保目录存在
349
+ ensureDataDir() {
350
+ const dir = import_node_path.default.dirname(this.dataFilePath);
351
+ if (!import_node_fs.default.existsSync(dir)) {
352
+ import_node_fs.default.mkdirSync(dir, { recursive: true });
353
+ }
354
+ }
355
+ // 从JSON文件读取数据
356
+ readChatDataFromFile() {
357
+ try {
358
+ if (import_node_fs.default.existsSync(this.dataFilePath)) {
359
+ const jsonData = import_node_fs.default.readFileSync(this.dataFilePath, "utf8");
360
+ const data = JSON.parse(jsonData);
361
+ return {
362
+ bots: data.bots || {},
363
+ channels: data.channels || {},
364
+ messages: data.messages || {},
365
+ pinnedBots: data.pinnedBots || [],
366
+ pinnedChannels: data.pinnedChannels || [],
367
+ lastSaveTime: data.lastSaveTime
368
+ };
369
+ }
370
+ } catch (error) {
371
+ this.logger.error("读取聊天数据失败:", error);
372
+ }
373
+ return {
374
+ bots: {},
375
+ channels: {},
376
+ messages: {},
377
+ pinnedBots: [],
378
+ pinnedChannels: []
379
+ };
380
+ }
381
+ // 写入数据到JSON文件
382
+ writeChatDataToFile(data) {
383
+ try {
384
+ this.ensureDataDir();
385
+ data.lastSaveTime = Date.now();
386
+ const jsonData = JSON.stringify(data, null, 2);
387
+ import_node_fs.default.writeFileSync(this.dataFilePath, jsonData, "utf8");
388
+ } catch (error) {
389
+ this.logger.error("写入聊天数据失败:", error);
390
+ }
391
+ }
392
+ // 清理超量消息
393
+ cleanExcessMessages(data) {
394
+ let cleanedCount = 0;
395
+ const cleanedMessages = {};
396
+ for (const [channelKey, messages] of Object.entries(data.messages)) {
397
+ if (messages.length > this.config.maxMessagesPerChannel) {
398
+ const sortedMessages = [...messages].sort((a, b) => a.timestamp - b.timestamp);
399
+ const keptMessages = sortedMessages.slice(-this.config.maxMessagesPerChannel);
400
+ cleanedCount += messages.length - keptMessages.length;
401
+ cleanedMessages[channelKey] = keptMessages;
402
+ this.logInfo(`频道 ${channelKey} 清理了 ${messages.length - keptMessages.length} 条旧消息,保留最新 ${keptMessages.length} 条`);
403
+ } else {
404
+ cleanedMessages[channelKey] = messages;
405
+ }
406
+ }
407
+ if (cleanedCount > 0) {
408
+ this.logInfo("总共清理超量消息:", cleanedCount, "条");
409
+ }
410
+ return {
411
+ ...data,
412
+ messages: cleanedMessages
413
+ };
414
+ }
415
+ // 添加消息到JSON文件(使用锁机制防止并发冲突)
416
+ async addMessageToFile(messageInfo) {
417
+ this.fileOperationLock = this.fileOperationLock.then(async () => {
418
+ const data = this.readChatDataFromFile();
419
+ const channelKey = `${messageInfo.selfId}:${messageInfo.channelId}`;
420
+ if (!data.messages[channelKey]) {
421
+ data.messages[channelKey] = [];
422
+ }
423
+ const existingMessage = data.messages[channelKey].find((m) => m.id === messageInfo.id);
424
+ if (existingMessage) {
425
+ this.logInfo("消息已存在,跳过保存:", {
426
+ channelKey,
427
+ messageId: messageInfo.id,
428
+ existingType: existingMessage.type,
429
+ existingContent: existingMessage.content,
430
+ newType: messageInfo.type,
431
+ newContent: messageInfo.content
432
+ });
433
+ return;
434
+ }
435
+ if (!messageInfo.timestamp) {
436
+ messageInfo.timestamp = Date.now();
437
+ }
438
+ const cleanedMessageInfo = this.utils.cleanBase64Content(messageInfo);
439
+ const beforeCount = data.messages[channelKey].length;
440
+ data.messages[channelKey].push(cleanedMessageInfo);
441
+ const afterCount = data.messages[channelKey].length;
442
+ if (data.messages[channelKey].length > this.config.maxMessagesPerChannel) {
443
+ data.messages[channelKey].sort((a, b) => a.timestamp - b.timestamp);
444
+ const removedCount = data.messages[channelKey].length - this.config.maxMessagesPerChannel;
445
+ data.messages[channelKey] = data.messages[channelKey].slice(-this.config.maxMessagesPerChannel);
446
+ this.logInfo(`频道 ${channelKey} 达到消息上限,清理了 ${removedCount} 条旧消息`);
447
+ }
448
+ this.writeChatDataToFile(data);
449
+ const isCommandMessage = messageInfo.content?.startsWith("++") || messageInfo.content?.startsWith(".");
450
+ this.logInfo("添加消息到文件:", {
451
+ channelKey,
452
+ messageId: messageInfo.id,
453
+ content: messageInfo.content,
454
+ type: messageInfo.type,
455
+ userId: messageInfo.userId,
456
+ username: messageInfo.username,
457
+ timestamp: messageInfo.timestamp,
458
+ isCommandMessage,
459
+ 消息数变化: `${beforeCount} -> ${afterCount} -> ${data.messages[channelKey].length}`
460
+ });
461
+ }).catch((error) => {
462
+ this.logger.error("保存消息时发生错误:", error);
463
+ });
464
+ await this.fileOperationLock;
465
+ }
466
+ logInfo(...args) {
467
+ if (this.config.loggerinfo) {
468
+ this.logger.info(...args);
469
+ }
470
+ }
471
+ };
472
+
475
473
  // src/api-handlers.ts
476
474
  var import_koishi = require("koishi");
477
475
  var import_node_url = require("node:url");
@@ -956,7 +954,7 @@ var Config = import_koishi2.Schema.intersect([
956
954
  // src/index.ts
957
955
  var name = "chat-patch";
958
956
  var reusable = false;
959
- var filter = false;
957
+ var filter = true;
960
958
  var inject = {
961
959
  required: ["console"]
962
960
  };
@@ -0,0 +1,16 @@
1
+ import { Context, Session } from 'koishi';
2
+ import { FileManager } from './file-manager';
3
+ import { Config } from './config';
4
+ export declare class MessageHandler {
5
+ private ctx;
6
+ private config;
7
+ private fileManager;
8
+ private logger;
9
+ private utils;
10
+ constructor(ctx: Context, config: Config, fileManager: FileManager);
11
+ updateBotInfoToFile(session: Session): Promise<void>;
12
+ updateChannelInfoToFile(session: Session): Promise<string>;
13
+ broadcastMessageEvent(session: Session): Promise<void>;
14
+ broadcastBotMessageEvent(session: Session): Promise<void>;
15
+ private logInfo;
16
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-chat-patch",
3
3
  "description": "[<ruby>chat-patch<rp>(</rp><rt>点我预览效果</rt><rp>)</rp></ruby>](https://i0.hdslb.com/bfs/openplatform/71074dfc9e5256fc3333d8bd8478bec1af874046.png) 视奸小插件((bushi( (低性能警告)。手机端适配。灵感来自 chat 插件。",
4
- "version": "1.0.10",
4
+ "version": "1.0.12",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -1,6 +1,7 @@
1
+ import { FileManager } from './file-manager'
1
2
  import { Context, h, Logger } from 'koishi'
2
3
  import { Config } from './config'
3
- import { FileManager } from './file-manager'
4
+
4
5
  import { URL, pathToFileURL } from 'node:url'
5
6
 
6
7
  export class ApiHandlers {
@@ -1,10 +1,11 @@
1
- import path from 'node:path'
2
- import fs from 'node:fs'
3
- import { Context, Logger } from 'koishi'
4
1
  import { ChatData, MessageInfo } from './types'
2
+ import { Context, Logger } from 'koishi'
5
3
  import { Config } from './config'
6
4
  import { Utils } from './utils'
7
5
 
6
+ import path from 'node:path'
7
+ import fs from 'node:fs'
8
+
8
9
  export class FileManager {
9
10
  private dataFilePath: string
10
11
  private fileOperationLock = Promise.resolve()
package/src/index.ts CHANGED
@@ -1,17 +1,17 @@
1
- import { Context } from 'koishi'
1
+
2
2
  import { } from '@koishijs/plugin-console'
3
+ import { Context } from 'koishi'
3
4
  import path from 'node:path'
4
- import fs from 'node:fs'
5
5
 
6
- import { Config } from './config'
7
- import { FileManager } from './file-manager'
8
6
  import { MessageHandler } from './message-handler'
7
+ import { FileManager } from './file-manager'
9
8
  import { ApiHandlers } from './api-handlers'
9
+ import { Config } from './config'
10
10
  import { Utils } from './utils'
11
11
 
12
12
  export const name = 'chat-patch'
13
13
  export const reusable = false
14
- export const filter = false
14
+ export const filter = true
15
15
  export const inject = {
16
16
  required: ['console']
17
17
  }
@@ -1,8 +1,8 @@
1
+ import { BotInfo, ChannelInfo, MessageInfo, QuoteInfo } from './types'
1
2
  import { Context, Session, h, Logger } from 'koishi'
2
- import { Config } from './config'
3
3
  import { FileManager } from './file-manager'
4
+ import { Config } from './config'
4
5
  import { Utils } from './utils'
5
- import { BotInfo, ChannelInfo, MessageInfo, QuoteInfo } from './types'
6
6
 
7
7
  export class MessageHandler {
8
8
  private logger: Logger