@mastra/factory 0.25.0-alpha.4 → 0.25.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.
Files changed (301) hide show
  1. package/dist/auth.js +1 -2
  2. package/dist/boards/define-board.js +1 -2
  3. package/dist/boards/index.js +1 -2
  4. package/dist/boards/registry.js +1 -2
  5. package/dist/boards/relocate.js +1 -2
  6. package/dist/boards/review.js +1 -2
  7. package/dist/boards/semantics.js +1 -2
  8. package/dist/boards/transition-policy.js +1 -2
  9. package/dist/boards/work-tool-rules.js +1 -2
  10. package/dist/boards/work-transition-policy.js +1 -2
  11. package/dist/boards/work.js +1 -2
  12. package/dist/environment/build-runner.js +1 -2
  13. package/dist/environment/build-schedule.js +1 -2
  14. package/dist/environment/build-workflow.js +1 -2
  15. package/dist/environment/build.js +1 -2
  16. package/dist/environment/heads.js +1 -2
  17. package/dist/factory.d.ts +4 -2
  18. package/dist/factory.d.ts.map +1 -1
  19. package/dist/factory.js +43 -16
  20. package/dist/factory.js.map +1 -1
  21. package/dist/feed-events.js +1 -2
  22. package/dist/index.js +2 -2
  23. package/dist/integrations/channel-thread-announcements.d.ts +8 -0
  24. package/dist/integrations/channel-thread-announcements.d.ts.map +1 -0
  25. package/dist/integrations/channel-thread-announcements.js +16 -0
  26. package/dist/integrations/channel-thread-announcements.js.map +1 -0
  27. package/dist/integrations/github/acceptance-labels.js +1 -2
  28. package/dist/integrations/github/app-identity.js +1 -2
  29. package/dist/integrations/github/commits.js +1 -2
  30. package/dist/integrations/github/config.js +1 -2
  31. package/dist/integrations/github/default-rules.js +2 -3
  32. package/dist/integrations/github/integration.js +3 -4
  33. package/dist/integrations/github/issue-reconciler.js +1 -2
  34. package/dist/integrations/github/pat.js +1 -2
  35. package/dist/integrations/github/provenance.d.ts.map +1 -1
  36. package/dist/integrations/github/provenance.js +2 -5
  37. package/dist/integrations/github/provenance.js.map +1 -1
  38. package/dist/integrations/github/reconcile-worker.js +1 -2
  39. package/dist/integrations/github/reconciliation-config.js +1 -2
  40. package/dist/integrations/github/routes.js +4 -5
  41. package/dist/integrations/github/rules.d.ts.map +1 -1
  42. package/dist/integrations/github/rules.js +14 -3
  43. package/dist/integrations/github/rules.js.map +1 -1
  44. package/dist/integrations/github/sandbox-release.js +1 -2
  45. package/dist/integrations/github/sandbox.js +1 -2
  46. package/dist/integrations/github/session-subscriptions.js +1 -2
  47. package/dist/integrations/github/settle-or-abort.js +1 -2
  48. package/dist/integrations/github/stale-reviews.js +1 -2
  49. package/dist/integrations/github/subscriptions.js +1 -2
  50. package/dist/integrations/github/token-refresh.js +1 -2
  51. package/dist/integrations/github/webhook.d.ts.map +1 -1
  52. package/dist/integrations/github/webhook.js +17 -3
  53. package/dist/integrations/github/webhook.js.map +1 -1
  54. package/dist/integrations/gitlab/agent-tools.js +1 -2
  55. package/dist/integrations/gitlab/api.js +1 -2
  56. package/dist/integrations/gitlab/default-rules.js +1 -2
  57. package/dist/integrations/gitlab/integration.js +2 -3
  58. package/dist/integrations/gitlab/issue-reconciler.js +1 -2
  59. package/dist/integrations/gitlab/merge-request-reconciler.js +1 -2
  60. package/dist/integrations/gitlab/reconciler.js +1 -2
  61. package/dist/integrations/gitlab/reconciliation-config.js +1 -2
  62. package/dist/integrations/gitlab/routes.js +1 -2
  63. package/dist/integrations/gitlab/rules.js +1 -2
  64. package/dist/integrations/gitlab/session-subscriptions.js +1 -2
  65. package/dist/integrations/gitlab/subscriptions.js +1 -2
  66. package/dist/integrations/gitlab/version-control.js +1 -2
  67. package/dist/integrations/gitlab/webhook-dispatch.js +1 -2
  68. package/dist/integrations/gitlab/webhook.js +1 -2
  69. package/dist/integrations/incidentio/agent-tools.js +1 -2
  70. package/dist/integrations/incidentio/api.js +1 -2
  71. package/dist/integrations/incidentio/claim.js +1 -2
  72. package/dist/integrations/incidentio/default-rules.js +1 -2
  73. package/dist/integrations/incidentio/intake.js +1 -2
  74. package/dist/integrations/incidentio/integration.js +1 -2
  75. package/dist/integrations/incidentio/issue-reconciler.js +1 -2
  76. package/dist/integrations/incidentio/reconciliation-config.js +1 -2
  77. package/dist/integrations/incidentio/routes.js +1 -2
  78. package/dist/integrations/incidentio/rules.js +1 -2
  79. package/dist/integrations/issue-reconcile-worker.js +1 -2
  80. package/dist/integrations/issue-reconciler.js +1 -2
  81. package/dist/integrations/jira/adf.js +1 -2
  82. package/dist/integrations/jira/agent-tools.js +1 -2
  83. package/dist/integrations/jira/api.js +1 -2
  84. package/dist/integrations/jira/claim.js +1 -2
  85. package/dist/integrations/jira/default-rules.js +1 -2
  86. package/dist/integrations/jira/integration.js +1 -2
  87. package/dist/integrations/jira/issue-reconciler.js +1 -2
  88. package/dist/integrations/jira/reconciliation-config.js +1 -2
  89. package/dist/integrations/jira/routes.js +1 -2
  90. package/dist/integrations/jira/rules.js +1 -2
  91. package/dist/integrations/linear/agent-tools.d.ts +1 -1
  92. package/dist/integrations/linear/agent-tools.d.ts.map +1 -1
  93. package/dist/integrations/linear/agent-tools.js +5 -5
  94. package/dist/integrations/linear/agent-tools.js.map +1 -1
  95. package/dist/integrations/linear/claim.js +1 -2
  96. package/dist/integrations/linear/default-rules.js +1 -2
  97. package/dist/integrations/linear/integration.d.ts +2 -0
  98. package/dist/integrations/linear/integration.d.ts.map +1 -1
  99. package/dist/integrations/linear/integration.js +2 -2
  100. package/dist/integrations/linear/integration.js.map +1 -1
  101. package/dist/integrations/linear/issue-reconciler.js +1 -2
  102. package/dist/integrations/linear/reconciliation-config.js +1 -2
  103. package/dist/integrations/linear/routes.js +1 -2
  104. package/dist/integrations/linear/rules.js +1 -2
  105. package/dist/integrations/platform/api-client.js +1 -2
  106. package/dist/integrations/platform/connect/routes.js +1 -2
  107. package/dist/integrations/platform/github/event-worker.js +6 -2
  108. package/dist/integrations/platform/github/event-worker.js.map +1 -1
  109. package/dist/integrations/platform/github/integration.js +1 -2
  110. package/dist/integrations/platform/gitlab/event-worker.js +1 -2
  111. package/dist/integrations/platform/gitlab/integration.js +1 -2
  112. package/dist/integrations/platform/incidentio/integration.js +1 -2
  113. package/dist/integrations/platform/jira/agent-tools.js +1 -2
  114. package/dist/integrations/platform/jira/integration.js +1 -2
  115. package/dist/integrations/platform/jira/routes.js +1 -2
  116. package/dist/integrations/platform/linear/event-worker.js +1 -2
  117. package/dist/integrations/platform/linear/integration.d.ts.map +1 -1
  118. package/dist/integrations/platform/linear/integration.js +2 -2
  119. package/dist/integrations/platform/linear/integration.js.map +1 -1
  120. package/dist/integrations/pull-request-head.js +1 -2
  121. package/dist/integrations/reconciliation-config.js +1 -2
  122. package/dist/integrations/slack/channel-reply-processor.d.ts.map +1 -1
  123. package/dist/integrations/slack/channel-reply-processor.js +11 -5
  124. package/dist/integrations/slack/channel-reply-processor.js.map +1 -1
  125. package/dist/integrations/slack/channel-session-link-processor.js +1 -2
  126. package/dist/integrations/slack/connect-route.js +1 -2
  127. package/dist/integrations/slack/emoji-shortcodes.generated.js +1 -2
  128. package/dist/integrations/slack/emoji.js +1 -2
  129. package/dist/integrations/slack/feed-publisher.js +1 -2
  130. package/dist/integrations/slack/integration.d.ts +5 -0
  131. package/dist/integrations/slack/integration.d.ts.map +1 -1
  132. package/dist/integrations/slack/integration.js +13 -2
  133. package/dist/integrations/slack/integration.js.map +1 -1
  134. package/dist/integrations/slack/reply-reminder-processor.js +1 -2
  135. package/dist/integrations/slack/reply-tool.js +1 -2
  136. package/dist/integrations/slack/share-file-tool.js +1 -2
  137. package/dist/integrations/slack/slack.js +2 -3
  138. package/dist/integrations/subscription-session.js +1 -2
  139. package/dist/integrations/workos/integration.js +1 -2
  140. package/dist/mcp/disconnect.js +1 -2
  141. package/dist/mcp/events.js +2 -3
  142. package/dist/mcp/routes.js +1 -2
  143. package/dist/packages/_internals/workspace/dist/index.js +1 -2
  144. package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
  145. package/dist/platform-auth-host.js +1 -2
  146. package/dist/provider-display-name.js +1 -2
  147. package/dist/review-verdict.d.ts +1 -0
  148. package/dist/review-verdict.d.ts.map +1 -1
  149. package/dist/review-verdict.js +9 -3
  150. package/dist/review-verdict.js.map +1 -1
  151. package/dist/routes/attention-activity.js +1 -2
  152. package/dist/routes/attention-parked.js +1 -2
  153. package/dist/routes/attention-proposed.js +1 -2
  154. package/dist/routes/attention-providers.js +1 -2
  155. package/dist/routes/attention.js +1 -2
  156. package/dist/routes/automation-runs.js +1 -2
  157. package/dist/routes/config.d.ts +4 -0
  158. package/dist/routes/config.d.ts.map +1 -1
  159. package/dist/routes/config.js +7 -2
  160. package/dist/routes/config.js.map +1 -1
  161. package/dist/routes/contracts.js +1 -2
  162. package/dist/routes/custom-provider-source.js +1 -2
  163. package/dist/routes/fs.js +1 -2
  164. package/dist/routes/intake.js +1 -2
  165. package/dist/routes/knowledge.js +1 -2
  166. package/dist/routes/oauth.js +1 -2
  167. package/dist/routes/projects.js +1 -2
  168. package/dist/routes/provider-credentials.js +1 -2
  169. package/dist/routes/route.js +1 -2
  170. package/dist/routes/session-access.js +1 -2
  171. package/dist/routes/skills.js +1 -2
  172. package/dist/routes/source-control-sessions.js +5 -6
  173. package/dist/routes/source-control-settings.js +1 -2
  174. package/dist/routes/surface.js +2 -3
  175. package/dist/routes/telemetry.js +1 -2
  176. package/dist/routes/tenant-credentials.js +1 -2
  177. package/dist/routes/work-items.js +2 -3
  178. package/dist/rules/binding-context.js +1 -2
  179. package/dist/rules/decision-applicability.js +1 -2
  180. package/dist/rules/dispatch-errors.js +1 -2
  181. package/dist/rules/dispatcher.js +1 -2
  182. package/dist/rules/event-rules.js +1 -2
  183. package/dist/rules/processor.js +1 -2
  184. package/dist/rules/resolve.js +1 -2
  185. package/dist/rules/review-source-tool.js +1 -2
  186. package/dist/rules/start-coordinator.js +1 -2
  187. package/dist/rules/terminal-cleanup.js +1 -2
  188. package/dist/rules/tools.js +1 -2
  189. package/dist/rules/transition-service.js +1 -2
  190. package/dist/rules/types.d.ts +4 -1
  191. package/dist/rules/types.d.ts.map +1 -1
  192. package/dist/rules/types.js +1 -2
  193. package/dist/rules/types.js.map +1 -1
  194. package/dist/rules/validation.js +1 -2
  195. package/dist/sandbox/callback-factory-sandbox.js +1 -2
  196. package/dist/sandbox/git-ref.js +1 -2
  197. package/dist/sandbox/local-factory-sandbox.d.ts +12 -4
  198. package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -1
  199. package/dist/sandbox/local-factory-sandbox.js +32 -7
  200. package/dist/sandbox/local-factory-sandbox.js.map +1 -1
  201. package/dist/sandbox/materialization.js +1 -2
  202. package/dist/sandbox/session-retirement.js +1 -2
  203. package/dist/sandbox/session-sandbox.js +1 -2
  204. package/dist/sandbox/workdir.js +1 -2
  205. package/dist/secret-encryption.js +1 -2
  206. package/dist/server-error.js +1 -2
  207. package/dist/session/credential-policy.js +1 -2
  208. package/dist/session/default-model-hydration.js +1 -2
  209. package/dist/session/environment-repositories.js +1 -2
  210. package/dist/session/environment-state-processor.d.ts +0 -1
  211. package/dist/session/environment-state-processor.d.ts.map +1 -1
  212. package/dist/session/environment-state-processor.js +2 -3
  213. package/dist/session/environment-state-processor.js.map +1 -1
  214. package/dist/session/factory-session.js +1 -2
  215. package/dist/session/filesystem-capture.js +2 -3
  216. package/dist/session/filesystem-capture.js.map +1 -1
  217. package/dist/session/first-exec-capture.js +2 -3
  218. package/dist/session/first-exec-capture.js.map +1 -1
  219. package/dist/session/first-message-capture.js +1 -2
  220. package/dist/session/live-sessions.js +1 -2
  221. package/dist/session/memory-settings-hydration.js +1 -2
  222. package/dist/session/org-seed.js +1 -2
  223. package/dist/session/reply-credential-processor.js +1 -2
  224. package/dist/session/resource-migration.js +1 -2
  225. package/dist/session/run-audit.js +1 -2
  226. package/dist/session/session-threads.js +1 -2
  227. package/dist/session/session-title.js +1 -2
  228. package/dist/session/shell-commands.js +1 -2
  229. package/dist/session/source-control-tools.js +2 -3
  230. package/dist/session/thinking-default.js +1 -2
  231. package/dist/session/thread-session-stamp.js +1 -2
  232. package/dist/session/thread-title-mirror.js +1 -2
  233. package/dist/session/thread-title-mirror.js.map +1 -1
  234. package/dist/session/work-item-repository.js +1 -2
  235. package/dist/session-owner-signal.js +1 -2
  236. package/dist/skills/catalog.js +1 -2
  237. package/dist/skills/service.js +1 -2
  238. package/dist/spa-static.js +1 -2
  239. package/dist/state-signing.js +1 -2
  240. package/dist/storage/domains/audit/actions.js +1 -2
  241. package/dist/storage/domains/audit/actors.js +1 -2
  242. package/dist/storage/domains/audit/agent-audit.js +1 -2
  243. package/dist/storage/domains/audit/base.js +1 -2
  244. package/dist/storage/domains/audit/domain.js +1 -2
  245. package/dist/storage/domains/audit/wire.js +1 -2
  246. package/dist/storage/domains/channel-identity/base.js +1 -2
  247. package/dist/storage/domains/comments/activity.js +1 -2
  248. package/dist/storage/domains/comments/actor.js +1 -2
  249. package/dist/storage/domains/comments/base.js +1 -2
  250. package/dist/storage/domains/comments/domain.js +1 -2
  251. package/dist/storage/domains/comments/feed-context.js +1 -2
  252. package/dist/storage/domains/comments/parse.js +1 -2
  253. package/dist/storage/domains/comments/routes.js +1 -2
  254. package/dist/storage/domains/comments/schema.js +1 -2
  255. package/dist/storage/domains/comments/wire.js +1 -2
  256. package/dist/storage/domains/credentials/base.d.ts +4 -1
  257. package/dist/storage/domains/credentials/base.d.ts.map +1 -1
  258. package/dist/storage/domains/credentials/base.js +40 -44
  259. package/dist/storage/domains/credentials/base.js.map +1 -1
  260. package/dist/storage/domains/custom-providers/base.js +1 -2
  261. package/dist/storage/domains/filesystem/base.js +1 -2
  262. package/dist/storage/domains/intake/base.js +1 -2
  263. package/dist/storage/domains/integrations/base.js +1 -2
  264. package/dist/storage/domains/memory-settings/base.js +1 -2
  265. package/dist/storage/domains/model-defaults/base.js +1 -2
  266. package/dist/storage/domains/projects/base.js +1 -2
  267. package/dist/storage/domains/queue-health/base.js +1 -2
  268. package/dist/storage/domains/source-control/base.js +1 -2
  269. package/dist/storage/domains/source-control/inmemory.js +1 -2
  270. package/dist/storage/domains/work-items/base.js +1 -2
  271. package/dist/storage/domains/work-items/board-version.js +1 -2
  272. package/dist/storage/domains/work-items/metrics.js +1 -2
  273. package/dist/telemetry-types.js +1 -2
  274. package/dist/telemetry.js +1 -2
  275. package/dist/timing.js +1 -2
  276. package/dist/tools/annotations.js +1 -2
  277. package/dist/tools/approval-tools.js +1 -2
  278. package/dist/tools/deliver.js +2 -3
  279. package/dist/tools/index.js +1 -2
  280. package/dist/tools/messaging-tools.js +1 -2
  281. package/dist/tools/permissions.js +1 -2
  282. package/dist/tools/read-tools.js +1 -2
  283. package/dist/tools/reports.js +1 -2
  284. package/dist/tools/run-watch.js +1 -2
  285. package/dist/tools/sandbox-tools.js +1 -2
  286. package/dist/tools/scope.js +2 -3
  287. package/dist/tools/session-tools.js +1 -2
  288. package/dist/tools/sessions-state-processor.js +1 -2
  289. package/dist/tools/side-sessions.js +1 -2
  290. package/dist/tools/work-item-tools.js +1 -2
  291. package/dist/work-item-branch.js +1 -2
  292. package/dist/work-item-branch.js.map +1 -1
  293. package/dist/work-items/create-work-item.js +1 -2
  294. package/dist/work-items/decision-actions.js +1 -2
  295. package/dist/workspace.d.ts.map +1 -1
  296. package/dist/workspace.js +1 -3
  297. package/dist/workspace.js.map +1 -1
  298. package/factory-skills/factory-rereview/SKILL.md +12 -2
  299. package/factory-skills/factory-review/SKILL.md +12 -2
  300. package/factory-skills/factory-triage/SKILL.md +7 -7
  301. package/package.json +19 -17
@@ -1,4 +1,4 @@
1
- //#region src/feed-events.ts
1
+ // src/feed-events.ts
2
2
  function feedTopic(orgId, factoryProjectId) {
3
3
  return `factory.feed.${orgId}.${factoryProjectId}`;
4
4
  }
@@ -19,7 +19,6 @@ function touchFeed(pubsub, scope, workItemId) {
19
19
  });
20
20
  });
21
21
  }
22
- //#endregion
23
22
  export { feedTopic, touchFeed };
24
23
 
25
24
  //# sourceMappingURL=feed-events.js.map
package/dist/index.js CHANGED
@@ -5,11 +5,11 @@ import { workBoard } from "./boards/work.js";
5
5
  import { createBoardRegistry, defaultBoards } from "./boards/registry.js";
6
6
  import "./boards/index.js";
7
7
  import { WorkItemsStorage } from "./storage/domains/work-items/base.js";
8
- import { waitForPendingFilesystemCapture } from "./session/filesystem-capture.js";
9
8
  import { createFactorySecretEncryption, createPlaintextFactorySecretEncryption } from "./secret-encryption.js";
10
9
  import { FactoryProjectsStorage } from "./storage/domains/projects/base.js";
10
+ import { waitForPendingFilesystemCapture } from "./session/filesystem-capture.js";
11
+ import { LocalFactorySandbox } from "./sandbox/local-factory-sandbox.js";
11
12
  import { createStateSigner } from "./state-signing.js";
12
13
  import { ChannelIdentityStorage } from "./storage/domains/channel-identity/base.js";
13
14
  import { MastraFactory } from "./factory.js";
14
- import { LocalFactorySandbox } from "./sandbox/local-factory-sandbox.js";
15
15
  export { BoardDefinitionError, ChannelIdentityStorage, FactoryProjectsStorage, LocalFactorySandbox, MastraFactory, WorkItemsStorage, createBoardRegistry, createFactoryRouteAuth, createFactorySecretEncryption, createPlaintextFactorySecretEncryption, createStateSigner, defaultBoards, defineBoard, reviewBoard, waitForPendingFilesystemCapture, workBoard };
@@ -0,0 +1,8 @@
1
+ import type { AgentChannels } from '@mastra/core/channels';
2
+ /**
3
+ * Post a pull request's link into the chat thread a session is linked to.
4
+ * On Slack, a merge also adds ✅ to the thread's first message: Slack thread
5
+ * ids are `slack:<channel>:<thread ts>`, and the thread ts is that message's ts.
6
+ */
7
+ export declare function announcePullRequest(channels: AgentChannels | null | undefined, threadId: string, milestone: 'opened' | 'merged', url: string): Promise<void>;
8
+ //# sourceMappingURL=channel-thread-announcements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-thread-announcements.d.ts","sourceRoot":"","sources":["../../src/integrations/channel-thread-announcements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,16 @@
1
+ // src/integrations/channel-thread-announcements.ts
2
+ /**
3
+ * Post a pull request's link into the chat thread a session is linked to.
4
+ * On Slack, a merge also adds ✅ to the thread's first message: Slack thread
5
+ * ids are `slack:<channel>:<thread ts>`, and the thread ts is that message's ts.
6
+ */
7
+ async function announcePullRequest(channels, threadId, milestone, url) {
8
+ const render = await channels?.buildRenderContextForThread(threadId);
9
+ if (!render) return;
10
+ await render.chatThread.post({ markdown: `Pull request ${milestone}: ${url}` });
11
+ const [platform, , rootTs] = render.chatThread.id.split(":");
12
+ if (milestone === "merged" && platform === "slack" && rootTs) await render.adapter.addReaction(render.chatThread.id, rootTs, "white_check_mark");
13
+ }
14
+ export { announcePullRequest };
15
+
16
+ //# sourceMappingURL=channel-thread-announcements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-thread-announcements.js","names":[],"sources":["../../src/integrations/channel-thread-announcements.ts"],"sourcesContent":["import type { AgentChannels } from '@mastra/core/channels';\n\n/**\n * Post a pull request's link into the chat thread a session is linked to.\n * On Slack, a merge also adds ✅ to the thread's first message: Slack thread\n * ids are `slack:<channel>:<thread ts>`, and the thread ts is that message's ts.\n */\nexport async function announcePullRequest(\n channels: AgentChannels | null | undefined,\n threadId: string,\n milestone: 'opened' | 'merged',\n url: string,\n): Promise<void> {\n const render = await channels?.buildRenderContextForThread(threadId);\n if (!render) return;\n await render.chatThread.post({ markdown: `Pull request ${milestone}: ${url}` });\n const [platform, , rootTs] = render.chatThread.id.split(':');\n if (milestone === 'merged' && platform === 'slack' && rootTs) {\n await render.adapter.addReaction(render.chatThread.id, rootTs, 'white_check_mark');\n }\n}\n"],"mappings":";;;;;;AAOA,eAAsB,oBACpB,UACA,UACA,WACA,KACe;CACf,MAAM,SAAS,MAAM,UAAU,4BAA4B,QAAQ;CACnE,IAAI,CAAC,QAAQ;CACb,MAAM,OAAO,WAAW,KAAK,EAAE,UAAU,gBAAgB,UAAU,IAAI,MAAM,CAAC;CAC9E,MAAM,CAAC,YAAY,UAAU,OAAO,WAAW,GAAG,MAAM,GAAG;CAC3D,IAAI,cAAc,YAAY,aAAa,WAAW,QACpD,MAAM,OAAO,QAAQ,YAAY,OAAO,WAAW,IAAI,QAAQ,kBAAkB;AAErF"}
@@ -1,5 +1,5 @@
1
1
  import { NEEDS_APPROVAL_LABEL } from "../../rules/types.js";
2
- //#region src/integrations/github/acceptance-labels.ts
2
+ // src/integrations/github/acceptance-labels.ts
3
3
  /**
4
4
  * Reflect a maintainer's acceptance of a triaged GitHub issue back on the
5
5
  * issue: the triage skill stamps `status: needs approval` and never removes it,
@@ -49,7 +49,6 @@ async function resolveRepository(sourceControl, orgId, factoryProjectId, externa
49
49
  }
50
50
  }
51
51
  }
52
- //#endregion
53
52
  export { reconcileGithubAcceptanceLabels };
54
53
 
55
54
  //# sourceMappingURL=acceptance-labels.js.map
@@ -1,4 +1,4 @@
1
- //#region src/integrations/github/app-identity.ts
1
+ // src/integrations/github/app-identity.ts
2
2
  /**
3
3
  * Factory's own GitHub identity.
4
4
  *
@@ -56,7 +56,6 @@ var GithubAppIdentity = class {
56
56
  return login.trim().toLowerCase() === self;
57
57
  }
58
58
  };
59
- //#endregion
60
59
  export { GithubAppIdentity };
61
60
 
62
61
  //# sourceMappingURL=app-identity.js.map
@@ -1,4 +1,4 @@
1
- //#region src/integrations/github/commits.ts
1
+ // src/integrations/github/commits.ts
2
2
  const GITHUB_API = "https://api.github.com";
3
3
  async function listRepositoryCommits(github, input) {
4
4
  const access = await github.versionControl.getRepositoryAccess({
@@ -42,7 +42,6 @@ async function getBranchHead(github, input) {
42
42
  if (!SHA_PATTERN.test(sha)) throw new Error(`GitHub returned no commit sha for ${input.repository.slug}@${input.branch}.`);
43
43
  return sha;
44
44
  }
45
- //#endregion
46
45
  export { getBranchHead, listRepositoryCommits };
47
46
 
48
47
  //# sourceMappingURL=commits.js.map
@@ -1,4 +1,4 @@
1
- //#region src/integrations/github/config.ts
1
+ // src/integrations/github/config.ts
2
2
  /**
3
3
  * Env vars the deploy entry reads to construct a `GithubIntegration`. Names
4
4
  * only — used by diagnostics to tell an operator what to set when the
@@ -36,7 +36,6 @@ function getGithubFeatureDiagnostics(options) {
36
36
  missingGithubAppEnvVars: github ? [] : [...GITHUB_APP_ENV_VARS]
37
37
  };
38
38
  }
39
- //#endregion
40
39
  export { getGithubFeatureDiagnostics, isGithubFeatureEnabled };
41
40
 
42
41
  //# sourceMappingURL=config.js.map
@@ -1,9 +1,9 @@
1
1
  import { isTerminalFactoryRuleStage } from "../../rules/types.js";
2
2
  import { hasRecordedVerdict } from "../../boards/review.js";
3
- import { recordExplicitRuleOverrides } from "../../rules/event-rules.js";
4
3
  import { requestsChangesVerdict } from "../../review-verdict.js";
4
+ import { recordExplicitRuleOverrides } from "../../rules/event-rules.js";
5
5
  import { isFactoryApproveVerdict } from "./stale-reviews.js";
6
- //#region src/integrations/github/default-rules.ts
6
+ // src/integrations/github/default-rules.ts
7
7
  function trustedGithubActor(context) {
8
8
  return context.actor.type === "github" && context.actor.trusted;
9
9
  }
@@ -275,7 +275,6 @@ function resolveGithubRules(overrides) {
275
275
  }
276
276
  return recordExplicitRuleOverrides(Object.freeze(rules), overrides);
277
277
  }
278
- //#endregion
279
278
  export { defaultGithubRules, resolveGithubRules };
280
279
 
281
280
  //# sourceMappingURL=default-rules.js.map
@@ -2,13 +2,13 @@ import { attachGithubReconciler, attachGithubRules } from "./rules.js";
2
2
  import { createGithubSubscriptionTools, parseCreatedPullRequest, subscribeCurrentSessionToPullRequest } from "./session-subscriptions.js";
3
3
  import { resolveGithubRules } from "./default-rules.js";
4
4
  import { attachGithubIssueReconciler } from "./issue-reconciler.js";
5
+ import { GithubReconcileWorker } from "./reconcile-worker.js";
5
6
  import { reconcileInterval, reconciliationEnabled } from "./reconciliation-config.js";
6
7
  import { buildGithubRoutes, ingestLinkedRepositoryBacklog } from "./routes.js";
7
8
  import { settleOrAbort } from "./settle-or-abort.js";
8
- import { GithubReconcileWorker } from "./reconcile-worker.js";
9
- import { Octokit } from "@octokit/rest";
10
9
  import { createAppAuth } from "@octokit/auth-app";
11
- //#region src/integrations/github/integration.ts
10
+ import { Octokit } from "@octokit/rest";
11
+ // src/integrations/github/integration.ts
12
12
  const GITHUB_CHECK_TITLE_LIMIT = 255;
13
13
  const GITHUB_CHECK_TEXT_LIMIT = 65535;
14
14
  /**
@@ -1409,7 +1409,6 @@ function parseGithubExternalTarget(externalId) {
1409
1409
  issueId: String(issueId)
1410
1410
  } : null;
1411
1411
  }
1412
- //#endregion
1413
1412
  export { GithubIntegration, LIST_PAGE_SIZE, normalizePrivateKey };
1414
1413
 
1415
1414
  //# sourceMappingURL=integration.js.map
@@ -1,7 +1,7 @@
1
1
  import { workItemPhaseSemantics } from "../../boards/semantics.js";
2
2
  import "../../boards/index.js";
3
3
  import { GithubRules, githubRulesOptions, reconcilableIssueNumber, reconciledIssueClosedEvent, reconciledIssueOpenedEvent, reconciledIssueRelabeledEvent, sameStrings, sweepTrustLookup } from "./rules.js";
4
- //#region src/integrations/github/issue-reconciler.ts
4
+ // src/integrations/github/issue-reconciler.ts
5
5
  function createGithubIssueReconciler(options, fetchIssue, listOpenIssues) {
6
6
  const rules = new GithubRules(options);
7
7
  return async (repositories) => {
@@ -132,7 +132,6 @@ function attachGithubIssueReconciler(github, context, fetchIssue, listOpenIssues
132
132
  if (!options) return void 0;
133
133
  return createGithubIssueReconciler(options, fetchIssue, listOpenIssues);
134
134
  }
135
- //#endregion
136
135
  export { attachGithubIssueReconciler, createGithubIssueReconciler };
137
136
 
138
137
  //# sourceMappingURL=issue-reconciler.js.map
@@ -1,4 +1,4 @@
1
- //#region src/integrations/github/pat.ts
1
+ // src/integrations/github/pat.ts
2
2
  /** Sentinel `user_id` for the org-wide settings row. */
3
3
  const PAT_SETTINGS_USER_ID = "__github_org_settings__";
4
4
  const FIELD_FOR_KIND = {
@@ -53,7 +53,6 @@ async function clearGithubPat(storage, orgId, kind = "default") {
53
53
  const { [field]: _removed, ...rest } = existing;
54
54
  await storage.settings.save(orgId, PAT_SETTINGS_USER_ID, rest);
55
55
  }
56
- //#endregion
57
56
  export { clearGithubPat, getGithubPat, getGithubPatStatus, setGithubPat };
58
57
 
59
58
  //# sourceMappingURL=pat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/provenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,yCAAyC,CAC7D,kBAAkB,EAAE,wBAAwB,CAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,gCAAgC,CACjC,EACD,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAClG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED,wBAAsB,kCAAkC,CACtD,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,0BAA0B,EACzC,kBAAkB,EAAE,wBAAwB,CAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,gCAAgC,CACjC,EACD,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,uCAAuC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA2Gf"}
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/provenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,yCAAyC,CAC7D,kBAAkB,EAAE,wBAAwB,CAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,gCAAgC,CACjC,EACD,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAClG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED,wBAAsB,kCAAkC,CACtD,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,0BAA0B,EACzC,kBAAkB,EAAE,wBAAwB,CAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,gCAAgC,CACjC,EACD,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,uCAAuC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA0Gf"}
@@ -1,6 +1,6 @@
1
1
  import { cardBelongsToRepository } from "./rules.js";
2
2
  import { parseCreatedPullRequest } from "./session-subscriptions.js";
3
- //#region src/integrations/github/provenance.ts
3
+ // src/integrations/github/provenance.ts
4
4
  async function resolveFactoryPullRequestParentWorkItemId(integrationStorage, input) {
5
5
  const targetKey = `factory-pr-provenance:${input.repositoryId}:${input.pullRequestNumber}`;
6
6
  return (await integrationStorage.subscriptions.listByTarget(targetKey, { status: "active" })).find((row) => row.orgId === input.orgId && row.data?.kind === "factory-pr-provenance" && row.data.factoryProjectId === input.factoryProjectId)?.data?.workItemId ?? null;
@@ -81,11 +81,8 @@ async function recordFactoryPullRequestProvenance(github, sourceControl, integra
81
81
  userId: "factory-pr-provenance",
82
82
  parentWorkItemId: input.item.id
83
83
  });
84
- } catch {
85
- return;
86
- }
84
+ } catch {}
87
85
  }
88
- //#endregion
89
86
  export { recordFactoryPullRequestProvenance, resolveFactoryPullRequestParentWorkItemId };
90
87
 
91
88
  //# sourceMappingURL=provenance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.js","names":[],"sources":["../../../src/integrations/github/provenance.ts"],"sourcesContent":["import type { FactoryRuleJsonValue } from '../../rules/types.js';\nimport type { IntegrationStorageHandle } from '../../storage/domains/integrations/base.js';\nimport type { SourceControlStorageHandle } from '../../storage/domains/source-control/base.js';\nimport type { FactoryRunBindingRecord, WorkItemRow, WorkItemsStorage } from '../../storage/domains/work-items/base.js';\nimport type { GithubIntegration } from './integration.js';\nimport { cardBelongsToRepository } from './rules.js';\nimport { parseCreatedPullRequest } from './session-subscriptions.js';\n\nexport interface RecordFactoryPullRequestProvenanceInput {\n binding: FactoryRunBindingRecord;\n item: WorkItemRow;\n assistantMessageId: string;\n toolCallId: string;\n toolName: string;\n toolInput: FactoryRuleJsonValue;\n toolResult: FactoryRuleJsonValue;\n status: 'success' | 'error';\n}\n\nexport interface FactoryPullRequestProvenanceData {\n kind: 'factory-pr-provenance';\n bindingId: string;\n workItemId: string;\n factoryProjectId: string;\n repositoryId: number;\n pullRequestNumber: number;\n pullRequestUrl: string;\n assistantMessageId: string;\n toolCallId: string;\n}\n\nexport async function resolveFactoryPullRequestParentWorkItemId(\n integrationStorage: IntegrationStorageHandle<\n Record<string, unknown>,\n Record<string, unknown>,\n FactoryPullRequestProvenanceData\n >,\n input: { orgId: string; factoryProjectId: string; repositoryId: number; pullRequestNumber: number },\n): Promise<string | null> {\n const targetKey = `factory-pr-provenance:${input.repositoryId}:${input.pullRequestNumber}`;\n // Provenance is scoped to the Factory project whose run authored the PR.\n // Rows from a sibling project in the same org — or legacy rows without the\n // project stamp — fail closed rather than linking another project's card.\n const provenance = (await integrationStorage.subscriptions.listByTarget(targetKey, { status: 'active' })).find(\n row =>\n row.orgId === input.orgId &&\n row.data?.kind === 'factory-pr-provenance' &&\n row.data.factoryProjectId === input.factoryProjectId,\n );\n return provenance?.data?.workItemId ?? null;\n}\n\nexport async function recordFactoryPullRequestProvenance(\n github: GithubIntegration,\n sourceControl: SourceControlStorageHandle,\n integrationStorage: IntegrationStorageHandle<\n Record<string, unknown>,\n Record<string, unknown>,\n FactoryPullRequestProvenanceData\n >,\n workItems: WorkItemsStorage,\n input: RecordFactoryPullRequestProvenanceInput,\n): Promise<void> {\n if (input.status !== 'success' || input.item.externalSource?.type === 'pull-request') return;\n const url = parseCreatedPullRequest({\n toolName: input.toolName,\n input: input.toolInput,\n output: input.toolResult,\n });\n if (!url) return;\n\n try {\n const match = url.match(/^https:\\/\\/github\\.com\\/([^/]+\\/[^/]+)\\/pull\\/(\\d+)\\/?$/i);\n if (!match) return;\n const repositorySlug = match[1]!;\n let repositoryId: number | undefined;\n let installationId: number | undefined;\n for (const connection of await sourceControl.connections.list({\n orgId: input.binding.orgId,\n factoryProjectId: input.binding.factoryProjectId,\n })) {\n const installation = await sourceControl.installations.get({\n orgId: input.binding.orgId,\n id: connection.installationId,\n });\n if (!installation) continue;\n for (const link of await sourceControl.projectRepositories.list({\n orgId: input.binding.orgId,\n connectionId: connection.id,\n })) {\n const repository = await sourceControl.repositories.get({ orgId: input.binding.orgId, id: link.repositoryId });\n if (!repository || repository.slug.toLowerCase() !== repositorySlug.toLowerCase()) continue;\n repositoryId = Number(repository.externalId);\n installationId = Number(installation.externalId);\n break;\n }\n if (repositoryId !== undefined) break;\n }\n const pullRequestNumber = Number(match[2]);\n const [owner, repo] = repositorySlug.split('/');\n if (\n !owner ||\n !repo ||\n repositoryId === undefined ||\n installationId === undefined ||\n !Number.isInteger(repositoryId) ||\n !Number.isInteger(installationId) ||\n !Number.isInteger(pullRequestNumber) ||\n pullRequestNumber < 1\n )\n return;\n const targetKey = `factory-pr-provenance:${repositoryId}:${pullRequestNumber}`;\n // Dedupe within the authoring project only: a sibling project's row must\n // not block this project from recording its own provenance.\n if (\n (await integrationStorage.subscriptions.listByTarget(targetKey)).some(\n row => row.orgId === input.binding.orgId && row.data?.factoryProjectId === input.binding.factoryProjectId,\n )\n ) {\n return;\n }\n\n const { data } = await github\n .getInstallationOctokit(installationId)\n .pulls.get({ owner, repo, pull_number: pullRequestNumber });\n if (data.base.repo.id !== repositoryId || data.number !== pullRequestNumber || data.html_url !== url) return;\n\n await integrationStorage.subscriptions.create({\n orgId: input.binding.orgId,\n targetKey,\n threadId: input.binding.threadId,\n status: 'active',\n data: {\n kind: 'factory-pr-provenance',\n bindingId: input.binding.id,\n workItemId: input.item.id,\n factoryProjectId: input.binding.factoryProjectId,\n repositoryId,\n pullRequestNumber,\n pullRequestUrl: url,\n assistantMessageId: input.assistantMessageId,\n toolCallId: input.toolCallId,\n },\n });\n\n const reviewItem = (\n await workItems.list({\n orgId: input.binding.orgId,\n factoryProjectId: input.binding.factoryProjectId,\n })\n ).find(\n item =>\n item.externalSource?.integrationId === 'github' &&\n item.externalSource.type === 'pull-request' &&\n (item.externalSource.externalId === `github:${repositoryId}:pull-request:${pullRequestNumber}` ||\n (item.externalSource.externalId === `github-pr:${pullRequestNumber}` &&\n cardBelongsToRepository(item, repositoryId, repositorySlug))),\n );\n if (reviewItem) {\n await workItems.setParentWorkItemIfMissing({\n orgId: input.binding.orgId,\n id: reviewItem.id,\n userId: 'factory-pr-provenance',\n parentWorkItemId: input.item.id,\n });\n }\n } catch {\n return;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"provenance.js","names":[],"sources":["../../../src/integrations/github/provenance.ts"],"sourcesContent":["import type { FactoryRuleJsonValue } from '../../rules/types.js';\nimport type { IntegrationStorageHandle } from '../../storage/domains/integrations/base.js';\nimport type { SourceControlStorageHandle } from '../../storage/domains/source-control/base.js';\nimport type { FactoryRunBindingRecord, WorkItemRow, WorkItemsStorage } from '../../storage/domains/work-items/base.js';\nimport type { GithubIntegration } from './integration.js';\nimport { cardBelongsToRepository } from './rules.js';\nimport { parseCreatedPullRequest } from './session-subscriptions.js';\n\nexport interface RecordFactoryPullRequestProvenanceInput {\n binding: FactoryRunBindingRecord;\n item: WorkItemRow;\n assistantMessageId: string;\n toolCallId: string;\n toolName: string;\n toolInput: FactoryRuleJsonValue;\n toolResult: FactoryRuleJsonValue;\n status: 'success' | 'error';\n}\n\nexport interface FactoryPullRequestProvenanceData {\n kind: 'factory-pr-provenance';\n bindingId: string;\n workItemId: string;\n factoryProjectId: string;\n repositoryId: number;\n pullRequestNumber: number;\n pullRequestUrl: string;\n assistantMessageId: string;\n toolCallId: string;\n}\n\nexport async function resolveFactoryPullRequestParentWorkItemId(\n integrationStorage: IntegrationStorageHandle<\n Record<string, unknown>,\n Record<string, unknown>,\n FactoryPullRequestProvenanceData\n >,\n input: { orgId: string; factoryProjectId: string; repositoryId: number; pullRequestNumber: number },\n): Promise<string | null> {\n const targetKey = `factory-pr-provenance:${input.repositoryId}:${input.pullRequestNumber}`;\n // Provenance is scoped to the Factory project whose run authored the PR.\n // Rows from a sibling project in the same org — or legacy rows without the\n // project stamp — fail closed rather than linking another project's card.\n const provenance = (await integrationStorage.subscriptions.listByTarget(targetKey, { status: 'active' })).find(\n row =>\n row.orgId === input.orgId &&\n row.data?.kind === 'factory-pr-provenance' &&\n row.data.factoryProjectId === input.factoryProjectId,\n );\n return provenance?.data?.workItemId ?? null;\n}\n\nexport async function recordFactoryPullRequestProvenance(\n github: GithubIntegration,\n sourceControl: SourceControlStorageHandle,\n integrationStorage: IntegrationStorageHandle<\n Record<string, unknown>,\n Record<string, unknown>,\n FactoryPullRequestProvenanceData\n >,\n workItems: WorkItemsStorage,\n input: RecordFactoryPullRequestProvenanceInput,\n): Promise<void> {\n if (input.status !== 'success' || input.item.externalSource?.type === 'pull-request') return;\n const url = parseCreatedPullRequest({\n toolName: input.toolName,\n input: input.toolInput,\n output: input.toolResult,\n });\n if (!url) return;\n\n try {\n const match = url.match(/^https:\\/\\/github\\.com\\/([^/]+\\/[^/]+)\\/pull\\/(\\d+)\\/?$/i);\n if (!match) return;\n const repositorySlug = match[1]!;\n let repositoryId: number | undefined;\n let installationId: number | undefined;\n for (const connection of await sourceControl.connections.list({\n orgId: input.binding.orgId,\n factoryProjectId: input.binding.factoryProjectId,\n })) {\n const installation = await sourceControl.installations.get({\n orgId: input.binding.orgId,\n id: connection.installationId,\n });\n if (!installation) continue;\n for (const link of await sourceControl.projectRepositories.list({\n orgId: input.binding.orgId,\n connectionId: connection.id,\n })) {\n const repository = await sourceControl.repositories.get({ orgId: input.binding.orgId, id: link.repositoryId });\n if (!repository || repository.slug.toLowerCase() !== repositorySlug.toLowerCase()) continue;\n repositoryId = Number(repository.externalId);\n installationId = Number(installation.externalId);\n break;\n }\n if (repositoryId !== undefined) break;\n }\n const pullRequestNumber = Number(match[2]);\n const [owner, repo] = repositorySlug.split('/');\n if (\n !owner ||\n !repo ||\n repositoryId === undefined ||\n installationId === undefined ||\n !Number.isInteger(repositoryId) ||\n !Number.isInteger(installationId) ||\n !Number.isInteger(pullRequestNumber) ||\n pullRequestNumber < 1\n )\n return;\n const targetKey = `factory-pr-provenance:${repositoryId}:${pullRequestNumber}`;\n // Dedupe within the authoring project only: a sibling project's row must\n // not block this project from recording its own provenance.\n if (\n (await integrationStorage.subscriptions.listByTarget(targetKey)).some(\n row => row.orgId === input.binding.orgId && row.data?.factoryProjectId === input.binding.factoryProjectId,\n )\n ) {\n return;\n }\n\n const { data } = await github\n .getInstallationOctokit(installationId)\n .pulls.get({ owner, repo, pull_number: pullRequestNumber });\n if (data.base.repo.id !== repositoryId || data.number !== pullRequestNumber || data.html_url !== url) return;\n\n await integrationStorage.subscriptions.create({\n orgId: input.binding.orgId,\n targetKey,\n threadId: input.binding.threadId,\n status: 'active',\n data: {\n kind: 'factory-pr-provenance',\n bindingId: input.binding.id,\n workItemId: input.item.id,\n factoryProjectId: input.binding.factoryProjectId,\n repositoryId,\n pullRequestNumber,\n pullRequestUrl: url,\n assistantMessageId: input.assistantMessageId,\n toolCallId: input.toolCallId,\n },\n });\n\n const reviewItem = (\n await workItems.list({\n orgId: input.binding.orgId,\n factoryProjectId: input.binding.factoryProjectId,\n })\n ).find(\n item =>\n item.externalSource?.integrationId === 'github' &&\n item.externalSource.type === 'pull-request' &&\n (item.externalSource.externalId === `github:${repositoryId}:pull-request:${pullRequestNumber}` ||\n (item.externalSource.externalId === `github-pr:${pullRequestNumber}` &&\n cardBelongsToRepository(item, repositoryId, repositorySlug))),\n );\n if (reviewItem) {\n await workItems.setParentWorkItemIfMissing({\n orgId: input.binding.orgId,\n id: reviewItem.id,\n userId: 'factory-pr-provenance',\n parentWorkItemId: input.item.id,\n });\n }\n } catch {\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { NoopLeaseProvider, isLeaseProvider } from "@mastra/core/events";
2
2
  import { MastraWorker } from "@mastra/core/worker";
3
- //#region src/integrations/github/reconcile-worker.ts
3
+ // src/integrations/github/reconcile-worker.ts
4
4
  const DEFAULT_GITHUB_RECONCILE_INTERVAL_MS = 36e5;
5
5
  const MIN_LEASE_TTL_MS = 3e4;
6
6
  const LEASE_KEY = "github:pull-request-reconcile";
@@ -183,7 +183,6 @@ function getLeaseProvider(pubsub) {
183
183
  if (typeof getProvider === "function") return getProvider.call(pubsub) ?? NoopLeaseProvider;
184
184
  return isLeaseProvider(pubsub) ? pubsub : NoopLeaseProvider;
185
185
  }
186
- //#endregion
187
186
  export { DEFAULT_GITHUB_RECONCILE_INTERVAL_MS, GithubReconcileWorker };
188
187
 
189
188
  //# sourceMappingURL=reconcile-worker.js.map
@@ -1,5 +1,5 @@
1
1
  import { optionalPositiveInteger } from "../reconciliation-config.js";
2
- //#region src/integrations/github/reconciliation-config.ts
2
+ // src/integrations/github/reconciliation-config.ts
3
3
  function reconciliationEnabled(child, legacy) {
4
4
  return parseOptionalBoolean(child) ?? parseOptionalBoolean(legacy) ?? true;
5
5
  }
@@ -13,7 +13,6 @@ function parseOptionalBoolean(value) {
13
13
  default: return;
14
14
  }
15
15
  }
16
- //#endregion
17
16
  export { reconcileInterval, reconciliationEnabled };
18
17
 
19
18
  //# sourceMappingURL=reconciliation-config.js.map
@@ -8,18 +8,18 @@ import { sanitizeSegment } from "../../sandbox/workdir.js";
8
8
  import { peekSessionSandbox } from "../../sandbox/session-sandbox.js";
9
9
  import { listPullRequestSubscriptionsForThread, subscribeToPullRequest } from "./subscriptions.js";
10
10
  import { polledPullRequestEvent } from "./rules.js";
11
- import { canReadSessionResource, canViewSourceControlSession } from "../../routes/session-access.js";
12
- import { waitForPendingFilesystemCapture } from "../../session/filesystem-capture.js";
13
11
  import { listFactorySessionThreads, sessionMemoryResourceId } from "../../session/session-threads.js";
12
+ import { reclaimDeletedSessionSandbox } from "./sandbox-release.js";
13
+ import { waitForPendingFilesystemCapture } from "../../session/filesystem-capture.js";
14
14
  import { normalizeSessionTitle } from "../../session/session-title.js";
15
+ import { canReadSessionResource, canViewSourceControlSession } from "../../routes/session-access.js";
15
16
  import { getGithubFeatureDiagnostics, isGithubFeatureEnabled } from "./config.js";
16
- import { reclaimDeletedSessionSandbox } from "./sandbox-release.js";
17
17
  import { handleGithubWebhook } from "./webhook.js";
18
18
  import { RequestContext } from "@mastra/core/request-context";
19
19
  import { registerApiRoute } from "@mastra/core/server";
20
20
  import { UniqueViolationError } from "@mastra/core/storage";
21
21
  import { resolveModel } from "@mastra/code-sdk/agents/model";
22
- //#region src/integrations/github/routes.ts
22
+ // src/integrations/github/routes.ts
23
23
  const sessionOperationLocks = /* @__PURE__ */ new Map();
24
24
  const USER_SESSION_BRANCH_PREFIX = "user/session-";
25
25
  const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
@@ -1367,7 +1367,6 @@ async function resolveSessionWorkspace(github, projectId, userId, sessionId) {
1367
1367
  sandbox: requireExec(entry.sandbox)
1368
1368
  };
1369
1369
  }
1370
- //#endregion
1371
1370
  export { buildGithubRoutes, ingestLinkedRepositoryBacklog };
1372
1371
 
1373
1372
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/integrations/github/rules.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@ import { boardEventHandlers, boardForWorkItem, eventBoardId, rulePhaseField, wit
3
3
  import "../../boards/index.js";
4
4
  import { FACTORY_PULL_REQUEST_RECONCILIATION_KEY, WorkItemUpdateConflictError } from "../../storage/domains/work-items/base.js";
5
5
  import { cardLabels, moveCardToBoard } from "../../boards/relocate.js";
6
+ import { requestsChangesVerdict } from "../../review-verdict.js";
6
7
  import { selectEventRule } from "../../rules/event-rules.js";
7
8
  import { resolveIntakeLabelRoute } from "../../storage/domains/intake/base.js";
8
9
  import { recordPullRequestHead } from "../pull-request-head.js";
9
10
  import { changeRequestTargetKey } from "./subscriptions.js";
10
11
  import { createHash } from "crypto";
11
- //#region src/integrations/github/rules.ts
12
+ // src/integrations/github/rules.ts
12
13
  const TRUSTED_PERMISSIONS = /* @__PURE__ */ new Set(["write", "admin"]);
13
14
  const RULE_TIMEOUT_MS = 5e3;
14
15
  const FACTORY_TRIAGE_COMMENT_MARKER = "<!-- mastra-factory-triage -->";
@@ -79,7 +80,10 @@ function eventName(parsed) {
79
80
  }
80
81
  if (parsed.event === "issues" && action === "closed") return "issueClosed";
81
82
  if (parsed.event === "issue_comment") {
82
- if (object(object(parsed.payload.issue)?.pull_request)) return action === "created" ? "pullRequestCommentCreated" : void 0;
83
+ if (object(object(parsed.payload.issue)?.pull_request)) {
84
+ if (action === "created") return "pullRequestCommentCreated";
85
+ return action === "edited" && editedRequestChangesVerdict(parsed.payload, parsed.payload.comment) ? "pullRequestCommentCreated" : void 0;
86
+ }
83
87
  if (action === "created") return "issueCommentCreated";
84
88
  if (action === "edited") return "issueCommentEdited";
85
89
  if (action === "deleted") return "issueCommentDeleted";
@@ -89,6 +93,14 @@ function eventName(parsed) {
89
93
  if (parsed.event === "pull_request" && action === "closed") return boolean(object(parsed.payload.pull_request)?.merged) ? "pullRequestMerged" : "pullRequestClosed";
90
94
  if (parsed.event === "pull_request" && action === "review_requested") return "pullRequestReviewRequested";
91
95
  if (parsed.event === "pull_request_review" && action === "submitted") return "pullRequestReviewSubmitted";
96
+ if (parsed.event === "pull_request_review" && action === "edited") {
97
+ const review = object(parsed.payload.review);
98
+ return string(review?.state)?.toLowerCase() === "changes_requested" && editedRequestChangesVerdict(parsed.payload, review) ? "pullRequestReviewSubmitted" : void 0;
99
+ }
100
+ }
101
+ /** A body edit that leaves a Factory request-changes verdict on the post. */
102
+ function editedRequestChangesVerdict(payload, post) {
103
+ return object(object(payload.changes)?.body) !== void 0 && requestsChangesVerdict(string(object(post)?.body));
92
104
  }
93
105
  /**
94
106
  * Canonical source keys (`github-issue:N`, `github-pr:N`) do not identify a
@@ -1063,7 +1075,6 @@ function attachGithubReconciler(github, context, fetchPullRequest) {
1063
1075
  if (!options) return void 0;
1064
1076
  return createGithubPullRequestReconciler(options, fetchPullRequest);
1065
1077
  }
1066
- //#endregion
1067
1078
  export { GithubRules, RECONCILE_ERROR_SAMPLE_LIMIT, attachGithubReconciler, attachGithubRules, cardBelongsToRepository, createGithubPullRequestReconciler, githubRulesOptions, isFactoryGithubLogin, polledPullRequestEvent, reconcilableIssueNumber, reconciledClosedEvent, reconciledIssueClosedEvent, reconciledIssueOpenedEvent, reconciledIssueRelabeledEvent, sameStrings, sweepTrustLookup, trustedCollaborator };
1068
1079
 
1069
1080
  //# sourceMappingURL=rules.js.map