@mastra/factory 0.24.0-alpha.7 → 0.24.0-alpha.8

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 (118) hide show
  1. package/dist/boards/review.d.ts.map +1 -1
  2. package/dist/boards/review.js +21 -1
  3. package/dist/boards/review.js.map +1 -1
  4. package/dist/boards/work-transition-policy.d.ts.map +1 -1
  5. package/dist/boards/work-transition-policy.js +2 -1
  6. package/dist/boards/work-transition-policy.js.map +1 -1
  7. package/dist/factory.d.ts.map +1 -1
  8. package/dist/factory.js +91 -13
  9. package/dist/factory.js.map +1 -1
  10. package/dist/integrations/github/rules.d.ts.map +1 -1
  11. package/dist/integrations/github/rules.js +26 -22
  12. package/dist/integrations/github/rules.js.map +1 -1
  13. package/dist/integrations/github/sandbox.d.ts +2 -3
  14. package/dist/integrations/github/sandbox.d.ts.map +1 -1
  15. package/dist/integrations/github/sandbox.js +78 -7
  16. package/dist/integrations/github/sandbox.js.map +1 -1
  17. package/dist/integrations/gitlab/rules.d.ts.map +1 -1
  18. package/dist/integrations/gitlab/rules.js +28 -21
  19. package/dist/integrations/gitlab/rules.js.map +1 -1
  20. package/dist/integrations/slack/integration.d.ts.map +1 -1
  21. package/dist/integrations/slack/integration.js +33 -6
  22. package/dist/integrations/slack/integration.js.map +1 -1
  23. package/dist/integrations/slack/slack.d.ts.map +1 -1
  24. package/dist/integrations/slack/slack.js +25 -24
  25. package/dist/integrations/slack/slack.js.map +1 -1
  26. package/dist/routes/config.d.ts +4 -0
  27. package/dist/routes/config.d.ts.map +1 -1
  28. package/dist/routes/config.js +20 -6
  29. package/dist/routes/config.js.map +1 -1
  30. package/dist/routes/provider-credentials.d.ts +2 -1
  31. package/dist/routes/provider-credentials.d.ts.map +1 -1
  32. package/dist/routes/provider-credentials.js +6 -2
  33. package/dist/routes/provider-credentials.js.map +1 -1
  34. package/dist/rules/dispatch-errors.d.ts.map +1 -1
  35. package/dist/rules/dispatch-errors.js +12 -0
  36. package/dist/rules/dispatch-errors.js.map +1 -1
  37. package/dist/rules/dispatcher.d.ts.map +1 -1
  38. package/dist/rules/dispatcher.js +42 -3
  39. package/dist/rules/dispatcher.js.map +1 -1
  40. package/dist/session/channel-reply-processor.d.ts +35 -0
  41. package/dist/session/channel-reply-processor.d.ts.map +1 -0
  42. package/dist/session/channel-reply-processor.js +46 -0
  43. package/dist/session/channel-reply-processor.js.map +1 -0
  44. package/dist/session/channel-session-link-processor.d.ts +39 -0
  45. package/dist/session/channel-session-link-processor.d.ts.map +1 -0
  46. package/dist/session/channel-session-link-processor.js +99 -0
  47. package/dist/session/channel-session-link-processor.js.map +1 -0
  48. package/dist/session/factory-session.d.ts +4 -0
  49. package/dist/session/factory-session.d.ts.map +1 -1
  50. package/dist/session/factory-session.js +1 -0
  51. package/dist/session/factory-session.js.map +1 -1
  52. package/dist/session/reply-credential-processor.d.ts.map +1 -1
  53. package/dist/session/reply-credential-processor.js +4 -6
  54. package/dist/session/reply-credential-processor.js.map +1 -1
  55. package/dist/session/run-audit.d.ts +24 -0
  56. package/dist/session/run-audit.d.ts.map +1 -1
  57. package/dist/session/run-audit.js +93 -7
  58. package/dist/session/run-audit.js.map +1 -1
  59. package/dist/session/source-control-tools.d.ts.map +1 -1
  60. package/dist/session/source-control-tools.js.map +1 -1
  61. package/dist/storage/domains/source-control/base.d.ts +7 -0
  62. package/dist/storage/domains/source-control/base.d.ts.map +1 -1
  63. package/dist/storage/domains/source-control/base.js +12 -0
  64. package/dist/storage/domains/source-control/base.js.map +1 -1
  65. package/dist/storage/domains/source-control/inmemory.d.ts +4 -0
  66. package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
  67. package/dist/storage/domains/source-control/inmemory.js +8 -0
  68. package/dist/storage/domains/source-control/inmemory.js.map +1 -1
  69. package/dist/storage/domains/work-items/base.d.ts +2 -2
  70. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  71. package/dist/storage/domains/work-items/base.js +5 -0
  72. package/dist/storage/domains/work-items/base.js.map +1 -1
  73. package/dist/tools/approval-tools.d.ts +1 -1
  74. package/dist/tools/approval-tools.d.ts.map +1 -1
  75. package/dist/tools/approval-tools.js +3 -1
  76. package/dist/tools/approval-tools.js.map +1 -1
  77. package/dist/tools/deliver.d.ts +16 -2
  78. package/dist/tools/deliver.d.ts.map +1 -1
  79. package/dist/tools/deliver.js +12 -2
  80. package/dist/tools/deliver.js.map +1 -1
  81. package/dist/tools/index.d.ts +6 -5
  82. package/dist/tools/index.d.ts.map +1 -1
  83. package/dist/tools/index.js +9 -12
  84. package/dist/tools/index.js.map +1 -1
  85. package/dist/tools/messaging-tools.d.ts +1 -1
  86. package/dist/tools/messaging-tools.d.ts.map +1 -1
  87. package/dist/tools/messaging-tools.js +84 -3
  88. package/dist/tools/messaging-tools.js.map +1 -1
  89. package/dist/tools/permissions.d.ts.map +1 -1
  90. package/dist/tools/permissions.js +3 -0
  91. package/dist/tools/permissions.js.map +1 -1
  92. package/dist/tools/read-tools.d.ts +3 -0
  93. package/dist/tools/read-tools.d.ts.map +1 -1
  94. package/dist/tools/read-tools.js +16 -8
  95. package/dist/tools/read-tools.js.map +1 -1
  96. package/dist/tools/reports.d.ts.map +1 -1
  97. package/dist/tools/reports.js +3 -1
  98. package/dist/tools/reports.js.map +1 -1
  99. package/dist/tools/scope.d.ts +6 -0
  100. package/dist/tools/scope.d.ts.map +1 -1
  101. package/dist/tools/scope.js +10 -1
  102. package/dist/tools/scope.js.map +1 -1
  103. package/dist/tools/session-tools.d.ts +1 -1
  104. package/dist/tools/session-tools.d.ts.map +1 -1
  105. package/dist/tools/session-tools.js +11 -7
  106. package/dist/tools/session-tools.js.map +1 -1
  107. package/dist/tools/sessions-state-processor.d.ts +5 -1
  108. package/dist/tools/sessions-state-processor.d.ts.map +1 -1
  109. package/dist/tools/sessions-state-processor.js +32 -48
  110. package/dist/tools/sessions-state-processor.js.map +1 -1
  111. package/dist/tools/side-sessions.d.ts +53 -0
  112. package/dist/tools/side-sessions.d.ts.map +1 -0
  113. package/dist/tools/side-sessions.js +83 -0
  114. package/dist/tools/side-sessions.js.map +1 -0
  115. package/dist/tools/work-item-tools.d.ts.map +1 -1
  116. package/dist/tools/work-item-tools.js +45 -25
  117. package/dist/tools/work-item-tools.js.map +1 -1
  118. package/package.json +6 -6
@@ -37,7 +37,28 @@ const RECONCILE_INTERVAL_MS = 3e4;
37
37
  /** The card moved on before this run could act; it settles as superseded, not succeeded. */
38
38
  var FactoryDecisionSuperseded = class extends Error {};
39
39
  /** A run that ran and ended in error; the session's own listener reports it to followers. */
40
- var RunEndedInError = class extends Error {};
40
+ var RunEndedInError = class extends FactoryDispatchError {};
41
+ const CREDENTIAL_RESOLUTION_FAILURE = "tenant model credential policy could not be resolved";
42
+ const NO_AUTHENTICATED_USER = "the request has no authenticated user";
43
+ function httpStatus(error) {
44
+ if (!error || typeof error !== "object") return void 0;
45
+ if ("statusCode" in error && typeof error.statusCode === "number") return error.statusCode;
46
+ return "status" in error && typeof error.status === "number" ? error.status : void 0;
47
+ }
48
+ function causeOf(error) {
49
+ return error && typeof error === "object" && "cause" in error ? error.cause : void 0;
50
+ }
51
+ function runErrorCode(error, message) {
52
+ const lower = message.toLowerCase();
53
+ if (lower.includes(CREDENTIAL_RESOLUTION_FAILURE)) return lower.includes(NO_AUTHENTICATED_USER) ? "run_user_unauthenticated" : "run_credentials_unavailable";
54
+ const status = httpStatus(error) ?? httpStatus(causeOf(error));
55
+ return status === 401 || status === 403 ? "run_credentials_unavailable" : "run_failed";
56
+ }
57
+ function runErrorFailure(label, error) {
58
+ const cause = (error instanceof Error ? error.message : String(error ?? "")).trim();
59
+ if (!cause) return new RunEndedInError("run_failed", `${label} ended in error.`);
60
+ return new RunEndedInError(runErrorCode(error, cause), `${label} ended in error: ${cause}`);
61
+ }
41
62
  function isTerminalFailure(attempts, failureCode) {
42
63
  return attempts >= MAX_ATTEMPTS || !factoryDispatchFailureMetadata(failureCode).canRetry;
43
64
  }
@@ -59,10 +80,12 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
59
80
  let supersededAtEnd;
60
81
  let parked;
61
82
  let omFailure;
83
+ let runError;
62
84
  const arm = () => {
63
85
  endReason = void 0;
64
86
  supersededAtEnd = void 0;
65
87
  omFailure = void 0;
88
+ runError = void 0;
66
89
  agentEnd = new Promise((resolve) => {
67
90
  resolveAgentEnd = resolve;
68
91
  });
@@ -75,6 +98,10 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
75
98
  resolveAgentEnd();
76
99
  return;
77
100
  }
101
+ if (event.type === "error") {
102
+ runError = event.error;
103
+ return;
104
+ }
78
105
  if (event.type === "om_observation_failed" || event.type === "om_buffering_failed") {
79
106
  if (event.error) omFailure = event.error;
80
107
  return;
@@ -119,7 +146,7 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
119
146
  observed = await wait();
120
147
  }
121
148
  if (!observed) throw new FactoryDispatchError("run_terminal_event_missing", `${label} terminal event was not observed before timeout.`);
122
- if (endReason === "error") throw new RunEndedInError(`${label} ended in error.`);
149
+ if (endReason === "error") throw runErrorFailure(label, runError);
123
150
  if (endReason === "aborted") {
124
151
  if (omFailure) {
125
152
  if (isPermanentProviderRejection(omFailure)) throw new FactoryDispatchError("run_configuration_invalid", `${label} was aborted by an observational-memory failure that will not succeed on retry: ${omFailure}`);
@@ -164,8 +191,20 @@ function factoryRequestContext(input) {
164
191
  function positiveMs(value, fallback) {
165
192
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
166
193
  }
194
+ const KEY_SHAPED_TOKEN = /\b(?:sk-[A-Za-z0-9_-]{3,}|gh[pousr]_[A-Za-z0-9]{10,}|github_pat_[A-Za-z0-9_]{10,}|xox[abprs]-[A-Za-z0-9-]{10,})/g;
195
+ function looksLikeSecret(token) {
196
+ return /[A-Z]/.test(token) && /[a-z]/.test(token) && /\d/.test(token) && /[A-Za-z0-9]{16,}/.test(token);
197
+ }
198
+ function redactSecretRun(token) {
199
+ if (looksLikeSecret(token) && !token.split("/").some((piece) => /^[A-Za-z][a-z]+$/.test(piece))) return "[redacted]";
200
+ return token.replace(/[A-Za-z0-9_+=-]{24,}/g, (piece) => looksLikeSecret(piece) || isGroupedKey(piece) ? "[redacted]" : piece);
201
+ }
202
+ function isGroupedKey(token) {
203
+ const groups = token.split(/[-_]/);
204
+ return groups.length >= 4 && groups.every((group) => /[A-Z]/.test(group) && /[a-z]/.test(group) && /\d/.test(group));
205
+ }
167
206
  function sanitizeDispatchError(error) {
168
- return (error instanceof Error ? error.message : String(error)).replace(/\b(?:bearer|token|api[-_ ]?key|authorization)\s*[:=]?\s*[^\s,;]+/gi, "[redacted]").slice(0, MAX_ERROR_LENGTH);
207
+ return (error instanceof Error ? error.message : String(error)).replace(KEY_SHAPED_TOKEN, "[redacted]").replace(/\b[A-Za-z0-9_+=/-]{24,}/g, redactSecretRun).replace(/\b(?:bearer|token|api[-_ ]?key|authorization)\s*[:=]?\s*(?:bearer\s+)?[^\s,;]+/gi, "[redacted]").slice(0, MAX_ERROR_LENGTH);
169
208
  }
170
209
  function retryAt(now, attempts) {
171
210
  return new Date(now.getTime() + Math.min(1e3 * 2 ** Math.max(0, attempts - 1), MAX_BACKOFF_MS));