@components-kit/open-workbook 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/assets/backend/dist/addin-rpc-client.d.ts +17 -0
- package/assets/backend/dist/addin-rpc-client.d.ts.map +1 -0
- package/assets/backend/dist/addin-rpc-client.js +66 -0
- package/assets/backend/dist/addin-rpc-client.js.map +1 -0
- package/assets/backend/dist/addin-websocket-server.d.ts +13 -0
- package/assets/backend/dist/addin-websocket-server.d.ts.map +1 -0
- package/assets/backend/dist/addin-websocket-server.js +199 -0
- package/assets/backend/dist/addin-websocket-server.js.map +1 -0
- package/assets/backend/dist/file-bridge.d.ts +2 -0
- package/assets/backend/dist/file-bridge.d.ts.map +1 -0
- package/assets/backend/dist/file-bridge.js +15 -0
- package/assets/backend/dist/file-bridge.js.map +1 -0
- package/assets/backend/dist/index.d.ts +4 -0
- package/assets/backend/dist/index.d.ts.map +1 -0
- package/assets/backend/dist/index.js +17 -0
- package/assets/backend/dist/index.js.map +1 -0
- package/assets/backend/dist/native-file-bridge-server.d.ts +28 -0
- package/assets/backend/dist/native-file-bridge-server.d.ts.map +1 -0
- package/assets/backend/dist/native-file-bridge-server.js +496 -0
- package/assets/backend/dist/native-file-bridge-server.js.map +1 -0
- package/assets/backend/dist/native-file-bridge.d.ts +20 -0
- package/assets/backend/dist/native-file-bridge.d.ts.map +1 -0
- package/assets/backend/dist/native-file-bridge.js +140 -0
- package/assets/backend/dist/native-file-bridge.js.map +1 -0
- package/assets/backend/dist/runtime-service.d.ts +3167 -0
- package/assets/backend/dist/runtime-service.d.ts.map +1 -0
- package/assets/backend/dist/runtime-service.js +6003 -0
- package/assets/backend/dist/runtime-service.js.map +1 -0
- package/assets/backend/dist/session-registry.d.ts +20 -0
- package/assets/backend/dist/session-registry.d.ts.map +1 -0
- package/assets/backend/dist/session-registry.js +53 -0
- package/assets/backend/dist/session-registry.js.map +1 -0
- package/assets/backend/dist/state-store.d.ts +26 -0
- package/assets/backend/dist/state-store.d.ts.map +1 -0
- package/assets/backend/dist/state-store.js +44 -0
- package/assets/backend/dist/state-store.js.map +1 -0
- package/assets/excel-addin/dist/connection.d.ts +26 -0
- package/assets/excel-addin/dist/connection.d.ts.map +1 -0
- package/assets/excel-addin/dist/connection.js +320 -0
- package/assets/excel-addin/dist/connection.js.map +1 -0
- package/assets/excel-addin/dist/excel-executor.d.ts +225 -0
- package/assets/excel-addin/dist/excel-executor.d.ts.map +1 -0
- package/assets/excel-addin/dist/excel-executor.js +2487 -0
- package/assets/excel-addin/dist/excel-executor.js.map +1 -0
- package/assets/excel-addin/dist/taskpane.d.ts +2 -0
- package/assets/excel-addin/dist/taskpane.d.ts.map +1 -0
- package/assets/excel-addin/dist/taskpane.js +28 -0
- package/assets/excel-addin/dist/taskpane.js.map +1 -0
- package/assets/excel-addin/manifest.xml +93 -0
- package/assets/excel-addin/public/taskpane.css +47 -0
- package/assets/excel-addin/public/taskpane.html +35 -0
- package/assets/excel-addin/scripts/dev-server.mjs +128 -0
- package/assets/instructions/open-workbook-excel/SKILL.md +52 -0
- package/assets/instructions/open-workbook-excel/references/multi-agent.md +43 -0
- package/assets/instructions/open-workbook-excel/references/performance.md +41 -0
- package/assets/instructions/open-workbook-excel/references/reliability.md +76 -0
- package/assets/instructions/open-workbook-excel/references/tool-selection.md +82 -0
- package/assets/instructions/open-workbook-excel/references/workflows.md +93 -0
- package/assets/mcp-server/dist/catalog.d.ts +5 -0
- package/assets/mcp-server/dist/catalog.d.ts.map +1 -0
- package/assets/mcp-server/dist/catalog.js +8 -0
- package/assets/mcp-server/dist/catalog.js.map +1 -0
- package/assets/mcp-server/dist/index.d.ts +3 -0
- package/assets/mcp-server/dist/index.d.ts.map +1 -0
- package/assets/mcp-server/dist/index.js +3779 -0
- package/assets/mcp-server/dist/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +721 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access, mkdir } from "node:fs/promises";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { runtimeError } from "@components-kit/open-workbook-protocol";
|
|
7
|
+
export function startNativeFileBridgeServer(options) {
|
|
8
|
+
const route = options.path ?? "/v1/workbook-file";
|
|
9
|
+
const shutdownPath = options.shutdownPath ?? "/shutdown";
|
|
10
|
+
const adapter = options.adapter ?? createPlatformNativeHostBridgeAdapter();
|
|
11
|
+
let handle;
|
|
12
|
+
const server = createServer((request, response) => {
|
|
13
|
+
if (request.method === "GET" && request.url === "/status") {
|
|
14
|
+
sendJson(response, 200, {
|
|
15
|
+
ok: true,
|
|
16
|
+
bridge: "open-workbook-native-file-bridge",
|
|
17
|
+
route,
|
|
18
|
+
adapter: adapter.getStatus()
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (request.method === "POST" && request.url === shutdownPath) {
|
|
23
|
+
sendJson(response, 200, { ok: true });
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
void handle?.close();
|
|
26
|
+
}, 25);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (request.method === "POST" && request.url === route) {
|
|
30
|
+
void handleWorkbookFileBridgeHttpRequest(request, response, adapter);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
sendJson(response, 404, { ok: false, error: "not_found" });
|
|
34
|
+
});
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
server.once("error", reject);
|
|
37
|
+
server.listen(options.port, options.host, () => {
|
|
38
|
+
server.off("error", reject);
|
|
39
|
+
const address = server.address();
|
|
40
|
+
const port = typeof address === "object" && address !== null ? address.port : options.port;
|
|
41
|
+
handle = {
|
|
42
|
+
url: `http://${options.host}:${port}`,
|
|
43
|
+
route,
|
|
44
|
+
close: async () => {
|
|
45
|
+
await new Promise((closeResolve) => server.close(() => closeResolve()));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
resolve(handle);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export async function handleWorkbookFileBridgeRequest(request, adapter) {
|
|
53
|
+
const validationError = validateBridgeRequest(request);
|
|
54
|
+
if (validationError) {
|
|
55
|
+
return bridgeError(request, validationError);
|
|
56
|
+
}
|
|
57
|
+
switch (request.operation) {
|
|
58
|
+
case "workbook.save_as":
|
|
59
|
+
return adapter.saveAs(request);
|
|
60
|
+
case "workbook.export_copy":
|
|
61
|
+
return adapter.exportCopy ? adapter.exportCopy(request) : bridgeError(request, "Native export_copy is not implemented by this bridge adapter.");
|
|
62
|
+
case "workbook.restore_file_backup":
|
|
63
|
+
return adapter.restoreFileBackup ? adapter.restoreFileBackup(request) : bridgeError(request, "Native restore_file_backup is not implemented by this bridge adapter.");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function createPlatformNativeHostBridgeAdapter(platform = process.platform, execute = executeNativeCommand) {
|
|
67
|
+
return {
|
|
68
|
+
getStatus: () => ({
|
|
69
|
+
platform,
|
|
70
|
+
saveAsSupported: platform === "darwin" || platform === "win32",
|
|
71
|
+
exportCopySupported: platform === "darwin" || platform === "win32",
|
|
72
|
+
restoreFileBackupSupported: platform === "darwin" || platform === "win32",
|
|
73
|
+
operations: {
|
|
74
|
+
"workbook.save_as": platform === "darwin" || platform === "win32",
|
|
75
|
+
"workbook.export_copy": platform === "darwin" || platform === "win32",
|
|
76
|
+
"workbook.restore_file_backup": platform === "darwin" || platform === "win32"
|
|
77
|
+
},
|
|
78
|
+
allowedDirs: allowedTargetDirectories()
|
|
79
|
+
}),
|
|
80
|
+
saveAs: async (request) => {
|
|
81
|
+
const prepared = await prepareTargetFileRequest(request, "workbook.save_as");
|
|
82
|
+
if (!prepared.ok) {
|
|
83
|
+
return prepared.response;
|
|
84
|
+
}
|
|
85
|
+
if (platform === "darwin") {
|
|
86
|
+
return saveAsWithAppleScript(prepared.request, execute);
|
|
87
|
+
}
|
|
88
|
+
if (platform === "win32") {
|
|
89
|
+
return saveAsWithPowerShell(prepared.request, execute);
|
|
90
|
+
}
|
|
91
|
+
return bridgeError(request, `Native Save As is not supported on ${platform}.`);
|
|
92
|
+
},
|
|
93
|
+
exportCopy: async (request) => {
|
|
94
|
+
const prepared = await prepareTargetFileRequest(request, "workbook.export_copy");
|
|
95
|
+
if (!prepared.ok) {
|
|
96
|
+
return prepared.response;
|
|
97
|
+
}
|
|
98
|
+
if (platform === "darwin") {
|
|
99
|
+
return saveCopyAsWithAppleScript(prepared.request, execute);
|
|
100
|
+
}
|
|
101
|
+
if (platform === "win32") {
|
|
102
|
+
return saveCopyAsWithPowerShell(prepared.request, execute);
|
|
103
|
+
}
|
|
104
|
+
return bridgeError(request, `Native Export Copy is not supported on ${platform}.`);
|
|
105
|
+
},
|
|
106
|
+
restoreFileBackup: async (request) => {
|
|
107
|
+
const prepared = await prepareRestoreFileRequest(request);
|
|
108
|
+
if (!prepared.ok) {
|
|
109
|
+
return prepared.response;
|
|
110
|
+
}
|
|
111
|
+
if (platform === "darwin") {
|
|
112
|
+
return restoreFileBackupWithAppleScript(prepared.request, execute);
|
|
113
|
+
}
|
|
114
|
+
if (platform === "win32") {
|
|
115
|
+
return restoreFileBackupWithPowerShell(prepared.request, execute);
|
|
116
|
+
}
|
|
117
|
+
return bridgeError(request, `Native Restore File Backup is not supported on ${platform}.`);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function handleWorkbookFileBridgeHttpRequest(request, response, adapter) {
|
|
122
|
+
try {
|
|
123
|
+
const payload = await readJsonBody(request, 1024 * 1024);
|
|
124
|
+
const result = await handleWorkbookFileBridgeRequest(payload, adapter);
|
|
125
|
+
sendJson(response, 200, result);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
sendJson(response, 400, {
|
|
129
|
+
ok: false,
|
|
130
|
+
error: error instanceof Error ? error.message : String(error)
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function prepareTargetFileRequest(request, operation) {
|
|
135
|
+
if (!request.targetPath) {
|
|
136
|
+
return { ok: false, response: bridgeError(request, `targetPath is required for ${operation}.`) };
|
|
137
|
+
}
|
|
138
|
+
const resolvedTargetPath = path.resolve(request.targetPath);
|
|
139
|
+
const pathError = validateTargetPath(resolvedTargetPath);
|
|
140
|
+
if (pathError) {
|
|
141
|
+
return { ok: false, response: bridgeError(request, pathError) };
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
await mkdir(path.dirname(resolvedTargetPath), { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
response: bridgeError(request, `Failed to create target directory for ${operation}: ${error instanceof Error ? error.message : String(error)}`)
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
ok: true,
|
|
154
|
+
request: {
|
|
155
|
+
...request,
|
|
156
|
+
targetPath: resolvedTargetPath
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function prepareRestoreFileRequest(request) {
|
|
161
|
+
const backupPath = request.backupPath ?? request.targetPath;
|
|
162
|
+
if (!backupPath) {
|
|
163
|
+
return { ok: false, response: bridgeError(request, "backupPath or targetPath is required for workbook.restore_file_backup.") };
|
|
164
|
+
}
|
|
165
|
+
const restoreMode = request.restoreMode ?? "open-as-new";
|
|
166
|
+
if (restoreMode === "restore-into-open-workbook") {
|
|
167
|
+
return { ok: false, response: bridgeError(request, "restore-into-open-workbook is not supported by the native bridge. Use open-as-new or replace-open-workbook.") };
|
|
168
|
+
}
|
|
169
|
+
const resolvedBackupPath = path.resolve(backupPath);
|
|
170
|
+
const backupPathError = validateTargetPath(resolvedBackupPath);
|
|
171
|
+
if (backupPathError) {
|
|
172
|
+
return { ok: false, response: bridgeError(request, backupPathError.replace("targetPath", "backupPath")) };
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
await access(resolvedBackupPath);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return { ok: false, response: bridgeError(request, `Backup file does not exist: ${resolvedBackupPath}`) };
|
|
179
|
+
}
|
|
180
|
+
const prepared = {
|
|
181
|
+
...request,
|
|
182
|
+
backupPath: resolvedBackupPath,
|
|
183
|
+
targetPath: resolvedBackupPath,
|
|
184
|
+
restoreMode
|
|
185
|
+
};
|
|
186
|
+
if (request.restoreTargetPath !== undefined) {
|
|
187
|
+
const resolvedRestoreTargetPath = path.resolve(request.restoreTargetPath);
|
|
188
|
+
const targetPathError = validateTargetPath(resolvedRestoreTargetPath);
|
|
189
|
+
if (targetPathError) {
|
|
190
|
+
return { ok: false, response: bridgeError(request, targetPathError.replace("targetPath", "restoreTargetPath")) };
|
|
191
|
+
}
|
|
192
|
+
prepared.restoreTargetPath = resolvedRestoreTargetPath;
|
|
193
|
+
}
|
|
194
|
+
return { ok: true, request: prepared };
|
|
195
|
+
}
|
|
196
|
+
async function saveAsWithAppleScript(request, execute) {
|
|
197
|
+
const script = `
|
|
198
|
+
on run argv
|
|
199
|
+
set workbookName to item 1 of argv
|
|
200
|
+
set targetPath to item 2 of argv
|
|
201
|
+
tell application "Microsoft Excel"
|
|
202
|
+
if it is not running then error "Microsoft Excel is not running"
|
|
203
|
+
set targetWorkbook to missing value
|
|
204
|
+
repeat with candidateWorkbook in workbooks
|
|
205
|
+
if (name of candidateWorkbook as string) is workbookName or (full name of candidateWorkbook as string) is workbookName then
|
|
206
|
+
set targetWorkbook to candidateWorkbook
|
|
207
|
+
exit repeat
|
|
208
|
+
end if
|
|
209
|
+
end repeat
|
|
210
|
+
if targetWorkbook is missing value then error "Workbook not found: " & workbookName
|
|
211
|
+
save workbook as targetWorkbook filename targetPath
|
|
212
|
+
end tell
|
|
213
|
+
end run
|
|
214
|
+
`;
|
|
215
|
+
return nativeSaveAsResult(request, await execute("osascript", ["-e", script, request.workbookId, request.targetPath]));
|
|
216
|
+
}
|
|
217
|
+
async function saveAsWithPowerShell(request, execute) {
|
|
218
|
+
const script = `
|
|
219
|
+
$workbookName = $args[0]
|
|
220
|
+
$targetPath = $args[1]
|
|
221
|
+
$excel = [Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
|
|
222
|
+
$targetWorkbook = $null
|
|
223
|
+
foreach ($workbook in $excel.Workbooks) {
|
|
224
|
+
if ($workbook.Name -eq $workbookName -or $workbook.FullName -eq $workbookName) {
|
|
225
|
+
$targetWorkbook = $workbook
|
|
226
|
+
break
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if ($null -eq $targetWorkbook) {
|
|
230
|
+
throw "Workbook not found: $workbookName"
|
|
231
|
+
}
|
|
232
|
+
$targetWorkbook.SaveAs($targetPath)
|
|
233
|
+
`;
|
|
234
|
+
return nativeSaveAsResult(request, await execute("powershell.exe", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script, request.workbookId, request.targetPath]));
|
|
235
|
+
}
|
|
236
|
+
async function saveCopyAsWithAppleScript(request, execute) {
|
|
237
|
+
const script = `
|
|
238
|
+
on run argv
|
|
239
|
+
set workbookName to item 1 of argv
|
|
240
|
+
set targetPath to item 2 of argv
|
|
241
|
+
tell application "Microsoft Excel"
|
|
242
|
+
if it is not running then error "Microsoft Excel is not running"
|
|
243
|
+
set targetWorkbook to missing value
|
|
244
|
+
repeat with candidateWorkbook in workbooks
|
|
245
|
+
if (name of candidateWorkbook as string) is workbookName or (full name of candidateWorkbook as string) is workbookName then
|
|
246
|
+
set targetWorkbook to candidateWorkbook
|
|
247
|
+
exit repeat
|
|
248
|
+
end if
|
|
249
|
+
end repeat
|
|
250
|
+
if targetWorkbook is missing value then error "Workbook not found: " & workbookName
|
|
251
|
+
activate object targetWorkbook
|
|
252
|
+
do Visual Basic "ActiveWorkbook.SaveCopyAs " & quote & my escapeForVbaString(targetPath) & quote
|
|
253
|
+
end tell
|
|
254
|
+
end run
|
|
255
|
+
|
|
256
|
+
on escapeForVbaString(valueText)
|
|
257
|
+
set oldDelimiters to AppleScript's text item delimiters
|
|
258
|
+
set AppleScript's text item delimiters to quote
|
|
259
|
+
set valueParts to text items of valueText
|
|
260
|
+
set AppleScript's text item delimiters to quote & quote
|
|
261
|
+
set escapedText to valueParts as text
|
|
262
|
+
set AppleScript's text item delimiters to oldDelimiters
|
|
263
|
+
return escapedText
|
|
264
|
+
end escapeForVbaString
|
|
265
|
+
`;
|
|
266
|
+
return nativeSaveAsResult(request, await execute("osascript", ["-e", script, request.workbookId, request.targetPath]));
|
|
267
|
+
}
|
|
268
|
+
async function saveCopyAsWithPowerShell(request, execute) {
|
|
269
|
+
const script = `
|
|
270
|
+
$workbookName = $args[0]
|
|
271
|
+
$targetPath = $args[1]
|
|
272
|
+
$excel = [Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
|
|
273
|
+
$targetWorkbook = $null
|
|
274
|
+
foreach ($workbook in $excel.Workbooks) {
|
|
275
|
+
if ($workbook.Name -eq $workbookName -or $workbook.FullName -eq $workbookName) {
|
|
276
|
+
$targetWorkbook = $workbook
|
|
277
|
+
break
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if ($null -eq $targetWorkbook) {
|
|
281
|
+
throw "Workbook not found: $workbookName"
|
|
282
|
+
}
|
|
283
|
+
$targetWorkbook.SaveCopyAs($targetPath)
|
|
284
|
+
`;
|
|
285
|
+
return nativeSaveAsResult(request, await execute("powershell.exe", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script, request.workbookId, request.targetPath]));
|
|
286
|
+
}
|
|
287
|
+
async function restoreFileBackupWithAppleScript(request, execute) {
|
|
288
|
+
const script = `
|
|
289
|
+
on run argv
|
|
290
|
+
set workbookName to item 1 of argv
|
|
291
|
+
set backupPath to item 2 of argv
|
|
292
|
+
set restoreMode to item 3 of argv
|
|
293
|
+
set explicitTargetPath to item 4 of argv
|
|
294
|
+
tell application "Microsoft Excel"
|
|
295
|
+
if it is not running then error "Microsoft Excel is not running"
|
|
296
|
+
if restoreMode is "open-as-new" then
|
|
297
|
+
open workbook workbook file name backupPath
|
|
298
|
+
return backupPath
|
|
299
|
+
end if
|
|
300
|
+
if restoreMode is not "replace-open-workbook" then error "Unsupported restore mode: " & restoreMode
|
|
301
|
+
set targetWorkbook to missing value
|
|
302
|
+
repeat with candidateWorkbook in workbooks
|
|
303
|
+
if (name of candidateWorkbook as string) is workbookName or (full name of candidateWorkbook as string) is workbookName then
|
|
304
|
+
set targetWorkbook to candidateWorkbook
|
|
305
|
+
exit repeat
|
|
306
|
+
end if
|
|
307
|
+
end repeat
|
|
308
|
+
if targetWorkbook is missing value then error "Workbook not found: " & workbookName
|
|
309
|
+
if explicitTargetPath is "" then
|
|
310
|
+
set restoreTargetPath to full name of targetWorkbook as string
|
|
311
|
+
else
|
|
312
|
+
set restoreTargetPath to explicitTargetPath
|
|
313
|
+
end if
|
|
314
|
+
close targetWorkbook saving no
|
|
315
|
+
do shell script "/bin/cp -f " & quoted form of backupPath & " " & quoted form of restoreTargetPath
|
|
316
|
+
open workbook workbook file name restoreTargetPath
|
|
317
|
+
return restoreTargetPath
|
|
318
|
+
end tell
|
|
319
|
+
end run
|
|
320
|
+
`;
|
|
321
|
+
return nativeRestoreResult(request, await execute("osascript", ["-e", script, request.workbookId, request.backupPath, request.restoreMode, request.restoreTargetPath ?? ""]));
|
|
322
|
+
}
|
|
323
|
+
async function restoreFileBackupWithPowerShell(request, execute) {
|
|
324
|
+
const script = `
|
|
325
|
+
$workbookName = $args[0]
|
|
326
|
+
$backupPath = $args[1]
|
|
327
|
+
$restoreMode = $args[2]
|
|
328
|
+
$explicitTargetPath = $args[3]
|
|
329
|
+
$excel = [Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
|
|
330
|
+
if ($restoreMode -eq "open-as-new") {
|
|
331
|
+
$excel.Workbooks.Open($backupPath) | Out-Null
|
|
332
|
+
Write-Output $backupPath
|
|
333
|
+
exit 0
|
|
334
|
+
}
|
|
335
|
+
if ($restoreMode -ne "replace-open-workbook") {
|
|
336
|
+
throw "Unsupported restore mode: $restoreMode"
|
|
337
|
+
}
|
|
338
|
+
$targetWorkbook = $null
|
|
339
|
+
foreach ($workbook in $excel.Workbooks) {
|
|
340
|
+
if ($workbook.Name -eq $workbookName -or $workbook.FullName -eq $workbookName) {
|
|
341
|
+
$targetWorkbook = $workbook
|
|
342
|
+
break
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if ($null -eq $targetWorkbook) {
|
|
346
|
+
throw "Workbook not found: $workbookName"
|
|
347
|
+
}
|
|
348
|
+
if ([string]::IsNullOrWhiteSpace($explicitTargetPath)) {
|
|
349
|
+
$restoreTargetPath = $targetWorkbook.FullName
|
|
350
|
+
} else {
|
|
351
|
+
$restoreTargetPath = $explicitTargetPath
|
|
352
|
+
}
|
|
353
|
+
$targetWorkbook.Close($false)
|
|
354
|
+
Copy-Item -LiteralPath $backupPath -Destination $restoreTargetPath -Force
|
|
355
|
+
$excel.Workbooks.Open($restoreTargetPath) | Out-Null
|
|
356
|
+
Write-Output $restoreTargetPath
|
|
357
|
+
`;
|
|
358
|
+
return nativeRestoreResult(request, await execute("powershell.exe", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script, request.workbookId, request.backupPath, request.restoreMode, request.restoreTargetPath ?? ""]));
|
|
359
|
+
}
|
|
360
|
+
function nativeSaveAsResult(request, result) {
|
|
361
|
+
if (result.code === 0) {
|
|
362
|
+
return {
|
|
363
|
+
ok: true,
|
|
364
|
+
operation: request.operation,
|
|
365
|
+
workbookId: request.workbookId,
|
|
366
|
+
targetPath: request.targetPath,
|
|
367
|
+
...(request.sourceBackupId !== undefined ? { sourceBackupId: request.sourceBackupId } : {}),
|
|
368
|
+
filePath: request.targetPath,
|
|
369
|
+
metadata: {
|
|
370
|
+
stdout: result.stdout.trim()
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
return bridgeError(request, result.stderr.trim() || result.stdout.trim() || `Native command exited with code ${result.code}.`);
|
|
375
|
+
}
|
|
376
|
+
function nativeRestoreResult(request, result) {
|
|
377
|
+
if (result.code === 0) {
|
|
378
|
+
const restoredPath = result.stdout.trim() || request.restoreTargetPath || request.backupPath || request.targetPath;
|
|
379
|
+
const response = {
|
|
380
|
+
ok: true,
|
|
381
|
+
operation: request.operation,
|
|
382
|
+
workbookId: request.workbookId,
|
|
383
|
+
...(request.targetPath !== undefined ? { targetPath: request.targetPath } : {}),
|
|
384
|
+
...(request.backupPath !== undefined ? { backupPath: request.backupPath } : {}),
|
|
385
|
+
...(request.restoreTargetPath !== undefined ? { restoreTargetPath: request.restoreTargetPath } : {}),
|
|
386
|
+
...(request.restoreMode !== undefined ? { restoreMode: request.restoreMode } : {}),
|
|
387
|
+
...(request.sourceBackupId !== undefined ? { sourceBackupId: request.sourceBackupId } : {}),
|
|
388
|
+
metadata: {
|
|
389
|
+
stdout: result.stdout.trim()
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
if (restoredPath !== undefined) {
|
|
393
|
+
response.filePath = restoredPath;
|
|
394
|
+
}
|
|
395
|
+
return response;
|
|
396
|
+
}
|
|
397
|
+
return bridgeError(request, result.stderr.trim() || result.stdout.trim() || `Native command exited with code ${result.code}.`);
|
|
398
|
+
}
|
|
399
|
+
function validateBridgeRequest(request) {
|
|
400
|
+
if (!request || typeof request !== "object") {
|
|
401
|
+
return "Bridge request must be a JSON object.";
|
|
402
|
+
}
|
|
403
|
+
if (request.operation !== "workbook.save_as" && request.operation !== "workbook.export_copy" && request.operation !== "workbook.restore_file_backup") {
|
|
404
|
+
return "Unsupported workbook file bridge operation.";
|
|
405
|
+
}
|
|
406
|
+
if (!request.workbookId || typeof request.workbookId !== "string") {
|
|
407
|
+
return "workbookId is required.";
|
|
408
|
+
}
|
|
409
|
+
return undefined;
|
|
410
|
+
}
|
|
411
|
+
function validateTargetPath(targetPath) {
|
|
412
|
+
const resolved = path.resolve(targetPath);
|
|
413
|
+
const allowedDirs = allowedTargetDirectories();
|
|
414
|
+
if (allowedDirs.length === 0) {
|
|
415
|
+
return undefined;
|
|
416
|
+
}
|
|
417
|
+
if (allowedDirs.some((directory) => isPathWithin(resolved, directory))) {
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
return `targetPath is outside allowed bridge directories: ${allowedDirs.join(", ")}`;
|
|
421
|
+
}
|
|
422
|
+
function allowedTargetDirectories() {
|
|
423
|
+
const raw = process.env.OPEN_WORKBOOK_FILE_BRIDGE_ALLOWED_DIRS;
|
|
424
|
+
if (!raw) {
|
|
425
|
+
return [];
|
|
426
|
+
}
|
|
427
|
+
return raw
|
|
428
|
+
.split(path.delimiter)
|
|
429
|
+
.map((entry) => path.resolve(entry.replace(/^~(?=$|\/|\\)/, homedir())))
|
|
430
|
+
.filter(Boolean);
|
|
431
|
+
}
|
|
432
|
+
function isPathWithin(targetPath, directory) {
|
|
433
|
+
const relative = path.relative(directory, targetPath);
|
|
434
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
435
|
+
}
|
|
436
|
+
function bridgeError(request, message) {
|
|
437
|
+
return {
|
|
438
|
+
ok: false,
|
|
439
|
+
operation: request.operation ?? "workbook.save_as",
|
|
440
|
+
workbookId: (request.workbookId ?? "unknown"),
|
|
441
|
+
...(request.targetPath !== undefined ? { targetPath: request.targetPath } : {}),
|
|
442
|
+
...(request.backupPath !== undefined ? { backupPath: request.backupPath } : {}),
|
|
443
|
+
...(request.restoreTargetPath !== undefined ? { restoreTargetPath: request.restoreTargetPath } : {}),
|
|
444
|
+
...(request.restoreMode !== undefined ? { restoreMode: request.restoreMode } : {}),
|
|
445
|
+
...(request.sourceBackupId !== undefined ? { sourceBackupId: request.sourceBackupId } : {}),
|
|
446
|
+
error: runtimeError("OPERATION_FAILED", message, { retryable: false }).message
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
function readJsonBody(request, maxBytes) {
|
|
450
|
+
return new Promise((resolve, reject) => {
|
|
451
|
+
const chunks = [];
|
|
452
|
+
let bytes = 0;
|
|
453
|
+
request.on("data", (chunk) => {
|
|
454
|
+
bytes += chunk.length;
|
|
455
|
+
if (bytes > maxBytes) {
|
|
456
|
+
reject(new Error("Bridge request body is too large."));
|
|
457
|
+
request.destroy();
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
chunks.push(chunk);
|
|
461
|
+
});
|
|
462
|
+
request.on("end", () => {
|
|
463
|
+
try {
|
|
464
|
+
resolve(JSON.parse(Buffer.concat(chunks).toString("utf8")));
|
|
465
|
+
}
|
|
466
|
+
catch {
|
|
467
|
+
reject(new Error("Bridge request body must be valid JSON."));
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
request.on("error", reject);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
function sendJson(response, status, payload) {
|
|
474
|
+
response.writeHead(status, { "content-type": "application/json" });
|
|
475
|
+
response.end(JSON.stringify(payload));
|
|
476
|
+
}
|
|
477
|
+
function executeNativeCommand(command, args) {
|
|
478
|
+
return new Promise((resolve) => {
|
|
479
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
480
|
+
const stdout = [];
|
|
481
|
+
const stderr = [];
|
|
482
|
+
child.stdout.on("data", (chunk) => stdout.push(chunk));
|
|
483
|
+
child.stderr.on("data", (chunk) => stderr.push(chunk));
|
|
484
|
+
child.on("error", (error) => {
|
|
485
|
+
resolve({ code: 1, stdout: "", stderr: error.message });
|
|
486
|
+
});
|
|
487
|
+
child.on("close", (code) => {
|
|
488
|
+
resolve({
|
|
489
|
+
code: code ?? 1,
|
|
490
|
+
stdout: Buffer.concat(stdout).toString("utf8"),
|
|
491
|
+
stderr: Buffer.concat(stderr).toString("utf8")
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=native-file-bridge-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-file-bridge-server.js","sourceRoot":"","sources":["../src/native-file-bridge-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WorkbookFileBridgeRequest, WorkbookFileBridgeResponse, WorkbookFileBridgeStatus } from "@components-kit/open-workbook-protocol";
|
|
2
|
+
export interface NativeFileBridgeOptions {
|
|
3
|
+
url?: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
fetchImpl?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export declare class NativeFileBridge {
|
|
9
|
+
private readonly url;
|
|
10
|
+
private readonly path;
|
|
11
|
+
private readonly timeoutMs;
|
|
12
|
+
private readonly fetchImpl;
|
|
13
|
+
constructor(options?: NativeFileBridgeOptions);
|
|
14
|
+
getStatus(): WorkbookFileBridgeStatus;
|
|
15
|
+
probeStatus(): Promise<WorkbookFileBridgeStatus>;
|
|
16
|
+
request(input: WorkbookFileBridgeRequest): Promise<WorkbookFileBridgeResponse>;
|
|
17
|
+
private operationUrl;
|
|
18
|
+
private statusUrl;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=native-file-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-file-bridge.d.ts","sourceRoot":"","sources":["../src/native-file-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACzB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;gBAEzC,OAAO,GAAE,uBAA4B;IAOjD,SAAS,IAAI,wBAAwB;IAe/B,WAAW,IAAI,OAAO,CAAC,wBAAwB,CAAC;IA+ChD,OAAO,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA0DpF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,SAAS;CAIlB"}
|