@farmslot/protocol 0.76.0 → 0.78.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 (168) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/client-cache/cache.d.ts.map +1 -1
  3. package/dist/client-cache/cache.js +174 -14
  4. package/dist/client-cache/cache.js.map +1 -1
  5. package/dist/client-cache/command-method.d.ts +1 -1
  6. package/dist/client-cache/command-method.d.ts.map +1 -1
  7. package/dist/client-cache/command-method.js +3 -0
  8. package/dist/client-cache/command-method.js.map +1 -1
  9. package/dist/client-cache/index.d.ts +1 -1
  10. package/dist/client-cache/index.d.ts.map +1 -1
  11. package/dist/client-cache/index.js +1 -1
  12. package/dist/client-cache/index.js.map +1 -1
  13. package/dist/client-cache/native-history.d.ts.map +1 -1
  14. package/dist/client-cache/native-history.js +1 -0
  15. package/dist/client-cache/native-history.js.map +1 -1
  16. package/dist/client-cache/prefetch.d.ts +13 -1
  17. package/dist/client-cache/prefetch.d.ts.map +1 -1
  18. package/dist/client-cache/prefetch.js +88 -26
  19. package/dist/client-cache/prefetch.js.map +1 -1
  20. package/dist/client-cache/read-stored.d.ts +5 -1
  21. package/dist/client-cache/read-stored.d.ts.map +1 -1
  22. package/dist/client-cache/read-stored.js +64 -1
  23. package/dist/client-cache/read-stored.js.map +1 -1
  24. package/dist/client-cache/registry.d.ts +29 -1
  25. package/dist/client-cache/registry.d.ts.map +1 -1
  26. package/dist/client-cache/registry.js +55 -4
  27. package/dist/client-cache/registry.js.map +1 -1
  28. package/dist/client-cache/store.d.ts +2 -0
  29. package/dist/client-cache/store.d.ts.map +1 -1
  30. package/dist/client-cache/store.js +9 -1
  31. package/dist/client-cache/store.js.map +1 -1
  32. package/dist/client-cache/transport.d.ts +3 -1
  33. package/dist/client-cache/transport.d.ts.map +1 -1
  34. package/dist/client-cache/transport.js +2 -1
  35. package/dist/client-cache/transport.js.map +1 -1
  36. package/dist/client-cache/types.d.ts +8 -1
  37. package/dist/client-cache/types.d.ts.map +1 -1
  38. package/dist/contracts/agents.d.ts +5 -2
  39. package/dist/contracts/agents.d.ts.map +1 -1
  40. package/dist/contracts/agents.js.map +1 -1
  41. package/dist/contracts/config.d.ts +3 -0
  42. package/dist/contracts/config.d.ts.map +1 -1
  43. package/dist/contracts/config.js +5 -1
  44. package/dist/contracts/config.js.map +1 -1
  45. package/dist/contracts/family.d.ts +55 -3
  46. package/dist/contracts/family.d.ts.map +1 -1
  47. package/dist/contracts/family.js.map +1 -1
  48. package/dist/contracts/review-workspace.d.ts +23 -1
  49. package/dist/contracts/review-workspace.d.ts.map +1 -1
  50. package/dist/contracts/review-workspace.js +3 -0
  51. package/dist/contracts/review-workspace.js.map +1 -1
  52. package/dist/contracts/reviews.d.ts +1 -0
  53. package/dist/contracts/reviews.d.ts.map +1 -1
  54. package/dist/contracts/reviews.js.map +1 -1
  55. package/dist/contracts/runs.d.ts +50 -10
  56. package/dist/contracts/runs.d.ts.map +1 -1
  57. package/dist/contracts/runs.js.map +1 -1
  58. package/dist/contracts/runtime-capabilities.d.ts +9 -0
  59. package/dist/contracts/runtime-capabilities.d.ts.map +1 -1
  60. package/dist/contracts/runtime-capabilities.js.map +1 -1
  61. package/dist/contracts/slot-recovery.d.ts +2 -2
  62. package/dist/contracts/slot-recovery.d.ts.map +1 -1
  63. package/dist/contracts/slot-recovery.js +5 -3
  64. package/dist/contracts/slot-recovery.js.map +1 -1
  65. package/dist/index.d.ts +3 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/performance/client.d.ts +18 -0
  70. package/dist/performance/client.d.ts.map +1 -0
  71. package/dist/performance/client.js +66 -0
  72. package/dist/performance/client.js.map +1 -0
  73. package/dist/performance/histogram.d.ts +5 -0
  74. package/dist/performance/histogram.d.ts.map +1 -0
  75. package/dist/performance/histogram.js +38 -0
  76. package/dist/performance/histogram.js.map +1 -0
  77. package/dist/performance/index.d.ts +10 -0
  78. package/dist/performance/index.d.ts.map +1 -0
  79. package/dist/performance/index.js +10 -0
  80. package/dist/performance/index.js.map +1 -0
  81. package/dist/performance/paint.d.ts +3 -0
  82. package/dist/performance/paint.d.ts.map +1 -0
  83. package/dist/performance/paint.js +14 -0
  84. package/dist/performance/paint.js.map +1 -0
  85. package/dist/performance/prometheus.d.ts +3 -0
  86. package/dist/performance/prometheus.d.ts.map +1 -0
  87. package/dist/performance/prometheus.js +53 -0
  88. package/dist/performance/prometheus.js.map +1 -0
  89. package/dist/performance/ranking.d.ts +26 -0
  90. package/dist/performance/ranking.d.ts.map +1 -0
  91. package/dist/performance/ranking.js +92 -0
  92. package/dist/performance/ranking.js.map +1 -0
  93. package/dist/performance/recorder.d.ts +43 -0
  94. package/dist/performance/recorder.d.ts.map +1 -0
  95. package/dist/performance/recorder.js +352 -0
  96. package/dist/performance/recorder.js.map +1 -0
  97. package/dist/performance/types.d.ts +93 -0
  98. package/dist/performance/types.d.ts.map +1 -0
  99. package/dist/performance/types.js +40 -0
  100. package/dist/performance/types.js.map +1 -0
  101. package/dist/performance/validation.d.ts +3 -0
  102. package/dist/performance/validation.d.ts.map +1 -0
  103. package/dist/performance/validation.js +55 -0
  104. package/dist/performance/validation.js.map +1 -0
  105. package/dist/recipes/step-io.d.ts +2 -0
  106. package/dist/recipes/step-io.d.ts.map +1 -1
  107. package/dist/recipes/step-io.js.map +1 -1
  108. package/dist/rpc/auth.d.ts +1 -0
  109. package/dist/rpc/auth.d.ts.map +1 -1
  110. package/dist/rpc/auth.js.map +1 -1
  111. package/dist/rpc/fs.d.ts +2 -0
  112. package/dist/rpc/fs.d.ts.map +1 -1
  113. package/dist/rpc/fs.js +2 -0
  114. package/dist/rpc/fs.js.map +1 -1
  115. package/dist/rpc/index.d.ts +1 -0
  116. package/dist/rpc/index.d.ts.map +1 -1
  117. package/dist/rpc/index.js +1 -0
  118. package/dist/rpc/index.js.map +1 -1
  119. package/dist/rpc/native-session.d.ts +17 -0
  120. package/dist/rpc/native-session.d.ts.map +1 -1
  121. package/dist/rpc/native-session.js.map +1 -1
  122. package/dist/rpc/performance.d.ts +6 -0
  123. package/dist/rpc/performance.d.ts.map +1 -0
  124. package/dist/rpc/performance.js +2 -0
  125. package/dist/rpc/performance.js.map +1 -0
  126. package/dist/rpc/registry.d.ts +3 -0
  127. package/dist/rpc/registry.d.ts.map +1 -1
  128. package/dist/rpc/registry.js +3 -0
  129. package/dist/rpc/registry.js.map +1 -1
  130. package/dist/rpc/run.d.ts +4 -0
  131. package/dist/rpc/run.d.ts.map +1 -1
  132. package/dist/rpc/runtime-capabilities.d.ts +6 -0
  133. package/dist/rpc/runtime-capabilities.d.ts.map +1 -1
  134. package/dist/rpc/runtime-capabilities.js.map +1 -1
  135. package/dist/rpc/slot.d.ts +2 -0
  136. package/dist/rpc/slot.d.ts.map +1 -1
  137. package/dist/rpc/tmux.d.ts +1 -1
  138. package/dist/rpc/tmux.d.ts.map +1 -1
  139. package/dist/runs/list-trim.d.ts.map +1 -1
  140. package/dist/runs/list-trim.js +1 -19
  141. package/dist/runs/list-trim.js.map +1 -1
  142. package/dist/runs/review-retries.d.ts +8 -2
  143. package/dist/runs/review-retries.d.ts.map +1 -1
  144. package/dist/runs/review-retries.js +140 -2
  145. package/dist/runs/review-retries.js.map +1 -1
  146. package/dist/surfaces/run-view-state.d.ts +22 -0
  147. package/dist/surfaces/run-view-state.d.ts.map +1 -0
  148. package/dist/surfaces/run-view-state.js +26 -0
  149. package/dist/surfaces/run-view-state.js.map +1 -0
  150. package/dist/surfaces/view-links.d.ts +1 -1
  151. package/dist/surfaces/view-links.d.ts.map +1 -1
  152. package/dist/surfaces/view-links.js +146 -17
  153. package/dist/surfaces/view-links.js.map +1 -1
  154. package/dist/surfaces/view-state.d.ts +50 -0
  155. package/dist/surfaces/view-state.d.ts.map +1 -0
  156. package/dist/surfaces/view-state.js +181 -0
  157. package/dist/surfaces/view-state.js.map +1 -0
  158. package/dist/transport/gateway-recovery.d.ts +39 -0
  159. package/dist/transport/gateway-recovery.d.ts.map +1 -0
  160. package/dist/transport/gateway-recovery.js +134 -0
  161. package/dist/transport/gateway-recovery.js.map +1 -0
  162. package/dist/utf8-byte-length.d.ts +2 -0
  163. package/dist/utf8-byte-length.d.ts.map +1 -0
  164. package/dist/utf8-byte-length.js +22 -0
  165. package/dist/utf8-byte-length.js.map +1 -0
  166. package/dist/version.d.ts +1 -1
  167. package/dist/version.js +1 -1
  168. package/package.json +6 -1
package/dist/index.js CHANGED
@@ -55,9 +55,12 @@ export * from './sources/status-view.js';
55
55
  export * from './sources/validation.js';
56
56
  export * from './surfaces/account-session.js';
57
57
  export * from './surfaces/command-center.js';
58
+ export * from './surfaces/run-view-state.js';
59
+ export * from './surfaces/view-state.js';
58
60
  export * from './text-order.js';
59
61
  export * from './transport/events.js';
60
62
  export * from './transport/frames.js';
63
+ export * from './transport/gateway-recovery.js';
61
64
  export * from './transport/gateway-tls.js';
62
65
  export * from './transport/observations.js';
63
66
  export * from './transport/signal.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,cAAc,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { PerformanceRecorder } from './recorder.js';
2
+ import type { ClientPerformanceReportResult, PerformanceActionClass } from './types.js';
3
+ export declare function performanceActionClass(method: string): PerformanceActionClass;
4
+ export declare function isPerformanceMethod(method: string): boolean;
5
+ export declare class PerformanceReporter {
6
+ private metrics;
7
+ private ready;
8
+ private send;
9
+ private timer;
10
+ private disposed;
11
+ private timerEpoch;
12
+ private readonly stopActivity;
13
+ constructor(metrics: PerformanceRecorder, ready: () => boolean, send: (report: unknown) => Promise<ClientPerformanceReportResult>);
14
+ schedule(): void;
15
+ private flush;
16
+ dispose(): void;
17
+ }
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/performance/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAExF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAE7E;AACD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI3D;AACD,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,IAAI;IAPd,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;gBAEhC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,MAAM,OAAO,EACpB,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,6BAA6B,CAAC;IAI3E,QAAQ,IAAI,IAAI;YAgBF,KAAK;IAgBnB,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,66 @@
1
+ import { GATEWAY_COMMAND_METHODS } from '../client-cache/command-method.js';
2
+ import { Methods } from '../rpc/registry.js';
3
+ const commands = new Set(GATEWAY_COMMAND_METHODS);
4
+ export function performanceActionClass(method) {
5
+ return commands.has(method) ? 'gate-action' : 'interactive-read';
6
+ }
7
+ export function isPerformanceMethod(method) {
8
+ return (method === Methods.GATEWAY_PERFORMANCE_GET || method === Methods.GATEWAY_PERFORMANCE_REPORT);
9
+ }
10
+ export class PerformanceReporter {
11
+ constructor(metrics, ready, send) {
12
+ this.metrics = metrics;
13
+ this.ready = ready;
14
+ this.send = send;
15
+ this.disposed = false;
16
+ this.timerEpoch = 0;
17
+ this.stopActivity = metrics.onActivity(() => this.schedule());
18
+ }
19
+ schedule() {
20
+ if (this.timer && this.timerEpoch !== this.metrics.epoch) {
21
+ clearTimeout(this.timer);
22
+ this.timer = undefined;
23
+ }
24
+ if (this.disposed || this.timer || !this.ready())
25
+ return;
26
+ this.timerEpoch = this.metrics.epoch;
27
+ const epoch = this.metrics.epoch;
28
+ this.timer = setTimeout(() => {
29
+ this.timer = undefined;
30
+ if (!this.ready() || epoch !== this.metrics.epoch)
31
+ return;
32
+ void this.flush();
33
+ }, 30000);
34
+ // Node-based CLI/tests do not stay alive for a telemetry flush.
35
+ if (typeof this.timer === 'object' && 'unref' in this.timer)
36
+ this.timer.unref();
37
+ }
38
+ async flush() {
39
+ const epoch = this.metrics.epoch, report = this.metrics.beginReport();
40
+ if (!report)
41
+ return;
42
+ try {
43
+ const result = await this.send(report);
44
+ if (epoch !== this.metrics.epoch)
45
+ return;
46
+ if (result.accepted)
47
+ this.metrics.acknowledge(report.sequence);
48
+ else
49
+ this.metrics.expireReportSource();
50
+ }
51
+ catch {
52
+ // Preserve the identical chunk for an idempotent retry after a lost response.
53
+ if (epoch === this.metrics.epoch)
54
+ this.metrics.increment('farmslot_client_report_failures_total', {});
55
+ }
56
+ if (epoch === this.metrics.epoch)
57
+ this.schedule();
58
+ }
59
+ dispose() {
60
+ this.disposed = true;
61
+ this.stopActivity();
62
+ clearTimeout(this.timer);
63
+ this.timer = undefined;
64
+ }
65
+ }
66
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/performance/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type PerformanceBudgetVerdict, type PerformanceHistogram, type PerformanceSnapshot } from './types.js';
2
+ /** UI estimate only. Budget verdicts use the exact threshold bucket. */
3
+ export declare function histogramPercentile(histogram: PerformanceHistogram, quantile: number): number;
4
+ export declare function performanceBudgetVerdicts(snapshot: PerformanceSnapshot): PerformanceBudgetVerdict[];
5
+ //# sourceMappingURL=histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.d.ts","sourceRoot":"","sources":["../../src/performance/histogram.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM7F;AACD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,mBAAmB,GAC5B,wBAAwB,EAAE,CA+B5B"}
@@ -0,0 +1,38 @@
1
+ import { HISTOGRAM_METRICS, PERFORMANCE_BUDGETS, } from './types.js';
2
+ /** UI estimate only. Budget verdicts use the exact threshold bucket. */
3
+ export function histogramPercentile(histogram, quantile) {
4
+ if (!histogram.count)
5
+ return 0;
6
+ const index = histogram.buckets.findIndex((count) => count >= Math.ceil(histogram.count * quantile));
7
+ return HISTOGRAM_METRICS[histogram.name][index] ?? histogram.max;
8
+ }
9
+ export function performanceBudgetVerdicts(snapshot) {
10
+ return snapshot.histograms.flatMap((histogram) => {
11
+ const actionClass = histogram.labels.action_class;
12
+ if (!actionClass ||
13
+ histogram.name.endsWith('_bytes') ||
14
+ histogram.name.endsWith('_age_seconds'))
15
+ return [];
16
+ const budgetSeconds = PERFORMANCE_BUDGETS[actionClass];
17
+ const index = HISTOGRAM_METRICS[histogram.name].findIndex((value) => value === budgetSeconds);
18
+ const withinBudget = histogram.buckets[index] ?? 0;
19
+ return [
20
+ {
21
+ metric: histogram.name,
22
+ cacheSource: histogram.labels.cache_source,
23
+ method: histogram.labels.method,
24
+ actionClass,
25
+ source: histogram.labels.side ?? 'unknown',
26
+ count: histogram.count,
27
+ withinBudget,
28
+ budgetSeconds,
29
+ status: histogram.count < 20 || snapshot.dropped > 0
30
+ ? 'unmeasured'
31
+ : withinBudget * 20 >= histogram.count * 19
32
+ ? 'pass'
33
+ : 'fail',
34
+ },
35
+ ];
36
+ });
37
+ }
38
+ //# sourceMappingURL=histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../src/performance/histogram.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAIpB,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CAAC,SAA+B,EAAE,QAAgB;IACnF,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAC1D,CAAC;IACF,OAAO,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC;AACnE,CAAC;AACD,MAAM,UAAU,yBAAyB,CACvC,QAA6B;IAE7B,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/C,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;QAClD,IACE,CAAC,WAAW;YACZ,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAEvC,OAAO,EAAE,CAAC;QACZ,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC;QAC9F,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO;YACL;gBACE,MAAM,EAAE,SAAS,CAAC,IAAI;gBACtB,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY;gBAC1C,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;gBAC/B,WAAW;gBACX,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS;gBAC1C,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,YAAY;gBACZ,aAAa;gBACb,MAAM,EACJ,SAAS,CAAC,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC;oBAC1C,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,YAAY,GAAG,EAAE,IAAI,SAAS,CAAC,KAAK,GAAG,EAAE;wBACzC,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,MAAM;aACf;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from '../utf8-byte-length.js';
2
+ export * from './client.js';
3
+ export * from './histogram.js';
4
+ export * from './paint.js';
5
+ export * from './prometheus.js';
6
+ export * from './ranking.js';
7
+ export * from './recorder.js';
8
+ export * from './types.js';
9
+ export * from './validation.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from '../utf8-byte-length.js';
2
+ export * from './client.js';
3
+ export * from './histogram.js';
4
+ export * from './paint.js';
5
+ export * from './prometheus.js';
6
+ export * from './ranking.js';
7
+ export * from './recorder.js';
8
+ export * from './types.js';
9
+ export * from './validation.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Two frames allow the subscriber's queued render and its first data paint. */
2
+ export declare function afterForegroundPaint(callback: () => void): (() => void) | undefined;
3
+ //# sourceMappingURL=paint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/performance/paint.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAcnF"}
@@ -0,0 +1,14 @@
1
+ /** Two frames allow the subscriber's queued render and its first data paint. */
2
+ export function afterForegroundPaint(callback) {
3
+ const host = globalThis;
4
+ if (!host.requestAnimationFrame ||
5
+ !host.cancelAnimationFrame ||
6
+ (host.document && host.document.visibilityState !== 'visible'))
7
+ return undefined;
8
+ const frame = host.requestAnimationFrame.bind(host), cancel = host.cancelAnimationFrame.bind(host);
9
+ let handle = frame(() => {
10
+ handle = frame(callback);
11
+ });
12
+ return () => cancel(handle);
13
+ }
14
+ //# sourceMappingURL=paint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.js","sourceRoot":"","sources":["../../src/performance/paint.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,QAAoB;IACvD,MAAM,IAAI,GAAG,UAAuB,CAAC;IACrC,IACE,CAAC,IAAI,CAAC,qBAAqB;QAC3B,CAAC,IAAI,CAAC,oBAAoB;QAC1B,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC;QAE9D,OAAO,SAAS,CAAC;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACjD,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE;QACtB,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type PerformanceSnapshot } from './types.js';
2
+ export declare function renderPrometheus(snapshot: PerformanceSnapshot): string;
3
+ //# sourceMappingURL=prometheus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prometheus.d.ts","sourceRoot":"","sources":["../../src/performance/prometheus.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAcjG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CA4CtE"}
@@ -0,0 +1,53 @@
1
+ import { HISTOGRAM_METRICS } from './types.js';
2
+ function escapeLabel(value) {
3
+ return value.replaceAll('\\', '\\\\').replaceAll('\n', '\\n').replaceAll('"', '\\"');
4
+ }
5
+ function labels(value, bound) {
6
+ const pairs = Object.entries(value)
7
+ .filter(([, v]) => v !== undefined)
8
+ .map(([k, v]) => `${k}="${escapeLabel(String(v))}"`);
9
+ if (bound !== undefined)
10
+ pairs.push(`le="${bound}"`);
11
+ return pairs.length ? `{${pairs.join(',')}}` : '';
12
+ }
13
+ export function renderPrometheus(snapshot) {
14
+ const output = [];
15
+ const declared = new Set();
16
+ function type(name, kind) {
17
+ if (!declared.has(name)) {
18
+ declared.add(name);
19
+ output.push(`# TYPE ${name} ${kind}`);
20
+ }
21
+ }
22
+ for (const row of snapshot.histograms) {
23
+ type(row.name, 'histogram');
24
+ const bounds = HISTOGRAM_METRICS[row.name];
25
+ row.buckets.forEach((count, i) => output.push(`${row.name}_bucket${labels(row.labels, String(bounds[i] ?? '+Inf'))} ${count}`));
26
+ output.push(`${row.name}_count${labels(row.labels)} ${row.count}`, `${row.name}_sum${labels(row.labels)} ${row.sum}`);
27
+ type(`${row.name}_max`, 'gauge');
28
+ output.push(`${row.name}_max${labels(row.labels)} ${row.max}`);
29
+ }
30
+ for (const row of snapshot.counters) {
31
+ type(row.name, 'counter');
32
+ output.push(`${row.name}${labels(row.labels)} ${row.value}`);
33
+ }
34
+ for (const row of snapshot.gauges) {
35
+ type(row.name, 'gauge');
36
+ output.push(`${row.name}${labels(row.labels)} ${row.value}`);
37
+ }
38
+ for (const window of snapshot.clientWindows ?? []) {
39
+ const source = labels({ side: window.side, source: window.id });
40
+ for (const [name, value] of [
41
+ ['farmslot_client_window_start_seconds', window.startedAtMs],
42
+ ['farmslot_client_window_observed_seconds', window.observedAtMs],
43
+ ['farmslot_client_window_received_seconds', window.receivedAtMs],
44
+ ]) {
45
+ type(name, 'gauge');
46
+ output.push(`${name}${source} ${value / 1000}`);
47
+ }
48
+ }
49
+ type('farmslot_metrics_dropped_total', 'counter');
50
+ output.push(`farmslot_metrics_dropped_total ${snapshot.dropped}`);
51
+ return output.join('\n') + '\n';
52
+ }
53
+ //# sourceMappingURL=prometheus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prometheus.js","sourceRoot":"","sources":["../../src/performance/prometheus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PerformanceActionClass, PerformanceLabels, PerformanceSide, PerformanceSnapshot } from './types.js';
2
+ export interface SlowAction {
3
+ cacheSource?: PerformanceLabels['cache_source'];
4
+ phase: string;
5
+ bytesMeasured: boolean;
6
+ budgetSeconds?: number;
7
+ budgetStatus?: string;
8
+ processesMeasured: boolean;
9
+ method: string;
10
+ side: PerformanceSide;
11
+ actionClass?: PerformanceActionClass;
12
+ count: number;
13
+ p50: number;
14
+ p95: number;
15
+ max: number;
16
+ bytes: number;
17
+ execCount: number;
18
+ execSeconds: number;
19
+ nodeCount: number;
20
+ nodeSeconds: number;
21
+ nodeWaitSeconds: number;
22
+ loopLagSeconds: number;
23
+ causes: string[];
24
+ }
25
+ export declare function slowestActions(snapshot: PerformanceSnapshot): SlowAction[];
26
+ //# sourceMappingURL=ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../src/performance/ranking.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AACD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,UAAU,EAAE,CAmG1E"}
@@ -0,0 +1,92 @@
1
+ import { histogramPercentile, performanceBudgetVerdicts } from './histogram.js';
2
+ export function slowestActions(snapshot) {
3
+ const costs = new Map();
4
+ const responseBytes = new Map();
5
+ const identity = (labels) => `${labels.side ?? 'gateway'}|${labels.method ?? '_unknown'}`;
6
+ const responseIdentity = (labels) => `${identity(labels)}|${labels.action_class ?? ''}`;
7
+ const add = (labels, name, value, max = false) => {
8
+ const key = identity(labels);
9
+ let values = costs.get(key);
10
+ if (!values) {
11
+ values = new Map();
12
+ costs.set(key, values);
13
+ }
14
+ values.set(name, max ? Math.max(values.get(name) ?? 0, value) : (values.get(name) ?? 0) + value);
15
+ };
16
+ for (const counter of snapshot.counters)
17
+ add(counter.labels, counter.name, counter.value);
18
+ for (const histogram of snapshot.histograms) {
19
+ if (histogram.name === 'farmslot_rpc_response_bytes')
20
+ responseBytes.set(responseIdentity(histogram.labels), (responseBytes.get(responseIdentity(histogram.labels)) ?? 0) + histogram.sum);
21
+ if (histogram.name === 'farmslot_event_loop_lag_seconds')
22
+ add(histogram.labels, 'lag', histogram.max, true);
23
+ }
24
+ const phases = {
25
+ farmslot_rpc_duration_seconds: 'RPC',
26
+ farmslot_client_cached_paint_seconds: 'Cached paint',
27
+ farmslot_client_visible_read_seconds: 'Visible read',
28
+ farmslot_client_background_refresh_seconds: 'Background refresh',
29
+ farmslot_client_blocking_refresh_seconds: 'Blocking refresh',
30
+ };
31
+ const verdictKey = (name, labels) => [
32
+ name,
33
+ labels.side ?? 'gateway',
34
+ labels.method ?? '_unknown',
35
+ labels.action_class,
36
+ labels.cache_source,
37
+ ].join('|');
38
+ const verdicts = new Map(performanceBudgetVerdicts(snapshot).map((v) => [
39
+ [v.metric, v.source, v.method ?? '_unknown', v.actionClass, v.cacheSource].join('|'),
40
+ v,
41
+ ]));
42
+ return snapshot.histograms
43
+ .filter((r) => Object.hasOwn(phases, r.name))
44
+ .map((row) => {
45
+ const phase = phases[row.name];
46
+ const bytesMeasured = row.name === 'farmslot_rpc_duration_seconds' &&
47
+ responseBytes.has(responseIdentity(row.labels));
48
+ const verdict = verdicts.get(verdictKey(row.name, row.labels));
49
+ const { method = '_unknown', side = 'gateway', action_class } = row.labels;
50
+ const values = costs.get(identity(row.labels));
51
+ const value = (name) => values?.get(name) ?? 0;
52
+ const bytes = bytesMeasured ? (responseBytes.get(responseIdentity(row.labels)) ?? 0) : 0, execCount = value('farmslot_exec_calls_total'), execSeconds = value('farmslot_exec_seconds_total');
53
+ const nodeCount = value('farmslot_node_calls_total'), nodeSeconds = value('farmslot_node_seconds_total'), nodeWaitSeconds = value('farmslot_node_wait_seconds_total');
54
+ const loopLagSeconds = value('lag');
55
+ const causes = [];
56
+ if (bytes / row.count > 131072)
57
+ causes.push('payload');
58
+ if (execCount)
59
+ causes.push('spawned processes');
60
+ if (nodeSeconds || nodeWaitSeconds)
61
+ causes.push('node wait');
62
+ if (loopLagSeconds > 0.1)
63
+ causes.push('event-loop stall');
64
+ if (!causes.length)
65
+ causes.push(bytesMeasured ? 'inspect handler' : phase);
66
+ return {
67
+ cacheSource: row.labels.cache_source,
68
+ phase,
69
+ bytesMeasured,
70
+ budgetSeconds: verdict?.budgetSeconds,
71
+ budgetStatus: verdict?.status,
72
+ processesMeasured: side === 'gateway',
73
+ method,
74
+ side,
75
+ actionClass: action_class,
76
+ count: row.count,
77
+ p50: histogramPercentile(row, 0.5),
78
+ p95: histogramPercentile(row, 0.95),
79
+ max: row.max,
80
+ bytes,
81
+ execCount,
82
+ execSeconds,
83
+ nodeCount,
84
+ nodeSeconds,
85
+ nodeWaitSeconds,
86
+ loopLagSeconds,
87
+ causes,
88
+ };
89
+ })
90
+ .sort((a, b) => b.p95 - a.p95 || b.max - a.max);
91
+ }
92
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../src/performance/ranking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type ClientPerformanceReport, type ClientPerformanceReportResult, type PerformanceActionClass, type PerformanceCounterName, type PerformanceHistogramName, type PerformanceLabels, type PerformanceSide, type PerformanceSnapshot } from './types.js';
2
+ interface RecorderOptions {
3
+ clock?: () => number;
4
+ methods?: ReadonlySet<string>;
5
+ }
6
+ export declare class PerformanceRecorder {
7
+ readonly side: PerformanceSide;
8
+ readonly clock: () => number;
9
+ private readonly activity;
10
+ onActivity(listener: () => void): () => void;
11
+ private changed;
12
+ private methods;
13
+ private startedAtMs;
14
+ private all;
15
+ private delta;
16
+ private sourceId;
17
+ private sequence;
18
+ private report?;
19
+ private reporters;
20
+ private reporterOrdinal;
21
+ private rates;
22
+ private queryOrdinal;
23
+ private queryIds;
24
+ private scopeVersion;
25
+ get epoch(): number;
26
+ resetScope(): void;
27
+ private reportedGauges;
28
+ constructor(side: PerformanceSide, options?: RecorderOptions);
29
+ private labels;
30
+ observe(name: PerformanceHistogramName, input: PerformanceLabels, value: number): void;
31
+ increment(name: PerformanceCounterName, input: PerformanceLabels, value?: number): void;
32
+ private rotate;
33
+ reread(method: string, identity: object): void;
34
+ private snapshotState;
35
+ snapshot(): PerformanceSnapshot;
36
+ beginReport(): ClientPerformanceReport | undefined;
37
+ acknowledge(sequence: number): void;
38
+ expireReportSource(): void;
39
+ mergeReport(authenticatedSource: string, report: ClientPerformanceReport): ClientPerformanceReportResult;
40
+ }
41
+ export declare function measureClientRequest<T>(metrics: PerformanceRecorder, method: string, actionClass: PerformanceActionClass, request: (received: (bytes: number) => void) => Promise<T>): Promise<T>;
42
+ export {};
43
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/performance/recorder.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAGlC,KAAK,sBAAsB,EAE3B,KAAK,sBAAsB,EAG3B,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAmBpB,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAKD,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI5C,OAAO,CAAC,OAAO;IAGf,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAC,CAA0B;IACzC,OAAO,CAAC,SAAS,CAGb;IACJ,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAK;IACzB,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,UAAU,IAAI,IAAI;IAWlB,OAAO,CAAC,cAAc,CAAmE;gBAC7E,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,eAAoB;IAKhE,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAqCtF,SAAS,CAAC,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,SAAI,GAAG,IAAI;IAmBlF,OAAO,CAAC,MAAM;IAMd,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAqB9C,OAAO,CAAC,aAAa;IAiCrB,QAAQ,IAAI,mBAAmB;IAG/B,WAAW,IAAI,uBAAuB,GAAG,SAAS;IA8BlD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAGnC,kBAAkB,IAAI,IAAI;IAU1B,WAAW,CACT,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,uBAAuB,GAC9B,6BAA6B;CA+FjC;AACD,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,sBAAsB,EACnC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GACzD,OAAO,CAAC,CAAC,CAAC,CAoBZ"}