@mastra/factory 0.24.0-alpha.1 → 0.24.0-alpha.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 (190) hide show
  1. package/README.md +103 -4
  2. package/dist/auth.d.ts +14 -0
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +45 -9
  5. package/dist/auth.js.map +1 -1
  6. package/dist/boards/work-transition-policy.d.ts.map +1 -1
  7. package/dist/boards/work-transition-policy.js +10 -0
  8. package/dist/boards/work-transition-policy.js.map +1 -1
  9. package/dist/boards/work.d.ts +14 -0
  10. package/dist/boards/work.d.ts.map +1 -1
  11. package/dist/boards/work.js +70 -7
  12. package/dist/boards/work.js.map +1 -1
  13. package/dist/capabilities/version-control.d.ts +26 -0
  14. package/dist/capabilities/version-control.d.ts.map +1 -1
  15. package/dist/factory.d.ts +8 -0
  16. package/dist/factory.d.ts.map +1 -1
  17. package/dist/factory.js +191 -16
  18. package/dist/factory.js.map +1 -1
  19. package/dist/integrations/github/integration.d.ts.map +1 -1
  20. package/dist/integrations/github/integration.js +37 -1
  21. package/dist/integrations/github/integration.js.map +1 -1
  22. package/dist/integrations/gitlab/api.d.ts +15 -0
  23. package/dist/integrations/gitlab/api.d.ts.map +1 -1
  24. package/dist/integrations/gitlab/api.js +9 -0
  25. package/dist/integrations/gitlab/api.js.map +1 -1
  26. package/dist/integrations/gitlab/version-control.d.ts.map +1 -1
  27. package/dist/integrations/gitlab/version-control.js +37 -3
  28. package/dist/integrations/gitlab/version-control.js.map +1 -1
  29. package/dist/integrations/platform/github/integration.d.ts.map +1 -1
  30. package/dist/integrations/platform/github/integration.js +27 -1
  31. package/dist/integrations/platform/github/integration.js.map +1 -1
  32. package/dist/integrations/subscription-session.d.ts +15 -0
  33. package/dist/integrations/subscription-session.d.ts.map +1 -1
  34. package/dist/integrations/subscription-session.js +30 -13
  35. package/dist/integrations/subscription-session.js.map +1 -1
  36. package/dist/mcp/disconnect.d.ts +10 -0
  37. package/dist/mcp/disconnect.d.ts.map +1 -0
  38. package/dist/mcp/disconnect.js +44 -0
  39. package/dist/mcp/disconnect.js.map +1 -0
  40. package/dist/mcp/routes.d.ts +46 -0
  41. package/dist/mcp/routes.d.ts.map +1 -0
  42. package/dist/mcp/routes.js +243 -0
  43. package/dist/mcp/routes.js.map +1 -0
  44. package/dist/provider-display-name.d.ts +2 -0
  45. package/dist/provider-display-name.d.ts.map +1 -0
  46. package/dist/provider-display-name.js +16 -0
  47. package/dist/provider-display-name.js.map +1 -0
  48. package/dist/routes/config.js +2 -2
  49. package/dist/routes/config.js.map +1 -1
  50. package/dist/routes/contracts.d.ts +4 -0
  51. package/dist/routes/contracts.d.ts.map +1 -1
  52. package/dist/routes/contracts.js +3 -1
  53. package/dist/routes/contracts.js.map +1 -1
  54. package/dist/routes/oauth.js +1 -1
  55. package/dist/routes/oauth.js.map +1 -1
  56. package/dist/routes/provider-credentials.d.ts +6 -2
  57. package/dist/routes/provider-credentials.d.ts.map +1 -1
  58. package/dist/routes/provider-credentials.js +20 -7
  59. package/dist/routes/provider-credentials.js.map +1 -1
  60. package/dist/routes/source-control-sessions.d.ts +1 -0
  61. package/dist/routes/source-control-sessions.d.ts.map +1 -1
  62. package/dist/routes/source-control-sessions.js +1 -1
  63. package/dist/routes/source-control-sessions.js.map +1 -1
  64. package/dist/routes/surface.d.ts +1 -0
  65. package/dist/routes/surface.d.ts.map +1 -1
  66. package/dist/routes/surface.js +4 -3
  67. package/dist/routes/surface.js.map +1 -1
  68. package/dist/routes/work-items.d.ts.map +1 -1
  69. package/dist/routes/work-items.js +61 -121
  70. package/dist/routes/work-items.js.map +1 -1
  71. package/dist/rules/dispatcher.d.ts +7 -0
  72. package/dist/rules/dispatcher.d.ts.map +1 -1
  73. package/dist/rules/dispatcher.js +62 -5
  74. package/dist/rules/dispatcher.js.map +1 -1
  75. package/dist/rules/processor.d.ts.map +1 -1
  76. package/dist/rules/processor.js +2 -1
  77. package/dist/rules/processor.js.map +1 -1
  78. package/dist/rules/tools.d.ts.map +1 -1
  79. package/dist/rules/tools.js +82 -3
  80. package/dist/rules/tools.js.map +1 -1
  81. package/dist/rules/transition-service.d.ts +17 -0
  82. package/dist/rules/transition-service.d.ts.map +1 -1
  83. package/dist/rules/transition-service.js +25 -0
  84. package/dist/rules/transition-service.js.map +1 -1
  85. package/dist/rules/types.d.ts +2 -4
  86. package/dist/rules/types.d.ts.map +1 -1
  87. package/dist/rules/types.js +1 -4
  88. package/dist/rules/types.js.map +1 -1
  89. package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -1
  90. package/dist/sandbox/local-factory-sandbox.js +1 -0
  91. package/dist/sandbox/local-factory-sandbox.js.map +1 -1
  92. package/dist/session/factory-session.d.ts +15 -1
  93. package/dist/session/factory-session.d.ts.map +1 -1
  94. package/dist/session/factory-session.js +4 -2
  95. package/dist/session/factory-session.js.map +1 -1
  96. package/dist/session/reply-credential-processor.d.ts +15 -0
  97. package/dist/session/reply-credential-processor.d.ts.map +1 -0
  98. package/dist/session/reply-credential-processor.js +40 -0
  99. package/dist/session/reply-credential-processor.js.map +1 -0
  100. package/dist/session/source-control-tools.d.ts +19 -1
  101. package/dist/session/source-control-tools.d.ts.map +1 -1
  102. package/dist/session/source-control-tools.js +70 -3
  103. package/dist/session/source-control-tools.js.map +1 -1
  104. package/dist/storage/domains/audit/domain.js +1 -1
  105. package/dist/storage/domains/projects/base.d.ts +6 -0
  106. package/dist/storage/domains/projects/base.d.ts.map +1 -1
  107. package/dist/storage/domains/projects/base.js +12 -0
  108. package/dist/storage/domains/projects/base.js.map +1 -1
  109. package/dist/storage/domains/source-control/base.d.ts +17 -0
  110. package/dist/storage/domains/source-control/base.d.ts.map +1 -1
  111. package/dist/storage/domains/source-control/base.js +23 -0
  112. package/dist/storage/domains/source-control/base.js.map +1 -1
  113. package/dist/storage/domains/source-control/inmemory.d.ts +4 -0
  114. package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
  115. package/dist/storage/domains/source-control/inmemory.js +5 -1
  116. package/dist/storage/domains/source-control/inmemory.js.map +1 -1
  117. package/dist/storage/domains/work-items/base.d.ts +56 -0
  118. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  119. package/dist/storage/domains/work-items/base.js +139 -25
  120. package/dist/storage/domains/work-items/base.js.map +1 -1
  121. package/dist/tools/annotations.d.ts +7 -0
  122. package/dist/tools/annotations.d.ts.map +1 -0
  123. package/dist/tools/annotations.js +102 -0
  124. package/dist/tools/annotations.js.map +1 -0
  125. package/dist/tools/approval-tools.d.ts +15 -0
  126. package/dist/tools/approval-tools.d.ts.map +1 -0
  127. package/dist/tools/approval-tools.js +77 -0
  128. package/dist/tools/approval-tools.js.map +1 -0
  129. package/dist/tools/deliver.d.ts +54 -0
  130. package/dist/tools/deliver.d.ts.map +1 -0
  131. package/dist/tools/deliver.js +105 -0
  132. package/dist/tools/deliver.js.map +1 -0
  133. package/dist/tools/index.d.ts +29 -0
  134. package/dist/tools/index.d.ts.map +1 -0
  135. package/dist/tools/index.js +39 -0
  136. package/dist/tools/index.js.map +1 -0
  137. package/dist/tools/messaging-tools.d.ts +28 -0
  138. package/dist/tools/messaging-tools.d.ts.map +1 -0
  139. package/dist/tools/messaging-tools.js +312 -0
  140. package/dist/tools/messaging-tools.js.map +1 -0
  141. package/dist/tools/permissions.d.ts +31 -0
  142. package/dist/tools/permissions.d.ts.map +1 -0
  143. package/dist/tools/permissions.js +44 -0
  144. package/dist/tools/permissions.js.map +1 -0
  145. package/dist/tools/read-tools.d.ts +27 -0
  146. package/dist/tools/read-tools.d.ts.map +1 -0
  147. package/dist/tools/read-tools.js +285 -0
  148. package/dist/tools/read-tools.js.map +1 -0
  149. package/dist/tools/reports.d.ts +163 -0
  150. package/dist/tools/reports.d.ts.map +1 -0
  151. package/dist/tools/reports.js +352 -0
  152. package/dist/tools/reports.js.map +1 -0
  153. package/dist/tools/run-watch.d.ts +46 -0
  154. package/dist/tools/run-watch.d.ts.map +1 -0
  155. package/dist/tools/run-watch.js +102 -0
  156. package/dist/tools/run-watch.js.map +1 -0
  157. package/dist/tools/scope.d.ts +45 -0
  158. package/dist/tools/scope.d.ts.map +1 -0
  159. package/dist/tools/scope.js +73 -0
  160. package/dist/tools/scope.js.map +1 -0
  161. package/dist/tools/session-tools.d.ts +31 -0
  162. package/dist/tools/session-tools.d.ts.map +1 -0
  163. package/dist/tools/session-tools.js +312 -0
  164. package/dist/tools/session-tools.js.map +1 -0
  165. package/dist/tools/sessions-state-processor.d.ts +37 -0
  166. package/dist/tools/sessions-state-processor.d.ts.map +1 -0
  167. package/dist/tools/sessions-state-processor.js +206 -0
  168. package/dist/tools/sessions-state-processor.js.map +1 -0
  169. package/dist/tools/work-item-tools.d.ts +28 -0
  170. package/dist/tools/work-item-tools.d.ts.map +1 -0
  171. package/dist/tools/work-item-tools.js +322 -0
  172. package/dist/tools/work-item-tools.js.map +1 -0
  173. package/dist/work-items/create-work-item.d.ts +55 -0
  174. package/dist/work-items/create-work-item.d.ts.map +1 -0
  175. package/dist/work-items/create-work-item.js +101 -0
  176. package/dist/work-items/create-work-item.js.map +1 -0
  177. package/dist/work-items/decision-actions.d.ts +42 -0
  178. package/dist/work-items/decision-actions.d.ts.map +1 -0
  179. package/dist/work-items/decision-actions.js +70 -0
  180. package/dist/work-items/decision-actions.js.map +1 -0
  181. package/dist/workspace.d.ts.map +1 -1
  182. package/dist/workspace.js +3 -1
  183. package/dist/workspace.js.map +1 -1
  184. package/factory-skills/factory-gitlab-rereview/SKILL.md +1 -1
  185. package/factory-skills/factory-gitlab-review/SKILL.md +1 -1
  186. package/factory-skills/factory-plan/SKILL.md +4 -4
  187. package/factory-skills/factory-rereview/SKILL.md +3 -1
  188. package/factory-skills/factory-review/SKILL.md +3 -1
  189. package/factory-skills/factory-self-review/SKILL.md +46 -0
  190. package/package.json +13 -11
@@ -6,10 +6,10 @@ import "../boards/index.js";
6
6
  import { FactoryDispatchError, factoryDispatchFailureCode, factoryDispatchFailureMetadata } from "./dispatch-errors.js";
7
7
  import { FACTORY_RULE_MATERIALIZATION_KEY, WorkItemClaimConflictError } from "../storage/domains/work-items/base.js";
8
8
  import { moveCardToBoard } from "../boards/relocate.js";
9
- import { isHumanActorId } from "../storage/domains/audit/actors.js";
10
- import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
11
9
  import { decisionOvertaken } from "./decision-applicability.js";
12
10
  import { FACTORY_OPEN_RUN_STALE_MS, heartbeatSessionOpenRun, isOpenRunLiveElsewhere, listSessionOpenRuns, recordSessionRunStart, waitForSessionRunAudit } from "../session/run-audit.js";
11
+ import { isHumanActorId } from "../storage/domains/audit/actors.js";
12
+ import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
13
13
  import { withWorkItemFeed } from "../storage/domains/comments/feed-context.js";
14
14
  import { RequestContext } from "@mastra/core/request-context";
15
15
  //#region src/rules/dispatcher.ts
@@ -36,6 +36,8 @@ const STALE_BINDING_TTL_MS = 1440 * 6e4;
36
36
  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
+ /** A run that ran and ended in error; the session's own listener reports it to followers. */
40
+ var RunEndedInError = class extends Error {};
39
41
  function isTerminalFailure(attempts, failureCode) {
40
42
  return attempts >= MAX_ATTEMPTS || !factoryDispatchFailureMetadata(failureCode).canRetry;
41
43
  }
@@ -100,6 +102,8 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
100
102
  wait,
101
103
  supersededAtEnd: () => supersededAtEnd,
102
104
  endReason: () => endReason,
105
+ /** The tool the run is parked on, when it ended suspended. */
106
+ parked: () => parked,
103
107
  close: unsubscribe,
104
108
  /** The run's own verdict, thrown as what the dispatcher should record. */
105
109
  async settle() {
@@ -115,7 +119,7 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
115
119
  observed = await wait();
116
120
  }
117
121
  if (!observed) throw new FactoryDispatchError("run_terminal_event_missing", `${label} terminal event was not observed before timeout.`);
118
- if (endReason === "error") throw new Error(`${label} ended in error.`);
122
+ if (endReason === "error") throw new RunEndedInError(`${label} ended in error.`);
119
123
  if (endReason === "aborted") {
120
124
  if (omFailure) {
121
125
  if (isPermanentProviderRejection(omFailure)) throw new FactoryDispatchError("run_configuration_invalid", `${label} was aborted by an observational-memory failure that will not succeed on retry: ${omFailure}`);
@@ -243,6 +247,7 @@ var FactoryDecisionDispatcher = class {
243
247
  #reconcileToolResults;
244
248
  #prepareBinding;
245
249
  #primeCredentials;
250
+ #reportRunEnd;
246
251
  #feedReader;
247
252
  #dismissStaleReviews;
248
253
  #resolveLinkedWorkItemParentId;
@@ -275,6 +280,7 @@ var FactoryDecisionDispatcher = class {
275
280
  this.#reconcileToolResults = options.reconcileToolResults;
276
281
  this.#prepareBinding = options.prepareBinding;
277
282
  this.#primeCredentials = options.primeCredentials;
283
+ this.#reportRunEnd = options.reportRunEnd;
278
284
  this.#feedReader = options.feedReader;
279
285
  this.#dismissStaleReviews = options.dismissStaleReviews;
280
286
  this.#resolveLinkedWorkItemParentId = options.resolveLinkedWorkItemParentId;
@@ -654,6 +660,7 @@ var FactoryDecisionDispatcher = class {
654
660
  }));
655
661
  if (await kickoffStale()) throw new FactoryDecisionSuperseded();
656
662
  }
663
+ const since = /* @__PURE__ */ new Date();
657
664
  const run = watchRun(session, {
658
665
  timeoutMs: this.#skillCompletionObservationTimeoutMs,
659
666
  approvePlans: await this.#plansAreAutoApproved(record),
@@ -686,7 +693,13 @@ var FactoryDecisionDispatcher = class {
686
693
  }
687
694
  await this.#recordRunStart(session, binding, deliveryId, record.approvedBy ?? void 0, run.endReason, item?.title);
688
695
  try {
689
- await this.#withOpenRunHeartbeat(session, deliveryId, () => run.settle());
696
+ await this.#reportingRunEnd({
697
+ binding,
698
+ startedBy,
699
+ since,
700
+ attempts: record.attempts,
701
+ superseded: async () => await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role)
702
+ }, () => this.#withOpenRunHeartbeat(session, deliveryId, () => run.settle()));
690
703
  } catch (error) {
691
704
  if (!(await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role))) throw error;
692
705
  }
@@ -1045,6 +1058,44 @@ var FactoryDecisionDispatcher = class {
1045
1058
  clearInterval(timer);
1046
1059
  }
1047
1060
  }
1061
+ /**
1062
+ * Settle a watched run; when it fails terminally, tell the item's followers.
1063
+ * A retryable failure says nothing, since the retry reports. How a run that
1064
+ * ran ends (done, blocked, an error) is reported by the session's own
1065
+ * listener; this covers failures no run end shows. The reporter skips
1066
+ * recipients that already have a final report from this run, and never
1067
+ * throws, so reporting can't change the decision's outcome.
1068
+ */
1069
+ async #reportingRunEnd({ binding, startedBy, since, attempts, superseded }, settle) {
1070
+ try {
1071
+ await settle();
1072
+ } catch (error) {
1073
+ const reportRunEnd = this.#reportRunEnd;
1074
+ if (reportRunEnd && !(error instanceof RunEndedInError) && !(error instanceof FactoryDecisionSuperseded) && !await superseded?.()) {
1075
+ const failureCode = factoryDispatchFailureCode(error);
1076
+ if (isTerminalFailure(attempts, failureCode)) reportRunEnd({
1077
+ orgId: binding.orgId,
1078
+ factoryProjectId: binding.factoryProjectId,
1079
+ workItemId: binding.workItemId,
1080
+ role: binding.role,
1081
+ sender: {
1082
+ sessionId: binding.sessionId,
1083
+ threadId: binding.threadId,
1084
+ userId: startedBy
1085
+ },
1086
+ since,
1087
+ outcome: {
1088
+ status: "failed",
1089
+ failureCode,
1090
+ reason: sanitizeDispatchError(error)
1091
+ }
1092
+ }).catch((reportError) => {
1093
+ console.warn(`[factory] run-end report failed for binding ${binding.id}:`, reportError);
1094
+ });
1095
+ }
1096
+ throw error;
1097
+ }
1098
+ }
1048
1099
  async #recordRunStart(session, binding, kickoffId, approvedBy, observedEnd, workItemName) {
1049
1100
  if (!this.#audit) return;
1050
1101
  const humanApproved = isHumanActorId(approvedBy);
@@ -1092,6 +1143,7 @@ var FactoryDecisionDispatcher = class {
1092
1143
  userId: startedBy,
1093
1144
  orgId: record.orgId
1094
1145
  });
1146
+ const since = /* @__PURE__ */ new Date();
1095
1147
  const run = watchRun(session, {
1096
1148
  timeoutMs: this.#skillCompletionObservationTimeoutMs,
1097
1149
  approvePlans: await this.#plansAreAutoApproved(record),
@@ -1121,7 +1173,12 @@ var FactoryDecisionDispatcher = class {
1121
1173
  settled = await sendKickoff(`factory-kickoff:${record.kickoffKey}:retry:${record.attempts}:${deliveryGeneration}`);
1122
1174
  }
1123
1175
  await this.#recordRunStart(session, binding, `factory-kickoff:${record.kickoffKey}:${record.attempts}`, startedBy, run.endReason, item?.title);
1124
- await run.settle();
1176
+ await this.#reportingRunEnd({
1177
+ binding,
1178
+ startedBy,
1179
+ since,
1180
+ attempts: record.attempts
1181
+ }, () => run.settle());
1125
1182
  } finally {
1126
1183
  run.close();
1127
1184
  }