auto-webmcp 0.3.11 → 0.3.13
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/auto-webmcp.cjs.js +87 -14
- package/dist/auto-webmcp.cjs.js.map +2 -2
- package/dist/auto-webmcp.esm.js +87 -14
- package/dist/auto-webmcp.esm.js.map +2 -2
- package/dist/auto-webmcp.iife.js +1 -1
- package/dist/auto-webmcp.iife.js.map +3 -3
- package/dist/discovery.d.ts.map +1 -1
- package/dist/interceptor.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/auto-webmcp.cjs.js
CHANGED
|
@@ -1331,6 +1331,14 @@ function fillAriaField(el, value) {
|
|
|
1331
1331
|
return;
|
|
1332
1332
|
}
|
|
1333
1333
|
const htmlEl = el;
|
|
1334
|
+
console.log("[auto-webmcp] fillAriaField", {
|
|
1335
|
+
tag: el.tagName,
|
|
1336
|
+
role,
|
|
1337
|
+
isContentEditable: htmlEl.isContentEditable,
|
|
1338
|
+
id: el.id,
|
|
1339
|
+
ariaLabel: el.getAttribute("aria-label"),
|
|
1340
|
+
textContentBefore: (htmlEl.textContent ?? "").slice(0, 80)
|
|
1341
|
+
});
|
|
1334
1342
|
if (htmlEl.isContentEditable) {
|
|
1335
1343
|
htmlEl.focus();
|
|
1336
1344
|
const range = document.createRange();
|
|
@@ -1338,23 +1346,61 @@ function fillAriaField(el, value) {
|
|
|
1338
1346
|
const sel = window.getSelection();
|
|
1339
1347
|
sel?.removeAllRanges();
|
|
1340
1348
|
sel?.addRange(range);
|
|
1341
|
-
|
|
1349
|
+
const text = String(value ?? "");
|
|
1350
|
+
console.log("[auto-webmcp] fillAriaField: text to insert:", JSON.stringify(text));
|
|
1351
|
+
let inserted = false;
|
|
1342
1352
|
try {
|
|
1343
1353
|
const dt = new DataTransfer();
|
|
1344
|
-
dt.setData("text/plain",
|
|
1345
|
-
|
|
1354
|
+
dt.setData("text/plain", text);
|
|
1355
|
+
htmlEl.dispatchEvent(new ClipboardEvent("paste", {
|
|
1346
1356
|
bubbles: true,
|
|
1347
1357
|
cancelable: true,
|
|
1348
1358
|
composed: true,
|
|
1349
1359
|
clipboardData: dt
|
|
1350
|
-
});
|
|
1351
|
-
|
|
1352
|
-
|
|
1360
|
+
}));
|
|
1361
|
+
inserted = (htmlEl.textContent ?? "").trim().length > 0;
|
|
1362
|
+
console.log("[auto-webmcp] fillAriaField: S1 paste result:", inserted, JSON.stringify((htmlEl.textContent ?? "").slice(0, 80)));
|
|
1363
|
+
} catch (e) {
|
|
1364
|
+
console.log("[auto-webmcp] fillAriaField: S1 paste threw:", e);
|
|
1353
1365
|
}
|
|
1354
|
-
if (!
|
|
1355
|
-
document.execCommand("insertText", false,
|
|
1366
|
+
if (!inserted) {
|
|
1367
|
+
const ok = document.execCommand("insertText", false, text);
|
|
1368
|
+
inserted = (htmlEl.textContent ?? "").trim().length > 0;
|
|
1369
|
+
console.log("[auto-webmcp] fillAriaField: S2 execCommand result:", ok, "inserted:", inserted, JSON.stringify((htmlEl.textContent ?? "").slice(0, 80)));
|
|
1356
1370
|
}
|
|
1371
|
+
if (!inserted) {
|
|
1372
|
+
try {
|
|
1373
|
+
htmlEl.dispatchEvent(new InputEvent("beforeinput", {
|
|
1374
|
+
bubbles: true,
|
|
1375
|
+
cancelable: true,
|
|
1376
|
+
composed: true,
|
|
1377
|
+
inputType: "insertText",
|
|
1378
|
+
data: text
|
|
1379
|
+
}));
|
|
1380
|
+
inserted = (htmlEl.textContent ?? "").trim().length > 0;
|
|
1381
|
+
console.log("[auto-webmcp] fillAriaField: S3 beforeinput result:", inserted, JSON.stringify((htmlEl.textContent ?? "").slice(0, 80)));
|
|
1382
|
+
} catch (e) {
|
|
1383
|
+
console.log("[auto-webmcp] fillAriaField: S3 beforeinput threw:", e);
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
if (!inserted) {
|
|
1387
|
+
htmlEl.textContent = text;
|
|
1388
|
+
const r2 = document.createRange();
|
|
1389
|
+
r2.selectNodeContents(htmlEl);
|
|
1390
|
+
r2.collapse(false);
|
|
1391
|
+
sel?.removeAllRanges();
|
|
1392
|
+
sel?.addRange(r2);
|
|
1393
|
+
console.log("[auto-webmcp] fillAriaField: S4 textContent assignment done, textContent:", JSON.stringify((htmlEl.textContent ?? "").slice(0, 80)));
|
|
1394
|
+
}
|
|
1395
|
+
htmlEl.dispatchEvent(new InputEvent("input", {
|
|
1396
|
+
bubbles: true,
|
|
1397
|
+
cancelable: true,
|
|
1398
|
+
inputType: "insertText",
|
|
1399
|
+
data: text
|
|
1400
|
+
}));
|
|
1401
|
+
console.log("[auto-webmcp] fillAriaField: done, final textContent:", JSON.stringify((htmlEl.textContent ?? "").slice(0, 80)));
|
|
1357
1402
|
} else {
|
|
1403
|
+
console.log("[auto-webmcp] fillAriaField: not contentEditable, dispatching input/change only");
|
|
1358
1404
|
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
1359
1405
|
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
1360
1406
|
}
|
|
@@ -1690,21 +1736,48 @@ async function scanOrphanInputs(config) {
|
|
|
1690
1736
|
console.log(`[auto-webmcp] orphan: using disabled submit button as reference: "${submitBtn.textContent?.trim()}"`);
|
|
1691
1737
|
}
|
|
1692
1738
|
if (!submitBtn) {
|
|
1693
|
-
const containerBtns = Array.from(
|
|
1739
|
+
const containerBtns = Array.from(
|
|
1740
|
+
container.querySelectorAll('button, [role="button"]')
|
|
1741
|
+
).filter((b) => {
|
|
1694
1742
|
const r = b.getBoundingClientRect();
|
|
1695
|
-
return r.width > 0 && r.height > 0 && !b.disabled && SUBMIT_TEXT_RE.test(b.textContent ?? "");
|
|
1743
|
+
return r.width > 0 && r.height > 0 && !b.disabled && b.getAttribute("aria-disabled") !== "true" && SUBMIT_TEXT_RE.test(b.textContent ?? "");
|
|
1696
1744
|
});
|
|
1697
1745
|
submitBtn = containerBtns[containerBtns.length - 1] ?? null;
|
|
1698
1746
|
if (submitBtn)
|
|
1699
1747
|
console.log(`[auto-webmcp] orphan: using text-matched button in container: "${submitBtn.textContent?.trim()}"`);
|
|
1700
1748
|
}
|
|
1701
1749
|
if (!submitBtn) {
|
|
1702
|
-
const
|
|
1703
|
-
|
|
1750
|
+
const dialog = container.closest('[role="dialog"], [aria-modal="true"]');
|
|
1751
|
+
if (dialog) {
|
|
1752
|
+
const allDialogBtns = Array.from(
|
|
1753
|
+
dialog.querySelectorAll('button, [role="button"]')
|
|
1754
|
+
).filter((b) => {
|
|
1704
1755
|
const r = b.getBoundingClientRect();
|
|
1705
1756
|
return r.width > 0 && r.height > 0 && SUBMIT_TEXT_RE.test(b.textContent ?? "");
|
|
1706
|
-
}
|
|
1707
|
-
|
|
1757
|
+
});
|
|
1758
|
+
console.log(
|
|
1759
|
+
`[auto-webmcp] orphan: dialog buttons matching submit text:`,
|
|
1760
|
+
allDialogBtns.map((b) => `"${b.textContent?.trim().slice(0, 30)}" disabled=${b.disabled} aria-disabled=${b.getAttribute("aria-disabled")}`)
|
|
1761
|
+
);
|
|
1762
|
+
const disabledBtns = allDialogBtns.filter(
|
|
1763
|
+
(b) => b.disabled || b.getAttribute("aria-disabled") === "true"
|
|
1764
|
+
);
|
|
1765
|
+
const enabledBtns = allDialogBtns.filter(
|
|
1766
|
+
(b) => !b.disabled && b.getAttribute("aria-disabled") !== "true"
|
|
1767
|
+
);
|
|
1768
|
+
const dialogBtns = disabledBtns.length > 0 ? disabledBtns : enabledBtns;
|
|
1769
|
+
submitBtn = dialogBtns[dialogBtns.length - 1] ?? null;
|
|
1770
|
+
if (submitBtn)
|
|
1771
|
+
console.log(`[auto-webmcp] orphan: using text-matched button in dialog: "${submitBtn.textContent?.trim().slice(0, 40)}" disabled=${submitBtn.disabled} aria-disabled=${submitBtn.getAttribute("aria-disabled")}`);
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
if (!submitBtn) {
|
|
1775
|
+
const pageBtns = Array.from(
|
|
1776
|
+
document.querySelectorAll('button, [role="button"]')
|
|
1777
|
+
).filter((b) => {
|
|
1778
|
+
const r = b.getBoundingClientRect();
|
|
1779
|
+
return r.width > 0 && r.height > 0 && b.getAttribute("aria-disabled") !== "true" && SUBMIT_TEXT_RE.test(b.textContent ?? "");
|
|
1780
|
+
});
|
|
1708
1781
|
submitBtn = pageBtns[pageBtns.length - 1] ?? null;
|
|
1709
1782
|
if (submitBtn)
|
|
1710
1783
|
console.log(`[auto-webmcp] orphan: using page-wide fallback submit button: "${submitBtn.textContent?.trim()}"`);
|