@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 @@
|
|
|
1
|
+
{"version":3,"file":"BoardScanService.d.ts","sourceRoot":"","sources":["../../../src/modules/boardScan/BoardScanService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAgB5D,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,YAAY,CAAA;IAC1B,mFAAmF;IACnF,eAAe,EAAE,eAAe,CAAA;CACjC;AAOD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,4BAA4B,EAAI;IAEnE;;;;;;OAMG;YACW,cAAc;IA6B5B;;;;;;;;;;OAUG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAiC/B;IAED,2EAA2E;IAC3E,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAEpD;CACF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { countModules, describeNode } from './board-scan.logic.js';
|
|
2
|
+
/** Case-insensitive, whitespace-tolerant name match used to pair board ↔ blueprint nodes. */
|
|
3
|
+
function sameName(a, b) {
|
|
4
|
+
return a.trim().toLowerCase() === b.trim().toLowerCase();
|
|
5
|
+
}
|
|
6
|
+
export class BoardScanService {
|
|
7
|
+
deps;
|
|
8
|
+
constructor(deps) {
|
|
9
|
+
this.deps = deps;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Materialise a blueprint onto the board: one service frame and a module per
|
|
13
|
+
* blueprint module — each carrying the node's summary and codebase references in
|
|
14
|
+
* its description, so the board mirrors the map. Tasks are authored by people, so
|
|
15
|
+
* the spawn never creates them. Used as the fallback when a reconcile target frame
|
|
16
|
+
* can't be resolved.
|
|
17
|
+
*/
|
|
18
|
+
async spawnBlueprint(workspaceId, service) {
|
|
19
|
+
const frame = await this.deps.boardService.addFrame(workspaceId, {
|
|
20
|
+
type: service.type,
|
|
21
|
+
position: { x: 80, y: 80 },
|
|
22
|
+
});
|
|
23
|
+
await this.deps.boardService.updateBlock(workspaceId, frame.id, {
|
|
24
|
+
title: service.name,
|
|
25
|
+
description: describeNode(service.summary, service.references),
|
|
26
|
+
});
|
|
27
|
+
let modules = 0;
|
|
28
|
+
for (const planModule of service.modules ?? []) {
|
|
29
|
+
const module = await this.deps.boardService.addModule(workspaceId, frame.id, {
|
|
30
|
+
name: planModule.name,
|
|
31
|
+
});
|
|
32
|
+
modules += 1;
|
|
33
|
+
const moduleDescription = describeNode(planModule.summary, planModule.references);
|
|
34
|
+
if (moduleDescription) {
|
|
35
|
+
await this.deps.boardService.updateBlock(workspaceId, module.id, {
|
|
36
|
+
description: moduleDescription,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { frameId: frame.id, modules };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reconcile a blueprint onto an **existing** service frame, in place and without
|
|
44
|
+
* deleting anything: the frame's modules are matched to the blueprint by name
|
|
45
|
+
* (case-insensitive), missing modules are added, and matched modules have their
|
|
46
|
+
* summary/code-reference description refreshed. Human-added blocks and the tasks
|
|
47
|
+
* inside modules are left untouched — so re-running the Blueprinter after each
|
|
48
|
+
* implementation keeps the map current without clobbering authored work.
|
|
49
|
+
*
|
|
50
|
+
* When `frameId` does not resolve to a frame (e.g. the repo isn't on the board
|
|
51
|
+
* yet) it falls back to {@link spawnBlueprint}, creating a fresh structure.
|
|
52
|
+
*/
|
|
53
|
+
async reconcileBlueprint(workspaceId, frameId, service) {
|
|
54
|
+
const blocks = await this.deps.blockRepository.listByWorkspace(workspaceId);
|
|
55
|
+
const frame = frameId ? blocks.find((b) => b.id === frameId && b.level === 'frame') : undefined;
|
|
56
|
+
if (!frame)
|
|
57
|
+
return this.spawnBlueprint(workspaceId, service);
|
|
58
|
+
// Refresh the frame's description (its summary/entrypoints) but keep the title,
|
|
59
|
+
// which a human may have renamed.
|
|
60
|
+
const frameDescription = describeNode(service.summary, service.references);
|
|
61
|
+
if (frameDescription && frameDescription !== frame.description) {
|
|
62
|
+
await this.deps.boardService.updateBlock(workspaceId, frame.id, {
|
|
63
|
+
description: frameDescription,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const moduleBlocks = blocks.filter((b) => b.parentId === frame.id && b.level === 'module');
|
|
67
|
+
let modules = 0;
|
|
68
|
+
for (const planModule of service.modules ?? []) {
|
|
69
|
+
let moduleBlock = moduleBlocks.find((b) => sameName(b.title, planModule.name));
|
|
70
|
+
if (!moduleBlock) {
|
|
71
|
+
moduleBlock = await this.deps.boardService.addModule(workspaceId, frame.id, {
|
|
72
|
+
name: planModule.name,
|
|
73
|
+
});
|
|
74
|
+
moduleBlocks.push(moduleBlock);
|
|
75
|
+
}
|
|
76
|
+
modules += 1;
|
|
77
|
+
const moduleDescription = describeNode(planModule.summary, planModule.references);
|
|
78
|
+
if (moduleDescription && moduleDescription !== moduleBlock.description) {
|
|
79
|
+
await this.deps.boardService.updateBlock(workspaceId, moduleBlock.id, {
|
|
80
|
+
description: moduleDescription,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { frameId: frame.id, modules };
|
|
85
|
+
}
|
|
86
|
+
/** Convenience for callers/tests: the module count a blueprint implies. */
|
|
87
|
+
static moduleCount(service) {
|
|
88
|
+
return countModules(service);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=BoardScanService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoardScanService.js","sourceRoot":"","sources":["../../../src/modules/boardScan/BoardScanService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BlueprintService } from '@cat-factory/kernel';
|
|
2
|
+
/** Module count for a service — the structural size of the map. */
|
|
3
|
+
export declare function countModules(service: BlueprintService): number;
|
|
4
|
+
/**
|
|
5
|
+
* Render a node's summary and codebase references into a board block description.
|
|
6
|
+
* The references are emitted under a stable `Code references:` marker so an agent
|
|
7
|
+
* scoping later work can parse exactly which files a frame/module/task maps to.
|
|
8
|
+
*/
|
|
9
|
+
export declare function describeNode(summary: string | undefined, references: string[] | undefined): string;
|
|
10
|
+
//# sourceMappingURL=board-scan.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-scan.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/boardScan/board-scan.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAS3D,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAC/B,MAAM,CAQR"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Pure helpers for reconciling a service blueprint onto the board — no IO, no
|
|
2
|
+
// ports. They render a node's codebase references into the parseable form the board
|
|
3
|
+
// embeds in block descriptions and count a tree's modules. Keeping them pure makes
|
|
4
|
+
// reconciliation deterministic and trivially testable without a repo or an LLM.
|
|
5
|
+
// (Coercion of the agent's raw JSON lives in the executor harness, which validates
|
|
6
|
+
// and renders the tree before it ever reaches the engine.)
|
|
7
|
+
/** Module count for a service — the structural size of the map. */
|
|
8
|
+
export function countModules(service) {
|
|
9
|
+
return (service.modules ?? []).length;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Render a node's summary and codebase references into a board block description.
|
|
13
|
+
* The references are emitted under a stable `Code references:` marker so an agent
|
|
14
|
+
* scoping later work can parse exactly which files a frame/module/task maps to.
|
|
15
|
+
*/
|
|
16
|
+
export function describeNode(summary, references) {
|
|
17
|
+
const parts = [];
|
|
18
|
+
const trimmed = summary?.trim();
|
|
19
|
+
if (trimmed)
|
|
20
|
+
parts.push(trimmed);
|
|
21
|
+
if (references && references.length > 0) {
|
|
22
|
+
parts.push(['Code references:', ...references.map((r) => `- ${r}`)].join('\n'));
|
|
23
|
+
}
|
|
24
|
+
return parts.join('\n\n');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=board-scan.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-scan.logic.js","sourceRoot":"","sources":["../../../src/modules/boardScan/board-scan.logic.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,oFAAoF;AACpF,mFAAmF;AACnF,gFAAgF;AAChF,mFAAmF;AACnF,2DAA2D;AAE3D,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA2B,EAC3B,UAAgC;IAEhC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,CAAA;IAC/B,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { BootstrapFailureKind, BootstrapJob, BootstrapRepoInput, CreateReferenceArchitectureInput, ReferenceArchitecture, UpdateReferenceArchitectureInput } from '@cat-factory/kernel';
|
|
2
|
+
import type { Clock, IdGenerator } from '@cat-factory/kernel';
|
|
3
|
+
import type { BlockRepository, ServiceFragmentDefaultsRepository, ServiceRepository, WorkspaceMountRepository, WorkspaceRepository } from '@cat-factory/kernel';
|
|
4
|
+
import type { BootstrapJobRepository, ReferenceArchitectureRepository } from '@cat-factory/kernel';
|
|
5
|
+
import type { RepoBootstrapper } from '@cat-factory/kernel';
|
|
6
|
+
import type { BootstrapRunner } from '@cat-factory/kernel';
|
|
7
|
+
import type { ExecutionEventPublisher } from '@cat-factory/kernel';
|
|
8
|
+
/** The poll's terminal-ness, returned to the durable driver so it knows when to stop. */
|
|
9
|
+
export interface BootstrapPollResult {
|
|
10
|
+
state: 'running' | 'done' | 'failed';
|
|
11
|
+
/** Present when `state === 'failed'`. */
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface BootstrapServiceDependencies {
|
|
15
|
+
referenceArchitectureRepository: ReferenceArchitectureRepository;
|
|
16
|
+
bootstrapJobRepository: BootstrapJobRepository;
|
|
17
|
+
workspaceRepository: WorkspaceRepository;
|
|
18
|
+
/** Board blocks: a bootstrap materialises a provisional service frame up front. */
|
|
19
|
+
blockRepository: BlockRepository;
|
|
20
|
+
/**
|
|
21
|
+
* In-org shared services. When wired, the provisional service frame is registered as an
|
|
22
|
+
* account-owned service + mount (so a bootstrapped service is shareable like any other), and
|
|
23
|
+
* `listJobs` surfaces a shared service's in-flight bootstrap on every board that mounts it.
|
|
24
|
+
*/
|
|
25
|
+
serviceRepository?: ServiceRepository;
|
|
26
|
+
workspaceMountRepository?: WorkspaceMountRepository;
|
|
27
|
+
/**
|
|
28
|
+
* The workspace's default service-fragment selection. When wired, the provisional
|
|
29
|
+
* service frame inherits the workspace default onto its `serviceFragmentIds`, so a
|
|
30
|
+
* bootstrapped service starts with the org's standards like any other new service.
|
|
31
|
+
*/
|
|
32
|
+
serviceFragmentDefaultsRepository?: ServiceFragmentDefaultsRepository;
|
|
33
|
+
idGenerator: IdGenerator;
|
|
34
|
+
clock: Clock;
|
|
35
|
+
/** Performs the side-effecting pre-flight + container bootstrap; optional. */
|
|
36
|
+
repoBootstrapper?: RepoBootstrapper;
|
|
37
|
+
/** Durably drives the run's poll loop; optional (tests poll directly). */
|
|
38
|
+
bootstrapRunner?: BootstrapRunner;
|
|
39
|
+
/** Pushes live bootstrap progress / board changes to subscribed clients. */
|
|
40
|
+
eventPublisher?: ExecutionEventPublisher;
|
|
41
|
+
/**
|
|
42
|
+
* Optional: invoked (best-effort) after a bootstrap succeeds and its repo is
|
|
43
|
+
* linked to the service frame, to kick off the initial blueprint run that maps
|
|
44
|
+
* the freshly bootstrapped repo and populates the board. Wired to start the
|
|
45
|
+
* blueprint-only pipeline; absent in tests / when blueprints aren't configured.
|
|
46
|
+
*/
|
|
47
|
+
onBootstrapSucceeded?: (workspaceId: string, blockId: string) => Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare class BootstrapService {
|
|
50
|
+
private readonly deps;
|
|
51
|
+
constructor(deps: BootstrapServiceDependencies);
|
|
52
|
+
/** True when a bootstrap run can actually be performed (the bootstrapper is wired). */
|
|
53
|
+
get canBootstrap(): boolean;
|
|
54
|
+
listReferenceArchitectures(workspaceId: string): Promise<ReferenceArchitecture[]>;
|
|
55
|
+
createReferenceArchitecture(workspaceId: string, input: CreateReferenceArchitectureInput): Promise<ReferenceArchitecture>;
|
|
56
|
+
updateReferenceArchitecture(workspaceId: string, id: string, input: UpdateReferenceArchitectureInput): Promise<ReferenceArchitecture>;
|
|
57
|
+
deleteReferenceArchitecture(workspaceId: string, id: string): Promise<void>;
|
|
58
|
+
listJobs(workspaceId: string): Promise<BootstrapJob[]>;
|
|
59
|
+
getJob(workspaceId: string, id: string): Promise<BootstrapJob>;
|
|
60
|
+
/**
|
|
61
|
+
* Kick off a "bootstrap repo" run and return immediately with the `running`
|
|
62
|
+
* job. The run is asynchronous and observable: it pre-flights GitHub + the
|
|
63
|
+
* target repo, dispatches the bootstrapper container, materialises a provisional
|
|
64
|
+
* **service frame** on the board (so the user sees a "bootstrapping…" card right
|
|
65
|
+
* away), then asks the durable runner to drive the poll loop — which streams
|
|
66
|
+
* live subtask progress and, on success, links the new repo to the frame so it
|
|
67
|
+
* becomes a real, droppable service. On a dispatch/pre-flight failure the job is
|
|
68
|
+
* returned already `failed` (no frame is left behind). Requires {@link canBootstrap}.
|
|
69
|
+
*/
|
|
70
|
+
bootstrap(workspaceId: string, input: BootstrapRepoInput): Promise<BootstrapJob>;
|
|
71
|
+
/**
|
|
72
|
+
* Retry a failed "bootstrap repo" run. Spins a **fresh** container (and a new
|
|
73
|
+
* durable driver instance) for the same target, reusing the original job's
|
|
74
|
+
* service frame so the board card stays put — it flips from the failed badge
|
|
75
|
+
* back to "bootstrapping…". A new job record is created (the prior one is kept as
|
|
76
|
+
* history and so the durable driver, keyed by job id, gets a clean instance).
|
|
77
|
+
* Only a `failed` job can be retried. Returns the new running job.
|
|
78
|
+
*/
|
|
79
|
+
retry(workspaceId: string, jobId: string): Promise<BootstrapJob>;
|
|
80
|
+
/**
|
|
81
|
+
* Advance one running bootstrap job by polling its container once: stream the
|
|
82
|
+
* latest subtask counts while it runs, and on a terminal outcome finalise the
|
|
83
|
+
* job and its board frame (link the repo + flip to a ready service on success,
|
|
84
|
+
* mark blocked on failure). Idempotent — a job already in a terminal state is
|
|
85
|
+
* returned as-is, so the durable driver's retries/replays are safe. Returns the
|
|
86
|
+
* poll's terminal-ness so the driver knows when to stop.
|
|
87
|
+
*/
|
|
88
|
+
pollBootstrapJob(workspaceId: string, jobId: string): Promise<BootstrapPollResult>;
|
|
89
|
+
/**
|
|
90
|
+
* Explicitly stop a *running* bootstrap (the unified `POST /agent-runs/:id/stop`
|
|
91
|
+
* surface): kill its per-run container, tear down the durable driver, then mark
|
|
92
|
+
* the job `failed` (kind `cancelled`) and its service frame `blocked` so the board
|
|
93
|
+
* shows it stopped — with retry — instead of "bootstrapping…" forever. Idempotent:
|
|
94
|
+
* a job already in a terminal state is returned unchanged. `opts.reason`/`opts.kind`
|
|
95
|
+
* let the orphan sweep reuse this with its own wording.
|
|
96
|
+
*/
|
|
97
|
+
stop(workspaceId: string, jobId: string, opts?: {
|
|
98
|
+
reason?: string;
|
|
99
|
+
kind?: BootstrapFailureKind;
|
|
100
|
+
}): Promise<BootstrapJob>;
|
|
101
|
+
/** The workspace default fragment ids a new service inherits; empty / never throws. */
|
|
102
|
+
private defaultServiceFragmentIds;
|
|
103
|
+
/** Create the provisional, in-progress service frame a bootstrap run materialises. */
|
|
104
|
+
private createServiceFrame;
|
|
105
|
+
/** Flip a bootstrap's frame to a terminal status + description; null-safe. */
|
|
106
|
+
private markFrame;
|
|
107
|
+
/** Assemble the structured failure diagnostics stored on a faulted job. */
|
|
108
|
+
private buildFailure;
|
|
109
|
+
/** Best-effort: reclaim a job's per-run container (never throws). */
|
|
110
|
+
private stopContainer;
|
|
111
|
+
/** Best-effort push of a bootstrap transition to subscribed clients. */
|
|
112
|
+
private emitBootstrap;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=BootstrapService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BootstrapService.d.ts","sourceRoot":"","sources":["../../../src/modules/bootstrap/BootstrapService.ts"],"names":[],"mappings":"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"}
|