@farmslot/protocol 0.53.0 → 0.54.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/CHANGELOG.md +11 -2
- package/dist/client-cache/index.d.ts +11 -0
- package/dist/client-cache/index.d.ts.map +1 -0
- package/dist/client-cache/index.js +2 -0
- package/dist/client-cache/index.js.map +1 -0
- package/dist/contracts/acceptance.d.ts +2 -0
- package/dist/contracts/acceptance.d.ts.map +1 -1
- package/dist/contracts/acceptance.js.map +1 -1
- package/dist/contracts/agents.d.ts +1 -1
- package/dist/contracts/agents.d.ts.map +1 -1
- package/dist/contracts/runs.d.ts +100 -21
- package/dist/contracts/runs.d.ts.map +1 -1
- package/dist/contracts/runs.js +15 -0
- package/dist/contracts/runs.js.map +1 -1
- package/dist/contracts/slots.d.ts +7 -0
- package/dist/contracts/slots.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/recipe/evidence.d.ts +7 -0
- package/dist/recipe/evidence.d.ts.map +1 -1
- package/dist/recipe/evidence.js.map +1 -1
- package/dist/recipe/index.d.ts +1 -0
- package/dist/recipe/index.d.ts.map +1 -1
- package/dist/recipe/index.js +1 -0
- package/dist/recipe/index.js.map +1 -1
- package/dist/recipe/pipeline-visual-judgments.d.ts +179 -5
- package/dist/recipe/pipeline-visual-judgments.d.ts.map +1 -1
- package/dist/recipe/pipeline-visual-judgments.js +64 -4
- package/dist/recipe/pipeline-visual-judgments.js.map +1 -1
- package/dist/recipe/repair.d.ts +93 -0
- package/dist/recipe/repair.d.ts.map +1 -0
- package/dist/recipe/repair.js +213 -0
- package/dist/recipe/repair.js.map +1 -0
- package/dist/runs/decision-resolution.d.ts.map +1 -1
- package/dist/runs/decision-resolution.js +4 -0
- package/dist/runs/decision-resolution.js.map +1 -1
- package/dist/runs/evidence-summary.d.ts +24 -2
- package/dist/runs/evidence-summary.d.ts.map +1 -1
- package/dist/runs/evidence-summary.js +143 -53
- package/dist/runs/evidence-summary.js.map +1 -1
- package/dist/runs/run-list-view.d.ts +25 -0
- package/dist/runs/run-list-view.d.ts.map +1 -0
- package/dist/runs/run-list-view.js +54 -0
- package/dist/runs/run-list-view.js.map +1 -0
- package/dist/sources/changes.d.ts +37 -0
- package/dist/sources/changes.d.ts.map +1 -0
- package/dist/sources/changes.js +79 -0
- package/dist/sources/changes.js.map +1 -0
- package/dist/sources/controller.d.ts +20 -0
- package/dist/sources/controller.d.ts.map +1 -1
- package/dist/sources/controller.js +63 -1
- package/dist/sources/controller.js.map +1 -1
- package/dist/sources/status-view.d.ts +6 -1
- package/dist/sources/status-view.d.ts.map +1 -1
- package/dist/sources/status-view.js +17 -8
- package/dist/sources/status-view.js.map +1 -1
- package/dist/transport/events.d.ts +16 -0
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/transport/events.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -1
- package/scripts/acceptance.mjs +4 -1
|
@@ -1,22 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
import { isRelativeArtifactPath } from '../recipe/common.js';
|
|
2
|
+
import { isInternalRunArtifactPath } from '../recipes/step-io.js';
|
|
3
|
+
/**
|
|
4
|
+
* Every artifact a run reports: gate and review payloads, the captured run
|
|
5
|
+
* output and step outputs, without gateway-internal launch diagnostics. Command
|
|
6
|
+
* Center and Companion both read a run's artifacts through this.
|
|
7
|
+
*/
|
|
8
|
+
export function extractRunArtifactManifest(run) {
|
|
2
9
|
const entries = [];
|
|
3
|
-
entries.push(...(run.liveRecipeContext?.artifactManifest ?? []));
|
|
4
10
|
for (const decision of run.decisions ?? []) {
|
|
5
11
|
const payload = decision.payload;
|
|
6
|
-
if (
|
|
7
|
-
continue;
|
|
8
|
-
if (payload.kind === 'ready') {
|
|
12
|
+
if (payload?.kind === 'ready') {
|
|
9
13
|
entries.push(...(payload.artifactManifest ?? []));
|
|
10
14
|
entries.push(...(payload.prPackage?.evidenceManifest ?? []));
|
|
15
|
+
for (const check of payload.prPackage?.deterministicChecks ?? []) {
|
|
16
|
+
if (check.logPath) {
|
|
17
|
+
entries.push({
|
|
18
|
+
path: check.logPath,
|
|
19
|
+
purpose: 'ci-parity-log',
|
|
20
|
+
type: 'log',
|
|
21
|
+
label: `${check.reference} · ${check.status}`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (payload?.kind === 'review') {
|
|
27
|
+
entries.push(...(payload.artifactManifest ?? []));
|
|
28
|
+
entries.push(...runArtifactPathsToManifest(payload.reviewInputArtifactPaths ?? []));
|
|
11
29
|
}
|
|
12
|
-
else if (payload
|
|
30
|
+
else if (payload?.kind === 'no-change') {
|
|
13
31
|
entries.push(...(payload.artifactManifest ?? []));
|
|
14
32
|
}
|
|
15
33
|
}
|
|
34
|
+
// A gate keeps the frozen metadata of a file the run output captured again
|
|
35
|
+
// later; the output only fills in what the gate did not record.
|
|
36
|
+
const declared = new Map(dedupeRunArtifacts(entries).map((entry) => [entry.path, entry]));
|
|
37
|
+
for (const artifact of run.output?.artifactManifest ?? []) {
|
|
38
|
+
if (isInternalRunArtifactPath(artifact.path))
|
|
39
|
+
continue;
|
|
40
|
+
const frozen = declared.get(artifact.path);
|
|
41
|
+
entries.push(frozen ? { ...artifact, ...frozen } : artifact);
|
|
42
|
+
}
|
|
16
43
|
for (const step of run.steps ?? []) {
|
|
17
|
-
|
|
44
|
+
collectRunArtifactEntries(step.outputs, entries);
|
|
18
45
|
}
|
|
19
|
-
return
|
|
46
|
+
return dedupeRunArtifacts(entries);
|
|
47
|
+
}
|
|
48
|
+
export function runEvidenceArtifacts(run) {
|
|
49
|
+
return dedupeRunArtifacts([
|
|
50
|
+
...(run.liveRecipeContext?.artifactManifest ?? []),
|
|
51
|
+
...extractRunArtifactManifest(run),
|
|
52
|
+
]);
|
|
20
53
|
}
|
|
21
54
|
export function summarizeRunEvidence(run) {
|
|
22
55
|
const artifacts = runEvidenceArtifacts(run);
|
|
@@ -37,43 +70,82 @@ export function isRunEvidenceImageArtifact(entry) {
|
|
|
37
70
|
export function isRunEvidenceVisualArtifact(entry) {
|
|
38
71
|
return isRunEvidenceImageArtifact(entry) || isRunEvidenceVideoArtifact(entry);
|
|
39
72
|
}
|
|
40
|
-
function
|
|
73
|
+
export function runArtifactPathsToManifest(paths) {
|
|
74
|
+
return paths.map((path) => ({ path, purpose: inferRunArtifactPurpose(path) }));
|
|
75
|
+
}
|
|
76
|
+
/** Image formats the clients show inline; `isRunEvidenceImageArtifact` also counts ones they can't. */
|
|
77
|
+
export function isRunArtifactImagePath(path) {
|
|
78
|
+
return /\.(png|jpg|jpeg|gif|svg|webp)$/i.test(path);
|
|
79
|
+
}
|
|
80
|
+
export function inferRunArtifactPurpose(path) {
|
|
81
|
+
const normalized = path.toLowerCase();
|
|
82
|
+
if (/\.(diff|patch)$/.test(normalized))
|
|
83
|
+
return 'diff';
|
|
84
|
+
if (normalized.includes('screenshot'))
|
|
85
|
+
return 'screenshot';
|
|
86
|
+
if (isRunEvidenceVideoArtifact({ path }))
|
|
87
|
+
return 'video';
|
|
88
|
+
if (isRunArtifactImagePath(path))
|
|
89
|
+
return 'image';
|
|
90
|
+
if (/diff[_-]?stat/i.test(normalized))
|
|
91
|
+
return 'diff-stat';
|
|
92
|
+
if (/\/diff\.(txt|md)$/i.test(normalized))
|
|
93
|
+
return 'diff';
|
|
94
|
+
if (normalized.includes('review'))
|
|
95
|
+
return 'review';
|
|
96
|
+
if (normalized.includes('report'))
|
|
97
|
+
return 'report';
|
|
98
|
+
if (normalized.includes('recipe'))
|
|
99
|
+
return 'recipe';
|
|
100
|
+
return 'artifact';
|
|
101
|
+
}
|
|
102
|
+
function collectRunArtifactEntries(value, entries) {
|
|
41
103
|
if (value == null)
|
|
42
104
|
return;
|
|
43
105
|
if (typeof value === 'string') {
|
|
44
|
-
|
|
45
|
-
|
|
106
|
+
// A bare string is an artifact only as a relative path, never prose or a host path.
|
|
107
|
+
if (!/\s/.test(value) && isRelativeArtifactPath(value) && looksLikeRunArtifactPath(value)) {
|
|
108
|
+
entries.push({ path: value, purpose: inferRunArtifactPurpose(value) });
|
|
46
109
|
}
|
|
47
110
|
return;
|
|
48
111
|
}
|
|
49
112
|
if (Array.isArray(value)) {
|
|
50
|
-
value.forEach((item) =>
|
|
113
|
+
value.forEach((item) => collectRunArtifactEntries(item, entries));
|
|
51
114
|
return;
|
|
52
115
|
}
|
|
53
116
|
if (typeof value !== 'object')
|
|
54
117
|
return;
|
|
55
118
|
const record = value;
|
|
56
|
-
if (typeof record.path === 'string' &&
|
|
119
|
+
if (typeof record.path === 'string' && looksLikeRunArtifactEntry(record)) {
|
|
57
120
|
entries.push({
|
|
58
121
|
path: record.path,
|
|
59
|
-
purpose: typeof record.purpose === 'string'
|
|
60
|
-
? record.purpose
|
|
61
|
-
: inferRunEvidenceArtifactPurpose(record.path),
|
|
122
|
+
purpose: typeof record.purpose === 'string' ? record.purpose : inferRunArtifactPurpose(record.path),
|
|
62
123
|
...(typeof record.sizeBytes === 'number' ? { sizeBytes: record.sizeBytes } : {}),
|
|
124
|
+
...(typeof record.type === 'string' ? { type: record.type } : {}),
|
|
125
|
+
...(typeof record.label === 'string' ? { label: record.label } : {}),
|
|
126
|
+
...(typeof record.mimeType === 'string' ? { mimeType: record.mimeType } : {}),
|
|
63
127
|
...(typeof record.sha256 === 'string' ? { sha256: record.sha256 } : {}),
|
|
128
|
+
...(typeof record.timelinePath === 'string' ? { timelinePath: record.timelinePath } : {}),
|
|
129
|
+
...(typeof record.timelineUnavailableReason === 'string'
|
|
130
|
+
? { timelineUnavailableReason: record.timelineUnavailableReason }
|
|
131
|
+
: {}),
|
|
64
132
|
});
|
|
65
133
|
}
|
|
66
|
-
Object.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return (typeof
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
134
|
+
Object.values(record).forEach((item) => collectRunArtifactEntries(item, entries));
|
|
135
|
+
}
|
|
136
|
+
function looksLikeRunArtifactEntry(record) {
|
|
137
|
+
const path = record.path;
|
|
138
|
+
if (typeof path !== 'string' || !isRelativeArtifactPath(path))
|
|
139
|
+
return false;
|
|
140
|
+
return (typeof record.purpose === 'string' ||
|
|
141
|
+
typeof record.type === 'string' ||
|
|
142
|
+
typeof record.mimeType === 'string' ||
|
|
143
|
+
looksLikeRunArtifactPath(path));
|
|
144
|
+
}
|
|
145
|
+
function looksLikeRunArtifactPath(value) {
|
|
146
|
+
return (isRunArtifactImagePath(value) ||
|
|
147
|
+
isRunEvidenceVideoArtifact({ path: value }) ||
|
|
148
|
+
/\.(md|json|txt|log|diff|patch)$/i.test(value));
|
|
77
149
|
}
|
|
78
150
|
function countRunEvidenceVisualPairs(entries) {
|
|
79
151
|
const buckets = new Map();
|
|
@@ -120,38 +192,56 @@ function pathDirname(pathValue) {
|
|
|
120
192
|
const index = normalized.lastIndexOf('/');
|
|
121
193
|
return index >= 0 ? normalized.slice(0, index) : '.';
|
|
122
194
|
}
|
|
123
|
-
|
|
195
|
+
/** One entry per path; the most specific purpose and the latest retention metadata win. */
|
|
196
|
+
export function dedupeRunArtifacts(entries) {
|
|
124
197
|
const merged = new Map();
|
|
125
198
|
for (const entry of entries) {
|
|
126
199
|
const existing = merged.get(entry.path);
|
|
127
|
-
merged.set(entry.path, existing
|
|
128
|
-
? {
|
|
129
|
-
...entry,
|
|
130
|
-
purpose: existing.purpose === 'artifact' && entry.purpose !== 'artifact'
|
|
131
|
-
? entry.purpose
|
|
132
|
-
: existing.purpose,
|
|
133
|
-
sizeBytes: existing.sizeBytes ?? entry.sizeBytes,
|
|
134
|
-
sha256: existing.sha256 ?? entry.sha256,
|
|
135
|
-
}
|
|
136
|
-
: entry);
|
|
200
|
+
merged.set(entry.path, existing ? mergeRunArtifactMetadata(existing, entry) : entry);
|
|
137
201
|
}
|
|
138
202
|
return [...merged.values()];
|
|
139
203
|
}
|
|
140
|
-
|
|
141
|
-
|
|
204
|
+
const LATEST_RUN_ARTIFACT_FIELDS = [
|
|
205
|
+
'sha256',
|
|
206
|
+
'timelinePath',
|
|
207
|
+
'timelineUnavailableReason',
|
|
208
|
+
'bundleDigest',
|
|
209
|
+
];
|
|
210
|
+
function mergeRunArtifactMetadata(existing, incoming) {
|
|
211
|
+
const merged = { ...existing };
|
|
212
|
+
for (const key of LATEST_RUN_ARTIFACT_FIELDS) {
|
|
213
|
+
if (incoming[key] !== undefined)
|
|
214
|
+
merged[key] = incoming[key];
|
|
215
|
+
}
|
|
216
|
+
const incomingIsMoreSpecific = runArtifactPurposeSpecificity(incoming.purpose) >
|
|
217
|
+
runArtifactPurposeSpecificity(existing.purpose);
|
|
218
|
+
if (incomingIsMoreSpecific)
|
|
219
|
+
merged.purpose = incoming.purpose;
|
|
220
|
+
const fixed = new Set(['path', 'purpose', ...LATEST_RUN_ARTIFACT_FIELDS]);
|
|
221
|
+
for (const key of Object.keys(incoming)) {
|
|
222
|
+
if (fixed.has(key) || incoming[key] === undefined)
|
|
223
|
+
continue;
|
|
224
|
+
if (merged[key] === undefined || incomingIsMoreSpecific)
|
|
225
|
+
merged[key] = incoming[key];
|
|
226
|
+
}
|
|
227
|
+
return merged;
|
|
142
228
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
return
|
|
153
|
-
if (
|
|
154
|
-
return
|
|
155
|
-
|
|
229
|
+
const NEUTRAL_VISUAL_PURPOSES = new Set([
|
|
230
|
+
'image',
|
|
231
|
+
'screenshot',
|
|
232
|
+
'debug-screenshot',
|
|
233
|
+
'video',
|
|
234
|
+
'visual',
|
|
235
|
+
]);
|
|
236
|
+
function runArtifactPurposeSpecificity(purpose) {
|
|
237
|
+
if (/\b(before|after|current|candidate|baseline|reference)\b/.test(purpose))
|
|
238
|
+
return 3;
|
|
239
|
+
if (purpose === 'other')
|
|
240
|
+
return 0;
|
|
241
|
+
if (!NEUTRAL_VISUAL_PURPOSES.has(purpose) && purpose !== 'artifact')
|
|
242
|
+
return 2;
|
|
243
|
+
if (purpose === 'artifact')
|
|
244
|
+
return 0;
|
|
245
|
+
return 1;
|
|
156
246
|
}
|
|
157
247
|
//# sourceMappingURL=evidence-summary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-summary.js","sourceRoot":"","sources":["../../src/runs/evidence-summary.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"evidence-summary.js","sourceRoot":"","sources":["../../src/runs/evidence-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type FlowType, type Run, type RunLane, type RunStatus } from '../contracts/runs.js';
|
|
2
|
+
import type { SlotStatus } from '../contracts/slots.js';
|
|
3
|
+
/** Page size both clients request for `run.list` `active`. */
|
|
4
|
+
export declare const ACTIVE_RUN_LIST_LIMIT = 200;
|
|
5
|
+
/** `active` follows `isActiveListRun`, `history` keeps terminal runs, `all` keeps every run. */
|
|
6
|
+
export type RunListScope = 'active' | 'history' | 'all';
|
|
7
|
+
export interface RunListQuery {
|
|
8
|
+
scope: RunListScope;
|
|
9
|
+
projects?: readonly string[];
|
|
10
|
+
machines?: readonly string[];
|
|
11
|
+
/** Fleet slot to machine. A slot missing here matches a machine by its `<machine>-` prefix. */
|
|
12
|
+
slotMachines?: ReadonlyMap<string, string>;
|
|
13
|
+
status?: RunStatus;
|
|
14
|
+
flow?: FlowType;
|
|
15
|
+
lane?: RunLane;
|
|
16
|
+
tag?: string;
|
|
17
|
+
search?: string;
|
|
18
|
+
}
|
|
19
|
+
/** The runs a run list shows, in input order. Command Center and Companion both list through this. */
|
|
20
|
+
export declare function selectRunList(runs: readonly Run[], query: RunListQuery): Run[];
|
|
21
|
+
/** The `slotMachines` map for a fleet snapshot. */
|
|
22
|
+
export declare function slotMachineMap(slots: readonly Pick<SlotStatus, 'slot' | 'machine'>[]): Map<string, string>;
|
|
23
|
+
/** Incoming runs replace stored runs with the same id; newest first. */
|
|
24
|
+
export declare function mergeRunsById(existing: readonly Run[], incoming: readonly Run[]): Run[];
|
|
25
|
+
//# sourceMappingURL=run-list-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-list-view.d.ts","sourceRoot":"","sources":["../../src/runs/run-list-view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAIb,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,gGAAgG;AAChG,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,+FAA+F;IAC/F,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,GAAG,EAAE,CAc9E;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,GACrD,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAErB;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,CAIvF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { isActiveListRun, isTerminalRunStatus, normalizeRunTags, } from '../contracts/runs.js';
|
|
2
|
+
import { resolveRunSlotId } from './slot-resolution.js';
|
|
3
|
+
/** Page size both clients request for `run.list` `active`. */
|
|
4
|
+
export const ACTIVE_RUN_LIST_LIMIT = 200;
|
|
5
|
+
/** The runs a run list shows, in input order. Command Center and Companion both list through this. */
|
|
6
|
+
export function selectRunList(runs, query) {
|
|
7
|
+
const [tag] = normalizeRunTags(query.tag ? [query.tag] : []);
|
|
8
|
+
const search = query.search?.trim().toLowerCase();
|
|
9
|
+
return runs.filter((run) => inScope(run, query.scope) &&
|
|
10
|
+
(!query.projects?.length || query.projects.includes(run.project)) &&
|
|
11
|
+
(!query.machines?.length || onMachines(run, query.machines, query.slotMachines)) &&
|
|
12
|
+
(!query.status || run.status === query.status) &&
|
|
13
|
+
(!query.flow || run.flowType === query.flow) &&
|
|
14
|
+
(!query.lane || run.lane === query.lane) &&
|
|
15
|
+
(!tag || normalizeRunTags(run.tags).includes(tag)) &&
|
|
16
|
+
(!search || matchesSearch(run, search)));
|
|
17
|
+
}
|
|
18
|
+
/** The `slotMachines` map for a fleet snapshot. */
|
|
19
|
+
export function slotMachineMap(slots) {
|
|
20
|
+
return new Map(slots.map((slot) => [slot.slot, slot.machine]));
|
|
21
|
+
}
|
|
22
|
+
/** Incoming runs replace stored runs with the same id; newest first. */
|
|
23
|
+
export function mergeRunsById(existing, incoming) {
|
|
24
|
+
const byId = new Map(existing.map((run) => [run.id, run]));
|
|
25
|
+
for (const run of incoming)
|
|
26
|
+
byId.set(run.id, run);
|
|
27
|
+
return [...byId.values()].sort((left, right) => right.createdAt.localeCompare(left.createdAt));
|
|
28
|
+
}
|
|
29
|
+
function inScope(run, scope) {
|
|
30
|
+
if (scope === 'active')
|
|
31
|
+
return isActiveListRun(run);
|
|
32
|
+
if (scope === 'history')
|
|
33
|
+
return isTerminalRunStatus(run.status);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function onMachines(run, machines, slotMachines) {
|
|
37
|
+
const slotId = resolveRunSlotId(run);
|
|
38
|
+
if (!slotId)
|
|
39
|
+
return false;
|
|
40
|
+
const machine = slotMachines?.get(slotId);
|
|
41
|
+
if (machine)
|
|
42
|
+
return machines.includes(machine);
|
|
43
|
+
return machines.some((name) => slotId === name || slotId.startsWith(`${name}-`));
|
|
44
|
+
}
|
|
45
|
+
function matchesSearch(run, search) {
|
|
46
|
+
return [
|
|
47
|
+
run.ticketOrPr,
|
|
48
|
+
run.summary,
|
|
49
|
+
resolveRunSlotId(run),
|
|
50
|
+
run.metrics.disposition?.replace(/_/g, ' '),
|
|
51
|
+
...(run.tags ?? []),
|
|
52
|
+
].some((value) => value?.toLowerCase().includes(search));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=run-list-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-list-view.js","sourceRoot":"","sources":["../../src/runs/run-list-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ResourceChangedPayload } from '../transport/events.js';
|
|
2
|
+
/** The source revision a controller compares; revisions never compare across epochs. */
|
|
3
|
+
export interface SourceRevisionMark {
|
|
4
|
+
epoch: string;
|
|
5
|
+
revision: number;
|
|
6
|
+
}
|
|
7
|
+
/** The one carrier decoder. */
|
|
8
|
+
export declare function sourceResourceChanges(event: string, payload: unknown): ResourceChangedPayload | undefined;
|
|
9
|
+
/** True when `next` is a change a reader holding `seen` has not covered. */
|
|
10
|
+
export declare function isNewerSourceRevision(next: SourceRevisionMark, seen: SourceRevisionMark | undefined): boolean;
|
|
11
|
+
export interface SourceChangeFeedState {
|
|
12
|
+
/** Undefined until this connection's `hello` arrives. */
|
|
13
|
+
announced?: boolean;
|
|
14
|
+
latest?: SourceRevisionMark;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* One feed per gateway connection, fed with every received event. It remembers
|
|
18
|
+
* whether `hello` announced the signal so panels mounted later can tell.
|
|
19
|
+
*/
|
|
20
|
+
export declare class SourceChangeFeed {
|
|
21
|
+
private state;
|
|
22
|
+
private listeners;
|
|
23
|
+
getState: () => SourceChangeFeedState;
|
|
24
|
+
subscribe: (listener: () => void) => (() => void);
|
|
25
|
+
receive(event: string, payload: unknown): void;
|
|
26
|
+
/** A new connection must announce again; its revisions start a new comparison. */
|
|
27
|
+
disconnected(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function createSourceChangeFeed(): SourceChangeFeed;
|
|
30
|
+
/** The part of a host's gateway client that feeds source changes. */
|
|
31
|
+
export interface SourceChangeConnection {
|
|
32
|
+
subscribe(event: string, handler: (payload: unknown) => void): unknown;
|
|
33
|
+
onConnectionChange(listener: (state: string) => void): unknown;
|
|
34
|
+
}
|
|
35
|
+
/** Wire a host connection to its feed; hosts call this once per gateway client. */
|
|
36
|
+
export declare function connectSourceChangeFeed(feed: SourceChangeFeed, connection: SourceChangeConnection): void;
|
|
37
|
+
//# sourceMappingURL=changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/sources/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE7E,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,+BAA+B;AAC/B,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,sBAAsB,GAAG,SAAS,CAapC;AAaD,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,kBAAkB,GAAG,SAAS,GACnC,OAAO,CAET;AAED,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,SAAS,CAAyB;IAE1C,QAAQ,QAAO,qBAAqB,CAAe;IAEnD,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG9C;IAEF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAW9C,kFAAkF;IAClF,YAAY,IAAI,IAAI;CAKrB;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED,qEAAqE;AACrE,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;IACvE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,sBAAsB,GACjC,IAAI,CAMN"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Events } from '../transport/events.js';
|
|
2
|
+
/**
|
|
3
|
+
* The carrier (ADR-069 Amendment 1). Until `resource.changed` exists the payload rides on
|
|
4
|
+
* `hello` and `fleet.updated`; adopting ADR-071 changes only these events and the decoder.
|
|
5
|
+
*/
|
|
6
|
+
const SOURCE_CHANGE_EVENTS = [Events.HELLO, Events.FLEET_UPDATED];
|
|
7
|
+
/** The one carrier decoder. */
|
|
8
|
+
export function sourceResourceChanges(event, payload) {
|
|
9
|
+
if (!SOURCE_CHANGE_EVENTS.includes(event))
|
|
10
|
+
return undefined;
|
|
11
|
+
const changes = payload?.resourceChanges;
|
|
12
|
+
if (!changes || typeof changes !== 'object')
|
|
13
|
+
return undefined;
|
|
14
|
+
const candidate = changes;
|
|
15
|
+
if (candidate.version !== 1 ||
|
|
16
|
+
typeof candidate.epoch !== 'string' ||
|
|
17
|
+
!candidate.epoch ||
|
|
18
|
+
!Array.isArray(candidate.changes))
|
|
19
|
+
return undefined;
|
|
20
|
+
return candidate;
|
|
21
|
+
}
|
|
22
|
+
function sourceMark(payload) {
|
|
23
|
+
const change = payload.changes.find((entry) => entry?.key?.family === 'sources' &&
|
|
24
|
+
entry.key.scope === 'farm' &&
|
|
25
|
+
Number.isSafeInteger(entry.revision) &&
|
|
26
|
+
entry.revision >= 0);
|
|
27
|
+
return change ? { epoch: payload.epoch, revision: change.revision } : undefined;
|
|
28
|
+
}
|
|
29
|
+
/** True when `next` is a change a reader holding `seen` has not covered. */
|
|
30
|
+
export function isNewerSourceRevision(next, seen) {
|
|
31
|
+
return !seen || next.epoch !== seen.epoch || next.revision > seen.revision;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One feed per gateway connection, fed with every received event. It remembers
|
|
35
|
+
* whether `hello` announced the signal so panels mounted later can tell.
|
|
36
|
+
*/
|
|
37
|
+
export class SourceChangeFeed {
|
|
38
|
+
constructor() {
|
|
39
|
+
this.state = {};
|
|
40
|
+
this.listeners = new Set();
|
|
41
|
+
this.getState = () => this.state;
|
|
42
|
+
this.subscribe = (listener) => {
|
|
43
|
+
this.listeners.add(listener);
|
|
44
|
+
return () => this.listeners.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
receive(event, payload) {
|
|
48
|
+
const changes = sourceResourceChanges(event, payload);
|
|
49
|
+
const mark = changes ? sourceMark(changes) : undefined;
|
|
50
|
+
const announced = event === Events.HELLO ? Boolean(mark) : this.state.announced;
|
|
51
|
+
const latest = mark && isNewerSourceRevision(mark, this.state.latest) ? mark : this.state.latest;
|
|
52
|
+
if (announced === this.state.announced && latest === this.state.latest)
|
|
53
|
+
return;
|
|
54
|
+
this.state = { announced, latest };
|
|
55
|
+
for (const listener of this.listeners)
|
|
56
|
+
listener();
|
|
57
|
+
}
|
|
58
|
+
/** A new connection must announce again; its revisions start a new comparison. */
|
|
59
|
+
disconnected() {
|
|
60
|
+
if (this.state.announced === undefined && !this.state.latest)
|
|
61
|
+
return;
|
|
62
|
+
this.state = {};
|
|
63
|
+
for (const listener of this.listeners)
|
|
64
|
+
listener();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function createSourceChangeFeed() {
|
|
68
|
+
return new SourceChangeFeed();
|
|
69
|
+
}
|
|
70
|
+
/** Wire a host connection to its feed; hosts call this once per gateway client. */
|
|
71
|
+
export function connectSourceChangeFeed(feed, connection) {
|
|
72
|
+
for (const event of SOURCE_CHANGE_EVENTS)
|
|
73
|
+
connection.subscribe(event, (payload) => feed.receive(event, payload));
|
|
74
|
+
connection.onConnectionChange((state) => {
|
|
75
|
+
if (state !== 'connected')
|
|
76
|
+
feed.disconnected();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/sources/changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SourceChangeFeed } from './changes.js';
|
|
1
2
|
import { type PreparedSourceCommand, type SourceCommandClient } from './client.js';
|
|
2
3
|
import type { SourceSelection } from './pins.js';
|
|
3
4
|
import { type SourceStatusViewContext, type SourceStatusViewModel, type SourceViewAction } from './status-view.js';
|
|
@@ -15,6 +16,12 @@ export interface SourceStatusSnapshot {
|
|
|
15
16
|
interactive: boolean;
|
|
16
17
|
canEdit: boolean;
|
|
17
18
|
selectionRefusal?: string;
|
|
19
|
+
/** Render nothing: no facts or failure yet, an empty context, or a viewer that cannot read. */
|
|
20
|
+
hidden: boolean;
|
|
21
|
+
/** Render the rows' pin and sync controls. */
|
|
22
|
+
controls: boolean;
|
|
23
|
+
/** The gateway reports sources but did not announce live source status. */
|
|
24
|
+
unsupported: boolean;
|
|
18
25
|
}
|
|
19
26
|
/** One context-bound controller serves thin web/native status and selection renderers. */
|
|
20
27
|
export declare class SourceStatusController {
|
|
@@ -25,10 +32,23 @@ export declare class SourceStatusController {
|
|
|
25
32
|
private listeners;
|
|
26
33
|
private snapshot;
|
|
27
34
|
private pendingConnectionKey?;
|
|
35
|
+
private feed?;
|
|
36
|
+
private covered?;
|
|
37
|
+
/** The version of the read in flight; a context change abandons it. */
|
|
38
|
+
private readingVersion?;
|
|
39
|
+
private rereadAfterRead;
|
|
40
|
+
private deniedRead;
|
|
28
41
|
constructor(client: SourceCommandClient, context: SourceStatusViewContext);
|
|
29
42
|
getSnapshot: () => SourceStatusSnapshot;
|
|
30
43
|
subscribe: (listener: () => void) => (() => void);
|
|
31
44
|
private update;
|
|
45
|
+
/**
|
|
46
|
+
* Live source status (ADR-069 Amendment 1): reread when the gateway's source
|
|
47
|
+
* revision passes what the last read covered. Reconnects stay with the host,
|
|
48
|
+
* which already rereads on every new connection.
|
|
49
|
+
*/
|
|
50
|
+
attachFeed(feed: SourceChangeFeed): () => void;
|
|
51
|
+
private observeFeed;
|
|
32
52
|
setContext(context: SourceStatusViewContext): boolean;
|
|
33
53
|
refresh(): Promise<void>;
|
|
34
54
|
select(selection: SourceSelection): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/sources/controller.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/sources/controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+FAA+F;IAC/F,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB;AAQD,0FAA0F;AAC1F,qBAAa,sBAAsB;IAe/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdzB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAS;IACtC,OAAO,CAAC,IAAI,CAAC,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,uEAAuE;IACvE,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAS;gBAGR,MAAM,EAAE,mBAAmB,EAC5C,OAAO,EAAE,uBAAuB;IAgBlC,WAAW,QAAO,oBAAoB,CAAkB;IAExD,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG9C;IAEF,OAAO,CAAC,MAAM;IAqCd;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAU9C,OAAO,CAAC,WAAW;IAiBnB,UAAU,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO;IAmC/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC9B,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IASxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOhC,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,aAAa;CAmC5B"}
|