donobu 2.13.2 → 2.14.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.
- package/dist/apis/SpecialFlowsApi.js +6 -6
- package/dist/apis/SpecialFlowsApi.js.map +1 -1
- package/dist/assets/donobu-virtual-mouse.svg +11 -0
- package/dist/assets/donobu.css +62 -0
- package/dist/assets/generated/parameter-schemas.json +145 -246
- package/dist/assets/generated/version +1 -1
- package/dist/esm/apis/SpecialFlowsApi.js +6 -6
- package/dist/esm/apis/SpecialFlowsApi.js.map +1 -1
- package/dist/esm/assets/donobu-virtual-mouse.svg +11 -0
- package/dist/esm/assets/donobu.css +62 -0
- package/dist/esm/assets/generated/parameter-schemas.json +145 -246
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/managers/DonobuFlow.d.ts +3 -3
- package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlow.js +16 -20
- package/dist/esm/managers/DonobuFlow.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +80 -77
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.d.ts +43 -0
- package/dist/esm/managers/InteractionVisualizer.d.ts.map +1 -0
- package/dist/esm/managers/InteractionVisualizer.js +223 -0
- package/dist/esm/managers/InteractionVisualizer.js.map +1 -0
- package/dist/esm/models/CreateDonobuFlow.d.ts +2 -2
- package/dist/esm/models/CreateDonobuFlow.d.ts.map +1 -1
- package/dist/esm/models/FlowMetadata.d.ts +2 -2
- package/dist/esm/models/FlowMetadata.d.ts.map +1 -1
- package/dist/esm/models/ToolCallContext.d.ts +2 -2
- package/dist/esm/models/ToolCallContext.d.ts.map +1 -1
- package/dist/esm/persistence/DonobuSqliteDb.d.ts.map +1 -1
- package/dist/esm/persistence/DonobuSqliteDb.js +35 -0
- package/dist/esm/persistence/DonobuSqliteDb.js.map +1 -1
- package/dist/esm/playwrightTestExtensions.d.ts.map +1 -1
- package/dist/esm/playwrightTestExtensions.js +5 -16
- package/dist/esm/playwrightTestExtensions.js.map +1 -1
- package/dist/esm/tools/ClickTool.d.ts +1 -1
- package/dist/esm/tools/ClickTool.d.ts.map +1 -1
- package/dist/esm/tools/ClickTool.js +8 -5
- package/dist/esm/tools/ClickTool.js.map +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.js +4 -4
- package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
- package/dist/esm/utils/Logger.d.ts +2 -0
- package/dist/esm/utils/Logger.d.ts.map +1 -1
- package/dist/esm/utils/Logger.js +23 -14
- package/dist/esm/utils/Logger.js.map +1 -1
- package/dist/esm/utils/PlaywrightUtils.d.ts +8 -20
- package/dist/esm/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/esm/utils/PlaywrightUtils.js +51 -168
- package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
- package/dist/managers/DonobuFlow.d.ts +3 -3
- package/dist/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/managers/DonobuFlow.js +16 -20
- package/dist/managers/DonobuFlow.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +80 -77
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/InteractionVisualizer.d.ts +43 -0
- package/dist/managers/InteractionVisualizer.d.ts.map +1 -0
- package/dist/managers/InteractionVisualizer.js +223 -0
- package/dist/managers/InteractionVisualizer.js.map +1 -0
- package/dist/models/CreateDonobuFlow.d.ts +2 -2
- package/dist/models/CreateDonobuFlow.d.ts.map +1 -1
- package/dist/models/FlowMetadata.d.ts +2 -2
- package/dist/models/FlowMetadata.d.ts.map +1 -1
- package/dist/models/ToolCallContext.d.ts +2 -2
- package/dist/models/ToolCallContext.d.ts.map +1 -1
- package/dist/persistence/DonobuSqliteDb.d.ts.map +1 -1
- package/dist/persistence/DonobuSqliteDb.js +35 -0
- package/dist/persistence/DonobuSqliteDb.js.map +1 -1
- package/dist/playwrightTestExtensions.d.ts.map +1 -1
- package/dist/playwrightTestExtensions.js +5 -16
- package/dist/playwrightTestExtensions.js.map +1 -1
- package/dist/tools/ClickTool.d.ts +1 -1
- package/dist/tools/ClickTool.d.ts.map +1 -1
- package/dist/tools/ClickTool.js +8 -5
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/tools/ReplayableInteraction.js +4 -4
- package/dist/tools/ReplayableInteraction.js.map +1 -1
- package/dist/utils/Logger.d.ts +2 -0
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +23 -14
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/PlaywrightUtils.d.ts +8 -20
- package/dist/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/utils/PlaywrightUtils.js +51 -168
- package/dist/utils/PlaywrightUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,31 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ClickTool = void 0;
|
|
4
4
|
const ReplayableInteraction_1 = require("./ReplayableInteraction");
|
|
5
5
|
const MiscUtils_1 = require("../utils/MiscUtils");
|
|
6
|
+
const Logger_1 = require("../utils/Logger");
|
|
6
7
|
class ClickTool extends ReplayableInteraction_1.ReplayableInteraction {
|
|
7
8
|
constructor() {
|
|
8
9
|
super(ClickTool.NAME, 'Click an element on a webpage.', 'SelectorBasedClickToolParameters', 'AnnotationBasedClickToolParameters');
|
|
9
10
|
}
|
|
10
|
-
async invoke(context,
|
|
11
|
+
async invoke(context, parameters, element) {
|
|
11
12
|
const page = context.page;
|
|
12
13
|
const box = await element.boundingBox();
|
|
13
14
|
if (!box) {
|
|
14
15
|
throw new Error(`Failed to retrieve element bounding box for '${element}'; element may be offscreen or detached.`);
|
|
15
16
|
}
|
|
17
|
+
const clickDuration = MiscUtils_1.MiscUtils.generateHumanLikeClickDurationInMs();
|
|
16
18
|
try {
|
|
17
19
|
await element.click({
|
|
18
|
-
delay:
|
|
20
|
+
delay: clickDuration,
|
|
19
21
|
timeout: 1000,
|
|
20
22
|
});
|
|
21
23
|
return 'Clicked the element.';
|
|
22
24
|
}
|
|
23
|
-
catch (
|
|
25
|
+
catch (error) {
|
|
26
|
+
Logger_1.appLogger.warn(`Failed to directly click element with parameters ${JSON.stringify(parameters, null, 2)}, failing over to position based click...`, error);
|
|
24
27
|
const x = box.x + box.width / 2;
|
|
25
28
|
const y = box.y + box.height / 2;
|
|
26
29
|
await page.mouse.move(x, y);
|
|
27
30
|
await page.mouse.click(x, y, {
|
|
28
|
-
delay:
|
|
31
|
+
delay: clickDuration,
|
|
29
32
|
});
|
|
30
|
-
return
|
|
33
|
+
return `Clicked on the element at ${x}px by ${y}px.`;
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClickTool.js","sourceRoot":"","sources":["../../../src/tools/ClickTool.ts"],"names":[],"mappings":";;;AAEA,mEAIiC;AACjC,kDAA+C;
|
|
1
|
+
{"version":3,"file":"ClickTool.js","sourceRoot":"","sources":["../../../src/tools/ClickTool.ts"],"names":[],"mappings":";;;AAEA,mEAIiC;AACjC,kDAA+C;AAC/C,4CAA4C;AAU5C,MAAa,SAAU,SAAQ,6CAI9B;IAGC;QACE,KAAK,CACH,SAAS,CAAC,IAAI,EACd,gCAAgC,EAChC,kCAAkC,EAClC,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAwB,EACxB,UAAmC,EACnC,OAAgB;QAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QAExC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,gDAAgD,OAAO,0CAA0C,CAClG,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,qBAAS,CAAC,kCAAkC,EAAE,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,CAAC;gBAClB,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,OAAO,sBAAsB,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAS,CAAC,IAAI,CACZ,oDAAoD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,2CAA2C,EAClI,KAAK,CACN,CAAC;YACF,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC3B,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;YACH,OAAO,6BAA6B,CAAC,SAAS,CAAC,KAAK,CAAC;QACvD,CAAC;IACH,CAAC;;AAnDH,8BAoDC;AA/CwB,cAAI,GAAG,OAAO,CAAC"}
|
|
@@ -29,7 +29,7 @@ business/entity. This tool should be called for each unique street view.`, 'Extr
|
|
|
29
29
|
// Remove Google Maps survey if present
|
|
30
30
|
await NavigateWithinStreetView_1.NavigateWithinStreetViewTool.removeGoogleMapsSurvey(page);
|
|
31
31
|
if (firstCallForThisUrl) {
|
|
32
|
-
await context.
|
|
32
|
+
await context.interactionVisualizer.pointAt(page, page.locator('body'), `Skipping ${this.name} call since it has already extracted data for this view.`);
|
|
33
33
|
const originalRec = firstCallForThisUrl.parameters
|
|
34
34
|
.recommendedNextStepForStreetViewNavigator;
|
|
35
35
|
const advice = !originalRec
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtractGoogleStreetviewEntityDataTool.js","sourceRoot":"","sources":["../../../src/tools/ExtractGoogleStreetviewEntityDataTool.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAI9B,8DAA2D;AAC3D,kDAA+C;AAE/C,yEAGoC;AACpC,iGAA8F;AAI9F,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,2CAA2B,CAAA;IAC3B,iCAAiB,CAAA;IACjB,mDAAmC,CAAA;IACnC,yCAAyB,CAAA;IACzB,uCAAuB,CAAA;AACzB,CAAC,EANW,YAAY,4BAAZ,YAAY,QAMvB;AA8BD;;;GAGG;AACH,MAAa,qCAAsC,SAAQ,WAG1D;IAGC;QACE,KAAK,CACH,qCAAqC,CAAC,IAAI,EAC1C;yEACmE,EACnE,qDAAqD,EACrD,oDAAoD,EACpD,IAAI,CACL,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,IAAI,CACxB,OAAwB,EACxB,UAA+D;QAE/D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAI,CACvD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAC5D,CAAC;QACF,uCAAuC;QACvC,MAAM,uDAA4B,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAEhE,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"ExtractGoogleStreetviewEntityDataTool.js","sourceRoot":"","sources":["../../../src/tools/ExtractGoogleStreetviewEntityDataTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,10 +77,10 @@ class ReplayableInteraction extends Tool_1.Tool {
|
|
|
77
77
|
throw new Error(`Failed to retrieve element bounding box for '${element}'; element may be offscreen or detached.`);
|
|
78
78
|
}
|
|
79
79
|
if (parameters.rationale) {
|
|
80
|
-
// Show the
|
|
81
|
-
// a label, the tip/mouse will be over the label and
|
|
82
|
-
// it is associated with.
|
|
83
|
-
await context.
|
|
80
|
+
// Show the rationale at the original locator because if the
|
|
81
|
+
// element is a label, the tip/mouse will be over the label and
|
|
82
|
+
// not the element it is associated with.
|
|
83
|
+
await context.interactionVisualizer.pointAt(page, originalLocator, parameters.rationale);
|
|
84
84
|
}
|
|
85
85
|
// Hide the control panel so that it will not block an interaction if the
|
|
86
86
|
// target element is underneath the panel.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayableInteraction.js","sourceRoot":"","sources":["../../../src/tools/ReplayableInteraction.ts"],"names":[],"mappings":";;;AACA,8DAA2D;AAG3D,iCAA8B;AAE9B,4CAA4C;AAC5C,2EAAwE;AAuBxE;;;GAGG;AACH,MAAsB,qBAIpB,SAAQ,WAA4C;IAGpD,YACE,IAAY,EACZ,WAAmB,EACnB,kCAA0C,EAC1C,8BAAsC;QAEtC,KAAK,CACH,IAAI,EACJ,WAAW,EACX,kCAAkC,EAClC,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,IAAI,CACxB,OAAwB,EACxB,UAA4B;QAE5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,8BAA8B,CACzE,IAAI,EACJ,UAAU,CAAC,QAAS,CAAC,KAAK,EAC1B,UAAU,CAAC,QAAS,CAAC,OAAO,CAC7B,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO;gBACL,YAAY,EAAE,KAAK;gBACnB,MAAM,EAAE,yDAAyD;gBACjE,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,OAAwB,EACxB,UAAyB;QAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,6BAA6B,KAAK,UAAU,CAAC,UAAU,IAAI,CAAC;QACxG,IAAI,WAAW,GAGJ,IAAI,CAAC;QAEhB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAE/C,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,kBAAkB,GACtB,MAAM,iCAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACnD,MAAM,aAAa,GACjB,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI;oBAC1B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,MAAM,iCAAe,CAAC,wBAAwB,CAC5C,MAAM,KAAK,CAAC,YAAY,EAAE,CAC3B,CAAC;gBACR,WAAW,GAAG;oBACZ,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,iBAAiB,EAAE;wBACjB,OAAO,EAAE,kBAAkB;wBAC3B,KAAK,EAAE,aAAa;qBACrB;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO;gBACL,YAAY,EAAE,KAAK;gBACnB,MAAM,EAAE,yDAAyD;gBACjE,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAClB,OAAO,EACP,UAAU,EACV,WAAW,CAAC,QAAQ,EACpB,WAAW,CAAC,iBAAiB,CAC9B,CAAC;IACJ,CAAC;IAcO,KAAK,CAAC,QAAQ,CACpB,OAAwB,EACxB,UAA0B,EAC1B,QAAmB,EACnB,iBAAkC;QAElC,MAAM,mBAAmB,GAAG,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAK,CAAC;QAE3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACvC,MAAM,OAAO,GAAG,CACd,MAAM,iCAAe,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAC5D,CAAC,KAAK,EAAE,CAAC;wBACV,MAAM,OAAO,CAAC,sBAAsB,CAAC;4BACnC,OAAO,EAAE,mBAAmB;yBAC7B,CAAC,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;4BACpC,OAAO,EAAE,mBAAmB;yBAC7B,CAAC,CAAC;wBAEH,IAAI,CAAC,GAAG,EAAE,CAAC;4BACT,MAAM,IAAI,KAAK,CACb,gDAAgD,OAAO,0CAA0C,CAClG,CAAC;wBACJ,CAAC;wBAED,IAAK,UAAkB,CAAC,SAAS,EAAE,CAAC;4BAClC,
|
|
1
|
+
{"version":3,"file":"ReplayableInteraction.js","sourceRoot":"","sources":["../../../src/tools/ReplayableInteraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
3
|
+
export declare const loggingContext: AsyncLocalStorage<unknown>;
|
|
2
4
|
export declare const appLogger: winston.Logger;
|
|
3
5
|
export declare const accessLogger: winston.Logger;
|
|
4
6
|
//# sourceMappingURL=Logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/utils/Logger.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/utils/Logger.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqChD,eAAO,MAAM,cAAc,4BAA0B,CAAC;AActD,eAAO,MAAM,SAAS,gBA+BpB,CAAC;AAGH,eAAO,MAAM,YAAY,gBA2BvB,CAAC"}
|
package/dist/esm/utils/Logger.js
CHANGED
|
@@ -3,15 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.accessLogger = exports.appLogger = void 0;
|
|
6
|
+
exports.accessLogger = exports.appLogger = exports.loggingContext = void 0;
|
|
7
7
|
// utils/logger.ts
|
|
8
8
|
const winston_1 = __importDefault(require("winston"));
|
|
9
|
-
const winston_daily_rotate_file_1 = __importDefault(require("winston-daily-rotate-file"));
|
|
10
9
|
const path_1 = __importDefault(require("path"));
|
|
11
10
|
const MiscUtils_1 = require("../utils/MiscUtils");
|
|
11
|
+
const async_hooks_1 = require("async_hooks");
|
|
12
12
|
// Private constants and utility functions
|
|
13
|
-
const
|
|
14
|
-
const ACCESS_LOG_MAX_SIZE = '5m';
|
|
13
|
+
const LOG_MAX_SIZE_BYTES = 1 * 1024 * 1024; // 1 MB cap per file
|
|
15
14
|
const MAX_FILES = 2;
|
|
16
15
|
/**
|
|
17
16
|
* Formats an error object into a detailed string representation
|
|
@@ -42,22 +41,32 @@ const errorAwareFormat = winston_1.default.format((info) => {
|
|
|
42
41
|
}
|
|
43
42
|
return info;
|
|
44
43
|
});
|
|
44
|
+
exports.loggingContext = new async_hooks_1.AsyncLocalStorage();
|
|
45
|
+
// Format to add the currently running flow's ID (if any) from AsyncLocalStorage
|
|
46
|
+
const flowIdFormat = winston_1.default.format((info) => {
|
|
47
|
+
const store = exports.loggingContext.getStore();
|
|
48
|
+
const flowId = store?.flowId || '-';
|
|
49
|
+
return {
|
|
50
|
+
...info,
|
|
51
|
+
flowId,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
45
54
|
// Create and export the application logger directly
|
|
46
55
|
exports.appLogger = winston_1.default.createLogger({
|
|
47
56
|
level: 'info',
|
|
48
|
-
format: winston_1.default.format.combine(errorAwareFormat(), winston_1.default.format.timestamp({ format: timestampFormat }), winston_1.default.format.json()),
|
|
57
|
+
format: winston_1.default.format.combine(errorAwareFormat(), flowIdFormat(), winston_1.default.format.timestamp({ format: timestampFormat }), winston_1.default.format.json()),
|
|
49
58
|
transports: [
|
|
50
59
|
// Console transport (stderr)
|
|
51
60
|
new winston_1.default.transports.Console({
|
|
52
61
|
stderrLevels: ['info', 'warn', 'error'],
|
|
53
|
-
format: winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'HH:mm:ss.SSS' }), winston_1.default.format.printf(({ timestamp, level, message,
|
|
62
|
+
format: winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'HH:mm:ss.SSS' }), flowIdFormat(), winston_1.default.format.printf(({ timestamp, level, message, flowId, stack }) => `${timestamp} [${flowId}] ${level.toUpperCase().padEnd(5)} ${message}${stack ? '\n' + stack : ''}`)),
|
|
54
63
|
}),
|
|
55
|
-
// File transport with rotation
|
|
56
|
-
new
|
|
64
|
+
// File transport with size‑based rotation (1 MB per file, keep 2 files)
|
|
65
|
+
new winston_1.default.transports.File({
|
|
57
66
|
filename: path_1.default.join(basePath, 'app.log'),
|
|
58
|
-
|
|
67
|
+
maxsize: LOG_MAX_SIZE_BYTES,
|
|
59
68
|
maxFiles: MAX_FILES,
|
|
60
|
-
|
|
69
|
+
tailable: true,
|
|
61
70
|
}),
|
|
62
71
|
],
|
|
63
72
|
});
|
|
@@ -71,12 +80,12 @@ exports.accessLogger = winston_1.default.createLogger({
|
|
|
71
80
|
stderrLevels: ['info', 'warn', 'error'],
|
|
72
81
|
format: winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'HH:mm:ss.SSS' }), winston_1.default.format.printf(({ timestamp, message }) => `${timestamp} access - ${message}`)),
|
|
73
82
|
}),
|
|
74
|
-
// File transport with rotation
|
|
75
|
-
new
|
|
83
|
+
// File transport with size‑based rotation (1 MB per file, keep 2 files)
|
|
84
|
+
new winston_1.default.transports.File({
|
|
76
85
|
filename: path_1.default.join(basePath, 'access.log'),
|
|
77
|
-
|
|
86
|
+
maxsize: LOG_MAX_SIZE_BYTES,
|
|
78
87
|
maxFiles: MAX_FILES,
|
|
79
|
-
|
|
88
|
+
tailable: true,
|
|
80
89
|
}),
|
|
81
90
|
],
|
|
82
91
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/utils/Logger.ts"],"names":[],"mappings":";;;;;;AAAA,kBAAkB;AAClB,sDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/utils/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ElementHandle, Locator, Page } from 'playwright';
|
|
1
|
+
import { BrowserContext, ElementHandle, Locator, Page } from 'playwright';
|
|
2
2
|
import { FlowMetadata, State } from '../models/FlowMetadata';
|
|
3
3
|
import { InteractableElement } from '../models/InteractableElement';
|
|
4
4
|
declare global {
|
|
@@ -75,27 +75,15 @@ export declare class PlaywrightUtils {
|
|
|
75
75
|
static pageInteractionsTrackerInitScript(): string;
|
|
76
76
|
static donobuControlPanelInitScript(): string;
|
|
77
77
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* @param page - The Playwright Page object
|
|
83
|
-
* @param x - The x-coordinate in the top-level page coordinate space (relative to the browser window)
|
|
84
|
-
* @param y - The y-coordinate in the top-level page coordinate space
|
|
85
|
-
* @param durationMs - How long the sparkle remains (ms, default 800)
|
|
86
|
-
* @param emoji - The emoji to display (default '✨')
|
|
87
|
-
* @param size - CSS font-size for the emoji (default '40px')
|
|
88
|
-
*/
|
|
89
|
-
static createSparkleEffect(page: Page, x: number, y: number, durationMs?: number, emoji?: string, size?: string): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Recursively finds the deepest same-origin Frame that covers the point (top-level coordinates).
|
|
92
|
-
* Returns the Frame plus the local coordinates (relative to that frame's viewport).
|
|
93
|
-
*
|
|
94
|
-
* If no same-origin child frame covers (x, y), it returns the main frame and the original coords.
|
|
78
|
+
* Sets up the given browser context so that it can be minimally used by the
|
|
79
|
+
* rest of Donobu. This involves registering virtual routes for serving up
|
|
80
|
+
* Donobu-specific content, and registering critical page initialization
|
|
81
|
+
* scripts.
|
|
95
82
|
*/
|
|
96
|
-
|
|
83
|
+
static setupBasicBrowserContext(browserContext: BrowserContext): Promise<void>;
|
|
97
84
|
/**
|
|
98
|
-
* Returns the given locator or its label, if it has one.
|
|
85
|
+
* Returns the given locator or its label, if it has one and is associated with a labelable element.
|
|
86
|
+
* Labelable elements include: button, input (except hidden), meter, output, progress, select, and textarea.
|
|
99
87
|
*/
|
|
100
88
|
static getLocatorOrItsLabel(element: Locator): Promise<Locator>;
|
|
101
89
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,174 +98,36 @@ class PlaywrightUtils {
|
|
|
98
98
|
return PlaywrightUtils.DONOBU_CONTROL_PANEL_INIT_SCRIPT;
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* @param page - The Playwright Page object
|
|
106
|
-
* @param x - The x-coordinate in the top-level page coordinate space (relative to the browser window)
|
|
107
|
-
* @param y - The y-coordinate in the top-level page coordinate space
|
|
108
|
-
* @param durationMs - How long the sparkle remains (ms, default 800)
|
|
109
|
-
* @param emoji - The emoji to display (default '✨')
|
|
110
|
-
* @param size - CSS font-size for the emoji (default '40px')
|
|
101
|
+
* Sets up the given browser context so that it can be minimally used by the
|
|
102
|
+
* rest of Donobu. This involves registering virtual routes for serving up
|
|
103
|
+
* Donobu-specific content, and registering critical page initialization
|
|
104
|
+
* scripts.
|
|
111
105
|
*/
|
|
112
|
-
static async
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (old)
|
|
122
|
-
old.remove();
|
|
123
|
-
const container = document.createElement('div');
|
|
124
|
-
container.id = containerId;
|
|
125
|
-
const shadowRoot = container.attachShadow({ mode: 'open' });
|
|
126
|
-
const sparkle = document.createElement('span');
|
|
127
|
-
sparkle.id = 'playwright-sparkle-element';
|
|
128
|
-
sparkle.textContent = emoji;
|
|
129
|
-
// Position & style
|
|
130
|
-
sparkle.style.position = 'fixed';
|
|
131
|
-
sparkle.style.left = `${x}px`;
|
|
132
|
-
sparkle.style.top = `${y}px`;
|
|
133
|
-
sparkle.style.fontSize = size;
|
|
134
|
-
sparkle.style.transform = 'translate(-50%, -50%)';
|
|
135
|
-
sparkle.style.zIndex = '2147483647'; // Very large to float above most overlays
|
|
136
|
-
sparkle.style.pointerEvents = 'none';
|
|
137
|
-
sparkle.style.userSelect = 'none';
|
|
138
|
-
sparkle.style.filter = 'drop-shadow(0 0 2px rgba(255,255,255,0.7))';
|
|
139
|
-
sparkle.style.animation = 'sparkle-appear 0.3s ease-out forwards';
|
|
140
|
-
const styleEl = document.createElement('style');
|
|
141
|
-
styleEl.textContent = `
|
|
142
|
-
:host {
|
|
143
|
-
all: initial;
|
|
144
|
-
}
|
|
145
|
-
@keyframes sparkle-appear {
|
|
146
|
-
0% { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
|
|
147
|
-
50% { opacity: 1; transform: translate(-50%, -50%) scale(1.2); }
|
|
148
|
-
100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
|
|
149
|
-
}
|
|
150
|
-
@keyframes sparkle-disappear {
|
|
151
|
-
0% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
|
|
152
|
-
100% { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
|
|
153
|
-
}
|
|
154
|
-
`;
|
|
155
|
-
shadowRoot.appendChild(styleEl);
|
|
156
|
-
shadowRoot.appendChild(sparkle);
|
|
157
|
-
document.body.appendChild(container);
|
|
158
|
-
}, { x: localX, y: localY, emoji, size });
|
|
159
|
-
// 3) Wait the duration
|
|
160
|
-
await page.waitForTimeout(durationMs);
|
|
161
|
-
// 4) Fade out and remove
|
|
162
|
-
await targetFrame.evaluate(() => {
|
|
163
|
-
const container = document.getElementById('playwright-sparkle-shadow-container');
|
|
164
|
-
if (container && container.shadowRoot) {
|
|
165
|
-
const sparkle = container.shadowRoot.getElementById('playwright-sparkle-element');
|
|
166
|
-
if (sparkle) {
|
|
167
|
-
sparkle.style.animation = 'sparkle-disappear 0.3s ease-in forwards';
|
|
168
|
-
}
|
|
169
|
-
setTimeout(() => {
|
|
170
|
-
container.remove();
|
|
171
|
-
}, 300);
|
|
172
|
-
}
|
|
106
|
+
static async setupBasicBrowserContext(browserContext) {
|
|
107
|
+
// Add Donobu CSS and SVG routes to the browser so that are not violating
|
|
108
|
+
// the CSP of any of the pages we attempt to render our custom stuff on.
|
|
109
|
+
await browserContext.route('**/donobu-virtual-mouse.svg', async (route) => {
|
|
110
|
+
await route.fulfill({
|
|
111
|
+
status: 200,
|
|
112
|
+
contentType: 'image/svg+xml',
|
|
113
|
+
body: MiscUtils_1.MiscUtils.getResourceFileAsString('donobu-virtual-mouse.svg'),
|
|
114
|
+
});
|
|
173
115
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
* Returns the Frame plus the local coordinates (relative to that frame's viewport).
|
|
180
|
-
*
|
|
181
|
-
* If no same-origin child frame covers (x, y), it returns the main frame and the original coords.
|
|
182
|
-
*/
|
|
183
|
-
static async findDeepestFrameAtPoint(page, x, y, frame = page.mainFrame()) {
|
|
184
|
-
// We'll attempt to see if any child <iframe> in this frame covers the coordinate
|
|
185
|
-
// Steps:
|
|
186
|
-
// (1) Convert the top-level coordinate (x, y) into this frame's local coordinate system.
|
|
187
|
-
// (2) If outside the frame's bounding client rect (in its parent), skip further checks.
|
|
188
|
-
// (3) Check each child <iframe> inside this frame's DOM. If the point is inside that <iframe>,
|
|
189
|
-
// convert to the child frame's coords and recurse. If the child frame is cross-origin,
|
|
190
|
-
// skip it.
|
|
191
|
-
//
|
|
192
|
-
// If none of the children contain the point, we are the "deepest" frame for that point.
|
|
193
|
-
// If we're the mainFrame, there's no parent boundingRect. So we start with (x, y) as is.
|
|
194
|
-
let localX = x;
|
|
195
|
-
let localY = y;
|
|
196
|
-
// If there's a parent frame, we need to see where the <iframe> itself is in parent's coords
|
|
197
|
-
// But we only do that if frame is NOT the main frame
|
|
198
|
-
const parentFrame = frame.parentFrame();
|
|
199
|
-
if (parentFrame) {
|
|
200
|
-
// Evaluate bounding rect of the <iframe> that hosts this child frame
|
|
201
|
-
// We'll do a small trick: find the <iframe> element in the parent that has frame.url()
|
|
202
|
-
// or frame.name(). There's no direct method, so we rely on the frame element handle:
|
|
203
|
-
const frameElement = await frame.frameElement();
|
|
204
|
-
const box = await frameElement.boundingBox();
|
|
205
|
-
if (!box) {
|
|
206
|
-
// If we can't get bounding box, fallback
|
|
207
|
-
return { targetFrame: page.mainFrame(), localX: x, localY: y };
|
|
208
|
-
}
|
|
209
|
-
// The bounding box's coords are relative to the parent's main page.
|
|
210
|
-
// Convert our (x, y) from the parent's coordinate system to this child's local system.
|
|
211
|
-
if (x < box.x ||
|
|
212
|
-
y < box.y ||
|
|
213
|
-
x > box.x + box.width ||
|
|
214
|
-
y > box.y + box.height) {
|
|
215
|
-
// The point is not inside this child frame's bounding box at all
|
|
216
|
-
// so it's not relevant. We'll skip it. The caller will continue searching siblings.
|
|
217
|
-
return { targetFrame: page.mainFrame(), localX: x, localY: y };
|
|
218
|
-
}
|
|
219
|
-
// So we are inside this child frame. Convert (x, y) to local coords
|
|
220
|
-
localX = x - box.x; // offset from left
|
|
221
|
-
localY = y - box.y; // offset from top
|
|
222
|
-
// Now we must also account for the child frame's own scrolling. Evaluate in the child:
|
|
223
|
-
const scrollOffsets = await frame.evaluate(() => {
|
|
224
|
-
return { sx: window.scrollX, sy: window.scrollY };
|
|
116
|
+
await browserContext.route('**/donobu.css', async (route) => {
|
|
117
|
+
await route.fulfill({
|
|
118
|
+
status: 200,
|
|
119
|
+
contentType: 'text/css',
|
|
120
|
+
body: MiscUtils_1.MiscUtils.getResourceFileAsString('donobu.css'),
|
|
225
121
|
});
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
for (const child of childFrames) {
|
|
232
|
-
// We'll see if child is same-origin by trying a small evaluate
|
|
233
|
-
// If it's cross-origin, we'll catch the error & skip
|
|
234
|
-
try {
|
|
235
|
-
// Convert localX/Y into child's bounding box
|
|
236
|
-
const childElement = await child.frameElement();
|
|
237
|
-
const childBox = await childElement.boundingBox();
|
|
238
|
-
if (!childBox) {
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
// Check if local point is inside child's bounding box
|
|
242
|
-
if (localX >= childBox.x &&
|
|
243
|
-
localY >= childBox.y &&
|
|
244
|
-
localX <= childBox.x + childBox.width &&
|
|
245
|
-
localY <= childBox.y + childBox.height) {
|
|
246
|
-
// Convert to child's local coords
|
|
247
|
-
let childLocalX = localX - childBox.x;
|
|
248
|
-
let childLocalY = localY - childBox.y;
|
|
249
|
-
// Add child's scroll offset
|
|
250
|
-
const childScroll = await child.evaluate(() => {
|
|
251
|
-
return { sx: window.scrollX, sy: window.scrollY };
|
|
252
|
-
});
|
|
253
|
-
childLocalX += childScroll.sx;
|
|
254
|
-
childLocalY += childScroll.sy;
|
|
255
|
-
// Recurse deeper
|
|
256
|
-
return await this.findDeepestFrameAtPoint(page, childLocalX, childLocalY, child);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
catch {
|
|
260
|
-
// Probably cross-origin or some other error, skip
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
// If we get here, none of the children contain the point (or are cross-origin),
|
|
264
|
-
// so this frame is the deepest coverage.
|
|
265
|
-
return { targetFrame: frame, localX, localY };
|
|
122
|
+
});
|
|
123
|
+
await browserContext.addInitScript(PlaywrightUtils.accessibilityTestInitScript());
|
|
124
|
+
await browserContext.addInitScript(PlaywrightUtils.clickableElementsTrackerInitScript());
|
|
125
|
+
await browserContext.addInitScript(PlaywrightUtils.dialogPromptTrackerInitScript());
|
|
126
|
+
await browserContext.addInitScript(PlaywrightUtils.smartSelectorGeneratorInitScript());
|
|
266
127
|
}
|
|
267
128
|
/**
|
|
268
|
-
* Returns the given locator or its label, if it has one.
|
|
129
|
+
* Returns the given locator or its label, if it has one and is associated with a labelable element.
|
|
130
|
+
* Labelable elements include: button, input (except hidden), meter, output, progress, select, and textarea.
|
|
269
131
|
*/
|
|
270
132
|
static async getLocatorOrItsLabel(element) {
|
|
271
133
|
const timeoutMilliseconds = 5000;
|
|
@@ -284,6 +146,29 @@ class PlaywrightUtils {
|
|
|
284
146
|
}
|
|
285
147
|
return element;
|
|
286
148
|
}
|
|
149
|
+
// Check if the element is a labelable element
|
|
150
|
+
// See https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/label
|
|
151
|
+
const isLabelable = await element.evaluate((elem) => {
|
|
152
|
+
const tagName = elem.tagName.toLowerCase();
|
|
153
|
+
if (tagName === 'button' ||
|
|
154
|
+
tagName === 'meter' ||
|
|
155
|
+
tagName === 'output' ||
|
|
156
|
+
tagName === 'progress' ||
|
|
157
|
+
tagName === 'select' ||
|
|
158
|
+
tagName === 'textarea') {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
if (tagName === 'input') {
|
|
162
|
+
// Input is labelable except when type="hidden"
|
|
163
|
+
const type = elem.getAttribute('type')?.toLowerCase() || 'text';
|
|
164
|
+
return type !== 'hidden';
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
});
|
|
168
|
+
// If the element is not labelable, return the original locator
|
|
169
|
+
if (!isLabelable) {
|
|
170
|
+
return element;
|
|
171
|
+
}
|
|
287
172
|
// Try to get the ID attribute
|
|
288
173
|
const id = await element
|
|
289
174
|
.getAttribute('id', {
|
|
@@ -618,12 +503,10 @@ class PlaywrightUtils {
|
|
|
618
503
|
container.id = 'annotation-shadow-container';
|
|
619
504
|
// Position container so child elements can be absolutely placed
|
|
620
505
|
Object.assign(container.style, {
|
|
621
|
-
position: '
|
|
622
|
-
|
|
623
|
-
left: '0',
|
|
624
|
-
width: '100%',
|
|
625
|
-
height: '100%',
|
|
506
|
+
position: 'fixed', // anchor to viewport
|
|
507
|
+
inset: '0', // stretch across it
|
|
626
508
|
pointerEvents: 'none', // Let clicks pass through
|
|
509
|
+
zIndex: '2147483647', // win every z-index fight
|
|
627
510
|
});
|
|
628
511
|
// Check if document.body exists before trying to append.
|
|
629
512
|
if (document.body) {
|