@duckmind/dm-darwin-arm64 0.13.6 → 0.13.7
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/extensions/.dm-extensions.json +25 -1
- package/extensions/dm-phone/README.md +23 -0
- package/extensions/dm-phone/index.ts +12 -0
- package/extensions/dm-phone/node_modules/.package-lock.json +29 -0
- package/extensions/dm-phone/node_modules/ws/LICENSE +20 -0
- package/extensions/dm-phone/node_modules/ws/README.md +548 -0
- package/extensions/dm-phone/node_modules/ws/browser.js +8 -0
- package/extensions/dm-phone/node_modules/ws/index.js +22 -0
- package/extensions/dm-phone/node_modules/ws/lib/buffer-util.js +131 -0
- package/extensions/dm-phone/node_modules/ws/lib/constants.js +19 -0
- package/extensions/dm-phone/node_modules/ws/lib/event-target.js +292 -0
- package/extensions/dm-phone/node_modules/ws/lib/extension.js +203 -0
- package/extensions/dm-phone/node_modules/ws/lib/limiter.js +55 -0
- package/extensions/dm-phone/node_modules/ws/lib/permessage-deflate.js +528 -0
- package/extensions/dm-phone/node_modules/ws/lib/receiver.js +706 -0
- package/extensions/dm-phone/node_modules/ws/lib/sender.js +602 -0
- package/extensions/dm-phone/node_modules/ws/lib/stream.js +161 -0
- package/extensions/dm-phone/node_modules/ws/lib/subprotocol.js +62 -0
- package/extensions/dm-phone/node_modules/ws/lib/validation.js +152 -0
- package/extensions/dm-phone/node_modules/ws/lib/websocket-server.js +554 -0
- package/extensions/dm-phone/node_modules/ws/lib/websocket.js +1393 -0
- package/extensions/dm-phone/node_modules/ws/package.json +70 -0
- package/extensions/dm-phone/node_modules/ws/wrapper.mjs +21 -0
- package/extensions/dm-phone/package-lock.json +66 -0
- package/extensions/dm-phone/package.json +35 -0
- package/extensions/dm-phone/phone-session-pool.ts +8 -0
- package/extensions/dm-phone/public/app/attachments.js +233 -0
- package/extensions/dm-phone/public/app/autocomplete-controller.js +81 -0
- package/extensions/dm-phone/public/app/autocomplete.js +135 -0
- package/extensions/dm-phone/public/app/bindings.js +178 -0
- package/extensions/dm-phone/public/app/command-catalog.js +76 -0
- package/extensions/dm-phone/public/app/commands.js +370 -0
- package/extensions/dm-phone/public/app/constants.js +60 -0
- package/extensions/dm-phone/public/app/formatters.js +131 -0
- package/extensions/dm-phone/public/app/handlers.js +442 -0
- package/extensions/dm-phone/public/app/main.js +6 -0
- package/extensions/dm-phone/public/app/markdown.js +105 -0
- package/extensions/dm-phone/public/app/messages.js +418 -0
- package/extensions/dm-phone/public/app/sheet-actions.js +113 -0
- package/extensions/dm-phone/public/app/sheet-navigation.js +19 -0
- package/extensions/dm-phone/public/app/sheets-view.js +272 -0
- package/extensions/dm-phone/public/app/state.js +95 -0
- package/extensions/dm-phone/public/app/tool-rendering.js +562 -0
- package/extensions/dm-phone/public/app/transport.js +176 -0
- package/extensions/dm-phone/public/app/ui.js +409 -0
- package/extensions/dm-phone/public/app.js +1 -0
- package/extensions/dm-phone/public/icon.svg +15 -0
- package/extensions/dm-phone/public/index.html +147 -0
- package/extensions/dm-phone/public/manifest.webmanifest +17 -0
- package/extensions/dm-phone/public/styles.css +1139 -0
- package/extensions/dm-phone/public/sw.js +78 -0
- package/extensions/dm-phone/src/extension/phone-args.ts +121 -0
- package/extensions/dm-phone/src/extension/phone-paths.ts +250 -0
- package/extensions/dm-phone/src/extension/phone-quota.ts +188 -0
- package/extensions/dm-phone/src/extension/phone-runtime.ts +154 -0
- package/extensions/dm-phone/src/extension/phone-server-runtime.ts +1217 -0
- package/extensions/dm-phone/src/extension/phone-sessions.ts +139 -0
- package/extensions/dm-phone/src/extension/phone-static.ts +30 -0
- package/extensions/dm-phone/src/extension/phone-tailscale.ts +148 -0
- package/extensions/dm-phone/src/extension/phone-theme.ts +85 -0
- package/extensions/dm-phone/src/extension/register-phone-child-extension.ts +112 -0
- package/extensions/dm-phone/src/extension/register-phone-extension.ts +106 -0
- package/extensions/dm-phone/src/extension/types.ts +73 -0
- package/extensions/dm-phone/src/session-pool/parent-session-worker.ts +881 -0
- package/extensions/dm-phone/src/session-pool/session-pool.ts +470 -0
- package/extensions/dm-phone/src/session-pool/session-worker.ts +734 -0
- package/extensions/dm-phone/src/session-pool/types.ts +105 -0
- package/extensions/dm-phone/src/session-pool/utils.ts +23 -0
- package/package.json +1 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { THINKING_LEVELS } from "./constants.js";
|
|
2
|
+
import { commandCategoryLabel, groupedCommands, selectedCommandCategory, sortCommandCategories } from "./command-catalog.js";
|
|
3
|
+
import { escapeHtml, formatDateTime } from "./formatters.js";
|
|
4
|
+
import { el, state } from "./state.js";
|
|
5
|
+
|
|
6
|
+
function renderStatsSection() {
|
|
7
|
+
if (!state.stats) return '<div class="label">Session stats will appear here after refresh.</div>';
|
|
8
|
+
const tokens = state.stats.tokens || {};
|
|
9
|
+
return `
|
|
10
|
+
<div class="stat-grid">
|
|
11
|
+
<div class="stat-chip"><span>Input tokens</span><strong>${escapeHtml((tokens.input || 0).toLocaleString())}</strong></div>
|
|
12
|
+
<div class="stat-chip"><span>Output tokens</span><strong>${escapeHtml((tokens.output || 0).toLocaleString())}</strong></div>
|
|
13
|
+
<div class="stat-chip"><span>Total tokens</span><strong>${escapeHtml((tokens.total || 0).toLocaleString())}</strong></div>
|
|
14
|
+
<div class="stat-chip"><span>Tool calls</span><strong>${escapeHtml(String(state.stats.toolCalls || 0))}</strong></div>
|
|
15
|
+
<div class="stat-chip"><span>Messages</span><strong>${escapeHtml(String(state.stats.totalMessages || 0))}</strong></div>
|
|
16
|
+
<div class="stat-chip"><span>Cost</span><strong>${escapeHtml(state.stats.cost != null ? `$${Number(state.stats.cost).toFixed(4)}` : "—")}</strong></div>
|
|
17
|
+
</div>
|
|
18
|
+
`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function renderActionsSheet() {
|
|
22
|
+
return `
|
|
23
|
+
<section class="sheet-section">
|
|
24
|
+
<h3>Quick actions</h3>
|
|
25
|
+
<div class="sheet-actions">
|
|
26
|
+
<div class="sheet-action-row">
|
|
27
|
+
<button class="secondary" data-sheet-action="refresh">Refresh snapshot</button>
|
|
28
|
+
<button class="secondary" data-sheet-action="new-session">New session</button>
|
|
29
|
+
<button class="secondary" data-sheet-action="compact">Compact session</button>
|
|
30
|
+
<button class="secondary" data-sheet-action="stats">Refresh stats</button>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="sheet-action-row">
|
|
33
|
+
<button class="secondary" data-sheet-action="models">Open model picker</button>
|
|
34
|
+
<button class="secondary" data-sheet-action="thinking">Open thinking picker</button>
|
|
35
|
+
<button class="secondary" data-sheet-action="commands">Browse commands</button>
|
|
36
|
+
<button class="secondary" data-sheet-action="sessions">Browse sessions</button>
|
|
37
|
+
<button class="secondary" data-sheet-action="tree">Browse tree</button>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</section>
|
|
41
|
+
<section class="sheet-section">
|
|
42
|
+
<h3>Session stats</h3>
|
|
43
|
+
${renderStatsSection()}
|
|
44
|
+
</section>
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function renderThinkingSheet() {
|
|
49
|
+
return `
|
|
50
|
+
<section class="sheet-section">
|
|
51
|
+
<h3>Thinking levels</h3>
|
|
52
|
+
<div class="sheet-list">
|
|
53
|
+
${THINKING_LEVELS.map((level) => `
|
|
54
|
+
<button class="secondary" data-thinking-level="${escapeHtml(level)}">
|
|
55
|
+
${escapeHtml(level)}${state.snapshotState?.thinkingLevel === level ? " · current" : ""}
|
|
56
|
+
</button>
|
|
57
|
+
`).join("")}
|
|
58
|
+
</div>
|
|
59
|
+
</section>
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function renderModelsSheet() {
|
|
64
|
+
return `
|
|
65
|
+
<section class="sheet-section">
|
|
66
|
+
<h3>Models</h3>
|
|
67
|
+
<div class="model-list">
|
|
68
|
+
${state.models.length
|
|
69
|
+
? state.models.map((model) => `
|
|
70
|
+
<button class="secondary" data-model-provider="${escapeHtml(model.provider)}" data-model-id="${escapeHtml(model.id)}">
|
|
71
|
+
<div><strong>${escapeHtml(model.name || model.id)}</strong></div>
|
|
72
|
+
<div class="label">${escapeHtml(`${model.provider}/${model.id}`)}${state.snapshotState?.model?.id === model.id && state.snapshotState?.model?.provider === model.provider ? " · current" : ""}</div>
|
|
73
|
+
</button>
|
|
74
|
+
`).join("")
|
|
75
|
+
: '<div class="label">Loading available models…</div>'}
|
|
76
|
+
</div>
|
|
77
|
+
</section>
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function renderCommandsSheet() {
|
|
82
|
+
const groups = groupedCommands();
|
|
83
|
+
const categories = sortCommandCategories([...new Set([...groups.keys()])]);
|
|
84
|
+
const activeCategory = selectedCommandCategory(categories);
|
|
85
|
+
const commands = groups.get(activeCategory) || [];
|
|
86
|
+
const emptyLabel = activeCategory ? `${commandCategoryLabel(activeCategory).toLowerCase()} commands` : "commands";
|
|
87
|
+
|
|
88
|
+
return `
|
|
89
|
+
<section class="sheet-section">
|
|
90
|
+
<h3>Commands, skills, prompts</h3>
|
|
91
|
+
<label class="sheet-filter">
|
|
92
|
+
<span class="label">Category</span>
|
|
93
|
+
<select class="sheet-select" data-command-category-select aria-label="Command category">
|
|
94
|
+
${categories.map((category) => `
|
|
95
|
+
<option value="${escapeHtml(category)}" ${category === activeCategory ? "selected" : ""}>${escapeHtml(commandCategoryLabel(category))}</option>
|
|
96
|
+
`).join("")}
|
|
97
|
+
</select>
|
|
98
|
+
</label>
|
|
99
|
+
<div class="sheet-list">
|
|
100
|
+
${commands.length ? commands.map((command) => `
|
|
101
|
+
<button
|
|
102
|
+
class="secondary"
|
|
103
|
+
${command.source === "local"
|
|
104
|
+
? `data-run-local-command="${escapeHtml(command.name)}"`
|
|
105
|
+
: `data-run-command="/${escapeHtml(command.name)}"`}
|
|
106
|
+
>
|
|
107
|
+
<div><strong>${escapeHtml(`/${command.name}`)}</strong></div>
|
|
108
|
+
<div class="label">${escapeHtml(command.description || "No description")}</div>
|
|
109
|
+
</button>
|
|
110
|
+
`).join("") : `<div class="label">No ${escapeHtml(emptyLabel)} available.</div>`}
|
|
111
|
+
</div>
|
|
112
|
+
</section>
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function renderSessionsSheet() {
|
|
117
|
+
return `
|
|
118
|
+
<section class="sheet-section">
|
|
119
|
+
<h3>Sessions for this project</h3>
|
|
120
|
+
<div class="sheet-list">
|
|
121
|
+
${state.sessions.length ? state.sessions.map((session) => `
|
|
122
|
+
<button class="secondary" data-session-path="${escapeHtml(session.path)}">
|
|
123
|
+
<div><strong>${escapeHtml(session.name || session.firstMessage || session.id)}</strong></div>
|
|
124
|
+
<div class="label">${escapeHtml(formatDateTime(session.modified))} · ${escapeHtml(String(session.messageCount))} messages</div>
|
|
125
|
+
<div class="label mono">${escapeHtml(session.path)}</div>
|
|
126
|
+
</button>
|
|
127
|
+
`).join("") : '<div class="label">No sessions found yet for this cwd.</div>'}
|
|
128
|
+
</div>
|
|
129
|
+
</section>
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function sortedActiveSessions() {
|
|
134
|
+
return [...state.activeSessions].sort((left, right) => {
|
|
135
|
+
const leftCurrent = left.id === state.activeSessionId ? 1 : 0;
|
|
136
|
+
const rightCurrent = right.id === state.activeSessionId ? 1 : 0;
|
|
137
|
+
if (leftCurrent !== rightCurrent) return rightCurrent - leftCurrent;
|
|
138
|
+
|
|
139
|
+
const leftLive = left.isStreaming ? 1 : 0;
|
|
140
|
+
const rightLive = right.isStreaming ? 1 : 0;
|
|
141
|
+
if (leftLive !== rightLive) return rightLive - leftLive;
|
|
142
|
+
|
|
143
|
+
const leftLabel = left.label || left.sessionId || left.id;
|
|
144
|
+
const rightLabel = right.label || right.sessionId || right.id;
|
|
145
|
+
return leftLabel.localeCompare(rightLabel);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function renderActiveSessionsSheet() {
|
|
150
|
+
const sessions = sortedActiveSessions();
|
|
151
|
+
const parentSessions = sessions.filter((session) => session.kind === "parent");
|
|
152
|
+
const parallelSessions = sessions.filter((session) => session.kind === "parallel");
|
|
153
|
+
|
|
154
|
+
const renderSessionButton = (session, sectionKind) => {
|
|
155
|
+
const statusBits = [
|
|
156
|
+
session.id === state.activeSessionId ? "current" : "",
|
|
157
|
+
sectionKind === "parent" ? "mirroring cli" : "parallel",
|
|
158
|
+
session.isStreaming ? "live" : "",
|
|
159
|
+
session.hasPendingUiRequest ? "needs input" : "",
|
|
160
|
+
session.model?.name || "",
|
|
161
|
+
Number.isFinite(session.messageCount) ? `${session.messageCount} messages` : "",
|
|
162
|
+
session.secondaryLabel || "",
|
|
163
|
+
].filter(Boolean).join(" · ");
|
|
164
|
+
|
|
165
|
+
const preview = session.lastUserPreview || session.firstUserPreview || "";
|
|
166
|
+
|
|
167
|
+
return `
|
|
168
|
+
<button class="secondary" data-active-session-id="${escapeHtml(session.id)}">
|
|
169
|
+
<div><strong>${escapeHtml(session.label || "Session")}</strong></div>
|
|
170
|
+
${statusBits ? `<div class="label">${escapeHtml(statusBits)}</div>` : ""}
|
|
171
|
+
${preview ? `<div class="label">${escapeHtml(preview)}</div>` : ""}
|
|
172
|
+
</button>
|
|
173
|
+
`;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
return `
|
|
177
|
+
<section class="sheet-section">
|
|
178
|
+
<h3>Parent</h3>
|
|
179
|
+
<div class="button-row compact">
|
|
180
|
+
<button class="secondary" data-sheet-action="new-parent-session">New Parent</button>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="sheet-list">
|
|
183
|
+
${parentSessions.length
|
|
184
|
+
? parentSessions.map((session) => renderSessionButton(session, "parent")).join("")
|
|
185
|
+
: '<div class="label">Parent session unavailable.</div>'}
|
|
186
|
+
</div>
|
|
187
|
+
</section>
|
|
188
|
+
<section class="sheet-section">
|
|
189
|
+
<h3>Parallel</h3>
|
|
190
|
+
<div class="button-row compact">
|
|
191
|
+
<button class="secondary" data-sheet-action="new-parallel-session">New Parallel</button>
|
|
192
|
+
</div>
|
|
193
|
+
<div class="sheet-list">
|
|
194
|
+
${parallelSessions.length
|
|
195
|
+
? parallelSessions.map((session) => renderSessionButton(session, "parallel")).join("")
|
|
196
|
+
: '<div class="label">No parallel sessions yet. Start one with “New Parallel”.</div>'}
|
|
197
|
+
</div>
|
|
198
|
+
</section>
|
|
199
|
+
`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function renderTreeSheet() {
|
|
203
|
+
if (!state.tree) {
|
|
204
|
+
return `
|
|
205
|
+
<section class="sheet-section">
|
|
206
|
+
<h3>Session tree</h3>
|
|
207
|
+
<div class="label">Loading tree…</div>
|
|
208
|
+
</section>
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return `
|
|
213
|
+
<section class="sheet-section">
|
|
214
|
+
<h3>Session tree</h3>
|
|
215
|
+
<div class="label mono">${escapeHtml(state.tree.sessionFile || "")}</div>
|
|
216
|
+
<div class="sheet-list">
|
|
217
|
+
${state.tree.nodes.map((node) => {
|
|
218
|
+
const isCurrent = state.tree.currentLeafId === node.id;
|
|
219
|
+
const onPath = state.tree.currentPathIds.includes(node.id);
|
|
220
|
+
return `
|
|
221
|
+
<div class="sheet-section" style="margin-left:${Math.min(node.depth * 12, 72)}px">
|
|
222
|
+
<div><strong>${escapeHtml(node.summary.kind)}</strong>${node.summary.role ? ` <span class="label">${escapeHtml(node.summary.role)}</span>` : ""}${node.label ? ` <span class="label">#${escapeHtml(node.label)}</span>` : ""}${isCurrent ? ' <span class="label">current</span>' : onPath ? ' <span class="label">path</span>' : ''}</div>
|
|
223
|
+
<div class="label">${escapeHtml(formatDateTime(node.timestamp))}</div>
|
|
224
|
+
<div>${escapeHtml(node.summary.preview || "(empty)")}</div>
|
|
225
|
+
<div class="button-row compact">
|
|
226
|
+
<button class="secondary" data-open-branch-entry="${escapeHtml(node.id)}">Open path</button>
|
|
227
|
+
${node.summary.role === "user" ? `<button class="secondary" data-fork-entry="${escapeHtml(node.id)}">Fork here</button>` : ""}
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
`;
|
|
231
|
+
}).join("")}
|
|
232
|
+
</div>
|
|
233
|
+
</section>
|
|
234
|
+
`;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function renderSheet() {
|
|
238
|
+
if (el.sheetModal.classList.contains("hidden")) return;
|
|
239
|
+
|
|
240
|
+
const titles = {
|
|
241
|
+
actions: "Actions",
|
|
242
|
+
commands: "Commands",
|
|
243
|
+
models: "Models",
|
|
244
|
+
thinking: "Thinking",
|
|
245
|
+
sessions: "Sessions",
|
|
246
|
+
"active-sessions": "Sessions",
|
|
247
|
+
tree: "Tree",
|
|
248
|
+
};
|
|
249
|
+
const nextTitle = titles[state.sheetMode] || "Actions";
|
|
250
|
+
if (el.sheetTitle.textContent !== nextTitle) {
|
|
251
|
+
el.sheetTitle.textContent = nextTitle;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (el.sheetSavedSessionsButton) {
|
|
255
|
+
el.sheetSavedSessionsButton.classList.toggle("hidden", state.sheetMode !== "active-sessions");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const sections = {
|
|
259
|
+
actions: renderActionsSheet() + renderThinkingSheet() + renderModelsSheet(),
|
|
260
|
+
commands: renderCommandsSheet(),
|
|
261
|
+
models: renderModelsSheet() + renderThinkingSheet(),
|
|
262
|
+
thinking: renderThinkingSheet() + renderModelsSheet(),
|
|
263
|
+
sessions: renderSessionsSheet(),
|
|
264
|
+
"active-sessions": renderActiveSessionsSheet(),
|
|
265
|
+
tree: renderTreeSheet(),
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const nextHtml = sections[state.sheetMode] || sections.actions;
|
|
269
|
+
if (el.sheetContent.innerHTML !== nextHtml) {
|
|
270
|
+
el.sheetContent.innerHTML = nextHtml;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { TOKEN_STORAGE_KEY } from "./constants.js";
|
|
2
|
+
|
|
3
|
+
export const state = {
|
|
4
|
+
health: null,
|
|
5
|
+
status: null,
|
|
6
|
+
snapshotState: null,
|
|
7
|
+
snapshotWorkerId: null,
|
|
8
|
+
messages: [],
|
|
9
|
+
commands: [],
|
|
10
|
+
models: [],
|
|
11
|
+
sessions: [],
|
|
12
|
+
activeSessions: [],
|
|
13
|
+
activeSessionId: null,
|
|
14
|
+
tree: null,
|
|
15
|
+
stats: null,
|
|
16
|
+
widgets: new Map(),
|
|
17
|
+
footerStatus: "",
|
|
18
|
+
quota: null,
|
|
19
|
+
quotaRequestId: 0,
|
|
20
|
+
liveAssistant: null,
|
|
21
|
+
liveTools: new Map(),
|
|
22
|
+
followLatest: true,
|
|
23
|
+
lastAutoFollowAt: 0,
|
|
24
|
+
lastAutoFollowHeight: 0,
|
|
25
|
+
ignoreScrollTrackingUntil: 0,
|
|
26
|
+
lastUserScrollIntentAt: 0,
|
|
27
|
+
pendingUiRequest: null,
|
|
28
|
+
socket: null,
|
|
29
|
+
reconnectTimer: null,
|
|
30
|
+
manuallyClosed: false,
|
|
31
|
+
token: localStorage.getItem(TOKEN_STORAGE_KEY) || "",
|
|
32
|
+
sheetMode: "actions",
|
|
33
|
+
commandSheetCategory: "local",
|
|
34
|
+
autocompleteContext: null,
|
|
35
|
+
autocompleteItems: [],
|
|
36
|
+
autocompleteRemoteRequestId: 0,
|
|
37
|
+
autocompleteRemoteTimer: null,
|
|
38
|
+
attachments: [],
|
|
39
|
+
nextAttachmentTokenId: 1,
|
|
40
|
+
lastSheetPointerAction: "",
|
|
41
|
+
lastSheetPointerActionAt: 0,
|
|
42
|
+
toolPanelOpen: new Map(),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const el = {
|
|
46
|
+
abortButton: document.querySelector("#abort-button"),
|
|
47
|
+
actionsButton: document.querySelector("#actions-button"),
|
|
48
|
+
attachImageButton: document.querySelector("#attach-image-button"),
|
|
49
|
+
cdCommandButton: document.querySelector("#cd-command-button"),
|
|
50
|
+
attachmentStrip: document.querySelector("#attachment-strip"),
|
|
51
|
+
banner: document.querySelector("#banner"),
|
|
52
|
+
commandStrip: document.querySelector("#command-strip"),
|
|
53
|
+
composerWrap: document.querySelector(".composer-wrap"),
|
|
54
|
+
connectionPill: document.querySelector("#connection-pill"),
|
|
55
|
+
cwdValue: document.querySelector("#cwd-value"),
|
|
56
|
+
imageInput: document.querySelector("#image-input"),
|
|
57
|
+
insertCommandButton: document.querySelector("#insert-command-button"),
|
|
58
|
+
jumpToLatestButton: document.querySelector("#jump-to-latest-button"),
|
|
59
|
+
loginModal: document.querySelector("#login-modal"),
|
|
60
|
+
messages: document.querySelector("#messages"),
|
|
61
|
+
modelValue: document.querySelector("#model-value"),
|
|
62
|
+
promptInput: document.querySelector("#prompt-input"),
|
|
63
|
+
quotaContext: document.querySelector("#quota-context"),
|
|
64
|
+
quotaCwd: document.querySelector("#quota-cwd"),
|
|
65
|
+
quotaMetaRow: document.querySelector("#quota-meta-row"),
|
|
66
|
+
quotaPillsRow: document.querySelector("#quota-pills-row"),
|
|
67
|
+
quotaPrimary: document.querySelector("#quota-primary"),
|
|
68
|
+
quotaRow: document.querySelector("#quota-row"),
|
|
69
|
+
quotaSecondary: document.querySelector("#quota-secondary"),
|
|
70
|
+
refreshButton: document.querySelector("#refresh-button"),
|
|
71
|
+
sendButton: document.querySelector("#send-button"),
|
|
72
|
+
stopButton: document.querySelector("#stop-button"),
|
|
73
|
+
serverValue: document.querySelector("#server-value"),
|
|
74
|
+
sessionSidebarButton: document.querySelector("#session-sidebar-button"),
|
|
75
|
+
sessionValue: document.querySelector("#session-value"),
|
|
76
|
+
sheetCloseButton: document.querySelector("#sheet-close-button"),
|
|
77
|
+
sheetContent: document.querySelector("#sheet-content"),
|
|
78
|
+
sheetModal: document.querySelector("#sheet-modal"),
|
|
79
|
+
sheetSavedSessionsButton: document.querySelector("#sheet-saved-sessions-button"),
|
|
80
|
+
sheetTitle: document.querySelector("#sheet-title"),
|
|
81
|
+
steerButton: document.querySelector("#steer-button"),
|
|
82
|
+
streamingValue: document.querySelector("#streaming-value"),
|
|
83
|
+
thinkingValue: document.querySelector("#thinking-value"),
|
|
84
|
+
toastHost: document.querySelector("#toast-host"),
|
|
85
|
+
tokenInput: document.querySelector("#token-input"),
|
|
86
|
+
tokenSaveButton: document.querySelector("#token-save-button"),
|
|
87
|
+
treeBrowserButton: document.querySelector("#tree-browser-button"),
|
|
88
|
+
uiModal: document.querySelector("#ui-modal"),
|
|
89
|
+
uiModalButtons: document.querySelector("#ui-modal-buttons"),
|
|
90
|
+
uiModalInput: document.querySelector("#ui-modal-input"),
|
|
91
|
+
uiModalMessage: document.querySelector("#ui-modal-message"),
|
|
92
|
+
uiModalOptions: document.querySelector("#ui-modal-options"),
|
|
93
|
+
uiModalTitle: document.querySelector("#ui-modal-title"),
|
|
94
|
+
widgetStack: document.querySelector("#widget-stack"),
|
|
95
|
+
};
|