donobu 2.31.1 → 2.32.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.
Files changed (139) hide show
  1. package/dist/apis/GptConfigsApi.d.ts.map +1 -1
  2. package/dist/apis/GptConfigsApi.js +2 -0
  3. package/dist/apis/GptConfigsApi.js.map +1 -1
  4. package/dist/assets/generated/version +1 -1
  5. package/dist/assets/interactive-elements-tracker.js +89 -62
  6. package/dist/assets/page-interactions-tracker.js +15 -42
  7. package/dist/assets/smart-selector-generator.js +839 -259
  8. package/dist/bindings/PageInteractionTracker.d.ts +27 -1
  9. package/dist/bindings/PageInteractionTracker.d.ts.map +1 -1
  10. package/dist/bindings/PageInteractionTracker.js +172 -61
  11. package/dist/bindings/PageInteractionTracker.js.map +1 -1
  12. package/dist/esm/apis/GptConfigsApi.d.ts.map +1 -1
  13. package/dist/esm/apis/GptConfigsApi.js +2 -0
  14. package/dist/esm/apis/GptConfigsApi.js.map +1 -1
  15. package/dist/esm/assets/generated/version +1 -1
  16. package/dist/esm/assets/interactive-elements-tracker.js +89 -62
  17. package/dist/esm/assets/page-interactions-tracker.js +15 -42
  18. package/dist/esm/assets/smart-selector-generator.js +839 -259
  19. package/dist/esm/bindings/PageInteractionTracker.d.ts +27 -1
  20. package/dist/esm/bindings/PageInteractionTracker.d.ts.map +1 -1
  21. package/dist/esm/bindings/PageInteractionTracker.js +172 -61
  22. package/dist/esm/bindings/PageInteractionTracker.js.map +1 -1
  23. package/dist/esm/managers/AgentsManager.d.ts +9 -0
  24. package/dist/esm/managers/AgentsManager.d.ts.map +1 -1
  25. package/dist/esm/managers/AgentsManager.js +52 -0
  26. package/dist/esm/managers/AgentsManager.js.map +1 -1
  27. package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
  28. package/dist/esm/managers/CodeGenerator.js +1 -0
  29. package/dist/esm/managers/CodeGenerator.js.map +1 -1
  30. package/dist/esm/managers/DonobuFlow.d.ts +1 -0
  31. package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
  32. package/dist/esm/managers/DonobuFlow.js +23 -0
  33. package/dist/esm/managers/DonobuFlow.js.map +1 -1
  34. package/dist/esm/managers/InteractionVisualizer.d.ts +18 -2
  35. package/dist/esm/managers/InteractionVisualizer.d.ts.map +1 -1
  36. package/dist/esm/managers/InteractionVisualizer.js +33 -14
  37. package/dist/esm/managers/InteractionVisualizer.js.map +1 -1
  38. package/dist/esm/managers/PageInspector.d.ts +1 -0
  39. package/dist/esm/managers/PageInspector.d.ts.map +1 -1
  40. package/dist/esm/managers/PageInspector.js +90 -10
  41. package/dist/esm/managers/PageInspector.js.map +1 -1
  42. package/dist/esm/models/BrowserConfig.d.ts +56 -56
  43. package/dist/esm/models/CreateDonobuFlow.d.ts +48 -48
  44. package/dist/esm/models/FlowMetadata.d.ts +54 -54
  45. package/dist/esm/models/InteractableElement.d.ts +4 -3
  46. package/dist/esm/models/InteractableElement.d.ts.map +1 -1
  47. package/dist/esm/models/InteractableElement.js +9 -4
  48. package/dist/esm/models/InteractableElement.js.map +1 -1
  49. package/dist/esm/persistence/DonobuSqliteDb.d.ts.map +1 -1
  50. package/dist/esm/persistence/DonobuSqliteDb.js +44 -0
  51. package/dist/esm/persistence/DonobuSqliteDb.js.map +1 -1
  52. package/dist/esm/tools/ChooseSelectOptionTool.d.ts.map +1 -1
  53. package/dist/esm/tools/ChooseSelectOptionTool.js +2 -1
  54. package/dist/esm/tools/ChooseSelectOptionTool.js.map +1 -1
  55. package/dist/esm/tools/InputRandomizedEmailAddressTool.d.ts +6 -6
  56. package/dist/esm/tools/InputTextTool.d.ts +9 -0
  57. package/dist/esm/tools/InputTextTool.d.ts.map +1 -1
  58. package/dist/esm/tools/InputTextTool.js +8 -2
  59. package/dist/esm/tools/InputTextTool.js.map +1 -1
  60. package/dist/esm/tools/PressKeyTool.d.ts.map +1 -1
  61. package/dist/esm/tools/PressKeyTool.js +8 -3
  62. package/dist/esm/tools/PressKeyTool.js.map +1 -1
  63. package/dist/esm/tools/ReplayableInteraction.d.ts.map +1 -1
  64. package/dist/esm/tools/ReplayableInteraction.js +14 -7
  65. package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
  66. package/dist/esm/tools/RunAccessibilityTestTool.d.ts +0 -8
  67. package/dist/esm/tools/RunAccessibilityTestTool.d.ts.map +1 -1
  68. package/dist/esm/tools/RunAccessibilityTestTool.js +20 -38
  69. package/dist/esm/tools/RunAccessibilityTestTool.js.map +1 -1
  70. package/dist/esm/tools/ScrollPageTool.d.ts +52 -11
  71. package/dist/esm/tools/ScrollPageTool.d.ts.map +1 -1
  72. package/dist/esm/tools/ScrollPageTool.js +63 -57
  73. package/dist/esm/tools/ScrollPageTool.js.map +1 -1
  74. package/dist/esm/tools/TriggerDonobuFlowTool.d.ts +116 -116
  75. package/dist/esm/utils/BrowserUtils.js +1 -1
  76. package/dist/esm/utils/BrowserUtils.js.map +1 -1
  77. package/dist/esm/utils/PlaywrightUtils.d.ts.map +1 -1
  78. package/dist/esm/utils/PlaywrightUtils.js +0 -2
  79. package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
  80. package/dist/managers/AgentsManager.d.ts +9 -0
  81. package/dist/managers/AgentsManager.d.ts.map +1 -1
  82. package/dist/managers/AgentsManager.js +52 -0
  83. package/dist/managers/AgentsManager.js.map +1 -1
  84. package/dist/managers/CodeGenerator.d.ts.map +1 -1
  85. package/dist/managers/CodeGenerator.js +1 -0
  86. package/dist/managers/CodeGenerator.js.map +1 -1
  87. package/dist/managers/DonobuFlow.d.ts +1 -0
  88. package/dist/managers/DonobuFlow.d.ts.map +1 -1
  89. package/dist/managers/DonobuFlow.js +23 -0
  90. package/dist/managers/DonobuFlow.js.map +1 -1
  91. package/dist/managers/InteractionVisualizer.d.ts +18 -2
  92. package/dist/managers/InteractionVisualizer.d.ts.map +1 -1
  93. package/dist/managers/InteractionVisualizer.js +33 -14
  94. package/dist/managers/InteractionVisualizer.js.map +1 -1
  95. package/dist/managers/PageInspector.d.ts +1 -0
  96. package/dist/managers/PageInspector.d.ts.map +1 -1
  97. package/dist/managers/PageInspector.js +90 -10
  98. package/dist/managers/PageInspector.js.map +1 -1
  99. package/dist/models/BrowserConfig.d.ts +56 -56
  100. package/dist/models/CreateDonobuFlow.d.ts +48 -48
  101. package/dist/models/FlowMetadata.d.ts +54 -54
  102. package/dist/models/InteractableElement.d.ts +4 -3
  103. package/dist/models/InteractableElement.d.ts.map +1 -1
  104. package/dist/models/InteractableElement.js +9 -4
  105. package/dist/models/InteractableElement.js.map +1 -1
  106. package/dist/persistence/DonobuSqliteDb.d.ts.map +1 -1
  107. package/dist/persistence/DonobuSqliteDb.js +44 -0
  108. package/dist/persistence/DonobuSqliteDb.js.map +1 -1
  109. package/dist/tools/ChooseSelectOptionTool.d.ts.map +1 -1
  110. package/dist/tools/ChooseSelectOptionTool.js +2 -1
  111. package/dist/tools/ChooseSelectOptionTool.js.map +1 -1
  112. package/dist/tools/InputRandomizedEmailAddressTool.d.ts +6 -6
  113. package/dist/tools/InputTextTool.d.ts +9 -0
  114. package/dist/tools/InputTextTool.d.ts.map +1 -1
  115. package/dist/tools/InputTextTool.js +8 -2
  116. package/dist/tools/InputTextTool.js.map +1 -1
  117. package/dist/tools/PressKeyTool.d.ts.map +1 -1
  118. package/dist/tools/PressKeyTool.js +8 -3
  119. package/dist/tools/PressKeyTool.js.map +1 -1
  120. package/dist/tools/ReplayableInteraction.d.ts.map +1 -1
  121. package/dist/tools/ReplayableInteraction.js +14 -7
  122. package/dist/tools/ReplayableInteraction.js.map +1 -1
  123. package/dist/tools/RunAccessibilityTestTool.d.ts +0 -8
  124. package/dist/tools/RunAccessibilityTestTool.d.ts.map +1 -1
  125. package/dist/tools/RunAccessibilityTestTool.js +20 -38
  126. package/dist/tools/RunAccessibilityTestTool.js.map +1 -1
  127. package/dist/tools/ScrollPageTool.d.ts +52 -11
  128. package/dist/tools/ScrollPageTool.d.ts.map +1 -1
  129. package/dist/tools/ScrollPageTool.js +63 -57
  130. package/dist/tools/ScrollPageTool.js.map +1 -1
  131. package/dist/tools/TriggerDonobuFlowTool.d.ts +116 -116
  132. package/dist/utils/BrowserUtils.js +1 -1
  133. package/dist/utils/BrowserUtils.js.map +1 -1
  134. package/dist/utils/PlaywrightUtils.d.ts.map +1 -1
  135. package/dist/utils/PlaywrightUtils.js +0 -2
  136. package/dist/utils/PlaywrightUtils.js.map +1 -1
  137. package/package.json +2 -1
  138. package/dist/assets/axe.js +0 -47397
  139. package/dist/esm/assets/axe.js +0 -47397
@@ -1,11 +1,32 @@
1
1
  import { BrowserContext, Page, Frame } from 'playwright';
2
2
  import { NamedBindingCallback } from './NamedBindingCallback';
3
3
  import { DonobuFlow } from '../managers/DonobuFlow';
4
+ import { z } from 'zod';
4
5
  declare global {
5
6
  interface Window {
6
7
  [PageInteractionTracker.NAME]: () => boolean;
7
8
  }
8
9
  }
10
+ /**
11
+ * Zod schema for validating InteractionEvent objects.
12
+ */
13
+ export declare const InteractionEventSchema: z.ZodObject<{
14
+ type: z.ZodString;
15
+ key: z.ZodOptional<z.ZodString>;
16
+ selectors: z.ZodArray<z.ZodString, "many">;
17
+ }, "strip", z.ZodTypeAny, {
18
+ type: string;
19
+ selectors: string[];
20
+ key?: string | undefined;
21
+ }, {
22
+ type: string;
23
+ selectors: string[];
24
+ key?: string | undefined;
25
+ }>;
26
+ /**
27
+ * TypeScript type inferred from the Zod schema.
28
+ */
29
+ export type InteractionEvent = z.infer<typeof InteractionEventSchema>;
9
30
  /**
10
31
  * Tracks direct user actions that have occurred in the web browser.
11
32
  * This differs from normal Donobu flows which use GPT to analyze pages and propose actions.
@@ -29,6 +50,11 @@ export declare class PageInteractionTracker implements NamedBindingCallback {
29
50
  page: Page;
30
51
  frame: Frame;
31
52
  }, ...args: any[]): Promise<void>;
32
- private createToolCall;
53
+ private handleSyntheticToolCall;
54
+ private handleClick;
55
+ private handleKeyDown;
56
+ private buildSelectorForReplay;
57
+ private isCandidateForToolCallMerging;
58
+ private savePageScreenshot;
33
59
  }
34
60
  //# sourceMappingURL=PageInteractionTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageInteractionTracker.d.ts","sourceRoot":"","sources":["../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAYpD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC;KAC9C;CACF;AAQD;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,oBAAoB;IA2C7C,OAAO,CAAC,QAAQ,CAAC,UAAU;IA1C/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAEjC;IAGF,gBAAuB,IAAI,8BAA8B;WAErC,QAAQ,CAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAgClC,OAAO;IAEA,IAAI,IAAI,MAAM;IAIrB;;;;;OAKG;IACU,IAAI,CACf,MAAM,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAC7D,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;YA0DF,cAAc;CAyD7B"}
1
+ {"version":3,"file":"PageInteractionTracker.d.ts","sourceRoot":"","sources":["../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC;KAC9C;CACF;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EASjC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,oBAAoB;IA2C7C,OAAO,CAAC,QAAQ,CAAC,UAAU;IA1C/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAEjC;IAGF,gBAAuB,IAAI,8BAA8B;WAErC,QAAQ,CAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAgClC,OAAO;IAEA,IAAI,IAAI,MAAM;IAIrB;;;;;OAKG;IACU,IAAI,CACf,MAAM,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAC7D,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;YAaF,uBAAuB;YAiBvB,WAAW;YA+BX,aAAa;YAiHb,sBAAsB;IAmBpC,OAAO,CAAC,6BAA6B;YAoCvB,kBAAkB;CAOjC"}
@@ -3,13 +3,26 @@ 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.PageInteractionTracker = void 0;
6
+ exports.PageInteractionTracker = exports.InteractionEventSchema = void 0;
7
7
  const MiscUtils_1 = require("../utils/MiscUtils");
8
8
  const ClickTool_1 = require("../tools/ClickTool");
9
9
  const PressKeyTool_1 = require("../tools/PressKeyTool");
10
10
  const Logger_1 = require("../utils/Logger");
11
11
  const PlaywrightUtils_1 = require("../utils/PlaywrightUtils");
12
12
  const path_1 = __importDefault(require("path"));
13
+ const zod_1 = require("zod");
14
+ const InputTextTool_1 = require("../tools/InputTextTool");
15
+ /**
16
+ * Zod schema for validating InteractionEvent objects.
17
+ */
18
+ exports.InteractionEventSchema = zod_1.z.object({
19
+ // The type of interaction (e.g. "click", "keydown", etc.)
20
+ type: zod_1.z.string(),
21
+ // Optional key pressed during the interaction (e.g. "Enter")
22
+ key: zod_1.z.string().optional(),
23
+ // Array of CSS/Xpath selectors representing the target element involved
24
+ selectors: zod_1.z.array(zod_1.z.string()),
25
+ });
13
26
  /**
14
27
  * Tracks direct user actions that have occurred in the web browser.
15
28
  * This differs from normal Donobu flows which use GPT to analyze pages and propose actions.
@@ -55,75 +68,173 @@ class PageInteractionTracker {
55
68
  const flowState = this.donobuFlow.metadata.state;
56
69
  if (flowState === 'PAUSED' ||
57
70
  flowState === 'WAITING_ON_USER_FOR_NEXT_ACTION') {
58
- const timestamp = new Date().getTime();
59
- const event = args[0];
60
- Logger_1.appLogger.debug(`Event: ${JSON.stringify(event)}`);
61
- const postCallImage = await PlaywrightUtils_1.PlaywrightUtils.takeViewportScreenshot(source.page, {
62
- type: 'jpeg',
63
- // Override the default style of removing the control panel from the
64
- // screenshot since it can produce intense flickering.
65
- style: '',
66
- });
67
- const postCallImageId = await this.donobuFlow.persistence.saveScreenShot(this.donobuFlow.metadata.id, postCallImage);
68
- const frameSelector = source.frame.url() === source.page.url()
69
- ? null
70
- : (await PlaywrightUtils_1.PlaywrightUtils.generateSelectors(await source.frame.frameElement()))[0];
71
- const elementSelectors = event.selectors;
72
- const externalToolCall = await this.createToolCall(event, elementSelectors, frameSelector, postCallImageId, source.page.url(), timestamp);
73
- if (externalToolCall) {
74
- this.donobuFlow.invokedToolCalls.push(externalToolCall);
75
- await this.donobuFlow.persistence.saveToolCall(this.donobuFlow.metadata.id, externalToolCall);
76
- }
71
+ Logger_1.appLogger.debug(`Event: ${JSON.stringify(args[0])}`);
72
+ const event = exports.InteractionEventSchema.parse(args[0]);
73
+ await this.handleSyntheticToolCall(source, event);
77
74
  }
78
- return;
79
75
  }
80
- async createToolCall(event, elementSelectors, frameSelector, postCallImageId, pageUrl, timestamp) {
81
- const selectorForReplay = {
82
- element: elementSelectors,
83
- frame: frameSelector,
84
- };
76
+ async handleSyntheticToolCall(source, event) {
85
77
  switch (event.type) {
86
78
  case 'click': {
87
- return {
88
- id: MiscUtils_1.MiscUtils.createAdHocToolCallId(),
89
- toolName: ClickTool_1.ClickTool.NAME,
90
- parameters: {
91
- selector: selectorForReplay,
92
- },
93
- outcome: {
94
- isSuccessful: true,
95
- forLlm: 'Clicked the element.',
96
- metadata: selectorForReplay,
97
- },
98
- postCallImageId: postCallImageId,
99
- page: pageUrl,
100
- startedAt: timestamp,
101
- completedAt: timestamp,
102
- };
79
+ await this.handleClick(source, event);
80
+ break;
103
81
  }
104
82
  case 'keydown': {
105
- return {
106
- id: MiscUtils_1.MiscUtils.createAdHocToolCallId(),
107
- toolName: PressKeyTool_1.PressKeyTool.NAME,
108
- parameters: {
109
- selector: selectorForReplay,
110
- key: event.key,
111
- },
112
- outcome: {
113
- isSuccessful: true,
114
- forLlm: `Pressed the '${event.key}' key at the element.`,
115
- metadata: selectorForReplay,
116
- },
117
- postCallImageId: postCallImageId,
118
- page: pageUrl,
119
- startedAt: timestamp,
120
- completedAt: timestamp,
121
- };
83
+ await this.handleKeyDown(source, event);
84
+ break;
122
85
  }
123
- default:
124
- return null;
125
86
  }
126
87
  }
88
+ async handleClick(source, event) {
89
+ const timestamp = new Date().getTime();
90
+ const pageUrl = source.page.url();
91
+ const selectorForReplay = await this.buildSelectorForReplay(source, event);
92
+ const postCallImageId = await this.savePageScreenshot(source.page);
93
+ const toolCall = {
94
+ id: MiscUtils_1.MiscUtils.createAdHocToolCallId(),
95
+ toolName: ClickTool_1.ClickTool.NAME,
96
+ parameters: {
97
+ selector: selectorForReplay,
98
+ },
99
+ outcome: {
100
+ isSuccessful: true,
101
+ forLlm: 'Clicked the element.',
102
+ metadata: selectorForReplay,
103
+ },
104
+ postCallImageId: postCallImageId,
105
+ page: pageUrl,
106
+ startedAt: timestamp,
107
+ completedAt: timestamp,
108
+ };
109
+ this.donobuFlow.invokedToolCalls.push(toolCall);
110
+ await this.donobuFlow.persistence.saveToolCall(this.donobuFlow.metadata.id, toolCall);
111
+ }
112
+ async handleKeyDown(source, event) {
113
+ const key = event.key;
114
+ if (key.length === 1 || key === 'Enter' || key === 'Backspace') {
115
+ const timestamp = new Date().getTime();
116
+ const pageUrl = source.page.url();
117
+ const selectorForReplay = await this.buildSelectorForReplay(source, event);
118
+ const lastToolCall = this.donobuFlow.invokedToolCalls.at(this.donobuFlow.invokedToolCalls.length - 1);
119
+ if (lastToolCall &&
120
+ this.isCandidateForToolCallMerging(lastToolCall, key, pageUrl, selectorForReplay)) {
121
+ let rewrittenToolCall = null;
122
+ // Do we need to convert the tool type itself?
123
+ if (lastToolCall.toolName === PressKeyTool_1.PressKeyTool.NAME) {
124
+ // Was the last key pressed a normal key press?
125
+ if (lastToolCall.parameters.key.length === 1) {
126
+ // The previous key was not a control character like 'Enter',
127
+ // so we can convert the pressKey tool to an inputText tool.
128
+ // (The inputText tool only supports 'Enter' to finalize the
129
+ // input, not in the middle of input.)
130
+ const amendedText = lastToolCall.parameters.key + (key === 'Enter' ? '' : key);
131
+ rewrittenToolCall = {
132
+ ...lastToolCall,
133
+ toolName: InputTextTool_1.InputTextTool.NAME,
134
+ parameters: {
135
+ text: amendedText,
136
+ append: true,
137
+ finalizeWithSubmit: key === 'Enter',
138
+ },
139
+ outcome: {
140
+ isSuccessful: true,
141
+ forLlm: `Inputted '${amendedText}'`,
142
+ metadata: lastToolCall.outcome.metadata,
143
+ },
144
+ completedAt: timestamp,
145
+ };
146
+ }
147
+ }
148
+ else if (lastToolCall.toolName === InputTextTool_1.InputTextTool.NAME) {
149
+ // Was the last key pressed a normal key press?
150
+ if (lastToolCall.parameters.finalizeWithSubmit !== true) {
151
+ const amendedText = lastToolCall.parameters.text + (key === 'Enter' ? '' : key);
152
+ rewrittenToolCall = {
153
+ ...lastToolCall,
154
+ parameters: {
155
+ text: amendedText,
156
+ append: true,
157
+ finalizeWithSubmit: key === 'Enter',
158
+ },
159
+ outcome: {
160
+ isSuccessful: true,
161
+ forLlm: `Inputted '${amendedText}'`,
162
+ metadata: lastToolCall.outcome.metadata,
163
+ },
164
+ completedAt: timestamp,
165
+ };
166
+ }
167
+ }
168
+ // Phew!
169
+ if (rewrittenToolCall) {
170
+ this.donobuFlow.invokedToolCalls[this.donobuFlow.invokedToolCalls.length - 1] = rewrittenToolCall;
171
+ await this.donobuFlow.persistence.saveToolCall(this.donobuFlow.metadata.id, rewrittenToolCall);
172
+ return;
173
+ }
174
+ }
175
+ // If we are here, it means we did not squish together adjacent key events.
176
+ const postCallImageId = await this.savePageScreenshot(source.page);
177
+ const toolCall = {
178
+ id: MiscUtils_1.MiscUtils.createAdHocToolCallId(),
179
+ toolName: PressKeyTool_1.PressKeyTool.NAME,
180
+ parameters: {
181
+ selector: selectorForReplay,
182
+ key: key,
183
+ },
184
+ outcome: {
185
+ isSuccessful: true,
186
+ forLlm: `Pressed the '${key}' key at the element.`,
187
+ metadata: selectorForReplay,
188
+ },
189
+ postCallImageId: postCallImageId,
190
+ page: pageUrl,
191
+ startedAt: timestamp,
192
+ completedAt: timestamp,
193
+ };
194
+ this.donobuFlow.invokedToolCalls.push(toolCall);
195
+ await this.donobuFlow.persistence.saveToolCall(this.donobuFlow.metadata.id, toolCall);
196
+ }
197
+ }
198
+ async buildSelectorForReplay(source, event) {
199
+ const elementSelectors = event.selectors;
200
+ const frameSelector = source.frame.url() === source.page.url()
201
+ ? null
202
+ : (await PlaywrightUtils_1.PlaywrightUtils.generateSelectors(await source.frame.frameElement()))[0];
203
+ return {
204
+ element: elementSelectors,
205
+ frame: frameSelector,
206
+ };
207
+ }
208
+ isCandidateForToolCallMerging(lastToolCall, key, pageUrl, selectorForReplay) {
209
+ // Is the key itself merge-able?
210
+ if (key === 'Backspace') {
211
+ return false;
212
+ }
213
+ // Is this a merge-able tool call at all?
214
+ if (lastToolCall.toolName !== PressKeyTool_1.PressKeyTool.NAME &&
215
+ lastToolCall.toolName !== InputTextTool_1.InputTextTool.NAME) {
216
+ return false;
217
+ }
218
+ // Are we on the same page as we were before?
219
+ if (lastToolCall.page !== pageUrl) {
220
+ return false;
221
+ }
222
+ // ...and the same frame?
223
+ if (lastToolCall.outcome.metadata?.frame !== selectorForReplay.frame) {
224
+ return false;
225
+ }
226
+ // ...and for the same target element?
227
+ if (JSON.stringify(lastToolCall.outcome.metadata?.element) !==
228
+ JSON.stringify(selectorForReplay.element)) {
229
+ return false;
230
+ }
231
+ // Merge-able!
232
+ return true;
233
+ }
234
+ async savePageScreenshot(page) {
235
+ const postCallImage = await PlaywrightUtils_1.PlaywrightUtils.takeViewportScreenshot(page);
236
+ return await this.donobuFlow.persistence.saveScreenShot(this.donobuFlow.metadata.id, postCallImage);
237
+ }
127
238
  }
128
239
  exports.PageInteractionTracker = PageInteractionTracker;
129
240
  PageInteractionTracker.INIT_SCRIPT = MiscUtils_1.MiscUtils.getResourceFileAsString(path_1.default.join('page-interactions-tracker.js'));
@@ -1 +1 @@
1
- {"version":3,"file":"PageInteractionTracker.js","sourceRoot":"","sources":["../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PageInteractionTracker.js","sourceRoot":"","sources":["../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GptConfigsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/GptConfigsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,aAAa;IAatB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAK1C;gBAGiB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa;IAG/C;;;;;;;;;;;;;;;;;OAiBG;IACU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D;;;;;;OAMG;IACU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D;;;;;;;OAOG;IACU,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhE;;;;;;;;;;OAUG;IACU,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/D;;;OAGG;WACW,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS;CAYhE"}
1
+ {"version":3,"file":"GptConfigsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/GptConfigsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,aAAa;IAatB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAbhC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAK1C;gBAGiB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa;IAG/C;;;;;;;;;;;;;;;;;OAiBG;IACU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5D;;;;;;OAMG;IACU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D;;;;;;;OAOG;IACU,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhE;;;;;;;;;;OAUG;IACU,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/D;;;OAGG;WACW,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS;CAYhE"}
@@ -52,6 +52,8 @@ class GptConfigsApi {
52
52
  throw new GptConfigNotFoundException_1.GptConfigNotFoundException(name);
53
53
  }
54
54
  await this.gptConfigsManager.set(name, parsedBody);
55
+ // Trigger auto-assignment of flow-runner if no configuration is currently assigned
56
+ await this.agentsManager.triggerAutoAssignment();
55
57
  res.json(GptConfigsApi.redactSensativeData(parsedBody));
56
58
  }
57
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"GptConfigsApi.js","sourceRoot":"","sources":["../../../src/apis/GptConfigsApi.ts"],"names":[],"mappings":";;;AAEA,yFAAsF;AACtF,mDAAiE;AAEjE,4CAA4C;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,aAAa;IAYxB,YACmB,iBAAoC,EACpC,aAA4B;QAD5B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,kBAAa,GAAb,aAAa,CAAe;IAC5C,CAAC;IAEJ;;;;;;;;;;;;;;;;;OAiBG;IACI,KAAK,CAAC,GAAG,CAAC,GAAY,EAAE,GAAa;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,UAAU,GAAG,2BAAe,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,uDAA0B,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,GAAG,CAAC,GAAY,EAAE,GAAa;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,mBAAmB,CAC9C,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CACvC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAAC,IAAa,EAAE,GAAa;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YAClD,GAAG;YACH,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC;SACzC,CAAC,CACH,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;OAUG;IACI,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,GAAa;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,wEAAwE;YACxE,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACnE,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE;gBAC/D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBAChD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,kBAAS,CAAC,IAAI,CACZ,0BAA0B,SAAS,8BAA8B,IAAI,GAAG,EACxE,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAS,CAAC,IAAI,CACZ,qDAAqD,IAAI,GAAG,EAC5D,KAAK,CACN,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,MAAiB;QACjD,MAAM,UAAU,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAEjC,KAAK,MAAM,iBAAiB,IAAI,aAAa,CAAC,oBAAoB,EAAE,CAAC;YACnE,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;gBACpC,wDAAwD;gBACvD,UAAkB,CAAC,iBAAiB,CAAC,GAAG,kBAAkB,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;;AAxIH,sCAyIC;AAxIC;;;GAGG;AACqB,kCAAoB,GAAG;IAC7C,QAAQ;IACR,aAAa;IACb,KAAK;IACL,iBAAiB;CAClB,CAAC"}
1
+ {"version":3,"file":"GptConfigsApi.js","sourceRoot":"","sources":["../../../src/apis/GptConfigsApi.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- 1308
1
+ 1322
@@ -3,6 +3,38 @@
3
3
  // Store all elements deemed to be interactive
4
4
  const interactiveElements = new Set();
5
5
 
6
+ // ---- listener-count bookkeeping --------------------------------------
7
+ const listenerCounts = new WeakMap(); // el -> { type: n, … }
8
+ const bumpCount = (el, type, delta) => {
9
+ let map = listenerCounts.get(el);
10
+
11
+ if (!map) {
12
+ if (delta < 0) {
13
+ // nothing to decrement
14
+ return;
15
+ } else {
16
+ map = Object.create(null);
17
+ listenerCounts.set(el, map);
18
+ }
19
+ }
20
+
21
+ map[type] = (map[type] || 0) + delta;
22
+
23
+ if (map[type] <= 0) {
24
+ delete map[type];
25
+ }
26
+
27
+ if (Object.keys(map).length === 0) {
28
+ listenerCounts.delete(el);
29
+ }
30
+ };
31
+
32
+ const totalListenerCount = (el) =>
33
+ (listenerCounts.get(el) &&
34
+ Object.values(listenerCounts.get(el)).reduce((s, n) => s + n, 0)) ||
35
+ 0;
36
+ // ----------------------------------------------------------------------
37
+
6
38
  // Original method references for monkey patching
7
39
  const originalAddEventListener = EventTarget.prototype.addEventListener;
8
40
  const originalRemoveEventListener = EventTarget.prototype.removeEventListener;
@@ -31,7 +63,9 @@
31
63
 
32
64
  // Function to check if an element has interactive CSS properties
33
65
  const hasInteractiveStyling = (element) => {
34
- if (!(element instanceof Element)) return false;
66
+ if (!(element instanceof Element)) {
67
+ return false;
68
+ }
35
69
 
36
70
  try {
37
71
  const computedStyle = window.getComputedStyle(element);
@@ -43,7 +77,7 @@
43
77
  element.getAttribute('role') === 'button' ||
44
78
  element.getAttribute('role') === 'link' ||
45
79
  element.getAttribute('aria-haspopup') === 'true' ||
46
- element.getAttribute('tabindex') === '0' ||
80
+ element.getAttribute('tabindex') >= '0' ||
47
81
  element.getAttribute('contenteditable') === 'true'
48
82
  );
49
83
  } catch (error) {
@@ -53,7 +87,9 @@
53
87
 
54
88
  // Function to check for React-specific attributes that suggest interactivity
55
89
  const hasReactInteractiveProps = (element) => {
56
- if (!(element instanceof Element)) return false;
90
+ if (!(element instanceof Element)) {
91
+ return false;
92
+ }
57
93
 
58
94
  try {
59
95
  // Check for React event handler attributes and data attributes
@@ -112,6 +148,7 @@
112
148
  EventTarget.prototype.addEventListener = function (type, listener, options) {
113
149
  if (pointerEvents.includes(type) && this !== window && this !== document) {
114
150
  interactiveElements.add(this);
151
+ bumpCount(this, type, 1);
115
152
 
116
153
  // If this element is in shadow DOM, ensure it's accessible
117
154
  if (isInShadowDOM(this)) {
@@ -128,15 +165,24 @@
128
165
  return originalAddEventListener.call(this, type, listener, options);
129
166
  };
130
167
 
131
- // Restore original removeEventListener behavior
168
+ // monkey-patch removeEventListener (count only, no deletion here)
132
169
  EventTarget.prototype.removeEventListener = function (
133
170
  type,
134
171
  listener,
135
172
  options,
136
173
  ) {
137
174
  if (pointerEvents.includes(type) && this !== window && this !== document) {
138
- interactiveElements.delete(this);
175
+ bumpCount(this, type, -1);
176
+
177
+ if (
178
+ totalListenerCount(this) <= 0 &&
179
+ !hasInteractiveStyling(this) &&
180
+ !hasReactInteractiveProps(this)
181
+ ) {
182
+ removeFromInteractiveSet(this);
183
+ }
139
184
  }
185
+
140
186
  return originalRemoveEventListener.call(this, type, listener, options);
141
187
  };
142
188
 
@@ -146,6 +192,8 @@
146
192
  // Common interactive element selectors
147
193
  const interactiveSelectors = [
148
194
  'a',
195
+ 'th',
196
+ 'tr',
149
197
  'button',
150
198
  'input',
151
199
  'select',
@@ -205,6 +253,21 @@
205
253
  }
206
254
  };
207
255
 
256
+ const removeFromInteractiveSet = (node) => {
257
+ if (interactiveElements.delete(node) && node.shadowRoot) {
258
+ // also drop any interactive nodes inside a shadow tree
259
+ Array.from(node.shadowRoot.querySelectorAll('*')).forEach((el) =>
260
+ interactiveElements.delete(el),
261
+ );
262
+ }
263
+
264
+ if (node instanceof Element || node instanceof DocumentFragment) {
265
+ node
266
+ .querySelectorAll('*')
267
+ .forEach((child) => interactiveElements.delete(child));
268
+ }
269
+ };
270
+
208
271
  // Initialize MutationObserver safely
209
272
  let observer = null;
210
273
 
@@ -216,9 +279,18 @@
216
279
  let shouldRescan = false;
217
280
 
218
281
  for (const mutation of mutations) {
219
- if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
220
- shouldRescan = true;
221
- break;
282
+ if (mutation.type === 'childList') {
283
+ // detached nodes
284
+ mutation.removedNodes.forEach(removeFromInteractiveSet);
285
+ if (mutation.addedNodes.length > 0) shouldRescan = true;
286
+ } else if (mutation.type === 'attributes') {
287
+ const el = mutation.target;
288
+
289
+ if (hasInteractiveStyling(el) || hasReactInteractiveProps(el)) {
290
+ interactiveElements.add(el);
291
+ } else if (totalListenerCount(el) <= 0) {
292
+ removeFromInteractiveSet(el);
293
+ }
222
294
  }
223
295
  }
224
296
 
@@ -227,10 +299,18 @@
227
299
  }
228
300
  });
229
301
 
230
- // Start observing the document body
231
302
  observer.observe(document.body, {
232
303
  childList: true,
233
304
  subtree: true,
305
+ attributes: true,
306
+ attributeFilter: [
307
+ 'class',
308
+ 'role',
309
+ 'tabindex',
310
+ 'style',
311
+ 'aria-haspopup',
312
+ 'data-donobu-interactable',
313
+ ],
234
314
  });
235
315
  } catch (error) {
236
316
  console.error('Error initializing MutationObserver:', error);
@@ -282,49 +362,6 @@
282
362
  });
283
363
  }
284
364
 
285
- if (!window.__donobu.debugInteractiveElement) {
286
- Object.defineProperty(window.__donobu, 'debugInteractiveElement', {
287
- value: (element) => {
288
- if (!(element instanceof Element)) {
289
- return { isInteractive: false, reason: 'Not a DOM element' };
290
- }
291
-
292
- const reasons = [];
293
-
294
- if (hasInteractiveStyling(element)) {
295
- reasons.push('Has interactive CSS styling');
296
- }
297
-
298
- if (hasReactInteractiveProps(element)) {
299
- reasons.push('Has React interactive props or classes');
300
- }
301
-
302
- // Check common interactive elements
303
- if (
304
- element.tagName === 'A' ||
305
- element.tagName === 'BUTTON' ||
306
- element.tagName === 'INPUT' ||
307
- element.tagName === 'SELECT'
308
- ) {
309
- reasons.push(`Is a ${element.tagName} element`);
310
- }
311
-
312
- // Check if element has an explicit event listener
313
- if (interactiveElements.has(element)) {
314
- reasons.push('Has registered event listener');
315
- }
316
-
317
- return {
318
- isInteractive: reasons.length > 0,
319
- reasons: reasons,
320
- };
321
- },
322
- enumerable: false,
323
- writable: false,
324
- configurable: false,
325
- });
326
- }
327
-
328
365
  // Initialize things safely after DOM content is loaded
329
366
  const initialize = () => {
330
367
  scanForInteractiveElements();
@@ -338,14 +375,4 @@
338
375
  // DOM already ready, initialize now
339
376
  initialize();
340
377
  }
341
-
342
- // Periodically scan for interactive elements (React/SPA behavior)
343
- const rescanInterval = 2000; // milliseconds
344
- setInterval(() => {
345
- try {
346
- scanForInteractiveElements();
347
- } catch (error) {
348
- console.error('Error during periodic scan:', error);
349
- }
350
- }, rescanInterval);
351
378
  })();