donobu 5.61.3 → 5.63.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.
Files changed (37) hide show
  1. package/dist/cli/donobu-cli.js +2 -1
  2. package/dist/esm/cli/donobu-cli.js +2 -1
  3. package/dist/esm/lib/test/testExtension.js +7 -4
  4. package/dist/esm/lib/test/utils/triageTestFailure.d.ts +0 -7
  5. package/dist/esm/lib/test/utils/triageTestFailure.js +2 -13
  6. package/dist/esm/main.d.ts +2 -1
  7. package/dist/esm/main.js +4 -1
  8. package/dist/esm/managers/DonobuFlowsManager.d.ts +1 -1
  9. package/dist/esm/managers/DonobuFlowsManager.js +4 -3
  10. package/dist/esm/persistence/flows/FlowsPersistence.d.ts +40 -0
  11. package/dist/esm/persistence/flows/FlowsPersistence.js +41 -0
  12. package/dist/esm/persistence/flows/FlowsPersistenceDonobuApi.d.ts +1 -1
  13. package/dist/esm/persistence/flows/FlowsPersistenceDonobuApi.js +3 -3
  14. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.d.ts +1 -3
  15. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.js +6 -7
  16. package/dist/esm/utils/Logger.d.ts +22 -0
  17. package/dist/esm/utils/Logger.js +39 -11
  18. package/dist/esm/utils/PageLogListeners.d.ts +30 -10
  19. package/dist/esm/utils/PageLogListeners.js +37 -21
  20. package/dist/lib/test/testExtension.js +7 -4
  21. package/dist/lib/test/utils/triageTestFailure.d.ts +0 -7
  22. package/dist/lib/test/utils/triageTestFailure.js +2 -13
  23. package/dist/main.d.ts +2 -1
  24. package/dist/main.js +4 -1
  25. package/dist/managers/DonobuFlowsManager.d.ts +1 -1
  26. package/dist/managers/DonobuFlowsManager.js +4 -3
  27. package/dist/persistence/flows/FlowsPersistence.d.ts +40 -0
  28. package/dist/persistence/flows/FlowsPersistence.js +41 -0
  29. package/dist/persistence/flows/FlowsPersistenceDonobuApi.d.ts +1 -1
  30. package/dist/persistence/flows/FlowsPersistenceDonobuApi.js +3 -3
  31. package/dist/persistence/flows/FlowsPersistenceSqlite.d.ts +1 -3
  32. package/dist/persistence/flows/FlowsPersistenceSqlite.js +6 -7
  33. package/dist/utils/Logger.d.ts +22 -0
  34. package/dist/utils/Logger.js +39 -11
  35. package/dist/utils/PageLogListeners.d.ts +30 -10
  36. package/dist/utils/PageLogListeners.js +37 -21
  37. package/package.json +1 -1
@@ -3,18 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerPageLogListeners = registerPageLogListeners;
4
4
  const Logger_1 = require("./Logger");
5
5
  /**
6
- * Registers Playwright page event listeners that route browser console messages
7
- * and network request/response data to the {@link browserLogger} and
8
- * {@link networkLogger} Winston loggers. These loggers include a
9
- * {@link FlowLogBufferTransport} that captures entries into the per-flow
10
- * log buffer (when one is available via AsyncLocalStorage or the process-local
11
- * fallback).
6
+ * Registers Playwright page event listeners that route browser console
7
+ * messages and network request/response data to the {@link browserLogger}
8
+ * and {@link networkLogger} Winston loggers, whose
9
+ * {@link FlowLogBufferTransport} captures entries into a per-flow log
10
+ * buffer. Called from both {@link WebTargetInspector.handleNewPage}
11
+ * (Studio-launched flows) and the Playwright test extension fixture.
12
12
  *
13
- * This function is called from both {@link WebTargetInspector.handleNewPage}
14
- * (Studio-launched flows) and the Playwright test extension fixture, ensuring
15
- * identical logging behaviour across both runtime contexts.
13
+ * By default, entries are routed by the ambient AsyncLocalStorage logging
14
+ * context (or the process-local fallback). Pass `opts` to bind this page's
15
+ * listeners to an explicit flow + buffer instead. That binding is required
16
+ * whenever one test drives multiple pages with distinct flows (e.g.
17
+ * multi-user collab tests): the ambient context belongs to the primary
18
+ * page's flow, so an unbound secondary page would leak its entries —
19
+ * stamped with the wrong flowId — into the primary flow's buffer.
20
+ *
21
+ * The binding is stamped onto each entry's meta at emit time (see
22
+ * {@link FLOW_LOG_ROUTING}) rather than scoped via AsyncLocalStorage:
23
+ * winston defers format + transport delivery under backpressure, so
24
+ * ALS-based scoping would resolve against whatever context is live at drain
25
+ * time and silently misroute entries during synchronous log bursts.
16
26
  */
17
- function registerPageLogListeners(page) {
27
+ function registerPageLogListeners(page, opts) {
28
+ const routing = opts
29
+ ? { [Logger_1.FLOW_LOG_ROUTING]: { flowId: opts.flowId, logBuffer: opts.logBuffer } }
30
+ : undefined;
31
+ // Merge the routing stamp into a log call's meta. Leaves the unbound
32
+ // call path byte-identical (meta stays undefined when both are absent).
33
+ const stamp = (meta) => routing ? { ...meta, ...routing } : meta;
18
34
  page.on('console', (msg) => {
19
35
  const { url, lineNumber, columnNumber } = msg.location();
20
36
  const hasSourceLocation = lineNumber !== 0 || columnNumber !== 0;
@@ -25,24 +41,24 @@ function registerPageLogListeners(page) {
25
41
  : undefined;
26
42
  switch (msg.type()) {
27
43
  case 'error':
28
- Logger_1.browserLogger.error(msg.text(), meta);
44
+ Logger_1.browserLogger.error(msg.text(), stamp(meta));
29
45
  break;
30
46
  case 'warning':
31
- Logger_1.browserLogger.warn(msg.text(), meta);
47
+ Logger_1.browserLogger.warn(msg.text(), stamp(meta));
32
48
  break;
33
49
  case 'debug':
34
- Logger_1.browserLogger.debug(msg.text(), meta);
50
+ Logger_1.browserLogger.debug(msg.text(), stamp(meta));
35
51
  break;
36
52
  default:
37
- Logger_1.browserLogger.info(msg.text(), meta);
53
+ Logger_1.browserLogger.info(msg.text(), stamp(meta));
38
54
  break;
39
55
  }
40
56
  });
41
57
  page.on('pageerror', (error) => {
42
- Logger_1.browserLogger.error(error.message, {
58
+ Logger_1.browserLogger.error(error.message, stamp({
43
59
  stack: error.stack,
44
60
  url: page.url(),
45
- });
61
+ }));
46
62
  });
47
63
  // Fallback timing: track request start times keyed by the Request object
48
64
  // itself (via WeakMap) so concurrent requests to the same URL don't collide.
@@ -71,24 +87,24 @@ function registerPageLogListeners(page) {
71
87
  resourceType: request.resourceType(),
72
88
  };
73
89
  if (status >= 500) {
74
- Logger_1.networkLogger.error(request.url(), meta);
90
+ Logger_1.networkLogger.error(request.url(), stamp(meta));
75
91
  }
76
92
  else if (status >= 400) {
77
- Logger_1.networkLogger.warn(request.url(), meta);
93
+ Logger_1.networkLogger.warn(request.url(), stamp(meta));
78
94
  }
79
95
  else {
80
- Logger_1.networkLogger.info(request.url(), meta);
96
+ Logger_1.networkLogger.info(request.url(), stamp(meta));
81
97
  }
82
98
  });
83
99
  page.on('requestfailed', (request) => {
84
100
  const duration = getDuration(request);
85
- Logger_1.networkLogger.error(`${request.url()} FAILED: ${request.failure()?.errorText}`, {
101
+ Logger_1.networkLogger.error(`${request.url()} FAILED: ${request.failure()?.errorText}`, stamp({
86
102
  method: request.method(),
87
103
  url: request.url(),
88
104
  resourceType: request.resourceType(),
89
105
  failureReason: request.failure()?.errorText,
90
106
  duration,
91
- });
107
+ }));
92
108
  });
93
109
  }
94
110
  //# sourceMappingURL=PageLogListeners.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "donobu",
3
- "version": "5.61.3",
3
+ "version": "5.63.0",
4
4
  "description": "Create browser automations with an LLM agent and replay them as Playwright scripts.",
5
5
  "main": "dist/main.js",
6
6
  "module": "dist/esm/main.js",