@mastra/factory 0.16.0-alpha.9 → 0.16.0
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 +37 -0
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/boards/review.d.ts.map +1 -1
- package/dist/boards/review.js +19 -8
- package/dist/boards/review.js.map +1 -1
- package/dist/boards/work.d.ts.map +1 -1
- package/dist/boards/work.js +31 -3
- package/dist/boards/work.js.map +1 -1
- package/dist/capabilities/intake.d.ts +4 -0
- package/dist/capabilities/intake.d.ts.map +1 -1
- package/dist/capabilities/version-control.d.ts +15 -0
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/factory.d.ts +7 -7
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +100 -40
- package/dist/factory.js.map +1 -1
- package/dist/integrations/base.d.ts +3 -0
- package/dist/integrations/base.d.ts.map +1 -1
- package/dist/integrations/github/integration.d.ts.map +1 -1
- package/dist/integrations/github/integration.js +21 -0
- package/dist/integrations/github/integration.js.map +1 -1
- package/dist/integrations/github/routes.js +2 -1
- package/dist/integrations/github/routes.js.map +1 -1
- package/dist/integrations/github/sandbox.d.ts +41 -42
- package/dist/integrations/github/sandbox.d.ts.map +1 -1
- package/dist/integrations/github/sandbox.js +416 -227
- package/dist/integrations/github/sandbox.js.map +1 -1
- package/dist/integrations/github/webhook.d.ts +2 -5
- package/dist/integrations/github/webhook.d.ts.map +1 -1
- package/dist/integrations/github/webhook.js +8 -48
- package/dist/integrations/github/webhook.js.map +1 -1
- package/dist/integrations/gitlab/agent-tools.d.ts +14 -0
- package/dist/integrations/gitlab/agent-tools.d.ts.map +1 -0
- package/dist/integrations/gitlab/agent-tools.js +42 -0
- package/dist/integrations/gitlab/agent-tools.js.map +1 -0
- package/dist/integrations/gitlab/api.d.ts +222 -0
- package/dist/integrations/gitlab/api.d.ts.map +1 -0
- package/dist/integrations/gitlab/api.js +274 -0
- package/dist/integrations/gitlab/api.js.map +1 -0
- package/dist/integrations/gitlab/default-rules.d.ts +125 -0
- package/dist/integrations/gitlab/default-rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/default-rules.js +172 -0
- package/dist/integrations/gitlab/default-rules.js.map +1 -0
- package/dist/integrations/gitlab/integration.d.ts +138 -0
- package/dist/integrations/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/gitlab/integration.js +705 -0
- package/dist/integrations/gitlab/integration.js.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.js +123 -0
- package/dist/integrations/gitlab/issue-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js +267 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciler.d.ts +5 -0
- package/dist/integrations/gitlab/reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciler.js +31 -0
- package/dist/integrations/gitlab/reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts +3 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.js +17 -0
- package/dist/integrations/gitlab/reconciliation-config.js.map +1 -0
- package/dist/integrations/gitlab/routes.d.ts +20 -0
- package/dist/integrations/gitlab/routes.d.ts.map +1 -0
- package/dist/integrations/gitlab/routes.js +473 -0
- package/dist/integrations/gitlab/routes.js.map +1 -0
- package/dist/integrations/gitlab/rules.d.ts +35 -0
- package/dist/integrations/gitlab/rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/rules.js +391 -0
- package/dist/integrations/gitlab/rules.js.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts +32 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.js +192 -0
- package/dist/integrations/gitlab/session-subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/subscriptions.d.ts +70 -0
- package/dist/integrations/gitlab/subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/subscriptions.js +76 -0
- package/dist/integrations/gitlab/subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/version-control.d.ts +16 -0
- package/dist/integrations/gitlab/version-control.d.ts.map +1 -0
- package/dist/integrations/gitlab/version-control.js +622 -0
- package/dist/integrations/gitlab/version-control.js.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts +75 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.js +235 -0
- package/dist/integrations/gitlab/webhook-dispatch.js.map +1 -0
- package/dist/integrations/gitlab/webhook.d.ts +72 -0
- package/dist/integrations/gitlab/webhook.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook.js +201 -0
- package/dist/integrations/gitlab/webhook.js.map +1 -0
- package/dist/integrations/incidentio/integration.js +1 -1
- package/dist/integrations/issue-reconciler.d.ts +3 -3
- package/dist/integrations/issue-reconciler.d.ts.map +1 -1
- package/dist/integrations/issue-reconciler.js +22 -2
- package/dist/integrations/issue-reconciler.js.map +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +21 -0
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/platform/gitlab/event-worker.d.ts +64 -0
- package/dist/integrations/platform/gitlab/event-worker.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/event-worker.js +306 -0
- package/dist/integrations/platform/gitlab/event-worker.js.map +1 -0
- package/dist/integrations/platform/gitlab/integration.d.ts +57 -0
- package/dist/integrations/platform/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/integration.js +125 -0
- package/dist/integrations/platform/gitlab/integration.js.map +1 -0
- package/dist/integrations/platform/incidentio/integration.js +1 -1
- package/dist/integrations/slack/integration.d.ts.map +1 -1
- package/dist/integrations/slack/integration.js +3 -3
- package/dist/integrations/slack/integration.js.map +1 -1
- package/dist/integrations/slack/slack.d.ts +2 -0
- package/dist/integrations/slack/slack.d.ts.map +1 -1
- package/dist/integrations/slack/slack.js +21 -7
- package/dist/integrations/slack/slack.js.map +1 -1
- package/dist/integrations/subscription-session.d.ts +37 -0
- package/dist/integrations/subscription-session.d.ts.map +1 -0
- package/dist/integrations/subscription-session.js +83 -0
- package/dist/integrations/subscription-session.js.map +1 -0
- package/dist/packages/_internals/workspace/dist/index.js +1 -11
- package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
- package/dist/routes/intake.d.ts.map +1 -1
- package/dist/routes/intake.js +4 -2
- package/dist/routes/intake.js.map +1 -1
- package/dist/routes/oauth.js +1 -1
- package/dist/routes/projects.d.ts +1 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +1 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +20 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -0
- package/dist/routes/source-control-sessions.js +319 -0
- package/dist/routes/source-control-sessions.js.map +1 -0
- package/dist/routes/source-control-settings.d.ts +10 -0
- package/dist/routes/source-control-settings.d.ts.map +1 -0
- package/dist/routes/source-control-settings.js +87 -0
- package/dist/routes/source-control-settings.js.map +1 -0
- package/dist/routes/surface.d.ts +3 -3
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +55 -13
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/tenant-credentials.d.ts +8 -0
- package/dist/routes/tenant-credentials.d.ts.map +1 -1
- package/dist/routes/tenant-credentials.js +20 -3
- package/dist/routes/tenant-credentials.js.map +1 -1
- package/dist/routes/work-items.d.ts.map +1 -1
- package/dist/routes/work-items.js +1 -1
- package/dist/routes/work-items.js.map +1 -1
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +7 -1
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/start-coordinator.d.ts +1 -1
- package/dist/rules/start-coordinator.d.ts.map +1 -1
- package/dist/rules/start-coordinator.js +3 -2
- package/dist/rules/start-coordinator.js.map +1 -1
- package/dist/rules/transition-service.d.ts.map +1 -1
- package/dist/rules/transition-service.js +6 -3
- package/dist/rules/transition-service.js.map +1 -1
- package/dist/rules/types.d.ts +67 -3
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +23 -2
- package/dist/rules/types.js.map +1 -1
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/rules/validation.js +2 -0
- package/dist/rules/validation.js.map +1 -1
- package/dist/sandbox/git-ref.d.ts +7 -0
- package/dist/sandbox/git-ref.d.ts.map +1 -0
- package/dist/sandbox/git-ref.js +15 -0
- package/dist/sandbox/git-ref.js.map +1 -0
- package/dist/sandbox/session-retirement.js +1 -1
- package/dist/sandbox/workdir.d.ts.map +1 -1
- package/dist/sandbox/workdir.js +6 -6
- package/dist/sandbox/workdir.js.map +1 -1
- package/dist/session/factory-session.d.ts +31 -1
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +60 -1
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/source-control-tools.d.ts +16 -0
- package/dist/session/source-control-tools.d.ts.map +1 -0
- package/dist/session/source-control-tools.js +464 -0
- package/dist/session/source-control-tools.js.map +1 -0
- package/dist/storage/domains/intake/base.d.ts +18 -0
- package/dist/storage/domains/intake/base.d.ts.map +1 -1
- package/dist/storage/domains/intake/base.js +77 -0
- package/dist/storage/domains/intake/base.js.map +1 -1
- package/dist/work-item-branch.d.ts +3 -1
- package/dist/work-item-branch.d.ts.map +1 -1
- package/dist/work-item-branch.js +22 -4
- package/dist/work-item-branch.js.map +1 -1
- package/dist/workspace.d.ts +15 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +57 -23
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-rereview/SKILL.md +19 -0
- package/factory-skills/factory-gitlab-review/SKILL.md +30 -0
- package/factory-skills/factory-rereview/SKILL.md +13 -6
- package/factory-skills/factory-review/SKILL.md +13 -6
- package/factory-skills/factory-review/references/archaeology.md +225 -0
- package/factory-skills/factory-review/references/categories/README.md +34 -0
- package/factory-skills/factory-review/references/categories/behavior-change.md +36 -0
- package/factory-skills/factory-review/references/categories/bug-fix.md +37 -0
- package/factory-skills/factory-review/references/categories/docs.md +32 -0
- package/factory-skills/factory-review/references/categories/experimental-flagged.md +34 -0
- package/factory-skills/factory-review/references/categories/infra-tooling.md +37 -0
- package/factory-skills/factory-review/references/categories/internal-capability.md +35 -0
- package/factory-skills/factory-review/references/categories/large-cross-cutting.md +35 -0
- package/factory-skills/factory-review/references/categories/mechanical.md +36 -0
- package/factory-skills/factory-review/references/categories/performance.md +33 -0
- package/factory-skills/factory-review/references/categories/public-api.md +38 -0
- package/factory-skills/factory-review/references/categories/refactor.md +35 -0
- package/factory-skills/factory-review/references/categories/revert.md +31 -0
- package/factory-skills/factory-review/references/categories/schema-storage.md +39 -0
- package/factory-skills/factory-review/references/categories/security.md +35 -0
- package/factory-skills/factory-review/references/categories/tests-only.md +38 -0
- package/package.json +9 -9
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { getFactoryAuthOrgId, getFactoryAuthUserFromContext, getFactoryAuthUserId } from "../auth.js";
|
|
2
|
+
import { mergeRequestNumberFromBranch } from "../work-item-branch.js";
|
|
3
|
+
import { resolveSessionWorkdir } from "../sandbox/session-sandbox.js";
|
|
4
|
+
import { pushRepositoryBranch, refreshMergeRequestCheckout } from "../integrations/github/sandbox.js";
|
|
5
|
+
import { createTool } from "@mastra/core/tools";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
//#region src/session/source-control-tools.ts
|
|
8
|
+
function authIdentity(requestContext) {
|
|
9
|
+
const user = getFactoryAuthUserFromContext(requestContext);
|
|
10
|
+
return {
|
|
11
|
+
orgId: getFactoryAuthOrgId(user),
|
|
12
|
+
userId: getFactoryAuthUserId(user)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async function resolveSessionTarget(requestContext, providers) {
|
|
16
|
+
const context = requestContext.get("controller");
|
|
17
|
+
const { orgId, userId } = authIdentity(requestContext);
|
|
18
|
+
if (!context?.resourceId || !orgId || !userId) throw new Error("Source-control tools require an authenticated repository session.");
|
|
19
|
+
const matches = (await Promise.all(providers.map(async (provider) => ({
|
|
20
|
+
provider,
|
|
21
|
+
session: await provider.storage.sessions.getBySessionId(context.resourceId)
|
|
22
|
+
})))).filter((match) => match.session !== null);
|
|
23
|
+
if (matches.length !== 1) throw new Error(matches.length === 0 ? "The active session is not backed by a source-control repository." : "The active session is ambiguous across source-control providers.");
|
|
24
|
+
const { provider, session } = matches[0];
|
|
25
|
+
if (session.orgId !== orgId || session.visibility === "private" && session.userId !== userId) throw new Error("The active source-control session is not available to the authenticated user.");
|
|
26
|
+
const projectRepository = await provider.storage.projectRepositories.get({
|
|
27
|
+
orgId,
|
|
28
|
+
id: session.projectRepositoryId
|
|
29
|
+
});
|
|
30
|
+
if (!projectRepository) throw new Error("The active project repository was not found.");
|
|
31
|
+
const state = context.getState();
|
|
32
|
+
if (state.projectRepositoryId && state.projectRepositoryId !== projectRepository.id) throw new Error("The active source-control session does not match its controller repository.");
|
|
33
|
+
const connection = await provider.storage.connections.get({
|
|
34
|
+
orgId,
|
|
35
|
+
id: projectRepository.connectionId
|
|
36
|
+
});
|
|
37
|
+
if (!connection) throw new Error("The active source-control connection was not found.");
|
|
38
|
+
if (state.factoryProjectId && state.factoryProjectId !== connection.factoryProjectId) throw new Error("The active source-control session does not match its Factory project.");
|
|
39
|
+
const repository = await provider.storage.repositories.get({
|
|
40
|
+
orgId,
|
|
41
|
+
id: projectRepository.repositoryId
|
|
42
|
+
});
|
|
43
|
+
if (!repository) throw new Error("The active source-control repository was not found.");
|
|
44
|
+
return {
|
|
45
|
+
context,
|
|
46
|
+
provider,
|
|
47
|
+
session,
|
|
48
|
+
projectRepository,
|
|
49
|
+
repository,
|
|
50
|
+
orgId,
|
|
51
|
+
userId
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function changeRequestId(value) {
|
|
55
|
+
return String(value);
|
|
56
|
+
}
|
|
57
|
+
function executableSandbox(value) {
|
|
58
|
+
const sandbox = value;
|
|
59
|
+
if (!sandbox?.executeCommand) throw new Error("The active Factory workspace has no executable sandbox.");
|
|
60
|
+
return sandbox;
|
|
61
|
+
}
|
|
62
|
+
async function emitAgentAudit(audit, requestContext, input) {
|
|
63
|
+
try {
|
|
64
|
+
await audit.emitAgent({
|
|
65
|
+
requestContext,
|
|
66
|
+
input
|
|
67
|
+
});
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.warn("[Audit] Failed to record brokered source-control action", {
|
|
70
|
+
action: input.action,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const changeRequestSchema = z.object({ changeRequestId: z.union([z.string().trim().min(1), z.number().int().positive()]) });
|
|
76
|
+
function createSourceControlTools({ requestContext, providers, audit }) {
|
|
77
|
+
if (!requestContext || typeof requestContext.get !== "function") return {};
|
|
78
|
+
const controller = requestContext.get("controller");
|
|
79
|
+
const identity = authIdentity(requestContext);
|
|
80
|
+
if (!controller?.resourceId || !identity.orgId || !identity.userId || providers.length === 0) return {};
|
|
81
|
+
const withTarget = () => resolveSessionTarget(requestContext, providers);
|
|
82
|
+
const reference = async (target) => ({
|
|
83
|
+
...await target.provider.versionControl.getRepositoryTarget({
|
|
84
|
+
orgId: target.orgId,
|
|
85
|
+
repositoryId: target.repository.id
|
|
86
|
+
}),
|
|
87
|
+
actingUserId: target.userId
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
source_control_refresh_change_request_checkout: createTool({
|
|
91
|
+
id: "source_control_refresh_change_request_checkout",
|
|
92
|
+
description: "Refresh the active GitLab review session checkout to its current MR head. The MR, repository, branch, and credential are resolved server-side; no provider credentials enter the agent workspace.",
|
|
93
|
+
inputSchema: z.object({}),
|
|
94
|
+
execute: async (_input, { workspace }) => {
|
|
95
|
+
const target = await withTarget();
|
|
96
|
+
const mergeRequestNumber = mergeRequestNumberFromBranch(target.session.branch);
|
|
97
|
+
if (target.provider.id !== "gitlab" || mergeRequestNumber === void 0) throw new Error("Checkout refresh is only available in a bound GitLab merge-request review session.");
|
|
98
|
+
const ref = await reference(target);
|
|
99
|
+
const mergeRequest = await target.provider.versionControl.getPullRequest({
|
|
100
|
+
...ref,
|
|
101
|
+
pullRequestId: String(mergeRequestNumber)
|
|
102
|
+
});
|
|
103
|
+
if (!mergeRequest || mergeRequest.state !== "open" || mergeRequest.merged) throw new Error("The bound GitLab merge request is no longer open.");
|
|
104
|
+
const sandbox = executableSandbox(workspace?.sandbox);
|
|
105
|
+
const workdir = await resolveSessionWorkdir(target.session.id, sandbox, target.repository.slug);
|
|
106
|
+
const access = await target.provider.versionControl.getRepositoryAccess({
|
|
107
|
+
orgId: target.orgId,
|
|
108
|
+
repositoryId: target.repository.id
|
|
109
|
+
});
|
|
110
|
+
return await refreshMergeRequestCheckout(sandbox, workdir, {
|
|
111
|
+
branch: target.session.branch,
|
|
112
|
+
mergeRequestNumber,
|
|
113
|
+
expectedHeadSha: mergeRequest.headSha,
|
|
114
|
+
access
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}),
|
|
118
|
+
source_control_push_branch: createTool({
|
|
119
|
+
id: "source_control_push_branch",
|
|
120
|
+
description: "Push the active Factory session branch to its connected source-control provider. Credentials are resolved and scrubbed server-side; this tool takes no token, repository, remote, or branch arguments.",
|
|
121
|
+
inputSchema: z.object({}),
|
|
122
|
+
execute: async (_input, { workspace }) => {
|
|
123
|
+
const target = await withTarget();
|
|
124
|
+
const sandbox = executableSandbox(workspace?.sandbox);
|
|
125
|
+
const workdir = await resolveSessionWorkdir(target.session.id, sandbox, target.repository.slug);
|
|
126
|
+
const access = await target.provider.versionControl.getRepositoryAccess({
|
|
127
|
+
orgId: target.orgId,
|
|
128
|
+
repositoryId: target.repository.id
|
|
129
|
+
});
|
|
130
|
+
await pushRepositoryBranch(sandbox, workdir, target.session.branch, access, target.repository.slug);
|
|
131
|
+
await emitAgentAudit(audit, requestContext, {
|
|
132
|
+
action: "factory.agent.push",
|
|
133
|
+
targets: [{
|
|
134
|
+
type: "repository",
|
|
135
|
+
id: target.repository.slug
|
|
136
|
+
}],
|
|
137
|
+
metadata: {
|
|
138
|
+
branch: target.session.branch,
|
|
139
|
+
provider: target.provider.id
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
pushed: true,
|
|
144
|
+
branch: target.session.branch,
|
|
145
|
+
repository: target.repository.slug
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}),
|
|
149
|
+
source_control_get_change_request: createTool({
|
|
150
|
+
id: "source_control_get_change_request",
|
|
151
|
+
description: "Read a pull request or merge request in the active Factory repository by its numeric repository-local ID.",
|
|
152
|
+
inputSchema: changeRequestSchema,
|
|
153
|
+
execute: async (input) => {
|
|
154
|
+
const target = await withTarget();
|
|
155
|
+
return target.provider.versionControl.getPullRequest({
|
|
156
|
+
...await reference(target),
|
|
157
|
+
pullRequestId: changeRequestId(input.changeRequestId)
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}),
|
|
161
|
+
source_control_list_change_request_reviews: createTool({
|
|
162
|
+
id: "source_control_list_change_request_reviews",
|
|
163
|
+
description: "List submitted reviews and approvals on a pull request or merge request in the active repository.",
|
|
164
|
+
inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),
|
|
165
|
+
execute: async (input) => {
|
|
166
|
+
const target = await withTarget();
|
|
167
|
+
return target.provider.versionControl.listReviews({
|
|
168
|
+
...await reference(target),
|
|
169
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
170
|
+
...input.cursor !== void 0 ? { cursor: input.cursor } : {}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}),
|
|
174
|
+
source_control_create_change_request: createTool({
|
|
175
|
+
id: "source_control_create_change_request",
|
|
176
|
+
description: "Open a pull request or merge request from the active Factory session branch into its persisted base branch. Push the branch with source_control_push_branch first.",
|
|
177
|
+
inputSchema: z.object({
|
|
178
|
+
title: z.string().trim().min(1),
|
|
179
|
+
body: z.string().optional(),
|
|
180
|
+
draft: z.boolean().optional()
|
|
181
|
+
}),
|
|
182
|
+
execute: async (input) => {
|
|
183
|
+
const target = await withTarget();
|
|
184
|
+
const created = await target.provider.versionControl.createPullRequest({
|
|
185
|
+
...await reference(target),
|
|
186
|
+
title: input.title,
|
|
187
|
+
...input.body !== void 0 ? { body: input.body } : {},
|
|
188
|
+
baseBranch: target.session.baseBranch,
|
|
189
|
+
headBranch: target.session.branch,
|
|
190
|
+
...input.draft !== void 0 ? { draft: input.draft } : {}
|
|
191
|
+
});
|
|
192
|
+
await emitAgentAudit(audit, requestContext, {
|
|
193
|
+
action: "factory.agent.pr_opened",
|
|
194
|
+
targets: [{
|
|
195
|
+
type: "pull_request",
|
|
196
|
+
id: created.url
|
|
197
|
+
}, {
|
|
198
|
+
type: "repository",
|
|
199
|
+
id: target.repository.slug
|
|
200
|
+
}],
|
|
201
|
+
metadata: {
|
|
202
|
+
url: created.url,
|
|
203
|
+
provider: target.provider.id
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
return created;
|
|
207
|
+
}
|
|
208
|
+
}),
|
|
209
|
+
source_control_update_change_request: createTool({
|
|
210
|
+
id: "source_control_update_change_request",
|
|
211
|
+
description: "Update the title, body, target branch, or open/closed state of a change request.",
|
|
212
|
+
inputSchema: changeRequestSchema.extend({
|
|
213
|
+
title: z.string().trim().min(1).optional(),
|
|
214
|
+
body: z.string().nullable().optional(),
|
|
215
|
+
baseBranch: z.string().trim().min(1).optional(),
|
|
216
|
+
state: z.enum(["open", "closed"]).optional()
|
|
217
|
+
}),
|
|
218
|
+
execute: async (input) => {
|
|
219
|
+
const target = await withTarget();
|
|
220
|
+
return target.provider.versionControl.updatePullRequest({
|
|
221
|
+
...await reference(target),
|
|
222
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
223
|
+
...input.title !== void 0 ? { title: input.title } : {},
|
|
224
|
+
...input.body !== void 0 ? { body: input.body } : {},
|
|
225
|
+
...input.baseBranch !== void 0 ? { baseBranch: input.baseBranch } : {},
|
|
226
|
+
...input.state !== void 0 ? { state: input.state } : {}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}),
|
|
230
|
+
source_control_comment_change_request: createTool({
|
|
231
|
+
id: "source_control_comment_change_request",
|
|
232
|
+
description: "Add a top-level comment to a pull request or merge request in the active repository.",
|
|
233
|
+
inputSchema: changeRequestSchema.extend({ body: z.string().trim().min(1) }),
|
|
234
|
+
execute: async (input) => {
|
|
235
|
+
const target = await withTarget();
|
|
236
|
+
return target.provider.versionControl.createComment({
|
|
237
|
+
...await reference(target),
|
|
238
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
239
|
+
body: input.body
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}),
|
|
243
|
+
source_control_list_change_request_comments: createTool({
|
|
244
|
+
id: "source_control_list_change_request_comments",
|
|
245
|
+
description: "List top-level comments on a pull request or merge request in the active repository.",
|
|
246
|
+
inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),
|
|
247
|
+
execute: async (input) => {
|
|
248
|
+
const target = await withTarget();
|
|
249
|
+
return target.provider.versionControl.listComments({
|
|
250
|
+
...await reference(target),
|
|
251
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
252
|
+
...input.cursor !== void 0 ? { cursor: input.cursor } : {}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}),
|
|
256
|
+
source_control_update_change_request_comment: createTool({
|
|
257
|
+
id: "source_control_update_change_request_comment",
|
|
258
|
+
description: "Edit a top-level pull-request or merge-request comment in the active repository.",
|
|
259
|
+
inputSchema: z.object({
|
|
260
|
+
commentId: z.string().trim().min(1),
|
|
261
|
+
body: z.string().trim().min(1)
|
|
262
|
+
}),
|
|
263
|
+
execute: async (input) => {
|
|
264
|
+
const target = await withTarget();
|
|
265
|
+
return target.provider.versionControl.updateComment({
|
|
266
|
+
...await reference(target),
|
|
267
|
+
commentId: input.commentId,
|
|
268
|
+
body: input.body
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}),
|
|
272
|
+
source_control_delete_change_request_comment: createTool({
|
|
273
|
+
id: "source_control_delete_change_request_comment",
|
|
274
|
+
description: "Delete a top-level pull-request or merge-request comment in the active repository.",
|
|
275
|
+
inputSchema: z.object({ commentId: z.string().trim().min(1) }),
|
|
276
|
+
execute: async (input) => {
|
|
277
|
+
const target = await withTarget();
|
|
278
|
+
await target.provider.versionControl.deleteComment({
|
|
279
|
+
...await reference(target),
|
|
280
|
+
commentId: input.commentId
|
|
281
|
+
});
|
|
282
|
+
return { deleted: true };
|
|
283
|
+
}
|
|
284
|
+
}),
|
|
285
|
+
source_control_list_diff_comments: createTool({
|
|
286
|
+
id: "source_control_list_diff_comments",
|
|
287
|
+
description: "List line-anchored review comments and discussion replies on a pull request or merge request in the active repository.",
|
|
288
|
+
inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),
|
|
289
|
+
execute: async (input) => {
|
|
290
|
+
const target = await withTarget();
|
|
291
|
+
return target.provider.versionControl.listReviewComments({
|
|
292
|
+
...await reference(target),
|
|
293
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
294
|
+
...input.cursor !== void 0 ? { cursor: input.cursor } : {}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}),
|
|
298
|
+
source_control_create_diff_comment: createTool({
|
|
299
|
+
id: "source_control_create_diff_comment",
|
|
300
|
+
description: "Create a line-anchored review comment or reply to an existing diff discussion. Use replyToId alone for a reply; otherwise provide commitId, path, line, and side.",
|
|
301
|
+
inputSchema: z.union([changeRequestSchema.extend({
|
|
302
|
+
body: z.string().trim().min(1),
|
|
303
|
+
replyToId: z.string().trim().min(1)
|
|
304
|
+
}), changeRequestSchema.extend({
|
|
305
|
+
body: z.string().trim().min(1),
|
|
306
|
+
commitId: z.string().trim().min(1),
|
|
307
|
+
path: z.string().trim().min(1),
|
|
308
|
+
line: z.number().int().positive(),
|
|
309
|
+
side: z.enum(["left", "right"]),
|
|
310
|
+
startLine: z.number().int().positive().optional(),
|
|
311
|
+
startSide: z.enum(["left", "right"]).optional()
|
|
312
|
+
}).refine((input) => input.startLine === void 0 === (input.startSide === void 0), { message: "startLine and startSide must be provided together." })]),
|
|
313
|
+
execute: async (input) => {
|
|
314
|
+
const target = await withTarget();
|
|
315
|
+
const base = {
|
|
316
|
+
...await reference(target),
|
|
317
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
318
|
+
body: input.body
|
|
319
|
+
};
|
|
320
|
+
if ("replyToId" in input) return target.provider.versionControl.createReviewComment({
|
|
321
|
+
...base,
|
|
322
|
+
replyToId: input.replyToId
|
|
323
|
+
});
|
|
324
|
+
return target.provider.versionControl.createReviewComment({
|
|
325
|
+
...base,
|
|
326
|
+
commitId: input.commitId,
|
|
327
|
+
path: input.path,
|
|
328
|
+
line: input.line,
|
|
329
|
+
side: input.side,
|
|
330
|
+
...input.startLine !== void 0 && input.startSide !== void 0 ? {
|
|
331
|
+
startLine: input.startLine,
|
|
332
|
+
startSide: input.startSide
|
|
333
|
+
} : {}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}),
|
|
337
|
+
source_control_update_diff_comment: createTool({
|
|
338
|
+
id: "source_control_update_diff_comment",
|
|
339
|
+
description: "Edit a line-anchored review comment or discussion reply in the active repository.",
|
|
340
|
+
inputSchema: z.object({
|
|
341
|
+
commentId: z.string().trim().min(1),
|
|
342
|
+
body: z.string().trim().min(1)
|
|
343
|
+
}),
|
|
344
|
+
execute: async (input) => {
|
|
345
|
+
const target = await withTarget();
|
|
346
|
+
return target.provider.versionControl.updateReviewComment({
|
|
347
|
+
...await reference(target),
|
|
348
|
+
commentId: input.commentId,
|
|
349
|
+
body: input.body
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}),
|
|
353
|
+
source_control_delete_diff_comment: createTool({
|
|
354
|
+
id: "source_control_delete_diff_comment",
|
|
355
|
+
description: "Delete a line-anchored review comment or discussion reply in the active repository.",
|
|
356
|
+
inputSchema: z.object({ commentId: z.string().trim().min(1) }),
|
|
357
|
+
execute: async (input) => {
|
|
358
|
+
const target = await withTarget();
|
|
359
|
+
await target.provider.versionControl.deleteReviewComment({
|
|
360
|
+
...await reference(target),
|
|
361
|
+
commentId: input.commentId
|
|
362
|
+
});
|
|
363
|
+
return { deleted: true };
|
|
364
|
+
}
|
|
365
|
+
}),
|
|
366
|
+
source_control_resolve_diff_thread: createTool({
|
|
367
|
+
id: "source_control_resolve_diff_thread",
|
|
368
|
+
description: "Resolve or reopen the review thread containing a diff comment. Providers without resolvable threads return an explicit limitation.",
|
|
369
|
+
inputSchema: z.object({
|
|
370
|
+
commentId: z.string().trim().min(1),
|
|
371
|
+
resolved: z.boolean().default(true)
|
|
372
|
+
}),
|
|
373
|
+
execute: async (input) => {
|
|
374
|
+
const target = await withTarget();
|
|
375
|
+
const resolveReviewThread = target.provider.versionControl.resolveReviewThread;
|
|
376
|
+
if (!resolveReviewThread) throw new Error(`${target.provider.id} does not support resolving review threads.`);
|
|
377
|
+
await resolveReviewThread({
|
|
378
|
+
...await reference(target),
|
|
379
|
+
commentId: input.commentId,
|
|
380
|
+
resolved: input.resolved
|
|
381
|
+
});
|
|
382
|
+
return { resolved: input.resolved };
|
|
383
|
+
}
|
|
384
|
+
}),
|
|
385
|
+
source_control_review_change_request: createTool({
|
|
386
|
+
id: "source_control_review_change_request",
|
|
387
|
+
description: "Submit an approve, request-changes, or comment review to a change request. Provider limitations are returned explicitly.",
|
|
388
|
+
inputSchema: changeRequestSchema.extend({
|
|
389
|
+
event: z.enum([
|
|
390
|
+
"approve",
|
|
391
|
+
"request-changes",
|
|
392
|
+
"comment"
|
|
393
|
+
]),
|
|
394
|
+
body: z.string().optional(),
|
|
395
|
+
commitId: z.string().trim().min(1).optional()
|
|
396
|
+
}).refine((input) => input.event === "approve" || Boolean(input.body?.trim()), {
|
|
397
|
+
path: ["body"],
|
|
398
|
+
message: "request-changes and comment reviews require a body."
|
|
399
|
+
}),
|
|
400
|
+
execute: async (input) => {
|
|
401
|
+
const target = await withTarget();
|
|
402
|
+
const base = {
|
|
403
|
+
...await reference(target),
|
|
404
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
405
|
+
...input.commitId !== void 0 ? { commitId: input.commitId } : {}
|
|
406
|
+
};
|
|
407
|
+
if (input.event === "approve") return target.provider.versionControl.createReview({
|
|
408
|
+
...base,
|
|
409
|
+
event: "approve",
|
|
410
|
+
...input.body !== void 0 ? { body: input.body } : {}
|
|
411
|
+
});
|
|
412
|
+
return target.provider.versionControl.createReview({
|
|
413
|
+
...base,
|
|
414
|
+
event: input.event,
|
|
415
|
+
body: input.body
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}),
|
|
419
|
+
source_control_request_reviewers: createTool({
|
|
420
|
+
id: "source_control_request_reviewers",
|
|
421
|
+
description: "Request individual or team reviewers on a pull request or merge request. Provider limitations are returned explicitly.",
|
|
422
|
+
inputSchema: changeRequestSchema.extend({
|
|
423
|
+
users: z.array(z.string().trim().min(1)).default([]),
|
|
424
|
+
teams: z.array(z.string().trim().min(1)).default([])
|
|
425
|
+
}),
|
|
426
|
+
execute: async (input) => {
|
|
427
|
+
const target = await withTarget();
|
|
428
|
+
return target.provider.versionControl.requestReviewers({
|
|
429
|
+
...await reference(target),
|
|
430
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
431
|
+
users: input.users,
|
|
432
|
+
teams: input.teams
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}),
|
|
436
|
+
source_control_merge_change_request: createTool({
|
|
437
|
+
id: "source_control_merge_change_request",
|
|
438
|
+
description: "Merge a pull request or merge request using the requested provider-supported merge method.",
|
|
439
|
+
inputSchema: changeRequestSchema.extend({
|
|
440
|
+
method: z.enum([
|
|
441
|
+
"merge",
|
|
442
|
+
"squash",
|
|
443
|
+
"rebase"
|
|
444
|
+
]).optional(),
|
|
445
|
+
commitTitle: z.string().optional(),
|
|
446
|
+
commitMessage: z.string().optional()
|
|
447
|
+
}),
|
|
448
|
+
execute: async (input) => {
|
|
449
|
+
const target = await withTarget();
|
|
450
|
+
return target.provider.versionControl.mergePullRequest({
|
|
451
|
+
...await reference(target),
|
|
452
|
+
pullRequestId: changeRequestId(input.changeRequestId),
|
|
453
|
+
...input.method !== void 0 ? { method: input.method } : {},
|
|
454
|
+
...input.commitTitle !== void 0 ? { commitTitle: input.commitTitle } : {},
|
|
455
|
+
...input.commitMessage !== void 0 ? { commitMessage: input.commitMessage } : {}
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
})
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
//#endregion
|
|
462
|
+
export { createSourceControlTools };
|
|
463
|
+
|
|
464
|
+
//# sourceMappingURL=source-control-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-control-tools.js","names":[],"sources":["../../src/session/source-control-tools.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { createTool } from '@mastra/core/tools';\nimport type { WorkspaceSandbox } from '@mastra/core/workspace';\nimport { z } from 'zod';\n\nimport { getFactoryAuthOrgId, getFactoryAuthUserFromContext, getFactoryAuthUserId } from '../auth.js';\nimport type { VersionControl } from '../capabilities/version-control.js';\nimport type { IntegrationTools } from '../integrations/base.js';\nimport { pushRepositoryBranch, refreshMergeRequestCheckout } from '../integrations/github/sandbox.js';\nimport type { ExecutableSandbox } from '../sandbox/materialization.js';\nimport { resolveSessionWorkdir } from '../sandbox/session-sandbox.js';\nimport type { AuditAgentEmitter } from '../storage/domains/audit/domain.js';\nimport type {\n ProjectRepository,\n SourceControlRepository,\n SourceControlSession,\n SourceControlStorageHandle,\n} from '../storage/domains/source-control/base.js';\nimport { mergeRequestNumberFromBranch } from '../work-item-branch.js';\n\ntype RepositorySessionState = {\n factoryProjectId?: string;\n projectRepositoryId?: string;\n};\n\nexport interface SourceControlToolProvider {\n id: string;\n storage: SourceControlStorageHandle;\n versionControl: VersionControl;\n}\n\ninterface SessionTarget {\n context: AgentControllerRequestContext<RepositorySessionState>;\n provider: SourceControlToolProvider;\n session: SourceControlSession;\n projectRepository: ProjectRepository;\n repository: SourceControlRepository;\n orgId: string;\n userId: string;\n}\n\nfunction authIdentity(requestContext: RequestContext) {\n const user = getFactoryAuthUserFromContext(requestContext);\n return { orgId: getFactoryAuthOrgId(user), userId: getFactoryAuthUserId(user) };\n}\n\nasync function resolveSessionTarget(\n requestContext: RequestContext,\n providers: readonly SourceControlToolProvider[],\n): Promise<SessionTarget> {\n const context = requestContext.get('controller') as AgentControllerRequestContext<RepositorySessionState> | undefined;\n const { orgId, userId } = authIdentity(requestContext);\n if (!context?.resourceId || !orgId || !userId) {\n throw new Error('Source-control tools require an authenticated repository session.');\n }\n\n const matches = (\n await Promise.all(\n providers.map(async provider => ({\n provider,\n session: await provider.storage.sessions.getBySessionId(context.resourceId),\n })),\n )\n ).filter(\n (match): match is { provider: SourceControlToolProvider; session: SourceControlSession } => match.session !== null,\n );\n if (matches.length !== 1) {\n throw new Error(\n matches.length === 0\n ? 'The active session is not backed by a source-control repository.'\n : 'The active session is ambiguous across source-control providers.',\n );\n }\n\n const { provider, session } = matches[0]!;\n if (session.orgId !== orgId || (session.visibility === 'private' && session.userId !== userId)) {\n throw new Error('The active source-control session is not available to the authenticated user.');\n }\n const projectRepository = await provider.storage.projectRepositories.get({\n orgId,\n id: session.projectRepositoryId,\n });\n if (!projectRepository) throw new Error('The active project repository was not found.');\n const state = context.getState();\n if (state.projectRepositoryId && state.projectRepositoryId !== projectRepository.id) {\n throw new Error('The active source-control session does not match its controller repository.');\n }\n const connection = await provider.storage.connections.get({ orgId, id: projectRepository.connectionId });\n if (!connection) throw new Error('The active source-control connection was not found.');\n if (state.factoryProjectId && state.factoryProjectId !== connection.factoryProjectId) {\n throw new Error('The active source-control session does not match its Factory project.');\n }\n const repository = await provider.storage.repositories.get({ orgId, id: projectRepository.repositoryId });\n if (!repository) throw new Error('The active source-control repository was not found.');\n return { context, provider, session, projectRepository, repository, orgId, userId };\n}\n\nfunction changeRequestId(value: string | number): string {\n return String(value);\n}\n\nfunction executableSandbox(value: unknown): WorkspaceSandbox & ExecutableSandbox {\n const sandbox = value as Partial<ExecutableSandbox> | undefined;\n if (!sandbox?.executeCommand) throw new Error('The active Factory workspace has no executable sandbox.');\n return sandbox as WorkspaceSandbox & ExecutableSandbox;\n}\n\nasync function emitAgentAudit(\n audit: AuditAgentEmitter,\n requestContext: RequestContext,\n input: Parameters<AuditAgentEmitter['emitAgent']>[0]['input'],\n): Promise<void> {\n try {\n await audit.emitAgent({ requestContext, input });\n } catch (error) {\n console.warn('[Audit] Failed to record brokered source-control action', {\n action: input.action,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nconst changeRequestSchema = z.object({\n changeRequestId: z.union([z.string().trim().min(1), z.number().int().positive()]),\n});\n\nexport function createSourceControlTools({\n requestContext,\n providers,\n audit,\n}: {\n requestContext: RequestContext;\n providers: readonly SourceControlToolProvider[];\n audit: AuditAgentEmitter;\n}): IntegrationTools {\n if (!requestContext || typeof (requestContext as { get?: unknown }).get !== 'function') return {};\n const controller = requestContext.get('controller') as\n | AgentControllerRequestContext<RepositorySessionState>\n | undefined;\n const identity = authIdentity(requestContext);\n if (!controller?.resourceId || !identity.orgId || !identity.userId || providers.length === 0) return {};\n\n const withTarget = () => resolveSessionTarget(requestContext, providers);\n const reference = async (target: SessionTarget) => ({\n ...(await target.provider.versionControl.getRepositoryTarget({\n orgId: target.orgId,\n repositoryId: target.repository.id,\n })),\n actingUserId: target.userId,\n });\n\n return {\n source_control_refresh_change_request_checkout: createTool({\n id: 'source_control_refresh_change_request_checkout',\n description:\n 'Refresh the active GitLab review session checkout to its current MR head. The MR, repository, branch, and credential are resolved server-side; no provider credentials enter the agent workspace.',\n inputSchema: z.object({}),\n execute: async (_input, { workspace }) => {\n const target = await withTarget();\n const mergeRequestNumber = mergeRequestNumberFromBranch(target.session.branch);\n if (target.provider.id !== 'gitlab' || mergeRequestNumber === undefined) {\n throw new Error('Checkout refresh is only available in a bound GitLab merge-request review session.');\n }\n const ref = await reference(target);\n const mergeRequest = await target.provider.versionControl.getPullRequest({\n ...ref,\n pullRequestId: String(mergeRequestNumber),\n });\n if (!mergeRequest || mergeRequest.state !== 'open' || mergeRequest.merged) {\n throw new Error('The bound GitLab merge request is no longer open.');\n }\n const sandbox = executableSandbox(workspace?.sandbox);\n const workdir = await resolveSessionWorkdir(target.session.id, sandbox, target.repository.slug);\n const access = await target.provider.versionControl.getRepositoryAccess({\n orgId: target.orgId,\n repositoryId: target.repository.id,\n });\n const result = await refreshMergeRequestCheckout(sandbox, workdir, {\n branch: target.session.branch,\n mergeRequestNumber,\n expectedHeadSha: mergeRequest.headSha,\n access,\n });\n return result;\n },\n }),\n source_control_push_branch: createTool({\n id: 'source_control_push_branch',\n description:\n 'Push the active Factory session branch to its connected source-control provider. Credentials are resolved and scrubbed server-side; this tool takes no token, repository, remote, or branch arguments.',\n inputSchema: z.object({}),\n execute: async (_input, { workspace }) => {\n const target = await withTarget();\n const sandbox = executableSandbox(workspace?.sandbox);\n const workdir = await resolveSessionWorkdir(target.session.id, sandbox, target.repository.slug);\n const access = await target.provider.versionControl.getRepositoryAccess({\n orgId: target.orgId,\n repositoryId: target.repository.id,\n });\n await pushRepositoryBranch(sandbox, workdir, target.session.branch, access, target.repository.slug);\n await emitAgentAudit(audit, requestContext, {\n action: 'factory.agent.push',\n targets: [{ type: 'repository', id: target.repository.slug }],\n metadata: { branch: target.session.branch, provider: target.provider.id },\n });\n return { pushed: true, branch: target.session.branch, repository: target.repository.slug };\n },\n }),\n source_control_get_change_request: createTool({\n id: 'source_control_get_change_request',\n description:\n 'Read a pull request or merge request in the active Factory repository by its numeric repository-local ID.',\n inputSchema: changeRequestSchema,\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.getPullRequest({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n });\n },\n }),\n source_control_list_change_request_reviews: createTool({\n id: 'source_control_list_change_request_reviews',\n description: 'List submitted reviews and approvals on a pull request or merge request in the active repository.',\n inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.listReviews({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.cursor !== undefined ? { cursor: input.cursor } : {}),\n });\n },\n }),\n source_control_create_change_request: createTool({\n id: 'source_control_create_change_request',\n description:\n 'Open a pull request or merge request from the active Factory session branch into its persisted base branch. Push the branch with source_control_push_branch first.',\n inputSchema: z.object({\n title: z.string().trim().min(1),\n body: z.string().optional(),\n draft: z.boolean().optional(),\n }),\n execute: async input => {\n const target = await withTarget();\n const created = await target.provider.versionControl.createPullRequest({\n ...(await reference(target)),\n title: input.title,\n ...(input.body !== undefined ? { body: input.body } : {}),\n baseBranch: target.session.baseBranch,\n headBranch: target.session.branch,\n ...(input.draft !== undefined ? { draft: input.draft } : {}),\n });\n await emitAgentAudit(audit, requestContext, {\n action: 'factory.agent.pr_opened',\n targets: [\n { type: 'pull_request', id: created.url },\n { type: 'repository', id: target.repository.slug },\n ],\n metadata: { url: created.url, provider: target.provider.id },\n });\n return created;\n },\n }),\n source_control_update_change_request: createTool({\n id: 'source_control_update_change_request',\n description: 'Update the title, body, target branch, or open/closed state of a change request.',\n inputSchema: changeRequestSchema.extend({\n title: z.string().trim().min(1).optional(),\n body: z.string().nullable().optional(),\n baseBranch: z.string().trim().min(1).optional(),\n state: z.enum(['open', 'closed']).optional(),\n }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.updatePullRequest({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.body !== undefined ? { body: input.body } : {}),\n ...(input.baseBranch !== undefined ? { baseBranch: input.baseBranch } : {}),\n ...(input.state !== undefined ? { state: input.state } : {}),\n });\n },\n }),\n source_control_comment_change_request: createTool({\n id: 'source_control_comment_change_request',\n description: 'Add a top-level comment to a pull request or merge request in the active repository.',\n inputSchema: changeRequestSchema.extend({ body: z.string().trim().min(1) }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.createComment({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n body: input.body,\n });\n },\n }),\n source_control_list_change_request_comments: createTool({\n id: 'source_control_list_change_request_comments',\n description: 'List top-level comments on a pull request or merge request in the active repository.',\n inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.listComments({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.cursor !== undefined ? { cursor: input.cursor } : {}),\n });\n },\n }),\n source_control_update_change_request_comment: createTool({\n id: 'source_control_update_change_request_comment',\n description: 'Edit a top-level pull-request or merge-request comment in the active repository.',\n inputSchema: z.object({ commentId: z.string().trim().min(1), body: z.string().trim().min(1) }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.updateComment({\n ...(await reference(target)),\n commentId: input.commentId,\n body: input.body,\n });\n },\n }),\n source_control_delete_change_request_comment: createTool({\n id: 'source_control_delete_change_request_comment',\n description: 'Delete a top-level pull-request or merge-request comment in the active repository.',\n inputSchema: z.object({ commentId: z.string().trim().min(1) }),\n execute: async input => {\n const target = await withTarget();\n await target.provider.versionControl.deleteComment({\n ...(await reference(target)),\n commentId: input.commentId,\n });\n return { deleted: true };\n },\n }),\n source_control_list_diff_comments: createTool({\n id: 'source_control_list_diff_comments',\n description:\n 'List line-anchored review comments and discussion replies on a pull request or merge request in the active repository.',\n inputSchema: changeRequestSchema.extend({ cursor: z.string().trim().min(1).optional() }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.listReviewComments({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.cursor !== undefined ? { cursor: input.cursor } : {}),\n });\n },\n }),\n source_control_create_diff_comment: createTool({\n id: 'source_control_create_diff_comment',\n description:\n 'Create a line-anchored review comment or reply to an existing diff discussion. Use replyToId alone for a reply; otherwise provide commitId, path, line, and side.',\n inputSchema: z.union([\n changeRequestSchema.extend({\n body: z.string().trim().min(1),\n replyToId: z.string().trim().min(1),\n }),\n changeRequestSchema\n .extend({\n body: z.string().trim().min(1),\n commitId: z.string().trim().min(1),\n path: z.string().trim().min(1),\n line: z.number().int().positive(),\n side: z.enum(['left', 'right']),\n startLine: z.number().int().positive().optional(),\n startSide: z.enum(['left', 'right']).optional(),\n })\n .refine(input => (input.startLine === undefined) === (input.startSide === undefined), {\n message: 'startLine and startSide must be provided together.',\n }),\n ]),\n execute: async input => {\n const target = await withTarget();\n const base = {\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n body: input.body,\n };\n if ('replyToId' in input) {\n return target.provider.versionControl.createReviewComment({ ...base, replyToId: input.replyToId });\n }\n return target.provider.versionControl.createReviewComment({\n ...base,\n commitId: input.commitId,\n path: input.path,\n line: input.line,\n side: input.side,\n ...(input.startLine !== undefined && input.startSide !== undefined\n ? { startLine: input.startLine, startSide: input.startSide }\n : {}),\n });\n },\n }),\n source_control_update_diff_comment: createTool({\n id: 'source_control_update_diff_comment',\n description: 'Edit a line-anchored review comment or discussion reply in the active repository.',\n inputSchema: z.object({ commentId: z.string().trim().min(1), body: z.string().trim().min(1) }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.updateReviewComment({\n ...(await reference(target)),\n commentId: input.commentId,\n body: input.body,\n });\n },\n }),\n source_control_delete_diff_comment: createTool({\n id: 'source_control_delete_diff_comment',\n description: 'Delete a line-anchored review comment or discussion reply in the active repository.',\n inputSchema: z.object({ commentId: z.string().trim().min(1) }),\n execute: async input => {\n const target = await withTarget();\n await target.provider.versionControl.deleteReviewComment({\n ...(await reference(target)),\n commentId: input.commentId,\n });\n return { deleted: true };\n },\n }),\n source_control_resolve_diff_thread: createTool({\n id: 'source_control_resolve_diff_thread',\n description:\n 'Resolve or reopen the review thread containing a diff comment. Providers without resolvable threads return an explicit limitation.',\n inputSchema: z.object({\n commentId: z.string().trim().min(1),\n resolved: z.boolean().default(true),\n }),\n execute: async input => {\n const target = await withTarget();\n const resolveReviewThread = target.provider.versionControl.resolveReviewThread;\n if (!resolveReviewThread) {\n throw new Error(`${target.provider.id} does not support resolving review threads.`);\n }\n await resolveReviewThread({\n ...(await reference(target)),\n commentId: input.commentId,\n resolved: input.resolved,\n });\n return { resolved: input.resolved };\n },\n }),\n source_control_review_change_request: createTool({\n id: 'source_control_review_change_request',\n description:\n 'Submit an approve, request-changes, or comment review to a change request. Provider limitations are returned explicitly.',\n inputSchema: changeRequestSchema\n .extend({\n event: z.enum(['approve', 'request-changes', 'comment']),\n body: z.string().optional(),\n commitId: z.string().trim().min(1).optional(),\n })\n .refine(input => input.event === 'approve' || Boolean(input.body?.trim()), {\n path: ['body'],\n message: 'request-changes and comment reviews require a body.',\n }),\n execute: async input => {\n const target = await withTarget();\n const base = {\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.commitId !== undefined ? { commitId: input.commitId } : {}),\n };\n if (input.event === 'approve') {\n return target.provider.versionControl.createReview({\n ...base,\n event: 'approve',\n ...(input.body !== undefined ? { body: input.body } : {}),\n });\n }\n return target.provider.versionControl.createReview({ ...base, event: input.event, body: input.body! });\n },\n }),\n source_control_request_reviewers: createTool({\n id: 'source_control_request_reviewers',\n description:\n 'Request individual or team reviewers on a pull request or merge request. Provider limitations are returned explicitly.',\n inputSchema: changeRequestSchema.extend({\n users: z.array(z.string().trim().min(1)).default([]),\n teams: z.array(z.string().trim().min(1)).default([]),\n }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.requestReviewers({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n users: input.users,\n teams: input.teams,\n });\n },\n }),\n source_control_merge_change_request: createTool({\n id: 'source_control_merge_change_request',\n description: 'Merge a pull request or merge request using the requested provider-supported merge method.',\n inputSchema: changeRequestSchema.extend({\n method: z.enum(['merge', 'squash', 'rebase']).optional(),\n commitTitle: z.string().optional(),\n commitMessage: z.string().optional(),\n }),\n execute: async input => {\n const target = await withTarget();\n return target.provider.versionControl.mergePullRequest({\n ...(await reference(target)),\n pullRequestId: changeRequestId(input.changeRequestId),\n ...(input.method !== undefined ? { method: input.method } : {}),\n ...(input.commitTitle !== undefined ? { commitTitle: input.commitTitle } : {}),\n ...(input.commitMessage !== undefined ? { commitMessage: input.commitMessage } : {}),\n });\n },\n }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -106,6 +106,24 @@ export declare class IntakeStorage extends FactoryStorageDomain {
|
|
|
106
106
|
board?: string | null;
|
|
107
107
|
userId?: string;
|
|
108
108
|
}): Promise<void>;
|
|
109
|
+
/** Atomically replace legacy provider source ids in both selection and routing state. */
|
|
110
|
+
migrateSourceIds({ orgId, integrationId, migrations, }: {
|
|
111
|
+
orgId: string;
|
|
112
|
+
integrationId: string;
|
|
113
|
+
migrations: Array<{
|
|
114
|
+
from: string;
|
|
115
|
+
to: string;
|
|
116
|
+
}>;
|
|
117
|
+
}): Promise<{
|
|
118
|
+
migrations: Array<{
|
|
119
|
+
from: string;
|
|
120
|
+
to: string;
|
|
121
|
+
}>;
|
|
122
|
+
conflicts: Array<{
|
|
123
|
+
from: string;
|
|
124
|
+
to: string;
|
|
125
|
+
}>;
|
|
126
|
+
}>;
|
|
109
127
|
/** Label routes in the org, optionally narrowed to one project and/or integration. Sorted by label. */
|
|
110
128
|
listLabelRoutes({ orgId, factoryProjectId, integrationId, }: {
|
|
111
129
|
orgId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/intake/base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAwB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE3D,eAAO,MAAM,qBAAqB,EAAE,YAAiB,CAAC;AAEtD,eAAO,MAAM,0BAA0B,EAAE,gBAUxC,CAAC;AAEF,6HAA6H;AAC7H,eAAO,MAAM,kCAAkC,EAAE,gBAWhD,CAAC;AAEF,2IAA2I;AAC3I,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAcpF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,gBAqB3C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,EAAE,gBAqBxC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAiBD,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,gBAAgB,EAAE,EACnC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACpC,gBAAgB,GAAG,SAAS,CAI9B;AAiBD,qBAAa,aAAc,SAAQ,oBAAoB;;;IAK/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,SAAS,CAAC,EACd,KAAK,EACL,cAAc,GACf,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GAAG,OAAO,CAAC,YAAY,CAAC;IASnB,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3F,+EAA+E;IACzE,YAAY,CAAC,EACjB,KAAK,EACL,aAAa,GACd,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAQlC,4EAA4E;IACtE,kBAAkB,CAAC,EACvB,KAAK,EACL,aAAa,EACb,gBAAgB,GACjB,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASrB,gEAAgE;IAC1D,UAAU,CAAC,EACf,KAAK,EACL,aAAa,EACb,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IASjC,YAAY,CAAC,EACjB,KAAK,EACL,aAAa,EACb,QAAQ,GACT,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAajC,UAAU,CAAC,EACf,KAAK,EACL,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,KAAY,EACZ,MAAM,GACP,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/intake/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -298,6 +298,83 @@ var IntakeStorage = class extends FactoryStorageDomain {
|
|
|
298
298
|
await this.#db.updateMany("intake_source_bindings", where, patch);
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
|
+
/** Atomically replace legacy provider source ids in both selection and routing state. */
|
|
302
|
+
async migrateSourceIds({ orgId, integrationId, migrations }) {
|
|
303
|
+
if (migrations.length === 0) return {
|
|
304
|
+
migrations: [],
|
|
305
|
+
conflicts: []
|
|
306
|
+
};
|
|
307
|
+
return this.storage.withTransaction(async (ops) => {
|
|
308
|
+
const bindings = await ops.findMany("intake_source_bindings", {
|
|
309
|
+
org_id: orgId,
|
|
310
|
+
integration_id: integrationId
|
|
311
|
+
});
|
|
312
|
+
const bindingBySource = new Map(bindings.map((binding) => [binding.source_id, binding]));
|
|
313
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
314
|
+
for (const migration of migrations) grouped.set(migration.to, [...grouped.get(migration.to) ?? [], migration]);
|
|
315
|
+
const conflicts = [];
|
|
316
|
+
for (const [to, group] of grouped) {
|
|
317
|
+
const candidates = [bindingBySource.get(to), ...group.map(({ from }) => bindingBySource.get(from))].filter((binding) => binding !== void 0);
|
|
318
|
+
if (new Set(candidates.map((binding) => `${binding.factory_project_id}\0${binding.board ?? ""}`)).size > 1) conflicts.push(...group);
|
|
319
|
+
}
|
|
320
|
+
if (conflicts.length > 0) return {
|
|
321
|
+
migrations: [],
|
|
322
|
+
conflicts
|
|
323
|
+
};
|
|
324
|
+
const now = /* @__PURE__ */ new Date();
|
|
325
|
+
for (const [to, group] of grouped) {
|
|
326
|
+
const canonical = bindingBySource.get(to);
|
|
327
|
+
const legacy = group.flatMap(({ from }) => {
|
|
328
|
+
const binding = bindingBySource.get(from);
|
|
329
|
+
return binding ? [{
|
|
330
|
+
from,
|
|
331
|
+
binding
|
|
332
|
+
}] : [];
|
|
333
|
+
});
|
|
334
|
+
if (!canonical && legacy.length > 0) {
|
|
335
|
+
const [first, ...duplicates] = legacy;
|
|
336
|
+
await ops.updateMany("intake_source_bindings", {
|
|
337
|
+
org_id: orgId,
|
|
338
|
+
integration_id: integrationId,
|
|
339
|
+
source_id: first.from
|
|
340
|
+
}, {
|
|
341
|
+
source_id: to,
|
|
342
|
+
updated_at: now
|
|
343
|
+
});
|
|
344
|
+
for (const duplicate of duplicates) await ops.deleteMany("intake_source_bindings", {
|
|
345
|
+
org_id: orgId,
|
|
346
|
+
integration_id: integrationId,
|
|
347
|
+
source_id: duplicate.from
|
|
348
|
+
});
|
|
349
|
+
} else if (canonical) for (const entry of legacy) await ops.deleteMany("intake_source_bindings", {
|
|
350
|
+
org_id: orgId,
|
|
351
|
+
integration_id: integrationId,
|
|
352
|
+
source_id: entry.from
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
const configRow = await ops.findOne("intake_org_settings", { org_id: orgId });
|
|
356
|
+
if (configRow) {
|
|
357
|
+
const replacements = new Map(migrations.map(({ from, to }) => [from, to]));
|
|
358
|
+
const selected = configRow.config[integrationId]?.sourceIds ?? [];
|
|
359
|
+
const nextSelected = [...new Set(selected.map((sourceId) => replacements.get(sourceId) ?? sourceId))];
|
|
360
|
+
if (nextSelected.length !== selected.length || nextSelected.some((sourceId, index) => sourceId !== selected[index])) {
|
|
361
|
+
const config = structuredClone(configRow.config);
|
|
362
|
+
config[integrationId] = {
|
|
363
|
+
...config[integrationId] ?? { enabled: true },
|
|
364
|
+
sourceIds: nextSelected.length > 0 ? nextSelected : null
|
|
365
|
+
};
|
|
366
|
+
await ops.updateMany("intake_org_settings", { org_id: orgId }, {
|
|
367
|
+
config,
|
|
368
|
+
updated_at: now
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
migrations,
|
|
374
|
+
conflicts: []
|
|
375
|
+
};
|
|
376
|
+
}, { isolationLevel: "serializable" });
|
|
377
|
+
}
|
|
301
378
|
/** Label routes in the org, optionally narrowed to one project and/or integration. Sorted by label. */
|
|
302
379
|
async listLabelRoutes({ orgId, factoryProjectId, integrationId }) {
|
|
303
380
|
return (await this.#db.findMany("intake_label_routes", {
|