@duckmind/dm-darwin-x64 0.32.9 → 0.33.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.
Files changed (95) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +14 -65
  3. package/extensions/dm-9router-ext/README.md +142 -0
  4. package/extensions/dm-9router-ext/package.json +45 -0
  5. package/extensions/dm-9router-ext/src/index.ts +541 -0
  6. package/extensions/dm-9router-ext/tsconfig.json +17 -0
  7. package/extensions/dm-subagents/package-lock.json +3 -3
  8. package/extensions/dm-tasks/node_modules/.package-lock.json +3 -3
  9. package/extensions/dm-tasks/node_modules/typebox/build/type/script/mapping.d.mts +2 -2
  10. package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.d.mts +2 -2
  11. package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.mjs +2 -2
  12. package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.d.mts +1 -1
  13. package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.mjs +1 -1
  14. package/extensions/dm-tasks/node_modules/typebox/build/type/types/record.d.mts +1 -1
  15. package/extensions/dm-tasks/node_modules/typebox/package.json +1 -1
  16. package/extensions/dm-tasks/package-lock.json +3 -3
  17. package/package.json +1 -1
  18. package/theme/theme-alps.json +93 -0
  19. package/extensions/dm-chime/README.md +0 -11
  20. package/extensions/dm-chime/docs/protocols.md +0 -107
  21. package/extensions/dm-chime/index.ts +0 -205
  22. package/extensions/dm-chime/package.json +0 -33
  23. package/extensions/dm-phone/README.md +0 -24
  24. package/extensions/dm-phone/index.ts +0 -12
  25. package/extensions/dm-phone/node_modules/.package-lock.json +0 -29
  26. package/extensions/dm-phone/node_modules/ws/LICENSE +0 -20
  27. package/extensions/dm-phone/node_modules/ws/README.md +0 -548
  28. package/extensions/dm-phone/node_modules/ws/browser.js +0 -8
  29. package/extensions/dm-phone/node_modules/ws/index.js +0 -22
  30. package/extensions/dm-phone/node_modules/ws/lib/buffer-util.js +0 -131
  31. package/extensions/dm-phone/node_modules/ws/lib/constants.js +0 -19
  32. package/extensions/dm-phone/node_modules/ws/lib/event-target.js +0 -292
  33. package/extensions/dm-phone/node_modules/ws/lib/extension.js +0 -203
  34. package/extensions/dm-phone/node_modules/ws/lib/limiter.js +0 -55
  35. package/extensions/dm-phone/node_modules/ws/lib/permessage-deflate.js +0 -528
  36. package/extensions/dm-phone/node_modules/ws/lib/receiver.js +0 -760
  37. package/extensions/dm-phone/node_modules/ws/lib/sender.js +0 -607
  38. package/extensions/dm-phone/node_modules/ws/lib/stream.js +0 -161
  39. package/extensions/dm-phone/node_modules/ws/lib/subprotocol.js +0 -62
  40. package/extensions/dm-phone/node_modules/ws/lib/validation.js +0 -152
  41. package/extensions/dm-phone/node_modules/ws/lib/websocket-server.js +0 -562
  42. package/extensions/dm-phone/node_modules/ws/lib/websocket.js +0 -1407
  43. package/extensions/dm-phone/node_modules/ws/package.json +0 -70
  44. package/extensions/dm-phone/node_modules/ws/wrapper.mjs +0 -21
  45. package/extensions/dm-phone/package-lock.json +0 -66
  46. package/extensions/dm-phone/package.json +0 -35
  47. package/extensions/dm-phone/phone-session-pool.ts +0 -8
  48. package/extensions/dm-phone/public/app/attachments.js +0 -233
  49. package/extensions/dm-phone/public/app/autocomplete-controller.js +0 -81
  50. package/extensions/dm-phone/public/app/autocomplete.js +0 -135
  51. package/extensions/dm-phone/public/app/bindings.js +0 -178
  52. package/extensions/dm-phone/public/app/command-catalog.js +0 -76
  53. package/extensions/dm-phone/public/app/commands.js +0 -376
  54. package/extensions/dm-phone/public/app/constants.js +0 -60
  55. package/extensions/dm-phone/public/app/formatters.js +0 -131
  56. package/extensions/dm-phone/public/app/handlers.js +0 -442
  57. package/extensions/dm-phone/public/app/main.js +0 -6
  58. package/extensions/dm-phone/public/app/markdown.js +0 -105
  59. package/extensions/dm-phone/public/app/messages.js +0 -418
  60. package/extensions/dm-phone/public/app/sheet-actions.js +0 -113
  61. package/extensions/dm-phone/public/app/sheet-navigation.js +0 -19
  62. package/extensions/dm-phone/public/app/sheets-view.js +0 -287
  63. package/extensions/dm-phone/public/app/state.js +0 -95
  64. package/extensions/dm-phone/public/app/tool-rendering.js +0 -562
  65. package/extensions/dm-phone/public/app/transport.js +0 -176
  66. package/extensions/dm-phone/public/app/ui.js +0 -417
  67. package/extensions/dm-phone/public/app.js +0 -1
  68. package/extensions/dm-phone/public/icon.svg +0 -15
  69. package/extensions/dm-phone/public/index.html +0 -146
  70. package/extensions/dm-phone/public/manifest.webmanifest +0 -17
  71. package/extensions/dm-phone/public/styles.css +0 -1139
  72. package/extensions/dm-phone/public/sw.js +0 -78
  73. package/extensions/dm-phone/src/extension/duckmind-models.js +0 -264
  74. package/extensions/dm-phone/src/extension/phone-args.ts +0 -121
  75. package/extensions/dm-phone/src/extension/phone-paths.ts +0 -250
  76. package/extensions/dm-phone/src/extension/phone-quota.ts +0 -188
  77. package/extensions/dm-phone/src/extension/phone-runtime.ts +0 -154
  78. package/extensions/dm-phone/src/extension/phone-server-runtime.ts +0 -1217
  79. package/extensions/dm-phone/src/extension/phone-sessions.ts +0 -139
  80. package/extensions/dm-phone/src/extension/phone-static.ts +0 -30
  81. package/extensions/dm-phone/src/extension/phone-tailscale.ts +0 -148
  82. package/extensions/dm-phone/src/extension/phone-theme.ts +0 -85
  83. package/extensions/dm-phone/src/extension/register-phone-child-extension.ts +0 -112
  84. package/extensions/dm-phone/src/extension/register-phone-extension.ts +0 -106
  85. package/extensions/dm-phone/src/extension/types.ts +0 -73
  86. package/extensions/dm-phone/src/session-pool/parent-session-worker.ts +0 -882
  87. package/extensions/dm-phone/src/session-pool/session-pool.ts +0 -470
  88. package/extensions/dm-phone/src/session-pool/session-worker.ts +0 -739
  89. package/extensions/dm-phone/src/session-pool/types.ts +0 -111
  90. package/extensions/dm-phone/src/session-pool/utils.ts +0 -23
  91. package/extensions/dm-phone/test/duckmind-models.test.js +0 -147
  92. package/extensions/dm-thinking-timer/LICENSE +0 -21
  93. package/extensions/dm-thinking-timer/README.md +0 -7
  94. package/extensions/dm-thinking-timer/package.json +0 -20
  95. package/extensions/dm-thinking-timer/thinking-timer.ts +0 -250
@@ -1,287 +0,0 @@
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 isCurrentModelOption(model) {
64
- const current = state.snapshotState?.model;
65
- if (!model || !current || typeof current !== "object") return false;
66
-
67
- const currentProvider = typeof current.provider === "string" ? current.provider : "";
68
- const currentId = typeof current.id === "string" ? current.id : "";
69
- const actualProvider = typeof model.actualProvider === "string" ? model.actualProvider : model.provider;
70
- const actualModelId = typeof model.actualModelId === "string" ? model.actualModelId : model.id;
71
-
72
- return (
73
- (currentProvider === actualProvider && currentId === actualModelId)
74
- || (currentProvider === model.provider && currentId === model.id)
75
- );
76
- }
77
-
78
- function renderModelsSheet() {
79
- return `
80
- <section class="sheet-section">
81
- <h3>Models</h3>
82
- <div class="model-list">
83
- ${state.models.length
84
- ? state.models.map((model) => `
85
- <button class="secondary" data-model-provider="${escapeHtml(model.provider)}" data-model-id="${escapeHtml(model.id)}">
86
- <div><strong>${escapeHtml(model.name || model.id)}</strong></div>
87
- <div class="label">${isCurrentModelOption(model) ? "Current model" : "Tap to switch"}</div>
88
- </button>
89
- `).join("")
90
- : '<div class="label">Loading available models…</div>'}
91
- </div>
92
- </section>
93
- `;
94
- }
95
-
96
- function renderCommandsSheet() {
97
- const groups = groupedCommands();
98
- const categories = sortCommandCategories([...new Set([...groups.keys()])]);
99
- const activeCategory = selectedCommandCategory(categories);
100
- const commands = groups.get(activeCategory) || [];
101
- const emptyLabel = activeCategory ? `${commandCategoryLabel(activeCategory).toLowerCase()} commands` : "commands";
102
-
103
- return `
104
- <section class="sheet-section">
105
- <h3>Commands, skills, prompts</h3>
106
- <label class="sheet-filter">
107
- <span class="label">Category</span>
108
- <select class="sheet-select" data-command-category-select aria-label="Command category">
109
- ${categories.map((category) => `
110
- <option value="${escapeHtml(category)}" ${category === activeCategory ? "selected" : ""}>${escapeHtml(commandCategoryLabel(category))}</option>
111
- `).join("")}
112
- </select>
113
- </label>
114
- <div class="sheet-list">
115
- ${commands.length ? commands.map((command) => `
116
- <button
117
- class="secondary"
118
- ${command.source === "local"
119
- ? `data-run-local-command="${escapeHtml(command.name)}"`
120
- : `data-run-command="/${escapeHtml(command.name)}"`}
121
- >
122
- <div><strong>${escapeHtml(`/${command.name}`)}</strong></div>
123
- <div class="label">${escapeHtml(command.description || "No description")}</div>
124
- </button>
125
- `).join("") : `<div class="label">No ${escapeHtml(emptyLabel)} available.</div>`}
126
- </div>
127
- </section>
128
- `;
129
- }
130
-
131
- function renderSessionsSheet() {
132
- return `
133
- <section class="sheet-section">
134
- <h3>Sessions for this project</h3>
135
- <div class="sheet-list">
136
- ${state.sessions.length ? state.sessions.map((session) => `
137
- <button class="secondary" data-session-path="${escapeHtml(session.path)}">
138
- <div><strong>${escapeHtml(session.name || session.firstMessage || session.id)}</strong></div>
139
- <div class="label">${escapeHtml(formatDateTime(session.modified))} · ${escapeHtml(String(session.messageCount))} messages</div>
140
- <div class="label mono">${escapeHtml(session.path)}</div>
141
- </button>
142
- `).join("") : '<div class="label">No sessions found yet for this cwd.</div>'}
143
- </div>
144
- </section>
145
- `;
146
- }
147
-
148
- function sortedActiveSessions() {
149
- return [...state.activeSessions].sort((left, right) => {
150
- const leftCurrent = left.id === state.activeSessionId ? 1 : 0;
151
- const rightCurrent = right.id === state.activeSessionId ? 1 : 0;
152
- if (leftCurrent !== rightCurrent) return rightCurrent - leftCurrent;
153
-
154
- const leftLive = left.isStreaming ? 1 : 0;
155
- const rightLive = right.isStreaming ? 1 : 0;
156
- if (leftLive !== rightLive) return rightLive - leftLive;
157
-
158
- const leftLabel = left.label || left.sessionId || left.id;
159
- const rightLabel = right.label || right.sessionId || right.id;
160
- return leftLabel.localeCompare(rightLabel);
161
- });
162
- }
163
-
164
- function renderActiveSessionsSheet() {
165
- const sessions = sortedActiveSessions();
166
- const parentSessions = sessions.filter((session) => session.kind === "parent");
167
- const parallelSessions = sessions.filter((session) => session.kind === "parallel");
168
-
169
- const renderSessionButton = (session, sectionKind) => {
170
- const statusBits = [
171
- session.id === state.activeSessionId ? "current" : "",
172
- sectionKind === "parent" ? "mirroring cli" : "parallel",
173
- session.isStreaming ? "live" : "",
174
- session.hasPendingUiRequest ? "needs input" : "",
175
- session.model?.name || "",
176
- Number.isFinite(session.messageCount) ? `${session.messageCount} messages` : "",
177
- session.secondaryLabel || "",
178
- ].filter(Boolean).join(" · ");
179
-
180
- const preview = session.lastUserPreview || session.firstUserPreview || "";
181
-
182
- return `
183
- <button class="secondary" data-active-session-id="${escapeHtml(session.id)}">
184
- <div><strong>${escapeHtml(session.label || "Session")}</strong></div>
185
- ${statusBits ? `<div class="label">${escapeHtml(statusBits)}</div>` : ""}
186
- ${preview ? `<div class="label">${escapeHtml(preview)}</div>` : ""}
187
- </button>
188
- `;
189
- };
190
-
191
- return `
192
- <section class="sheet-section">
193
- <h3>Parent</h3>
194
- <div class="button-row compact">
195
- <button class="secondary" data-sheet-action="new-parent-session">New Parent</button>
196
- </div>
197
- <div class="sheet-list">
198
- ${parentSessions.length
199
- ? parentSessions.map((session) => renderSessionButton(session, "parent")).join("")
200
- : '<div class="label">Parent session unavailable.</div>'}
201
- </div>
202
- </section>
203
- <section class="sheet-section">
204
- <h3>Parallel</h3>
205
- <div class="button-row compact">
206
- <button class="secondary" data-sheet-action="new-parallel-session">New Parallel</button>
207
- </div>
208
- <div class="sheet-list">
209
- ${parallelSessions.length
210
- ? parallelSessions.map((session) => renderSessionButton(session, "parallel")).join("")
211
- : '<div class="label">No parallel sessions yet. Start one with “New Parallel”.</div>'}
212
- </div>
213
- </section>
214
- `;
215
- }
216
-
217
- function renderTreeSheet() {
218
- if (!state.tree) {
219
- return `
220
- <section class="sheet-section">
221
- <h3>Session tree</h3>
222
- <div class="label">Loading tree…</div>
223
- </section>
224
- `;
225
- }
226
-
227
- return `
228
- <section class="sheet-section">
229
- <h3>Session tree</h3>
230
- <div class="label mono">${escapeHtml(state.tree.sessionFile || "")}</div>
231
- <div class="sheet-list">
232
- ${state.tree.nodes.map((node) => {
233
- const isCurrent = state.tree.currentLeafId === node.id;
234
- const onPath = state.tree.currentPathIds.includes(node.id);
235
- return `
236
- <div class="sheet-section" style="margin-left:${Math.min(node.depth * 12, 72)}px">
237
- <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>
238
- <div class="label">${escapeHtml(formatDateTime(node.timestamp))}</div>
239
- <div>${escapeHtml(node.summary.preview || "(empty)")}</div>
240
- <div class="button-row compact">
241
- <button class="secondary" data-open-branch-entry="${escapeHtml(node.id)}">Open path</button>
242
- ${node.summary.role === "user" ? `<button class="secondary" data-fork-entry="${escapeHtml(node.id)}">Fork here</button>` : ""}
243
- </div>
244
- </div>
245
- `;
246
- }).join("")}
247
- </div>
248
- </section>
249
- `;
250
- }
251
-
252
- export function renderSheet() {
253
- if (el.sheetModal.classList.contains("hidden")) return;
254
-
255
- const titles = {
256
- actions: "Actions",
257
- commands: "Commands",
258
- models: "Models",
259
- thinking: "Thinking",
260
- sessions: "Sessions",
261
- "active-sessions": "Sessions",
262
- tree: "Tree",
263
- };
264
- const nextTitle = titles[state.sheetMode] || "Actions";
265
- if (el.sheetTitle.textContent !== nextTitle) {
266
- el.sheetTitle.textContent = nextTitle;
267
- }
268
-
269
- if (el.sheetSavedSessionsButton) {
270
- el.sheetSavedSessionsButton.classList.toggle("hidden", state.sheetMode !== "active-sessions");
271
- }
272
-
273
- const sections = {
274
- actions: renderActionsSheet() + renderThinkingSheet() + renderModelsSheet(),
275
- commands: renderCommandsSheet(),
276
- models: renderModelsSheet() + renderThinkingSheet(),
277
- thinking: renderThinkingSheet() + renderModelsSheet(),
278
- sessions: renderSessionsSheet(),
279
- "active-sessions": renderActiveSessionsSheet(),
280
- tree: renderTreeSheet(),
281
- };
282
-
283
- const nextHtml = sections[state.sheetMode] || sections.actions;
284
- if (el.sheetContent.innerHTML !== nextHtml) {
285
- el.sheetContent.innerHTML = nextHtml;
286
- }
287
- }
@@ -1,95 +0,0 @@
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
- };