@luckydraw/cumulus 0.17.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"webchat.d.ts","sourceRoot":"","sources":["../../../src/gateway/adapters/webchat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAM7B,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAI9B,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,wCAAwC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CACpB,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC,CAC1E,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AA+DD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CA4BT;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,oBAAoB,GAC3B,oBAAoB,CAqHtB"}
1
+ {"version":3,"file":"webchat.d.ts","sourceRoot":"","sources":["../../../src/gateway/adapters/webchat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAM7B,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAU9B,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,wCAAwC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CACpB,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC,CAC1E,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAsGD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CA4BT;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,oBAAoB,GAC3B,oBAAoB,CAmJtB"}
@@ -10,6 +10,8 @@ import * as path from 'path';
10
10
  import { fileURLToPath } from 'url';
11
11
  import { WebSocketServer } from 'ws';
12
12
  import { sendMessage, getOrCreateThread, } from '../../lib/gateway.js';
13
+ import { listAlwaysIncludeFiles, addAlwaysIncludeFile, removeAlwaysIncludeFile, } from '../../lib/config.js';
14
+ import { executeRevert } from '../../lib/revert.js';
13
15
  // ─── Rate limiting ───────────────────────────────────────────────────────────
14
16
  const RATE_LIMIT_WINDOW = 60_000; // 1 minute
15
17
  const RATE_LIMIT_MAX = 20; // messages per window
@@ -134,6 +136,31 @@ export function createWebChatAdapter(config) {
134
136
  await handleCreateThread(ws, data);
135
137
  return;
136
138
  }
139
+ // Handle include list
140
+ if (data.type === 'include_list') {
141
+ await handleIncludeList(ws, data);
142
+ return;
143
+ }
144
+ // Handle include add
145
+ if (data.type === 'include_add') {
146
+ await handleIncludeAdd(ws, data);
147
+ return;
148
+ }
149
+ // Handle include remove
150
+ if (data.type === 'include_remove') {
151
+ await handleIncludeRemove(ws, data);
152
+ return;
153
+ }
154
+ // Handle revert list
155
+ if (data.type === 'revert_list') {
156
+ await handleRevertList(ws, data);
157
+ return;
158
+ }
159
+ // Handle revert execute
160
+ if (data.type === 'revert_execute') {
161
+ await handleRevertExecute(ws, data);
162
+ return;
163
+ }
137
164
  // Handle chat message
138
165
  if (data.type === 'message') {
139
166
  // Rate limit
@@ -179,6 +206,7 @@ async function handleHistory(ws, data) {
179
206
  const limit = Math.min(data.limit || 50, 200);
180
207
  const slice = all.slice(-limit);
181
208
  const messages = slice.map((m) => ({
209
+ id: m.id,
182
210
  role: m.role,
183
211
  content: m.content,
184
212
  timestamp: m.timestamp,
@@ -258,6 +286,135 @@ async function handleCreateThread(ws, data) {
258
286
  });
259
287
  }
260
288
  }
289
+ async function handleIncludeList(ws, data) {
290
+ try {
291
+ const result = await listAlwaysIncludeFiles(data.threadName);
292
+ const files = [
293
+ ...result.global.map((p) => ({ path: p, scope: 'global' })),
294
+ ...result.thread.map((p) => ({ path: p, scope: 'thread' })),
295
+ ];
296
+ wsSend(ws, { type: 'include_list', threadName: data.threadName, files });
297
+ }
298
+ catch (err) {
299
+ wsSend(ws, {
300
+ type: 'error',
301
+ error: `Failed to list include files: ${err instanceof Error ? err.message : String(err)}`,
302
+ threadName: data.threadName,
303
+ });
304
+ }
305
+ }
306
+ async function handleIncludeAdd(ws, data) {
307
+ try {
308
+ if (!data.filePath) {
309
+ wsSend(ws, { type: 'error', error: 'Missing filePath', threadName: data.threadName });
310
+ return;
311
+ }
312
+ const threadName = data.scope === 'global' ? undefined : data.threadName;
313
+ await addAlwaysIncludeFile(data.filePath, threadName);
314
+ // Return updated list
315
+ await handleIncludeList(ws, { type: 'include_list', threadName: data.threadName });
316
+ wsSend(ws, {
317
+ type: 'include_added',
318
+ threadName: data.threadName,
319
+ filePath: data.filePath,
320
+ scope: data.scope || 'thread',
321
+ });
322
+ }
323
+ catch (err) {
324
+ wsSend(ws, {
325
+ type: 'error',
326
+ error: `Failed to add include file: ${err instanceof Error ? err.message : String(err)}`,
327
+ threadName: data.threadName,
328
+ });
329
+ }
330
+ }
331
+ async function handleIncludeRemove(ws, data) {
332
+ try {
333
+ if (!data.filePath) {
334
+ wsSend(ws, { type: 'error', error: 'Missing filePath', threadName: data.threadName });
335
+ return;
336
+ }
337
+ // Try removing from thread first, then global
338
+ try {
339
+ await removeAlwaysIncludeFile(data.filePath, data.threadName);
340
+ }
341
+ catch {
342
+ await removeAlwaysIncludeFile(data.filePath, undefined);
343
+ }
344
+ // Return updated list
345
+ await handleIncludeList(ws, { type: 'include_list', threadName: data.threadName });
346
+ wsSend(ws, {
347
+ type: 'include_removed',
348
+ threadName: data.threadName,
349
+ filePath: data.filePath,
350
+ });
351
+ }
352
+ catch (err) {
353
+ wsSend(ws, {
354
+ type: 'error',
355
+ error: `Failed to remove include file: ${err instanceof Error ? err.message : String(err)}`,
356
+ threadName: data.threadName,
357
+ });
358
+ }
359
+ }
360
+ async function handleRevertList(ws, data) {
361
+ try {
362
+ const thread = await getOrCreateThread(data.threadName);
363
+ const all = await thread.history.getAll();
364
+ // Build turn pairs (user + assistant) for the revert UI
365
+ const turns = [];
366
+ let turnIndex = 0;
367
+ for (let i = 0; i < all.length; i++) {
368
+ const msg = all[i];
369
+ if (msg.role === 'user') {
370
+ turnIndex++;
371
+ const preview = msg.content.slice(0, 80).replace(/\n/g, ' ');
372
+ turns.push({
373
+ index: turnIndex,
374
+ userMessageId: msg.id,
375
+ preview,
376
+ timestamp: msg.timestamp,
377
+ hasGitSnapshot: !!msg.metadata?.gitSnapshot,
378
+ messageCount: all.length - i, // messages that would be removed
379
+ });
380
+ }
381
+ }
382
+ // Newest first
383
+ turns.reverse();
384
+ wsSend(ws, { type: 'revert_list', threadName: data.threadName, turns });
385
+ }
386
+ catch (err) {
387
+ wsSend(ws, {
388
+ type: 'error',
389
+ error: `Failed to list turns: ${err instanceof Error ? err.message : String(err)}`,
390
+ threadName: data.threadName,
391
+ });
392
+ }
393
+ }
394
+ async function handleRevertExecute(ws, data) {
395
+ try {
396
+ if (!data.targetMessageId) {
397
+ wsSend(ws, { type: 'error', error: 'Missing targetMessageId', threadName: data.threadName });
398
+ return;
399
+ }
400
+ const thread = await getOrCreateThread(data.threadName);
401
+ const result = await executeRevert(thread.history, data.targetMessageId);
402
+ wsSend(ws, {
403
+ type: 'revert_done',
404
+ threadName: data.threadName,
405
+ success: result.success,
406
+ removedCount: result.removedCount,
407
+ error: result.error,
408
+ });
409
+ }
410
+ catch (err) {
411
+ wsSend(ws, {
412
+ type: 'error',
413
+ error: `Failed to revert: ${err instanceof Error ? err.message : String(err)}`,
414
+ threadName: data.threadName,
415
+ });
416
+ }
417
+ }
261
418
  async function handleChatMessage(ws, data, pipelineOpts) {
262
419
  const { threadName, message, images } = data;
263
420
  if (!threadName || !message) {
@@ -1 +1 @@
1
- {"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/gateway/adapters/webchat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../../src/gateway/adapters/webchat.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
6
6
  <title>Cumulus Chat</title>
7
7
  <style>
8
8
  html, body {
@@ -81,7 +81,7 @@
81
81
  ' box-shadow: 0 10px 36px rgba(0,0,0,0.55);',
82
82
  '}',
83
83
  '.cumulus-panel.standalone {',
84
- ' width: 100%; height: 100vh;',
84
+ ' width: 100%; height: 100vh; height: 100dvh;',
85
85
  ' border: none; border-radius: 0;',
86
86
  '}',
87
87
 
@@ -426,7 +426,7 @@
426
426
  /* ── Standalone layout ── */
427
427
  '.cumulus-standalone-root {',
428
428
  ' display: flex; flex-direction: row;',
429
- ' width: 100%; height: 100vh;',
429
+ ' width: 100%; height: 100vh; height: 100dvh;',
430
430
  ' background: #1e1e1e; overflow: hidden;',
431
431
  '}',
432
432
 
@@ -574,6 +574,237 @@
574
574
  '}',
575
575
  '.cumulus-topbar-title { font-weight: 600; font-size: 15px; color: #e0e0e0; }',
576
576
  '.cumulus-topbar-right { display: flex; align-items: center; gap: 10px; }',
577
+
578
+ /* ── Panel header action buttons ── */
579
+ '.cumulus-panel-actions { display: flex; align-items: center; gap: 4px; margin-left: auto; margin-right: 8px; }',
580
+ '.cumulus-panel-action-btn {',
581
+ ' background: none; border: 1px solid transparent; color: #777;',
582
+ ' cursor: pointer; font-size: 11px; padding: 2px 7px;',
583
+ ' border-radius: 3px; font-family: inherit; white-space: nowrap;',
584
+ '}',
585
+ '.cumulus-panel-action-btn:hover { color: #ddd; border-color: #555; }',
586
+
587
+ /* ── Overlay (covers the thread panel) ── */
588
+ '.cumulus-overlay {',
589
+ ' position: absolute; top: 0; left: 0; right: 0; bottom: 0;',
590
+ ' background: #1e1e1e; z-index: 10;',
591
+ ' display: flex; flex-direction: column;',
592
+ ' overflow: hidden;',
593
+ '}',
594
+ '.cumulus-overlay-header {',
595
+ ' display: flex; align-items: center; justify-content: space-between;',
596
+ ' padding: 0 0.85em; height: 40px;',
597
+ ' background: #2d2d2d; border-bottom: 1px solid #3a3a3a;',
598
+ ' flex-shrink: 0;',
599
+ '}',
600
+ '.cumulus-overlay-title { font-weight: 600; font-size: 14px; color: #e0e0e0; }',
601
+ '.cumulus-overlay-close {',
602
+ ' background: none; border: none; color: #666; cursor: pointer;',
603
+ ' font-size: 18px; padding: 2px 4px; line-height: 1;',
604
+ '}',
605
+ '.cumulus-overlay-close:hover { color: #e0e0e0; }',
606
+ '.cumulus-overlay-body {',
607
+ ' flex: 1; overflow-y: auto; padding: 0.75em;',
608
+ '}',
609
+ '.cumulus-overlay-footer {',
610
+ ' padding: 0.6em 0.85em; background: #2d2d2d;',
611
+ ' border-top: 1px solid #3a3a3a; flex-shrink: 0;',
612
+ '}',
613
+
614
+ /* ── Include list items ── */
615
+ '.cumulus-include-item {',
616
+ ' display: flex; align-items: center; justify-content: space-between;',
617
+ ' padding: 0.45em 0.6em; border-radius: 4px;',
618
+ ' border: 1px solid #333; margin-bottom: 0.35em;',
619
+ '}',
620
+ '.cumulus-include-item:hover { border-color: #555; }',
621
+ '.cumulus-include-path {',
622
+ ' font-family: "SF Mono", Consolas, monospace; font-size: 0.85em;',
623
+ ' color: #ccc; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1;',
624
+ '}',
625
+ '.cumulus-include-scope {',
626
+ ' font-size: 0.75em; color: #888; background: #2a2a2a;',
627
+ ' border: 1px solid #3a3a3a; border-radius: 3px;',
628
+ ' padding: 1px 6px; margin-left: 8px; flex-shrink: 0;',
629
+ '}',
630
+ '.cumulus-include-remove {',
631
+ ' background: none; border: none; color: #666; cursor: pointer;',
632
+ ' font-size: 16px; padding: 0 4px; margin-left: 6px; flex-shrink: 0;',
633
+ '}',
634
+ '.cumulus-include-remove:hover { color: #ef4444; }',
635
+
636
+ /* ── Include add row ── */
637
+ '.cumulus-include-add-row {',
638
+ ' display: flex; gap: 6px; align-items: center;',
639
+ '}',
640
+ '.cumulus-include-add-input {',
641
+ ' flex: 1; background: #1e1e1e; border: 1px solid #3a3a3a;',
642
+ ' color: #e0e0e0; padding: 0.4em 0.6em; border-radius: 4px;',
643
+ ' font-family: "SF Mono", Consolas, monospace; font-size: 0.85em;',
644
+ ' outline: none;',
645
+ '}',
646
+ '.cumulus-include-add-input:focus { border-color: #0066cc; }',
647
+ '.cumulus-include-add-input::placeholder { color: #555; }',
648
+ '.cumulus-scope-toggle {',
649
+ ' background: #2a2a2a; border: 1px solid #3a3a3a; color: #aaa;',
650
+ ' padding: 0.35em 0.6em; border-radius: 4px; cursor: pointer;',
651
+ ' font-size: 0.8em; white-space: nowrap;',
652
+ '}',
653
+ '.cumulus-scope-toggle:hover { border-color: #555; color: #ddd; }',
654
+ '.cumulus-include-add-btn {',
655
+ ' background: #0066cc; border: none; color: white;',
656
+ ' padding: 0.4em 0.8em; border-radius: 4px; cursor: pointer;',
657
+ ' font-size: 0.85em; white-space: nowrap;',
658
+ '}',
659
+ '.cumulus-include-add-btn:hover { background: #0077ee; }',
660
+
661
+ /* ── Revert turn items ── */
662
+ '.cumulus-revert-item {',
663
+ ' display: flex; align-items: center; gap: 0.6em;',
664
+ ' padding: 0.55em 0.6em; border-radius: 4px;',
665
+ ' border: 1px solid #333; margin-bottom: 0.35em; cursor: pointer;',
666
+ '}',
667
+ '.cumulus-revert-item:hover { border-color: #555; background: #252525; }',
668
+ '.cumulus-revert-turn-num {',
669
+ ' font-size: 0.8em; color: #888; background: #2a2a2a;',
670
+ ' border: 1px solid #3a3a3a; border-radius: 3px;',
671
+ ' padding: 1px 6px; flex-shrink: 0; min-width: 3em; text-align: center;',
672
+ '}',
673
+ '.cumulus-revert-preview {',
674
+ ' flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;',
675
+ ' color: #ccc; font-size: 0.9em;',
676
+ '}',
677
+ '.cumulus-revert-time {',
678
+ ' font-size: 0.75em; color: #666; flex-shrink: 0;',
679
+ '}',
680
+ '.cumulus-revert-git-badge {',
681
+ ' font-size: 0.7em; color: #22c55e; background: rgba(34,197,94,0.1);',
682
+ ' border: 1px solid rgba(34,197,94,0.3); border-radius: 3px;',
683
+ ' padding: 0 5px; flex-shrink: 0;',
684
+ '}',
685
+
686
+ /* ── Revert confirm panel ── */
687
+ '.cumulus-revert-confirm {',
688
+ ' padding: 1.5em; display: flex; flex-direction: column;',
689
+ ' align-items: center; gap: 1em; text-align: center;',
690
+ '}',
691
+ '.cumulus-revert-confirm-text { color: #ccc; font-size: 0.95em; }',
692
+ '.cumulus-revert-confirm-warn { color: #f59e0b; font-size: 0.85em; }',
693
+ '.cumulus-revert-confirm-actions { display: flex; gap: 8px; }',
694
+ '.cumulus-revert-confirm-btn {',
695
+ ' padding: 0.4em 1.2em; border-radius: 4px; cursor: pointer;',
696
+ ' font-size: 0.9em; border: 1px solid #3a3a3a;',
697
+ '}',
698
+ '.cumulus-revert-confirm-btn.danger {',
699
+ ' background: #8b2222; border-color: #a33; color: white;',
700
+ '}',
701
+ '.cumulus-revert-confirm-btn.danger:hover { background: #a33; }',
702
+ '.cumulus-revert-confirm-btn.cancel {',
703
+ ' background: #2a2a2a; color: #ccc;',
704
+ '}',
705
+ '.cumulus-revert-confirm-btn.cancel:hover { background: #3a3a3a; }',
706
+
707
+ /* ── Status message ── */
708
+ '.cumulus-overlay-status {',
709
+ ' padding: 0.4em 0.6em; font-size: 0.85em; border-radius: 4px;',
710
+ ' margin-top: 0.5em; text-align: center;',
711
+ '}',
712
+ '.cumulus-overlay-status.success { color: #22c55e; background: rgba(34,197,94,0.1); }',
713
+ '.cumulus-overlay-status.error { color: #ef4444; background: rgba(239,68,68,0.1); }',
714
+
715
+ /* ── Empty overlay state ── */
716
+ '.cumulus-overlay-empty {',
717
+ ' color: #555; font-size: 0.9em; text-align: center; padding: 2em;',
718
+ '}',
719
+
720
+ /* ── Hamburger toggle (hidden on desktop) ── */
721
+ '.cumulus-sidebar-toggle {',
722
+ ' display: none;',
723
+ ' background: none; border: none; color: #ccc;',
724
+ ' font-size: 22px; padding: 4px 8px; cursor: pointer; line-height: 1;',
725
+ '}',
726
+ '.cumulus-sidebar-toggle:hover { color: #fff; }',
727
+
728
+ /* ── Sidebar backdrop (mobile overlay) ── */
729
+ '.cumulus-sidebar-backdrop {',
730
+ ' display: none;',
731
+ ' position: fixed; top: 0; left: 0; right: 0; bottom: 0;',
732
+ ' background: rgba(0,0,0,0.5); z-index: 99;',
733
+ '}',
734
+
735
+ /* ── Mobile responsive ── */
736
+ '@media (max-width: 768px) {',
737
+
738
+ /* Show hamburger */
739
+ ' .cumulus-sidebar-toggle { display: flex; align-items: center; }',
740
+
741
+ /* Sidebar becomes a slide-over drawer */
742
+ ' .cumulus-sidebar {',
743
+ ' position: fixed; top: 0; left: 0; bottom: 0;',
744
+ ' width: 280px; z-index: 100;',
745
+ ' transform: translateX(-100%);',
746
+ ' transition: transform 0.2s ease;',
747
+ ' border-right: 1px solid #333;',
748
+ ' }',
749
+ ' .cumulus-sidebar.open {',
750
+ ' transform: translateX(0);',
751
+ ' }',
752
+ ' .cumulus-sidebar-backdrop.open {',
753
+ ' display: block;',
754
+ ' }',
755
+
756
+ /* Bigger touch targets for thread items */
757
+ ' .cumulus-thread-item {',
758
+ ' padding: 12px 14px; font-size: 15px; min-height: 44px;',
759
+ ' }',
760
+ ' .cumulus-new-thread-btn { padding: 12px 10px; font-size: 15px; min-height: 44px; }',
761
+ ' .cumulus-new-thread-input { padding: 12px 10px; font-size: 15px; min-height: 44px; }',
762
+ ' .cumulus-sidebar-footer { padding: 10px; }',
763
+
764
+ /* Force single panel (no side-by-side) */
765
+ ' .cumulus-content-area { flex-direction: column; }',
766
+ ' .cumulus-thread-panel { border-left: none; border-top: 1px solid #333; }',
767
+ ' .cumulus-thread-panel:first-child { border-top: none; }',
768
+
769
+ /* Full-width message content */
770
+ ' .cumulus-msg-row { max-width: 100%; }',
771
+ ' .cumulus-input-row { max-width: 100%; }',
772
+ ' .cumulus-attach-strip { max-width: 100%; }',
773
+
774
+ /* Slightly larger base text for readability */
775
+ ' .cumulus-messages { padding: 1em 0.65em; gap: 1.2em; }',
776
+ ' .cumulus-input-area { padding: 0.5em 0.65em 0.6em; }',
777
+
778
+ /* User bubble can be wider on mobile */
779
+ ' .cumulus-msg.user { max-width: 85%; }',
780
+
781
+ /* Tables scroll horizontally */
782
+ ' .cumulus-msg table { display: block; overflow-x: auto; white-space: nowrap; }',
783
+
784
+ /* Code blocks: ensure horizontal scroll works */
785
+ ' .code-block-wrapper pre { font-size: 0.85em; }',
786
+
787
+ /* Auth panel full-width */
788
+ ' .cumulus-auth { padding: 2em 1.2em; }',
789
+ ' .cumulus-auth-input { max-width: 100%; }',
790
+
791
+ /* Overlay footer inputs stack better */
792
+ ' .cumulus-include-add-row { flex-wrap: wrap; }',
793
+ ' .cumulus-include-add-input { min-width: 0; }',
794
+
795
+ /* Topbar: tighter on mobile */
796
+ ' .cumulus-topbar { padding: 0 10px; }',
797
+ ' .cumulus-topbar-title { font-size: 14px; }',
798
+
799
+ /* Panel header: allow wrapping of action buttons */
800
+ ' .cumulus-panel-actions { gap: 2px; }',
801
+ ' .cumulus-panel-action-btn { font-size: 10px; padding: 2px 5px; }',
802
+
803
+ /* Empty state hint: no cmd+click on mobile */
804
+ ' .cumulus-standalone-empty-hint { display: none; }',
805
+
806
+ '}',
807
+
577
808
  ].join('\n');
578
809
 
579
810
  // ─── HTML Escaping ───────────────────────────────────────────────────────────
@@ -1491,12 +1722,13 @@
1491
1722
 
1492
1723
  // App layout — shown after auth
1493
1724
  var appLayout = document.createElement('div');
1494
- appLayout.style.cssText = 'display:none; flex-direction:column; width:100%; height:100vh; overflow:hidden;';
1725
+ appLayout.style.cssText = 'display:none; flex-direction:column; width:100%; height:100vh; height:100dvh; overflow:hidden;';
1495
1726
 
1496
1727
  // Top bar
1497
1728
  var topbar = document.createElement('div');
1498
1729
  topbar.className = 'cumulus-topbar';
1499
1730
  topbar.innerHTML =
1731
+ '<button class="cumulus-sidebar-toggle" data-testid="webchat-sidebar-toggle" aria-label="Toggle sidebar">&#9776;</button>' +
1500
1732
  '<span class="cumulus-topbar-title">Cumulus</span>' +
1501
1733
  '<div class="cumulus-topbar-right">' +
1502
1734
  '<span class="cumulus-header-status">' +
@@ -1550,10 +1782,38 @@
1550
1782
  var contentArea = document.createElement('div');
1551
1783
  contentArea.className = 'cumulus-content-area';
1552
1784
 
1785
+ // Sidebar backdrop (mobile overlay)
1786
+ var sidebarBackdrop = document.createElement('div');
1787
+ sidebarBackdrop.className = 'cumulus-sidebar-backdrop';
1788
+ sidebarBackdrop.setAttribute('data-testid', 'webchat-sidebar-backdrop');
1789
+
1790
+ appRow.appendChild(sidebarBackdrop);
1553
1791
  appRow.appendChild(sidebar);
1554
1792
  appRow.appendChild(contentArea);
1555
1793
  appLayout.appendChild(appRow);
1556
1794
 
1795
+ // ── Mobile sidebar toggle ──
1796
+ var isMobile = function () { return window.innerWidth <= 768; };
1797
+
1798
+ function openSidebar() {
1799
+ sidebar.classList.add('open');
1800
+ sidebarBackdrop.classList.add('open');
1801
+ }
1802
+ function closeSidebar() {
1803
+ sidebar.classList.remove('open');
1804
+ sidebarBackdrop.classList.remove('open');
1805
+ }
1806
+
1807
+ sidebarBackdrop.addEventListener('click', closeSidebar);
1808
+
1809
+ var toggleBtn = topbar.querySelector('[data-testid="webchat-sidebar-toggle"]');
1810
+ if (toggleBtn) {
1811
+ toggleBtn.addEventListener('click', function () {
1812
+ if (sidebar.classList.contains('open')) closeSidebar();
1813
+ else openSidebar();
1814
+ });
1815
+ }
1816
+
1557
1817
  standaloneRoot.appendChild(authWrapper);
1558
1818
  standaloneRoot.appendChild(appLayout);
1559
1819
  container.appendChild(standaloneRoot);
@@ -1700,9 +1960,15 @@
1700
1960
  renderSidebar();
1701
1961
  renderContentArea();
1702
1962
  loadThreadHistoryIfNeeded(name);
1963
+ if (isMobile()) closeSidebar();
1703
1964
  }
1704
1965
 
1705
1966
  function togglePanelThread(name) {
1967
+ // On mobile, always solo (no side-by-side)
1968
+ if (isMobile()) {
1969
+ soloThread(name);
1970
+ return;
1971
+ }
1706
1972
  var idx = visibleThreads.indexOf(name);
1707
1973
  if (idx !== -1) {
1708
1974
  // Remove from visible
@@ -1774,6 +2040,7 @@
1774
2040
 
1775
2041
  var panel = document.createElement('div');
1776
2042
  panel.className = 'cumulus-thread-panel';
2043
+ panel.style.position = 'relative'; // for overlay positioning
1777
2044
  panel.setAttribute('data-testid', 'webchat-panel-' + threadName);
1778
2045
  panel.setAttribute('data-thread-panel', threadName);
1779
2046
 
@@ -1797,6 +2064,32 @@
1797
2064
 
1798
2065
  panelHeader.appendChild(titleLeft);
1799
2066
 
2067
+ // Action buttons (include + revert)
2068
+ var actions = document.createElement('div');
2069
+ actions.className = 'cumulus-panel-actions';
2070
+
2071
+ var includeBtn = document.createElement('button');
2072
+ includeBtn.className = 'cumulus-panel-action-btn';
2073
+ includeBtn.setAttribute('data-testid', 'webchat-include-btn');
2074
+ includeBtn.setAttribute('title', 'Manage always-include files');
2075
+ includeBtn.textContent = '/include';
2076
+ includeBtn.addEventListener('click', function () {
2077
+ openIncludeOverlay(panel, threadName);
2078
+ });
2079
+ actions.appendChild(includeBtn);
2080
+
2081
+ var revertBtn = document.createElement('button');
2082
+ revertBtn.className = 'cumulus-panel-action-btn';
2083
+ revertBtn.setAttribute('data-testid', 'webchat-revert-btn');
2084
+ revertBtn.setAttribute('title', 'Revert conversation to earlier point');
2085
+ revertBtn.textContent = '/revert';
2086
+ revertBtn.addEventListener('click', function () {
2087
+ openRevertOverlay(panel, threadName);
2088
+ });
2089
+ actions.appendChild(revertBtn);
2090
+
2091
+ panelHeader.appendChild(actions);
2092
+
1800
2093
  var closeBtn = document.createElement('button');
1801
2094
  closeBtn.className = 'cumulus-thread-panel-close';
1802
2095
  closeBtn.setAttribute('data-testid', 'webchat-panel-close');
@@ -2142,6 +2435,272 @@
2142
2435
  }
2143
2436
  }
2144
2437
 
2438
+ // ── Include overlay ──
2439
+ function openIncludeOverlay(panel, threadName) {
2440
+ // Remove existing overlay if any
2441
+ var existing = panel.querySelector('.cumulus-overlay');
2442
+ if (existing) { existing.remove(); return; }
2443
+
2444
+ var overlay = document.createElement('div');
2445
+ overlay.className = 'cumulus-overlay';
2446
+
2447
+ var header = document.createElement('div');
2448
+ header.className = 'cumulus-overlay-header';
2449
+ var title = document.createElement('span');
2450
+ title.className = 'cumulus-overlay-title';
2451
+ title.textContent = 'Always-Include Files';
2452
+ header.appendChild(title);
2453
+ var closeBtn = document.createElement('button');
2454
+ closeBtn.className = 'cumulus-overlay-close';
2455
+ closeBtn.textContent = '\xD7';
2456
+ closeBtn.addEventListener('click', function () { overlay.remove(); });
2457
+ header.appendChild(closeBtn);
2458
+ overlay.appendChild(header);
2459
+
2460
+ var body = document.createElement('div');
2461
+ body.className = 'cumulus-overlay-body';
2462
+ body.innerHTML = '<div class="cumulus-overlay-empty">Loading\u2026</div>';
2463
+ overlay.appendChild(body);
2464
+
2465
+ // Footer with add input
2466
+ var footer = document.createElement('div');
2467
+ footer.className = 'cumulus-overlay-footer';
2468
+ var addRow = document.createElement('div');
2469
+ addRow.className = 'cumulus-include-add-row';
2470
+
2471
+ var addInput = document.createElement('input');
2472
+ addInput.className = 'cumulus-include-add-input';
2473
+ addInput.setAttribute('placeholder', '/path/to/file');
2474
+ addInput.setAttribute('data-testid', 'webchat-include-add-input');
2475
+
2476
+ var currentScope = 'thread';
2477
+ var scopeBtn = document.createElement('button');
2478
+ scopeBtn.className = 'cumulus-scope-toggle';
2479
+ scopeBtn.textContent = 'thread';
2480
+ scopeBtn.setAttribute('data-testid', 'webchat-include-scope-toggle');
2481
+ scopeBtn.addEventListener('click', function () {
2482
+ currentScope = currentScope === 'thread' ? 'global' : 'thread';
2483
+ scopeBtn.textContent = currentScope;
2484
+ });
2485
+
2486
+ var addBtn = document.createElement('button');
2487
+ addBtn.className = 'cumulus-include-add-btn';
2488
+ addBtn.textContent = 'Add';
2489
+ addBtn.setAttribute('data-testid', 'webchat-include-add-btn');
2490
+ addBtn.addEventListener('click', function () {
2491
+ var filePath = addInput.value.trim();
2492
+ if (!filePath) return;
2493
+ connection && connection.send(JSON.stringify({
2494
+ type: 'include_add', threadName: threadName,
2495
+ filePath: filePath, scope: currentScope,
2496
+ }));
2497
+ addInput.value = '';
2498
+ });
2499
+
2500
+ addInput.addEventListener('keydown', function (e) {
2501
+ if (e.key === 'Enter') { addBtn.click(); }
2502
+ });
2503
+
2504
+ addRow.appendChild(addInput);
2505
+ addRow.appendChild(scopeBtn);
2506
+ addRow.appendChild(addBtn);
2507
+ footer.appendChild(addRow);
2508
+ overlay.appendChild(footer);
2509
+
2510
+ // Store references for the message handler to update
2511
+ overlay._includeBody = body;
2512
+ overlay._threadName = threadName;
2513
+
2514
+ panel.appendChild(overlay);
2515
+
2516
+ // Request the list
2517
+ connection && connection.send(JSON.stringify({ type: 'include_list', threadName: threadName }));
2518
+ }
2519
+
2520
+ function renderIncludeList(panel, threadName, files) {
2521
+ var overlay = panel.querySelector('.cumulus-overlay');
2522
+ if (!overlay || overlay._threadName !== threadName) return;
2523
+ var body = overlay._includeBody;
2524
+ if (!body) return;
2525
+
2526
+ body.innerHTML = '';
2527
+ if (files.length === 0) {
2528
+ body.innerHTML = '<div class="cumulus-overlay-empty">No always-include files configured.</div>';
2529
+ return;
2530
+ }
2531
+
2532
+ files.forEach(function (f) {
2533
+ var item = document.createElement('div');
2534
+ item.className = 'cumulus-include-item';
2535
+
2536
+ var pathEl = document.createElement('span');
2537
+ pathEl.className = 'cumulus-include-path';
2538
+ pathEl.textContent = f.path;
2539
+ pathEl.setAttribute('title', f.path);
2540
+ item.appendChild(pathEl);
2541
+
2542
+ var scopeEl = document.createElement('span');
2543
+ scopeEl.className = 'cumulus-include-scope';
2544
+ scopeEl.textContent = f.scope;
2545
+ item.appendChild(scopeEl);
2546
+
2547
+ var removeBtn = document.createElement('button');
2548
+ removeBtn.className = 'cumulus-include-remove';
2549
+ removeBtn.textContent = '\xD7';
2550
+ removeBtn.setAttribute('title', 'Remove');
2551
+ removeBtn.addEventListener('click', function () {
2552
+ connection && connection.send(JSON.stringify({
2553
+ type: 'include_remove', threadName: threadName, filePath: f.path,
2554
+ }));
2555
+ });
2556
+ item.appendChild(removeBtn);
2557
+
2558
+ body.appendChild(item);
2559
+ });
2560
+ }
2561
+
2562
+ // ── Revert overlay ──
2563
+ function openRevertOverlay(panel, threadName) {
2564
+ var existing = panel.querySelector('.cumulus-overlay');
2565
+ if (existing) { existing.remove(); return; }
2566
+
2567
+ var overlay = document.createElement('div');
2568
+ overlay.className = 'cumulus-overlay';
2569
+
2570
+ var header = document.createElement('div');
2571
+ header.className = 'cumulus-overlay-header';
2572
+ var title = document.createElement('span');
2573
+ title.className = 'cumulus-overlay-title';
2574
+ title.textContent = 'Revert Conversation';
2575
+ header.appendChild(title);
2576
+ var closeBtn = document.createElement('button');
2577
+ closeBtn.className = 'cumulus-overlay-close';
2578
+ closeBtn.textContent = '\xD7';
2579
+ closeBtn.addEventListener('click', function () { overlay.remove(); });
2580
+ header.appendChild(closeBtn);
2581
+ overlay.appendChild(header);
2582
+
2583
+ var body = document.createElement('div');
2584
+ body.className = 'cumulus-overlay-body';
2585
+ body.innerHTML = '<div class="cumulus-overlay-empty">Loading\u2026</div>';
2586
+ overlay.appendChild(body);
2587
+
2588
+ overlay._revertBody = body;
2589
+ overlay._threadName = threadName;
2590
+
2591
+ panel.appendChild(overlay);
2592
+
2593
+ // Request the turn list
2594
+ connection && connection.send(JSON.stringify({ type: 'revert_list', threadName: threadName }));
2595
+ }
2596
+
2597
+ function renderRevertList(panel, threadName, turns) {
2598
+ var overlay = panel.querySelector('.cumulus-overlay');
2599
+ if (!overlay || overlay._threadName !== threadName) return;
2600
+ var body = overlay._revertBody;
2601
+ if (!body) return;
2602
+
2603
+ body.innerHTML = '';
2604
+ if (turns.length === 0) {
2605
+ body.innerHTML = '<div class="cumulus-overlay-empty">No turns to revert to.</div>';
2606
+ return;
2607
+ }
2608
+
2609
+ // Skip the first turn (most recent) — nothing to revert to
2610
+ var revertableTurns = turns.length > 1 ? turns.slice(1) : turns;
2611
+
2612
+ revertableTurns.forEach(function (turn) {
2613
+ var item = document.createElement('div');
2614
+ item.className = 'cumulus-revert-item';
2615
+ item.setAttribute('data-testid', 'webchat-revert-turn');
2616
+
2617
+ var numEl = document.createElement('span');
2618
+ numEl.className = 'cumulus-revert-turn-num';
2619
+ numEl.textContent = '#' + turn.index;
2620
+ item.appendChild(numEl);
2621
+
2622
+ var previewEl = document.createElement('span');
2623
+ previewEl.className = 'cumulus-revert-preview';
2624
+ previewEl.textContent = turn.preview;
2625
+ item.appendChild(previewEl);
2626
+
2627
+ if (turn.hasGitSnapshot) {
2628
+ var gitBadge = document.createElement('span');
2629
+ gitBadge.className = 'cumulus-revert-git-badge';
2630
+ gitBadge.textContent = 'git';
2631
+ item.appendChild(gitBadge);
2632
+ }
2633
+
2634
+ var timeEl = document.createElement('span');
2635
+ timeEl.className = 'cumulus-revert-time';
2636
+ timeEl.textContent = formatTime(turn.timestamp);
2637
+ item.appendChild(timeEl);
2638
+
2639
+ item.addEventListener('click', function () {
2640
+ showRevertConfirm(overlay, threadName, turn);
2641
+ });
2642
+
2643
+ body.appendChild(item);
2644
+ });
2645
+ }
2646
+
2647
+ function showRevertConfirm(overlay, threadName, turn) {
2648
+ var body = overlay._revertBody;
2649
+ if (!body) return;
2650
+
2651
+ body.innerHTML = '';
2652
+ var confirm = document.createElement('div');
2653
+ confirm.className = 'cumulus-revert-confirm';
2654
+
2655
+ var text = document.createElement('div');
2656
+ text.className = 'cumulus-revert-confirm-text';
2657
+ text.textContent = 'Revert to after turn #' + turn.index + '?';
2658
+ confirm.appendChild(text);
2659
+
2660
+ var warn = document.createElement('div');
2661
+ warn.className = 'cumulus-revert-confirm-warn';
2662
+ warn.textContent = turn.messageCount + ' message(s) will be removed. This cannot be undone.';
2663
+ confirm.appendChild(warn);
2664
+
2665
+ var actions = document.createElement('div');
2666
+ actions.className = 'cumulus-revert-confirm-actions';
2667
+
2668
+ var cancelBtn = document.createElement('button');
2669
+ cancelBtn.className = 'cumulus-revert-confirm-btn cancel';
2670
+ cancelBtn.textContent = 'Cancel';
2671
+ cancelBtn.addEventListener('click', function () {
2672
+ // Re-request list
2673
+ connection && connection.send(JSON.stringify({ type: 'revert_list', threadName: threadName }));
2674
+ });
2675
+ actions.appendChild(cancelBtn);
2676
+
2677
+ var revertBtn = document.createElement('button');
2678
+ revertBtn.className = 'cumulus-revert-confirm-btn danger';
2679
+ revertBtn.setAttribute('data-testid', 'webchat-revert-confirm');
2680
+ revertBtn.textContent = 'Revert';
2681
+ revertBtn.addEventListener('click', function () {
2682
+ revertBtn.disabled = true;
2683
+ revertBtn.textContent = 'Reverting\u2026';
2684
+ connection && connection.send(JSON.stringify({
2685
+ type: 'revert_execute', threadName: threadName,
2686
+ targetMessageId: turn.userMessageId,
2687
+ }));
2688
+ });
2689
+ actions.appendChild(revertBtn);
2690
+
2691
+ confirm.appendChild(actions);
2692
+ body.appendChild(confirm);
2693
+ }
2694
+
2695
+ function formatTime(ts) {
2696
+ var d = new Date(typeof ts === 'number' ? ts : Date.parse(ts));
2697
+ var h = d.getHours();
2698
+ var m = d.getMinutes();
2699
+ var ampm = h >= 12 ? 'PM' : 'AM';
2700
+ h = h % 12 || 12;
2701
+ return h + ':' + (m < 10 ? '0' : '') + m + ' ' + ampm;
2702
+ }
2703
+
2145
2704
  // ── Message router ──
2146
2705
  function handleServerMessage(data) {
2147
2706
  switch (data.type) {
@@ -2187,7 +2746,7 @@
2187
2746
  var state = getThreadState(data.threadName);
2188
2747
  if (data.messages && data.messages.length > 0) {
2189
2748
  state.messages = data.messages.map(function (m) {
2190
- return { role: m.role, content: m.content };
2749
+ return { id: m.id, role: m.role, content: m.content };
2191
2750
  });
2192
2751
  }
2193
2752
  refreshThreadPanel(data.threadName);
@@ -2249,6 +2808,52 @@
2249
2808
  refreshThreadPanel(data.threadName);
2250
2809
  }
2251
2810
  break;
2811
+
2812
+ // ── Include/Revert responses ──
2813
+ case 'include_list':
2814
+ if (data.threadName && data.files) {
2815
+ var panel = document.querySelector('[data-thread-panel="' + data.threadName + '"]');
2816
+ if (panel) renderIncludeList(panel, data.threadName, data.files);
2817
+ }
2818
+ break;
2819
+
2820
+ case 'include_added':
2821
+ case 'include_removed':
2822
+ // List already updated by the handler — no extra action needed
2823
+ break;
2824
+
2825
+ case 'revert_list':
2826
+ if (data.threadName && data.turns) {
2827
+ var panel = document.querySelector('[data-thread-panel="' + data.threadName + '"]');
2828
+ if (panel) renderRevertList(panel, data.threadName, data.turns);
2829
+ }
2830
+ break;
2831
+
2832
+ case 'revert_done':
2833
+ if (data.threadName) {
2834
+ var panel = document.querySelector('[data-thread-panel="' + data.threadName + '"]');
2835
+ if (panel) {
2836
+ var overlay = panel.querySelector('.cumulus-overlay');
2837
+ if (data.success) {
2838
+ // Reload history and close overlay
2839
+ var tState = getThreadState(data.threadName);
2840
+ tState.messages = [];
2841
+ tState.historyLoaded = false;
2842
+ // Re-request history
2843
+ connection && connection.send(JSON.stringify({
2844
+ type: 'history', threadName: data.threadName, limit: 200,
2845
+ }));
2846
+ if (overlay) overlay.remove();
2847
+ } else {
2848
+ // Show error in overlay
2849
+ if (overlay && overlay._revertBody) {
2850
+ overlay._revertBody.innerHTML = '<div class="cumulus-overlay-status error">' +
2851
+ escapeHtml(data.error || 'Revert failed') + '</div>';
2852
+ }
2853
+ }
2854
+ }
2855
+ }
2856
+ break;
2252
2857
  }
2253
2858
  }
2254
2859
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luckydraw/cumulus",
3
- "version": "0.17.0",
3
+ "version": "0.18.1",
4
4
  "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",