clay-server 2.30.0 → 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/lib/email-accounts.js +299 -0
  2. package/lib/email-mcp-server.js +646 -0
  3. package/lib/project-connection.js +26 -2
  4. package/lib/project-email.js +418 -0
  5. package/lib/project-sessions.js +16 -0
  6. package/lib/project-user-message.js +26 -5
  7. package/lib/project.js +72 -25
  8. package/lib/public/app.js +18 -5
  9. package/lib/public/css/filebrowser.css +80 -2
  10. package/lib/public/css/input.css +196 -0
  11. package/lib/public/css/notifications-center.css +3 -0
  12. package/lib/public/css/sidebar.css +77 -2
  13. package/lib/public/css/sticky-notes.css +0 -48
  14. package/lib/public/css/user-settings.css +85 -0
  15. package/lib/public/icons/email/gmail.svg +7 -0
  16. package/lib/public/icons/email/outlook.svg +35 -0
  17. package/lib/public/icons/email/yahoo.svg +1 -0
  18. package/lib/public/index.html +36 -3
  19. package/lib/public/modules/app-dm.js +4 -9
  20. package/lib/public/modules/app-messages.js +37 -2
  21. package/lib/public/modules/app-panels.js +2 -1
  22. package/lib/public/modules/context-sources.js +527 -1
  23. package/lib/public/modules/filebrowser.js +72 -0
  24. package/lib/public/modules/mate-sidebar.js +7 -0
  25. package/lib/public/modules/sidebar-mobile.js +1 -1
  26. package/lib/public/modules/sidebar.js +144 -2
  27. package/lib/public/modules/sticky-notes.js +1 -91
  28. package/lib/public/modules/terminal.js +0 -12
  29. package/lib/public/modules/theme.js +4 -0
  30. package/lib/public/modules/tools.js +23 -0
  31. package/lib/public/modules/user-settings.js +74 -0
  32. package/lib/sdk-bridge.js +16 -0
  33. package/lib/sdk-message-processor.js +33 -0
  34. package/lib/server-email.js +148 -0
  35. package/lib/server.js +5 -0
  36. package/package.json +3 -2
@@ -836,54 +836,6 @@
836
836
  50% { box-shadow: 0 0 0 6px rgba(var(--accent-rgb, 99, 102, 241), 0); }
837
837
  }
838
838
 
839
- #sticky-notes-toggle-btn.sn-onboarding-pulse {
840
- animation: snOnboardingPulse 2s ease-in-out infinite;
841
- color: var(--accent) !important;
842
- border-color: var(--accent) !important;
843
- }
844
-
845
- /* Tooltip bubble */
846
- .sn-onboarding-tooltip {
847
- position: fixed;
848
- display: flex;
849
- align-items: center;
850
- gap: 8px;
851
- padding: 8px 12px;
852
- background: var(--code-bg);
853
- color: var(--text);
854
- border: 1px solid var(--border);
855
- border-radius: 8px;
856
- font-size: 13px;
857
- font-weight: 500;
858
- white-space: nowrap;
859
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
860
- z-index: 1000;
861
- pointer-events: none;
862
- transform: translateX(-50%);
863
- animation: snOnboardingAppear 0.3s ease-out;
864
- }
865
-
866
- .sn-onboarding-tooltip::before {
867
- content: "";
868
- position: absolute;
869
- top: -6px;
870
- left: 50%;
871
- transform: translateX(-50%);
872
- border: 6px solid transparent;
873
- border-bottom-color: var(--code-bg);
874
- border-top: none;
875
- }
876
-
877
- @keyframes snOnboardingAppear {
878
- from { opacity: 0; transform: translateX(-50%) translateY(-4px); }
879
- to { opacity: 1; transform: translateX(-50%) translateY(0); }
880
- }
881
-
882
- .sn-onboarding-tooltip.sn-onboarding-fade-out {
883
- opacity: 0;
884
- transition: opacity 0.3s;
885
- }
886
-
887
839
  /* --- Mobile: hide entirely --- */
888
840
  @media (max-width: 768px) {
889
841
  #sticky-notes-container,
@@ -319,3 +319,88 @@
319
319
  padding: 16px;
320
320
  }
321
321
  }
322
+
323
+ /* --- Email settings --- */
324
+ .us-email-empty {
325
+ color: var(--text-dimmer);
326
+ font-size: 13px;
327
+ text-align: center;
328
+ padding: 8px 0;
329
+ }
330
+ .us-email-row {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: 12px;
334
+ padding: 12px 16px;
335
+ }
336
+ .us-email-row + .us-email-row {
337
+ border-top: 1px solid var(--border-subtle);
338
+ }
339
+ .us-email-icon {
340
+ flex-shrink: 0;
341
+ display: flex;
342
+ align-items: center;
343
+ justify-content: center;
344
+ width: 24px;
345
+ height: 24px;
346
+ }
347
+ .us-email-provider-icon {
348
+ width: 22px;
349
+ height: 22px;
350
+ object-fit: contain;
351
+ }
352
+ .us-email-provider-icon-fallback {
353
+ width: 20px;
354
+ height: 20px;
355
+ color: var(--text-dimmer);
356
+ }
357
+ .us-email-info {
358
+ flex: 1;
359
+ min-width: 0;
360
+ }
361
+ .us-email-addr {
362
+ font-size: 14px;
363
+ font-weight: 500;
364
+ color: var(--text);
365
+ overflow: hidden;
366
+ text-overflow: ellipsis;
367
+ white-space: nowrap;
368
+ }
369
+ .us-email-provider {
370
+ font-size: 12px;
371
+ color: var(--text-dimmer);
372
+ margin-top: 1px;
373
+ }
374
+ .us-email-remove-btn {
375
+ padding: 4px 10px;
376
+ font-size: 12px;
377
+ font-family: inherit;
378
+ border: 1px solid var(--border);
379
+ border-radius: 6px;
380
+ background: transparent;
381
+ color: var(--text-muted);
382
+ cursor: pointer;
383
+ transition: color 0.15s, border-color 0.15s;
384
+ flex-shrink: 0;
385
+ }
386
+ .us-email-remove-btn:hover {
387
+ color: var(--error);
388
+ border-color: var(--error);
389
+ }
390
+ .us-email-add-btn {
391
+ margin-top: 10px;
392
+ padding: 6px 14px;
393
+ font-size: 13px;
394
+ font-family: inherit;
395
+ font-weight: 500;
396
+ border: 1px dashed var(--border);
397
+ border-radius: 8px;
398
+ background: transparent;
399
+ color: var(--text-muted);
400
+ cursor: pointer;
401
+ transition: color 0.15s, border-color 0.15s;
402
+ }
403
+ .us-email-add-btn:hover {
404
+ color: var(--accent);
405
+ border-color: var(--accent);
406
+ }
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="52 42 88 66">
2
+ <path fill="#4285f4" d="M58 108h14V74L52 59v43c0 3.32 2.69 6 6 6"/>
3
+ <path fill="#34a853" d="M120 108h14c3.32 0 6-2.69 6-6V59l-20 15"/>
4
+ <path fill="#fbbc04" d="M120 48v26l20-15v-8c0-7.42-8.47-11.65-14.4-7.2"/>
5
+ <path fill="#ea4335" d="M72 74V48l24 18 24-18v26L96 92"/>
6
+ <path fill="#c5221f" d="M52 51v8l20 15V48l-5.6-4.2c-5.94-4.45-14.4-.22-14.4 7.2"/>
7
+ </svg>
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Livello_1" xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1831.085 1703.335" enable-background="new 0 0 1831.085 1703.335" xml:space="preserve">
5
+ <path fill="#0A2767" d="M1831.083,894.25c0.1-14.318-7.298-27.644-19.503-35.131h-0.213l-0.767-0.426l-634.492-375.585 c-2.74-1.851-5.583-3.543-8.517-5.067c-24.498-12.639-53.599-12.639-78.098,0c-2.934,1.525-5.777,3.216-8.517,5.067L446.486,858.693 l-0.766,0.426c-19.392,12.059-25.337,37.556-13.278,56.948c3.553,5.714,8.447,10.474,14.257,13.868l634.492,375.585 c2.749,1.835,5.592,3.527,8.517,5.068c24.498,12.639,53.599,12.639,78.098,0c2.925-1.541,5.767-3.232,8.517-5.068l634.492-375.585 C1823.49,922.545,1831.228,908.923,1831.083,894.25z"/>
6
+ <path fill="#0364B8" d="M520.453,643.477h416.38v381.674h-416.38V643.477z M1745.917,255.5V80.908 c1-43.652-33.552-79.862-77.203-80.908H588.204C544.552,1.046,510,37.256,511,80.908V255.5l638.75,170.333L1745.917,255.5z"/>
7
+ <path fill="#0078D4" d="M511,255.5h425.833v383.25H511V255.5z"/>
8
+ <path fill="#28A8EA" d="M1362.667,255.5H936.833v383.25L1362.667,1022h383.25V638.75L1362.667,255.5z"/>
9
+ <path fill="#0078D4" d="M936.833,638.75h425.833V1022H936.833V638.75z"/>
10
+ <path fill="#0364B8" d="M936.833,1022h425.833v383.25H936.833V1022z"/>
11
+ <path fill="#14447D" d="M520.453,1025.151h416.38v346.969h-416.38V1025.151z"/>
12
+ <path fill="#0078D4" d="M1362.667,1022h383.25v383.25h-383.25V1022z"/>
13
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1128.4584" y1="811.0833" x2="1128.4584" y2="1.9982" gradientTransform="matrix(1 0 0 -1 0 1705.3334)">
14
+ <stop offset="0" style="stop-color:#35B8F1"/>
15
+ <stop offset="1" style="stop-color:#28A8EA"/>
16
+ </linearGradient>
17
+ <path fill="url(#SVGID_1_)" d="M1811.58,927.593l-0.809,0.426l-634.492,356.848c-2.768,1.703-5.578,3.321-8.517,4.769 c-10.777,5.132-22.481,8.029-34.407,8.517l-34.663-20.27c-2.929-1.47-5.773-3.105-8.517-4.897L447.167,906.003h-0.298 l-21.036-11.753v722.384c0.328,48.196,39.653,87.006,87.849,86.7h1230.914c0.724,0,1.363-0.341,2.129-0.341 c10.18-0.651,20.216-2.745,29.808-6.217c4.145-1.756,8.146-3.835,11.966-6.217c2.853-1.618,7.75-5.152,7.75-5.152 c21.814-16.142,34.726-41.635,34.833-68.772V894.25C1831.068,908.067,1823.616,920.807,1811.58,927.593z"/>
18
+ <path opacity="0.5" fill="#0A2767" enable-background="new " d="M1797.017,891.397v44.287l-663.448,456.791L446.699,906.301 c0-0.235-0.191-0.426-0.426-0.426l0,0l-63.023-37.899v-31.938l25.976-0.426l54.932,31.512l1.277,0.426l4.684,2.981 c0,0,645.563,368.346,647.267,369.197l24.698,14.478c2.129-0.852,4.258-1.703,6.813-2.555 c1.278-0.852,640.879-360.681,640.879-360.681L1797.017,891.397z"/>
19
+ <path fill="#1490DF" d="M1811.58,927.593l-0.809,0.468l-634.492,356.848c-2.768,1.703-5.578,3.321-8.517,4.769 c-24.641,12.038-53.457,12.038-78.098,0c-2.918-1.445-5.76-3.037-8.517-4.769L446.657,928.061l-0.766-0.468 c-12.25-6.642-19.93-19.409-20.057-33.343v722.384c0.305,48.188,39.616,87.004,87.803,86.7c0.001,0,0.002,0,0.004,0h1229.636 c48.188,0.307,87.5-38.509,87.807-86.696c0-0.001,0-0.002,0-0.004V894.25C1831.068,908.067,1823.616,920.807,1811.58,927.593z"/>
20
+ <path opacity="0.1" enable-background="new " d="M1185.52,1279.629l-9.496,5.323c-2.752,1.752-5.595,3.359-8.517,4.812 c-10.462,5.135-21.838,8.146-33.47,8.857l241.405,285.479l421.107,101.476c11.539-8.716,20.717-20.178,26.7-33.343L1185.52,1279.629 z"/>
21
+ <path opacity="0.05" enable-background="new " d="M1228.529,1255.442l-52.505,29.51c-2.752,1.752-5.595,3.359-8.517,4.812 c-10.462,5.135-21.838,8.146-33.47,8.857l113.101,311.838l549.538,74.989c21.649-16.254,34.394-41.743,34.407-68.815v-9.326 L1228.529,1255.442z"/>
22
+ <path fill="#28A8EA" d="M514.833,1703.333h1228.316c18.901,0.096,37.335-5.874,52.59-17.033l-697.089-408.331 c-2.929-1.47-5.773-3.105-8.517-4.897L447.125,906.088h-0.298l-20.993-11.838v719.914 C425.786,1663.364,465.632,1703.286,514.833,1703.333C514.832,1703.333,514.832,1703.333,514.833,1703.333z"/>
23
+ <path opacity="0.1" enable-background="new " d="M1022,418.722v908.303c-0.076,31.846-19.44,60.471-48.971,72.392 c-9.148,3.931-19,5.96-28.957,5.962H425.833V383.25H511v-42.583h433.073C987.092,340.83,1021.907,375.702,1022,418.722z"/>
24
+ <path opacity="0.2" enable-background="new " d="M979.417,461.305v908.302c0.107,10.287-2.074,20.469-6.388,29.808 c-11.826,29.149-40.083,48.273-71.54,48.417H425.833V383.25h475.656c12.356-0.124,24.533,2.958,35.344,8.943 C962.937,405.344,979.407,432.076,979.417,461.305z"/>
25
+ <path opacity="0.2" enable-background="new " d="M979.417,461.305v823.136c-0.208,43-34.928,77.853-77.927,78.225H425.833V383.25 h475.656c12.356-0.124,24.533,2.958,35.344,8.943C962.937,405.344,979.407,432.076,979.417,461.305z"/>
26
+ <path opacity="0.2" enable-background="new " d="M936.833,461.305v823.136c-0.046,43.067-34.861,78.015-77.927,78.225H425.833 V383.25h433.072c43.062,0.023,77.951,34.951,77.927,78.013C936.833,461.277,936.833,461.291,936.833,461.305z"/>
27
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="162.7469" y1="1383.0741" x2="774.0864" y2="324.2592" gradientTransform="matrix(1 0 0 -1 0 1705.3334)">
28
+ <stop offset="0" style="stop-color:#1784D9"/>
29
+ <stop offset="0.5" style="stop-color:#107AD5"/>
30
+ <stop offset="1" style="stop-color:#0A63C9"/>
31
+ </linearGradient>
32
+ <path fill="url(#SVGID_2_)" d="M78.055,383.25h780.723c43.109,0,78.055,34.947,78.055,78.055v780.723 c0,43.109-34.946,78.055-78.055,78.055H78.055c-43.109,0-78.055-34.947-78.055-78.055V461.305 C0,418.197,34.947,383.25,78.055,383.25z"/>
33
+ <path fill="#FFFFFF" d="M243.96,710.631c19.238-40.988,50.29-75.289,89.17-98.495c43.057-24.651,92.081-36.94,141.675-35.515 c45.965-0.997,91.321,10.655,131.114,33.683c37.414,22.312,67.547,55.004,86.742,94.109c20.904,43.09,31.322,90.512,30.405,138.396 c1.013,50.043-9.706,99.628-31.299,144.783c-19.652,40.503-50.741,74.36-89.425,97.388c-41.327,23.734-88.367,35.692-136.011,34.578 c-46.947,1.133-93.303-10.651-134.01-34.067c-37.738-22.341-68.249-55.07-87.892-94.28c-21.028-42.467-31.57-89.355-30.745-136.735 C212.808,804.859,223.158,755.686,243.96,710.631z M339.006,941.858c10.257,25.912,27.651,48.385,50.163,64.812 c22.93,16.026,50.387,24.294,78.353,23.591c29.783,1.178,59.14-7.372,83.634-24.358c22.227-16.375,39.164-38.909,48.715-64.812 c10.677-28.928,15.946-59.572,15.543-90.404c0.33-31.127-4.623-62.084-14.649-91.554c-8.855-26.607-25.246-50.069-47.182-67.537 c-23.88-17.79-53.158-26.813-82.91-25.55c-28.572-0.74-56.644,7.593-80.184,23.804c-22.893,16.496-40.617,39.168-51.1,65.365 c-23.255,60.049-23.376,126.595-0.341,186.728L339.006,941.858z"/>
34
+ <path fill="#50D9FF" d="M1362.667,255.5h383.25v383.25h-383.25V255.5z"/>
35
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path fill="#5F01D1" d="M105 0h302c57.927.154 104.846 47.073 105 104.995V407c-.154 57.926-47.073 104.844-104.995 104.998L105 512C47.074 511.844.156 464.926.002 407.003L0 105C.156 47.073 47.074.154 104.997 0H105z"/><path fill="#fff" fill-rule="nonzero" d="M106.598 187.846h56.988l33.184 84.895 33.616-84.895h55.481l-83.545 200.975H146.48l22.871-53.255-62.751-147.72h-.002zm243.879 67.833h-62.144l55.156-132.502 61.917.003-54.929 132.499zm-45.865 12.682c19.067 0 34.523 15.457 34.523 34.521 0 19.065-15.456 34.522-34.523 34.522-19.065 0-34.519-15.457-34.519-34.522 0-19.064 15.456-34.521 34.519-34.521z"/></svg>
@@ -187,12 +187,19 @@
187
187
  </div>
188
188
  <div id="sidebar">
189
189
  <div id="sidebar-tools">
190
+ <button id="sidebar-tools-toggle" type="button">
191
+ <span class="sidebar-section-label">Tools</span>
192
+ <i data-lucide="chevron-down" class="sidebar-tools-chevron"></i>
193
+ </button>
190
194
  <div id="session-actions">
191
195
  <button id="file-browser-btn"><i data-lucide="folder-tree"></i> <span>File browser</span></button>
192
196
  <button id="terminal-sidebar-btn"><i data-lucide="square-terminal"></i> <span>Terminal</span><span id="terminal-sidebar-count" class="sidebar-badge hidden"></span></button>
193
197
  <button id="sticky-notes-sidebar-btn"><i data-lucide="sticky-note"></i> <span>Sticky Notes</span><span id="sticky-notes-sidebar-count" class="sidebar-badge hidden"></span></button>
198
+ <div class="sidebar-tools-divider"></div>
199
+ <button id="email-sidebar-btn"><i data-lucide="mail"></i> <span>Email</span></button>
194
200
  <button id="mcp-btn"><i data-lucide="cable"></i> <span>MCP Servers</span><span id="mcp-sidebar-count" class="sidebar-badge hidden"></span></button>
195
201
  <button id="skills-btn"><i data-lucide="puzzle"></i> <span>Skills</span></button>
202
+ <div class="sidebar-tools-divider"></div>
196
203
  <button id="scheduler-btn"><i data-lucide="calendar-clock"></i> <span>Scheduled Tasks</span></button>
197
204
  </div>
198
205
  </div>
@@ -256,6 +263,7 @@
256
263
  <button id="mate-memory-btn"><i data-lucide="brain"></i> <span>Memory</span><span id="mate-memory-count" class="sidebar-badge hidden"></span></button>
257
264
  <button id="mate-knowledge-btn"><i data-lucide="book-open"></i> <span>Knowledge</span><span id="mate-knowledge-count" class="sidebar-badge hidden"></span></button>
258
265
  <button id="mate-sticky-notes-btn"><i data-lucide="sticky-note"></i> <span>Sticky Notes</span></button>
266
+ <button id="mate-email-btn"><i data-lucide="mail"></i> <span>Email</span></button>
259
267
  <button id="mate-mcp-btn"><i data-lucide="cable"></i> <span>MCP Servers</span><span id="mate-mcp-sidebar-count" class="sidebar-badge hidden"></span></button>
260
268
  <button id="mate-skills-btn"><i data-lucide="puzzle"></i> <span>Skills</span></button>
261
269
  <button id="mate-scheduler-btn"><i data-lucide="calendar-clock"></i> <span>Scheduled Tasks</span></button>
@@ -287,6 +295,7 @@
287
295
  <div id="mate-knowledge-files" class="mate-knowledge-file-list"></div>
288
296
  </div>
289
297
  </div>
298
+ <div id="mate-sidebar-resize-handle" class="hidden"></div>
290
299
 
291
300
  <div id="main-column">
292
301
  <!-- Knowledge editor (full overlay, shown on Edit) -->
@@ -345,8 +354,6 @@
345
354
  <div class="status">
346
355
  <button id="debate-pdf-btn" class="hidden" title="Export debate as PDF"><i data-lucide="download"></i></button>
347
356
  <button id="find-in-session-btn" title="Search in session (Ctrl+F)"><i data-lucide="search"></i></button>
348
- <button id="sticky-notes-toggle-btn" title="Sticky notes"><i data-lucide="sticky-note"></i><span class="sticky-notes-count hidden"></span></button>
349
- <button id="terminal-toggle-btn" title="Terminal"><i data-lucide="square-terminal"></i><span id="terminal-count" class="hidden"></span></button>
350
357
  </div>
351
358
  </div>
352
359
  <div id="main-panels">
@@ -443,6 +450,7 @@
443
450
  <div id="context-sources-chips"></div>
444
451
  <button id="context-sources-add" type="button" title="Add context source"><i data-lucide="plus"></i><span>Context Sources</span></button>
445
452
  <div id="context-sources-picker" class="hidden">
453
+ <div class="context-picker-section" id="context-picker-email"></div>
446
454
  <div class="context-picker-section" id="context-picker-terminals"></div>
447
455
  <div class="context-picker-section" id="context-picker-tabs"></div>
448
456
  </div>
@@ -843,7 +851,7 @@
843
851
  <div class="confirm-backdrop" id="user-settings-backdrop"></div>
844
852
  <div class="us-modal">
845
853
  <div class="us-modal-header">
846
- <span class="us-modal-title">Settings</span>
854
+ <span class="us-modal-title">User Settings</span>
847
855
  <button class="us-modal-close" id="user-settings-close" title="Close"><i data-lucide="x"></i></button>
848
856
  </div>
849
857
  <div class="us-modal-body">
@@ -852,11 +860,13 @@
852
860
  <option value="us-account" selected>Account</option>
853
861
  <option value="us-appearance">Appearance</option>
854
862
  <option value="us-chat">Chat</option>
863
+ <option value="us-email">Email</option>
855
864
  </select>
856
865
  <div class="us-modal-nav-items">
857
866
  <button class="us-nav-item active" data-section="us-account"><span>Account</span></button>
858
867
  <button class="us-nav-item" data-section="us-appearance"><span>Appearance</span></button>
859
868
  <button class="us-nav-item" data-section="us-chat"><span>Chat</span></button>
869
+ <button class="us-nav-item" data-section="us-email"><span>Email</span></button>
860
870
  <div class="us-nav-separator"></div>
861
871
  <button class="us-nav-item us-nav-danger" data-section="us-logout"><span>Log Out</span></button>
862
872
  </div>
@@ -938,6 +948,14 @@
938
948
  </div>
939
949
  </div>
940
950
 
951
+ <!-- Email section -->
952
+ <div class="us-section" data-section="us-email">
953
+ <h2>Email Accounts</h2>
954
+ <p class="settings-hint">Connect personal email accounts so your Mates can read, search, and send emails on your behalf. Credentials are encrypted and private to you.</p>
955
+ <div class="settings-card" id="us-email-list"></div>
956
+ <button class="us-email-add-btn" id="us-email-add">+ Add Account</button>
957
+ </div>
958
+
941
959
  <!-- Log out section -->
942
960
  <div class="us-section" data-section="us-logout">
943
961
  <h2>Log Out</h2>
@@ -1525,6 +1543,21 @@
1525
1543
  </div>
1526
1544
  </div>
1527
1545
 
1546
+ <!-- Email Defaults Modal -->
1547
+ <div id="email-defaults-modal" class="hidden">
1548
+ <div class="confirm-backdrop"></div>
1549
+ <div class="confirm-dialog mcp-dialog">
1550
+ <div class="mcp-header">
1551
+ <span class="mcp-title"><i data-lucide="mail"></i> Email</span>
1552
+ <button class="skills-close" id="email-defaults-close"><i data-lucide="x"></i></button>
1553
+ </div>
1554
+ <div class="mcp-content" id="email-defaults-content">
1555
+ <p class="mcp-desc">Toggle email accounts to auto-enable them for every new session in this project.</p>
1556
+ <div id="email-defaults-list"></div>
1557
+ </div>
1558
+ </div>
1559
+ </div>
1560
+
1528
1561
  <!-- Debate Modal (Wizard) -->
1529
1562
  <div id="debate-modal" class="hidden">
1530
1563
  <div class="debate-modal-backdrop"></div>
@@ -109,9 +109,6 @@ export function enterDmMode(key, targetUser, messages) {
109
109
  var prevTag = prevHeader.querySelector(".dm-header-mate-tag");
110
110
  if (prevTag) prevTag.remove();
111
111
  }
112
- // Restore terminal button
113
- var prevTermBtn = document.getElementById("terminal-toggle-btn");
114
- if (prevTermBtn) prevTermBtn.style.display = "";
115
112
  // Remove dm-mode classes
116
113
  var prevMain = document.getElementById("main-column");
117
114
  if (prevMain) prevMain.classList.remove("dm-mode");
@@ -176,14 +173,14 @@ export function enterDmMode(key, targetUser, messages) {
176
173
  if (sidebarCol) sidebarCol.classList.add("dm-mode");
177
174
  var resizeHandle = document.getElementById("sidebar-resize-handle");
178
175
  if (resizeHandle) resizeHandle.classList.add("dm-mode");
176
+ // Sync resize handles after DM sidebar appears
177
+ setTimeout(function () { if (_ctx.syncResizeHandles) _ctx.syncResizeHandles(); }, 50);
179
178
  if (isMate && targetUser.projectSlug) {
180
179
  // Mate DM: switch to mate's project (same as project switching)
181
180
  _ctx.showMateSidebar(targetUser.id, targetUser);
182
181
  // Close file viewer and terminal panel BEFORE switching WS (needs old WS still open)
183
182
  try { _ctx.closeFileViewer(); } catch(e) {}
184
183
  _ctx.closeTerminal();
185
- var termBtn = document.getElementById("terminal-toggle-btn");
186
- if (termBtn) termBtn.style.display = "none";
187
184
  // Apply mate color to chat title bar and panels
188
185
  var mateColor = (targetUser.profile && targetUser.profile.avatarColor) || targetUser.avatarColor || "#7c3aed";
189
186
  document.body.style.setProperty("--mate-color", mateColor);
@@ -296,14 +293,12 @@ export function exitDmMode(skipProjectSwitch) {
296
293
  if (sidebarCol) sidebarCol.classList.remove("dm-mode");
297
294
  var resizeHandle = document.getElementById("sidebar-resize-handle");
298
295
  if (resizeHandle) resizeHandle.classList.remove("dm-mode");
296
+ // Re-sync resize handle positions after DM width changes (defer to let layout settle)
297
+ setTimeout(function () { if (_ctx.syncResizeHandles) _ctx.syncResizeHandles(); }, 100);
299
298
  _ctx.hideMateSidebar();
300
299
  _ctx.hideKnowledge();
301
300
  _ctx.hideMemory();
302
301
  if (_ctx.isSchedulerOpen()) _ctx.closeScheduler();
303
- // Restore terminal button
304
- var termBtn = document.getElementById("terminal-toggle-btn");
305
- if (termBtn) termBtn.style.display = "";
306
-
307
302
  // Reset DM header
308
303
  var dmHeaderBar = document.getElementById("dm-header-bar");
309
304
  if (dmHeaderBar) {
@@ -19,13 +19,14 @@ import { renderMemoryList } from './mate-memory.js';
19
19
  import { handlePaletteSessionSwitch, setPaletteVersion } from './command-palette.js';
20
20
  import { handleFindInSessionResults } from './session-search.js';
21
21
  import { handleInputSync, autoResize, builtinCommands, setScheduleBtnDisabled } from './input.js';
22
- import { startThinking, appendThinking, stopThinking, resetThinkingGroup, createToolItem, updateToolExecuting, updateToolResult, markAllToolsDone, closeToolGroup, removeToolFromGroup, resetToolState, getTools, getPlanContent, setPlanContent, renderPlanBanner, renderPlanCard, getTodoTools, handleTodoWrite, handleTaskCreate, handleTaskUpdate, isPlanFilePath, enableMainInput, addTurnMeta, updateSubagentActivity, addSubagentToolEntry, markSubagentDone, initSubagentStop, updateSubagentProgress, renderAskUserQuestion, markAskUserAnswered, renderPermissionRequest, markPermissionCancelled, markPermissionResolved, renderElicitationRequest, markElicitationResolved } from './tools.js';
22
+ import { startThinking, appendThinking, stopThinking, resetThinkingGroup, createToolItem, updateToolExecuting, updateToolResult, markAllToolsDone, closeToolGroup, removeToolFromGroup, resetToolState, getTools, getPlanContent, setPlanContent, renderPlanBanner, renderPlanCard, getTodoTools, handleTodoWrite, handleTaskCreate, handleTaskUpdate, isPlanFilePath, enableMainInput, addTurnMeta, updateSubagentActivity, addSubagentToolEntry, markSubagentDone, initSubagentStop, updateSubagentProgress, updateSubagentTaskStatus, renderAskUserQuestion, markAskUserAnswered, renderPermissionRequest, markPermissionCancelled, markPermissionResolved, renderElicitationRequest, markElicitationResolved } from './tools.js';
23
23
  import { showDoneNotification, playDoneSound, isNotifAlertEnabled, isNotifSoundEnabled } from './notifications.js';
24
24
  import { handleFsList, handleFsRead, handleFileChanged, handleDirChanged, handleFileHistory, handleGitDiff, handleFileAt, refreshIfOpen, getPendingNavigate } from './filebrowser.js';
25
25
  import { isProjectSettingsOpen, handleInstructionsRead, handleInstructionsWrite, handleProjectEnv, handleProjectEnvSaved, handleProjectSharedEnv, handleProjectSharedEnvSaved, handleProjectOwnerChanged } from './project-settings.js';
26
26
  import { updateSettingsModels, updateSettingsStats, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleAutoContinueChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleGlobalClaudeMdRead, handleGlobalClaudeMdWrite } from './server-settings.js';
27
27
  import { handleTermList, handleTermCreated, sendTerminalCommand, handleTermOutput, handleTermResized, handleTermExited, handleTermClosed } from './terminal.js';
28
- import { updateTerminalList, handleContextSourcesState } from './context-sources.js';
28
+ import { updateTerminalList, handleContextSourcesState, updateEmailAccountList, updateEmailUnreadCounts, handleEmailTestResult, handleEmailAddResult, handleEmailRemoveResult, handleEmailDefaults } from './context-sources.js';
29
+ import { refreshEmailSettings } from './user-settings.js';
29
30
  import { handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteDeleted } from './sticky-notes.js';
30
31
  import { handleSkillInstalled, handleSkillUninstalled } from './skills.js';
31
32
  import { showRewindModal, onRewindComplete, setRewindMode, onRewindError, clearPendingRewindUuid, addRewindButton } from './rewind.js';
@@ -233,6 +234,7 @@ export function processMessage(msg) {
233
234
  break;
234
235
  }
235
236
  store.setState({ projectName: msg.project || msg.cwd });
237
+ if (msg.cwd) store.setState({ cwd: msg.cwd });
236
238
  if (msg.slug) store.setState({ currentSlug: msg.slug });
237
239
  try { var _is = store.getState(); localStorage.setItem("clay-project-name-" + (_is.currentSlug || "default"), _is.projectName); } catch (e) {}
238
240
  // In mate DM, keep title as mate name and re-apply mate color
@@ -787,6 +789,10 @@ export function processMessage(msg) {
787
789
  updateSubagentProgress(msg.parentToolId, msg.usage, msg.lastToolName, msg.summary);
788
790
  break;
789
791
 
792
+ case "task_updated":
793
+ updateSubagentTaskStatus(msg.parentToolId, msg.patch);
794
+ break;
795
+
790
796
  case "result":
791
797
  setActivity(null);
792
798
  stopThinking();
@@ -837,6 +843,10 @@ export function processMessage(msg) {
837
843
  addSystemMessage(msg.text, false);
838
844
  break;
839
845
 
846
+ case "sdk_notification":
847
+ addSystemMessage(msg.text, false);
848
+ break;
849
+
840
850
  case "process_conflict":
841
851
  setActivity(null);
842
852
  addConflictMessage(msg);
@@ -992,6 +1002,31 @@ export function processMessage(msg) {
992
1002
  handleContextSourcesState(msg);
993
1003
  break;
994
1004
 
1005
+ case "email_accounts_list":
1006
+ updateEmailAccountList(msg);
1007
+ refreshEmailSettings();
1008
+ break;
1009
+
1010
+ case "email_unread_update":
1011
+ updateEmailUnreadCounts(msg);
1012
+ break;
1013
+
1014
+ case "email_account_test_result":
1015
+ handleEmailTestResult(msg);
1016
+ break;
1017
+
1018
+ case "email_account_add_result":
1019
+ handleEmailAddResult(msg);
1020
+ break;
1021
+
1022
+ case "email_account_remove_result":
1023
+ handleEmailRemoveResult(msg);
1024
+ break;
1025
+
1026
+ case "email_defaults":
1027
+ handleEmailDefaults(msg);
1028
+ break;
1029
+
995
1030
  case "extension_command":
996
1031
  sendExtensionCommand(msg.command, msg.args, msg.requestId);
997
1032
  break;
@@ -77,7 +77,7 @@ var MODE_OPTIONS = [
77
77
  { value: "acceptEdits", label: "Auto-accept edits" },
78
78
  ];
79
79
  var MODE_FULL_AUTO = { value: "bypassPermissions", label: "Full auto" };
80
- var EFFORT_LEVELS = ["low", "medium", "high", "max"];
80
+ var EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max"];
81
81
  var THINKING_OPTIONS = ["disabled", "adaptive", "budget"];
82
82
  var KNOWN_CONTEXT_WINDOWS = {
83
83
  "opus-4-6": 1000000,
@@ -115,6 +115,7 @@ function modeDisplayName(value) {
115
115
 
116
116
  function effortDisplayName(value) {
117
117
  if (!value) return "";
118
+ if (value === "xhigh") return "X-High";
118
119
  return value.charAt(0).toUpperCase() + value.slice(1);
119
120
  }
120
121