@cat-factory/orchestration 0.250.0 → 0.251.1
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/execution/ExecutionService.d.ts +11 -3
- package/dist/modules/execution/ExecutionService.d.ts.map +1 -1
- package/dist/modules/execution/ExecutionService.js +13 -3
- package/dist/modules/execution/ExecutionService.js.map +1 -1
- package/dist/modules/execution/PrVerificationReportController.d.ts +6 -0
- package/dist/modules/execution/PrVerificationReportController.d.ts.map +1 -1
- package/dist/modules/execution/PrVerificationReportController.js +7 -0
- package/dist/modules/execution/PrVerificationReportController.js.map +1 -1
- package/dist/modules/execution/RunEvidenceLoader.d.ts +117 -5
- package/dist/modules/execution/RunEvidenceLoader.d.ts.map +1 -1
- package/dist/modules/execution/RunEvidenceLoader.js +122 -26
- package/dist/modules/execution/RunEvidenceLoader.js.map +1 -1
- package/dist/modules/execution/RunEvidenceReads.d.ts +12 -0
- package/dist/modules/execution/RunEvidenceReads.d.ts.map +1 -1
- package/dist/modules/execution/RunEvidenceReads.js +15 -0
- package/dist/modules/execution/RunEvidenceReads.js.map +1 -1
- package/dist/modules/execution/toolServers.logic.d.ts +6 -3
- package/dist/modules/execution/toolServers.logic.d.ts.map +1 -1
- package/dist/modules/execution/toolServers.logic.js +6 -3
- package/dist/modules/execution/toolServers.logic.js.map +1 -1
- package/dist/validation/validateRegistrations.d.ts.map +1 -1
- package/dist/validation/validateRegistrations.js +3 -280
- package/dist/validation/validateRegistrations.js.map +1 -1
- package/dist/validation/validateToolServers.d.ts +24 -0
- package/dist/validation/validateToolServers.d.ts.map +1 -0
- package/dist/validation/validateToolServers.js +337 -0
- package/dist/validation/validateToolServers.js.map +1 -0
- package/package.json +11 -11
|
@@ -25,7 +25,8 @@ export class RunEvidenceLoader {
|
|
|
25
25
|
const block = await this.deps.blockRepository.get(workspaceId, instance.blockId);
|
|
26
26
|
if (!block)
|
|
27
27
|
return null;
|
|
28
|
-
|
|
28
|
+
const read = await this.readRunSpec(workspaceId, instance, block);
|
|
29
|
+
return { block, specView: read.status === 'read' ? read.view : null };
|
|
29
30
|
}
|
|
30
31
|
/**
|
|
31
32
|
* The run's `spec/` as a read VIEW, for the SPA's outcome card.
|
|
@@ -39,18 +40,30 @@ export class RunEvidenceLoader {
|
|
|
39
40
|
*
|
|
40
41
|
* `EMPTY_SERVICE_SPEC_VIEW` rather than null on an unread spec: the card's own composer already
|
|
41
42
|
* treats an absent spec as `spec: 'not_read'` and says so, and the read is best-effort by
|
|
42
|
-
* design (see {@link
|
|
43
|
+
* design (see {@link runSpecRead}).
|
|
43
44
|
*/
|
|
44
45
|
async specViewForRun(workspaceId, instance) {
|
|
46
|
+
const read = await this.runSpecRead(workspaceId, instance);
|
|
47
|
+
return read.status === 'read' ? read.view : EMPTY_SERVICE_SPEC_VIEW;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The run's `spec/` read WITH the outcome of the read, for a caller whose job is to report it:
|
|
51
|
+
* `GET /api/v1/runs/:runId/spec`.
|
|
52
|
+
*
|
|
53
|
+
* The same gate, the same branch rule, the same memo and the same reader the two reductions use.
|
|
54
|
+
* The difference is only that nothing is folded on the way out (see {@link RunSpecRead}), which
|
|
55
|
+
* is what lets a headless caller tell a service that declares nothing from a repository nobody
|
|
56
|
+
* can currently read.
|
|
57
|
+
*/
|
|
58
|
+
async runSpecRead(workspaceId, instance) {
|
|
45
59
|
const block = await this.deps.blockRepository.get(workspaceId, instance.blockId);
|
|
46
60
|
if (!block)
|
|
47
|
-
return
|
|
48
|
-
return
|
|
61
|
+
return { status: 'no_block' };
|
|
62
|
+
return this.readRunSpec(workspaceId, instance, block);
|
|
49
63
|
}
|
|
50
64
|
/**
|
|
51
65
|
* The service's in-repo `spec/`, reassembled from the run's branch for the requirement →
|
|
52
|
-
* evidence join
|
|
53
|
-
* stated absence rather than a blank.
|
|
66
|
+
* evidence join, and WHERE the read stopped when there is no tree to hand back.
|
|
54
67
|
*
|
|
55
68
|
* GATED, then MEMOISED, because this is the only repo-reading path either reduction has and
|
|
56
69
|
* the PR-report hook fires on EVERY settled step:
|
|
@@ -72,39 +85,122 @@ export class RunEvidenceLoader {
|
|
|
72
85
|
* have succeeded. The reader never throws for the last of those, so the distinction is made on
|
|
73
86
|
* its `diagnostics.anchor` rather than on control flow.
|
|
74
87
|
*/
|
|
75
|
-
async
|
|
76
|
-
const resolve = this.deps.resolveRunRepoContext;
|
|
77
|
-
if (!resolve)
|
|
78
|
-
return null;
|
|
88
|
+
async readRunSpec(workspaceId, instance, block) {
|
|
79
89
|
const testerReported = instance.steps.some((s) => isTesterKind(s.agentKind) && s.test?.lastReport != null);
|
|
80
90
|
if (!testerReported)
|
|
81
|
-
return
|
|
91
|
+
return { status: 'not_read' };
|
|
82
92
|
const cached = this.specByRun.get(instance.id);
|
|
83
|
-
if (cached
|
|
84
|
-
return cached;
|
|
93
|
+
if (cached)
|
|
94
|
+
return { status: 'read', ...cached };
|
|
95
|
+
const resolve = this.deps.resolveRunRepoContext;
|
|
96
|
+
if (!resolve)
|
|
97
|
+
return { status: 'vcs_unwired' };
|
|
85
98
|
try {
|
|
86
99
|
const ctx = await resolve(workspaceId, instance.blockId);
|
|
87
100
|
if (!ctx)
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
// the PR branch and has not merged yet, so the default branch would be missing exactly
|
|
91
|
-
// the requirements the tester just ruled on. The rule is `runSpecBranch` rather than a
|
|
92
|
-
// local `??` because the SPA answers the same question and the two had already drifted.
|
|
93
|
-
const view = await readServiceSpec(ctx.repo, runSpecBranch(block, ctx.baseBranch));
|
|
101
|
+
return { status: 'no_connection' };
|
|
102
|
+
const attempt = await this.walkSpec(ctx, block);
|
|
94
103
|
// The reader is TOTAL, so a provider outage arrives as a returned value rather than a throw:
|
|
95
104
|
// without this line the `catch` below covered only a throwing resolver, and one flaky read
|
|
96
105
|
// was memoised as the run's answer for the rest of its life. The reader's own anchor is the
|
|
97
106
|
// discriminator. Every other state IS an answer and is cached: a tree, a branch with no
|
|
98
107
|
// `spec/`, and a corrupt anchor, which re-reading cannot improve.
|
|
99
|
-
if (view.diagnostics?.anchor === 'read_failed')
|
|
100
|
-
return
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
if (attempt.view.diagnostics?.anchor === 'read_failed')
|
|
109
|
+
return { status: 'read_failed' };
|
|
110
|
+
const provenance = {
|
|
111
|
+
provider: ctx.provider ?? 'github',
|
|
112
|
+
// The resolver's owner/name are optional for back-compat with older fakes; the real
|
|
113
|
+
// resolvers always set them, and an empty string is the honest stand-in for a binding
|
|
114
|
+
// that did not.
|
|
115
|
+
owner: ctx.owner ?? '',
|
|
116
|
+
repo: ctx.name ?? '',
|
|
117
|
+
ref: attempt.ref,
|
|
118
|
+
commit: attempt.commit,
|
|
119
|
+
};
|
|
120
|
+
this.rememberSpec(instance.id, { view: attempt.view, provenance });
|
|
121
|
+
return { status: 'read', view: attempt.view, provenance };
|
|
103
122
|
}
|
|
104
123
|
catch {
|
|
105
|
-
// Best-effort: an unreadable spec is reported as such by each
|
|
106
|
-
// and is re-attempted on the next settlement.
|
|
107
|
-
|
|
124
|
+
// Best-effort for the two reductions: an unreadable spec is reported as such by each
|
|
125
|
+
// consumer, never fails a run, and is re-attempted on the next settlement. The reporting
|
|
126
|
+
// caller gets the same fact as a refusal rather than as an empty spec.
|
|
127
|
+
return { status: 'read_failed' };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Walk the spec at the branch this run pushed to, falling back to the repo default when that
|
|
132
|
+
* branch is demonstrably GONE.
|
|
133
|
+
*
|
|
134
|
+
* The primary ref is the RUN's branch, not the repo default: the spec increment this task wrote
|
|
135
|
+
* is on the pull request's head and has not merged yet, so the default branch would be missing
|
|
136
|
+
* exactly the requirements the tester just ruled on. The rule is `runSpecBranch` rather than a
|
|
137
|
+
* local `??` because the SPA answers the same question and the two had already drifted.
|
|
138
|
+
*
|
|
139
|
+
* The fallback exists because `block.pullRequest` is never cleared and a merged pull request's
|
|
140
|
+
* head branch is routinely deleted (GitHub deletes it automatically when the repository is
|
|
141
|
+
* configured that way). Left un-handled, the run named a branch nobody can read for the rest of
|
|
142
|
+
* the block's life: no head, every file a 404, and a reporting caller refused with a permanent
|
|
143
|
+
* `spec_ref_unresolved`. That makes the post-hoc audit, which is the case this read exists for,
|
|
144
|
+
* the one case that cannot be served. It is also the case `runSpecBranch` already describes as
|
|
145
|
+
* resolved: once the pull request merges, the two branches carry the same requirements, so the
|
|
146
|
+
* default branch is not a substitute for the run's tree but the same tree under its surviving
|
|
147
|
+
* name.
|
|
148
|
+
*
|
|
149
|
+
* Two conditions gate it TOGETHER, and both are needed:
|
|
150
|
+
* - the ref probe came back a definite 404 (the branch does not exist), never a throw, which is
|
|
151
|
+
* an outage and must not be allowed to switch trees mid-incident;
|
|
152
|
+
* - the walk itself found no anchor. A provider degraded only on refs still answers the tree,
|
|
153
|
+
* and re-reading elsewhere would discard an answer we hold.
|
|
154
|
+
* Together they are the same discriminator the public read refuses on ("unresolved plus absent
|
|
155
|
+
* is unproven"), applied one layer earlier, where there is still something to be done about it.
|
|
156
|
+
*
|
|
157
|
+
* What it does NOT do is hide which tree was served: `provenance.ref` names the branch actually
|
|
158
|
+
* read. A pull request CLOSED without merging and then deleted is the one case where the
|
|
159
|
+
* fallback answers with a tree the run was not judged against, and naming the ref is what keeps
|
|
160
|
+
* that legible rather than silent.
|
|
161
|
+
*/
|
|
162
|
+
async walkSpec(ctx, block) {
|
|
163
|
+
const ref = runSpecBranch(block, ctx.baseBranch);
|
|
164
|
+
// Resolved BEFORE the walk, so the commit named is one the tree is at least as new as, and
|
|
165
|
+
// memoised with it: a later reader of this run gets the snapshot the tester ruled against
|
|
166
|
+
// rather than a commit resolved long afterwards. It is also the only POSITIVE evidence the
|
|
167
|
+
// read has that the branch resolves at all, which is what lets a reporting caller tell an
|
|
168
|
+
// empty branch from an unreachable repository (both answer 404 for the anchor).
|
|
169
|
+
const head = await this.headSha(ctx.repo, ref);
|
|
170
|
+
const view = await readServiceSpec(ctx.repo, ref);
|
|
171
|
+
const anchor = view.diagnostics?.anchor;
|
|
172
|
+
if (ref === ctx.baseBranch || head.state !== 'absent' || anchor !== 'absent') {
|
|
173
|
+
return { ref, commit: head.state === 'resolved' ? head.sha : null, view };
|
|
174
|
+
}
|
|
175
|
+
const fallbackHead = await this.headSha(ctx.repo, ctx.baseBranch);
|
|
176
|
+
return {
|
|
177
|
+
ref: ctx.baseBranch,
|
|
178
|
+
commit: fallbackHead.state === 'resolved' ? fallbackHead.sha : null,
|
|
179
|
+
view: await readServiceSpec(ctx.repo, ctx.baseBranch),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* What resolving a branch's head PROVED, in the three states the callers above act on
|
|
184
|
+
* differently.
|
|
185
|
+
*
|
|
186
|
+
* A bare `string | null` folded the last two together, and the fold is what made a deleted
|
|
187
|
+
* branch indistinguishable from a provider that would not answer: both left `commit: null`,
|
|
188
|
+
* both read as "unproven", and only one of them can be repaired by reading somewhere else.
|
|
189
|
+
* `RepoFiles.headSha` already draws the line (its contract answers null for a branch that does
|
|
190
|
+
* not exist and throws for everything else), so keeping it costs nothing but the naming.
|
|
191
|
+
*
|
|
192
|
+
* `unproven` may never fail the read, which is why the throw is swallowed here rather than left
|
|
193
|
+
* to the caller's outer `catch` (that one means the spec itself could not be read).
|
|
194
|
+
*/
|
|
195
|
+
async headSha(repo, ref) {
|
|
196
|
+
try {
|
|
197
|
+
const sha = await repo.headSha(ref);
|
|
198
|
+
return sha ? { state: 'resolved', sha } : { state: 'absent' };
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// silent-catch-ok: an unresolvable ref is a VALUE this read reports (`commit: null`), and
|
|
202
|
+
// the anchor's own bytes decide whether an empty answer is trustworthy.
|
|
203
|
+
return { state: 'unproven' };
|
|
108
204
|
}
|
|
109
205
|
}
|
|
110
206
|
/** Per-execution spec memo, bounded by {@link MAX_TRACKED_RUNS}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunEvidenceLoader.js","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceLoader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RunEvidenceLoader.js","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ExecutionInstance } from '@cat-factory/kernel';
|
|
2
2
|
import type { PrVerificationReport, RunOutcome, ServiceSpecView } from '@cat-factory/contracts';
|
|
3
|
+
import type { RunSpecRead } from './RunEvidenceLoader.js';
|
|
3
4
|
/**
|
|
4
5
|
* Bound callbacks rather than the collaborators themselves, so this stays testable standalone and
|
|
5
6
|
* cannot reach for anything its three reads do not need.
|
|
@@ -10,6 +11,7 @@ export interface RunEvidenceReadsDeps {
|
|
|
10
11
|
composeReport(workspaceId: string, instance: ExecutionInstance): Promise<PrVerificationReport | null>;
|
|
11
12
|
composeOutcome(workspaceId: string, instance: ExecutionInstance): Promise<RunOutcome | null>;
|
|
12
13
|
readSpec(workspaceId: string, instance: ExecutionInstance): Promise<ServiceSpecView>;
|
|
14
|
+
readSpecOutcome(workspaceId: string, instance: ExecutionInstance): Promise<RunSpecRead>;
|
|
13
15
|
}
|
|
14
16
|
export declare class RunEvidenceReads {
|
|
15
17
|
private readonly deps;
|
|
@@ -49,5 +51,15 @@ export declare class RunEvidenceReads {
|
|
|
49
51
|
* card already states as `spec: 'not_read'` rather than as a clean, empty section.
|
|
50
52
|
*/
|
|
51
53
|
spec(workspaceId: string, executionId: string): Promise<ServiceSpecView | null>;
|
|
54
|
+
/**
|
|
55
|
+
* The same read as {@link spec}, with WHERE it stopped kept rather than folded onto an empty
|
|
56
|
+
* view: what `GET /api/v1/runs/:runId/spec` answers. Null when the workspace has no such run.
|
|
57
|
+
*
|
|
58
|
+
* The public endpoint reports the read rather than surviving it, so an unwired integration, an
|
|
59
|
+
* unreadable repository and a branch that genuinely carries no `spec/` have to arrive as three
|
|
60
|
+
* different answers. Routed through the same loader as its two siblings above so the tree a
|
|
61
|
+
* caller joins its verdicts against is the tree those verdicts were made against.
|
|
62
|
+
*/
|
|
63
|
+
specRead(workspaceId: string, executionId: string): Promise<RunSpecRead | null>;
|
|
52
64
|
}
|
|
53
65
|
//# sourceMappingURL=RunEvidenceReads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunEvidenceReads.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceReads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"RunEvidenceReads.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceReads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAezD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACxF,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IACvC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IACpF,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACxF;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,oBAAoB,EAAI;IAE3D;;;;;;;OAOG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAI3F;IAED;;;;;;;;;OASG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAIlF;IAED;;;;;;;;;;;;;OAaG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAIpF;IAED;;;;;;;;OAQG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAIpF;CACF"}
|
|
@@ -53,5 +53,20 @@ export class RunEvidenceReads {
|
|
|
53
53
|
return null;
|
|
54
54
|
return this.deps.readSpec(workspaceId, instance);
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* The same read as {@link spec}, with WHERE it stopped kept rather than folded onto an empty
|
|
58
|
+
* view: what `GET /api/v1/runs/:runId/spec` answers. Null when the workspace has no such run.
|
|
59
|
+
*
|
|
60
|
+
* The public endpoint reports the read rather than surviving it, so an unwired integration, an
|
|
61
|
+
* unreadable repository and a branch that genuinely carries no `spec/` have to arrive as three
|
|
62
|
+
* different answers. Routed through the same loader as its two siblings above so the tree a
|
|
63
|
+
* caller joins its verdicts against is the tree those verdicts were made against.
|
|
64
|
+
*/
|
|
65
|
+
async specRead(workspaceId, executionId) {
|
|
66
|
+
const instance = await this.deps.getInstance(workspaceId, executionId);
|
|
67
|
+
if (!instance)
|
|
68
|
+
return null;
|
|
69
|
+
return this.deps.readSpecOutcome(workspaceId, instance);
|
|
70
|
+
}
|
|
56
71
|
}
|
|
57
72
|
//# sourceMappingURL=RunEvidenceReads.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunEvidenceReads.js","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceReads.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RunEvidenceReads.js","sourceRoot":"","sources":["../../../src/modules/execution/RunEvidenceReads.ts"],"names":[],"mappings":"AAiCA,MAAM,OAAO,gBAAgB;IACE,IAAI;IAAjC,YAA6B,IAA0B;oBAA1B,IAAI;IAAyB,CAAC;IAE3D;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,WAAmB;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACtE,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,WAAmB;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACtE,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACxD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,WAAmB;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACtE,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ,CAAC,WAAmB,EAAE,WAAmB;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACtE,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACzD,CAAC;CACF"}
|
|
@@ -3,9 +3,12 @@ import type { PipelineStep } from '@cat-factory/kernel';
|
|
|
3
3
|
/**
|
|
4
4
|
* Fold the CLI's tool-server startup report onto a step, returning whether anything changed.
|
|
5
5
|
*
|
|
6
|
-
* Applied
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Applied at two sites that between them cover every poll disposition: the live poll, and once in
|
|
7
|
+
* the dispatcher AHEAD of the settled branch tree, so all five persisting arms inherit it (where
|
|
8
|
+
* `applyValidationReport` instead has a call per path). The coverage matters for the same reason
|
|
9
|
+
* as there, plus one of its own: the CLI announces its servers ONCE, near the start of the run, so
|
|
10
|
+
* a job that settles between two polls is never seen `running` and only its terminal poll can
|
|
11
|
+
* deliver the report.
|
|
9
12
|
*
|
|
10
13
|
* Two guards that are load-bearing rather than defensive:
|
|
11
14
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolServers.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/toolServers.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAA4B,MAAM,wBAAwB,CAAA;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD
|
|
1
|
+
{"version":3,"file":"toolServers.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/toolServers.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAA4B,MAAM,wBAAwB,CAAA;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAQlF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAuBnF"}
|
|
@@ -11,9 +11,12 @@ import { isToolServerObservedStatus } from '@cat-factory/contracts';
|
|
|
11
11
|
/**
|
|
12
12
|
* Fold the CLI's tool-server startup report onto a step, returning whether anything changed.
|
|
13
13
|
*
|
|
14
|
-
* Applied
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Applied at two sites that between them cover every poll disposition: the live poll, and once in
|
|
15
|
+
* the dispatcher AHEAD of the settled branch tree, so all five persisting arms inherit it (where
|
|
16
|
+
* `applyValidationReport` instead has a call per path). The coverage matters for the same reason
|
|
17
|
+
* as there, plus one of its own: the CLI announces its servers ONCE, near the start of the run, so
|
|
18
|
+
* a job that settles between two polls is never seen `running` and only its terminal poll can
|
|
19
|
+
* deliver the report.
|
|
17
20
|
*
|
|
18
21
|
* Two guards that are load-bearing rather than defensive:
|
|
19
22
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolServers.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/toolServers.logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAGnE,0FAA0F;AAC1F,2FAA2F;AAC3F,EAAE;AACF,kGAAkG;AAClG,gGAAgG;AAChG,gGAAgG;AAChG,gGAAgG;AAChG,+FAA+F;AAC/F,wCAAwC;AAExC
|
|
1
|
+
{"version":3,"file":"toolServers.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/toolServers.logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateRegistrations.d.ts","sourceRoot":"","sources":["../../src/validation/validateRegistrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,EAEV,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,YAAY,EACZ,wBAAwB,
|
|
1
|
+
{"version":3,"file":"validateRegistrations.d.ts","sourceRoot":"","sources":["../../src/validation/validateRegistrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,EAEV,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAqD5B,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,CAAA;IACpC;;;;OAIG;IACH,YAAY,EAAE,YAAY,CAAA;IAC1B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;IACnD;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,2BAA2B,CAAA;IACzD;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAA;IACjD;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;IAC/C;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,oBAAoB,CAAA;IACtC;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,0BAA0B,CAAA;CACxD;AAED,uFAAuF;AACvF,MAAM,WAAW,4BAA4B;IAC3C,+EAA+E;IAC/E,UAAU,EAAE,mBAAmB,CAAA;IAC/B,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACxC,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACxC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC/C;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAA;CAC5D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,4BAA4B,GACjC,mBAAmB,EAAE,CA4FvB;AAkyBD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI,CAuB9E;AAOD,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI,CASlF;AAED,uFAAuF;AACvF,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD"}
|