@cat-factory/orchestration 0.6.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/LICENSE +21 -0
- package/dist/container.d.ts +460 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +657 -0
- package/dist/container.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/board/BoardService.d.ts +125 -0
- package/dist/modules/board/BoardService.d.ts.map +1 -0
- package/dist/modules/board/BoardService.js +496 -0
- package/dist/modules/board/BoardService.js.map +1 -0
- package/dist/modules/board/board.logic.d.ts +17 -0
- package/dist/modules/board/board.logic.d.ts.map +1 -0
- package/dist/modules/board/board.logic.js +51 -0
- package/dist/modules/board/board.logic.js.map +1 -0
- package/dist/modules/boardScan/BoardScanService.d.ts +35 -0
- package/dist/modules/boardScan/BoardScanService.d.ts.map +1 -0
- package/dist/modules/boardScan/BoardScanService.js +91 -0
- package/dist/modules/boardScan/BoardScanService.js.map +1 -0
- package/dist/modules/boardScan/board-scan.logic.d.ts +10 -0
- package/dist/modules/boardScan/board-scan.logic.d.ts.map +1 -0
- package/dist/modules/boardScan/board-scan.logic.js +26 -0
- package/dist/modules/boardScan/board-scan.logic.js.map +1 -0
- package/dist/modules/bootstrap/BootstrapService.d.ts +114 -0
- package/dist/modules/bootstrap/BootstrapService.d.ts.map +1 -0
- package/dist/modules/bootstrap/BootstrapService.js +516 -0
- package/dist/modules/bootstrap/BootstrapService.js.map +1 -0
- package/dist/modules/clarity/ClarityReviewService.d.ts +48 -0
- package/dist/modules/clarity/ClarityReviewService.d.ts.map +1 -0
- package/dist/modules/clarity/ClarityReviewService.js +63 -0
- package/dist/modules/clarity/ClarityReviewService.js.map +1 -0
- package/dist/modules/clarity/clarity.logic.d.ts +36 -0
- package/dist/modules/clarity/clarity.logic.d.ts.map +1 -0
- package/dist/modules/clarity/clarity.logic.js +98 -0
- package/dist/modules/clarity/clarity.logic.js.map +1 -0
- package/dist/modules/estimation/estimate.logic.d.ts +11 -0
- package/dist/modules/estimation/estimate.logic.d.ts.map +1 -0
- package/dist/modules/estimation/estimate.logic.js +37 -0
- package/dist/modules/estimation/estimate.logic.js.map +1 -0
- package/dist/modules/execution/AgentContextBuilder.d.ts +114 -0
- package/dist/modules/execution/AgentContextBuilder.d.ts.map +1 -0
- package/dist/modules/execution/AgentContextBuilder.js +316 -0
- package/dist/modules/execution/AgentContextBuilder.js.map +1 -0
- package/dist/modules/execution/CompanionController.d.ts +60 -0
- package/dist/modules/execution/CompanionController.d.ts.map +1 -0
- package/dist/modules/execution/CompanionController.js +216 -0
- package/dist/modules/execution/CompanionController.js.map +1 -0
- package/dist/modules/execution/ExecutionService.d.ts +874 -0
- package/dist/modules/execution/ExecutionService.d.ts.map +1 -0
- package/dist/modules/execution/ExecutionService.js +2921 -0
- package/dist/modules/execution/ExecutionService.js.map +1 -0
- package/dist/modules/execution/MergeResolver.d.ts +34 -0
- package/dist/modules/execution/MergeResolver.d.ts.map +1 -0
- package/dist/modules/execution/MergeResolver.js +81 -0
- package/dist/modules/execution/MergeResolver.js.map +1 -0
- package/dist/modules/execution/ReviewGateController.d.ts +163 -0
- package/dist/modules/execution/ReviewGateController.d.ts.map +1 -0
- package/dist/modules/execution/ReviewGateController.js +251 -0
- package/dist/modules/execution/ReviewGateController.js.map +1 -0
- package/dist/modules/execution/TesterController.d.ts +61 -0
- package/dist/modules/execution/TesterController.d.ts.map +1 -0
- package/dist/modules/execution/TesterController.js +215 -0
- package/dist/modules/execution/TesterController.js.map +1 -0
- package/dist/modules/execution/advance.d.ts +84 -0
- package/dist/modules/execution/advance.d.ts.map +1 -0
- package/dist/modules/execution/advance.js +2 -0
- package/dist/modules/execution/advance.js.map +1 -0
- package/dist/modules/execution/artifact-review.logic.d.ts +25 -0
- package/dist/modules/execution/artifact-review.logic.d.ts.map +1 -0
- package/dist/modules/execution/artifact-review.logic.js +39 -0
- package/dist/modules/execution/artifact-review.logic.js.map +1 -0
- package/dist/modules/execution/ci.logic.d.ts +101 -0
- package/dist/modules/execution/ci.logic.d.ts.map +1 -0
- package/dist/modules/execution/ci.logic.js +117 -0
- package/dist/modules/execution/ci.logic.js.map +1 -0
- package/dist/modules/execution/drive.d.ts +47 -0
- package/dist/modules/execution/drive.d.ts.map +1 -0
- package/dist/modules/execution/drive.js +112 -0
- package/dist/modules/execution/drive.js.map +1 -0
- package/dist/modules/execution/gates.d.ts +97 -0
- package/dist/modules/execution/gates.d.ts.map +1 -0
- package/dist/modules/execution/gates.js +2 -0
- package/dist/modules/execution/gates.js.map +1 -0
- package/dist/modules/execution/individualVendors.logic.d.ts +22 -0
- package/dist/modules/execution/individualVendors.logic.d.ts.map +1 -0
- package/dist/modules/execution/individualVendors.logic.js +33 -0
- package/dist/modules/execution/individualVendors.logic.js.map +1 -0
- package/dist/modules/execution/job.logic.d.ts +52 -0
- package/dist/modules/execution/job.logic.d.ts.map +1 -0
- package/dist/modules/execution/job.logic.js +56 -0
- package/dist/modules/execution/job.logic.js.map +1 -0
- package/dist/modules/execution/release.logic.d.ts +43 -0
- package/dist/modules/execution/release.logic.d.ts.map +1 -0
- package/dist/modules/execution/release.logic.js +49 -0
- package/dist/modules/execution/release.logic.js.map +1 -0
- package/dist/modules/execution/retry.logic.d.ts +40 -0
- package/dist/modules/execution/retry.logic.d.ts.map +1 -0
- package/dist/modules/execution/retry.logic.js +83 -0
- package/dist/modules/execution/retry.logic.js.map +1 -0
- package/dist/modules/execution/stepGating.logic.d.ts +15 -0
- package/dist/modules/execution/stepGating.logic.d.ts.map +1 -0
- package/dist/modules/execution/stepGating.logic.js +29 -0
- package/dist/modules/execution/stepGating.logic.js.map +1 -0
- package/dist/modules/execution/stepResolvers.d.ts +41 -0
- package/dist/modules/execution/stepResolvers.d.ts.map +1 -0
- package/dist/modules/execution/stepResolvers.js +2 -0
- package/dist/modules/execution/stepResolvers.js.map +1 -0
- package/dist/modules/execution/tester-infra.logic.d.ts +42 -0
- package/dist/modules/execution/tester-infra.logic.d.ts.map +1 -0
- package/dist/modules/execution/tester-infra.logic.js +46 -0
- package/dist/modules/execution/tester-infra.logic.js.map +1 -0
- package/dist/modules/merge/MergePresetService.d.ts +32 -0
- package/dist/modules/merge/MergePresetService.d.ts.map +1 -0
- package/dist/modules/merge/MergePresetService.js +109 -0
- package/dist/modules/merge/MergePresetService.js.map +1 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.d.ts +22 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.d.ts.map +1 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.js +28 -0
- package/dist/modules/modelDefaults/ModelDefaultsService.js.map +1 -0
- package/dist/modules/notifications/NotificationService.d.ts +74 -0
- package/dist/modules/notifications/NotificationService.d.ts.map +1 -0
- package/dist/modules/notifications/NotificationService.js +131 -0
- package/dist/modules/notifications/NotificationService.js.map +1 -0
- package/dist/modules/observability/LlmObservabilityService.d.ts +121 -0
- package/dist/modules/observability/LlmObservabilityService.d.ts.map +1 -0
- package/dist/modules/observability/LlmObservabilityService.js +140 -0
- package/dist/modules/observability/LlmObservabilityService.js.map +1 -0
- package/dist/modules/observability/observability.logic.d.ts +57 -0
- package/dist/modules/observability/observability.logic.d.ts.map +1 -0
- package/dist/modules/observability/observability.logic.js +186 -0
- package/dist/modules/observability/observability.logic.js.map +1 -0
- package/dist/modules/pipelines/PipelineService.d.ts +54 -0
- package/dist/modules/pipelines/PipelineService.d.ts.map +1 -0
- package/dist/modules/pipelines/PipelineService.js +226 -0
- package/dist/modules/pipelines/PipelineService.js.map +1 -0
- package/dist/modules/pipelines/pipelineShape.d.ts +53 -0
- package/dist/modules/pipelines/pipelineShape.d.ts.map +1 -0
- package/dist/modules/pipelines/pipelineShape.js +74 -0
- package/dist/modules/pipelines/pipelineShape.js.map +1 -0
- package/dist/modules/recurring/RecurringPipelineService.d.ts +76 -0
- package/dist/modules/recurring/RecurringPipelineService.d.ts.map +1 -0
- package/dist/modules/recurring/RecurringPipelineService.js +295 -0
- package/dist/modules/recurring/RecurringPipelineService.js.map +1 -0
- package/dist/modules/recurring/TrackerSettingsService.d.ts +16 -0
- package/dist/modules/recurring/TrackerSettingsService.d.ts.map +1 -0
- package/dist/modules/recurring/TrackerSettingsService.js +30 -0
- package/dist/modules/recurring/TrackerSettingsService.js.map +1 -0
- package/dist/modules/recurring/schedule.logic.d.ts +14 -0
- package/dist/modules/recurring/schedule.logic.d.ts.map +1 -0
- package/dist/modules/recurring/schedule.logic.js +85 -0
- package/dist/modules/recurring/schedule.logic.js.map +1 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.d.ts +38 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.d.ts.map +1 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.js +96 -0
- package/dist/modules/releaseHealth/ReleaseHealthService.js.map +1 -0
- package/dist/modules/requirements/RequirementReviewService.d.ts +48 -0
- package/dist/modules/requirements/RequirementReviewService.d.ts.map +1 -0
- package/dist/modules/requirements/RequirementReviewService.js +83 -0
- package/dist/modules/requirements/RequirementReviewService.js.map +1 -0
- package/dist/modules/requirements/requirements.logic.d.ts +93 -0
- package/dist/modules/requirements/requirements.logic.d.ts.map +1 -0
- package/dist/modules/requirements/requirements.logic.js +203 -0
- package/dist/modules/requirements/requirements.logic.js.map +1 -0
- package/dist/modules/review/IterativeReviewService.d.ts +175 -0
- package/dist/modules/review/IterativeReviewService.d.ts.map +1 -0
- package/dist/modules/review/IterativeReviewService.js +327 -0
- package/dist/modules/review/IterativeReviewService.js.map +1 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.d.ts +20 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.d.ts.map +1 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.js +26 -0
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.js.map +1 -0
- package/dist/modules/services/ServiceMountService.d.ts +48 -0
- package/dist/modules/services/ServiceMountService.d.ts.map +1 -0
- package/dist/modules/services/ServiceMountService.js +90 -0
- package/dist/modules/services/ServiceMountService.js.map +1 -0
- package/dist/modules/settings/WorkspaceSettingsService.d.ts +22 -0
- package/dist/modules/settings/WorkspaceSettingsService.d.ts.map +1 -0
- package/dist/modules/settings/WorkspaceSettingsService.js +50 -0
- package/dist/modules/settings/WorkspaceSettingsService.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,657 @@
|
|
|
1
|
+
import { ServiceMountService } from './modules/services/ServiceMountService.js';
|
|
2
|
+
import { NoopWorkRunner } from '@cat-factory/kernel';
|
|
3
|
+
import { NoopEventPublisher } from '@cat-factory/kernel';
|
|
4
|
+
import { BoardService } from './modules/board/BoardService.js';
|
|
5
|
+
import { ExecutionService } from './modules/execution/ExecutionService.js';
|
|
6
|
+
import { PipelineService } from './modules/pipelines/PipelineService.js';
|
|
7
|
+
import { WorkspaceService } from '@cat-factory/workspaces';
|
|
8
|
+
import { AccountService } from '@cat-factory/workspaces';
|
|
9
|
+
import { UserService } from '@cat-factory/workspaces';
|
|
10
|
+
import { InvitationService } from '@cat-factory/workspaces';
|
|
11
|
+
import { EmailConnectionService } from '@cat-factory/integrations';
|
|
12
|
+
import { SpendService, DEFAULT_SPEND_PRICING } from '@cat-factory/spend';
|
|
13
|
+
import { LlmObservabilityService } from './modules/observability/LlmObservabilityService.js';
|
|
14
|
+
import { GitHubInstallationService, RepoProvisioningService, GitHubService, GitHubSyncService, WebhookService, DocumentConnectionService, DocumentImportService, DocumentPlannerService, DocumentLinkService, MapDocumentSourceRegistry, TaskConnectionService, TaskImportService, TaskLinkService, MapTaskSourceRegistry, EnvironmentConnectionService, EnvironmentProvisioningService, EnvironmentTeardownService, RunnerPoolConnectionService, SlackConnectionService, SlackSettingsService, SlackMemberMappingService, } from '@cat-factory/integrations';
|
|
15
|
+
import { BootstrapService } from './modules/bootstrap/BootstrapService.js';
|
|
16
|
+
import { BoardScanService } from './modules/boardScan/BoardScanService.js';
|
|
17
|
+
import { RequirementReviewService } from './modules/requirements/RequirementReviewService.js';
|
|
18
|
+
import { ClarityReviewService } from './modules/clarity/ClarityReviewService.js';
|
|
19
|
+
import { NotificationService } from './modules/notifications/NotificationService.js';
|
|
20
|
+
import { MergePresetService } from './modules/merge/MergePresetService.js';
|
|
21
|
+
import { WorkspaceSettingsService } from './modules/settings/WorkspaceSettingsService.js';
|
|
22
|
+
import { ReleaseHealthService } from './modules/releaseHealth/ReleaseHealthService.js';
|
|
23
|
+
import { ModelDefaultsService } from './modules/modelDefaults/ModelDefaultsService.js';
|
|
24
|
+
import { ServiceFragmentDefaultsService } from './modules/serviceFragmentDefaults/ServiceFragmentDefaultsService.js';
|
|
25
|
+
import { RecurringPipelineService } from './modules/recurring/RecurringPipelineService.js';
|
|
26
|
+
import { TrackerSettingsService } from './modules/recurring/TrackerSettingsService.js';
|
|
27
|
+
import { BLUEPRINT_PIPELINE_ID } from '@cat-factory/kernel';
|
|
28
|
+
import { FragmentLibraryService, FragmentSourceService, } from '@cat-factory/agents';
|
|
29
|
+
/** Assemble the in-org service-sharing module when its repositories are wired. */
|
|
30
|
+
function createServicesModule(deps) {
|
|
31
|
+
const { serviceRepository, workspaceMountRepository } = deps;
|
|
32
|
+
if (!serviceRepository || !workspaceMountRepository)
|
|
33
|
+
return undefined;
|
|
34
|
+
const service = new ServiceMountService({
|
|
35
|
+
serviceRepository,
|
|
36
|
+
workspaceMountRepository,
|
|
37
|
+
workspaceRepository: deps.workspaceRepository,
|
|
38
|
+
idGenerator: deps.idGenerator,
|
|
39
|
+
clock: deps.clock,
|
|
40
|
+
});
|
|
41
|
+
return { service };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Assemble the GitHub module when every dependency it needs is present;
|
|
45
|
+
* otherwise return undefined so the feature stays cleanly opt-in.
|
|
46
|
+
*/
|
|
47
|
+
function createGitHubModule(deps) {
|
|
48
|
+
const { githubClient, githubInstallationRepository, repoProjectionRepository, branchProjectionRepository, pullRequestProjectionRepository, issueProjectionRepository, commitProjectionRepository, checkRunProjectionRepository, webhookVerifier, } = deps;
|
|
49
|
+
if (!githubClient ||
|
|
50
|
+
!githubInstallationRepository ||
|
|
51
|
+
!repoProjectionRepository ||
|
|
52
|
+
!branchProjectionRepository ||
|
|
53
|
+
!pullRequestProjectionRepository ||
|
|
54
|
+
!issueProjectionRepository ||
|
|
55
|
+
!commitProjectionRepository ||
|
|
56
|
+
!checkRunProjectionRepository ||
|
|
57
|
+
!webhookVerifier) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const installationService = new GitHubInstallationService({
|
|
61
|
+
githubClient,
|
|
62
|
+
githubInstallationRepository,
|
|
63
|
+
workspaceRepository: deps.workspaceRepository,
|
|
64
|
+
clock: deps.clock,
|
|
65
|
+
canCreateRepos: deps.canCreateRepos,
|
|
66
|
+
workflowsGranted: deps.workflowsGranted,
|
|
67
|
+
});
|
|
68
|
+
const syncService = new GitHubSyncService({
|
|
69
|
+
githubClient,
|
|
70
|
+
githubInstallationRepository,
|
|
71
|
+
repoProjectionRepository,
|
|
72
|
+
branchProjectionRepository,
|
|
73
|
+
pullRequestProjectionRepository,
|
|
74
|
+
issueProjectionRepository,
|
|
75
|
+
commitProjectionRepository,
|
|
76
|
+
checkRunProjectionRepository,
|
|
77
|
+
clock: deps.clock,
|
|
78
|
+
commitBackfillHorizonMs: deps.commitBackfillHorizonMs,
|
|
79
|
+
});
|
|
80
|
+
const webhookService = new WebhookService({
|
|
81
|
+
githubInstallationRepository,
|
|
82
|
+
repoProjectionRepository,
|
|
83
|
+
branchProjectionRepository,
|
|
84
|
+
pullRequestProjectionRepository,
|
|
85
|
+
issueProjectionRepository,
|
|
86
|
+
commitProjectionRepository,
|
|
87
|
+
checkRunProjectionRepository,
|
|
88
|
+
clock: deps.clock,
|
|
89
|
+
});
|
|
90
|
+
const service = new GitHubService({
|
|
91
|
+
githubClient,
|
|
92
|
+
repoProjectionRepository,
|
|
93
|
+
branchProjectionRepository,
|
|
94
|
+
pullRequestProjectionRepository,
|
|
95
|
+
issueProjectionRepository,
|
|
96
|
+
clock: deps.clock,
|
|
97
|
+
});
|
|
98
|
+
const provisioningService = deps.repoProvisioningClient
|
|
99
|
+
? new RepoProvisioningService({ client: deps.repoProvisioningClient })
|
|
100
|
+
: undefined;
|
|
101
|
+
return {
|
|
102
|
+
installationService,
|
|
103
|
+
syncService,
|
|
104
|
+
webhookService,
|
|
105
|
+
service,
|
|
106
|
+
webhookVerifier,
|
|
107
|
+
provisioningService,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Assemble the document-source module when at least one provider + both
|
|
112
|
+
* repositories are present. The model provider is optional: with it the planner
|
|
113
|
+
* uses an LLM, and without it the deterministic heading parser — so the module
|
|
114
|
+
* stays usable for import/link/spawn even when no LLM is configured.
|
|
115
|
+
*/
|
|
116
|
+
function createDocumentsModule(deps, boardService) {
|
|
117
|
+
const { documentSourceProviders, documentConnectionRepository, documentRepository } = deps;
|
|
118
|
+
if (!documentSourceProviders ||
|
|
119
|
+
documentSourceProviders.length === 0 ||
|
|
120
|
+
!documentConnectionRepository ||
|
|
121
|
+
!documentRepository) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const registry = new MapDocumentSourceRegistry(documentSourceProviders);
|
|
125
|
+
const connectionService = new DocumentConnectionService({
|
|
126
|
+
documentConnectionRepository,
|
|
127
|
+
registry,
|
|
128
|
+
workspaceRepository: deps.workspaceRepository,
|
|
129
|
+
clock: deps.clock,
|
|
130
|
+
});
|
|
131
|
+
const importService = new DocumentImportService({
|
|
132
|
+
registry,
|
|
133
|
+
documentRepository,
|
|
134
|
+
connectionService,
|
|
135
|
+
workspaceRepository: deps.workspaceRepository,
|
|
136
|
+
clock: deps.clock,
|
|
137
|
+
});
|
|
138
|
+
const plannerService = new DocumentPlannerService({
|
|
139
|
+
modelProviderResolver: deps.modelProviderResolver,
|
|
140
|
+
modelProvider: deps.modelProvider,
|
|
141
|
+
modelRef: deps.documentPlannerModel,
|
|
142
|
+
});
|
|
143
|
+
const linkService = new DocumentLinkService({
|
|
144
|
+
boardService,
|
|
145
|
+
blockRepository: deps.blockRepository,
|
|
146
|
+
documentRepository,
|
|
147
|
+
});
|
|
148
|
+
return { connectionService, importService, plannerService, linkService };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Assemble the task-source module when at least one provider + both repositories
|
|
152
|
+
* are present; otherwise return undefined so the feature stays cleanly opt-in.
|
|
153
|
+
* Unlike the documents module there is no planner — issues are linked for
|
|
154
|
+
* context, not expanded into board structure.
|
|
155
|
+
*/
|
|
156
|
+
function createTasksModule(deps, boardService) {
|
|
157
|
+
const { taskSourceProviders, taskConnectionRepository, taskRepository } = deps;
|
|
158
|
+
if (!taskSourceProviders ||
|
|
159
|
+
taskSourceProviders.length === 0 ||
|
|
160
|
+
!taskConnectionRepository ||
|
|
161
|
+
!taskRepository) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const registry = new MapTaskSourceRegistry(taskSourceProviders);
|
|
165
|
+
const connectionService = new TaskConnectionService({
|
|
166
|
+
taskConnectionRepository,
|
|
167
|
+
registry,
|
|
168
|
+
workspaceRepository: deps.workspaceRepository,
|
|
169
|
+
clock: deps.clock,
|
|
170
|
+
});
|
|
171
|
+
const importService = new TaskImportService({
|
|
172
|
+
registry,
|
|
173
|
+
taskRepository,
|
|
174
|
+
connectionService,
|
|
175
|
+
workspaceRepository: deps.workspaceRepository,
|
|
176
|
+
clock: deps.clock,
|
|
177
|
+
});
|
|
178
|
+
const linkService = new TaskLinkService({
|
|
179
|
+
boardService,
|
|
180
|
+
blockRepository: deps.blockRepository,
|
|
181
|
+
taskRepository,
|
|
182
|
+
});
|
|
183
|
+
return { connectionService, importService, linkService };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Assemble the environment integration when its provider, both repositories and
|
|
187
|
+
* the secret cipher are present; otherwise return undefined so the feature stays
|
|
188
|
+
* cleanly opt-in (the deterministic deployer and env discovery in the engine are
|
|
189
|
+
* gated on the provisioning service being wired).
|
|
190
|
+
*/
|
|
191
|
+
function createEnvironmentsModule(deps) {
|
|
192
|
+
const { environmentProvider, environmentConnectionRepository, environmentRegistryRepository, secretCipher, } = deps;
|
|
193
|
+
if (!environmentProvider ||
|
|
194
|
+
!environmentConnectionRepository ||
|
|
195
|
+
!environmentRegistryRepository ||
|
|
196
|
+
!secretCipher) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
const connectionService = new EnvironmentConnectionService({
|
|
200
|
+
environmentConnectionRepository,
|
|
201
|
+
workspaceRepository: deps.workspaceRepository,
|
|
202
|
+
secretCipher,
|
|
203
|
+
clock: deps.clock,
|
|
204
|
+
...(deps.environmentUrlSafetyPolicy ? { urlPolicy: deps.environmentUrlSafetyPolicy } : {}),
|
|
205
|
+
});
|
|
206
|
+
const provisioningService = new EnvironmentProvisioningService({
|
|
207
|
+
connectionService,
|
|
208
|
+
environmentProvider,
|
|
209
|
+
environmentRegistryRepository,
|
|
210
|
+
secretCipher,
|
|
211
|
+
idGenerator: deps.idGenerator,
|
|
212
|
+
clock: deps.clock,
|
|
213
|
+
...(deps.environmentUrlSafetyPolicy ? { urlPolicy: deps.environmentUrlSafetyPolicy } : {}),
|
|
214
|
+
});
|
|
215
|
+
const teardownService = new EnvironmentTeardownService({
|
|
216
|
+
connectionService,
|
|
217
|
+
environmentProvider,
|
|
218
|
+
environmentRegistryRepository,
|
|
219
|
+
secretCipher,
|
|
220
|
+
clock: deps.clock,
|
|
221
|
+
});
|
|
222
|
+
return { connectionService, provisioningService, teardownService };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Assemble the self-hosted runner-pool module when its connection repository and
|
|
226
|
+
* the secret cipher are present; otherwise return undefined so the feature stays
|
|
227
|
+
* cleanly opt-in. Per-tenant scheduler-API secrets are encrypted via the cipher.
|
|
228
|
+
*/
|
|
229
|
+
function createRunnersModule(deps) {
|
|
230
|
+
const { runnerPoolConnectionRepository, runnerSecretCipher } = deps;
|
|
231
|
+
if (!runnerPoolConnectionRepository || !runnerSecretCipher)
|
|
232
|
+
return undefined;
|
|
233
|
+
const connectionService = new RunnerPoolConnectionService({
|
|
234
|
+
runnerPoolConnectionRepository,
|
|
235
|
+
workspaceRepository: deps.workspaceRepository,
|
|
236
|
+
secretCipher: runnerSecretCipher,
|
|
237
|
+
clock: deps.clock,
|
|
238
|
+
...(deps.runnerUrlSafetyPolicy ? { urlPolicy: deps.runnerUrlSafetyPolicy } : {}),
|
|
239
|
+
});
|
|
240
|
+
return { connectionService };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Assemble the repo-bootstrap module when both its repositories are present (the
|
|
244
|
+
* worker wires them unconditionally). The `repoBootstrapper` is passed through
|
|
245
|
+
* but optional: the service exposes CRUD regardless and only gates the run path
|
|
246
|
+
* on its presence.
|
|
247
|
+
*/
|
|
248
|
+
function createBootstrapModule(deps, eventPublisher, onBootstrapSucceeded) {
|
|
249
|
+
const { referenceArchitectureRepository, bootstrapJobRepository } = deps;
|
|
250
|
+
if (!referenceArchitectureRepository || !bootstrapJobRepository)
|
|
251
|
+
return undefined;
|
|
252
|
+
const service = new BootstrapService({
|
|
253
|
+
referenceArchitectureRepository,
|
|
254
|
+
bootstrapJobRepository,
|
|
255
|
+
workspaceRepository: deps.workspaceRepository,
|
|
256
|
+
blockRepository: deps.blockRepository,
|
|
257
|
+
serviceRepository: deps.serviceRepository,
|
|
258
|
+
workspaceMountRepository: deps.workspaceMountRepository,
|
|
259
|
+
serviceFragmentDefaultsRepository: deps.serviceFragmentDefaultsRepository,
|
|
260
|
+
idGenerator: deps.idGenerator,
|
|
261
|
+
clock: deps.clock,
|
|
262
|
+
repoBootstrapper: deps.repoBootstrapper,
|
|
263
|
+
bootstrapRunner: deps.bootstrapRunner,
|
|
264
|
+
eventPublisher,
|
|
265
|
+
...(onBootstrapSucceeded ? { onBootstrapSucceeded } : {}),
|
|
266
|
+
});
|
|
267
|
+
return { service };
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Assemble the requirements-review module when its repository is present (the
|
|
271
|
+
* worker wires it unconditionally). The model provider/ref are optional within
|
|
272
|
+
* the module — reads work without them and the run paths surface a clear error —
|
|
273
|
+
* and the document/task repositories are reused, when wired, to fold linked PRDs
|
|
274
|
+
* and tracker issues into the reviewed requirements.
|
|
275
|
+
*/
|
|
276
|
+
function createRequirementsModule(deps, notificationService) {
|
|
277
|
+
const { requirementReviewRepository } = deps;
|
|
278
|
+
if (!requirementReviewRepository)
|
|
279
|
+
return undefined;
|
|
280
|
+
const service = new RequirementReviewService({
|
|
281
|
+
requirementReviewRepository,
|
|
282
|
+
blockRepository: deps.blockRepository,
|
|
283
|
+
idGenerator: deps.idGenerator,
|
|
284
|
+
clock: deps.clock,
|
|
285
|
+
// Tell product people + the task creator to react to a review's findings (when
|
|
286
|
+
// the notifications subsystem is wired). Best-effort; absent → no notification.
|
|
287
|
+
notificationService,
|
|
288
|
+
modelProviderResolver: deps.modelProviderResolver,
|
|
289
|
+
modelProvider: deps.modelProvider,
|
|
290
|
+
// The dedicated reviewer ref, else the document planner's (both the agents' default).
|
|
291
|
+
modelRef: deps.requirementReviewModel ?? deps.documentPlannerModel,
|
|
292
|
+
// Honour a block's pinned model with the direct/Cloudflare fallback, like the executor.
|
|
293
|
+
resolveBlockModel: deps.requirementReviewResolveModel,
|
|
294
|
+
// Honour the workspace's per-kind default for the `requirements` kind too, so the
|
|
295
|
+
// reviewer resolves its model exactly like a pipeline step. Reuses the already
|
|
296
|
+
// wired model-defaults repository; absent → only block-pin + routing default.
|
|
297
|
+
resolveWorkspaceModelDefault: deps.modelDefaultsRepository
|
|
298
|
+
? (workspaceId, agentKind) => deps
|
|
299
|
+
.modelDefaultsRepository.getForKind(workspaceId, agentKind)
|
|
300
|
+
.then((v) => v ?? undefined)
|
|
301
|
+
: undefined,
|
|
302
|
+
documentRepository: deps.documentRepository,
|
|
303
|
+
taskRepository: deps.taskRepository,
|
|
304
|
+
});
|
|
305
|
+
return { service };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Assemble the clarity-review module when its repository is present (both runtime facades
|
|
309
|
+
* wire it unconditionally). Mirrors {@link createRequirementsModule}: it reuses the
|
|
310
|
+
* requirements reviewer's model config (the same routing default) since both reviewers
|
|
311
|
+
* resolve their model identically.
|
|
312
|
+
*/
|
|
313
|
+
function createClarityModule(deps, notificationService) {
|
|
314
|
+
const { clarityReviewRepository } = deps;
|
|
315
|
+
if (!clarityReviewRepository)
|
|
316
|
+
return undefined;
|
|
317
|
+
const service = new ClarityReviewService({
|
|
318
|
+
clarityReviewRepository,
|
|
319
|
+
blockRepository: deps.blockRepository,
|
|
320
|
+
idGenerator: deps.idGenerator,
|
|
321
|
+
clock: deps.clock,
|
|
322
|
+
notificationService,
|
|
323
|
+
modelProviderResolver: deps.modelProviderResolver,
|
|
324
|
+
modelProvider: deps.modelProvider,
|
|
325
|
+
modelRef: deps.requirementReviewModel ?? deps.documentPlannerModel,
|
|
326
|
+
resolveBlockModel: deps.requirementReviewResolveModel,
|
|
327
|
+
resolveWorkspaceModelDefault: deps.modelDefaultsRepository
|
|
328
|
+
? (workspaceId, agentKind) => deps
|
|
329
|
+
.modelDefaultsRepository.getForKind(workspaceId, agentKind)
|
|
330
|
+
.then((v) => v ?? undefined)
|
|
331
|
+
: undefined,
|
|
332
|
+
});
|
|
333
|
+
return { service };
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Assemble the prompt-fragment library when its fragment repository is present.
|
|
337
|
+
* The library service (CRUD + the per-run catalog resolver) always assembles;
|
|
338
|
+
* the repo-source service additionally needs the GitHub client, the source
|
|
339
|
+
* repository and an installation resolver. The selector is optional — absent it
|
|
340
|
+
* falls back to deterministic matching. Returns undefined so the feature stays
|
|
341
|
+
* cleanly opt-in (the engine then uses the block's manual fragmentIds).
|
|
342
|
+
*/
|
|
343
|
+
function createFragmentLibraryModule(deps) {
|
|
344
|
+
const { promptFragmentRepository } = deps;
|
|
345
|
+
if (!promptFragmentRepository)
|
|
346
|
+
return undefined;
|
|
347
|
+
const libraryService = new FragmentLibraryService({
|
|
348
|
+
promptFragmentRepository,
|
|
349
|
+
workspaceRepository: deps.workspaceRepository,
|
|
350
|
+
clock: deps.clock,
|
|
351
|
+
selector: deps.fragmentSelector,
|
|
352
|
+
});
|
|
353
|
+
const sourceService = deps.fragmentSourceRepository && deps.githubClient && deps.resolveFragmentInstallationId
|
|
354
|
+
? new FragmentSourceService({
|
|
355
|
+
fragmentSourceRepository: deps.fragmentSourceRepository,
|
|
356
|
+
promptFragmentRepository,
|
|
357
|
+
githubClient: deps.githubClient,
|
|
358
|
+
resolveInstallationId: deps.resolveFragmentInstallationId,
|
|
359
|
+
idGenerator: deps.idGenerator,
|
|
360
|
+
clock: deps.clock,
|
|
361
|
+
})
|
|
362
|
+
: undefined;
|
|
363
|
+
return { libraryService, sourceService };
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Assemble the notifications module when its repository is present (the worker
|
|
367
|
+
* wires it unconditionally). The delivery channel is optional within the module —
|
|
368
|
+
* without it the rows still persist (the inbox + snapshot work) but nothing is
|
|
369
|
+
* pushed; the worker wires the in-app channel, and email/Slack compose in later.
|
|
370
|
+
*/
|
|
371
|
+
function createNotificationsModule(deps) {
|
|
372
|
+
const { notificationRepository } = deps;
|
|
373
|
+
if (!notificationRepository)
|
|
374
|
+
return undefined;
|
|
375
|
+
const service = new NotificationService({
|
|
376
|
+
notificationRepository,
|
|
377
|
+
workspaceRepository: deps.workspaceRepository,
|
|
378
|
+
idGenerator: deps.idGenerator,
|
|
379
|
+
clock: deps.clock,
|
|
380
|
+
channel: deps.notificationChannel,
|
|
381
|
+
});
|
|
382
|
+
return { service };
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Assemble the Slack integration module when its three repositories and the
|
|
386
|
+
* secret cipher are present. Powers the management API (connect/settings/member
|
|
387
|
+
* map); the actual Slack delivery is a `notificationChannel` composed in by the
|
|
388
|
+
* facade. OAuth is optional — manual-token onboarding works without it.
|
|
389
|
+
*/
|
|
390
|
+
function createSlackModule(deps) {
|
|
391
|
+
const { slackConnectionRepository, slackSettingsRepository, slackMemberMappingRepository, slackSecretCipher, } = deps;
|
|
392
|
+
if (!slackConnectionRepository ||
|
|
393
|
+
!slackSettingsRepository ||
|
|
394
|
+
!slackMemberMappingRepository ||
|
|
395
|
+
!slackSecretCipher) {
|
|
396
|
+
return undefined;
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
connectionService: new SlackConnectionService({
|
|
400
|
+
slackConnectionRepository,
|
|
401
|
+
workspaceRepository: deps.workspaceRepository,
|
|
402
|
+
secretCipher: slackSecretCipher,
|
|
403
|
+
clock: deps.clock,
|
|
404
|
+
oauth: deps.slackOAuth,
|
|
405
|
+
}),
|
|
406
|
+
settingsService: new SlackSettingsService({
|
|
407
|
+
slackSettingsRepository,
|
|
408
|
+
workspaceRepository: deps.workspaceRepository,
|
|
409
|
+
clock: deps.clock,
|
|
410
|
+
}),
|
|
411
|
+
memberMappingService: new SlackMemberMappingService({
|
|
412
|
+
slackMemberMappingRepository,
|
|
413
|
+
workspaceRepository: deps.workspaceRepository,
|
|
414
|
+
clock: deps.clock,
|
|
415
|
+
}),
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
/** Assemble the merge-preset module when its repository is present. */
|
|
419
|
+
function createMergePresetsModule(deps) {
|
|
420
|
+
const { mergePresetRepository } = deps;
|
|
421
|
+
if (!mergePresetRepository)
|
|
422
|
+
return undefined;
|
|
423
|
+
const service = new MergePresetService({
|
|
424
|
+
mergePresetRepository,
|
|
425
|
+
workspaceRepository: deps.workspaceRepository,
|
|
426
|
+
idGenerator: deps.idGenerator,
|
|
427
|
+
clock: deps.clock,
|
|
428
|
+
});
|
|
429
|
+
return { service };
|
|
430
|
+
}
|
|
431
|
+
/** Assemble the workspace-settings module when its repository is present. */
|
|
432
|
+
function createWorkspaceSettingsModule(deps) {
|
|
433
|
+
const { workspaceSettingsRepository } = deps;
|
|
434
|
+
if (!workspaceSettingsRepository)
|
|
435
|
+
return undefined;
|
|
436
|
+
const service = new WorkspaceSettingsService({
|
|
437
|
+
workspaceSettingsRepository,
|
|
438
|
+
workspaceRepository: deps.workspaceRepository,
|
|
439
|
+
});
|
|
440
|
+
return { service };
|
|
441
|
+
}
|
|
442
|
+
/** Assemble the release-health (Datadog) module when its repos + cipher are present. */
|
|
443
|
+
function createReleaseHealthModule(deps) {
|
|
444
|
+
const { datadogConnectionRepository, releaseHealthConfigRepository, datadogSecretCipher } = deps;
|
|
445
|
+
if (!datadogConnectionRepository || !releaseHealthConfigRepository || !datadogSecretCipher) {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
const service = new ReleaseHealthService({
|
|
449
|
+
datadogConnectionRepository,
|
|
450
|
+
releaseHealthConfigRepository,
|
|
451
|
+
datadogSecretCipher,
|
|
452
|
+
workspaceRepository: deps.workspaceRepository,
|
|
453
|
+
blockRepository: deps.blockRepository,
|
|
454
|
+
clock: deps.clock,
|
|
455
|
+
});
|
|
456
|
+
return { service };
|
|
457
|
+
}
|
|
458
|
+
/** Assemble the model-defaults module when its repository is present. */
|
|
459
|
+
function createModelDefaultsModule(deps) {
|
|
460
|
+
const { modelDefaultsRepository } = deps;
|
|
461
|
+
if (!modelDefaultsRepository)
|
|
462
|
+
return undefined;
|
|
463
|
+
const service = new ModelDefaultsService({
|
|
464
|
+
modelDefaultsRepository,
|
|
465
|
+
workspaceRepository: deps.workspaceRepository,
|
|
466
|
+
});
|
|
467
|
+
return { service };
|
|
468
|
+
}
|
|
469
|
+
/** Assemble the service-fragment-defaults module when its repository is present. */
|
|
470
|
+
function createServiceFragmentDefaultsModule(deps) {
|
|
471
|
+
const { serviceFragmentDefaultsRepository } = deps;
|
|
472
|
+
if (!serviceFragmentDefaultsRepository)
|
|
473
|
+
return undefined;
|
|
474
|
+
const service = new ServiceFragmentDefaultsService({
|
|
475
|
+
serviceFragmentDefaultsRepository,
|
|
476
|
+
workspaceRepository: deps.workspaceRepository,
|
|
477
|
+
});
|
|
478
|
+
return { service };
|
|
479
|
+
}
|
|
480
|
+
/** Assemble the tracker-settings module when its repository is present. */
|
|
481
|
+
function createTrackerModule(deps) {
|
|
482
|
+
const { trackerSettingsRepository } = deps;
|
|
483
|
+
if (!trackerSettingsRepository)
|
|
484
|
+
return undefined;
|
|
485
|
+
const service = new TrackerSettingsService({
|
|
486
|
+
trackerSettingsRepository,
|
|
487
|
+
workspaceRepository: deps.workspaceRepository,
|
|
488
|
+
clock: deps.clock,
|
|
489
|
+
});
|
|
490
|
+
return { service };
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Assemble the recurring-pipeline module when its repository is present. Built
|
|
494
|
+
* after the execution engine since each fire starts a pipeline through it.
|
|
495
|
+
*/
|
|
496
|
+
function createRecurringModule(deps, executionService) {
|
|
497
|
+
const { pipelineScheduleRepository } = deps;
|
|
498
|
+
if (!pipelineScheduleRepository)
|
|
499
|
+
return undefined;
|
|
500
|
+
const service = new RecurringPipelineService({
|
|
501
|
+
pipelineScheduleRepository,
|
|
502
|
+
workspaceRepository: deps.workspaceRepository,
|
|
503
|
+
pipelineRepository: deps.pipelineRepository,
|
|
504
|
+
blockRepository: deps.blockRepository,
|
|
505
|
+
executionRepository: deps.executionRepository,
|
|
506
|
+
executionService,
|
|
507
|
+
idGenerator: deps.idGenerator,
|
|
508
|
+
clock: deps.clock,
|
|
509
|
+
serviceRepository: deps.serviceRepository,
|
|
510
|
+
workspaceMountRepository: deps.workspaceMountRepository,
|
|
511
|
+
});
|
|
512
|
+
return { service };
|
|
513
|
+
}
|
|
514
|
+
export function createCore(dependencies) {
|
|
515
|
+
const workRunner = dependencies.workRunner ?? new NoopWorkRunner();
|
|
516
|
+
const executionEventPublisher = dependencies.executionEventPublisher ?? new NoopEventPublisher();
|
|
517
|
+
const boardService = new BoardService(dependencies);
|
|
518
|
+
const workspaceService = new WorkspaceService(dependencies);
|
|
519
|
+
const accountService = new AccountService({
|
|
520
|
+
accountRepository: dependencies.accountRepository,
|
|
521
|
+
membershipRepository: dependencies.membershipRepository,
|
|
522
|
+
userRepository: dependencies.userRepository,
|
|
523
|
+
idGenerator: dependencies.idGenerator,
|
|
524
|
+
clock: dependencies.clock,
|
|
525
|
+
});
|
|
526
|
+
const userService = new UserService({
|
|
527
|
+
userRepository: dependencies.userRepository,
|
|
528
|
+
passwordHasher: dependencies.passwordHasher,
|
|
529
|
+
idGenerator: dependencies.idGenerator,
|
|
530
|
+
clock: dependencies.clock,
|
|
531
|
+
});
|
|
532
|
+
const email = dependencies.emailConnectionRepository && dependencies.emailSecretCipher
|
|
533
|
+
? new EmailConnectionService({
|
|
534
|
+
emailConnectionRepository: dependencies.emailConnectionRepository,
|
|
535
|
+
secretCipher: dependencies.emailSecretCipher,
|
|
536
|
+
clock: dependencies.clock,
|
|
537
|
+
})
|
|
538
|
+
: undefined;
|
|
539
|
+
const invitations = dependencies.invitationRepository
|
|
540
|
+
? new InvitationService({
|
|
541
|
+
invitationRepository: dependencies.invitationRepository,
|
|
542
|
+
accountRepository: dependencies.accountRepository,
|
|
543
|
+
membershipRepository: dependencies.membershipRepository,
|
|
544
|
+
idGenerator: dependencies.idGenerator,
|
|
545
|
+
clock: dependencies.clock,
|
|
546
|
+
// Resolve the inviting account's own (DB-stored) email sender at send time.
|
|
547
|
+
resolveEmailSender: email ? (accountId) => email.resolveSender(accountId) : undefined,
|
|
548
|
+
appBaseUrl: dependencies.appBaseUrl,
|
|
549
|
+
})
|
|
550
|
+
: undefined;
|
|
551
|
+
const pipelineService = new PipelineService(dependencies);
|
|
552
|
+
const spendService = new SpendService({
|
|
553
|
+
tokenUsageRepository: dependencies.tokenUsageRepository,
|
|
554
|
+
idGenerator: dependencies.idGenerator,
|
|
555
|
+
clock: dependencies.clock,
|
|
556
|
+
pricing: dependencies.spendPricing ?? DEFAULT_SPEND_PRICING,
|
|
557
|
+
});
|
|
558
|
+
const llmObservability = dependencies.llmCallMetricRepository
|
|
559
|
+
? new LlmObservabilityService({
|
|
560
|
+
llmCallMetricRepository: dependencies.llmCallMetricRepository,
|
|
561
|
+
idGenerator: dependencies.idGenerator,
|
|
562
|
+
clock: dependencies.clock,
|
|
563
|
+
recordPrompts: dependencies.recordLlmPrompts ?? true,
|
|
564
|
+
traceSink: dependencies.llmTraceSink,
|
|
565
|
+
})
|
|
566
|
+
: undefined;
|
|
567
|
+
const environments = createEnvironmentsModule(dependencies);
|
|
568
|
+
const fragmentLibrary = createFragmentLibraryModule(dependencies);
|
|
569
|
+
// Reconciles a `blueprints` step's decomposition onto the board. Needs only the
|
|
570
|
+
// board service + block repository (both always present), so it is wired
|
|
571
|
+
// unconditionally — there is no standalone scan command or persisted blueprint store.
|
|
572
|
+
const blueprintReconciler = new BoardScanService({
|
|
573
|
+
boardService,
|
|
574
|
+
blockRepository: dependencies.blockRepository,
|
|
575
|
+
});
|
|
576
|
+
// Built before the execution engine so it can raise merge-review / CI-failed /
|
|
577
|
+
// pipeline-complete notifications during a run (when the module is configured).
|
|
578
|
+
const notifications = createNotificationsModule(dependencies);
|
|
579
|
+
const slack = createSlackModule(dependencies);
|
|
580
|
+
const mergePresets = createMergePresetsModule(dependencies);
|
|
581
|
+
// Built before the execution engine so the per-service running-task limit can be
|
|
582
|
+
// enforced at start() (and the escalation sweep can read the waiting threshold).
|
|
583
|
+
const settings = createWorkspaceSettingsModule(dependencies);
|
|
584
|
+
const releaseHealth = createReleaseHealthModule(dependencies);
|
|
585
|
+
const modelDefaults = createModelDefaultsModule(dependencies);
|
|
586
|
+
const serviceFragmentDefaults = createServiceFragmentDefaultsModule(dependencies);
|
|
587
|
+
// Built before the execution engine so the special `requirements-review` gate step can
|
|
588
|
+
// drive the inline reviewer + the iterative answer → incorporate → re-review loop.
|
|
589
|
+
const requirements = createRequirementsModule(dependencies, notifications?.service);
|
|
590
|
+
const clarity = createClarityModule(dependencies, notifications?.service);
|
|
591
|
+
const executionService = new ExecutionService({
|
|
592
|
+
...dependencies,
|
|
593
|
+
workRunner,
|
|
594
|
+
executionEventPublisher,
|
|
595
|
+
boardService,
|
|
596
|
+
spendService,
|
|
597
|
+
requirementReviewService: requirements?.service,
|
|
598
|
+
clarityReviewService: clarity?.service,
|
|
599
|
+
environmentProvisioning: environments?.provisioningService,
|
|
600
|
+
blueprintReconciler,
|
|
601
|
+
notificationService: notifications?.service,
|
|
602
|
+
workspaceSettingsService: settings?.service,
|
|
603
|
+
llmObservability,
|
|
604
|
+
ticketTrackerProvider: dependencies.ticketTrackerProvider,
|
|
605
|
+
// Let the personal-credential gate resolve the workspace per-kind default model the
|
|
606
|
+
// same way dispatch does, so a run whose block has no pin but an individual-usage
|
|
607
|
+
// workspace default is still gated up-front. Reuses the model-defaults repository.
|
|
608
|
+
resolveWorkspaceModelDefault: dependencies.modelDefaultsRepository
|
|
609
|
+
? (workspaceId, agentKind) => dependencies
|
|
610
|
+
.modelDefaultsRepository.getForKind(workspaceId, agentKind)
|
|
611
|
+
.then((v) => v ?? undefined)
|
|
612
|
+
: undefined,
|
|
613
|
+
});
|
|
614
|
+
const github = createGitHubModule(dependencies);
|
|
615
|
+
const documents = createDocumentsModule(dependencies, boardService);
|
|
616
|
+
const tasks = createTasksModule(dependencies, boardService);
|
|
617
|
+
const runners = createRunnersModule(dependencies);
|
|
618
|
+
// After a bootstrap succeeds, map the new repo into a blueprint + the board by
|
|
619
|
+
// starting the blueprint-only pipeline against the service frame.
|
|
620
|
+
const bootstrap = createBootstrapModule(dependencies, executionEventPublisher, (ws, blockId) => executionService.start(ws, blockId, BLUEPRINT_PIPELINE_ID).then(() => undefined));
|
|
621
|
+
const tracker = createTrackerModule(dependencies);
|
|
622
|
+
const recurring = createRecurringModule(dependencies, executionService);
|
|
623
|
+
const services = createServicesModule(dependencies);
|
|
624
|
+
return {
|
|
625
|
+
workspaceService,
|
|
626
|
+
accountService,
|
|
627
|
+
userService,
|
|
628
|
+
...(invitations ? { invitations } : {}),
|
|
629
|
+
...(email ? { email } : {}),
|
|
630
|
+
boardService,
|
|
631
|
+
pipelineService,
|
|
632
|
+
executionService,
|
|
633
|
+
spendService,
|
|
634
|
+
executionEventPublisher,
|
|
635
|
+
...(llmObservability ? { llmObservability } : {}),
|
|
636
|
+
...(github ? { github } : {}),
|
|
637
|
+
...(documents ? { documents } : {}),
|
|
638
|
+
...(tasks ? { tasks } : {}),
|
|
639
|
+
...(environments ? { environments } : {}),
|
|
640
|
+
...(runners ? { runners } : {}),
|
|
641
|
+
...(bootstrap ? { bootstrap } : {}),
|
|
642
|
+
...(requirements ? { requirements } : {}),
|
|
643
|
+
...(clarity ? { clarity } : {}),
|
|
644
|
+
...(notifications ? { notifications } : {}),
|
|
645
|
+
...(slack ? { slack } : {}),
|
|
646
|
+
...(mergePresets ? { mergePresets } : {}),
|
|
647
|
+
...(settings ? { settings } : {}),
|
|
648
|
+
...(releaseHealth ? { releaseHealth } : {}),
|
|
649
|
+
...(modelDefaults ? { modelDefaults } : {}),
|
|
650
|
+
...(serviceFragmentDefaults ? { serviceFragmentDefaults } : {}),
|
|
651
|
+
...(fragmentLibrary ? { fragmentLibrary } : {}),
|
|
652
|
+
...(recurring ? { recurring } : {}),
|
|
653
|
+
...(tracker ? { tracker } : {}),
|
|
654
|
+
...(services ? { services } : {}),
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
//# sourceMappingURL=container.js.map
|