clay-server 3.4.0-beta.9 → 3.5.0-beta.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.
- package/lib/daemon.js +58 -58
- package/lib/project-connection.js +19 -6
- package/lib/project-models.js +220 -0
- package/lib/project-session-handoff.js +281 -0
- package/lib/project-session-pair.js +14 -7
- package/lib/project-session-spawn.js +1 -1
- package/lib/project-sessions.js +13 -45
- package/lib/project-worker-proposal.js +51 -14
- package/lib/project.js +74 -80
- package/lib/public/app.js +11 -0
- package/lib/public/copilot-avatar.svg +5 -0
- package/lib/public/css/filebrowser.css +6 -1
- package/lib/public/css/input.css +56 -0
- package/lib/public/css/mates.css +6 -0
- package/lib/public/css/menus.css +35 -56
- package/lib/public/css/pane.css +18 -3
- package/lib/public/css/session-actions.css +98 -0
- package/lib/public/grok-avatar.svg +4 -0
- package/lib/public/index.html +26 -9
- package/lib/public/junie-avatar.svg +11 -0
- package/lib/public/kimi-avatar.svg +4 -0
- package/lib/public/modules/agent-config-selects.js +69 -0
- package/lib/public/modules/app-connection.js +6 -0
- package/lib/public/modules/app-header.js +0 -22
- package/lib/public/modules/app-messages.js +48 -9
- package/lib/public/modules/app-panels.js +33 -82
- package/lib/public/modules/app-projects.js +2 -0
- package/lib/public/modules/app-rendering.js +16 -1
- package/lib/public/modules/background-tasks-ui.js +55 -0
- package/lib/public/modules/filebrowser-tabs.js +65 -0
- package/lib/public/modules/filebrowser.js +23 -3
- package/lib/public/modules/mate-sidebar.js +10 -2
- package/lib/public/modules/model-picker.js +263 -0
- package/lib/public/modules/pane-bridge.js +6 -0
- package/lib/public/modules/session-actions.js +294 -0
- package/lib/public/modules/sidebar-mobile.js +2 -1
- package/lib/public/modules/sidebar-sessions.js +17 -1
- package/lib/public/modules/split-pair-ui.js +16 -77
- package/lib/public/modules/split-view.js +11 -1
- package/lib/public/modules/tools.js +5 -0
- package/lib/public/modules/vendor-priority.js +6 -1
- package/lib/public/modules/worker-proposal.js +6 -1
- package/lib/public/qwen-avatar.svg +4 -0
- package/lib/public/style.css +1 -0
- package/lib/sdk-bridge.js +57 -34
- package/lib/sdk-message-processor.js +26 -4
- package/lib/session-handoff-context.js +113 -0
- package/lib/session-handoff-mcp-server.js +36 -0
- package/lib/session-notes-mcp-server.js +1 -0
- package/lib/sessions.js +4 -0
- package/lib/ws-schema.js +9 -1
- package/lib/yoke/acp-agent-profiles.js +64 -0
- package/lib/yoke/adapters/acp.js +2 -1
- package/lib/yoke/adapters/claude.js +34 -0
- package/lib/yoke/adapters/codex.js +38 -3
- package/lib/yoke/adapters/copilot.js +7 -0
- package/lib/yoke/adapters/grok.js +7 -0
- package/lib/yoke/adapters/junie.js +7 -0
- package/lib/yoke/adapters/kimi.js +7 -0
- package/lib/yoke/adapters/kiro.js +4 -3
- package/lib/yoke/adapters/qwen.js +7 -0
- package/lib/yoke/codex-background-tasks.js +84 -0
- package/lib/yoke/index.js +43 -14
- package/lib/yoke/instructions.js +3 -0
- package/lib/yoke/interface.js +21 -0
- package/lib/yoke/vendor-registry.js +66 -0
- package/package.json +1 -1
package/lib/public/app.js
CHANGED
|
@@ -60,10 +60,12 @@ import { initRateLimit, handleRateLimitEvent as _rlHandleRateLimitEvent, updateR
|
|
|
60
60
|
import { initCursors, handleRemoteCursorMove as _curHandleRemoteCursorMove, handleRemoteCursorLeave as _curHandleRemoteCursorLeave, handleRemoteSelection as _curHandleRemoteSelection, clearRemoteCursors as _curClearRemoteCursors, initCursorToggle } from './modules/app-cursors.js';
|
|
61
61
|
import { initFavicon, updateFavicon as _favUpdateFavicon, setSendBtnMode as _favSetSendBtnMode, blinkIO as _favBlinkIO, blinkSessionDot as _favBlinkSessionDot, updateCrossProjectBlink as _favUpdateCrossProjectBlink, startUrgentBlink as _favStartUrgentBlink, stopUrgentBlink as _favStopUrgentBlink, setActivity as _favSetActivity, drawFaviconAnimFrame as _favDrawFaviconAnimFrame } from './modules/app-favicon.js';
|
|
62
62
|
import { initHeader, closeSessionInfoPopover as _hdrCloseSessionInfoPopover, updateHistorySentinel as _hdrUpdateHistorySentinel, requestMoreHistory as _hdrRequestMoreHistory, prependOlderHistory as _hdrPrependOlderHistory } from './modules/app-header.js';
|
|
63
|
+
import { initSessionActions } from './modules/session-actions.js';
|
|
63
64
|
import { initMisc, flushPendingExtMessages, showImageModal as _miscShowImageModal, closeImageModal as _miscCloseImageModal, showPasteModal as _miscShowPasteModal, closePasteModal as _miscClosePasteModal, showConfirm as _miscShowConfirm, hideConfirm as _miscHideConfirm, showForceChangePinOverlay as _miscShowForceChangePinOverlay, sendExtensionCommand as _miscSendExtensionCommand, handleExtensionResult as _miscHandleExtensionResult } from './modules/app-misc.js';
|
|
64
65
|
import { initSkillInstall, requireSkills as _siRequireSkills, requireClayMateInterview as _siRequireClayMateInterview, handleSkillInstallWs as _siHandleSkillInstallWs } from './modules/app-skills-install.js';
|
|
65
66
|
import { initDebateUi, showDebateConcludeConfirm as _debShowDebateConcludeConfirm, exitDebateConcludeMode as _debExitDebateConcludeMode, handleDebateConcludeSend as _debHandleDebateConcludeSend, showDebateEndedMode as _debShowDebateEndedMode, exitDebateEndedMode as _debExitDebateEndedMode, showDebateUserFloor as _debShowDebateUserFloor, exitDebateFloorMode as _debExitDebateFloorMode, handleDebateFloorSend as _debHandleDebateFloorSend, renderDebateUserFloorDone as _debRenderDebateUserFloorDone, showDebateSticky as _debShowDebateSticky, showDebateBottomBar as _debShowDebateBottomBar, removeDebateBottomBar as _debRemoveDebateBottomBar, sendDebateStickyComment as _debSendDebateStickyComment, updateDebateRound as _debUpdateDebateRound } from './modules/app-debate-ui.js';
|
|
66
67
|
import { initLoopUi, updateLoopInputVisibility as _loopUpdateLoopInputVisibility, updateLoopButton as _loopUpdateLoopButton, showLoopBanner as _loopShowLoopBanner, updateLoopBanner as _loopUpdateLoopBanner, updateRalphBars as _loopUpdateRalphBars, showRalphCraftingBar as _loopShowRalphCraftingBar, showRalphApprovalBar as _loopShowRalphApprovalBar, updateRalphApprovalStatus as _loopUpdateRalphApprovalStatus, openRalphPreviewModal as _loopOpenRalphPreviewModal, showExecModal as _loopShowExecModal, closeExecModal as _loopCloseExecModal, updateExecModalStatus as _loopUpdateExecModalStatus } from './modules/app-loop-ui.js';
|
|
68
|
+
import { initBackgroundTasksUi } from './modules/background-tasks-ui.js';
|
|
67
69
|
import { initLoopWizard, openRalphWizard as _loopOpenRalphWizard, closeRalphWizard as _loopCloseRalphWizard, getWizardSource as _loopGetWizardSource } from './modules/app-loop-wizard.js';
|
|
68
70
|
import { initAppNotifications, handleNotificationsState as _notifHandleState, handleNotificationCreated as _notifHandleCreated, handleNotificationDismissed as _notifHandleDismissed, handleNotificationDismissedAll as _notifHandleDismissedAll } from './modules/app-notifications.js';
|
|
69
71
|
import { initWhatsNew, handleWhatsNewState as _wnHandleState, handleWhatsNewSeenResult as _wnHandleSeenResult } from './modules/whats-new.js';
|
|
@@ -295,6 +297,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
295
297
|
slashCommands: [],
|
|
296
298
|
processing: false,
|
|
297
299
|
activeSessionId: null,
|
|
300
|
+
activeBackgroundTasks: [],
|
|
298
301
|
sessionVendorBound: false,
|
|
299
302
|
cliSessionId: null,
|
|
300
303
|
isHeadlessMode: false,
|
|
@@ -339,6 +342,12 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
339
342
|
markdownSlideLevelExplicit: false,
|
|
340
343
|
currentModel: "",
|
|
341
344
|
currentModels: [],
|
|
345
|
+
modelListVendor: "",
|
|
346
|
+
modelListStatus: "idle",
|
|
347
|
+
modelListError: "",
|
|
348
|
+
modelRequestId: "",
|
|
349
|
+
modelSelectionPending: null,
|
|
350
|
+
modelSelectionError: "",
|
|
342
351
|
// Project's last-used vendor; seeds the sidebar's "New session" button.
|
|
343
352
|
lastVendor: "",
|
|
344
353
|
// Static adapter metadata sent before any vendor is initialized.
|
|
@@ -633,6 +642,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
633
642
|
|
|
634
643
|
// --- Header module (rename, info popover, history) ---
|
|
635
644
|
initHeader();
|
|
645
|
+
initSessionActions();
|
|
636
646
|
|
|
637
647
|
// --- Skill Install module ---
|
|
638
648
|
initSkillInstall();
|
|
@@ -641,6 +651,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
641
651
|
initDebateUi();
|
|
642
652
|
|
|
643
653
|
initLoopUi();
|
|
654
|
+
initBackgroundTasksUi();
|
|
644
655
|
initLoopWizard();
|
|
645
656
|
|
|
646
657
|
// --- Notifications module ---
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="GitHub Copilot CLI">
|
|
2
|
+
<rect width="64" height="64" rx="14" fill="#24292f"/>
|
|
3
|
+
<path d="M15 25c0-8 7-14 17-14s17 6 17 14v15c0 8-7 13-17 13s-17-5-17-13zm8 1v13c0 4 4 7 9 7s9-3 9-7V26c0-4-4-7-9-7s-9 3-9 7z" fill="#fff"/>
|
|
4
|
+
<circle cx="27" cy="30" r="3" fill="#24292f"/><circle cx="37" cy="30" r="3" fill="#24292f"/>
|
|
5
|
+
</svg>
|
|
@@ -960,7 +960,7 @@
|
|
|
960
960
|
width: 50%;
|
|
961
961
|
max-width: 720px;
|
|
962
962
|
min-width: 360px;
|
|
963
|
-
border-
|
|
963
|
+
border-right: 1px solid var(--border);
|
|
964
964
|
background: var(--bg);
|
|
965
965
|
display: flex;
|
|
966
966
|
flex-direction: column;
|
|
@@ -1011,6 +1011,11 @@
|
|
|
1011
1011
|
min-height: 44px;
|
|
1012
1012
|
}
|
|
1013
1013
|
|
|
1014
|
+
.file-viewer-tabs { display: flex; min-width: 0; flex: 1; overflow-x: auto; gap: 2px; }
|
|
1015
|
+
.file-viewer-tab { display: inline-flex; align-items: center; gap: 6px; max-width: 170px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border: 0; border-radius: 5px; padding: 4px 7px; background: transparent; color: var(--text-secondary); font: inherit; font-size: 12px; cursor: pointer; }
|
|
1016
|
+
.file-viewer-tab.active { background: var(--sidebar-hover); color: var(--text); }
|
|
1017
|
+
.file-viewer-tab-close { font-size: 16px; line-height: 12px; color: var(--text-muted); }
|
|
1018
|
+
|
|
1014
1019
|
.file-viewer-path {
|
|
1015
1020
|
flex: 1;
|
|
1016
1021
|
font-family: "Roboto Mono", monospace;
|
package/lib/public/css/input.css
CHANGED
|
@@ -667,6 +667,50 @@
|
|
|
667
667
|
position: relative;
|
|
668
668
|
}
|
|
669
669
|
|
|
670
|
+
.background-tasks-bar {
|
|
671
|
+
max-width: var(--content-width);
|
|
672
|
+
margin: 0 auto 8px;
|
|
673
|
+
border: 1px solid var(--border);
|
|
674
|
+
border-radius: 8px;
|
|
675
|
+
background: var(--input-bg);
|
|
676
|
+
overflow: hidden;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.background-tasks-toggle {
|
|
680
|
+
width: 100%;
|
|
681
|
+
display: flex;
|
|
682
|
+
align-items: center;
|
|
683
|
+
gap: 7px;
|
|
684
|
+
padding: 8px 10px;
|
|
685
|
+
border: 0;
|
|
686
|
+
background: transparent;
|
|
687
|
+
color: var(--text-secondary);
|
|
688
|
+
cursor: pointer;
|
|
689
|
+
font: inherit;
|
|
690
|
+
text-align: left;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.background-tasks-chip, .session-background-task-count {
|
|
694
|
+
display: inline-flex;
|
|
695
|
+
align-items: center;
|
|
696
|
+
justify-content: center;
|
|
697
|
+
min-width: 16px;
|
|
698
|
+
height: 16px;
|
|
699
|
+
padding: 0 4px;
|
|
700
|
+
border-radius: 8px;
|
|
701
|
+
background: var(--accent);
|
|
702
|
+
color: var(--bg);
|
|
703
|
+
font-size: 10px;
|
|
704
|
+
font-weight: 700;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.background-tasks-list { padding: 0 10px 8px; }
|
|
708
|
+
.background-task-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--border-subtle); }
|
|
709
|
+
.background-task-description { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
710
|
+
.background-task-type { padding: 2px 6px; border-radius: 5px; background: var(--code-bg); color: var(--text-muted); font-size: 11px; }
|
|
711
|
+
.background-task-stop { border: 1px solid var(--border); border-radius: 5px; padding: 3px 7px; background: transparent; color: var(--text-secondary); cursor: pointer; font: inherit; font-size: 12px; }
|
|
712
|
+
.background-task-stop:hover { color: var(--text); border-color: var(--text-muted); }
|
|
713
|
+
|
|
670
714
|
#input-row {
|
|
671
715
|
display: flex;
|
|
672
716
|
flex-direction: column;
|
|
@@ -790,6 +834,7 @@
|
|
|
790
834
|
opacity: 0.35;
|
|
791
835
|
cursor: default;
|
|
792
836
|
}
|
|
837
|
+
.vendor-toggle-btn.disabled:not(.active) { display: none; }
|
|
793
838
|
.vendor-toggle-icon {
|
|
794
839
|
width: 16px;
|
|
795
840
|
height: 16px;
|
|
@@ -799,6 +844,17 @@
|
|
|
799
844
|
.vendor-toggle-label {
|
|
800
845
|
pointer-events: none;
|
|
801
846
|
}
|
|
847
|
+
.vendor-toggle-btn.experimental::after,
|
|
848
|
+
.vendor-experimental-badge {
|
|
849
|
+
content: "🧪";
|
|
850
|
+
font-size: 10px;
|
|
851
|
+
line-height: 1;
|
|
852
|
+
font-weight: 400;
|
|
853
|
+
filter: saturate(0.85);
|
|
854
|
+
}
|
|
855
|
+
.vendor-experimental-badge {
|
|
856
|
+
margin-left: auto;
|
|
857
|
+
}
|
|
802
858
|
@media (min-width: 901px) {
|
|
803
859
|
.vendor-toggle-btn:not(.active) .vendor-toggle-label { display: none; }
|
|
804
860
|
.vendor-toggle-btn:not(.active) { padding: 0 8px; }
|
package/lib/public/css/mates.css
CHANGED
|
@@ -682,6 +682,12 @@
|
|
|
682
682
|
.mate-vendor-label {
|
|
683
683
|
pointer-events: none;
|
|
684
684
|
}
|
|
685
|
+
.mate-vendor-btn.experimental::after {
|
|
686
|
+
content: "🧪";
|
|
687
|
+
font-size: 9px;
|
|
688
|
+
line-height: 1;
|
|
689
|
+
font-weight: 400;
|
|
690
|
+
}
|
|
685
691
|
.mate-vendor-btn:not(.active) .mate-vendor-label { display: none; }
|
|
686
692
|
|
|
687
693
|
/* Collapse button inside mate header: white to match header style */
|
package/lib/public/css/menus.css
CHANGED
|
@@ -43,62 +43,6 @@
|
|
|
43
43
|
#header-rename-btn:hover { color: var(--text-secondary); background: rgba(var(--overlay-rgb),0.04); border-color: var(--border); }
|
|
44
44
|
#header-rename-btn .lucide { width: 13px; height: 13px; }
|
|
45
45
|
|
|
46
|
-
#header-add-worker-btn {
|
|
47
|
-
display: inline-flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
justify-content: center;
|
|
50
|
-
gap: 7px;
|
|
51
|
-
width: auto;
|
|
52
|
-
height: 28px;
|
|
53
|
-
border: 1px solid color-mix(in srgb, var(--accent2) 28%, var(--border));
|
|
54
|
-
background: var(--accent2-8);
|
|
55
|
-
color: var(--accent2);
|
|
56
|
-
cursor: pointer;
|
|
57
|
-
border-radius: 8px;
|
|
58
|
-
flex-shrink: 0;
|
|
59
|
-
padding: 0 9px 0 7px;
|
|
60
|
-
margin-left: 0;
|
|
61
|
-
font-family: inherit;
|
|
62
|
-
font-size: 11px;
|
|
63
|
-
font-weight: 700;
|
|
64
|
-
line-height: 1;
|
|
65
|
-
white-space: nowrap;
|
|
66
|
-
transition: color 0.15s, background 0.15s, border-color 0.15s;
|
|
67
|
-
}
|
|
68
|
-
#header-add-worker-btn:hover {
|
|
69
|
-
color: var(--accent2-hover);
|
|
70
|
-
background: var(--accent2-15);
|
|
71
|
-
border-color: color-mix(in srgb, var(--accent2) 48%, var(--border));
|
|
72
|
-
}
|
|
73
|
-
.header-worker-icon {
|
|
74
|
-
position: relative;
|
|
75
|
-
display: inline-flex;
|
|
76
|
-
align-items: center;
|
|
77
|
-
justify-content: center;
|
|
78
|
-
width: 16px;
|
|
79
|
-
height: 16px;
|
|
80
|
-
flex-shrink: 0;
|
|
81
|
-
}
|
|
82
|
-
.header-worker-icon > .lucide { width: 15px; height: 15px; }
|
|
83
|
-
.header-worker-add-badge {
|
|
84
|
-
position: absolute;
|
|
85
|
-
right: -4px;
|
|
86
|
-
bottom: -3px;
|
|
87
|
-
display: inline-flex;
|
|
88
|
-
align-items: center;
|
|
89
|
-
justify-content: center;
|
|
90
|
-
width: 9px;
|
|
91
|
-
height: 9px;
|
|
92
|
-
border-radius: 50%;
|
|
93
|
-
background: var(--accent2);
|
|
94
|
-
color: var(--bg);
|
|
95
|
-
box-shadow: 0 0 0 2px var(--bg);
|
|
96
|
-
}
|
|
97
|
-
.header-worker-add-badge .lucide { width: 7px; height: 7px; stroke-width: 3; }
|
|
98
|
-
.header-worker-label { letter-spacing: 0.01em; }
|
|
99
|
-
#header-add-worker-btn.hidden { display: none; }
|
|
100
|
-
body.dm-mode #header-add-worker-btn { display: none; }
|
|
101
|
-
|
|
102
46
|
/* "Close terminal" button for a live TUI session. Matches the session-control
|
|
103
47
|
chrome; reds out on hover since it stops the running agent while preserving
|
|
104
48
|
the resumable session. */
|
|
@@ -702,6 +646,41 @@ body.dm-mode #header-add-worker-btn { display: none; }
|
|
|
702
646
|
color: var(--text-dimmer);
|
|
703
647
|
font-style: italic;
|
|
704
648
|
}
|
|
649
|
+
.config-model-state {
|
|
650
|
+
display: flex;
|
|
651
|
+
align-items: center;
|
|
652
|
+
gap: 10px;
|
|
653
|
+
min-width: 280px;
|
|
654
|
+
padding: 10px 14px;
|
|
655
|
+
color: var(--text-secondary);
|
|
656
|
+
font-size: 12px;
|
|
657
|
+
white-space: normal;
|
|
658
|
+
}
|
|
659
|
+
.config-model-state > div { flex: 1; min-width: 0; }
|
|
660
|
+
.config-model-state-title { color: var(--text); font-weight: 600; }
|
|
661
|
+
.config-model-state-detail { margin-top: 2px; color: var(--text-muted); line-height: 1.35; }
|
|
662
|
+
.config-model-spinner {
|
|
663
|
+
width: 14px;
|
|
664
|
+
height: 14px;
|
|
665
|
+
flex: 0 0 auto;
|
|
666
|
+
border: 2px solid var(--border);
|
|
667
|
+
border-top-color: var(--accent);
|
|
668
|
+
border-radius: 50%;
|
|
669
|
+
animation: config-model-spin 0.8s linear infinite;
|
|
670
|
+
}
|
|
671
|
+
@keyframes config-model-spin { to { transform: rotate(360deg); } }
|
|
672
|
+
.config-model-retry {
|
|
673
|
+
flex: 0 0 auto;
|
|
674
|
+
border: 1px solid var(--border);
|
|
675
|
+
border-radius: 5px;
|
|
676
|
+
padding: 4px 8px;
|
|
677
|
+
background: var(--surface-raised);
|
|
678
|
+
color: var(--text-secondary);
|
|
679
|
+
font: inherit;
|
|
680
|
+
cursor: pointer;
|
|
681
|
+
}
|
|
682
|
+
.config-model-retry:hover { color: var(--text); border-color: var(--text-muted); }
|
|
683
|
+
.config-radio-item.pending { color: var(--accent); opacity: 0.75; }
|
|
705
684
|
|
|
706
685
|
/* Segmented control for effort */
|
|
707
686
|
.config-segmented {
|
package/lib/public/css/pane.css
CHANGED
|
@@ -23,6 +23,12 @@ body.pane-mode #sticky-notes-container {
|
|
|
23
23
|
display: none !important;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
body.pane-mode #file-viewer { display: none !important; }
|
|
27
|
+
|
|
28
|
+
body.pane-mode #connect-overlay { background: var(--bg); }
|
|
29
|
+
body.pane-mode #connect-overlay #ascii-logo-canvas { display: none; }
|
|
30
|
+
body.pane-mode #connect-overlay-msg { color: var(--text-dimmer); }
|
|
31
|
+
|
|
26
32
|
body.pane-mode .notif-banner-container {
|
|
27
33
|
display: none !important;
|
|
28
34
|
}
|
|
@@ -100,7 +106,8 @@ body.pane-mode #input-area {
|
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
.split-pane-title {
|
|
103
|
-
flex: 1;
|
|
109
|
+
flex: 0 1 auto;
|
|
110
|
+
max-width: 46%;
|
|
104
111
|
min-width: 0;
|
|
105
112
|
overflow: hidden;
|
|
106
113
|
text-overflow: ellipsis;
|
|
@@ -202,15 +209,18 @@ button.split-pair-role:hover { filter: brightness(1.25); }
|
|
|
202
209
|
max-width: var(--content-width);
|
|
203
210
|
margin: 0 auto;
|
|
204
211
|
padding: 4px 10px;
|
|
205
|
-
border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
|
|
206
|
-
border-bottom: 0;
|
|
207
212
|
border-radius: 8px 8px 0 0;
|
|
208
213
|
background: color-mix(in srgb, var(--accent) 8%, var(--bg));
|
|
209
214
|
color: var(--text-secondary);
|
|
210
215
|
font-size: 11px;
|
|
211
216
|
line-height: 1.4;
|
|
217
|
+
transition: box-shadow 0.2s;
|
|
212
218
|
}
|
|
213
219
|
.pane-delegation-notice.visible { display: flex; }
|
|
220
|
+
.pane-delegation-notice.visible:has(+ #input-wrapper #input-row:focus-within) {
|
|
221
|
+
box-shadow: 0 0 0 1px var(--border);
|
|
222
|
+
clip-path: inset(-1px -1px 0 -1px);
|
|
223
|
+
}
|
|
214
224
|
.pane-delegation-notice.visible + #input-wrapper #input-row {
|
|
215
225
|
border-radius: 0 0 8px 8px;
|
|
216
226
|
}
|
|
@@ -283,12 +293,17 @@ button.split-pair-role:hover { filter: brightness(1.25); }
|
|
|
283
293
|
color: var(--text-dimmer);
|
|
284
294
|
cursor: pointer;
|
|
285
295
|
flex-shrink: 0;
|
|
296
|
+
margin-left: auto;
|
|
286
297
|
}
|
|
287
298
|
|
|
288
299
|
.split-pane-context.has-data {
|
|
289
300
|
display: inline-flex;
|
|
290
301
|
}
|
|
291
302
|
|
|
303
|
+
.split-pane-context:not(.has-data) + .split-pane-close {
|
|
304
|
+
margin-left: auto;
|
|
305
|
+
}
|
|
306
|
+
|
|
292
307
|
.split-pane-context:hover {
|
|
293
308
|
background: var(--bg-alt);
|
|
294
309
|
color: var(--text);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#header-session-actions-btn {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
justify-content: center;
|
|
5
|
+
width: 28px;
|
|
6
|
+
height: 28px;
|
|
7
|
+
padding: 0;
|
|
8
|
+
border: 1px solid transparent;
|
|
9
|
+
border-radius: 8px;
|
|
10
|
+
background: transparent;
|
|
11
|
+
color: var(--text-dimmer);
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
flex-shrink: 0;
|
|
14
|
+
transition: color 0.15s, background 0.15s, border-color 0.15s;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#header-session-actions-btn:hover,
|
|
18
|
+
#header-session-actions-btn[aria-expanded="true"] {
|
|
19
|
+
color: var(--text);
|
|
20
|
+
background: rgba(var(--overlay-rgb), 0.05);
|
|
21
|
+
border-color: var(--border);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
#header-session-actions-btn.hidden { display: none; }
|
|
25
|
+
#header-session-actions-btn .lucide { width: 16px; height: 16px; }
|
|
26
|
+
|
|
27
|
+
.session-actions-menu {
|
|
28
|
+
position: fixed;
|
|
29
|
+
z-index: 10020;
|
|
30
|
+
width: 286px;
|
|
31
|
+
padding: 6px;
|
|
32
|
+
border: 1px solid var(--border);
|
|
33
|
+
border-radius: 12px;
|
|
34
|
+
background: color-mix(in srgb, var(--bg) 96%, transparent);
|
|
35
|
+
box-shadow: 0 14px 38px rgba(var(--shadow-rgb), 0.32), 0 2px 8px rgba(var(--shadow-rgb), 0.2);
|
|
36
|
+
backdrop-filter: blur(18px);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.session-actions-row {
|
|
40
|
+
width: 100%;
|
|
41
|
+
border: 0;
|
|
42
|
+
background: transparent;
|
|
43
|
+
color: var(--text);
|
|
44
|
+
font: inherit;
|
|
45
|
+
text-align: left;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.session-actions-row {
|
|
50
|
+
display: grid;
|
|
51
|
+
grid-template-columns: 30px minmax(0, 1fr) 16px;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: 8px;
|
|
54
|
+
min-height: 54px;
|
|
55
|
+
padding: 7px 8px;
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.session-actions-row:hover { background: var(--bg-alt); }
|
|
60
|
+
.session-actions-row:disabled { cursor: default; opacity: 0.42; }
|
|
61
|
+
.session-actions-row:disabled:hover { background: transparent; }
|
|
62
|
+
|
|
63
|
+
.session-actions-row-icon {
|
|
64
|
+
display: grid;
|
|
65
|
+
place-items: center;
|
|
66
|
+
width: 28px;
|
|
67
|
+
height: 28px;
|
|
68
|
+
border: 1px solid var(--border-subtle);
|
|
69
|
+
border-radius: 8px;
|
|
70
|
+
background: rgba(var(--overlay-rgb), 0.035);
|
|
71
|
+
color: var(--accent2);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.session-actions-row-icon .lucide { width: 15px; height: 15px; }
|
|
75
|
+
.session-actions-row-copy { display: flex; min-width: 0; flex-direction: column; gap: 2px; }
|
|
76
|
+
.session-actions-row-copy strong { font-size: 12px; font-weight: 750; }
|
|
77
|
+
.session-actions-row-copy > span { color: var(--text-dimmer); font-size: 10px; line-height: 1.25; }
|
|
78
|
+
.session-actions-row-chevron { color: var(--text-dimmer); }
|
|
79
|
+
.session-actions-row-chevron .lucide { width: 13px; height: 13px; }
|
|
80
|
+
|
|
81
|
+
.handoff-modal { width: min(420px, calc(100vw - 32px)); }
|
|
82
|
+
.handoff-modal-desc { margin: -10px 0 14px; color: var(--text-dimmer); font-size: 12px; line-height: 1.45; }
|
|
83
|
+
.handoff-modal-source {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 10px;
|
|
87
|
+
margin-bottom: 14px;
|
|
88
|
+
padding: 10px;
|
|
89
|
+
border: 1px solid var(--border-subtle);
|
|
90
|
+
border-radius: 9px;
|
|
91
|
+
background: var(--bg-alt);
|
|
92
|
+
}
|
|
93
|
+
.handoff-modal-source > img { width: 26px; height: 26px; object-fit: contain; border-radius: 6px; }
|
|
94
|
+
.handoff-modal-source > span { display: grid; min-width: 0; gap: 1px; }
|
|
95
|
+
.handoff-modal-source strong { overflow: hidden; color: var(--text); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
|
|
96
|
+
.handoff-modal-source span span { color: var(--text-dimmer); font-size: 10px; }
|
|
97
|
+
.handoff-modal-field + .handoff-modal-field { margin-top: 10px; }
|
|
98
|
+
.handoff-modal-field .wt-modal-label { margin-top: 0; }
|
package/lib/public/index.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
(function(){try{var k="clay-theme-vars",v=localStorage.getItem(k),r=document.documentElement;if(v){var o=JSON.parse(v),p;for(p in o)r.style.setProperty(p,o[p]);var vt=localStorage.getItem(k.replace("-vars","-variant"));if(vt==="light"){r.classList.add("light-theme");r.classList.remove("dark-theme")}else{r.classList.add("dark-theme");r.classList.remove("light-theme")}var m=document.querySelector('meta[name="theme-color"]');if(m&&o["--bg"])m.setAttribute("content",o["--bg"])}else{var sl=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;if(sl){r.classList.add("light-theme");r.classList.remove("dark-theme")}}}catch(e){}})();
|
|
31
31
|
</script>
|
|
32
32
|
<script>if(window.navigator.standalone||window.matchMedia("(display-mode:standalone)").matches){document.documentElement.classList.add("pwa-standalone")}</script>
|
|
33
|
-
<link rel="stylesheet" href="style.css?v=
|
|
33
|
+
<link rel="stylesheet" href="style.css?v=20260826a">
|
|
34
34
|
<style>
|
|
35
35
|
@media(max-width:768px){
|
|
36
36
|
/* User messages: vertical stack, avatar on top, right-aligned */
|
|
@@ -388,12 +388,8 @@
|
|
|
388
388
|
<div id="ralph-sticky" class="hidden"></div>
|
|
389
389
|
<div id="debate-sticky" class="hidden"></div>
|
|
390
390
|
<div class="status">
|
|
391
|
-
<button id="header-
|
|
392
|
-
<
|
|
393
|
-
<i data-lucide="bot"></i>
|
|
394
|
-
<span class="header-worker-add-badge"><i data-lucide="plus"></i></span>
|
|
395
|
-
</span>
|
|
396
|
-
<span class="header-worker-label">Add Worker</span>
|
|
391
|
+
<button id="header-session-actions-btn" type="button" aria-label="Session actions" title="Session actions" aria-haspopup="menu" aria-expanded="false">
|
|
392
|
+
<i data-lucide="ellipsis"></i>
|
|
397
393
|
</button>
|
|
398
394
|
<button type="button" id="header-tui-font-btn" class="header-tui-font-btn hidden" title="Terminal font" aria-label="Terminal font">
|
|
399
395
|
<i data-lucide="type"></i>
|
|
@@ -407,7 +403,7 @@
|
|
|
407
403
|
<div id="app">
|
|
408
404
|
<div id="connect-overlay">
|
|
409
405
|
<canvas id="ascii-logo-canvas"></canvas>
|
|
410
|
-
<p id="connect-overlay-msg">
|
|
406
|
+
<p id="connect-overlay-msg">Connecting…</p>
|
|
411
407
|
</div>
|
|
412
408
|
<div id="sticky-notes-container" class="hidden"></div>
|
|
413
409
|
<div id="debate-info-float" class="hidden"></div>
|
|
@@ -542,6 +538,26 @@
|
|
|
542
538
|
<img src="/opencode-avatar.svg" class="vendor-toggle-icon" alt="OpenCode">
|
|
543
539
|
<span class="vendor-toggle-label">OpenCode</span>
|
|
544
540
|
</button>
|
|
541
|
+
<button id="vendor-btn-kimi" class="vendor-toggle-btn" data-vendor="kimi">
|
|
542
|
+
<img src="/kimi-avatar.svg" class="vendor-toggle-icon" alt="Kimi">
|
|
543
|
+
<span class="vendor-toggle-label">Kimi Code</span>
|
|
544
|
+
</button>
|
|
545
|
+
<button id="vendor-btn-grok" class="vendor-toggle-btn" data-vendor="grok">
|
|
546
|
+
<img src="/grok-avatar.svg" class="vendor-toggle-icon" alt="Grok">
|
|
547
|
+
<span class="vendor-toggle-label">Grok Build</span>
|
|
548
|
+
</button>
|
|
549
|
+
<button id="vendor-btn-copilot" class="vendor-toggle-btn" data-vendor="copilot">
|
|
550
|
+
<img src="/copilot-avatar.svg" class="vendor-toggle-icon" alt="GitHub Copilot">
|
|
551
|
+
<span class="vendor-toggle-label">GitHub Copilot CLI</span>
|
|
552
|
+
</button>
|
|
553
|
+
<button id="vendor-btn-qwen" class="vendor-toggle-btn" data-vendor="qwen">
|
|
554
|
+
<img src="/qwen-avatar.svg" class="vendor-toggle-icon" alt="Qwen">
|
|
555
|
+
<span class="vendor-toggle-label">Qwen Code</span>
|
|
556
|
+
</button>
|
|
557
|
+
<button id="vendor-btn-junie" class="vendor-toggle-btn" data-vendor="junie">
|
|
558
|
+
<img src="/junie-avatar.svg" class="vendor-toggle-icon" alt="Junie">
|
|
559
|
+
<span class="vendor-toggle-label">Junie CLI</span>
|
|
560
|
+
</button>
|
|
545
561
|
<button id="vendor-btn-kiro" class="vendor-toggle-btn" data-vendor="kiro">
|
|
546
562
|
<img src="/kiro-avatar.svg" class="vendor-toggle-icon" alt="Kiro">
|
|
547
563
|
<span class="vendor-toggle-label">Kiro CLI</span>
|
|
@@ -664,6 +680,7 @@
|
|
|
664
680
|
|
|
665
681
|
<div id="file-viewer" class="hidden">
|
|
666
682
|
<div class="file-viewer-header">
|
|
683
|
+
<div class="file-viewer-tabs" id="file-viewer-tabs" role="tablist"></div>
|
|
667
684
|
<span class="file-viewer-path" id="file-viewer-path"></span>
|
|
668
685
|
<span class="file-viewer-live-status hidden" id="file-viewer-live-status" aria-live="polite">
|
|
669
686
|
<span class="file-viewer-live-dot"></span>
|
|
@@ -2344,7 +2361,7 @@
|
|
|
2344
2361
|
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0/lib/addon-fit.min.js"></script>
|
|
2345
2362
|
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-web-links@0/lib/addon-web-links.min.js"></script>
|
|
2346
2363
|
<script src="https://cdn.jsdelivr.net/npm/@xterm/addon-webgl@0/lib/addon-webgl.min.js"></script>
|
|
2347
|
-
<script type="module" src="app.js?v=
|
|
2364
|
+
<script type="module" src="app.js?v=20260826a"></script>
|
|
2348
2365
|
<div id="pwa-install-modal" class="pwa-modal hidden">
|
|
2349
2366
|
<div class="pwa-modal-backdrop"></div>
|
|
2350
2367
|
<div class="pwa-modal-card">
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Junie">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="junie-gradient" x1="8" y1="8" x2="56" y2="56" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#8B5CF6"/>
|
|
5
|
+
<stop offset="1" stop-color="#F97316"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="64" height="64" rx="15" fill="url(#junie-gradient)"/>
|
|
9
|
+
<path d="M39 15v26c0 7.7-5.4 12-13.2 12-5.3 0-9.4-2.2-12-6.4l7.1-5c1.3 2 2.7 3 4.6 3 2.5 0 4-1.4 4-4.4V15H39Z" fill="#fff"/>
|
|
10
|
+
<circle cx="47.5" cy="17.5" r="4.5" fill="#fff" fill-opacity=".9"/>
|
|
11
|
+
</svg>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { VENDOR_NAMES, VENDOR_ORDER, isExperimentalVendor } from './app-rendering.js';
|
|
2
|
+
import { effortLevelsFor, effortDisplayName } from './app-panels.js';
|
|
3
|
+
|
|
4
|
+
function optionValue(entry) {
|
|
5
|
+
if (typeof entry === "string") return entry;
|
|
6
|
+
return entry && (entry.value || entry.id) || "";
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function optionLabel(entry) {
|
|
10
|
+
if (typeof entry === "string") return entry;
|
|
11
|
+
return entry && (entry.displayName || entry.name || entry.value || entry.id) || "";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function buildAgentVendorSelect(installed, preferred) {
|
|
15
|
+
var select = document.createElement("select");
|
|
16
|
+
select.className = "wt-modal-input";
|
|
17
|
+
for (var i = 0; i < VENDOR_ORDER.length; i++) {
|
|
18
|
+
var vendor = VENDOR_ORDER[i];
|
|
19
|
+
if (installed.indexOf(vendor) === -1) continue;
|
|
20
|
+
var option = document.createElement("option");
|
|
21
|
+
option.value = vendor;
|
|
22
|
+
option.textContent = (isExperimentalVendor(vendor) ? "🧪 " : "") + (VENDOR_NAMES[vendor] || vendor);
|
|
23
|
+
if (isExperimentalVendor(vendor)) option.title = "Experimental integration; not yet validated through direct use testing";
|
|
24
|
+
select.appendChild(option);
|
|
25
|
+
}
|
|
26
|
+
if (preferred && installed.indexOf(preferred) !== -1) select.value = preferred;
|
|
27
|
+
return select;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function fillAgentModels(select, vendor, options, preferred) {
|
|
31
|
+
var models = (options.modelsByVendor && options.modelsByVendor[vendor]) || [];
|
|
32
|
+
select.innerHTML = "";
|
|
33
|
+
var automatic = document.createElement("option");
|
|
34
|
+
automatic.value = "";
|
|
35
|
+
automatic.textContent = "Automatic";
|
|
36
|
+
select.appendChild(automatic);
|
|
37
|
+
for (var i = 0; i < models.length; i++) {
|
|
38
|
+
var option = document.createElement("option");
|
|
39
|
+
option.value = optionValue(models[i]);
|
|
40
|
+
option.textContent = optionLabel(models[i]);
|
|
41
|
+
select.appendChild(option);
|
|
42
|
+
}
|
|
43
|
+
select.value = preferred || "";
|
|
44
|
+
if (select.selectedIndex === -1) select.value = "";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function buildAgentEffortSelect() {
|
|
48
|
+
var select = document.createElement("select");
|
|
49
|
+
select.className = "wt-modal-input";
|
|
50
|
+
return select;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function fillAgentEffort(select, vendor, options, modelValue, preferred) {
|
|
54
|
+
var previous = preferred === undefined ? select.value : preferred;
|
|
55
|
+
var models = (options.modelsByVendor && options.modelsByVendor[vendor]) || [];
|
|
56
|
+
var levels = effortLevelsFor(vendor, models, modelValue);
|
|
57
|
+
select.innerHTML = "";
|
|
58
|
+
var automatic = document.createElement("option");
|
|
59
|
+
automatic.value = "";
|
|
60
|
+
automatic.textContent = "Default";
|
|
61
|
+
select.appendChild(automatic);
|
|
62
|
+
for (var i = 0; i < levels.length; i++) {
|
|
63
|
+
var option = document.createElement("option");
|
|
64
|
+
option.value = levels[i];
|
|
65
|
+
option.textContent = effortDisplayName(levels[i]);
|
|
66
|
+
select.appendChild(option);
|
|
67
|
+
}
|
|
68
|
+
select.value = levels.indexOf(previous) !== -1 ? previous : "";
|
|
69
|
+
}
|
|
@@ -17,6 +17,7 @@ var reconnectTimer = null;
|
|
|
17
17
|
var reconnectDelay = 1000;
|
|
18
18
|
var connectTimeoutId = null;
|
|
19
19
|
var connectOverlay = null;
|
|
20
|
+
var hasConnectedOnce = false;
|
|
20
21
|
|
|
21
22
|
export function initConnection() {
|
|
22
23
|
connectOverlay = document.getElementById("connect-overlay");
|
|
@@ -39,6 +40,7 @@ export function initConnection() {
|
|
|
39
40
|
if (state.connected !== prev.connected) {
|
|
40
41
|
var sendBtn = getSendBtn();
|
|
41
42
|
if (state.connected) {
|
|
43
|
+
hasConnectedOnce = true;
|
|
42
44
|
if (sendBtn) sendBtn.disabled = false;
|
|
43
45
|
if (connectOverlay) connectOverlay.classList.add("hidden");
|
|
44
46
|
var updPill = document.getElementById("update-pill-wrap");
|
|
@@ -46,6 +48,10 @@ export function initConnection() {
|
|
|
46
48
|
stopLogoAnimation();
|
|
47
49
|
} else {
|
|
48
50
|
if (sendBtn) sendBtn.disabled = true;
|
|
51
|
+
if (hasConnectedOnce && connectOverlay) {
|
|
52
|
+
var overlayMessage = document.getElementById("connect-overlay-msg");
|
|
53
|
+
if (overlayMessage) overlayMessage.textContent = "Reconnecting to server…";
|
|
54
|
+
}
|
|
49
55
|
if (connectOverlay) connectOverlay.classList.remove("hidden");
|
|
50
56
|
startLogoAnimation();
|
|
51
57
|
}
|
|
@@ -12,7 +12,6 @@ import { saveToolState, resetToolState, restoreToolState } from './tools.js';
|
|
|
12
12
|
import { getSessionUsage, setSessionUsage, getContextData, setContextData, updateContextPanel, updateUsagePanel } from './app-panels.js';
|
|
13
13
|
import { onHistoryPrepended as onSessionSearchHistoryPrepended } from './session-search.js';
|
|
14
14
|
import { getCachedSessions } from './sidebar-sessions.js';
|
|
15
|
-
import { openPairDialog } from './split-pair-ui.js';
|
|
16
15
|
import { showConfirm } from './app-misc.js';
|
|
17
16
|
|
|
18
17
|
// --- Module-owned state ---
|
|
@@ -23,27 +22,6 @@ export function initHeader() {
|
|
|
23
22
|
var headerRenameBtn = document.getElementById("header-rename-btn");
|
|
24
23
|
var headerTitleEl = document.getElementById("header-title");
|
|
25
24
|
var headerInfoBtn = document.getElementById("header-info-btn");
|
|
26
|
-
var headerAddWorkerBtn = document.getElementById("header-add-worker-btn");
|
|
27
|
-
|
|
28
|
-
// --- Add Worker: the current session becomes the Driver of a new pair ---
|
|
29
|
-
if (headerAddWorkerBtn) {
|
|
30
|
-
headerAddWorkerBtn.addEventListener("click", function () {
|
|
31
|
-
var sessionId = store.get('activeSessionId');
|
|
32
|
-
if (!sessionId || store.get('splitPanes') || store.get('dmMode')) return;
|
|
33
|
-
openPairDialog({
|
|
34
|
-
sessionId: sessionId,
|
|
35
|
-
title: headerTitleEl ? headerTitleEl.textContent : "",
|
|
36
|
-
vendor: store.get('currentVendor') || "claude",
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
// A split shows the GROUP in the title bar; adding a worker there makes
|
|
40
|
-
// no sense (the group already has two members), so hide the button.
|
|
41
|
-
store.subscribe(function (state, prev) {
|
|
42
|
-
if (state.splitPanes !== prev.splitPanes) {
|
|
43
|
-
headerAddWorkerBtn.classList.toggle("hidden", !!state.splitPanes);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
25
|
var headerFullAccessBtn = document.getElementById("header-full-access-btn");
|
|
48
26
|
|
|
49
27
|
function updateFullAccessButton() {
|