@mastra/factory 0.25.0-alpha.4 → 0.25.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/auth.js +1 -2
- package/dist/boards/define-board.js +1 -2
- package/dist/boards/index.js +1 -2
- package/dist/boards/registry.js +1 -2
- package/dist/boards/relocate.js +1 -2
- package/dist/boards/review.js +1 -2
- package/dist/boards/semantics.js +1 -2
- package/dist/boards/transition-policy.js +1 -2
- package/dist/boards/work-tool-rules.js +1 -2
- package/dist/boards/work-transition-policy.js +1 -2
- package/dist/boards/work.js +1 -2
- package/dist/default-thinking-level.d.ts +3 -0
- package/dist/default-thinking-level.d.ts.map +1 -0
- package/dist/default-thinking-level.js +5 -0
- package/dist/default-thinking-level.js.map +1 -0
- package/dist/environment/build-runner.js +1 -2
- package/dist/environment/build-schedule.js +1 -2
- package/dist/environment/build-workflow.js +1 -2
- package/dist/environment/build.js +1 -2
- package/dist/environment/heads.js +1 -2
- package/dist/factory.d.ts +4 -2
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +62 -21
- package/dist/factory.js.map +1 -1
- package/dist/feed-events.js +1 -2
- package/dist/index.js +2 -2
- package/dist/integrations/channel-thread-announcements.d.ts +8 -0
- package/dist/integrations/channel-thread-announcements.d.ts.map +1 -0
- package/dist/integrations/channel-thread-announcements.js +16 -0
- package/dist/integrations/channel-thread-announcements.js.map +1 -0
- package/dist/integrations/github/acceptance-labels.js +1 -2
- package/dist/integrations/github/app-identity.js +1 -2
- package/dist/integrations/github/commits.js +1 -2
- package/dist/integrations/github/config.js +1 -2
- package/dist/integrations/github/default-rules.js +2 -3
- package/dist/integrations/github/integration.js +3 -4
- package/dist/integrations/github/issue-reconciler.js +1 -2
- package/dist/integrations/github/pat.js +1 -2
- package/dist/integrations/github/provenance.d.ts.map +1 -1
- package/dist/integrations/github/provenance.js +2 -5
- package/dist/integrations/github/provenance.js.map +1 -1
- package/dist/integrations/github/reconcile-worker.js +1 -2
- package/dist/integrations/github/reconciliation-config.js +1 -2
- package/dist/integrations/github/routes.js +4 -5
- package/dist/integrations/github/rules.d.ts.map +1 -1
- package/dist/integrations/github/rules.js +14 -3
- package/dist/integrations/github/rules.js.map +1 -1
- package/dist/integrations/github/sandbox-release.js +1 -2
- package/dist/integrations/github/sandbox.js +1 -2
- package/dist/integrations/github/session-subscriptions.js +1 -2
- package/dist/integrations/github/settle-or-abort.js +1 -2
- package/dist/integrations/github/stale-reviews.js +1 -2
- package/dist/integrations/github/subscriptions.js +1 -2
- package/dist/integrations/github/token-refresh.js +1 -2
- package/dist/integrations/github/webhook.d.ts.map +1 -1
- package/dist/integrations/github/webhook.js +17 -3
- package/dist/integrations/github/webhook.js.map +1 -1
- package/dist/integrations/gitlab/agent-tools.js +1 -2
- package/dist/integrations/gitlab/api.js +1 -2
- package/dist/integrations/gitlab/default-rules.js +1 -2
- package/dist/integrations/gitlab/integration.d.ts +4 -0
- package/dist/integrations/gitlab/integration.d.ts.map +1 -1
- package/dist/integrations/gitlab/integration.js +12 -4
- package/dist/integrations/gitlab/integration.js.map +1 -1
- package/dist/integrations/gitlab/issue-reconciler.js +1 -2
- package/dist/integrations/gitlab/merge-request-reconciler.js +1 -2
- package/dist/integrations/gitlab/reconciler.js +1 -2
- package/dist/integrations/gitlab/reconciliation-config.js +1 -2
- package/dist/integrations/gitlab/routes.d.ts +6 -0
- package/dist/integrations/gitlab/routes.d.ts.map +1 -1
- package/dist/integrations/gitlab/routes.js +154 -3
- package/dist/integrations/gitlab/routes.js.map +1 -1
- package/dist/integrations/gitlab/rules.d.ts.map +1 -1
- package/dist/integrations/gitlab/rules.js +5 -3
- package/dist/integrations/gitlab/rules.js.map +1 -1
- package/dist/integrations/gitlab/session-subscriptions.js +1 -2
- package/dist/integrations/gitlab/subscriptions.js +1 -2
- package/dist/integrations/gitlab/version-control.js +1 -2
- package/dist/integrations/gitlab/webhook-dispatch.js +1 -2
- package/dist/integrations/gitlab/webhook.js +1 -2
- package/dist/integrations/incidentio/agent-tools.js +1 -2
- package/dist/integrations/incidentio/api.js +1 -2
- package/dist/integrations/incidentio/claim.js +1 -2
- package/dist/integrations/incidentio/default-rules.js +1 -2
- package/dist/integrations/incidentio/intake.js +1 -2
- package/dist/integrations/incidentio/integration.js +1 -2
- package/dist/integrations/incidentio/issue-reconciler.js +1 -2
- package/dist/integrations/incidentio/reconciliation-config.js +1 -2
- package/dist/integrations/incidentio/routes.js +1 -2
- package/dist/integrations/incidentio/rules.js +1 -2
- package/dist/integrations/issue-reconcile-worker.js +1 -2
- package/dist/integrations/issue-reconciler.js +1 -2
- package/dist/integrations/jira/adf.js +1 -2
- package/dist/integrations/jira/agent-tools.js +1 -2
- package/dist/integrations/jira/api.d.ts +1 -1
- package/dist/integrations/jira/api.d.ts.map +1 -1
- package/dist/integrations/jira/api.js +2 -3
- package/dist/integrations/jira/api.js.map +1 -1
- package/dist/integrations/jira/claim.js +1 -2
- package/dist/integrations/jira/default-rules.js +1 -2
- package/dist/integrations/jira/integration.d.ts +3 -1
- package/dist/integrations/jira/integration.d.ts.map +1 -1
- package/dist/integrations/jira/integration.js +18 -4
- package/dist/integrations/jira/integration.js.map +1 -1
- package/dist/integrations/jira/issue-reconciler.js +1 -2
- package/dist/integrations/jira/reconciliation-config.js +1 -2
- package/dist/integrations/jira/routes.js +1 -2
- package/dist/integrations/jira/rules.js +1 -2
- package/dist/integrations/linear/agent-tools.d.ts +1 -1
- package/dist/integrations/linear/agent-tools.d.ts.map +1 -1
- package/dist/integrations/linear/agent-tools.js +5 -5
- package/dist/integrations/linear/agent-tools.js.map +1 -1
- package/dist/integrations/linear/claim.js +1 -2
- package/dist/integrations/linear/default-rules.js +1 -2
- package/dist/integrations/linear/integration.d.ts +2 -0
- package/dist/integrations/linear/integration.d.ts.map +1 -1
- package/dist/integrations/linear/integration.js +2 -2
- package/dist/integrations/linear/integration.js.map +1 -1
- package/dist/integrations/linear/issue-reconciler.js +1 -2
- package/dist/integrations/linear/reconciliation-config.js +1 -2
- package/dist/integrations/linear/routes.js +1 -2
- package/dist/integrations/linear/rules.js +1 -2
- package/dist/integrations/platform/api-client.js +1 -2
- package/dist/integrations/platform/connect/routes.js +1 -2
- package/dist/integrations/platform/github/event-worker.js +6 -2
- package/dist/integrations/platform/github/event-worker.js.map +1 -1
- package/dist/integrations/platform/github/integration.js +1 -2
- package/dist/integrations/platform/gitlab/event-worker.js +1 -2
- package/dist/integrations/platform/gitlab/integration.js +1 -2
- package/dist/integrations/platform/incidentio/integration.js +1 -2
- package/dist/integrations/platform/jira/agent-tools.js +1 -2
- package/dist/integrations/platform/jira/integration.js +1 -2
- package/dist/integrations/platform/jira/routes.js +1 -2
- package/dist/integrations/platform/linear/event-worker.js +1 -2
- package/dist/integrations/platform/linear/integration.d.ts.map +1 -1
- package/dist/integrations/platform/linear/integration.js +2 -2
- package/dist/integrations/platform/linear/integration.js.map +1 -1
- package/dist/integrations/pull-request-head.d.ts +1 -0
- package/dist/integrations/pull-request-head.d.ts.map +1 -1
- package/dist/integrations/pull-request-head.js +3 -3
- package/dist/integrations/pull-request-head.js.map +1 -1
- package/dist/integrations/reconciliation-config.js +1 -2
- package/dist/integrations/slack/channel-reply-processor.d.ts +1 -0
- package/dist/integrations/slack/channel-reply-processor.d.ts.map +1 -1
- package/dist/integrations/slack/channel-reply-processor.js +16 -6
- package/dist/integrations/slack/channel-reply-processor.js.map +1 -1
- package/dist/integrations/slack/channel-session-link-processor.d.ts +1 -0
- package/dist/integrations/slack/channel-session-link-processor.d.ts.map +1 -1
- package/dist/integrations/slack/channel-session-link-processor.js +2 -3
- package/dist/integrations/slack/channel-session-link-processor.js.map +1 -1
- package/dist/integrations/slack/connect-route.js +1 -2
- package/dist/integrations/slack/emoji-shortcodes.generated.js +1 -2
- package/dist/integrations/slack/emoji.js +1 -2
- package/dist/integrations/slack/feed-publisher.js +1 -2
- package/dist/integrations/slack/integration.d.ts +5 -0
- package/dist/integrations/slack/integration.d.ts.map +1 -1
- package/dist/integrations/slack/integration.js +13 -2
- package/dist/integrations/slack/integration.js.map +1 -1
- package/dist/integrations/slack/reply-reminder-processor.js +1 -2
- package/dist/integrations/slack/reply-tool.d.ts.map +1 -1
- package/dist/integrations/slack/reply-tool.js +4 -13
- package/dist/integrations/slack/reply-tool.js.map +1 -1
- package/dist/integrations/slack/run-error-card.d.ts +3 -0
- package/dist/integrations/slack/run-error-card.d.ts.map +1 -0
- package/dist/integrations/slack/run-error-card.js +44 -0
- package/dist/integrations/slack/run-error-card.js.map +1 -0
- package/dist/integrations/slack/share-file-tool.js +1 -2
- package/dist/integrations/slack/slack.d.ts.map +1 -1
- package/dist/integrations/slack/slack.js +7 -4
- package/dist/integrations/slack/slack.js.map +1 -1
- package/dist/integrations/subscription-session.js +1 -2
- package/dist/integrations/workos/integration.js +1 -2
- package/dist/mcp/disconnect.js +1 -2
- package/dist/mcp/events.js +2 -3
- package/dist/mcp/routes.js +1 -2
- package/dist/packages/_internals/workspace/dist/index.js +1 -2
- package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
- package/dist/platform-auth-host.js +1 -2
- package/dist/provider-display-name.js +1 -2
- package/dist/review-verdict.d.ts +1 -0
- package/dist/review-verdict.d.ts.map +1 -1
- package/dist/review-verdict.js +9 -3
- package/dist/review-verdict.js.map +1 -1
- package/dist/routes/attention-activity.js +1 -2
- package/dist/routes/attention-parked.js +1 -2
- package/dist/routes/attention-proposed.js +1 -2
- package/dist/routes/attention-providers.js +1 -2
- package/dist/routes/attention.js +1 -2
- package/dist/routes/automation-runs.js +1 -2
- package/dist/routes/config.d.ts +7 -0
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +29 -3
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/contracts.js +1 -2
- package/dist/routes/custom-provider-source.js +1 -2
- package/dist/routes/fs.js +1 -2
- package/dist/routes/intake.js +6 -4
- package/dist/routes/intake.js.map +1 -1
- package/dist/routes/knowledge.js +1 -2
- package/dist/routes/oauth.js +1 -2
- package/dist/routes/projects.js +1 -2
- package/dist/routes/provider-credentials.js +1 -2
- package/dist/routes/route.js +1 -2
- package/dist/routes/session-access.js +1 -2
- package/dist/routes/skills.js +1 -2
- package/dist/routes/source-control-sessions.js +5 -6
- package/dist/routes/source-control-settings.js +1 -2
- package/dist/routes/surface.js +3 -4
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/telemetry.js +1 -2
- package/dist/routes/tenant-credentials.js +1 -2
- package/dist/routes/work-items.js +2 -3
- package/dist/rules/binding-context.js +1 -2
- package/dist/rules/decision-applicability.js +1 -2
- package/dist/rules/dispatch-errors.js +1 -2
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +9 -3
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/event-rules.js +1 -2
- package/dist/rules/processor.js +1 -2
- package/dist/rules/resolve.js +1 -2
- package/dist/rules/review-source-tool.js +1 -2
- package/dist/rules/start-coordinator.js +1 -2
- package/dist/rules/terminal-cleanup.js +1 -2
- package/dist/rules/tools.js +1 -2
- package/dist/rules/transition-service.js +1 -2
- package/dist/rules/types.d.ts +4 -1
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +1 -2
- package/dist/rules/types.js.map +1 -1
- package/dist/rules/validation.js +1 -2
- package/dist/run-error.d.ts +13 -0
- package/dist/run-error.d.ts.map +1 -0
- package/dist/run-error.js +81 -0
- package/dist/run-error.js.map +1 -0
- package/dist/sandbox/callback-factory-sandbox.js +1 -2
- package/dist/sandbox/git-ref.js +1 -2
- package/dist/sandbox/local-factory-sandbox.d.ts +12 -4
- package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -1
- package/dist/sandbox/local-factory-sandbox.js +32 -7
- package/dist/sandbox/local-factory-sandbox.js.map +1 -1
- package/dist/sandbox/materialization.js +1 -2
- package/dist/sandbox/session-retirement.js +1 -2
- package/dist/sandbox/session-sandbox.js +1 -2
- package/dist/sandbox/workdir.js +1 -2
- package/dist/secret-encryption.js +1 -2
- package/dist/server-error.js +1 -2
- package/dist/session/credential-policy.js +1 -2
- package/dist/session/default-model-hydration.js +1 -2
- package/dist/session/environment-repositories.js +1 -2
- package/dist/session/environment-state-processor.d.ts +0 -1
- package/dist/session/environment-state-processor.d.ts.map +1 -1
- package/dist/session/environment-state-processor.js +2 -3
- package/dist/session/environment-state-processor.js.map +1 -1
- package/dist/session/factory-session.js +1 -2
- package/dist/session/filesystem-capture.js +2 -3
- package/dist/session/filesystem-capture.js.map +1 -1
- package/dist/session/first-exec-capture.js +2 -3
- package/dist/session/first-exec-capture.js.map +1 -1
- package/dist/session/first-message-capture.js +1 -2
- package/dist/session/live-sessions.js +1 -2
- package/dist/session/memory-settings-hydration.js +1 -2
- package/dist/session/org-seed.js +1 -2
- package/dist/session/reply-credential-processor.js +1 -2
- package/dist/session/resource-migration.js +1 -2
- package/dist/session/run-audit.js +1 -2
- package/dist/session/session-threads.js +1 -2
- package/dist/session/session-title.js +1 -2
- package/dist/session/shell-commands.js +1 -2
- package/dist/session/source-control-tools.js +2 -3
- package/dist/session/thinking-default.d.ts +1 -1
- package/dist/session/thinking-default.d.ts.map +1 -1
- package/dist/session/thinking-default.js +11 -13
- package/dist/session/thinking-default.js.map +1 -1
- package/dist/session/thread-session-stamp.js +1 -2
- package/dist/session/thread-title-mirror.js +1 -2
- package/dist/session/thread-title-mirror.js.map +1 -1
- package/dist/session/work-item-repository.js +1 -2
- package/dist/session-owner-signal.js +1 -2
- package/dist/skills/catalog.js +1 -2
- package/dist/skills/service.js +1 -2
- package/dist/spa-static.js +1 -2
- package/dist/state-signing.js +1 -2
- package/dist/storage/domains/audit/actions.js +1 -2
- package/dist/storage/domains/audit/actors.js +1 -2
- package/dist/storage/domains/audit/agent-audit.js +1 -2
- package/dist/storage/domains/audit/base.js +1 -2
- package/dist/storage/domains/audit/domain.js +1 -2
- package/dist/storage/domains/audit/wire.js +1 -2
- package/dist/storage/domains/channel-identity/base.js +1 -2
- package/dist/storage/domains/comments/activity.js +1 -2
- package/dist/storage/domains/comments/actor.js +1 -2
- package/dist/storage/domains/comments/base.js +1 -2
- package/dist/storage/domains/comments/domain.js +1 -2
- package/dist/storage/domains/comments/feed-context.js +1 -2
- package/dist/storage/domains/comments/parse.js +1 -2
- package/dist/storage/domains/comments/routes.js +1 -2
- package/dist/storage/domains/comments/schema.js +1 -2
- package/dist/storage/domains/comments/wire.js +1 -2
- package/dist/storage/domains/credentials/base.d.ts +4 -1
- package/dist/storage/domains/credentials/base.d.ts.map +1 -1
- package/dist/storage/domains/credentials/base.js +40 -44
- package/dist/storage/domains/credentials/base.js.map +1 -1
- package/dist/storage/domains/custom-providers/base.js +1 -2
- package/dist/storage/domains/filesystem/base.js +1 -2
- package/dist/storage/domains/intake/base.d.ts +5 -0
- package/dist/storage/domains/intake/base.d.ts.map +1 -1
- package/dist/storage/domains/intake/base.js +10 -2
- package/dist/storage/domains/intake/base.js.map +1 -1
- package/dist/storage/domains/integrations/base.js +1 -2
- package/dist/storage/domains/memory-settings/base.js +1 -2
- package/dist/storage/domains/model-defaults/base.js +1 -2
- package/dist/storage/domains/projects/base.d.ts +0 -1
- package/dist/storage/domains/projects/base.d.ts.map +1 -1
- package/dist/storage/domains/projects/base.js +5 -6
- package/dist/storage/domains/projects/base.js.map +1 -1
- package/dist/storage/domains/queue-health/base.js +1 -2
- package/dist/storage/domains/source-control/base.js +1 -2
- package/dist/storage/domains/source-control/inmemory.js +1 -2
- package/dist/storage/domains/work-items/base.js +1 -2
- package/dist/storage/domains/work-items/board-version.js +1 -2
- package/dist/storage/domains/work-items/metrics.js +1 -2
- package/dist/telemetry-types.js +1 -2
- package/dist/telemetry.js +1 -2
- package/dist/timing.js +1 -2
- package/dist/tools/annotations.js +1 -2
- package/dist/tools/approval-tools.js +1 -2
- package/dist/tools/deliver.js +2 -3
- package/dist/tools/index.js +1 -2
- package/dist/tools/messaging-tools.js +1 -2
- package/dist/tools/permissions.js +1 -2
- package/dist/tools/read-tools.js +1 -2
- package/dist/tools/reports.js +1 -2
- package/dist/tools/run-watch.d.ts +0 -2
- package/dist/tools/run-watch.d.ts.map +1 -1
- package/dist/tools/run-watch.js +4 -44
- package/dist/tools/run-watch.js.map +1 -1
- package/dist/tools/sandbox-tools.js +1 -2
- package/dist/tools/scope.js +2 -3
- package/dist/tools/session-tools.js +1 -2
- package/dist/tools/sessions-state-processor.js +1 -2
- package/dist/tools/side-sessions.js +1 -2
- package/dist/tools/work-item-tools.js +1 -2
- package/dist/work-item-branch.js +1 -2
- package/dist/work-item-branch.js.map +1 -1
- package/dist/work-items/create-work-item.js +1 -2
- package/dist/work-items/decision-actions.js +1 -2
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -3
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-review/SKILL.md +1 -1
- package/factory-skills/factory-plan/SKILL.md +1 -1
- package/factory-skills/factory-rereview/SKILL.md +14 -3
- package/factory-skills/factory-review/SKILL.md +14 -3
- package/factory-skills/factory-self-review/SKILL.md +1 -1
- package/factory-skills/factory-triage/SKILL.md +52 -29
- package/package.json +19 -17
package/dist/feed-events.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
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
|
-
|
|
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))
|
|
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
|