@trusty-squire/mcp 1.1.35-rc.1 → 1.1.35
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/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +19 -9
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/file-picker-route.d.ts +8 -0
- package/dist/bot/file-picker-route.d.ts.map +1 -0
- package/dist/bot/file-picker-route.js +94 -0
- package/dist/bot/file-picker-route.js.map +1 -0
- package/dist/bot/upload-error.d.ts +1 -1
- package/dist/bot/upload-error.d.ts.map +1 -1
- package/dist/bot/upload-error.js +4 -1
- package/dist/bot/upload-error.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
export interface FilePickerRoute {
|
|
3
|
+
restore(): Promise<{
|
|
4
|
+
pickerCalled: boolean;
|
|
5
|
+
}>;
|
|
6
|
+
}
|
|
7
|
+
export declare function routeFilePickerToChooser(page: Page): Promise<FilePickerRoute>;
|
|
8
|
+
//# sourceMappingURL=file-picker-route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker-route.d.ts","sourceRoot":"","sources":["../../src/bot/file-picker-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,YAAY,CAAC;AAgG9C,MAAM,WAAW,eAAe;IAE9B,OAAO,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/C;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAwBnF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Some upload controls call window.showOpenFilePicker (File System Access API)
|
|
2
|
+
// instead of clicking an <input type=file>. Chromium opens that picker without
|
|
3
|
+
// a file input, so Playwright never emits "filechooser" and the upload times
|
|
4
|
+
// out. MEASURED 2026-10-14 on Dreamina's "Add first frame" card: one trusted
|
|
5
|
+
// click calls showOpenFilePicker with user activation and nothing else.
|
|
6
|
+
//
|
|
7
|
+
// While an upload is armed, replace showOpenFilePicker in each frame with a
|
|
8
|
+
// version that clicks a detached file input instead. The click still runs
|
|
9
|
+
// inside the page's activated call, so the existing chooser interception
|
|
10
|
+
// receives it, and the page gets back handles whose getFile() returns the
|
|
11
|
+
// attached file. The original function is put back once the chooser wait ends.
|
|
12
|
+
const ROUTE_KEY = "trusty-squire.file-picker-route";
|
|
13
|
+
function installRoute(key) {
|
|
14
|
+
const w = window;
|
|
15
|
+
const slot = Symbol.for(key);
|
|
16
|
+
const original = w.showOpenFilePicker;
|
|
17
|
+
if (typeof original !== "function" || w[slot] !== undefined)
|
|
18
|
+
return false;
|
|
19
|
+
const state = { original, calls: 0 };
|
|
20
|
+
Object.defineProperty(w, slot, { value: state, configurable: true });
|
|
21
|
+
w.showOpenFilePicker = function showOpenFilePicker(options) {
|
|
22
|
+
state.calls += 1;
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const input = document.createElement("input");
|
|
25
|
+
input.type = "file";
|
|
26
|
+
input.multiple = options?.multiple === true;
|
|
27
|
+
input.accept = (options?.types ?? [])
|
|
28
|
+
.flatMap((type) => Object.entries(type?.accept ?? {}))
|
|
29
|
+
.flatMap(([mime, extensions]) => [mime, ...[].concat(extensions)])
|
|
30
|
+
.join(",");
|
|
31
|
+
const abort = () => reject(new DOMException("The user aborted a request.", "AbortError"));
|
|
32
|
+
input.addEventListener("cancel", abort, { once: true });
|
|
33
|
+
input.addEventListener("change", () => {
|
|
34
|
+
const files = Array.from(input.files ?? []);
|
|
35
|
+
if (files.length === 0)
|
|
36
|
+
return abort();
|
|
37
|
+
resolve(files.map((file) => {
|
|
38
|
+
const handle = Object.create(FileSystemFileHandle.prototype);
|
|
39
|
+
Object.defineProperties(handle, {
|
|
40
|
+
kind: { value: "file" },
|
|
41
|
+
name: { value: file.name },
|
|
42
|
+
getFile: { value: async () => file },
|
|
43
|
+
});
|
|
44
|
+
return handle;
|
|
45
|
+
}));
|
|
46
|
+
}, { once: true });
|
|
47
|
+
input.click();
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
function removeRoute(key) {
|
|
53
|
+
const w = window;
|
|
54
|
+
const slot = Symbol.for(key);
|
|
55
|
+
const state = w[slot];
|
|
56
|
+
if (state === undefined)
|
|
57
|
+
return 0;
|
|
58
|
+
w.showOpenFilePicker = state.original;
|
|
59
|
+
delete w[slot];
|
|
60
|
+
return state.calls;
|
|
61
|
+
}
|
|
62
|
+
// Patchright runs frame.evaluate in an isolated world unless the third argument
|
|
63
|
+
// is false, and the page's own showOpenFilePicker lives in the main world.
|
|
64
|
+
// Playwright rejects a third argument and already evaluates in the main world.
|
|
65
|
+
async function evaluateInMainWorld(frame, fn, key) {
|
|
66
|
+
const evaluate = frame.evaluate;
|
|
67
|
+
try {
|
|
68
|
+
return await evaluate.call(frame, fn, key, false);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof Error && error.message.startsWith("Too many arguments"))
|
|
72
|
+
return await frame.evaluate(fn, key);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function routeFilePickerToChooser(page) {
|
|
77
|
+
let frames = [];
|
|
78
|
+
try {
|
|
79
|
+
frames = page.frames();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// A page without frames has no picker to route.
|
|
83
|
+
}
|
|
84
|
+
const routed = (await Promise.all(frames.map(async (frame) => (await evaluateInMainWorld(frame, installRoute, ROUTE_KEY).catch(() => false))
|
|
85
|
+
? frame
|
|
86
|
+
: null))).filter((frame) => frame !== null);
|
|
87
|
+
return {
|
|
88
|
+
async restore() {
|
|
89
|
+
const calls = await Promise.all(routed.map((frame) => evaluateInMainWorld(frame, removeRoute, ROUTE_KEY).catch(() => 0)));
|
|
90
|
+
return { pickerCalled: calls.some((count) => count > 0) };
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file-picker-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker-route.js","sourceRoot":"","sources":["../../src/bot/file-picker-route.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const UPLOAD_PHASES: readonly ["file_validation", "chooser_wait", "file_write", "post_upload"];
|
|
2
|
-
export declare const UPLOAD_CAUSES: readonly ["file_unavailable", "chooser_timeout", "chooser_failed", "file_write_failed", "cancelled", "post_upload_failed"];
|
|
2
|
+
export declare const UPLOAD_CAUSES: readonly ["file_unavailable", "chooser_timeout", "chooser_failed", "file_picker_unrouted", "file_write_failed", "cancelled", "post_upload_failed"];
|
|
3
3
|
export interface UploadFailure {
|
|
4
4
|
phase: (typeof UPLOAD_PHASES)[number];
|
|
5
5
|
cause: (typeof UPLOAD_CAUSES)[number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-error.d.ts","sourceRoot":"","sources":["../../src/bot/upload-error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,2EAKhB,CAAC;AACX,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"upload-error.d.ts","sourceRoot":"","sources":["../../src/bot/upload-error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,2EAKhB,CAAC;AACX,eAAO,MAAM,aAAa,oJAQhB,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;CACvC;AAID,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;gBAEpB,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;CAUzE"}
|
package/dist/bot/upload-error.js
CHANGED
|
@@ -8,6 +8,7 @@ export const UPLOAD_CAUSES = [
|
|
|
8
8
|
"file_unavailable",
|
|
9
9
|
"chooser_timeout",
|
|
10
10
|
"chooser_failed",
|
|
11
|
+
"file_picker_unrouted",
|
|
11
12
|
"file_write_failed",
|
|
12
13
|
"cancelled",
|
|
13
14
|
"post_upload_failed",
|
|
@@ -19,7 +20,9 @@ export class UploadError extends Error {
|
|
|
19
20
|
constructor(phase, cause) {
|
|
20
21
|
super(cause === "chooser_timeout"
|
|
21
22
|
? "upload: did not open a file picker within 15s"
|
|
22
|
-
:
|
|
23
|
+
: cause === "file_picker_unrouted"
|
|
24
|
+
? "upload: the page called showOpenFilePicker, but no file chooser opened within 15s"
|
|
25
|
+
: `upload: ${cause}`);
|
|
23
26
|
this.failure = { phase, cause };
|
|
24
27
|
}
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-error.js","sourceRoot":"","sources":["../../src/bot/upload-error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB;IACjB,cAAc;IACd,YAAY;IACZ,aAAa;CACL,CAAC;AACX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;IACnB,WAAW;IACX,oBAAoB;CACZ,CAAC;AAOX,6EAA6E;AAC7E,4EAA4E;AAC5E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,OAAO,CAAgB;IAEhC,YAAY,KAA6B,EAAE,KAA6B;QACtE,KAAK,CACH,KAAK,KAAK,iBAAiB;YACzB,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,WAAW,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"upload-error.js","sourceRoot":"","sources":["../../src/bot/upload-error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB;IACjB,cAAc;IACd,YAAY;IACZ,aAAa;CACL,CAAC;AACX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB;IACnB,WAAW;IACX,oBAAoB;CACZ,CAAC;AAOX,6EAA6E;AAC7E,4EAA4E;AAC5E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,OAAO,CAAgB;IAEhC,YAAY,KAA6B,EAAE,KAA6B;QACtE,KAAK,CACH,KAAK,KAAK,iBAAiB;YACzB,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,KAAK,KAAK,sBAAsB;gBAChC,CAAC,CAAC,mFAAmF;gBACrF,CAAC,CAAC,WAAW,KAAK,EAAE,CACzB,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;CACF"}
|