@wonderwhy-er/desktop-commander 0.2.36 → 0.2.38
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/README.md +240 -100
- package/dist/command-manager.js +6 -3
- package/dist/config-field-definitions.d.ts +41 -0
- package/dist/config-field-definitions.js +37 -0
- package/dist/config-manager.d.ts +2 -0
- package/dist/config-manager.js +22 -2
- package/dist/handlers/filesystem-handlers.js +6 -11
- package/dist/handlers/macos-control-handlers.d.ts +16 -0
- package/dist/handlers/macos-control-handlers.js +81 -0
- package/dist/lib.d.ts +10 -0
- package/dist/lib.js +10 -0
- package/dist/remote-device/remote-channel.d.ts +8 -3
- package/dist/remote-device/remote-channel.js +68 -21
- package/dist/search-manager.d.ts +13 -0
- package/dist/search-manager.js +146 -0
- package/dist/server.js +29 -1
- package/dist/test-docx.d.ts +1 -0
- package/dist/tools/config.d.ts +71 -0
- package/dist/tools/config.js +117 -2
- package/dist/tools/docx/builders/table.d.ts +2 -0
- package/dist/tools/docx/builders/table.js +60 -16
- package/dist/tools/docx/dom.d.ts +74 -1
- package/dist/tools/docx/dom.js +221 -1
- package/dist/tools/docx/index.d.ts +2 -2
- package/dist/tools/docx/ops/index.js +3 -0
- package/dist/tools/docx/ops/replace-paragraph-text-exact.d.ts +15 -3
- package/dist/tools/docx/ops/replace-paragraph-text-exact.js +25 -10
- package/dist/tools/docx/ops/replace-table-cell-text.d.ts +25 -0
- package/dist/tools/docx/ops/replace-table-cell-text.js +85 -0
- package/dist/tools/docx/ops/set-color-for-paragraph-exact.d.ts +2 -1
- package/dist/tools/docx/ops/set-color-for-paragraph-exact.js +9 -8
- package/dist/tools/docx/ops/set-color-for-style.d.ts +4 -0
- package/dist/tools/docx/ops/set-color-for-style.js +11 -7
- package/dist/tools/docx/ops/table-set-cell-text.js +8 -40
- package/dist/tools/docx/read.d.ts +2 -2
- package/dist/tools/docx/read.js +137 -17
- package/dist/tools/docx/types.d.ts +32 -3
- package/dist/tools/docx/xml-view-test.d.ts +1 -0
- package/dist/tools/docx/xml-view-test.js +63 -0
- package/dist/tools/docx/xml-view.d.ts +56 -0
- package/dist/tools/docx/xml-view.js +169 -0
- package/dist/tools/edit.js +57 -27
- package/dist/tools/macos-control/ax-adapter.d.ts +55 -0
- package/dist/tools/macos-control/ax-adapter.js +438 -0
- package/dist/tools/macos-control/cdp-adapter.d.ts +23 -0
- package/dist/tools/macos-control/cdp-adapter.js +402 -0
- package/dist/tools/macos-control/orchestrator.d.ts +77 -0
- package/dist/tools/macos-control/orchestrator.js +136 -0
- package/dist/tools/macos-control/role-aliases.d.ts +5 -0
- package/dist/tools/macos-control/role-aliases.js +34 -0
- package/dist/tools/macos-control/types.d.ts +129 -0
- package/dist/tools/macos-control/types.js +1 -0
- package/dist/tools/schemas.d.ts +3 -0
- package/dist/tools/schemas.js +2 -1
- package/dist/types.d.ts +0 -1
- package/dist/ui/config-editor/config-editor-runtime.js +14181 -0
- package/dist/ui/config-editor/index.html +13 -0
- package/dist/ui/config-editor/src/app.d.ts +43 -0
- package/dist/ui/config-editor/src/app.js +840 -0
- package/dist/ui/config-editor/src/array-modal.d.ts +19 -0
- package/dist/ui/config-editor/src/array-modal.js +185 -0
- package/dist/ui/config-editor/src/main.d.ts +1 -0
- package/dist/ui/config-editor/src/main.js +2 -0
- package/dist/ui/config-editor/styles.css +586 -0
- package/dist/ui/file-preview/preview-runtime.js +13337 -752
- package/dist/ui/file-preview/shared/preview-file-types.js +3 -1
- package/dist/ui/file-preview/src/app.d.ts +5 -1
- package/dist/ui/file-preview/src/app.js +114 -200
- package/dist/ui/file-preview/src/components/html-renderer.d.ts +1 -5
- package/dist/ui/file-preview/src/components/html-renderer.js +11 -27
- package/dist/ui/file-preview/styles.css +117 -83
- package/dist/ui/resources.d.ts +7 -0
- package/dist/ui/resources.js +16 -2
- package/dist/ui/shared/compact-row.d.ts +11 -0
- package/dist/ui/shared/compact-row.js +18 -0
- package/dist/ui/shared/host-context.d.ts +15 -0
- package/dist/ui/shared/host-context.js +51 -0
- package/dist/ui/shared/tool-bridge.d.ts +30 -0
- package/dist/ui/shared/tool-bridge.js +137 -0
- package/dist/ui/shared/tool-shell.d.ts +9 -0
- package/dist/ui/shared/tool-shell.js +46 -4
- package/dist/ui/shared/ui-event-tracker.d.ts +9 -0
- package/dist/ui/shared/ui-event-tracker.js +27 -0
- package/dist/utils/capture.js +173 -11
- package/dist/utils/files/base.d.ts +3 -1
- package/dist/utils/files/docx.d.ts +28 -15
- package/dist/utils/files/docx.js +622 -88
- package/dist/utils/files/factory.d.ts +6 -5
- package/dist/utils/files/factory.js +18 -6
- package/dist/utils/system-info.js +1 -1
- package/dist/utils/usageTracker.js +5 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ArrayModalEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
label?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
value: unknown;
|
|
6
|
+
}
|
|
7
|
+
interface CreateArrayModalControllerOptions {
|
|
8
|
+
container: HTMLElement;
|
|
9
|
+
parseEntryItems: (entry: ArrayModalEntry) => string[];
|
|
10
|
+
formatEntryTitle: (entry: ArrayModalEntry) => string;
|
|
11
|
+
onSave: (entryKey: string, items: string[]) => void | Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface ArrayModalController {
|
|
14
|
+
open: (entry: ArrayModalEntry) => void;
|
|
15
|
+
close: () => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function renderArrayModalMarkup(initialTitle: string): string;
|
|
18
|
+
export declare function createArrayModalController(options: CreateArrayModalControllerOptions): ArrayModalController;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { escapeHtml } from '../../shared/escape-html.js';
|
|
2
|
+
export function renderArrayModalMarkup(initialTitle) {
|
|
3
|
+
return `
|
|
4
|
+
<div class="array-modal" id="array-modal" hidden>
|
|
5
|
+
<div class="array-modal-card">
|
|
6
|
+
<header>
|
|
7
|
+
<h3 id="array-modal-title">${escapeHtml(initialTitle)}</h3>
|
|
8
|
+
<div class="array-modal-actions">
|
|
9
|
+
<button type="button" id="array-modal-save" aria-label="Save list changes">
|
|
10
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M5 13l4 4L19 7"></path></svg>
|
|
11
|
+
</button>
|
|
12
|
+
<button type="button" id="array-modal-close" aria-label="Close list editor">
|
|
13
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M7 7l10 10M17 7L7 17"></path></svg>
|
|
14
|
+
</button>
|
|
15
|
+
</div>
|
|
16
|
+
</header>
|
|
17
|
+
<p class="array-modal-description" id="array-modal-description"></p>
|
|
18
|
+
<p class="array-modal-hint">Type an item, then press Enter (or click away) to add it. A new empty row appears automatically.</p>
|
|
19
|
+
<p class="array-modal-error hidden" id="array-modal-error" role="status" aria-live="polite"></p>
|
|
20
|
+
<div class="array-modal-list" id="array-modal-list"></div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
`;
|
|
24
|
+
}
|
|
25
|
+
export function createArrayModalController(options) {
|
|
26
|
+
const { container, parseEntryItems, formatEntryTitle, onSave } = options;
|
|
27
|
+
const modal = container.querySelector('#array-modal');
|
|
28
|
+
const modalList = container.querySelector('#array-modal-list');
|
|
29
|
+
const modalTitleElement = container.querySelector('#array-modal-title');
|
|
30
|
+
const modalDescriptionElement = container.querySelector('#array-modal-description');
|
|
31
|
+
const modalErrorElement = container.querySelector('#array-modal-error');
|
|
32
|
+
const modalClose = container.querySelector('#array-modal-close');
|
|
33
|
+
const modalSave = container.querySelector('#array-modal-save');
|
|
34
|
+
let modalEntryKey = null;
|
|
35
|
+
let modalItems = [];
|
|
36
|
+
const clearError = () => {
|
|
37
|
+
if (!modalErrorElement) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
modalErrorElement.textContent = '';
|
|
41
|
+
modalErrorElement.classList.add('hidden');
|
|
42
|
+
};
|
|
43
|
+
const showError = (message) => {
|
|
44
|
+
if (!modalErrorElement) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
modalErrorElement.textContent = message;
|
|
48
|
+
modalErrorElement.classList.remove('hidden');
|
|
49
|
+
};
|
|
50
|
+
const collectModalItemsFromDom = () => {
|
|
51
|
+
if (!modalList) {
|
|
52
|
+
return [...modalItems];
|
|
53
|
+
}
|
|
54
|
+
const existing = Array.from(modalList.querySelectorAll('.array-modal-item-input'))
|
|
55
|
+
.map((input) => input.value.trim())
|
|
56
|
+
.filter((value) => value.length > 0);
|
|
57
|
+
const newInput = modalList.querySelector('#array-modal-new-item');
|
|
58
|
+
const newValue = newInput?.value.trim() ?? '';
|
|
59
|
+
if (newValue.length > 0) {
|
|
60
|
+
return [newValue, ...existing];
|
|
61
|
+
}
|
|
62
|
+
return existing;
|
|
63
|
+
};
|
|
64
|
+
const renderModalList = () => {
|
|
65
|
+
if (!modalList) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
modalList.innerHTML = `
|
|
69
|
+
<div class="array-modal-row array-modal-row--new">
|
|
70
|
+
<input id="array-modal-new-item" type="text" placeholder="Add item" aria-label="Add new item" />
|
|
71
|
+
</div>
|
|
72
|
+
${modalItems.map((item, index) => `
|
|
73
|
+
<div class="array-modal-row" data-modal-index="${index}">
|
|
74
|
+
<input class="array-modal-item-input" type="text" value="${escapeHtml(item)}" aria-label="Item ${index + 1}" />
|
|
75
|
+
<button type="button" class="array-modal-item-remove" aria-label="Remove item ${index + 1}">
|
|
76
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M3 6h18M8 6V4h8v2M6 6l1 14h10l1-14M10 10v7M14 10v7"></path></svg>
|
|
77
|
+
</button>
|
|
78
|
+
</div>
|
|
79
|
+
`).join('')}
|
|
80
|
+
`;
|
|
81
|
+
const addModalItem = (value) => {
|
|
82
|
+
const normalized = value.trim();
|
|
83
|
+
if (!normalized) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const exists = modalItems.some((item) => item.trim() === normalized);
|
|
87
|
+
if (!exists) {
|
|
88
|
+
modalItems.unshift(normalized);
|
|
89
|
+
}
|
|
90
|
+
renderModalList();
|
|
91
|
+
};
|
|
92
|
+
const newInput = modalList.querySelector('#array-modal-new-item');
|
|
93
|
+
newInput?.addEventListener('blur', () => {
|
|
94
|
+
const value = newInput.value.trim();
|
|
95
|
+
if (!value) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
addModalItem(value);
|
|
99
|
+
const refreshedNewInput = modalList.querySelector('#array-modal-new-item');
|
|
100
|
+
refreshedNewInput?.focus();
|
|
101
|
+
});
|
|
102
|
+
newInput?.addEventListener('keydown', (event) => {
|
|
103
|
+
if (event.key !== 'Enter') {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
event.preventDefault();
|
|
107
|
+
const value = newInput.value.trim();
|
|
108
|
+
if (!value) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
addModalItem(value);
|
|
112
|
+
const refreshedNewInput = modalList.querySelector('#array-modal-new-item');
|
|
113
|
+
refreshedNewInput?.focus();
|
|
114
|
+
});
|
|
115
|
+
modalList.querySelectorAll('.array-modal-row[data-modal-index]').forEach((rowElement) => {
|
|
116
|
+
const row = rowElement;
|
|
117
|
+
const index = Number(row.dataset.modalIndex);
|
|
118
|
+
const input = row.querySelector('.array-modal-item-input');
|
|
119
|
+
const removeButton = row.querySelector('.array-modal-item-remove');
|
|
120
|
+
input?.addEventListener('blur', () => {
|
|
121
|
+
modalItems[index] = input.value.trim();
|
|
122
|
+
modalItems = modalItems.filter((item) => item.length > 0);
|
|
123
|
+
renderModalList();
|
|
124
|
+
});
|
|
125
|
+
removeButton?.addEventListener('click', () => {
|
|
126
|
+
modalItems = modalItems.filter((_, itemIndex) => itemIndex !== index);
|
|
127
|
+
renderModalList();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const close = () => {
|
|
132
|
+
if (modal) {
|
|
133
|
+
modal.hidden = true;
|
|
134
|
+
}
|
|
135
|
+
modalEntryKey = null;
|
|
136
|
+
clearError();
|
|
137
|
+
};
|
|
138
|
+
const open = (entry) => {
|
|
139
|
+
modalEntryKey = entry.key;
|
|
140
|
+
modalItems = parseEntryItems(entry);
|
|
141
|
+
clearError();
|
|
142
|
+
if (modalTitleElement) {
|
|
143
|
+
modalTitleElement.textContent = formatEntryTitle(entry);
|
|
144
|
+
}
|
|
145
|
+
if (modalDescriptionElement) {
|
|
146
|
+
modalDescriptionElement.textContent = entry.description ?? '';
|
|
147
|
+
modalDescriptionElement.classList.toggle('hidden', !modalDescriptionElement.textContent.trim());
|
|
148
|
+
}
|
|
149
|
+
renderModalList();
|
|
150
|
+
if (modal) {
|
|
151
|
+
modal.hidden = false;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
modalClose?.addEventListener('click', close);
|
|
155
|
+
modal?.addEventListener('click', (event) => {
|
|
156
|
+
if (event.target === modal) {
|
|
157
|
+
close();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
modalSave?.addEventListener('click', async () => {
|
|
161
|
+
if (!modalEntryKey) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const changedKey = modalEntryKey;
|
|
165
|
+
modalItems = collectModalItemsFromDom();
|
|
166
|
+
clearError();
|
|
167
|
+
if (modalSave) {
|
|
168
|
+
modalSave.disabled = true;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
await onSave(changedKey, modalItems);
|
|
172
|
+
close();
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
176
|
+
showError(message.trim().length > 0 ? message : 'Failed to save list changes.');
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
if (modalSave) {
|
|
180
|
+
modalSave.disabled = false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return { open, close };
|
|
185
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|