@mastra/factory 0.21.1-alpha.2 → 0.22.0-alpha.4
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/dist/capabilities/version-control.d.ts +13 -8
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/environment/build-runner.d.ts +72 -0
- package/dist/environment/build-runner.d.ts.map +1 -0
- package/dist/environment/build-runner.js +131 -0
- package/dist/environment/build-runner.js.map +1 -0
- package/dist/environment/build-schedule.d.ts +40 -0
- package/dist/environment/build-schedule.d.ts.map +1 -0
- package/dist/environment/build-schedule.js +94 -0
- package/dist/environment/build-schedule.js.map +1 -0
- package/dist/environment/build-workflow.d.ts +62 -0
- package/dist/environment/build-workflow.d.ts.map +1 -0
- package/dist/environment/build-workflow.js +149 -0
- package/dist/environment/build-workflow.js.map +1 -0
- package/dist/environment/build.d.ts +111 -0
- package/dist/environment/build.d.ts.map +1 -0
- package/dist/environment/build.js +344 -0
- package/dist/environment/build.js.map +1 -0
- package/dist/environment/heads.d.ts +36 -0
- package/dist/environment/heads.d.ts.map +1 -0
- package/dist/environment/heads.js +60 -0
- package/dist/environment/heads.js.map +1 -0
- package/dist/factory.d.ts +18 -4
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +89 -15
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/integrations/base.d.ts +17 -2
- package/dist/integrations/base.d.ts.map +1 -1
- package/dist/integrations/github/commits.d.ts +11 -0
- package/dist/integrations/github/commits.d.ts.map +1 -1
- package/dist/integrations/github/commits.js +20 -1
- package/dist/integrations/github/commits.js.map +1 -1
- package/dist/integrations/github/config.d.ts +3 -3
- package/dist/integrations/github/config.d.ts.map +1 -1
- package/dist/integrations/github/config.js +1 -1
- package/dist/integrations/github/config.js.map +1 -1
- package/dist/integrations/github/routes.d.ts +2 -2
- package/dist/integrations/github/routes.d.ts.map +1 -1
- package/dist/integrations/github/routes.js +6 -5
- package/dist/integrations/github/routes.js.map +1 -1
- package/dist/integrations/github/rules.d.ts +3 -1
- package/dist/integrations/github/rules.d.ts.map +1 -1
- package/dist/integrations/github/rules.js +31 -1
- package/dist/integrations/github/rules.js.map +1 -1
- package/dist/integrations/github/sandbox.d.ts +35 -0
- package/dist/integrations/github/sandbox.d.ts.map +1 -1
- package/dist/integrations/github/sandbox.js +203 -2
- package/dist/integrations/github/sandbox.js.map +1 -1
- package/dist/integrations/github/session-subscriptions.d.ts.map +1 -1
- package/dist/integrations/github/session-subscriptions.js +117 -62
- package/dist/integrations/github/session-subscriptions.js.map +1 -1
- package/dist/integrations/github/token-refresh.d.ts +7 -0
- package/dist/integrations/github/token-refresh.d.ts.map +1 -1
- package/dist/integrations/github/token-refresh.js.map +1 -1
- package/dist/integrations/github/webhook.js.map +1 -1
- package/dist/integrations/gitlab/agent-tools.js +1 -1
- package/dist/integrations/gitlab/routes.d.ts +2 -2
- package/dist/integrations/gitlab/routes.d.ts.map +1 -1
- package/dist/integrations/gitlab/routes.js.map +1 -1
- package/dist/integrations/gitlab/session-subscriptions.d.ts.map +1 -1
- package/dist/integrations/gitlab/session-subscriptions.js +8 -7
- package/dist/integrations/gitlab/session-subscriptions.js.map +1 -1
- package/dist/integrations/incidentio/agent-tools.js +1 -1
- package/dist/integrations/jira/agent-tools.js +1 -1
- package/dist/integrations/linear/agent-tools.js +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +46 -2
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/platform/jira/agent-tools.js +1 -1
- package/dist/integrations/slack/slack.d.ts.map +1 -1
- package/dist/integrations/slack/slack.js +15 -16
- package/dist/integrations/slack/slack.js.map +1 -1
- package/dist/integrations/subscription-session.js +1 -1
- package/dist/packages/_internals/workspace/dist/index.js +21 -1
- package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
- package/dist/routes/contracts.d.ts +386 -2
- package/dist/routes/contracts.d.ts.map +1 -1
- package/dist/routes/contracts.js +166 -1
- package/dist/routes/contracts.js.map +1 -1
- package/dist/routes/fs.d.ts +25 -0
- package/dist/routes/fs.d.ts.map +1 -1
- package/dist/routes/fs.js +142 -46
- package/dist/routes/fs.js.map +1 -1
- package/dist/routes/projects.d.ts +6 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +344 -1
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +2 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -1
- package/dist/routes/source-control-sessions.js +36 -1
- package/dist/routes/source-control-sessions.js.map +1 -1
- package/dist/routes/supervisor.js +1 -1
- package/dist/routes/surface.d.ts +6 -3
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +21 -34
- package/dist/routes/surface.js.map +1 -1
- package/dist/rules/binding-context.d.ts +1 -1
- package/dist/rules/binding-context.d.ts.map +1 -1
- package/dist/rules/binding-context.js +1 -1
- package/dist/rules/binding-context.js.map +1 -1
- package/dist/rules/review-source-tool.js +1 -1
- package/dist/rules/start-coordinator.d.ts.map +1 -1
- package/dist/rules/start-coordinator.js +7 -2
- package/dist/rules/start-coordinator.js.map +1 -1
- package/dist/rules/tools.js +1 -1
- package/dist/sandbox/callback-factory-sandbox.d.ts +15 -0
- package/dist/sandbox/callback-factory-sandbox.d.ts.map +1 -0
- package/dist/sandbox/callback-factory-sandbox.js +22 -0
- package/dist/sandbox/callback-factory-sandbox.js.map +1 -0
- package/dist/sandbox/local-factory-sandbox.d.ts +20 -0
- package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -0
- package/dist/sandbox/local-factory-sandbox.js +27 -0
- package/dist/sandbox/local-factory-sandbox.js.map +1 -0
- package/dist/sandbox/session-retirement.d.ts.map +1 -1
- package/dist/sandbox/session-retirement.js +23 -3
- package/dist/sandbox/session-retirement.js.map +1 -1
- package/dist/sandbox/session-sandbox.d.ts +82 -40
- package/dist/sandbox/session-sandbox.d.ts.map +1 -1
- package/dist/sandbox/session-sandbox.js +130 -13
- package/dist/sandbox/session-sandbox.js.map +1 -1
- package/dist/sandbox/workdir.d.ts +10 -0
- package/dist/sandbox/workdir.d.ts.map +1 -1
- package/dist/sandbox/workdir.js +10 -1
- package/dist/sandbox/workdir.js.map +1 -1
- package/dist/secret-encryption.d.ts.map +1 -1
- package/dist/secret-encryption.js +12 -1
- package/dist/secret-encryption.js.map +1 -1
- package/dist/session/environment-repositories.d.ts +31 -0
- package/dist/session/environment-repositories.d.ts.map +1 -0
- package/dist/session/environment-repositories.js +89 -0
- package/dist/session/environment-repositories.js.map +1 -0
- package/dist/session/environment-state-processor.d.ts +59 -0
- package/dist/session/environment-state-processor.d.ts.map +1 -0
- package/dist/session/environment-state-processor.js +105 -0
- package/dist/session/environment-state-processor.js.map +1 -0
- package/dist/session/factory-session.d.ts +26 -35
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +34 -71
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/filesystem-capture.d.ts +13 -0
- package/dist/session/filesystem-capture.d.ts.map +1 -1
- package/dist/session/filesystem-capture.js +73 -14
- package/dist/session/filesystem-capture.js.map +1 -1
- package/dist/session/source-control-tools.d.ts +1 -1
- package/dist/session/source-control-tools.d.ts.map +1 -1
- package/dist/session/source-control-tools.js +144 -71
- package/dist/session/source-control-tools.js.map +1 -1
- package/dist/spa-static.js +2 -2
- package/dist/storage/domains/audit/agent-audit.d.ts +6 -1
- package/dist/storage/domains/audit/agent-audit.d.ts.map +1 -1
- package/dist/storage/domains/audit/agent-audit.js +31 -13
- package/dist/storage/domains/audit/agent-audit.js.map +1 -1
- package/dist/storage/domains/custom-providers/base.d.ts.map +1 -1
- package/dist/storage/domains/custom-providers/base.js +13 -2
- package/dist/storage/domains/custom-providers/base.js.map +1 -1
- package/dist/storage/domains/projects/base.d.ts +115 -2
- package/dist/storage/domains/projects/base.d.ts.map +1 -1
- package/dist/storage/domains/projects/base.js +219 -12
- package/dist/storage/domains/projects/base.js.map +1 -1
- package/dist/storage/domains/source-control/base.d.ts +123 -7
- package/dist/storage/domains/source-control/base.d.ts.map +1 -1
- package/dist/storage/domains/source-control/base.js +406 -33
- package/dist/storage/domains/source-control/base.js.map +1 -1
- package/dist/storage/domains/source-control/inmemory.d.ts +19 -6
- package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/source-control/inmemory.js +90 -2
- package/dist/storage/domains/source-control/inmemory.js.map +1 -1
- package/dist/storage/domains/work-items/base.d.ts.map +1 -1
- package/dist/storage/domains/work-items/base.js +12 -5
- package/dist/storage/domains/work-items/base.js.map +1 -1
- package/dist/supervisor/read-tools.js +1 -1
- package/dist/supervisor/write-tools.js +1 -1
- package/dist/workspace.d.ts +50 -7
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +344 -24
- package/dist/workspace.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { FactoryRepositoryAccess } from '@mastra/core/workspace';
|
|
1
2
|
import type { SourceControlInstallation, SourceControlRepository, SourceControlStorageHandle } from '../storage/domains/source-control/base.js';
|
|
2
3
|
import type { IntegrationConnection } from './connection.js';
|
|
3
4
|
export interface InstallationInput {
|
|
@@ -12,14 +13,7 @@ export interface RepositoryInput {
|
|
|
12
13
|
defaultBranch: string;
|
|
13
14
|
metadata?: Record<string, unknown>;
|
|
14
15
|
}
|
|
15
|
-
export
|
|
16
|
-
cloneUrl: string;
|
|
17
|
-
authorization?: {
|
|
18
|
-
scheme: 'bearer';
|
|
19
|
-
token: string;
|
|
20
|
-
username?: string;
|
|
21
|
-
};
|
|
22
|
-
}
|
|
16
|
+
export type RepositoryAccess = FactoryRepositoryAccess;
|
|
23
17
|
export interface RepositoryTarget {
|
|
24
18
|
connection: IntegrationConnection;
|
|
25
19
|
sourceId: string;
|
|
@@ -232,6 +226,17 @@ export interface VersionControl {
|
|
|
232
226
|
orgId: string;
|
|
233
227
|
repositoryId: string;
|
|
234
228
|
}): Promise<RepositoryAccess>;
|
|
229
|
+
/**
|
|
230
|
+
* One credential that reaches every listed repository, for providers whose
|
|
231
|
+
* per-repository tokens would otherwise leave `gh` blind to the rest of an
|
|
232
|
+
* environment. Resolves `undefined` when the provider cannot cover the set
|
|
233
|
+
* (several installations, more repositories than one token allows); the
|
|
234
|
+
* caller then falls back to `getRepositoryAccess` for the primary.
|
|
235
|
+
*/
|
|
236
|
+
getRepositoriesAccess?(input: {
|
|
237
|
+
orgId: string;
|
|
238
|
+
repositoryIds: string[];
|
|
239
|
+
}): Promise<RepositoryAccess | undefined>;
|
|
235
240
|
listPullRequests(input: ListPullRequestsInput): Promise<PullRequestPage>;
|
|
236
241
|
getPullRequest(input: PullRequestRef): Promise<PullRequest | null>;
|
|
237
242
|
createPullRequest(input: CreatePullRequestInput): Promise<PullRequest>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-control.d.ts","sourceRoot":"","sources":["../../src/capabilities/version-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"version-control.d.ts","sourceRoot":"","sources":["../../src/capabilities/version-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starts `factory-environment-build` runs on the booted `Mastra`. Every
|
|
3
|
+
* trigger goes through a workflow run so the start decision and the poll are
|
|
4
|
+
* recorded the same way whether a route, the scheduler or a webhook asked.
|
|
5
|
+
*/
|
|
6
|
+
import type { Mastra } from '@mastra/core/mastra';
|
|
7
|
+
import type { FactorySandboxContext } from '@mastra/core/workspace';
|
|
8
|
+
import type { RepositoryPushEvent } from '../integrations/base.js';
|
|
9
|
+
import type { ScheduleService } from './build-schedule.js';
|
|
10
|
+
import type { EnvironmentBuildWorkflowOptions } from './build-workflow.js';
|
|
11
|
+
import type { EnvironmentBuildDeps, EnvironmentBuildOutcome, EnvironmentBuildTrigger } from './build.js';
|
|
12
|
+
export type StartEnvironmentBuild = (projectId: string, trigger: EnvironmentBuildTrigger) => Promise<EnvironmentBuildOutcome>;
|
|
13
|
+
export interface EnvironmentBuildRunnerOptions extends Omit<EnvironmentBuildWorkflowOptions, 'onStart'> {
|
|
14
|
+
/** The booted instance; `undefined` until the host finished `finalize()`. */
|
|
15
|
+
getMastra: () => Mastra | undefined;
|
|
16
|
+
logger?: {
|
|
17
|
+
info: (msg: string, meta?: Record<string, unknown>) => void;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** What a read of a build's status or history hands the provider. */
|
|
21
|
+
export interface EnvironmentBuildReadContext {
|
|
22
|
+
ctx: FactorySandboxContext;
|
|
23
|
+
settings: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export declare class EnvironmentBuildRunner {
|
|
26
|
+
#private;
|
|
27
|
+
readonly workflow: import("@mastra/core/workflows").Workflow<import("@mastra/core/workflows").DefaultEngineType, import("@mastra/core/workflows").Step<string, unknown, unknown, unknown, unknown, unknown, any, unknown>[], "factory-environment-build", unknown, {
|
|
28
|
+
projectId: string;
|
|
29
|
+
trigger: "manual" | "push" | "schedule";
|
|
30
|
+
}, {
|
|
31
|
+
outcome: "started" | "failed" | "skipped" | "unavailable";
|
|
32
|
+
buildId?: string | undefined;
|
|
33
|
+
templateId?: string | undefined;
|
|
34
|
+
reason?: string | undefined;
|
|
35
|
+
status?: "unknown" | "failed" | "ready" | undefined;
|
|
36
|
+
}, {
|
|
37
|
+
outcome: "started" | "failed" | "skipped" | "unavailable";
|
|
38
|
+
buildId?: string | undefined;
|
|
39
|
+
templateId?: string | undefined;
|
|
40
|
+
reason?: string | undefined;
|
|
41
|
+
status?: "unknown" | "failed" | "ready" | undefined;
|
|
42
|
+
}, unknown>;
|
|
43
|
+
constructor(deps: EnvironmentBuildDeps, options: EnvironmentBuildRunnerOptions);
|
|
44
|
+
/** The schedule service of the booted host, `undefined` before boot. */
|
|
45
|
+
schedules(): ScheduleService | undefined;
|
|
46
|
+
/** Whether the host's storage implements schedules; false until `probeSchedules()` ran. */
|
|
47
|
+
get scheduleAvailable(): boolean;
|
|
48
|
+
/** Probe once after the host booted; a storage without the domain disables the cron trigger. */
|
|
49
|
+
probeSchedules(): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* The context a status or history read hands the provider. Heads come from
|
|
52
|
+
* the stored last attempt (the build being read was pinned to them), else
|
|
53
|
+
* the active template, so a read never calls GitHub; before the first build
|
|
54
|
+
* they are resolved live once.
|
|
55
|
+
*/
|
|
56
|
+
readContext(projectId: string): Promise<EnvironmentBuildReadContext | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* A push to an environment repository's default branch starts a `push` run
|
|
59
|
+
* when the project opted in; the run's debounce claim decides whether it
|
|
60
|
+
* builds. Fire and forget: the webhook never waits on it.
|
|
61
|
+
*/
|
|
62
|
+
readonly onRepositoryPush: (event: RepositoryPushEvent) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Start a run and resolve with the first step's answer; the poll step keeps
|
|
65
|
+
* running in the background. Resolves `unavailable` before the host booted
|
|
66
|
+
* or when the host never registered the workflow, and `failed` when the run
|
|
67
|
+
* could not be created; a caller that already saved its own change must not
|
|
68
|
+
* fail on the build it merely requested.
|
|
69
|
+
*/
|
|
70
|
+
readonly start: StartEnvironmentBuild;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=build-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-runner.d.ts","sourceRoot":"","sources":["../../src/environment/build-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAGzG,MAAM,MAAM,qBAAqB,GAAG,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAEtC,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAC;IACrG,6EAA6E;IAC7E,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,CAAC;CAC1E;AAED,qEAAqE;AACrE,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,qBAAqB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,qBAAa,sBAAsB;;IACjC,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;gBAAC;gBAON,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,6BAA6B;IAc9E,wEAAwE;IACxE,SAAS,IAAI,eAAe,GAAG,SAAS;IAIxC,2FAA2F;IAC3F,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,gGAAgG;IAC1F,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAMxC;;;;;OAKG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAgBtF;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,GAAI,OAAO,mBAAmB,KAAG,IAAI,CAa5D;IAEF;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAqCnC;CACH"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { environmentBuildContext, errorReason, resolveEnvironmentHeads } from "./build.js";
|
|
2
|
+
import { resolveProjectEnvironment } from "../workspace.js";
|
|
3
|
+
import { ENVIRONMENT_BUILD_WORKFLOW_ID, createEnvironmentBuildWorkflow } from "./build-workflow.js";
|
|
4
|
+
import { probeSchedulesAvailable } from "./build-schedule.js";
|
|
5
|
+
//#region src/environment/build-runner.ts
|
|
6
|
+
var EnvironmentBuildRunner = class {
|
|
7
|
+
workflow;
|
|
8
|
+
#deps;
|
|
9
|
+
#getMastra;
|
|
10
|
+
#logger;
|
|
11
|
+
#pending = /* @__PURE__ */ new Map();
|
|
12
|
+
#scheduleAvailable = false;
|
|
13
|
+
constructor(deps, options) {
|
|
14
|
+
const { getMastra, logger, ...workflowOptions } = options;
|
|
15
|
+
this.#deps = deps;
|
|
16
|
+
this.#getMastra = getMastra;
|
|
17
|
+
this.#logger = logger;
|
|
18
|
+
this.workflow = createEnvironmentBuildWorkflow(deps, {
|
|
19
|
+
...workflowOptions,
|
|
20
|
+
onStart: (runId, outcome) => {
|
|
21
|
+
this.#pending.get(runId)?.(outcome);
|
|
22
|
+
this.#pending.delete(runId);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** The schedule service of the booted host, `undefined` before boot. */
|
|
27
|
+
schedules() {
|
|
28
|
+
return this.#getMastra()?.schedules;
|
|
29
|
+
}
|
|
30
|
+
/** Whether the host's storage implements schedules; false until `probeSchedules()` ran. */
|
|
31
|
+
get scheduleAvailable() {
|
|
32
|
+
return this.#scheduleAvailable;
|
|
33
|
+
}
|
|
34
|
+
/** Probe once after the host booted; a storage without the domain disables the cron trigger. */
|
|
35
|
+
async probeSchedules() {
|
|
36
|
+
const schedules = this.schedules();
|
|
37
|
+
this.#scheduleAvailable = schedules ? await probeSchedulesAvailable(schedules) : false;
|
|
38
|
+
return this.#scheduleAvailable;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The context a status or history read hands the provider. Heads come from
|
|
42
|
+
* the stored last attempt (the build being read was pinned to them), else
|
|
43
|
+
* the active template, so a read never calls GitHub; before the first build
|
|
44
|
+
* they are resolved live once.
|
|
45
|
+
*/
|
|
46
|
+
async readContext(projectId) {
|
|
47
|
+
const sourceControl = this.#deps.sourceControl;
|
|
48
|
+
if (!sourceControl) return void 0;
|
|
49
|
+
const project = await this.#deps.projects.getById({ id: projectId });
|
|
50
|
+
if (!project) return void 0;
|
|
51
|
+
const environment = await resolveProjectEnvironment(sourceControl.storage, project);
|
|
52
|
+
return {
|
|
53
|
+
ctx: environmentBuildContext(project, environment, project.lastBuildHeads ?? project.activeTemplateHeads ?? await resolveEnvironmentHeads(sourceControl, project, environment), sourceControl.versionControl),
|
|
54
|
+
settings: environment.settings
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A push to an environment repository's default branch starts a `push` run
|
|
59
|
+
* when the project opted in; the run's debounce claim decides whether it
|
|
60
|
+
* builds. Fire and forget: the webhook never waits on it.
|
|
61
|
+
*/
|
|
62
|
+
onRepositoryPush = (event) => {
|
|
63
|
+
if (!event.projectRepository.inEnvironment) return;
|
|
64
|
+
const branch = event.defaultBranch;
|
|
65
|
+
if (event.ref !== `refs/heads/${branch}`) return;
|
|
66
|
+
this.#deps.projects.getById({ id: event.factoryProjectId }).then((project) => project?.buildOnPushEnabled ? this.start(project.id, "push") : void 0).catch((error) => {
|
|
67
|
+
this.#logger?.info("environment build push hand-off failed", {
|
|
68
|
+
factoryProjectId: event.factoryProjectId,
|
|
69
|
+
reason: errorReason(error)
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Start a run and resolve with the first step's answer; the poll step keeps
|
|
75
|
+
* running in the background. Resolves `unavailable` before the host booted
|
|
76
|
+
* or when the host never registered the workflow, and `failed` when the run
|
|
77
|
+
* could not be created; a caller that already saved its own change must not
|
|
78
|
+
* fail on the build it merely requested.
|
|
79
|
+
*/
|
|
80
|
+
start = async (projectId, trigger) => {
|
|
81
|
+
const mastra = this.#getMastra();
|
|
82
|
+
if (!mastra) return {
|
|
83
|
+
outcome: "unavailable",
|
|
84
|
+
reason: "not_ready"
|
|
85
|
+
};
|
|
86
|
+
let run;
|
|
87
|
+
try {
|
|
88
|
+
run = await mastra.getWorkflow(ENVIRONMENT_BUILD_WORKFLOW_ID).createRun();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
const reason = errorReason(error);
|
|
91
|
+
this.#logger?.info("environment build run could not be created", {
|
|
92
|
+
factoryProjectId: projectId,
|
|
93
|
+
reason
|
|
94
|
+
});
|
|
95
|
+
return mastra.listWorkflows()["factory-environment-build"] ? {
|
|
96
|
+
outcome: "failed",
|
|
97
|
+
reason
|
|
98
|
+
} : {
|
|
99
|
+
outcome: "unavailable",
|
|
100
|
+
reason: "no_workflow"
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const outcome = new Promise((resolve) => this.#pending.set(run.runId, resolve));
|
|
104
|
+
run.start({ inputData: {
|
|
105
|
+
projectId,
|
|
106
|
+
trigger
|
|
107
|
+
} }).then((result) => {
|
|
108
|
+
if (result.status !== "success") this.#logger?.info("environment build run did not succeed", {
|
|
109
|
+
factoryProjectId: projectId,
|
|
110
|
+
runId: run.runId
|
|
111
|
+
});
|
|
112
|
+
}).catch((error) => {
|
|
113
|
+
this.#logger?.info("environment build run threw", {
|
|
114
|
+
factoryProjectId: projectId,
|
|
115
|
+
runId: run.runId,
|
|
116
|
+
reason: errorReason(error)
|
|
117
|
+
});
|
|
118
|
+
}).finally(() => {
|
|
119
|
+
this.#pending.get(run.runId)?.({
|
|
120
|
+
outcome: "failed",
|
|
121
|
+
reason: "The build run ended before it started a build."
|
|
122
|
+
});
|
|
123
|
+
this.#pending.delete(run.runId);
|
|
124
|
+
});
|
|
125
|
+
return outcome;
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
//#endregion
|
|
129
|
+
export { EnvironmentBuildRunner };
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=build-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-runner.js","names":["#deps","#getMastra","#logger","#pending","#scheduleAvailable"],"sources":["../../src/environment/build-runner.ts"],"sourcesContent":["/**\n * Starts `factory-environment-build` runs on the booted `Mastra`. Every\n * trigger goes through a workflow run so the start decision and the poll are\n * recorded the same way whether a route, the scheduler or a webhook asked.\n */\n\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { FactorySandboxContext } from '@mastra/core/workspace';\nimport type { RepositoryPushEvent } from '../integrations/base.js';\nimport { resolveProjectEnvironment } from '../workspace.js';\nimport { probeSchedulesAvailable } from './build-schedule.js';\nimport type { ScheduleService } from './build-schedule.js';\nimport { createEnvironmentBuildWorkflow, ENVIRONMENT_BUILD_WORKFLOW_ID } from './build-workflow.js';\nimport type { EnvironmentBuildWorkflowOptions } from './build-workflow.js';\nimport type { EnvironmentBuildDeps, EnvironmentBuildOutcome, EnvironmentBuildTrigger } from './build.js';\nimport { environmentBuildContext, errorReason, resolveEnvironmentHeads } from './build.js';\n\nexport type StartEnvironmentBuild = (\n projectId: string,\n trigger: EnvironmentBuildTrigger,\n) => Promise<EnvironmentBuildOutcome>;\n\nexport interface EnvironmentBuildRunnerOptions extends Omit<EnvironmentBuildWorkflowOptions, 'onStart'> {\n /** The booted instance; `undefined` until the host finished `finalize()`. */\n getMastra: () => Mastra | undefined;\n logger?: { info: (msg: string, meta?: Record<string, unknown>) => void };\n}\n\n/** What a read of a build's status or history hands the provider. */\nexport interface EnvironmentBuildReadContext {\n ctx: FactorySandboxContext;\n settings: Record<string, unknown>;\n}\n\nexport class EnvironmentBuildRunner {\n readonly workflow;\n readonly #deps: EnvironmentBuildDeps;\n readonly #getMastra: () => Mastra | undefined;\n readonly #logger: EnvironmentBuildRunnerOptions['logger'];\n readonly #pending = new Map<string, (outcome: EnvironmentBuildOutcome) => void>();\n #scheduleAvailable = false;\n\n constructor(deps: EnvironmentBuildDeps, options: EnvironmentBuildRunnerOptions) {\n const { getMastra, logger, ...workflowOptions } = options;\n this.#deps = deps;\n this.#getMastra = getMastra;\n this.#logger = logger;\n this.workflow = createEnvironmentBuildWorkflow(deps, {\n ...workflowOptions,\n onStart: (runId, outcome) => {\n this.#pending.get(runId)?.(outcome);\n this.#pending.delete(runId);\n },\n });\n }\n\n /** The schedule service of the booted host, `undefined` before boot. */\n schedules(): ScheduleService | undefined {\n return this.#getMastra()?.schedules;\n }\n\n /** Whether the host's storage implements schedules; false until `probeSchedules()` ran. */\n get scheduleAvailable(): boolean {\n return this.#scheduleAvailable;\n }\n\n /** Probe once after the host booted; a storage without the domain disables the cron trigger. */\n async probeSchedules(): Promise<boolean> {\n const schedules = this.schedules();\n this.#scheduleAvailable = schedules ? await probeSchedulesAvailable(schedules) : false;\n return this.#scheduleAvailable;\n }\n\n /**\n * The context a status or history read hands the provider. Heads come from\n * the stored last attempt (the build being read was pinned to them), else\n * the active template, so a read never calls GitHub; before the first build\n * they are resolved live once.\n */\n async readContext(projectId: string): Promise<EnvironmentBuildReadContext | undefined> {\n const sourceControl = this.#deps.sourceControl;\n if (!sourceControl) return undefined;\n const project = await this.#deps.projects.getById({ id: projectId });\n if (!project) return undefined;\n const environment = await resolveProjectEnvironment(sourceControl.storage, project);\n const heads =\n project.lastBuildHeads ??\n project.activeTemplateHeads ??\n (await resolveEnvironmentHeads(sourceControl, project, environment));\n return {\n ctx: environmentBuildContext(project, environment, heads, sourceControl.versionControl),\n settings: environment.settings,\n };\n }\n\n /**\n * A push to an environment repository's default branch starts a `push` run\n * when the project opted in; the run's debounce claim decides whether it\n * builds. Fire and forget: the webhook never waits on it.\n */\n readonly onRepositoryPush = (event: RepositoryPushEvent): void => {\n if (!event.projectRepository.inEnvironment) return;\n const branch = event.defaultBranch;\n if (event.ref !== `refs/heads/${branch}`) return;\n void this.#deps.projects\n .getById({ id: event.factoryProjectId })\n .then(project => (project?.buildOnPushEnabled ? this.start(project.id, 'push') : undefined))\n .catch((error: unknown) => {\n this.#logger?.info('environment build push hand-off failed', {\n factoryProjectId: event.factoryProjectId,\n reason: errorReason(error),\n });\n });\n };\n\n /**\n * Start a run and resolve with the first step's answer; the poll step keeps\n * running in the background. Resolves `unavailable` before the host booted\n * or when the host never registered the workflow, and `failed` when the run\n * could not be created; a caller that already saved its own change must not\n * fail on the build it merely requested.\n */\n readonly start: StartEnvironmentBuild = async (projectId, trigger) => {\n const mastra = this.#getMastra();\n if (!mastra) return { outcome: 'unavailable', reason: 'not_ready' };\n let run: Awaited<ReturnType<typeof this.workflow.createRun>>;\n try {\n run = await mastra.getWorkflow(ENVIRONMENT_BUILD_WORKFLOW_ID).createRun();\n } catch (error) {\n const reason = errorReason(error);\n this.#logger?.info('environment build run could not be created', { factoryProjectId: projectId, reason });\n return mastra.listWorkflows()[ENVIRONMENT_BUILD_WORKFLOW_ID]\n ? { outcome: 'failed', reason }\n : { outcome: 'unavailable', reason: 'no_workflow' };\n }\n const outcome = new Promise<EnvironmentBuildOutcome>(resolve => this.#pending.set(run.runId, resolve));\n run\n .start({ inputData: { projectId, trigger } })\n .then(result => {\n if (result.status !== 'success') {\n this.#logger?.info('environment build run did not succeed', {\n factoryProjectId: projectId,\n runId: run.runId,\n });\n }\n })\n .catch((error: unknown) => {\n this.#logger?.info('environment build run threw', {\n factoryProjectId: projectId,\n runId: run.runId,\n reason: errorReason(error),\n });\n })\n .finally(() => {\n // A run that failed before its first step answered must not hang the caller.\n this.#pending.get(run.runId)?.({ outcome: 'failed', reason: 'The build run ended before it started a build.' });\n this.#pending.delete(run.runId);\n });\n return outcome;\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-project cron that fires the `factory-environment-build` workflow,
|
|
3
|
+
* kept in core `Schedules` (one row per project) rather than a factory
|
|
4
|
+
* column: the scheduler owns firing, claims and the run trigger log, factory
|
|
5
|
+
* only creates, pauses, resumes and reads the row.
|
|
6
|
+
*/
|
|
7
|
+
import type { Schedules } from '@mastra/core/schedules';
|
|
8
|
+
export declare const SCHEDULES_UNAVAILABLE_ERROR_ID = "SCHEDULES_NO_SCHEDULES_STORAGE";
|
|
9
|
+
/**
|
|
10
|
+
* The project's schedule id in its stored form. Core normalizes a created
|
|
11
|
+
* id to `schedule_<slug>` and resolves a bare id to `agent_<slug>` on reads,
|
|
12
|
+
* so factory always addresses the row by the normalized id (a project id is
|
|
13
|
+
* a lower-case uuid, which slugifies to itself).
|
|
14
|
+
*/
|
|
15
|
+
export declare function scheduleIdFor(projectId: string): string;
|
|
16
|
+
export interface EnvironmentBuildSchedule {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
cron: string | null;
|
|
19
|
+
timezone: string | null;
|
|
20
|
+
}
|
|
21
|
+
export type ScheduleService = Pick<Schedules, 'create' | 'get' | 'list' | 'update' | 'pause' | 'resume' | 'delete'>;
|
|
22
|
+
/**
|
|
23
|
+
* Whether the host's storage implements the schedules domain. `mastra.schedules`
|
|
24
|
+
* never throws on access; the missing store surfaces on the first call.
|
|
25
|
+
*/
|
|
26
|
+
export declare function probeSchedulesAvailable(schedules: ScheduleService): Promise<boolean>;
|
|
27
|
+
/** `undefined` when the cron parses; otherwise the validator's message. */
|
|
28
|
+
export declare function invalidCronMessage(cron: string, timezone?: string): string | undefined;
|
|
29
|
+
/** The project's build schedule as the environment reports it. */
|
|
30
|
+
export declare function readSchedule(schedules: ScheduleService, projectId: string): Promise<EnvironmentBuildSchedule>;
|
|
31
|
+
/**
|
|
32
|
+
* Create, update, pause or resume the project's schedule so it matches
|
|
33
|
+
* `input`. Disabling a project that never had a schedule creates nothing.
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureSchedule(schedules: ScheduleService, projectId: string, input: {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
cron: string;
|
|
38
|
+
timezone?: string;
|
|
39
|
+
}): Promise<EnvironmentBuildSchedule>;
|
|
40
|
+
//# sourceMappingURL=build-schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schedule.d.ts","sourceRoot":"","sources":["../../src/environment/build-schedule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AAIvF,eAAO,MAAM,8BAA8B,mCAAmC,CAAC;AAE/E;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAQpH;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1F;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtF;AAWD,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAGnH;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,wBAAwB,CAAC,CA2BnC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ENVIRONMENT_BUILD_WORKFLOW_ID } from "./build-workflow.js";
|
|
2
|
+
import { validateCron } from "@mastra/core/workflows";
|
|
3
|
+
//#region src/environment/build-schedule.ts
|
|
4
|
+
const SCHEDULES_UNAVAILABLE_ERROR_ID = "SCHEDULES_NO_SCHEDULES_STORAGE";
|
|
5
|
+
/**
|
|
6
|
+
* The project's schedule id in its stored form. Core normalizes a created
|
|
7
|
+
* id to `schedule_<slug>` and resolves a bare id to `agent_<slug>` on reads,
|
|
8
|
+
* so factory always addresses the row by the normalized id (a project id is
|
|
9
|
+
* a lower-case uuid, which slugifies to itself).
|
|
10
|
+
*/
|
|
11
|
+
function scheduleIdFor(projectId) {
|
|
12
|
+
return `schedule_factory-environment-build-${projectId}`;
|
|
13
|
+
}
|
|
14
|
+
function isSchedulesUnavailable(error) {
|
|
15
|
+
return typeof error === "object" && error !== null && error.id === "SCHEDULES_NO_SCHEDULES_STORAGE";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whether the host's storage implements the schedules domain. `mastra.schedules`
|
|
19
|
+
* never throws on access; the missing store surfaces on the first call.
|
|
20
|
+
*/
|
|
21
|
+
async function probeSchedulesAvailable(schedules) {
|
|
22
|
+
try {
|
|
23
|
+
await schedules.list({ workflowId: ENVIRONMENT_BUILD_WORKFLOW_ID });
|
|
24
|
+
return true;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (isSchedulesUnavailable(error)) return false;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** `undefined` when the cron parses; otherwise the validator's message. */
|
|
31
|
+
function invalidCronMessage(cron, timezone) {
|
|
32
|
+
try {
|
|
33
|
+
validateCron(cron, timezone);
|
|
34
|
+
return;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
return error instanceof Error ? error.message : String(error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function isWorkflowSchedule(schedule) {
|
|
40
|
+
return schedule !== null && schedule.agentId === void 0;
|
|
41
|
+
}
|
|
42
|
+
function toView(schedule) {
|
|
43
|
+
if (!schedule) return {
|
|
44
|
+
enabled: false,
|
|
45
|
+
cron: null,
|
|
46
|
+
timezone: null
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
enabled: schedule.status === "active",
|
|
50
|
+
cron: schedule.cron,
|
|
51
|
+
timezone: schedule.timezone ?? null
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** The project's build schedule as the environment reports it. */
|
|
55
|
+
async function readSchedule(schedules, projectId) {
|
|
56
|
+
const schedule = await schedules.get(scheduleIdFor(projectId));
|
|
57
|
+
return toView(isWorkflowSchedule(schedule) ? schedule : null);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create, update, pause or resume the project's schedule so it matches
|
|
61
|
+
* `input`. Disabling a project that never had a schedule creates nothing.
|
|
62
|
+
*/
|
|
63
|
+
async function ensureSchedule(schedules, projectId, input) {
|
|
64
|
+
const id = scheduleIdFor(projectId);
|
|
65
|
+
const existing = await schedules.get(id);
|
|
66
|
+
const current = isWorkflowSchedule(existing) ? existing : null;
|
|
67
|
+
if (!current) {
|
|
68
|
+
if (!input.enabled) return toView(null);
|
|
69
|
+
return toView(await schedules.create({
|
|
70
|
+
id,
|
|
71
|
+
workflowId: ENVIRONMENT_BUILD_WORKFLOW_ID,
|
|
72
|
+
cron: input.cron,
|
|
73
|
+
...input.timezone ? { timezone: input.timezone } : {},
|
|
74
|
+
inputData: {
|
|
75
|
+
projectId,
|
|
76
|
+
trigger: "schedule"
|
|
77
|
+
},
|
|
78
|
+
resourceId: projectId
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
const timingChanged = current.cron !== input.cron || (current.timezone ?? void 0) !== input.timezone;
|
|
82
|
+
let next = current;
|
|
83
|
+
if (timingChanged) next = await schedules.update(current.id, {
|
|
84
|
+
cron: input.cron,
|
|
85
|
+
...input.timezone ? { timezone: input.timezone } : {}
|
|
86
|
+
});
|
|
87
|
+
if (input.enabled && next.status === "paused") next = await schedules.resume(current.id);
|
|
88
|
+
if (!input.enabled && next.status === "active") next = await schedules.pause(current.id);
|
|
89
|
+
return toView(isWorkflowSchedule(next) ? next : null);
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { SCHEDULES_UNAVAILABLE_ERROR_ID, ensureSchedule, invalidCronMessage, probeSchedulesAvailable, readSchedule, scheduleIdFor };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=build-schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schedule.js","names":[],"sources":["../../src/environment/build-schedule.ts"],"sourcesContent":["/**\n * The per-project cron that fires the `factory-environment-build` workflow,\n * kept in core `Schedules` (one row per project) rather than a factory\n * column: the scheduler owns firing, claims and the run trigger log, factory\n * only creates, pauses, resumes and reads the row.\n */\n\nimport type { AnySchedule, Schedules, WorkflowSchedule } from '@mastra/core/schedules';\nimport { validateCron } from '@mastra/core/workflows';\nimport { ENVIRONMENT_BUILD_WORKFLOW_ID } from './build-workflow.js';\n\nexport const SCHEDULES_UNAVAILABLE_ERROR_ID = 'SCHEDULES_NO_SCHEDULES_STORAGE';\n\n/**\n * The project's schedule id in its stored form. Core normalizes a created\n * id to `schedule_<slug>` and resolves a bare id to `agent_<slug>` on reads,\n * so factory always addresses the row by the normalized id (a project id is\n * a lower-case uuid, which slugifies to itself).\n */\nexport function scheduleIdFor(projectId: string): string {\n return `schedule_factory-environment-build-${projectId}`;\n}\n\nexport interface EnvironmentBuildSchedule {\n enabled: boolean;\n cron: string | null;\n timezone: string | null;\n}\n\nexport type ScheduleService = Pick<Schedules, 'create' | 'get' | 'list' | 'update' | 'pause' | 'resume' | 'delete'>;\n\nfunction isSchedulesUnavailable(error: unknown): boolean {\n return (\n typeof error === 'object' && error !== null && (error as { id?: unknown }).id === SCHEDULES_UNAVAILABLE_ERROR_ID\n );\n}\n\n/**\n * Whether the host's storage implements the schedules domain. `mastra.schedules`\n * never throws on access; the missing store surfaces on the first call.\n */\nexport async function probeSchedulesAvailable(schedules: ScheduleService): Promise<boolean> {\n try {\n await schedules.list({ workflowId: ENVIRONMENT_BUILD_WORKFLOW_ID });\n return true;\n } catch (error) {\n if (isSchedulesUnavailable(error)) return false;\n throw error;\n }\n}\n\n/** `undefined` when the cron parses; otherwise the validator's message. */\nexport function invalidCronMessage(cron: string, timezone?: string): string | undefined {\n try {\n validateCron(cron, timezone);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n}\n\nfunction isWorkflowSchedule(schedule: AnySchedule | null): schedule is WorkflowSchedule {\n return schedule !== null && schedule.agentId === undefined;\n}\n\nfunction toView(schedule: WorkflowSchedule | null): EnvironmentBuildSchedule {\n if (!schedule) return { enabled: false, cron: null, timezone: null };\n return { enabled: schedule.status === 'active', cron: schedule.cron, timezone: schedule.timezone ?? null };\n}\n\n/** The project's build schedule as the environment reports it. */\nexport async function readSchedule(schedules: ScheduleService, projectId: string): Promise<EnvironmentBuildSchedule> {\n const schedule = await schedules.get(scheduleIdFor(projectId));\n return toView(isWorkflowSchedule(schedule) ? schedule : null);\n}\n\n/**\n * Create, update, pause or resume the project's schedule so it matches\n * `input`. Disabling a project that never had a schedule creates nothing.\n */\nexport async function ensureSchedule(\n schedules: ScheduleService,\n projectId: string,\n input: { enabled: boolean; cron: string; timezone?: string },\n): Promise<EnvironmentBuildSchedule> {\n const id = scheduleIdFor(projectId);\n const existing = await schedules.get(id);\n const current = isWorkflowSchedule(existing) ? existing : null;\n if (!current) {\n if (!input.enabled) return toView(null);\n const created = await schedules.create({\n id,\n workflowId: ENVIRONMENT_BUILD_WORKFLOW_ID,\n cron: input.cron,\n ...(input.timezone ? { timezone: input.timezone } : {}),\n inputData: { projectId, trigger: 'schedule' },\n resourceId: projectId,\n });\n return toView(created);\n }\n const timingChanged = current.cron !== input.cron || (current.timezone ?? undefined) !== input.timezone;\n let next: AnySchedule = current;\n if (timingChanged) {\n next = await schedules.update(current.id, {\n cron: input.cron,\n ...(input.timezone ? { timezone: input.timezone } : {}),\n });\n }\n if (input.enabled && next.status === 'paused') next = await schedules.resume(current.id);\n if (!input.enabled && next.status === 'active') next = await schedules.pause(current.id);\n return toView(isWorkflowSchedule(next) ? next : null);\n}\n"],"mappings":";;;AAWA,MAAa,iCAAiC;;;;;;;AAQ9C,SAAgB,cAAc,WAA2B;CACvD,OAAO,sCAAsC;AAC/C;AAUA,SAAS,uBAAuB,OAAyB;CACvD,OACE,OAAO,UAAU,YAAY,UAAU,QAAS,MAA2B,OAAA;AAE/E;;;;;AAMA,eAAsB,wBAAwB,WAA8C;CAC1F,IAAI;EACF,MAAM,UAAU,KAAK,EAAE,YAAY,8BAA8B,CAAC;EAClE,OAAO;CACT,SAAS,OAAO;EACd,IAAI,uBAAuB,KAAK,GAAG,OAAO;EAC1C,MAAM;CACR;AACF;;AAGA,SAAgB,mBAAmB,MAAc,UAAuC;CACtF,IAAI;EACF,aAAa,MAAM,QAAQ;EAC3B;CACF,SAAS,OAAO;EACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CAC9D;AACF;AAEA,SAAS,mBAAmB,UAA4D;CACtF,OAAO,aAAa,QAAQ,SAAS,YAAY,KAAA;AACnD;AAEA,SAAS,OAAO,UAA6D;CAC3E,IAAI,CAAC,UAAU,OAAO;EAAE,SAAS;EAAO,MAAM;EAAM,UAAU;CAAK;CACnE,OAAO;EAAE,SAAS,SAAS,WAAW;EAAU,MAAM,SAAS;EAAM,UAAU,SAAS,YAAY;CAAK;AAC3G;;AAGA,eAAsB,aAAa,WAA4B,WAAsD;CACnH,MAAM,WAAW,MAAM,UAAU,IAAI,cAAc,SAAS,CAAC;CAC7D,OAAO,OAAO,mBAAmB,QAAQ,IAAI,WAAW,IAAI;AAC9D;;;;;AAMA,eAAsB,eACpB,WACA,WACA,OACmC;CACnC,MAAM,KAAK,cAAc,SAAS;CAClC,MAAM,WAAW,MAAM,UAAU,IAAI,EAAE;CACvC,MAAM,UAAU,mBAAmB,QAAQ,IAAI,WAAW;CAC1D,IAAI,CAAC,SAAS;EACZ,IAAI,CAAC,MAAM,SAAS,OAAO,OAAO,IAAI;EAStC,OAAO,OAAO,MARQ,UAAU,OAAO;GACrC;GACA,YAAY;GACZ,MAAM,MAAM;GACZ,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;GACrD,WAAW;IAAE;IAAW,SAAS;GAAW;GAC5C,YAAY;EACd,CAAC,CACoB;CACvB;CACA,MAAM,gBAAgB,QAAQ,SAAS,MAAM,SAAS,QAAQ,YAAY,KAAA,OAAe,MAAM;CAC/F,IAAI,OAAoB;CACxB,IAAI,eACF,OAAO,MAAM,UAAU,OAAO,QAAQ,IAAI;EACxC,MAAM,MAAM;EACZ,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;CACvD,CAAC;CAEH,IAAI,MAAM,WAAW,KAAK,WAAW,UAAU,OAAO,MAAM,UAAU,OAAO,QAAQ,EAAE;CACvF,IAAI,CAAC,MAAM,WAAW,KAAK,WAAW,UAAU,OAAO,MAAM,UAAU,MAAM,QAAQ,EAAE;CACvF,OAAO,OAAO,mBAAmB,IAAI,IAAI,OAAO,IAAI;AACtD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `factory-environment-build` workflow: step one decides and starts a
|
|
3
|
+
* build (`runEnvironmentBuild`), step two polls the provider until the build
|
|
4
|
+
* settles and pins the active template on the project row. Registered by
|
|
5
|
+
* `MastraFactory.prepare()` only when the sandbox has `builds`, and driven by
|
|
6
|
+
* the Build now route, the per-project cron schedule and the GitHub push
|
|
7
|
+
* hand-off. Saving settings never starts it.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import type { EnvironmentBuildDeps, EnvironmentBuildOutcome } from './build.js';
|
|
11
|
+
export declare const ENVIRONMENT_BUILD_WORKFLOW_ID = "factory-environment-build";
|
|
12
|
+
export declare const DEFAULT_BUILD_POLL_MS = 15000;
|
|
13
|
+
export declare const MAX_BUILD_WAIT_MS: number;
|
|
14
|
+
export declare const environmentBuildInputSchema: z.ZodObject<{
|
|
15
|
+
projectId: z.ZodString;
|
|
16
|
+
trigger: z.ZodEnum<{
|
|
17
|
+
manual: "manual";
|
|
18
|
+
push: "push";
|
|
19
|
+
schedule: "schedule";
|
|
20
|
+
}>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export declare const environmentBuildOutputSchema: z.ZodObject<{
|
|
23
|
+
outcome: z.ZodEnum<{
|
|
24
|
+
started: "started";
|
|
25
|
+
failed: "failed";
|
|
26
|
+
skipped: "skipped";
|
|
27
|
+
unavailable: "unavailable";
|
|
28
|
+
}>;
|
|
29
|
+
buildId: z.ZodOptional<z.ZodString>;
|
|
30
|
+
templateId: z.ZodOptional<z.ZodString>;
|
|
31
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
32
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
33
|
+
unknown: "unknown";
|
|
34
|
+
failed: "failed";
|
|
35
|
+
ready: "ready";
|
|
36
|
+
}>>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
export type EnvironmentBuildWorkflowResult = z.infer<typeof environmentBuildOutputSchema>;
|
|
39
|
+
export interface EnvironmentBuildWorkflowOptions {
|
|
40
|
+
sleep?: (ms: number) => Promise<void>;
|
|
41
|
+
pollMs?: number;
|
|
42
|
+
maxWaitMs?: number;
|
|
43
|
+
/** Called with the first step's answer so a caller can return it without waiting for the poll. */
|
|
44
|
+
onStart?: (runId: string, outcome: EnvironmentBuildOutcome) => void;
|
|
45
|
+
}
|
|
46
|
+
export declare function createEnvironmentBuildWorkflow(deps: EnvironmentBuildDeps, options?: EnvironmentBuildWorkflowOptions): import("@mastra/core/workflows").Workflow<import("@mastra/core/workflows").DefaultEngineType, import("@mastra/core/workflows").Step<string, unknown, unknown, unknown, unknown, unknown, any, unknown>[], "factory-environment-build", unknown, {
|
|
47
|
+
projectId: string;
|
|
48
|
+
trigger: "manual" | "push" | "schedule";
|
|
49
|
+
}, {
|
|
50
|
+
outcome: "started" | "failed" | "skipped" | "unavailable";
|
|
51
|
+
buildId?: string | undefined;
|
|
52
|
+
templateId?: string | undefined;
|
|
53
|
+
reason?: string | undefined;
|
|
54
|
+
status?: "unknown" | "failed" | "ready" | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
outcome: "started" | "failed" | "skipped" | "unavailable";
|
|
57
|
+
buildId?: string | undefined;
|
|
58
|
+
templateId?: string | undefined;
|
|
59
|
+
reason?: string | undefined;
|
|
60
|
+
status?: "unknown" | "failed" | "ready" | undefined;
|
|
61
|
+
}, unknown>;
|
|
62
|
+
//# sourceMappingURL=build-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-workflow.d.ts","sourceRoot":"","sources":["../../src/environment/build-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEhF,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAE7C,eAAO,MAAM,2BAA2B;;;;;;;iBAGtC,CAAC;AAWH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;iBAOvC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAE1F,MAAM,WAAW,+BAA+B;IAC9C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC;CACrE;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,oBAAoB,EAC1B,OAAO,GAAE,+BAAoC;;;;;;;;;;;;;;;YAoF9C"}
|