@mastra/client-js 1.56.0-alpha.3 → 1.56.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -400,6 +400,16 @@ function isTerminalHttpError(error) {
400
400
  return typeof status === "number" && (status >= 400 && status < 500 || status === 501);
401
401
  }
402
402
  /**
403
+ * Whether an error is the server's trace query execution timeout (504 with code
404
+ * `TRACE_QUERY_EXECUTION_TIMEOUT`). Re-sending the same query hits the same
405
+ * timeout budget, so retrying only repeats an expensive database query.
406
+ * Plain 504s from proxies or gateways do not carry this code and stay retryable.
407
+ */
408
+ function isTraceQueryTimeoutError(error) {
409
+ const { status, body } = error ?? {};
410
+ return status === 504 && body?.code === "TRACE_QUERY_EXECUTION_TIMEOUT";
411
+ }
412
+ /**
403
413
  * Whether a failed resubscribe should end a long-lived subscription instead of
404
414
  * retrying. Like {@link isTerminalHttpError}, but 408 Request Timeout and
405
415
  * 429 Too Many Requests stay retryable because they mean "try again later".
@@ -1218,7 +1228,7 @@ var BaseResource = class {
1218
1228
  } catch (error) {
1219
1229
  lastError = error;
1220
1230
  if (signal?.aborted || error?.name === "AbortError") throw error;
1221
- if (isTerminalHttpError(error)) throw error;
1231
+ if (isTerminalHttpError(error) || isTraceQueryTimeoutError(error)) throw error;
1222
1232
  if (attempt === retries) break;
1223
1233
  await new Promise((resolve, reject) => {
1224
1234
  const timer = setTimeout(() => {
@@ -5150,10 +5160,10 @@ var Observability = class extends BaseResource {
5150
5160
  });
5151
5161
  }
5152
5162
  /**
5153
- * Queries thread identities using eligible-trace and cross-trace predicates.
5163
+ * Queries full-history thread rows using a trace or thread activity window.
5154
5164
  *
5155
- * @param params - Thread query with its eligible trace selection
5156
- * @returns Matching thread identities
5165
+ * @param params - Thread query with its qualification window, filters and pagination
5166
+ * @returns Matching thread rows. Legacy requests retain their identity-only response.
5157
5167
  */
5158
5168
  queryTraceThreads(params) {
5159
5169
  return this.request("/observability/threads/query", {
@@ -6805,10 +6815,12 @@ var AgentControllerSession = class extends BaseResource {
6805
6815
  delayMs: finiteOr(options.reconnect.delayMs, 1e3),
6806
6816
  maxDelayMs: finiteOr(options.reconnect.maxDelayMs, 3e4)
6807
6817
  } : null;
6818
+ const idleTimeoutMs = finiteOr(options.idleTimeoutMs, 6e4);
6808
6819
  /** Exponential backoff for the Nth (1-based) retry of an outage streak. */
6809
6820
  const backoffDelay = (attempt) => reconnectOptions ? Math.min(reconnectOptions.delayMs * 2 ** (attempt - 1), reconnectOptions.maxDelayMs) : 0;
6810
6821
  let cancelled = false;
6811
6822
  let currentReader = null;
6823
+ let currentAbort = null;
6812
6824
  let reconnectTimer;
6813
6825
  let delayResolve;
6814
6826
  const settleDelay = () => {
@@ -6824,8 +6836,39 @@ var AgentControllerSession = class extends BaseResource {
6824
6836
  delayResolve = resolve;
6825
6837
  reconnectTimer = setTimeout(settleDelay, ms);
6826
6838
  });
6839
+ const idleTimeoutError = () => {
6840
+ const error = /* @__PURE__ */ new Error(`Agent controller session stream received no data for ${idleTimeoutMs}ms`);
6841
+ error.name = "AgentControllerStreamIdleError";
6842
+ return error;
6843
+ };
6827
6844
  const requestStream = async () => {
6828
- const response = await this.request(this.url(`${this.base()}/stream`), { stream: true });
6845
+ const abort = new AbortController();
6846
+ currentAbort = abort;
6847
+ let openTimer;
6848
+ const request = this.request(this.url(`${this.base()}/stream`), {
6849
+ stream: true,
6850
+ signal: abort.signal
6851
+ });
6852
+ request.then((response) => {
6853
+ if (abort.signal.aborted) response.body?.cancel().catch(() => {});
6854
+ }).catch(() => {});
6855
+ let response;
6856
+ try {
6857
+ if (idleTimeoutMs > 0) response = await Promise.race([request, new Promise((_resolve, reject) => {
6858
+ openTimer = setTimeout(() => {
6859
+ const error = idleTimeoutError();
6860
+ abort.abort(error);
6861
+ reject(error);
6862
+ }, idleTimeoutMs);
6863
+ })]);
6864
+ else response = await request;
6865
+ } finally {
6866
+ clearTimeout(openTimer);
6867
+ }
6868
+ if (abort.signal.aborted) {
6869
+ response.body?.cancel().catch(() => {});
6870
+ throw abort.signal.reason;
6871
+ }
6829
6872
  if (!response.body) throw new Error("No response body for agent controller session stream");
6830
6873
  return response;
6831
6874
  };
@@ -6851,12 +6894,40 @@ var AgentControllerSession = class extends BaseResource {
6851
6894
  const pump = async (response) => {
6852
6895
  const reader = response.body.getReader();
6853
6896
  currentReader = reader;
6897
+ const abort = currentAbort;
6854
6898
  const decoder = new TextDecoder();
6855
6899
  let buffer = "";
6900
+ let idleTimer;
6901
+ let timedOut = false;
6902
+ const armIdleTimer = () => {
6903
+ if (idleTimeoutMs <= 0) return;
6904
+ clearTimeout(idleTimer);
6905
+ idleTimer = setTimeout(() => {
6906
+ timedOut = true;
6907
+ reader.cancel(idleTimeoutError()).catch(() => {});
6908
+ abort?.abort(idleTimeoutError());
6909
+ }, idleTimeoutMs);
6910
+ };
6856
6911
  try {
6912
+ armIdleTimer();
6857
6913
  while (!cancelled) {
6858
- const { done, value } = await reader.read();
6914
+ let chunk;
6915
+ try {
6916
+ chunk = await reader.read();
6917
+ } catch (error) {
6918
+ if (timedOut && !cancelled) return {
6919
+ kind: "transport_error",
6920
+ error: idleTimeoutError()
6921
+ };
6922
+ throw error;
6923
+ }
6924
+ if (timedOut && !cancelled) return {
6925
+ kind: "transport_error",
6926
+ error: idleTimeoutError()
6927
+ };
6928
+ const { done, value } = chunk;
6859
6929
  if (done) return cancelled ? { kind: "cancelled" } : { kind: "done" };
6930
+ armIdleTimer();
6860
6931
  if (cancelled) return { kind: "cancelled" };
6861
6932
  buffer += decoder.decode(value, { stream: true });
6862
6933
  let separator;
@@ -6890,7 +6961,9 @@ var AgentControllerSession = class extends BaseResource {
6890
6961
  error
6891
6962
  };
6892
6963
  } finally {
6964
+ clearTimeout(idleTimer);
6893
6965
  if (currentReader === reader) currentReader = null;
6966
+ if (currentAbort === abort) currentAbort = null;
6894
6967
  reader.cancel().catch(() => {});
6895
6968
  }
6896
6969
  };
@@ -6967,6 +7040,7 @@ var AgentControllerSession = class extends BaseResource {
6967
7040
  cancelled = true;
6968
7041
  settleDelay();
6969
7042
  currentReader?.cancel().catch(() => {});
7043
+ currentAbort?.abort();
6970
7044
  } };
6971
7045
  }
6972
7046
  /**
@@ -7873,7 +7947,7 @@ var MastraClient = class extends BaseResource {
7873
7947
  getTraceQueryValues(params, options) {
7874
7948
  return this.observability.getTraceQueryValues(params, options);
7875
7949
  }
7876
- /** Queries thread identities using eligible-trace and cross-trace predicates. */
7950
+ /** Queries full-history thread rows using a trace or thread activity window. */
7877
7951
  queryTraceThreads(params) {
7878
7952
  return this.observability.queryTraceThreads(params);
7879
7953
  }