@tangle-network/agent-core 0.13.2 → 0.13.3

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 (78) hide show
  1. package/dist/auth/browser.d.ts +1 -1
  2. package/dist/auth/browser.js +1 -2
  3. package/dist/auth/index.d.ts +1 -7
  4. package/dist/auth/index.d.ts.map +1 -1
  5. package/dist/auth/index.js +4 -7
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/computer-use/index.d.ts +0 -6
  8. package/dist/computer-use/index.d.ts.map +1 -1
  9. package/dist/computer-use/index.js +3 -6
  10. package/dist/computer-use/index.js.map +1 -1
  11. package/dist/{errors-GuWACHTg.js → errors-B5KiSXnw.js} +2 -3
  12. package/dist/{errors-GuWACHTg.js.map → errors-B5KiSXnw.js.map} +1 -1
  13. package/dist/events/index.d.ts +1 -1
  14. package/dist/events/index.js +1 -2
  15. package/dist/{events-U7kxNUpM.js → events-C2vdiRD_.js} +4 -7
  16. package/dist/{events-U7kxNUpM.js.map → events-C2vdiRD_.js.map} +1 -1
  17. package/dist/{index-68is3nof.d.ts → index-AEKS1kB8.d.ts} +1 -9
  18. package/dist/index-AEKS1kB8.d.ts.map +1 -0
  19. package/dist/{index-Dq6SfGaX.d.ts → index-CevHCod7.d.ts} +1 -9
  20. package/dist/index-CevHCod7.d.ts.map +1 -0
  21. package/dist/{index-CKDeaS7l.d.ts → index-DWPciD1S.d.ts} +2 -8
  22. package/dist/index-DWPciD1S.d.ts.map +1 -0
  23. package/dist/{index-BFYASYJk.d.ts → index-DwvNnL6X.d.ts} +1 -3
  24. package/dist/index-DwvNnL6X.d.ts.map +1 -0
  25. package/dist/{index-CuBvSsBf.d.ts → index-OCnM4OoP.d.ts} +1 -7
  26. package/dist/index-OCnM4OoP.d.ts.map +1 -0
  27. package/dist/{index-CQPGv8jg.d.ts → index-v0euJYbX.d.ts} +10 -12
  28. package/dist/index-v0euJYbX.d.ts.map +1 -0
  29. package/dist/index.d.ts +7 -23
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +15 -23
  32. package/dist/index.js.map +1 -1
  33. package/dist/interactions/index.d.ts +1 -3
  34. package/dist/interactions/index.d.ts.map +1 -1
  35. package/dist/interactions/index.js +4 -7
  36. package/dist/interactions/index.js.map +1 -1
  37. package/dist/interactions/mcp-server.d.ts +1 -3
  38. package/dist/interactions/mcp-server.d.ts.map +1 -1
  39. package/dist/interactions/mcp-server.js +2 -3
  40. package/dist/{lifecycle-BljLcnY5.js → lifecycle-wjO8lqUZ.js} +2 -3
  41. package/dist/{lifecycle-BljLcnY5.js.map → lifecycle-wjO8lqUZ.js.map} +1 -1
  42. package/dist/node/index.d.ts +0 -2
  43. package/dist/node/index.d.ts.map +1 -1
  44. package/dist/node/index.js +1 -2
  45. package/dist/resilience/index.d.ts +1 -1
  46. package/dist/resilience/index.js +1 -2
  47. package/dist/{resilience-Cv5tqIDU.js → resilience-Bb1XDoKt.js} +5 -8
  48. package/dist/{resilience-Cv5tqIDU.js.map → resilience-Bb1XDoKt.js.map} +1 -1
  49. package/dist/sse/index.d.ts +0 -2
  50. package/dist/sse/index.d.ts.map +1 -1
  51. package/dist/sse/index.js +1 -2
  52. package/dist/telemetry/index.d.ts +1 -1
  53. package/dist/telemetry/index.js +1 -2
  54. package/dist/{telemetry--KwUEdTv.js → telemetry-CF4pOM9u.js} +5 -9
  55. package/dist/{telemetry--KwUEdTv.js.map → telemetry-CF4pOM9u.js.map} +1 -1
  56. package/dist/{tokens-browser-DCV3-WHc.d.ts → tokens-browser-CGLWUfZ7.d.ts} +5 -11
  57. package/dist/tokens-browser-CGLWUfZ7.d.ts.map +1 -0
  58. package/dist/{tools-DeZkIW3h.d.ts → tools-C3tUmLEu.d.ts} +1 -5
  59. package/dist/tools-C3tUmLEu.d.ts.map +1 -0
  60. package/dist/transport/index.d.ts +1 -1
  61. package/dist/transport/index.js +1 -2
  62. package/dist/{transport-DAfw3oL0.js → transport-BqEVpHWb.js} +5 -9
  63. package/dist/{transport-DAfw3oL0.js.map → transport-BqEVpHWb.js.map} +1 -1
  64. package/dist/types/index.d.ts +1 -1
  65. package/dist/types/index.js +1 -2
  66. package/dist/{types--u-Om3vE.js → types-BKMl10eN.js} +5 -8
  67. package/dist/{types--u-Om3vE.js.map → types-BKMl10eN.js.map} +1 -1
  68. package/dist/{types-DVN5qATk.js → types-UwiuyvMA.js} +2 -3
  69. package/dist/{types-DVN5qATk.js.map → types-UwiuyvMA.js.map} +1 -1
  70. package/package.json +9 -9
  71. package/dist/index-68is3nof.d.ts.map +0 -1
  72. package/dist/index-BFYASYJk.d.ts.map +0 -1
  73. package/dist/index-CKDeaS7l.d.ts.map +0 -1
  74. package/dist/index-CQPGv8jg.d.ts.map +0 -1
  75. package/dist/index-CuBvSsBf.d.ts.map +0 -1
  76. package/dist/index-Dq6SfGaX.d.ts.map +0 -1
  77. package/dist/tokens-browser-DCV3-WHc.d.ts.map +0 -1
  78. package/dist/tools-DeZkIW3h.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { n as closeHttpServer, r as waitForSettled, t as SerializedTransportLifecycle } from "../lifecycle-BljLcnY5.js";
1
+ import { n as closeHttpServer, r as waitForSettled, t as SerializedTransportLifecycle } from "../lifecycle-wjO8lqUZ.js";
2
2
  import { z } from "zod";
3
3
  import { createHash, randomBytes, randomUUID } from "node:crypto";
4
4
  import { createServer } from "node:http";
@@ -6,7 +6,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
8
  import { isJSONRPCErrorResponse, isJSONRPCRequest, isJSONRPCResultResponse } from "@modelcontextprotocol/sdk/types.js";
9
- //#region src/interactions/mcp-server.ts
9
+ // src/interactions/mcp-server.ts
10
10
  const DEFAULT_INTERACTION_MCP_SERVER_NAME = "tangle-interaction";
11
11
  const MAX_MCP_BODY_BYTES = 4194304;
12
12
  const MAX_MCP_REPLAY_EVENTS = 1024;
@@ -363,7 +363,6 @@ var InteractionMcpServer = class {
363
363
  return generationId;
364
364
  }
365
365
  };
366
- //#endregion
367
366
  export { DEFAULT_INTERACTION_MCP_SERVER_NAME, InteractionMcpServer, interactionMcpToolName };
368
367
 
369
368
  //# sourceMappingURL=mcp-server.js.map
@@ -1,4 +1,4 @@
1
- //#region src/interactions/lifecycle.ts
1
+ // src/interactions/lifecycle.ts
2
2
  /** Serialize one transport's single-use start and stop operations. */
3
3
  var SerializedTransportLifecycle = class {
4
4
  state = "idle";
@@ -62,7 +62,6 @@ async function waitForSettled(promises, graceMs = 1e3) {
62
62
  if (timer) clearTimeout(timer);
63
63
  }
64
64
  }
65
- //#endregion
66
65
  export { closeHttpServer as n, waitForSettled as r, SerializedTransportLifecycle as t };
67
66
 
68
- //# sourceMappingURL=lifecycle-BljLcnY5.js.map
67
+ //# sourceMappingURL=lifecycle-wjO8lqUZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-BljLcnY5.js","names":[],"sources":["../src/interactions/lifecycle.ts"],"sourcesContent":["type LifecycleState = \"idle\" | \"starting\" | \"running\" | \"stopping\" | \"stopped\";\n\n/** Serialize one transport's single-use start and stop operations. */\nexport class SerializedTransportLifecycle {\n private state: LifecycleState = \"idle\";\n private tail: Promise<void> = Promise.resolve();\n\n start(open: () => Promise<void>): Promise<void> {\n return this.enqueue(async () => {\n if (this.state !== \"idle\") {\n throw new Error(`Interaction transport cannot start while ${this.state}`);\n }\n this.state = \"starting\";\n try {\n await open();\n this.state = \"running\";\n } catch (error) {\n this.state = \"stopped\";\n throw error;\n }\n });\n }\n\n stop(close: () => Promise<void>): Promise<void> {\n return this.enqueue(async () => {\n if (this.state === \"idle\" || this.state === \"stopped\") return;\n this.state = \"stopping\";\n try {\n await close();\n } finally {\n this.state = \"stopped\";\n }\n });\n }\n\n private enqueue(operation: () => Promise<void>): Promise<void> {\n const result = this.tail.then(operation);\n this.tail = result.catch(() => undefined);\n return result;\n }\n}\n\n/** Close active requests gracefully, then force-close a stuck local socket. */\nexport async function closeHttpServer(\n server: import(\"node:http\").Server,\n graceMs = 1_000,\n): Promise<void> {\n await new Promise<void>((resolve) => {\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n clearTimeout(forceClose);\n resolve();\n };\n const forceClose = setTimeout(() => {\n server.closeAllConnections?.();\n finish();\n }, graceMs);\n server.close(finish);\n server.closeIdleConnections?.();\n });\n}\n\n/** Give active work a bounded grace period before transport shutdown. */\nexport async function waitForSettled(\n promises: Iterable<Promise<unknown>>,\n graceMs = 1_000,\n): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.allSettled([...promises]),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, graceMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n"],"mappings":";;AAGA,IAAa,+BAAb,MAA0C;CACxC,QAAgC;CAChC,OAA8B,QAAQ,QAAQ;CAE9C,MAAM,MAA0C;EAC9C,OAAO,KAAK,QAAQ,YAAY;GAC9B,IAAI,KAAK,UAAU,QACjB,MAAM,IAAI,MAAM,4CAA4C,KAAK,OAAO;GAE1E,KAAK,QAAQ;GACb,IAAI;IACF,MAAM,KAAK;IACX,KAAK,QAAQ;GACf,SAAS,OAAO;IACd,KAAK,QAAQ;IACb,MAAM;GACR;EACF,CAAC;CACH;CAEA,KAAK,OAA2C;EAC9C,OAAO,KAAK,QAAQ,YAAY;GAC9B,IAAI,KAAK,UAAU,UAAU,KAAK,UAAU,WAAW;GACvD,KAAK,QAAQ;GACb,IAAI;IACF,MAAM,MAAM;GACd,UAAU;IACR,KAAK,QAAQ;GACf;EACF,CAAC;CACH;CAEA,QAAgB,WAA+C;EAC7D,MAAM,SAAS,KAAK,KAAK,KAAK,SAAS;EACvC,KAAK,OAAO,OAAO,YAAY,KAAA,CAAS;EACxC,OAAO;CACT;AACF;;AAGA,eAAsB,gBACpB,QACA,UAAU,KACK;CACf,MAAM,IAAI,SAAe,YAAY;EACnC,IAAI,WAAW;EACf,MAAM,eAAe;GACnB,IAAI,UAAU;GACd,WAAW;GACX,aAAa,UAAU;GACvB,QAAQ;EACV;EACA,MAAM,aAAa,iBAAiB;GAClC,OAAO,sBAAsB;GAC7B,OAAO;EACT,GAAG,OAAO;EACV,OAAO,MAAM,MAAM;EACnB,OAAO,uBAAuB;CAChC,CAAC;AACH;;AAGA,eAAsB,eACpB,UACA,UAAU,KACK;CACf,IAAI;CACJ,IAAI;EACF,MAAM,QAAQ,KAAK,CACjB,QAAQ,WAAW,CAAC,GAAG,QAAQ,CAAC,GAChC,IAAI,SAAe,YAAY;GAC7B,QAAQ,WAAW,SAAS,OAAO;EACrC,CAAC,CACH,CAAC;CACH,UAAU;EACR,IAAI,OAAO,aAAa,KAAK;CAC/B;AACF"}
1
+ {"version":3,"file":"lifecycle-wjO8lqUZ.js","names":[],"sources":["../src/interactions/lifecycle.ts"],"sourcesContent":["type LifecycleState = \"idle\" | \"starting\" | \"running\" | \"stopping\" | \"stopped\";\n\n/** Serialize one transport's single-use start and stop operations. */\nexport class SerializedTransportLifecycle {\n private state: LifecycleState = \"idle\";\n private tail: Promise<void> = Promise.resolve();\n\n start(open: () => Promise<void>): Promise<void> {\n return this.enqueue(async () => {\n if (this.state !== \"idle\") {\n throw new Error(`Interaction transport cannot start while ${this.state}`);\n }\n this.state = \"starting\";\n try {\n await open();\n this.state = \"running\";\n } catch (error) {\n this.state = \"stopped\";\n throw error;\n }\n });\n }\n\n stop(close: () => Promise<void>): Promise<void> {\n return this.enqueue(async () => {\n if (this.state === \"idle\" || this.state === \"stopped\") return;\n this.state = \"stopping\";\n try {\n await close();\n } finally {\n this.state = \"stopped\";\n }\n });\n }\n\n private enqueue(operation: () => Promise<void>): Promise<void> {\n const result = this.tail.then(operation);\n this.tail = result.catch(() => undefined);\n return result;\n }\n}\n\n/** Close active requests gracefully, then force-close a stuck local socket. */\nexport async function closeHttpServer(\n server: import(\"node:http\").Server,\n graceMs = 1_000,\n): Promise<void> {\n await new Promise<void>((resolve) => {\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n clearTimeout(forceClose);\n resolve();\n };\n const forceClose = setTimeout(() => {\n server.closeAllConnections?.();\n finish();\n }, graceMs);\n server.close(finish);\n server.closeIdleConnections?.();\n });\n}\n\n/** Give active work a bounded grace period before transport shutdown. */\nexport async function waitForSettled(\n promises: Iterable<Promise<unknown>>,\n graceMs = 1_000,\n): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.allSettled([...promises]),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, graceMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n"],"mappings":";;AAGA,IAAa,+BAAb,MAA0C;CACxC,QAAgC;CAChC,OAA8B,QAAQ,QAAQ;CAE9C,MAAM,MAA0C;EAC9C,OAAO,KAAK,QAAQ,YAAY;GAC9B,IAAI,KAAK,UAAU,QACjB,MAAM,IAAI,MAAM,4CAA4C,KAAK,OAAO;GAE1E,KAAK,QAAQ;GACb,IAAI;IACF,MAAM,KAAK;IACX,KAAK,QAAQ;GACf,SAAS,OAAO;IACd,KAAK,QAAQ;IACb,MAAM;GACR;EACF,CAAC;CACH;CAEA,KAAK,OAA2C;EAC9C,OAAO,KAAK,QAAQ,YAAY;GAC9B,IAAI,KAAK,UAAU,UAAU,KAAK,UAAU,WAAW;GACvD,KAAK,QAAQ;GACb,IAAI;IACF,MAAM,MAAM;GACd,UAAU;IACR,KAAK,QAAQ;GACf;EACF,CAAC;CACH;CAEA,QAAgB,WAA+C;EAC7D,MAAM,SAAS,KAAK,KAAK,KAAK,SAAS;EACvC,KAAK,OAAO,OAAO,YAAY,KAAA,CAAS;EACxC,OAAO;CACT;AACF;;AAGA,eAAsB,gBACpB,QACA,UAAU,KACK;CACf,MAAM,IAAI,SAAe,YAAY;EACnC,IAAI,WAAW;EACf,MAAM,eAAe;GACnB,IAAI,UAAU;GACd,WAAW;GACX,aAAa,UAAU;GACvB,QAAQ;EACV;EACA,MAAM,aAAa,iBAAiB;GAClC,OAAO,sBAAsB;GAC7B,OAAO;EACT,GAAG,OAAO;EACV,OAAO,MAAM,MAAM;EACnB,OAAO,uBAAuB;CAChC,CAAC;AACH;;AAGA,eAAsB,eACpB,UACA,UAAU,KACK;CACf,IAAI;CACJ,IAAI;EACF,MAAM,QAAQ,KAAK,CACjB,QAAQ,WAAW,CAAC,GAAG,QAAQ,CAAC,GAChC,IAAI,SAAe,YAAY;GAC7B,QAAQ,WAAW,SAAS,OAAO;EACrC,CAAC,CACH,CAAC;CACH,UAAU;EACR,IAAI,OAAO,aAAa,KAAK;CAC/B;AACF"}
@@ -1,7 +1,5 @@
1
- //#region src/node/index.d.ts
2
1
  /** Lowercase hex SHA-256 of a string or bytes. */
3
2
  export declare function sha256Hex(value: string | Uint8Array): string;
4
3
  /** Quote one argument for a POSIX shell: single quotes, embedded `'` as `'\''`. */
5
4
  export declare function shellQuote(value: string): string;
6
- //#endregion
7
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"mappings":";;wBAOgB,UAAU,gBAAgB;;wBAK1B,WAAW"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"mappings":";wBAOgB,UAAU,gBAAgB;;wBAK1B,WAAW"}
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region src/node/index.ts
2
+ // src/node/index.ts
3
3
  /**
4
4
  * Node-only primitives. Kept off the root entry so browser bundles of
5
5
  * `@tangle-network/agent-core` never pull in `node:crypto`.
@@ -12,7 +12,6 @@ function sha256Hex(value) {
12
12
  function shellQuote(value) {
13
13
  return `'${value.replace(/'/g, `'\\''`)}'`;
14
14
  }
15
- //#endregion
16
15
  export { sha256Hex, shellQuote };
17
16
 
18
17
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import { a as ProtectionOptions, c as CircuitBreaker, d as CircuitOpenError, f as CircuitState, i as withTimeout, l as CircuitBreakerConfig, n as createTimeoutController, o as createProtectedFn, r as sleep, s as withProtection, t as TimeoutError, u as CircuitBreakerStats } from "../index-CKDeaS7l.js";
1
+ import { a as ProtectionOptions, c as CircuitBreaker, d as CircuitOpenError, f as CircuitState, i as withTimeout, l as CircuitBreakerConfig, n as createTimeoutController, o as createProtectedFn, r as sleep, s as withProtection, t as TimeoutError, u as CircuitBreakerStats } from "../index-DWPciD1S.js";
2
2
  export { CircuitBreaker, type CircuitBreakerConfig, type CircuitBreakerStats, CircuitOpenError, type CircuitState, type ProtectionOptions, TimeoutError, createProtectedFn, createTimeoutController, sleep, withProtection, withTimeout };
@@ -1,2 +1 @@
1
- import { a as sleep, c as CircuitOpenError, i as createTimeoutController, n as withProtection, o as withTimeout, r as TimeoutError, s as CircuitBreaker, t as createProtectedFn } from "../resilience-Cv5tqIDU.js";
2
- export { CircuitBreaker, CircuitOpenError, TimeoutError, createProtectedFn, createTimeoutController, sleep, withProtection, withTimeout };
1
+ export { s as CircuitBreaker, c as CircuitOpenError, r as TimeoutError, t as createProtectedFn, i as createTimeoutController, a as sleep, n as withProtection, o as withTimeout } from "../resilience-Bb1XDoKt.js";
@@ -1,5 +1,5 @@
1
- import { t as SDKError } from "./errors-GuWACHTg.js";
2
- //#region src/resilience/circuit-breaker.ts
1
+ import { t as SDKError } from "./errors-B5KiSXnw.js";
2
+ // src/resilience/circuit-breaker.ts
3
3
  /**
4
4
  * Circuit Breaker
5
5
  *
@@ -122,8 +122,7 @@ var CircuitBreaker = class {
122
122
  this.lastFailureTime = Date.now();
123
123
  }
124
124
  };
125
- //#endregion
126
- //#region src/resilience/timeout.ts
125
+ // src/resilience/timeout.ts
127
126
  /**
128
127
  * Timeout Utilities
129
128
  *
@@ -216,8 +215,7 @@ function armTimeout(ms, callback) {
216
215
  if (timer !== void 0) clearTimeout(timer);
217
216
  };
218
217
  }
219
- //#endregion
220
- //#region src/resilience/protection.ts
218
+ // src/resilience/protection.ts
221
219
  /**
222
220
  * Execute a function with timeout and circuit breaker protection.
223
221
  *
@@ -242,7 +240,6 @@ async function withProtection(fn, options = {}) {
242
240
  function createProtectedFn(fn, options) {
243
241
  return (...args) => withProtection(() => fn(...args), options);
244
242
  }
245
- //#endregion
246
243
  export { sleep as a, CircuitOpenError as c, createTimeoutController as i, withProtection as n, withTimeout as o, TimeoutError as r, CircuitBreaker as s, createProtectedFn as t };
247
244
 
248
- //# sourceMappingURL=resilience-Cv5tqIDU.js.map
245
+ //# sourceMappingURL=resilience-Bb1XDoKt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resilience-Cv5tqIDU.js","names":[],"sources":["../src/resilience/circuit-breaker.ts","../src/resilience/timeout.ts","../src/resilience/protection.ts"],"sourcesContent":["/**\n * Circuit Breaker\n *\n * Implements the circuit breaker pattern for fail-fast behavior when\n * downstream services are unhealthy. Prevents cascade failures by\n * stopping requests to failing services.\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Service unhealthy, requests fail immediately\n * - HALF_OPEN: Testing if service recovered\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n /** Time in ms to wait before testing recovery (half-open) */\n resetTimeoutMs: number;\n /** Number of successes in half-open state to close circuit */\n successThreshold: number;\n /** Optional: Only count these error types as failures */\n failureFilter?: (error: unknown) => boolean;\n}\n\nexport interface CircuitBreakerStats {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n totalFailures: number;\n totalSuccesses: number;\n totalRejected: number;\n}\n\nexport class CircuitOpenError extends SDKError {\n readonly circuitName: string;\n readonly resetAfterMs: number;\n\n constructor(name: string, resetAfterMs: number) {\n super(`Circuit breaker '${name}' is open`, {\n code: \"SERVER\",\n retryable: true,\n retryAfterMs: resetAfterMs,\n context: { circuitName: name },\n });\n this.name = \"CircuitOpenError\";\n this.circuitName = name;\n this.resetAfterMs = resetAfterMs;\n }\n}\n\nexport class CircuitBreaker {\n private state: CircuitState = \"closed\";\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n // Lifetime stats\n private totalFailures = 0;\n private totalSuccesses = 0;\n private totalRejected = 0;\n\n constructor(\n private readonly name: string,\n private readonly config: CircuitBreakerConfig,\n ) {\n if (config.failureThreshold < 1) {\n throw new Error(\"failureThreshold must be >= 1\");\n }\n if (config.resetTimeoutMs < 0) {\n throw new Error(\"resetTimeoutMs must be >= 0\");\n }\n if (config.successThreshold < 1) {\n throw new Error(\"successThreshold must be >= 1\");\n }\n }\n\n /**\n * Execute a function through the circuit breaker.\n * Throws CircuitOpenError if circuit is open.\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if we should transition from open to half-open\n if (this.state === \"open\") {\n const timeSinceFailure = this.lastFailureTime\n ? Date.now() - this.lastFailureTime\n : Number.POSITIVE_INFINITY;\n\n if (timeSinceFailure >= this.config.resetTimeoutMs) {\n this.state = \"half-open\";\n this.successes = 0;\n } else {\n this.totalRejected++;\n throw new CircuitOpenError(\n this.name,\n this.config.resetTimeoutMs - timeSinceFailure,\n );\n }\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure(error);\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.totalSuccesses++;\n\n if (this.state === \"half-open\") {\n this.successes++;\n if (this.successes >= this.config.successThreshold) {\n // Service recovered, close circuit\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n }\n } else if (this.state === \"closed\") {\n // Reset failure count on success\n this.failures = 0;\n }\n }\n\n private onFailure(error: unknown): void {\n // Check if this error should count as a failure\n if (this.config.failureFilter && !this.config.failureFilter(error)) {\n return;\n }\n\n this.totalFailures++;\n this.failures++;\n this.lastFailureTime = Date.now();\n this.successes = 0;\n\n if (this.state === \"half-open\") {\n // Any failure in half-open returns to open\n this.state = \"open\";\n } else if (\n this.state === \"closed\" &&\n this.failures >= this.config.failureThreshold\n ) {\n // Threshold exceeded, open circuit\n this.state = \"open\";\n }\n }\n\n /** Get current circuit state */\n getState(): CircuitState {\n return this.state;\n }\n\n /** Get circuit statistics */\n getStats(): CircuitBreakerStats {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n totalFailures: this.totalFailures,\n totalSuccesses: this.totalSuccesses,\n totalRejected: this.totalRejected,\n };\n }\n\n /** Check if circuit is allowing requests */\n isAllowingRequests(): boolean {\n if (this.state === \"closed\" || this.state === \"half-open\") {\n return true;\n }\n\n // Check if reset timeout has passed\n const timeSinceFailure = this.lastFailureTime\n ? Date.now() - this.lastFailureTime\n : Number.POSITIVE_INFINITY;\n\n return timeSinceFailure >= this.config.resetTimeoutMs;\n }\n\n /** Manually reset the circuit to closed state */\n reset(): void {\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n\n /** Manually open the circuit */\n open(): void {\n this.state = \"open\";\n this.lastFailureTime = Date.now();\n }\n}\n","/**\n * Timeout Utilities\n *\n * Promise-based timeout handling with proper cleanup.\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\nexport class TimeoutError extends SDKError {\n readonly timeoutMs: number;\n\n constructor(message: string, timeoutMs: number) {\n super(message, {\n code: \"TIMEOUT\",\n retryable: true,\n context: { timeoutMs },\n });\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Wrap a promise with a timeout.\n * Rejects with TimeoutError if the promise doesn't resolve in time.\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message?: string,\n): Promise<T> {\n if (timeoutMs <= 0) {\n return promise;\n }\n\n let clearTimer: (() => void) | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n clearTimer = armTimeout(timeoutMs, () => {\n reject(\n new TimeoutError(\n message || `Operation timed out after ${timeoutMs}ms`,\n timeoutMs,\n ),\n );\n });\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimer?.();\n });\n}\n\n/**\n * Create an AbortController that auto-aborts after a timeout.\n * Returns the controller and a cleanup function.\n */\nexport function createTimeoutController(timeoutMs: number): {\n controller: AbortController;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n let clearTimer: (() => void) | undefined;\n\n if (timeoutMs > 0) {\n clearTimer = armTimeout(timeoutMs, () => {\n controller.abort(new TimeoutError(\"Request timeout\", timeoutMs));\n });\n }\n\n return {\n controller,\n cleanup: () => {\n clearTimer?.();\n },\n };\n}\n\n/**\n * Sleep for a specified duration.\n * Optionally accepts an AbortSignal for cancellation.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n const onAbort = () => {\n clearTimer();\n signal?.removeEventListener(\"abort\", onAbort);\n reject(signal?.reason);\n };\n const clearTimer = armTimeout(ms, () => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/** Keep one absolute deadline; native timers overflow to 1ms beyond this chunk size. */\nfunction armTimeout(ms: number, callback: () => void): () => void {\n const deadline = Date.now() + Math.max(0, ms);\n if (!Number.isFinite(ms) || !Number.isSafeInteger(Math.ceil(deadline))) {\n throw new SDKError(\"Timeout must produce a finite safe deadline\", { code: \"VALIDATION\" });\n }\n let cleared = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n if (cleared) return;\n timer = setTimeout(() => {\n if (cleared) return;\n if (Date.now() >= deadline) callback();\n else arm();\n }, Math.min(2_147_483_647, Math.max(0, deadline - Date.now())));\n };\n arm();\n return () => {\n cleared = true;\n if (timer !== undefined) clearTimeout(timer);\n };\n}\n","/**\n * Combines timeout + circuit breaker into a single request guard.\n */\n\nimport type { CircuitBreaker } from \"./circuit-breaker.js\";\nimport { withTimeout } from \"./timeout.js\";\n\nexport interface ProtectionOptions {\n /** Timeout in milliseconds (0 or undefined = no timeout) */\n timeoutMs?: number;\n /** Circuit breaker instance (optional) */\n breaker?: CircuitBreaker;\n /** Operation name for error messages */\n operationName?: string;\n}\n\n/**\n * Execute a function with timeout and circuit breaker protection.\n *\n * Order of execution:\n * 1. Circuit breaker check (fail fast if open)\n * 2. Timeout wrapper\n * 3. Execute function\n * 4. Update circuit breaker state\n */\nexport async function withProtection<T>(\n fn: () => Promise<T>,\n options: ProtectionOptions = {},\n): Promise<T> {\n const { timeoutMs, breaker, operationName = \"operation\" } = options;\n\n const execute = async (): Promise<T> => {\n if (timeoutMs && timeoutMs > 0) {\n return withTimeout(fn(), timeoutMs, `${operationName} timed out`);\n }\n return fn();\n };\n\n if (breaker) {\n return breaker.execute(execute);\n }\n\n return execute();\n}\n\n/**\n * Create a protected function that always applies the same protection options.\n */\nexport function createProtectedFn<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n options: ProtectionOptions,\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withProtection(() => fn(...args), options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resilience-Bb1XDoKt.js","names":[],"sources":["../src/resilience/circuit-breaker.ts","../src/resilience/timeout.ts","../src/resilience/protection.ts"],"sourcesContent":["/**\n * Circuit Breaker\n *\n * Implements the circuit breaker pattern for fail-fast behavior when\n * downstream services are unhealthy. Prevents cascade failures by\n * stopping requests to failing services.\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Service unhealthy, requests fail immediately\n * - HALF_OPEN: Testing if service recovered\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n /** Time in ms to wait before testing recovery (half-open) */\n resetTimeoutMs: number;\n /** Number of successes in half-open state to close circuit */\n successThreshold: number;\n /** Optional: Only count these error types as failures */\n failureFilter?: (error: unknown) => boolean;\n}\n\nexport interface CircuitBreakerStats {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n totalFailures: number;\n totalSuccesses: number;\n totalRejected: number;\n}\n\nexport class CircuitOpenError extends SDKError {\n readonly circuitName: string;\n readonly resetAfterMs: number;\n\n constructor(name: string, resetAfterMs: number) {\n super(`Circuit breaker '${name}' is open`, {\n code: \"SERVER\",\n retryable: true,\n retryAfterMs: resetAfterMs,\n context: { circuitName: name },\n });\n this.name = \"CircuitOpenError\";\n this.circuitName = name;\n this.resetAfterMs = resetAfterMs;\n }\n}\n\nexport class CircuitBreaker {\n private state: CircuitState = \"closed\";\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n // Lifetime stats\n private totalFailures = 0;\n private totalSuccesses = 0;\n private totalRejected = 0;\n\n constructor(\n private readonly name: string,\n private readonly config: CircuitBreakerConfig,\n ) {\n if (config.failureThreshold < 1) {\n throw new Error(\"failureThreshold must be >= 1\");\n }\n if (config.resetTimeoutMs < 0) {\n throw new Error(\"resetTimeoutMs must be >= 0\");\n }\n if (config.successThreshold < 1) {\n throw new Error(\"successThreshold must be >= 1\");\n }\n }\n\n /**\n * Execute a function through the circuit breaker.\n * Throws CircuitOpenError if circuit is open.\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if we should transition from open to half-open\n if (this.state === \"open\") {\n const timeSinceFailure = this.lastFailureTime\n ? Date.now() - this.lastFailureTime\n : Number.POSITIVE_INFINITY;\n\n if (timeSinceFailure >= this.config.resetTimeoutMs) {\n this.state = \"half-open\";\n this.successes = 0;\n } else {\n this.totalRejected++;\n throw new CircuitOpenError(\n this.name,\n this.config.resetTimeoutMs - timeSinceFailure,\n );\n }\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure(error);\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.totalSuccesses++;\n\n if (this.state === \"half-open\") {\n this.successes++;\n if (this.successes >= this.config.successThreshold) {\n // Service recovered, close circuit\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n }\n } else if (this.state === \"closed\") {\n // Reset failure count on success\n this.failures = 0;\n }\n }\n\n private onFailure(error: unknown): void {\n // Check if this error should count as a failure\n if (this.config.failureFilter && !this.config.failureFilter(error)) {\n return;\n }\n\n this.totalFailures++;\n this.failures++;\n this.lastFailureTime = Date.now();\n this.successes = 0;\n\n if (this.state === \"half-open\") {\n // Any failure in half-open returns to open\n this.state = \"open\";\n } else if (\n this.state === \"closed\" &&\n this.failures >= this.config.failureThreshold\n ) {\n // Threshold exceeded, open circuit\n this.state = \"open\";\n }\n }\n\n /** Get current circuit state */\n getState(): CircuitState {\n return this.state;\n }\n\n /** Get circuit statistics */\n getStats(): CircuitBreakerStats {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n totalFailures: this.totalFailures,\n totalSuccesses: this.totalSuccesses,\n totalRejected: this.totalRejected,\n };\n }\n\n /** Check if circuit is allowing requests */\n isAllowingRequests(): boolean {\n if (this.state === \"closed\" || this.state === \"half-open\") {\n return true;\n }\n\n // Check if reset timeout has passed\n const timeSinceFailure = this.lastFailureTime\n ? Date.now() - this.lastFailureTime\n : Number.POSITIVE_INFINITY;\n\n return timeSinceFailure >= this.config.resetTimeoutMs;\n }\n\n /** Manually reset the circuit to closed state */\n reset(): void {\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n\n /** Manually open the circuit */\n open(): void {\n this.state = \"open\";\n this.lastFailureTime = Date.now();\n }\n}\n","/**\n * Timeout Utilities\n *\n * Promise-based timeout handling with proper cleanup.\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\nexport class TimeoutError extends SDKError {\n readonly timeoutMs: number;\n\n constructor(message: string, timeoutMs: number) {\n super(message, {\n code: \"TIMEOUT\",\n retryable: true,\n context: { timeoutMs },\n });\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Wrap a promise with a timeout.\n * Rejects with TimeoutError if the promise doesn't resolve in time.\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message?: string,\n): Promise<T> {\n if (timeoutMs <= 0) {\n return promise;\n }\n\n let clearTimer: (() => void) | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n clearTimer = armTimeout(timeoutMs, () => {\n reject(\n new TimeoutError(\n message || `Operation timed out after ${timeoutMs}ms`,\n timeoutMs,\n ),\n );\n });\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimer?.();\n });\n}\n\n/**\n * Create an AbortController that auto-aborts after a timeout.\n * Returns the controller and a cleanup function.\n */\nexport function createTimeoutController(timeoutMs: number): {\n controller: AbortController;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n let clearTimer: (() => void) | undefined;\n\n if (timeoutMs > 0) {\n clearTimer = armTimeout(timeoutMs, () => {\n controller.abort(new TimeoutError(\"Request timeout\", timeoutMs));\n });\n }\n\n return {\n controller,\n cleanup: () => {\n clearTimer?.();\n },\n };\n}\n\n/**\n * Sleep for a specified duration.\n * Optionally accepts an AbortSignal for cancellation.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n const onAbort = () => {\n clearTimer();\n signal?.removeEventListener(\"abort\", onAbort);\n reject(signal?.reason);\n };\n const clearTimer = armTimeout(ms, () => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/** Keep one absolute deadline; native timers overflow to 1ms beyond this chunk size. */\nfunction armTimeout(ms: number, callback: () => void): () => void {\n const deadline = Date.now() + Math.max(0, ms);\n if (!Number.isFinite(ms) || !Number.isSafeInteger(Math.ceil(deadline))) {\n throw new SDKError(\"Timeout must produce a finite safe deadline\", { code: \"VALIDATION\" });\n }\n let cleared = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n if (cleared) return;\n timer = setTimeout(() => {\n if (cleared) return;\n if (Date.now() >= deadline) callback();\n else arm();\n }, Math.min(2_147_483_647, Math.max(0, deadline - Date.now())));\n };\n arm();\n return () => {\n cleared = true;\n if (timer !== undefined) clearTimeout(timer);\n };\n}\n","/**\n * Combines timeout + circuit breaker into a single request guard.\n */\n\nimport type { CircuitBreaker } from \"./circuit-breaker.js\";\nimport { withTimeout } from \"./timeout.js\";\n\nexport interface ProtectionOptions {\n /** Timeout in milliseconds (0 or undefined = no timeout) */\n timeoutMs?: number;\n /** Circuit breaker instance (optional) */\n breaker?: CircuitBreaker;\n /** Operation name for error messages */\n operationName?: string;\n}\n\n/**\n * Execute a function with timeout and circuit breaker protection.\n *\n * Order of execution:\n * 1. Circuit breaker check (fail fast if open)\n * 2. Timeout wrapper\n * 3. Execute function\n * 4. Update circuit breaker state\n */\nexport async function withProtection<T>(\n fn: () => Promise<T>,\n options: ProtectionOptions = {},\n): Promise<T> {\n const { timeoutMs, breaker, operationName = \"operation\" } = options;\n\n const execute = async (): Promise<T> => {\n if (timeoutMs && timeoutMs > 0) {\n return withTimeout(fn(), timeoutMs, `${operationName} timed out`);\n }\n return fn();\n };\n\n if (breaker) {\n return breaker.execute(execute);\n }\n\n return execute();\n}\n\n/**\n * Create a protected function that always applies the same protection options.\n */\nexport function createProtectedFn<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n options: ProtectionOptions,\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withProtection(() => fn(...args), options);\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- //#region src/sse/index.d.ts
2
1
  /**
3
2
  * SSE Utilities
4
3
  *
@@ -169,5 +168,4 @@ export declare function createUsageCallback<T extends Record<string, unknown>>(f
169
168
  getUsage: () => StreamUsageAccumulator;
170
169
  extractor: StreamUsageExtractor;
171
170
  };
172
- //#endregion
173
171
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/sse/index.ts"],"mappings":";;;;;;;;iBAQiB;EACf;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;IACE;IACA;IACA;IACA;;GAGD;;;;;;;;;;;wBAYa,aAAa,kBAAkB;iBA+B9B,iBAAiB;;EAEhC;;EAEA,aAAa,gBAAgB;;iBAGd,eAAe;EAC9B,MAAM;EACN;EACA;EACA;;;;;;qBAOW,eAAe;UAClB;UACA;UACA;EAER,YAAY,UAAS,iBAAiB;EAItC,KAAK,gBAAgB,eAAe;EAOpC,SAAS,eAAe;UAYhB;UA4CA;;;;;wBA2Ca,eAAe,aACpC,QAAQ,eAAe,aACvB,UAAS,iBAAiB,KACzB,eAAe,eAAe;;;;wBA4CX,iBAAiB,aACrC,QAAQ,eAAe,aACvB,UAAU,OAAO,eAAe,aAChC,UAAU,OAAO,gBACjB,UAAS,iBAAiB,KACzB;;iBAuCc;EACf;EACA;EACA;EACA;;;iBAIe;;EAEf,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;;;;;;;;;;;;;;;;;;qBA0BW;UACH;UACA;EAER;;;;EAeA,cAAc;;;;EAUd,aAAa,OAAO,eAAe;;;;;EAoDnC,YAAY;;;;EAeZ,WAAW,SAAS;;;;EAOpB;UAaQ;UAyCA;;;;;wBA4BM,8BAA8B;;;;;;;;;;;;;;wBAiB9B,oBAAoB,UAAU,yBAC5C,WAAW,OAAO;EAElB,WAAW,OAAO;EAClB,gBAAgB;EAChB,WAAW"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/sse/index.ts"],"mappings":";;;;;;;iBAQiB;EACf;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;IACE;IACA;IACA;IACA;;GAGD;;;;;;;;;;;wBAYa,aAAa,kBAAkB;iBA+B9B,iBAAiB;;EAEhC;;EAEA,aAAa,gBAAgB;;iBAGd,eAAe;EAC9B,MAAM;EACN;EACA;EACA;;;;;;qBAOW,eAAe;UAClB;UACA;UACA;EAEI,YAAA,UAAS,iBAAiB;EAItC,KAAK,gBAAgB,eAAe;EAOpC,SAAS,eAAe;UAYhB;UA4CA;;;;;wBA2Ca,eAAe,aACpC,QAAQ,eAAe,aACvB,UAAS,iBAAiB,KACzB,eAAe,eAAe;;;;wBA4CX,iBAAiB,aACrC,QAAQ,eAAe,aACvB,UAAU,OAAO,eAAe,aAChC,UAAU,OAAO,gBACjB,UAAS,iBAAiB,KACzB;;iBAuCc;EACf;EACA;EACA;EACA;;;iBAIe;;EAEf,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;;;;;;;;;;;;;;;;;;qBA0BW;UACH;UACA;;;;;EAiBR,cAAc;;;;EAUd,aAAa,OAAO,eAAe;;;;;EAoDnC,YAAY;;;;EAeZ,WAAW,SAAS;;;;EAOpB;UAaQ;UAyCA;;;;;wBA4BM,8BAA8B;;;;;;;;;;;;;;wBAiB9B,oBAAoB,UAAU,yBAC5C,WAAW,OAAO;EAElB,WAAW,OAAO;EAClB,gBAAgB;EAChB,WAAW"}
package/dist/sse/index.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/sse/index.ts
1
+ // src/sse/index.ts
2
2
  /**
3
3
  * Parse raw SSE data string into structured event data.
4
4
  *
@@ -297,7 +297,6 @@ function createUsageCallback(forward) {
297
297
  extractor
298
298
  };
299
299
  }
300
- //#endregion
301
300
  export { SSEChunkParser, StreamUsageExtractor, consumeSSEStream, createStreamUsageExtractor, createUsageCallback, parseSSEData, parseSSEStream };
302
301
 
303
302
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import { $ as CONTENT_KEY_FIELD, A as TANGLE_SUBJECT_KEY, B as GEN_AI_MODEL_KEYS, C as RUN_KEY_ATTRS, D as TANGLE_RUN_ID_KEY, E as TANGLE_RUN_ID_CAMEL_KEY, F as TRIGGER_ID_ATTRS, G as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, H as GEN_AI_OUTPUT_TOKEN_KEYS, I as TRIGGER_SOURCE_ATTRS, J as GEN_AI_USAGE_OUTPUT_TOKENS, K as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, L as WORKFLOW_MARKER_ATTRS, M as TANGLE_TRIGGER_KIND_KEY, N as TANGLE_TRIGGER_SOURCE_KEY, O as TANGLE_RUN_KIND_KEY, P as TANGLE_WORKFLOW_ID_KEY, Q as CONTENT_KEYS, R as GEN_AI_CONVERSATION_ID, S as PARENT_RUN_KEY_ATTRS, T as SUBJECT_KEY_ATTRS, U as GEN_AI_REQUEST_MODEL, V as GEN_AI_OPERATION_NAME, W as GEN_AI_RESPONSE_MODEL, X as genAiUsageAttributes, Y as GenAiUsage, Z as CONTENT_COMPLETION_KEY, _ as promptTokens, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, at as DeclaredIntentMatch, b as tokenCount, c as TOKEN_USAGE_COST_KEYS, ct as asContentField, d as TOKEN_USAGE_OUTPUT_KEYS, dt as declaredTaskText, et as CONTENT_PROMPT_KEY, f as TokenUsageCounts, ft as extractContent, g as firstUsageCostUsd, gt as resolveDeclaredIntent, h as firstTokenCount, ht as normalizeContentAttributes, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, it as ContentField, j as TANGLE_TRIGGER_ID_KEY, k as TANGLE_RUN_PARENT_ID_KEY, l as TOKEN_USAGE_DETAIL_KEYS, lt as asContentString, m as cacheHitRate, mt as logRecordContentBag, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, nt as CONTENT_TOOL_NAME_KEY, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, ot as INDEXED_CONTENT_KEY_LIKE_PATTERNS, p as addTokenUsage, pt as hasContent, q as GEN_AI_USAGE_INPUT_TOKENS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, rt as CONTENT_TOOL_RESULT_KEY, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, st as NormalizedContent, t as TOKEN_USAGE_CACHE_BAG_KEYS, tt as CONTENT_TOOL_ARGS_KEY, u as TOKEN_USAGE_INPUT_KEYS, ut as classifyAgent, v as readTokenCostUsd, w as RUN_KIND_ATTRS, x as tokenUsageSource, y as readTokenUsage, z as GEN_AI_INPUT_TOKEN_KEYS } from "../index-68is3nof.js";
1
+ import { $ as CONTENT_KEY_FIELD, A as TANGLE_SUBJECT_KEY, B as GEN_AI_MODEL_KEYS, C as RUN_KEY_ATTRS, D as TANGLE_RUN_ID_KEY, E as TANGLE_RUN_ID_CAMEL_KEY, F as TRIGGER_ID_ATTRS, G as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, H as GEN_AI_OUTPUT_TOKEN_KEYS, I as TRIGGER_SOURCE_ATTRS, J as GEN_AI_USAGE_OUTPUT_TOKENS, K as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, L as WORKFLOW_MARKER_ATTRS, M as TANGLE_TRIGGER_KIND_KEY, N as TANGLE_TRIGGER_SOURCE_KEY, O as TANGLE_RUN_KIND_KEY, P as TANGLE_WORKFLOW_ID_KEY, Q as CONTENT_KEYS, R as GEN_AI_CONVERSATION_ID, S as PARENT_RUN_KEY_ATTRS, T as SUBJECT_KEY_ATTRS, U as GEN_AI_REQUEST_MODEL, V as GEN_AI_OPERATION_NAME, W as GEN_AI_RESPONSE_MODEL, X as genAiUsageAttributes, Y as GenAiUsage, Z as CONTENT_COMPLETION_KEY, _ as promptTokens, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, at as DeclaredIntentMatch, b as tokenCount, c as TOKEN_USAGE_COST_KEYS, ct as asContentField, d as TOKEN_USAGE_OUTPUT_KEYS, dt as declaredTaskText, et as CONTENT_PROMPT_KEY, f as TokenUsageCounts, ft as extractContent, g as firstUsageCostUsd, gt as resolveDeclaredIntent, h as firstTokenCount, ht as normalizeContentAttributes, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, it as ContentField, j as TANGLE_TRIGGER_ID_KEY, k as TANGLE_RUN_PARENT_ID_KEY, l as TOKEN_USAGE_DETAIL_KEYS, lt as asContentString, m as cacheHitRate, mt as logRecordContentBag, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, nt as CONTENT_TOOL_NAME_KEY, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, ot as INDEXED_CONTENT_KEY_LIKE_PATTERNS, p as addTokenUsage, pt as hasContent, q as GEN_AI_USAGE_INPUT_TOKENS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, rt as CONTENT_TOOL_RESULT_KEY, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, st as NormalizedContent, t as TOKEN_USAGE_CACHE_BAG_KEYS, tt as CONTENT_TOOL_ARGS_KEY, u as TOKEN_USAGE_INPUT_KEYS, ut as classifyAgent, v as readTokenCostUsd, w as RUN_KIND_ATTRS, x as tokenUsageSource, y as readTokenUsage, z as GEN_AI_INPUT_TOKEN_KEYS } from "../index-AEKS1kB8.js";
2
2
  export { CONTENT_COMPLETION_KEY, CONTENT_KEYS, CONTENT_KEY_FIELD, CONTENT_PROMPT_KEY, CONTENT_TOOL_ARGS_KEY, CONTENT_TOOL_NAME_KEY, CONTENT_TOOL_RESULT_KEY, type ContentField, type DeclaredIntentMatch, GEN_AI_CONVERSATION_ID, GEN_AI_INPUT_TOKEN_KEYS, GEN_AI_MODEL_KEYS, GEN_AI_OPERATION_NAME, GEN_AI_OUTPUT_TOKEN_KEYS, GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, type GenAiUsage, INDEXED_CONTENT_KEY_LIKE_PATTERNS, type NormalizedContent, PARENT_RUN_KEY_ATTRS, RUN_KEY_ATTRS, RUN_KIND_ATTRS, SUBJECT_KEY_ATTRS, TANGLE_RUN_ID_CAMEL_KEY, TANGLE_RUN_ID_KEY, TANGLE_RUN_KIND_KEY, TANGLE_RUN_PARENT_ID_KEY, TANGLE_SUBJECT_KEY, TANGLE_TRIGGER_ID_KEY, TANGLE_TRIGGER_KIND_KEY, TANGLE_TRIGGER_SOURCE_KEY, TANGLE_WORKFLOW_ID_KEY, TOKEN_USAGE_CACHE_BAG_KEYS, TOKEN_USAGE_CACHE_BAG_READ_KEYS, TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, TOKEN_USAGE_COST_KEYS, TOKEN_USAGE_DETAIL_KEYS, TOKEN_USAGE_INPUT_KEYS, TOKEN_USAGE_OUTPUT_KEYS, TRIGGER_ID_ATTRS, TRIGGER_SOURCE_ATTRS, type TokenUsageCounts, WORKFLOW_MARKER_ATTRS, addTokenUsage, asContentField, asContentString, cacheHitRate, classifyAgent, declaredTaskText, extractContent, firstTokenCount, firstUsageCostUsd, genAiUsageAttributes, hasContent, logRecordContentBag, normalizeContentAttributes, promptTokens, readTokenCostUsd, readTokenUsage, resolveDeclaredIntent, tokenCount, tokenUsageSource };
@@ -1,2 +1 @@
1
- import { $ as CONTENT_TOOL_ARGS_KEY, A as TANGLE_TRIGGER_ID_KEY, B as GEN_AI_OPERATION_NAME, C as RUN_KIND_ATTRS, D as TANGLE_RUN_KIND_KEY, E as TANGLE_RUN_ID_KEY, F as TRIGGER_SOURCE_ATTRS, G as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, H as GEN_AI_REQUEST_MODEL, I as WORKFLOW_MARKER_ATTRS, J as genAiUsageAttributes, K as GEN_AI_USAGE_INPUT_TOKENS, L as GEN_AI_CONVERSATION_ID, M as TANGLE_TRIGGER_SOURCE_KEY, N as TANGLE_WORKFLOW_ID_KEY, O as TANGLE_RUN_PARENT_ID_KEY, P as TRIGGER_ID_ATTRS, Q as CONTENT_PROMPT_KEY, R as GEN_AI_INPUT_TOKEN_KEYS, S as RUN_KEY_ATTRS, T as TANGLE_RUN_ID_CAMEL_KEY, U as GEN_AI_RESPONSE_MODEL, V as GEN_AI_OUTPUT_TOKEN_KEYS, W as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, X as CONTENT_KEYS, Y as CONTENT_COMPLETION_KEY, Z as CONTENT_KEY_FIELD, _ as readTokenCostUsd, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, at as classifyAgent, b as tokenUsageSource, c as TOKEN_USAGE_COST_KEYS, ct as hasContent, d as TOKEN_USAGE_OUTPUT_KEYS, dt as resolveDeclaredIntent, et as CONTENT_TOOL_NAME_KEY, f as addTokenUsage, g as promptTokens, h as firstUsageCostUsd, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, it as asContentString, j as TANGLE_TRIGGER_KIND_KEY, k as TANGLE_SUBJECT_KEY, l as TOKEN_USAGE_DETAIL_KEYS, lt as logRecordContentBag, m as firstTokenCount, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, nt as INDEXED_CONTENT_KEY_LIKE_PATTERNS, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, ot as declaredTaskText, p as cacheHitRate, q as GEN_AI_USAGE_OUTPUT_TOKENS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, rt as asContentField, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, st as extractContent, t as TOKEN_USAGE_CACHE_BAG_KEYS, tt as CONTENT_TOOL_RESULT_KEY, u as TOKEN_USAGE_INPUT_KEYS, ut as normalizeContentAttributes, v as readTokenUsage, w as SUBJECT_KEY_ATTRS, x as PARENT_RUN_KEY_ATTRS, y as tokenCount, z as GEN_AI_MODEL_KEYS } from "../telemetry--KwUEdTv.js";
2
- export { CONTENT_COMPLETION_KEY, CONTENT_KEYS, CONTENT_KEY_FIELD, CONTENT_PROMPT_KEY, CONTENT_TOOL_ARGS_KEY, CONTENT_TOOL_NAME_KEY, CONTENT_TOOL_RESULT_KEY, GEN_AI_CONVERSATION_ID, GEN_AI_INPUT_TOKEN_KEYS, GEN_AI_MODEL_KEYS, GEN_AI_OPERATION_NAME, GEN_AI_OUTPUT_TOKEN_KEYS, GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, INDEXED_CONTENT_KEY_LIKE_PATTERNS, PARENT_RUN_KEY_ATTRS, RUN_KEY_ATTRS, RUN_KIND_ATTRS, SUBJECT_KEY_ATTRS, TANGLE_RUN_ID_CAMEL_KEY, TANGLE_RUN_ID_KEY, TANGLE_RUN_KIND_KEY, TANGLE_RUN_PARENT_ID_KEY, TANGLE_SUBJECT_KEY, TANGLE_TRIGGER_ID_KEY, TANGLE_TRIGGER_KIND_KEY, TANGLE_TRIGGER_SOURCE_KEY, TANGLE_WORKFLOW_ID_KEY, TOKEN_USAGE_CACHE_BAG_KEYS, TOKEN_USAGE_CACHE_BAG_READ_KEYS, TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, TOKEN_USAGE_COST_KEYS, TOKEN_USAGE_DETAIL_KEYS, TOKEN_USAGE_INPUT_KEYS, TOKEN_USAGE_OUTPUT_KEYS, TRIGGER_ID_ATTRS, TRIGGER_SOURCE_ATTRS, WORKFLOW_MARKER_ATTRS, addTokenUsage, asContentField, asContentString, cacheHitRate, classifyAgent, declaredTaskText, extractContent, firstTokenCount, firstUsageCostUsd, genAiUsageAttributes, hasContent, logRecordContentBag, normalizeContentAttributes, promptTokens, readTokenCostUsd, readTokenUsage, resolveDeclaredIntent, tokenCount, tokenUsageSource };
1
+ export { Y as CONTENT_COMPLETION_KEY, X as CONTENT_KEYS, Z as CONTENT_KEY_FIELD, Q as CONTENT_PROMPT_KEY, $ as CONTENT_TOOL_ARGS_KEY, et as CONTENT_TOOL_NAME_KEY, tt as CONTENT_TOOL_RESULT_KEY, L as GEN_AI_CONVERSATION_ID, R as GEN_AI_INPUT_TOKEN_KEYS, z as GEN_AI_MODEL_KEYS, B as GEN_AI_OPERATION_NAME, V as GEN_AI_OUTPUT_TOKEN_KEYS, H as GEN_AI_REQUEST_MODEL, U as GEN_AI_RESPONSE_MODEL, W as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, G as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, K as GEN_AI_USAGE_INPUT_TOKENS, q as GEN_AI_USAGE_OUTPUT_TOKENS, nt as INDEXED_CONTENT_KEY_LIKE_PATTERNS, x as PARENT_RUN_KEY_ATTRS, S as RUN_KEY_ATTRS, C as RUN_KIND_ATTRS, w as SUBJECT_KEY_ATTRS, T as TANGLE_RUN_ID_CAMEL_KEY, E as TANGLE_RUN_ID_KEY, D as TANGLE_RUN_KIND_KEY, O as TANGLE_RUN_PARENT_ID_KEY, k as TANGLE_SUBJECT_KEY, A as TANGLE_TRIGGER_ID_KEY, j as TANGLE_TRIGGER_KIND_KEY, M as TANGLE_TRIGGER_SOURCE_KEY, N as TANGLE_WORKFLOW_ID_KEY, t as TOKEN_USAGE_CACHE_BAG_KEYS, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, c as TOKEN_USAGE_COST_KEYS, l as TOKEN_USAGE_DETAIL_KEYS, u as TOKEN_USAGE_INPUT_KEYS, d as TOKEN_USAGE_OUTPUT_KEYS, P as TRIGGER_ID_ATTRS, F as TRIGGER_SOURCE_ATTRS, I as WORKFLOW_MARKER_ATTRS, f as addTokenUsage, rt as asContentField, it as asContentString, p as cacheHitRate, at as classifyAgent, ot as declaredTaskText, st as extractContent, m as firstTokenCount, h as firstUsageCostUsd, J as genAiUsageAttributes, ct as hasContent, lt as logRecordContentBag, ut as normalizeContentAttributes, g as promptTokens, _ as readTokenCostUsd, v as readTokenUsage, dt as resolveDeclaredIntent, y as tokenCount, b as tokenUsageSource } from "../telemetry-CF4pOM9u.js";
@@ -1,5 +1,5 @@
1
1
  import { ATTR, INPUT_TOKEN_ATTR_KEYS, MODEL_ATTR_KEYS, OPERATION_NAME_ATTR, OUTPUT_TOKEN_ATTR_KEYS } from "@tangle-network/agent-trace-contract";
2
- //#region src/telemetry/content-attributes.ts
2
+ // src/telemetry/content-attributes.ts
3
3
  /** Prompt / user message — the writer key OpenCode's user-turn export uses. */
4
4
  const CONTENT_PROMPT_KEY = "gen_ai.prompt";
5
5
  /** Model completion — the writer key OpenCode's assistant-text export uses. */
@@ -658,8 +658,7 @@ function declaredTaskText(content) {
658
658
  }
659
659
  return null;
660
660
  }
661
- //#endregion
662
- //#region src/telemetry/genai-attributes.ts
661
+ // src/telemetry/genai-attributes.ts
663
662
  /**
664
663
  * OpenTelemetry GenAI semantic-convention span attributes — the vocabulary every
665
664
  * trace producer in the stack emits and the intelligence ingest reads, so model /
@@ -722,8 +721,7 @@ function genAiUsageAttributes(usage) {
722
721
  if (isNonNegativeFinite(usage.cacheWriteTokens)) attrs[GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = usage.cacheWriteTokens;
723
722
  return attrs;
724
723
  }
725
- //#endregion
726
- //#region src/telemetry/spine-attributes.ts
724
+ // src/telemetry/spine-attributes.ts
727
725
  /**
728
726
  * Spine run/subject/tree + trigger span-attribute vocabulary — the single set of
729
727
  * `tangle.*` keys that name a run, its parent, its kind, its trigger, and the
@@ -808,8 +806,7 @@ const WORKFLOW_MARKER_ATTRS = Object.freeze([
808
806
  "tangle.workflow.run.id",
809
807
  "tangle.workflow.runId"
810
808
  ]);
811
- //#endregion
812
- //#region src/telemetry/token-usage.ts
809
+ // src/telemetry/token-usage.ts
813
810
  /**
814
811
  * Candidate field names for a producer-supplied `tokenUsage` bag on a
815
812
  * `message.updated` trace event. Agents and SDK layers disagree on the
@@ -1077,7 +1074,6 @@ function cacheHitRate(usage) {
1077
1074
  const total = promptTokens(usage);
1078
1075
  return total === 0 ? 0 : (usage.cacheReadTokens ?? 0) / total;
1079
1076
  }
1080
- //#endregion
1081
1077
  export { CONTENT_TOOL_ARGS_KEY as $, TANGLE_TRIGGER_ID_KEY as A, GEN_AI_OPERATION_NAME as B, RUN_KIND_ATTRS as C, TANGLE_RUN_KIND_KEY as D, TANGLE_RUN_ID_KEY as E, TRIGGER_SOURCE_ATTRS as F, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS as G, GEN_AI_REQUEST_MODEL as H, WORKFLOW_MARKER_ATTRS as I, genAiUsageAttributes as J, GEN_AI_USAGE_INPUT_TOKENS as K, GEN_AI_CONVERSATION_ID as L, TANGLE_TRIGGER_SOURCE_KEY as M, TANGLE_WORKFLOW_ID_KEY as N, TANGLE_RUN_PARENT_ID_KEY as O, TRIGGER_ID_ATTRS as P, CONTENT_PROMPT_KEY as Q, GEN_AI_INPUT_TOKEN_KEYS as R, RUN_KEY_ATTRS as S, TANGLE_RUN_ID_CAMEL_KEY as T, GEN_AI_RESPONSE_MODEL as U, GEN_AI_OUTPUT_TOKEN_KEYS as V, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS as W, CONTENT_KEYS as X, CONTENT_COMPLETION_KEY as Y, CONTENT_KEY_FIELD as Z, readTokenCostUsd as _, TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS as a, classifyAgent as at, tokenUsageSource as b, TOKEN_USAGE_COST_KEYS as c, hasContent as ct, TOKEN_USAGE_OUTPUT_KEYS as d, resolveDeclaredIntent as dt, CONTENT_TOOL_NAME_KEY as et, addTokenUsage as f, promptTokens as g, firstUsageCostUsd as h, TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS as i, asContentString as it, TANGLE_TRIGGER_KIND_KEY as j, TANGLE_SUBJECT_KEY as k, TOKEN_USAGE_DETAIL_KEYS as l, logRecordContentBag as lt, firstTokenCount as m, TOKEN_USAGE_CACHE_BAG_READ_KEYS as n, INDEXED_CONTENT_KEY_LIKE_PATTERNS as nt, TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS as o, declaredTaskText as ot, cacheHitRate as p, GEN_AI_USAGE_OUTPUT_TOKENS as q, TOKEN_USAGE_CACHE_BAG_WRITE_KEYS as r, asContentField as rt, TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS as s, extractContent as st, TOKEN_USAGE_CACHE_BAG_KEYS as t, CONTENT_TOOL_RESULT_KEY as tt, TOKEN_USAGE_INPUT_KEYS as u, normalizeContentAttributes as ut, readTokenUsage as v, SUBJECT_KEY_ATTRS as w, PARENT_RUN_KEY_ATTRS as x, tokenCount as y, GEN_AI_MODEL_KEYS as z };
1082
1078
 
1083
- //# sourceMappingURL=telemetry--KwUEdTv.js.map
1079
+ //# sourceMappingURL=telemetry-CF4pOM9u.js.map