@mastra/factory 0.15.1-alpha.0 → 0.16.0-alpha.11

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 (372) hide show
  1. package/README.md +41 -3
  2. package/dist/auth.js +1 -1
  3. package/dist/auth.js.map +1 -1
  4. package/dist/boards/index.d.ts +1 -1
  5. package/dist/boards/index.d.ts.map +1 -1
  6. package/dist/boards/index.js +2 -2
  7. package/dist/boards/index.js.map +1 -1
  8. package/dist/boards/review.d.ts.map +1 -1
  9. package/dist/boards/review.js +23 -9
  10. package/dist/boards/review.js.map +1 -1
  11. package/dist/boards/semantics.d.ts +7 -0
  12. package/dist/boards/semantics.d.ts.map +1 -1
  13. package/dist/boards/semantics.js +15 -1
  14. package/dist/boards/semantics.js.map +1 -1
  15. package/dist/boards/work.d.ts.map +1 -1
  16. package/dist/boards/work.js +68 -6
  17. package/dist/boards/work.js.map +1 -1
  18. package/dist/capabilities/intake.d.ts +8 -0
  19. package/dist/capabilities/intake.d.ts.map +1 -1
  20. package/dist/capabilities/version-control.d.ts +15 -0
  21. package/dist/capabilities/version-control.d.ts.map +1 -1
  22. package/dist/factory.d.ts +8 -5
  23. package/dist/factory.d.ts.map +1 -1
  24. package/dist/factory.js +136 -53
  25. package/dist/factory.js.map +1 -1
  26. package/dist/integrations/base.d.ts +5 -0
  27. package/dist/integrations/base.d.ts.map +1 -1
  28. package/dist/integrations/github/integration.d.ts.map +1 -1
  29. package/dist/integrations/github/integration.js +21 -0
  30. package/dist/integrations/github/integration.js.map +1 -1
  31. package/dist/integrations/github/routes.js +2 -1
  32. package/dist/integrations/github/routes.js.map +1 -1
  33. package/dist/integrations/github/sandbox.d.ts +41 -42
  34. package/dist/integrations/github/sandbox.d.ts.map +1 -1
  35. package/dist/integrations/github/sandbox.js +416 -227
  36. package/dist/integrations/github/sandbox.js.map +1 -1
  37. package/dist/integrations/github/webhook.d.ts +2 -5
  38. package/dist/integrations/github/webhook.d.ts.map +1 -1
  39. package/dist/integrations/github/webhook.js +8 -48
  40. package/dist/integrations/github/webhook.js.map +1 -1
  41. package/dist/integrations/gitlab/agent-tools.d.ts +14 -0
  42. package/dist/integrations/gitlab/agent-tools.d.ts.map +1 -0
  43. package/dist/integrations/gitlab/agent-tools.js +42 -0
  44. package/dist/integrations/gitlab/agent-tools.js.map +1 -0
  45. package/dist/integrations/gitlab/api.d.ts +222 -0
  46. package/dist/integrations/gitlab/api.d.ts.map +1 -0
  47. package/dist/integrations/gitlab/api.js +274 -0
  48. package/dist/integrations/gitlab/api.js.map +1 -0
  49. package/dist/integrations/gitlab/default-rules.d.ts +125 -0
  50. package/dist/integrations/gitlab/default-rules.d.ts.map +1 -0
  51. package/dist/integrations/gitlab/default-rules.js +172 -0
  52. package/dist/integrations/gitlab/default-rules.js.map +1 -0
  53. package/dist/integrations/gitlab/integration.d.ts +138 -0
  54. package/dist/integrations/gitlab/integration.d.ts.map +1 -0
  55. package/dist/integrations/gitlab/integration.js +705 -0
  56. package/dist/integrations/gitlab/integration.js.map +1 -0
  57. package/dist/integrations/gitlab/issue-reconciler.d.ts +6 -0
  58. package/dist/integrations/gitlab/issue-reconciler.d.ts.map +1 -0
  59. package/dist/integrations/gitlab/issue-reconciler.js +123 -0
  60. package/dist/integrations/gitlab/issue-reconciler.js.map +1 -0
  61. package/dist/integrations/gitlab/merge-request-reconciler.d.ts +6 -0
  62. package/dist/integrations/gitlab/merge-request-reconciler.d.ts.map +1 -0
  63. package/dist/integrations/gitlab/merge-request-reconciler.js +267 -0
  64. package/dist/integrations/gitlab/merge-request-reconciler.js.map +1 -0
  65. package/dist/integrations/gitlab/reconciler.d.ts +5 -0
  66. package/dist/integrations/gitlab/reconciler.d.ts.map +1 -0
  67. package/dist/integrations/gitlab/reconciler.js +31 -0
  68. package/dist/integrations/gitlab/reconciler.js.map +1 -0
  69. package/dist/integrations/gitlab/reconciliation-config.d.ts +3 -0
  70. package/dist/integrations/gitlab/reconciliation-config.d.ts.map +1 -0
  71. package/dist/integrations/gitlab/reconciliation-config.js +17 -0
  72. package/dist/integrations/gitlab/reconciliation-config.js.map +1 -0
  73. package/dist/integrations/gitlab/routes.d.ts +20 -0
  74. package/dist/integrations/gitlab/routes.d.ts.map +1 -0
  75. package/dist/integrations/gitlab/routes.js +473 -0
  76. package/dist/integrations/gitlab/routes.js.map +1 -0
  77. package/dist/integrations/gitlab/rules.d.ts +35 -0
  78. package/dist/integrations/gitlab/rules.d.ts.map +1 -0
  79. package/dist/integrations/gitlab/rules.js +391 -0
  80. package/dist/integrations/gitlab/rules.js.map +1 -0
  81. package/dist/integrations/gitlab/session-subscriptions.d.ts +32 -0
  82. package/dist/integrations/gitlab/session-subscriptions.d.ts.map +1 -0
  83. package/dist/integrations/gitlab/session-subscriptions.js +192 -0
  84. package/dist/integrations/gitlab/session-subscriptions.js.map +1 -0
  85. package/dist/integrations/gitlab/subscriptions.d.ts +70 -0
  86. package/dist/integrations/gitlab/subscriptions.d.ts.map +1 -0
  87. package/dist/integrations/gitlab/subscriptions.js +76 -0
  88. package/dist/integrations/gitlab/subscriptions.js.map +1 -0
  89. package/dist/integrations/gitlab/version-control.d.ts +16 -0
  90. package/dist/integrations/gitlab/version-control.d.ts.map +1 -0
  91. package/dist/integrations/gitlab/version-control.js +622 -0
  92. package/dist/integrations/gitlab/version-control.js.map +1 -0
  93. package/dist/integrations/gitlab/webhook-dispatch.d.ts +75 -0
  94. package/dist/integrations/gitlab/webhook-dispatch.d.ts.map +1 -0
  95. package/dist/integrations/gitlab/webhook-dispatch.js +235 -0
  96. package/dist/integrations/gitlab/webhook-dispatch.js.map +1 -0
  97. package/dist/integrations/gitlab/webhook.d.ts +72 -0
  98. package/dist/integrations/gitlab/webhook.d.ts.map +1 -0
  99. package/dist/integrations/gitlab/webhook.js +201 -0
  100. package/dist/integrations/gitlab/webhook.js.map +1 -0
  101. package/dist/integrations/incidentio/agent-tools.d.ts +49 -0
  102. package/dist/integrations/incidentio/agent-tools.d.ts.map +1 -0
  103. package/dist/integrations/incidentio/agent-tools.js +90 -0
  104. package/dist/integrations/incidentio/agent-tools.js.map +1 -0
  105. package/dist/integrations/incidentio/claim.d.ts +8 -0
  106. package/dist/integrations/incidentio/claim.d.ts.map +1 -0
  107. package/dist/integrations/incidentio/claim.js +14 -0
  108. package/dist/integrations/incidentio/claim.js.map +1 -0
  109. package/dist/integrations/incidentio/default-rules.d.ts +46 -0
  110. package/dist/integrations/incidentio/default-rules.d.ts.map +1 -0
  111. package/dist/integrations/incidentio/default-rules.js +66 -0
  112. package/dist/integrations/incidentio/default-rules.js.map +1 -0
  113. package/dist/integrations/incidentio/integration.d.ts +48 -2
  114. package/dist/integrations/incidentio/integration.d.ts.map +1 -1
  115. package/dist/integrations/incidentio/integration.js +89 -3
  116. package/dist/integrations/incidentio/integration.js.map +1 -1
  117. package/dist/integrations/incidentio/issue-reconciler.d.ts +2 -0
  118. package/dist/integrations/incidentio/issue-reconciler.d.ts.map +1 -1
  119. package/dist/integrations/incidentio/issue-reconciler.js +38 -2
  120. package/dist/integrations/incidentio/issue-reconciler.js.map +1 -1
  121. package/dist/integrations/incidentio/routes.d.ts +71 -0
  122. package/dist/integrations/incidentio/routes.d.ts.map +1 -0
  123. package/dist/integrations/incidentio/routes.js +245 -0
  124. package/dist/integrations/incidentio/routes.js.map +1 -0
  125. package/dist/integrations/incidentio/rules.d.ts +55 -0
  126. package/dist/integrations/incidentio/rules.d.ts.map +1 -0
  127. package/dist/integrations/incidentio/rules.js +175 -0
  128. package/dist/integrations/incidentio/rules.js.map +1 -0
  129. package/dist/integrations/issue-reconciler.d.ts +3 -3
  130. package/dist/integrations/issue-reconciler.d.ts.map +1 -1
  131. package/dist/integrations/issue-reconciler.js +22 -2
  132. package/dist/integrations/issue-reconciler.js.map +1 -1
  133. package/dist/integrations/jira/adf.d.ts +26 -0
  134. package/dist/integrations/jira/adf.d.ts.map +1 -0
  135. package/dist/integrations/jira/adf.js +73 -0
  136. package/dist/integrations/jira/adf.js.map +1 -0
  137. package/dist/integrations/jira/agent-tools.d.ts +45 -0
  138. package/dist/integrations/jira/agent-tools.d.ts.map +1 -0
  139. package/dist/integrations/jira/agent-tools.js +87 -0
  140. package/dist/integrations/jira/agent-tools.js.map +1 -0
  141. package/dist/integrations/jira/api.d.ts +157 -0
  142. package/dist/integrations/jira/api.d.ts.map +1 -0
  143. package/dist/integrations/jira/api.js +141 -0
  144. package/dist/integrations/jira/api.js.map +1 -0
  145. package/dist/integrations/jira/claim.d.ts +9 -0
  146. package/dist/integrations/jira/claim.d.ts.map +1 -0
  147. package/dist/integrations/jira/claim.js +15 -0
  148. package/dist/integrations/jira/claim.js.map +1 -0
  149. package/dist/integrations/jira/default-rules.d.ts +47 -0
  150. package/dist/integrations/jira/default-rules.d.ts.map +1 -0
  151. package/dist/integrations/jira/default-rules.js +67 -0
  152. package/dist/integrations/jira/default-rules.js.map +1 -0
  153. package/dist/integrations/jira/integration.d.ts +114 -0
  154. package/dist/integrations/jira/integration.d.ts.map +1 -0
  155. package/dist/integrations/jira/integration.js +401 -0
  156. package/dist/integrations/jira/integration.js.map +1 -0
  157. package/dist/integrations/jira/issue-reconciler.d.ts +10 -0
  158. package/dist/integrations/jira/issue-reconciler.d.ts.map +1 -0
  159. package/dist/integrations/jira/issue-reconciler.js +70 -0
  160. package/dist/integrations/jira/issue-reconciler.js.map +1 -0
  161. package/dist/integrations/jira/reconciliation-config.d.ts +3 -0
  162. package/dist/integrations/jira/reconciliation-config.d.ts.map +1 -0
  163. package/dist/integrations/jira/reconciliation-config.js +17 -0
  164. package/dist/integrations/jira/reconciliation-config.js.map +1 -0
  165. package/dist/integrations/jira/routes.d.ts +54 -0
  166. package/dist/integrations/jira/routes.d.ts.map +1 -0
  167. package/dist/integrations/jira/routes.js +260 -0
  168. package/dist/integrations/jira/routes.js.map +1 -0
  169. package/dist/integrations/jira/rules.d.ts +57 -0
  170. package/dist/integrations/jira/rules.d.ts.map +1 -0
  171. package/dist/integrations/jira/rules.js +175 -0
  172. package/dist/integrations/jira/rules.js.map +1 -0
  173. package/dist/integrations/linear/claim.d.ts +8 -0
  174. package/dist/integrations/linear/claim.d.ts.map +1 -0
  175. package/dist/integrations/linear/claim.js +14 -0
  176. package/dist/integrations/linear/claim.js.map +1 -0
  177. package/dist/integrations/linear/default-rules.d.ts +1 -0
  178. package/dist/integrations/linear/default-rules.d.ts.map +1 -1
  179. package/dist/integrations/linear/default-rules.js +2 -0
  180. package/dist/integrations/linear/default-rules.js.map +1 -1
  181. package/dist/integrations/linear/integration.d.ts +24 -6
  182. package/dist/integrations/linear/integration.d.ts.map +1 -1
  183. package/dist/integrations/linear/integration.js +257 -37
  184. package/dist/integrations/linear/integration.js.map +1 -1
  185. package/dist/integrations/linear/routes.d.ts +10 -0
  186. package/dist/integrations/linear/routes.d.ts.map +1 -1
  187. package/dist/integrations/linear/routes.js +74 -10
  188. package/dist/integrations/linear/routes.js.map +1 -1
  189. package/dist/integrations/linear/rules.d.ts +1 -1
  190. package/dist/integrations/linear/rules.d.ts.map +1 -1
  191. package/dist/integrations/linear/rules.js +27 -2
  192. package/dist/integrations/linear/rules.js.map +1 -1
  193. package/dist/integrations/platform/connect/routes.d.ts +39 -0
  194. package/dist/integrations/platform/connect/routes.d.ts.map +1 -0
  195. package/dist/integrations/platform/connect/routes.js +129 -0
  196. package/dist/integrations/platform/connect/routes.js.map +1 -0
  197. package/dist/integrations/platform/github/event-worker.js +1 -1
  198. package/dist/integrations/platform/github/integration.d.ts.map +1 -1
  199. package/dist/integrations/platform/github/integration.js +22 -1
  200. package/dist/integrations/platform/github/integration.js.map +1 -1
  201. package/dist/integrations/platform/gitlab/event-worker.d.ts +64 -0
  202. package/dist/integrations/platform/gitlab/event-worker.d.ts.map +1 -0
  203. package/dist/integrations/platform/gitlab/event-worker.js +306 -0
  204. package/dist/integrations/platform/gitlab/event-worker.js.map +1 -0
  205. package/dist/integrations/platform/gitlab/integration.d.ts +57 -0
  206. package/dist/integrations/platform/gitlab/integration.d.ts.map +1 -0
  207. package/dist/integrations/platform/gitlab/integration.js +125 -0
  208. package/dist/integrations/platform/gitlab/integration.js.map +1 -0
  209. package/dist/integrations/platform/incidentio/integration.d.ts +61 -4
  210. package/dist/integrations/platform/incidentio/integration.d.ts.map +1 -1
  211. package/dist/integrations/platform/incidentio/integration.js +372 -23
  212. package/dist/integrations/platform/incidentio/integration.js.map +1 -1
  213. package/dist/integrations/platform/jira/agent-tools.d.ts +36 -0
  214. package/dist/integrations/platform/jira/agent-tools.d.ts.map +1 -0
  215. package/dist/integrations/platform/jira/agent-tools.js +85 -0
  216. package/dist/integrations/platform/jira/agent-tools.js.map +1 -0
  217. package/dist/integrations/platform/jira/integration.d.ts +65 -0
  218. package/dist/integrations/platform/jira/integration.d.ts.map +1 -0
  219. package/dist/integrations/platform/jira/integration.js +540 -0
  220. package/dist/integrations/platform/jira/integration.js.map +1 -0
  221. package/dist/integrations/platform/jira/routes.d.ts +55 -0
  222. package/dist/integrations/platform/jira/routes.d.ts.map +1 -0
  223. package/dist/integrations/platform/jira/routes.js +274 -0
  224. package/dist/integrations/platform/jira/routes.js.map +1 -0
  225. package/dist/integrations/platform/linear/integration.d.ts +34 -1
  226. package/dist/integrations/platform/linear/integration.d.ts.map +1 -1
  227. package/dist/integrations/platform/linear/integration.js +271 -48
  228. package/dist/integrations/platform/linear/integration.js.map +1 -1
  229. package/dist/integrations/slack/integration.d.ts.map +1 -1
  230. package/dist/integrations/slack/integration.js +3 -3
  231. package/dist/integrations/slack/integration.js.map +1 -1
  232. package/dist/integrations/slack/slack.d.ts +2 -0
  233. package/dist/integrations/slack/slack.d.ts.map +1 -1
  234. package/dist/integrations/slack/slack.js +21 -7
  235. package/dist/integrations/slack/slack.js.map +1 -1
  236. package/dist/integrations/subscription-session.d.ts +37 -0
  237. package/dist/integrations/subscription-session.d.ts.map +1 -0
  238. package/dist/integrations/subscription-session.js +83 -0
  239. package/dist/integrations/subscription-session.js.map +1 -0
  240. package/dist/packages/_internals/workspace/dist/index.js +1 -11
  241. package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
  242. package/dist/routes/intake.d.ts.map +1 -1
  243. package/dist/routes/intake.js +16 -4
  244. package/dist/routes/intake.js.map +1 -1
  245. package/dist/routes/oauth.js +3 -6
  246. package/dist/routes/oauth.js.map +1 -1
  247. package/dist/routes/projects.d.ts +1 -0
  248. package/dist/routes/projects.d.ts.map +1 -1
  249. package/dist/routes/projects.js +1 -0
  250. package/dist/routes/projects.js.map +1 -1
  251. package/dist/routes/source-control-sessions.d.ts +20 -0
  252. package/dist/routes/source-control-sessions.d.ts.map +1 -0
  253. package/dist/routes/source-control-sessions.js +319 -0
  254. package/dist/routes/source-control-sessions.js.map +1 -0
  255. package/dist/routes/source-control-settings.d.ts +10 -0
  256. package/dist/routes/source-control-settings.d.ts.map +1 -0
  257. package/dist/routes/source-control-settings.js +87 -0
  258. package/dist/routes/source-control-settings.js.map +1 -0
  259. package/dist/routes/surface.d.ts +3 -3
  260. package/dist/routes/surface.d.ts.map +1 -1
  261. package/dist/routes/surface.js +79 -17
  262. package/dist/routes/surface.js.map +1 -1
  263. package/dist/routes/tenant-credentials.d.ts +8 -0
  264. package/dist/routes/tenant-credentials.d.ts.map +1 -1
  265. package/dist/routes/tenant-credentials.js +20 -3
  266. package/dist/routes/tenant-credentials.js.map +1 -1
  267. package/dist/routes/work-items.d.ts.map +1 -1
  268. package/dist/routes/work-items.js +1 -1
  269. package/dist/routes/work-items.js.map +1 -1
  270. package/dist/rules/dispatch-errors.d.ts.map +1 -1
  271. package/dist/rules/dispatch-errors.js +8 -0
  272. package/dist/rules/dispatch-errors.js.map +1 -1
  273. package/dist/rules/dispatcher.d.ts +1 -0
  274. package/dist/rules/dispatcher.d.ts.map +1 -1
  275. package/dist/rules/dispatcher.js +186 -106
  276. package/dist/rules/dispatcher.js.map +1 -1
  277. package/dist/rules/index.d.ts +2 -2
  278. package/dist/rules/index.d.ts.map +1 -1
  279. package/dist/rules/index.js +2 -2
  280. package/dist/rules/start-coordinator.d.ts +1 -1
  281. package/dist/rules/start-coordinator.d.ts.map +1 -1
  282. package/dist/rules/start-coordinator.js +7 -3
  283. package/dist/rules/start-coordinator.js.map +1 -1
  284. package/dist/rules/terminal-cleanup.d.ts +14 -1
  285. package/dist/rules/terminal-cleanup.d.ts.map +1 -1
  286. package/dist/rules/terminal-cleanup.js +20 -0
  287. package/dist/rules/terminal-cleanup.js.map +1 -1
  288. package/dist/rules/tools.d.ts +2 -0
  289. package/dist/rules/tools.d.ts.map +1 -1
  290. package/dist/rules/tools.js +30 -2
  291. package/dist/rules/tools.js.map +1 -1
  292. package/dist/rules/transition-service.d.ts +3 -0
  293. package/dist/rules/transition-service.d.ts.map +1 -1
  294. package/dist/rules/transition-service.js +10 -5
  295. package/dist/rules/transition-service.js.map +1 -1
  296. package/dist/rules/types.d.ts +136 -3
  297. package/dist/rules/types.d.ts.map +1 -1
  298. package/dist/rules/types.js +31 -2
  299. package/dist/rules/types.js.map +1 -1
  300. package/dist/rules/validation.d.ts.map +1 -1
  301. package/dist/rules/validation.js +15 -2
  302. package/dist/rules/validation.js.map +1 -1
  303. package/dist/sandbox/git-ref.d.ts +7 -0
  304. package/dist/sandbox/git-ref.d.ts.map +1 -0
  305. package/dist/sandbox/git-ref.js +15 -0
  306. package/dist/sandbox/git-ref.js.map +1 -0
  307. package/dist/sandbox/session-retirement.js +1 -1
  308. package/dist/sandbox/workdir.d.ts.map +1 -1
  309. package/dist/sandbox/workdir.js +6 -6
  310. package/dist/sandbox/workdir.js.map +1 -1
  311. package/dist/session/factory-session.d.ts +31 -1
  312. package/dist/session/factory-session.d.ts.map +1 -1
  313. package/dist/session/factory-session.js +60 -1
  314. package/dist/session/factory-session.js.map +1 -1
  315. package/dist/session/run-audit.d.ts +9 -0
  316. package/dist/session/run-audit.d.ts.map +1 -1
  317. package/dist/session/run-audit.js +37 -6
  318. package/dist/session/run-audit.js.map +1 -1
  319. package/dist/session/source-control-tools.d.ts +16 -0
  320. package/dist/session/source-control-tools.d.ts.map +1 -0
  321. package/dist/session/source-control-tools.js +464 -0
  322. package/dist/session/source-control-tools.js.map +1 -0
  323. package/dist/skills/service.d.ts +12 -0
  324. package/dist/skills/service.d.ts.map +1 -1
  325. package/dist/skills/service.js +27 -1
  326. package/dist/skills/service.js.map +1 -1
  327. package/dist/storage/domains/intake/base.d.ts +18 -0
  328. package/dist/storage/domains/intake/base.d.ts.map +1 -1
  329. package/dist/storage/domains/intake/base.js +77 -0
  330. package/dist/storage/domains/intake/base.js.map +1 -1
  331. package/dist/storage/domains/work-items/base.d.ts +41 -2
  332. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  333. package/dist/storage/domains/work-items/base.js +159 -12
  334. package/dist/storage/domains/work-items/base.js.map +1 -1
  335. package/dist/supervisor/session-messaging.d.ts +23 -0
  336. package/dist/supervisor/session-messaging.d.ts.map +1 -0
  337. package/dist/supervisor/session-messaging.js +15 -0
  338. package/dist/supervisor/session-messaging.js.map +1 -0
  339. package/dist/supervisor/write-tools.d.ts +2 -1
  340. package/dist/supervisor/write-tools.d.ts.map +1 -1
  341. package/dist/supervisor/write-tools.js +11 -7
  342. package/dist/supervisor/write-tools.js.map +1 -1
  343. package/dist/work-item-branch.d.ts +3 -1
  344. package/dist/work-item-branch.d.ts.map +1 -1
  345. package/dist/work-item-branch.js +26 -6
  346. package/dist/work-item-branch.js.map +1 -1
  347. package/dist/workspace.d.ts +15 -1
  348. package/dist/workspace.d.ts.map +1 -1
  349. package/dist/workspace.js +57 -23
  350. package/dist/workspace.js.map +1 -1
  351. package/factory-skills/factory-gitlab-rereview/SKILL.md +19 -0
  352. package/factory-skills/factory-gitlab-review/SKILL.md +30 -0
  353. package/factory-skills/factory-rereview/SKILL.md +13 -6
  354. package/factory-skills/factory-review/SKILL.md +13 -6
  355. package/factory-skills/factory-review/references/archaeology.md +225 -0
  356. package/factory-skills/factory-review/references/categories/README.md +34 -0
  357. package/factory-skills/factory-review/references/categories/behavior-change.md +36 -0
  358. package/factory-skills/factory-review/references/categories/bug-fix.md +37 -0
  359. package/factory-skills/factory-review/references/categories/docs.md +32 -0
  360. package/factory-skills/factory-review/references/categories/experimental-flagged.md +34 -0
  361. package/factory-skills/factory-review/references/categories/infra-tooling.md +37 -0
  362. package/factory-skills/factory-review/references/categories/internal-capability.md +35 -0
  363. package/factory-skills/factory-review/references/categories/large-cross-cutting.md +35 -0
  364. package/factory-skills/factory-review/references/categories/mechanical.md +36 -0
  365. package/factory-skills/factory-review/references/categories/performance.md +33 -0
  366. package/factory-skills/factory-review/references/categories/public-api.md +38 -0
  367. package/factory-skills/factory-review/references/categories/refactor.md +35 -0
  368. package/factory-skills/factory-review/references/categories/revert.md +31 -0
  369. package/factory-skills/factory-review/references/categories/schema-storage.md +39 -0
  370. package/factory-skills/factory-review/references/categories/security.md +35 -0
  371. package/factory-skills/factory-review/references/categories/tests-only.md +38 -0
  372. package/package.json +12 -12
@@ -3,11 +3,11 @@ import { boardForWorkItem, resolvePhaseSemantics, workItemPhaseSemantics } from
3
3
  import { FACTORY_RULE_STAGES, externallyAuthoredWorkItem } from "./types.js";
4
4
  import { createBoardRegistry } from "../boards/registry.js";
5
5
  import "../boards/index.js";
6
- import { FACTORY_RULE_MATERIALIZATION_KEY } from "../storage/domains/work-items/base.js";
6
+ import { FACTORY_RULE_MATERIALIZATION_KEY, WorkItemClaimConflictError } from "../storage/domains/work-items/base.js";
7
7
  import { FactoryDispatchError, factoryDispatchFailureCode, factoryDispatchFailureMetadata } from "./dispatch-errors.js";
8
8
  import { isHumanActorId } from "../storage/domains/audit/actors.js";
9
- import { resolvePromptInvocation, resolveSkillInvocation } from "../skills/service.js";
10
- import { recordSessionRunStart } from "../session/run-audit.js";
9
+ import { resolvePromptInvocation, resolveSkillInvocation, resolveSkillResumeInvocation } from "../skills/service.js";
10
+ import { FACTORY_OPEN_RUN_STALE_MS, heartbeatSessionOpenRun, isOpenRunLiveElsewhere, listSessionOpenRuns, recordSessionRunStart, waitForSessionRunAudit } from "../session/run-audit.js";
11
11
  import { withWorkItemFeed } from "../storage/domains/comments/feed-context.js";
12
12
  import { RequestContext } from "@mastra/core/request-context";
13
13
  import { randomUUID } from "crypto";
@@ -103,7 +103,7 @@ function watchRun(session, { timeoutMs, approvePlans, onAgentEnd, label, runStil
103
103
  });
104
104
  observed = await wait();
105
105
  }
106
- if (!observed) throw new Error(`${label} terminal event was not observed before timeout.`);
106
+ if (!observed) throw new FactoryDispatchError("run_terminal_event_missing", `${label} terminal event was not observed before timeout.`);
107
107
  if (endReason === "error") throw new Error(`${label} ended in error.`);
108
108
  if (endReason === "aborted") {
109
109
  if (omFailure) {
@@ -158,7 +158,7 @@ function retryAt(now, attempts) {
158
158
  return new Date(now.getTime() + Math.min(1e3 * 2 ** Math.max(0, attempts - 1), MAX_BACKOFF_MS));
159
159
  }
160
160
  function externalSourceForDecision(decision) {
161
- const [integrationId, type] = decision.source === "github-pr" ? ["github", "pull-request"] : decision.source === "github-issue" ? ["github", "issue"] : decision.source === "linear-issue" ? ["linear", "issue"] : ["factory", "manual"];
161
+ const [integrationId, type] = decision.source === "github-pr" ? ["github", "pull-request"] : decision.source === "github-issue" ? ["github", "issue"] : decision.source === "gitlab-pr" ? ["gitlab", "pull-request"] : decision.source === "gitlab-issue" ? ["gitlab", "issue"] : decision.source === "linear-issue" ? ["linear", "issue"] : decision.source === "jira-issue" ? ["jira", "issue"] : decision.source === "incidentio-follow-up" ? ["incidentio", "issue"] : ["factory", "manual"];
162
162
  return {
163
163
  integrationId,
164
164
  type,
@@ -174,6 +174,12 @@ function deferredActor(record) {
174
174
  trusted: actor.trusted,
175
175
  factoryAuthored: actor.factoryAuthored
176
176
  };
177
+ if (actor?.type === "gitlab" && typeof actor.username === "string" && typeof actor.trusted === "boolean" && typeof actor.factoryAuthored === "boolean") return {
178
+ type: "gitlab",
179
+ username: actor.username,
180
+ trusted: actor.trusted,
181
+ factoryAuthored: actor.factoryAuthored
182
+ };
177
183
  return {
178
184
  type: "system",
179
185
  id: "factory-rule-dispatcher"
@@ -243,6 +249,7 @@ var FactoryDecisionDispatcher = class {
243
249
  #timer;
244
250
  #activeClaim;
245
251
  #inFlight = /* @__PURE__ */ new Set();
252
+ #bindingSkillRuns = /* @__PURE__ */ new Map();
246
253
  constructor(options) {
247
254
  this.#audit = options.audit;
248
255
  this.#controller = options.controller;
@@ -521,93 +528,120 @@ var FactoryDecisionDispatcher = class {
521
528
  case "invokeSkill": {
522
529
  if (await this.#roleSuperseded(record, decision.role)) return;
523
530
  const binding = await this.#requireOrPrepareBinding(record, decision.role);
524
- const item = record.workItemId ? await this.#storage.get({
525
- orgId: record.orgId,
526
- id: record.workItemId
527
- }) : null;
528
- const startedBy = item?.sessions[binding.role]?.startedBy;
529
- if (!startedBy) throw new Error(`Factory binding ${binding.id} has no authenticated session owner.`);
530
- await this.#primeCredentials?.({
531
- orgId: record.orgId,
532
- userId: startedBy
533
- });
534
- const session = await this.#requireSession(binding);
535
- const requestContext = factoryRequestContext({
536
- session,
537
- binding,
538
- userId: startedBy,
539
- orgId: record.orgId
540
- });
541
- const resolved = decision.skillName === void 0 ? await resolvePromptInvocation(this.#controller, {
542
- resourceId: binding.resourceId,
543
- prompt: decision.prompt
544
- }) : await resolveSkillInvocation(this.#controller, {
545
- resourceId: binding.resourceId,
546
- name: decision.skillName,
547
- arguments: decision.arguments
548
- });
549
- await this.#switchThread(session, binding);
550
- const deliveryId = record.deliveryGeneration === 0 ? record.id : `${record.id}:retry:${record.deliveryGeneration}`;
551
- if ((await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) return;
552
- const kickoffContents = await withWorkItemFeed(this.#feedReader, {
553
- orgId: record.orgId,
554
- factoryProjectId: record.factoryProjectId,
555
- workItemId: record.workItemId
556
- }, resolved.message);
557
- if (decision.cancelInFlight && session.stream.isActive()) session.abort();
558
- const precedingMessage = decision.precedingMessage;
559
- if (precedingMessage) await awaitNotification(() => session.sendNotificationSignal({
560
- source: "factory",
561
- kind: "stage-transition",
562
- summary: precedingMessage,
563
- priority: "medium",
564
- payload: { message: precedingMessage },
565
- sourceId: `${record.id}:stage-transition`,
566
- dedupeKey: `${record.idempotencyKey}:stage-transition`
567
- }, {
568
- ifActive: { behavior: "deliver" },
569
- ifIdle: { behavior: "persist" },
570
- requestContext
571
- }));
572
- const run = watchRun(session, {
573
- timeoutMs: this.#skillCompletionObservationTimeoutMs,
574
- approvePlans: await this.#plansAreAutoApproved(record, item),
575
- onAgentEnd: () => this.#roleSuperseded(record, decision.role),
576
- label: "Factory skill run",
577
- runStillActive: () => this.#controller.listActiveThreadRuns().some((active) => active.threadId === binding.threadId)
578
- });
579
- const sendKickoff = async () => {
580
- const settled = await session.sendSignal({
581
- id: deliveryId,
582
- type: "user",
583
- tagName: "user",
584
- contents: kickoffContents
585
- }, {
586
- requestContext,
587
- requireDelivery: true
588
- }).accepted;
589
- if (settled.action !== "wake" && settled.action !== "deliver") throw new Error(`Factory skill invocation signal did not reach the agent (${String(settled.action)}).`);
590
- return settled;
591
- };
592
- try {
593
- let settled = await sendKickoff();
594
- if (settled.action === "deliver") {
595
- if (!(await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) {
596
- if (!await run.wait()) throw new Error("Factory skill invocation is waiting on a run that has not ended.");
597
- run.arm();
598
- settled = await sendKickoff();
599
- if (settled.action !== "wake") throw new Error("Factory skill invocation was queued onto an ending run and never reached the agent.");
531
+ await this.#withBindingSkillRun(binding.id, async () => {
532
+ const item = record.workItemId ? await this.#storage.get({
533
+ orgId: record.orgId,
534
+ id: record.workItemId
535
+ }) : null;
536
+ const startedBy = item?.sessions[binding.role]?.startedBy;
537
+ if (!startedBy) throw new Error(`Factory binding ${binding.id} has no authenticated session owner.`);
538
+ await this.#primeCredentials?.({
539
+ orgId: record.orgId,
540
+ userId: startedBy
541
+ });
542
+ const session = await this.#requireSession(binding);
543
+ const requestContext = factoryRequestContext({
544
+ session,
545
+ binding,
546
+ userId: startedBy,
547
+ orgId: record.orgId
548
+ });
549
+ const resolved = decision.skillName === void 0 ? await resolvePromptInvocation(this.#controller, {
550
+ resourceId: binding.resourceId,
551
+ prompt: decision.prompt
552
+ }) : decision.resume === true ? await resolveSkillResumeInvocation(this.#controller, {
553
+ resourceId: binding.resourceId,
554
+ name: decision.skillName,
555
+ arguments: decision.arguments
556
+ }) : await resolveSkillInvocation(this.#controller, {
557
+ resourceId: binding.resourceId,
558
+ name: decision.skillName,
559
+ arguments: decision.arguments
560
+ });
561
+ await this.#switchThread(session, binding);
562
+ const deliveryId = record.deliveryGeneration === 0 ? record.id : `${record.id}:retry:${record.deliveryGeneration}`;
563
+ const runStillActive = () => this.#controller.listActiveThreadRuns().some((active) => active.threadId === binding.threadId);
564
+ while (true) {
565
+ const openRun = watchRun(session, {
566
+ timeoutMs: this.#skillCompletionObservationTimeoutMs,
567
+ approvePlans: false,
568
+ label: "Factory skill run",
569
+ runStillActive
570
+ });
571
+ try {
572
+ const open = (await listSessionOpenRuns(session)).filter((entry) => entry.bindingId === binding.id);
573
+ if (open.length === 0) break;
574
+ if (open.some((entry) => isOpenRunLiveElsewhere(entry, this.#ownerId))) throw new FactoryDispatchError("session_unavailable", `Factory binding ${binding.id} has a run in flight on another dispatcher.`);
575
+ if (!runStillActive()) break;
576
+ if (!await openRun.wait()) break;
577
+ } finally {
578
+ openRun.close();
600
579
  }
580
+ await waitForSessionRunAudit(session);
601
581
  }
602
- await this.#recordRunStart(session, binding, deliveryId, record.approvedBy ?? void 0, run.endReason, item?.title);
582
+ if (await this.#roleSuperseded(record, decision.role)) return;
583
+ if ((await this.#requireBinding(record, decision.role)).id !== binding.id) throw new FactoryDispatchError("session_unavailable", `Factory binding ${binding.id} changed while waiting for its open run to end.`);
584
+ if ((await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) return;
585
+ const kickoffContents = await withWorkItemFeed(this.#feedReader, {
586
+ orgId: record.orgId,
587
+ factoryProjectId: record.factoryProjectId,
588
+ workItemId: record.workItemId
589
+ }, resolved.message);
590
+ if (decision.cancelInFlight && session.stream.isActive()) session.abort();
591
+ const precedingMessage = decision.precedingMessage;
592
+ if (precedingMessage) await awaitNotification(() => session.sendNotificationSignal({
593
+ source: "factory",
594
+ kind: "stage-transition",
595
+ summary: precedingMessage,
596
+ priority: "medium",
597
+ payload: { message: precedingMessage },
598
+ sourceId: `${record.id}:stage-transition`,
599
+ dedupeKey: `${record.idempotencyKey}:stage-transition`
600
+ }, {
601
+ ifActive: { behavior: "deliver" },
602
+ ifIdle: { behavior: "persist" },
603
+ requestContext
604
+ }));
605
+ const run = watchRun(session, {
606
+ timeoutMs: this.#skillCompletionObservationTimeoutMs,
607
+ approvePlans: await this.#plansAreAutoApproved(record, item),
608
+ onAgentEnd: () => this.#roleSuperseded(record, decision.role),
609
+ label: "Factory skill run",
610
+ runStillActive
611
+ });
612
+ const sendKickoff = async () => {
613
+ const settled = await session.sendSignal({
614
+ id: deliveryId,
615
+ type: "user",
616
+ tagName: "user",
617
+ contents: kickoffContents
618
+ }, {
619
+ requestContext,
620
+ requireDelivery: true
621
+ }).accepted;
622
+ if (settled.action !== "wake" && settled.action !== "deliver") throw new FactoryDispatchError(settled.action ? "notification_delivery_failed" : "skill_delivery_ambiguous", `Factory skill invocation signal did not reach the agent (${String(settled.action)}).`);
623
+ return settled;
624
+ };
603
625
  try {
604
- await run.settle();
605
- } catch (error) {
606
- if (!(await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role))) throw error;
626
+ let settled = await sendKickoff();
627
+ if (settled.action === "deliver") {
628
+ if (!(await session.thread.listActiveMessages()).some((message) => message.id === deliveryId)) {
629
+ if (!await run.wait()) throw new FactoryDispatchError("run_terminal_event_missing", "Factory skill invocation is waiting on a run whose terminal event was not observed.");
630
+ run.arm();
631
+ settled = await sendKickoff();
632
+ if (settled.action !== "wake") throw new FactoryDispatchError("skill_delivery_ambiguous", "Factory skill invocation was queued onto an ending run and never reached the agent.");
633
+ }
634
+ }
635
+ await this.#recordRunStart(session, binding, deliveryId, record.approvedBy ?? void 0, run.endReason, item?.title);
636
+ try {
637
+ await this.#withOpenRunHeartbeat(session, deliveryId, () => run.settle());
638
+ } catch (error) {
639
+ if (!(await run.supersededAtEnd() ?? await this.#roleSuperseded(record, decision.role))) throw error;
640
+ }
641
+ } finally {
642
+ run.close();
607
643
  }
608
- } finally {
609
- run.close();
610
- }
644
+ });
611
645
  return;
612
646
  }
613
647
  case "sendMessage": {
@@ -680,24 +714,42 @@ var FactoryDecisionDispatcher = class {
680
714
  factoryProjectId: record.factoryProjectId,
681
715
  decision
682
716
  }) ?? null;
683
- let result = await this.#storage.upsert({
684
- orgId: record.orgId,
685
- userId: "factory-rule-dispatcher",
686
- factoryProjectId: record.factoryProjectId,
687
- input: {
688
- externalSource: externalSourceForDecision(decision),
689
- parentWorkItemId,
690
- title: decision.title,
691
- board: decision.board,
692
- stages: [initialPhase],
693
- sessions: {},
694
- metadata: {
695
- ...decision.metadata,
696
- [FACTORY_RULE_MATERIALIZATION_KEY]: record.idempotencyKey
697
- }
698
- },
699
- reuseMode: "preserve"
700
- });
717
+ let result;
718
+ try {
719
+ result = await this.#storage.upsert({
720
+ orgId: record.orgId,
721
+ userId: "factory-rule-dispatcher",
722
+ factoryProjectId: record.factoryProjectId,
723
+ input: {
724
+ externalSource: externalSourceForDecision(decision),
725
+ ...decision.claimKey ? { claimKey: decision.claimKey } : {},
726
+ parentWorkItemId,
727
+ title: decision.title,
728
+ board: decision.board,
729
+ stages: [initialPhase],
730
+ sessions: {},
731
+ metadata: {
732
+ ...decision.metadata,
733
+ [FACTORY_RULE_MATERIALIZATION_KEY]: record.idempotencyKey
734
+ }
735
+ },
736
+ reuseMode: "preserve"
737
+ });
738
+ } catch (error) {
739
+ if (error instanceof WorkItemClaimConflictError) return;
740
+ throw error;
741
+ }
742
+ if (!result.created && decision.claimKey && !result.item.claimKey) {
743
+ const claimed = await this.#storage.claimWorkItem({
744
+ orgId: record.orgId,
745
+ id: result.item.id,
746
+ claimKey: decision.claimKey
747
+ });
748
+ if (claimed) result = {
749
+ ...result,
750
+ item: claimed
751
+ };
752
+ }
701
753
  const itemBoard = boardForWorkItem(result.item);
702
754
  if (itemBoard !== decision.board) throw new Error(`The work item belongs to board "${itemBoard}", not "${decision.board}".`);
703
755
  if (!result.item.parentWorkItemId && parentWorkItemId && parentWorkItemId !== result.item.id) {
@@ -821,6 +873,11 @@ var FactoryDecisionDispatcher = class {
821
873
  const bindings = await this.#storage.listRunBindings(record.orgId, record.factoryProjectId, record.workItemId);
822
874
  const own = bindings.filter((candidate) => candidate.role === role);
823
875
  if (own.some((candidate) => candidate.status === "active")) return false;
876
+ const item = await this.#storage.get({
877
+ orgId: record.orgId,
878
+ id: record.workItemId
879
+ }).catch(() => null);
880
+ if (item && workItemPhaseSemantics(this.#boards, item)?.kind === "terminal") return true;
824
881
  return own.some((revoked) => revoked.revokedAt !== null && revoked.revokedAt.getTime() >= record.createdAt.getTime() && bindings.some((successor) => successor.role !== role && successor.status === "active" && successor.resourceId === revoked.resourceId && successor.sessionId === revoked.sessionId && successor.threadId === revoked.threadId && successor.createdAt.getTime() >= revoked.revokedAt.getTime()));
825
882
  }
826
883
  async #requireOrPrepareBinding(record, role) {
@@ -864,6 +921,15 @@ var FactoryDecisionDispatcher = class {
864
921
  if (session.thread.requireId() === binding.threadId) return;
865
922
  await session.thread.switch({ threadId: binding.threadId });
866
923
  }
924
+ async #withBindingSkillRun(bindingId, effect) {
925
+ const run = (this.#bindingSkillRuns.get(bindingId) ?? Promise.resolve()).catch(() => {}).then(effect);
926
+ this.#bindingSkillRuns.set(bindingId, run);
927
+ try {
928
+ await run;
929
+ } finally {
930
+ if (this.#bindingSkillRuns.get(bindingId) === run) this.#bindingSkillRuns.delete(bindingId);
931
+ }
932
+ }
867
933
  async #withLease(renew, effect) {
868
934
  let renewalFailure;
869
935
  let renewal = Promise.resolve();
@@ -886,6 +952,17 @@ var FactoryDecisionDispatcher = class {
886
952
  await renewal;
887
953
  }
888
954
  }
955
+ /** Keep this process's claim on an open run fresh for as long as it is watching the run. */
956
+ async #withOpenRunHeartbeat(session, kickoffId, effect) {
957
+ if (!this.#audit) return effect();
958
+ const timer = setInterval(() => void heartbeatSessionOpenRun(session, kickoffId), Math.floor(FACTORY_OPEN_RUN_STALE_MS / 3));
959
+ timer.unref?.();
960
+ try {
961
+ return await effect();
962
+ } finally {
963
+ clearInterval(timer);
964
+ }
965
+ }
889
966
  async #recordRunStart(session, binding, kickoffId, approvedBy, observedEnd, workItemName) {
890
967
  if (!this.#audit) return;
891
968
  const humanApproved = isHumanActorId(approvedBy);
@@ -895,6 +972,8 @@ var FactoryDecisionDispatcher = class {
895
972
  observedEnd,
896
973
  run: {
897
974
  kickoffId,
975
+ ownerId: this.#ownerId,
976
+ heartbeatAt: Date.now(),
898
977
  bindingId: binding.id,
899
978
  role: binding.role,
900
979
  startedBy: humanApproved ? approvedBy : "factory-rule-dispatcher",
@@ -987,6 +1066,7 @@ const FACTORY_DISPATCH_CONSTANTS = {
987
1066
  maxBackoffMs: MAX_BACKOFF_MS,
988
1067
  skillCompletionObservationTimeoutMs: SKILL_COMPLETION_OBSERVATION_TIMEOUT_MS,
989
1068
  runRegistryHeartbeatMs: RUN_REGISTRY_HEARTBEAT_MS,
1069
+ openRunStaleMs: FACTORY_OPEN_RUN_STALE_MS,
990
1070
  maxInFlight: MAX_IN_FLIGHT,
991
1071
  stages: FACTORY_RULE_STAGES
992
1072
  };