@farmslot/protocol 0.53.0 → 0.55.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/dist/client-cache/index.d.ts +11 -0
  3. package/dist/client-cache/index.d.ts.map +1 -0
  4. package/dist/client-cache/index.js +2 -0
  5. package/dist/client-cache/index.js.map +1 -0
  6. package/dist/contracts/acceptance.d.ts +10 -0
  7. package/dist/contracts/acceptance.d.ts.map +1 -1
  8. package/dist/contracts/acceptance.js +2 -0
  9. package/dist/contracts/acceptance.js.map +1 -1
  10. package/dist/contracts/agents.d.ts +1 -1
  11. package/dist/contracts/agents.d.ts.map +1 -1
  12. package/dist/contracts/assessment.d.ts +2 -0
  13. package/dist/contracts/assessment.d.ts.map +1 -1
  14. package/dist/contracts/dispatch.d.ts +5 -0
  15. package/dist/contracts/dispatch.d.ts.map +1 -1
  16. package/dist/contracts/family.d.ts +2 -0
  17. package/dist/contracts/family.d.ts.map +1 -1
  18. package/dist/contracts/family.js.map +1 -1
  19. package/dist/contracts/pr-monitoring.d.ts +3 -0
  20. package/dist/contracts/pr-monitoring.d.ts.map +1 -1
  21. package/dist/contracts/pr-rules.d.ts +6 -0
  22. package/dist/contracts/pr-rules.d.ts.map +1 -1
  23. package/dist/contracts/review-publication.d.ts +2 -0
  24. package/dist/contracts/review-publication.d.ts.map +1 -1
  25. package/dist/contracts/review-publication.js.map +1 -1
  26. package/dist/contracts/runs.d.ts +118 -21
  27. package/dist/contracts/runs.d.ts.map +1 -1
  28. package/dist/contracts/runs.js +32 -0
  29. package/dist/contracts/runs.js.map +1 -1
  30. package/dist/contracts/slots.d.ts +7 -0
  31. package/dist/contracts/slots.d.ts.map +1 -1
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/node/farm-layout.d.ts +26 -0
  37. package/dist/node/farm-layout.d.ts.map +1 -0
  38. package/dist/node/farm-layout.js +62 -0
  39. package/dist/node/farm-layout.js.map +1 -0
  40. package/dist/recipe/claim-reviews.d.ts +2 -0
  41. package/dist/recipe/claim-reviews.d.ts.map +1 -1
  42. package/dist/recipe/claim-reviews.js +13 -1
  43. package/dist/recipe/claim-reviews.js.map +1 -1
  44. package/dist/recipe/evidence.d.ts +7 -0
  45. package/dist/recipe/evidence.d.ts.map +1 -1
  46. package/dist/recipe/evidence.js.map +1 -1
  47. package/dist/recipe/index.d.ts +1 -0
  48. package/dist/recipe/index.d.ts.map +1 -1
  49. package/dist/recipe/index.js +1 -0
  50. package/dist/recipe/index.js.map +1 -1
  51. package/dist/recipe/pipeline-visual-judgments.d.ts +179 -5
  52. package/dist/recipe/pipeline-visual-judgments.d.ts.map +1 -1
  53. package/dist/recipe/pipeline-visual-judgments.js +64 -4
  54. package/dist/recipe/pipeline-visual-judgments.js.map +1 -1
  55. package/dist/recipe/repair.d.ts +93 -0
  56. package/dist/recipe/repair.d.ts.map +1 -0
  57. package/dist/recipe/repair.js +213 -0
  58. package/dist/recipe/repair.js.map +1 -0
  59. package/dist/runs/decision-resolution.d.ts.map +1 -1
  60. package/dist/runs/decision-resolution.js +4 -0
  61. package/dist/runs/decision-resolution.js.map +1 -1
  62. package/dist/runs/evidence-summary.d.ts +24 -2
  63. package/dist/runs/evidence-summary.d.ts.map +1 -1
  64. package/dist/runs/evidence-summary.js +143 -53
  65. package/dist/runs/evidence-summary.js.map +1 -1
  66. package/dist/runs/family-readiness.d.ts.map +1 -1
  67. package/dist/runs/family-readiness.js +6 -8
  68. package/dist/runs/family-readiness.js.map +1 -1
  69. package/dist/runs/portable-bundle.d.ts +1 -1
  70. package/dist/runs/portable-bundle.d.ts.map +1 -1
  71. package/dist/runs/portable-bundle.js +2 -2
  72. package/dist/runs/portable-bundle.js.map +1 -1
  73. package/dist/runs/run-family-groups.d.ts +21 -0
  74. package/dist/runs/run-family-groups.d.ts.map +1 -0
  75. package/dist/runs/run-family-groups.js +71 -0
  76. package/dist/runs/run-family-groups.js.map +1 -0
  77. package/dist/runs/run-list-view.d.ts +23 -0
  78. package/dist/runs/run-list-view.d.ts.map +1 -0
  79. package/dist/runs/run-list-view.js +52 -0
  80. package/dist/runs/run-list-view.js.map +1 -0
  81. package/dist/sources/changes.d.ts +37 -0
  82. package/dist/sources/changes.d.ts.map +1 -0
  83. package/dist/sources/changes.js +79 -0
  84. package/dist/sources/changes.js.map +1 -0
  85. package/dist/sources/controller.d.ts +20 -0
  86. package/dist/sources/controller.d.ts.map +1 -1
  87. package/dist/sources/controller.js +64 -1
  88. package/dist/sources/controller.js.map +1 -1
  89. package/dist/sources/status-view.d.ts +6 -1
  90. package/dist/sources/status-view.d.ts.map +1 -1
  91. package/dist/sources/status-view.js +27 -10
  92. package/dist/sources/status-view.js.map +1 -1
  93. package/dist/transport/events.d.ts +16 -0
  94. package/dist/transport/events.d.ts.map +1 -1
  95. package/dist/transport/events.js.map +1 -1
  96. package/dist/version.d.ts +1 -1
  97. package/dist/version.js +1 -1
  98. package/package.json +11 -1
  99. package/scripts/acceptance.d.mts +4 -0
  100. package/scripts/acceptance.mjs +13 -1
@@ -0,0 +1,71 @@
1
+ import { isActiveListRun } from '../contracts/runs.js';
2
+ import { buildFamilySummary } from './family-readiness.js';
3
+ function isFamilyRoot(run) {
4
+ return run.id === run.familyId || run.parentRunId == null;
5
+ }
6
+ function sortByCreatedAtDesc(runs) {
7
+ return [...runs].sort((left, right) => right.createdAt.localeCompare(left.createdAt));
8
+ }
9
+ export function sortRunsForFamilyView(runs) {
10
+ return [...runs].sort((left, right) => {
11
+ if (isFamilyRoot(left) !== isFamilyRoot(right))
12
+ return isFamilyRoot(left) ? -1 : 1;
13
+ if ((left.variant ?? null) !== (right.variant ?? null)) {
14
+ return (left.variant ?? '').localeCompare(right.variant ?? '');
15
+ }
16
+ return right.createdAt.localeCompare(left.createdAt);
17
+ });
18
+ }
19
+ /** Runs grouped by project and family, newest family first; Command Center and Companion share it. */
20
+ export function groupRunsByFamily(runs) {
21
+ const grouped = new Map();
22
+ for (const run of runs) {
23
+ const familyId = run.familyId || run.id;
24
+ const key = `${run.project}::${familyId}`;
25
+ const current = grouped.get(key);
26
+ if (current)
27
+ current.runs.push(run);
28
+ else
29
+ grouped.set(key, { familyId, project: run.project, runs: [run] });
30
+ }
31
+ return [...grouped.values()]
32
+ .map(({ familyId, project, runs: familyRuns }) => {
33
+ const orderedRuns = sortRunsForFamilyView(familyRuns);
34
+ const rootRun = orderedRuns.find(isFamilyRoot) ?? null;
35
+ const newestByCreatedAt = sortByCreatedAtDesc(orderedRuns)[0];
36
+ const representativeRun = rootRun ?? newestByCreatedAt;
37
+ const latestCreatedAt = orderedRuns.reduce((latest, run) => (run.createdAt > latest ? run.createdAt : latest), orderedRuns[0]?.createdAt ?? '');
38
+ const variants = [
39
+ ...new Set(orderedRuns
40
+ .map((run) => run.variant)
41
+ .filter((variant) => Boolean(variant))),
42
+ ];
43
+ const retrospectiveDecisions = orderedRuns.flatMap((run) => (run.decisions ?? []).filter((decision) => decision.type === 'retrospective'));
44
+ return {
45
+ familyId,
46
+ project,
47
+ familyRootTicketOrPr: rootRun?.familyRootTicketOrPr ??
48
+ representativeRun?.familyRootTicketOrPr ??
49
+ representativeRun?.ticketOrPr ??
50
+ familyId,
51
+ rootRun,
52
+ representativeRun,
53
+ familySummary: buildFamilySummary(rootRun, newestByCreatedAt, orderedRuns),
54
+ runs: orderedRuns,
55
+ latestCreatedAt,
56
+ activeCount: orderedRuns.filter(isActiveListRun).length,
57
+ comparisonCount: orderedRuns.filter((run) => run.lane === 'comparison').length,
58
+ retrospectiveCount: retrospectiveDecisions.length,
59
+ pendingRetrospectiveCount: retrospectiveDecisions.filter((decision) => !decision.resolvedAt)
60
+ .length,
61
+ variants,
62
+ };
63
+ })
64
+ .sort((left, right) => right.latestCreatedAt.localeCompare(left.latestCreatedAt));
65
+ }
66
+ export function selectRecentRunFamilyGroups(runs, limit) {
67
+ if (limit <= 0)
68
+ return [];
69
+ return groupRunsByFamily(runs).slice(0, limit);
70
+ }
71
+ //# sourceMappingURL=run-family-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-family-groups.js","sourceRoot":"","sources":["../../src/runs/run-family-groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type FlowType, type Run, type RunLane, type RunStatus } from '../contracts/runs.js';
2
+ import type { SlotStatus } from '../contracts/slots.js';
3
+ /** `active` follows `isActiveListRun`, `history` keeps terminal runs, `all` keeps every run. */
4
+ export type RunListScope = 'active' | 'history' | 'all';
5
+ export interface RunListQuery {
6
+ scope: RunListScope;
7
+ projects?: readonly string[];
8
+ machines?: readonly string[];
9
+ /** Fleet slot to machine. A slot missing here matches a machine by its `<machine>-` prefix. */
10
+ slotMachines?: ReadonlyMap<string, string>;
11
+ status?: RunStatus;
12
+ flow?: FlowType;
13
+ lane?: RunLane;
14
+ tag?: string;
15
+ search?: string;
16
+ }
17
+ /** The runs a run list shows, in input order. Command Center and Companion both list through this. */
18
+ export declare function selectRunList(runs: readonly Run[], query: RunListQuery): Run[];
19
+ /** The `slotMachines` map for a fleet snapshot. */
20
+ export declare function slotMachineMap(slots: readonly Pick<SlotStatus, 'slot' | 'machine'>[]): Map<string, string>;
21
+ /** Incoming runs replace stored runs with the same id; newest first. */
22
+ export declare function mergeRunsById(existing: readonly Run[], incoming: readonly Run[]): Run[];
23
+ //# 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,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,52 @@
1
+ import { isActiveListRun, isTerminalRunStatus, normalizeRunTags, } from '../contracts/runs.js';
2
+ import { resolveRunSlotId } from './slot-resolution.js';
3
+ /** The runs a run list shows, in input order. Command Center and Companion both list through this. */
4
+ export function selectRunList(runs, query) {
5
+ const [tag] = normalizeRunTags(query.tag ? [query.tag] : []);
6
+ const search = query.search?.trim().toLowerCase();
7
+ return runs.filter((run) => inScope(run, query.scope) &&
8
+ (!query.projects?.length || query.projects.includes(run.project)) &&
9
+ (!query.machines?.length || onMachines(run, query.machines, query.slotMachines)) &&
10
+ (!query.status || run.status === query.status) &&
11
+ (!query.flow || run.flowType === query.flow) &&
12
+ (!query.lane || run.lane === query.lane) &&
13
+ (!tag || normalizeRunTags(run.tags).includes(tag)) &&
14
+ (!search || matchesSearch(run, search)));
15
+ }
16
+ /** The `slotMachines` map for a fleet snapshot. */
17
+ export function slotMachineMap(slots) {
18
+ return new Map(slots.map((slot) => [slot.slot, slot.machine]));
19
+ }
20
+ /** Incoming runs replace stored runs with the same id; newest first. */
21
+ export function mergeRunsById(existing, incoming) {
22
+ const byId = new Map(existing.map((run) => [run.id, run]));
23
+ for (const run of incoming)
24
+ byId.set(run.id, run);
25
+ return [...byId.values()].sort((left, right) => right.createdAt.localeCompare(left.createdAt));
26
+ }
27
+ function inScope(run, scope) {
28
+ if (scope === 'active')
29
+ return isActiveListRun(run);
30
+ if (scope === 'history')
31
+ return isTerminalRunStatus(run.status);
32
+ return true;
33
+ }
34
+ function onMachines(run, machines, slotMachines) {
35
+ const slotId = resolveRunSlotId(run);
36
+ if (!slotId)
37
+ return false;
38
+ const machine = slotMachines?.get(slotId);
39
+ if (machine)
40
+ return machines.includes(machine);
41
+ return machines.some((name) => slotId === name || slotId.startsWith(`${name}-`));
42
+ }
43
+ function matchesSearch(run, search) {
44
+ return [
45
+ run.ticketOrPr,
46
+ run.summary,
47
+ resolveRunSlotId(run),
48
+ run.metrics.disposition?.replace(/_/g, ' '),
49
+ ...(run.tags ?? []),
50
+ ].some((value) => value?.toLowerCase().includes(search));
51
+ }
52
+ //# 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;CAC3B;AAQD,0FAA0F;AAC1F,qBAAa,sBAAsB;IAS/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,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;gBAGnB,MAAM,EAAE,mBAAmB,EAC5C,OAAO,EAAE,uBAAuB;IAalC,WAAW,QAAO,oBAAoB,CAAkB;IAExD,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG9C;IAEF,OAAO,CAAC,MAAM;IA2Bd,UAAU,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO;IAmC/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,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"}
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;IAsCd;;;;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"}
@@ -1,3 +1,4 @@
1
+ import { isNewerSourceRevision, } from './changes.js';
1
2
  import { sourceStatusParamsForTarget, } from './client.js';
2
3
  import { deriveSourceStatusView, } from './status-view.js';
3
4
  function commandLabel(command) {
@@ -11,6 +12,8 @@ export class SourceStatusController {
11
12
  this.client = client;
12
13
  this.version = 0;
13
14
  this.listeners = new Set();
15
+ this.rereadAfterRead = false;
16
+ this.deniedRead = false;
14
17
  this.getSnapshot = () => this.snapshot;
15
18
  this.subscribe = (listener) => {
16
19
  this.listeners.add(listener);
@@ -23,6 +26,9 @@ export class SourceStatusController {
23
26
  selections: structuredClone([...(context.selections ?? [])]),
24
27
  interactive: true,
25
28
  canEdit: false,
29
+ hidden: true,
30
+ controls: false,
31
+ unsupported: false,
26
32
  };
27
33
  this.update({});
28
34
  }
@@ -38,6 +44,15 @@ export class SourceStatusController {
38
44
  this.snapshot.interactive =
39
45
  !this.snapshot.busy && !this.snapshot.loading && !this.snapshot.pending;
40
46
  this.snapshot.canEdit = this.snapshot.interactive && this.snapshot.view?.editable === true;
47
+ const view = this.snapshot.view;
48
+ // A failed read stays visible, even over a context that was empty when last read.
49
+ this.snapshot.hidden =
50
+ (view?.hidden === true && this.snapshot.error === undefined) ||
51
+ (this.snapshot.error !== undefined && this.deniedRead) ||
52
+ (!view && this.snapshot.error === undefined && !this.snapshot.pending);
53
+ this.snapshot.controls = Boolean(view && (view.editable || view.draft || view.actions.length > 0));
54
+ this.snapshot.unsupported =
55
+ this.status?.configured === true && this.feed?.getState().announced === false;
41
56
  this.snapshot.selectionRefusal =
42
57
  this.snapshot.view?.selectionErrors[0] ??
43
58
  (!this.context.target &&
@@ -53,6 +68,37 @@ export class SourceStatusController {
53
68
  for (const listener of this.listeners)
54
69
  listener();
55
70
  }
71
+ /**
72
+ * Live source status (ADR-069 Amendment 1): reread when the gateway's source
73
+ * revision passes what the last read covered. Reconnects stay with the host,
74
+ * which already rereads on every new connection.
75
+ */
76
+ attachFeed(feed) {
77
+ this.feed = feed;
78
+ const unsubscribe = feed.subscribe(() => this.observeFeed());
79
+ this.observeFeed();
80
+ return () => {
81
+ unsubscribe();
82
+ if (this.feed === feed)
83
+ this.feed = undefined;
84
+ };
85
+ }
86
+ observeFeed() {
87
+ const latest = this.feed?.getState().latest;
88
+ if (latest && isNewerSourceRevision(latest, this.covered)) {
89
+ // A change during any read, the first included, is not covered by it.
90
+ if (this.readingVersion === this.version) {
91
+ this.rereadAfterRead = true;
92
+ return;
93
+ }
94
+ // Before the first read the host's initial load covers the current state.
95
+ if (this.status || this.snapshot.error) {
96
+ void this.refresh();
97
+ return;
98
+ }
99
+ }
100
+ this.update({});
101
+ }
56
102
  setContext(context) {
57
103
  if (JSON.stringify(context) === JSON.stringify(this.context))
58
104
  return false;
@@ -90,18 +136,35 @@ export class SourceStatusController {
90
136
  async refresh() {
91
137
  const version = ++this.version;
92
138
  const params = this.context.params ?? sourceStatusParamsForTarget(undefined, this.context.target);
139
+ // Gateways publish only after a change is readable, so this read covers the mark.
140
+ this.covered = this.feed?.getState().latest;
141
+ this.readingVersion = version;
142
+ this.rereadAfterRead = false;
93
143
  this.update({ loading: true, error: undefined });
94
144
  try {
95
145
  const status = await this.client.status(params);
96
146
  if (version !== this.version)
97
147
  return;
98
148
  this.status = status;
149
+ this.deniedRead = false;
99
150
  this.update({ loading: false });
100
151
  }
101
152
  catch (error) {
102
153
  // Read failures remain visible; stale responses cannot replace another context's facts.
103
- if (version === this.version)
154
+ if (version === this.version) {
155
+ this.deniedRead = error.code === 'AUTH_FORBIDDEN';
104
156
  this.update({ loading: false, error: error.message });
157
+ }
158
+ }
159
+ finally {
160
+ if (version === this.version) {
161
+ this.readingVersion = undefined;
162
+ // A change seen during the read is not covered by it: read once more.
163
+ if (this.rereadAfterRead) {
164
+ this.rereadAfterRead = false;
165
+ void this.refresh();
166
+ }
167
+ }
105
168
  }
106
169
  }
107
170
  select(selection) {
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/sources/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/sources/controller.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export interface SourceStatusViewContext {
13
13
  selections?: readonly SourceSelection[];
14
14
  }
15
15
  export interface SourceStatusRowView {
16
+ /** This source's part of the view's one line. */
17
+ line: string;
16
18
  summary: string;
17
19
  details: string[];
18
20
  declaration: SourceDeclaration;
@@ -36,7 +38,10 @@ export interface SourceStatusRowView {
36
38
  }
37
39
  export interface SourceStatusViewModel {
38
40
  configured: boolean;
39
- readOnlyReason?: string;
41
+ /** Render nothing: no declared sources, pins or recorded run inputs in this context. */
42
+ hidden: boolean;
43
+ /** One line naming each source's effective ref, with branch and scope for pins. */
44
+ line: string;
40
45
  declarationRevision?: number;
41
46
  pinRevision?: number;
42
47
  target?: SourcePinTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"status-view.d.ts","sourceRoot":"","sources":["../../src/sources/status-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AACxD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAItE,CAAC;AAEF,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACjG,gBAAgB,EAAE,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACvC;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,qBAAqB,CA8IvB"}
1
+ {"version":3,"file":"status-view.d.ts","sourceRoot":"","sources":["../../src/sources/status-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AACxD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAItE,CAAC;AAEF,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACjG,gBAAgB,EAAE,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,MAAM,EAAE,OAAO,CAAC;IAChB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACvC;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,qBAAqB,CA+JvB"}
@@ -28,12 +28,10 @@ export function deriveSourceStatusView(status, context) {
28
28
  const declarations = [...declared.values()].filter((source) => !params.sourceId || source.id === params.sourceId);
29
29
  const hasRevisions = Number.isInteger(status.declarationRevision) && Number.isInteger(status.pinRevision);
30
30
  const draft = context.selections !== undefined && context.target === undefined;
31
- return structuredClone({
31
+ const view = structuredClone({
32
32
  configured: status.configured,
33
- readOnlyReason: status.runSource?.selectionRefusal ??
34
- (!status.configured
35
- ? 'Source authority is not configured. Retained inputs are read-only.'
36
- : undefined),
33
+ hidden: false,
34
+ line: '',
37
35
  declarationRevision: status.declarationRevision,
38
36
  pinRevision: status.pinRevision,
39
37
  target: context.target,
@@ -56,7 +54,12 @@ export function deriveSourceStatusView(status, context) {
56
54
  const selectionErrors = selection
57
55
  ? validateSourceSelection(selection, status.declarations)
58
56
  : [];
59
- const draftRef = draft && selection ? (selection.selection === 'main' ? 'main' : selection.ref) : undefined;
57
+ // An empty branch input is not a selection yet.
58
+ const draftRef = draft && selection
59
+ ? selection.selection === 'main'
60
+ ? 'main'
61
+ : selection.ref || undefined
62
+ : undefined;
60
63
  const draftResolution = draftRef
61
64
  ? status.resolutions.find((resolution) => resolution.sourceId === declaration.id &&
62
65
  resolution.ref === draftRef &&
@@ -94,17 +97,28 @@ export function deriveSourceStatusView(status, context) {
94
97
  selectionErrors,
95
98
  canPin: selection?.selection === 'branch' && selectionErrors.length === 0,
96
99
  };
97
- const visiblePin = status.runSource?.state === 'locked' ? row.recordedLocks[0]?.entry.pin : row.effective?.pin;
100
+ const locked = status.runSource?.state === 'locked';
101
+ const recorded = locked ? row.recordedLocks[0]?.entry : undefined;
102
+ const visiblePin = locked ? recorded?.pin : row.effective?.pin;
103
+ const ref = recorded?.effectiveRef ?? row.effective?.effectiveRef ?? declaration.ref ?? 'main';
98
104
  const pinSummary = visiblePin
99
105
  ? `; ${visiblePin.selection === 'branch' ? 'pinned' : 'main override'} ${visiblePin.scope}, base main ${visiblePin.baseMainCommit}`
100
106
  : '';
101
107
  const summary = draftRef !== undefined
102
108
  ? `${declaration.id} run selection ${draftRef} ${draftResolution?.commit ?? 'unresolved'} ${draftResolution?.status ?? 'unknown'}, reported main base ${mainResolution?.commit ?? 'unresolved'}`
103
- : status.runSource?.state === 'locked' && row.recordedLocks[0]
104
- ? `${declaration.id} run input ${row.recordedLocks[0].entry.effectiveRef} ${row.recordedLocks[0].entry.commit}${pinSummary}`
105
- : `${declaration.id} reported ${row.effective?.effectiveRef ?? declaration.ref ?? 'main'} ${row.resolution?.commit ?? 'unresolved'} ${row.resolution?.status ?? 'unknown'}${pinSummary}`;
109
+ : recorded
110
+ ? `${declaration.id} run input ${recorded.effectiveRef} ${recorded.commit}${pinSummary}`
111
+ : `${declaration.id} reported ${ref} ${row.resolution?.commit ?? 'unresolved'} ${row.resolution?.status ?? 'unknown'}${pinSummary}`;
106
112
  return {
107
113
  ...row,
114
+ // A draft names the run selection being prepared, not the farm's current ref.
115
+ line: draftRef !== undefined
116
+ ? `${declaration.id} ${draftRef} (run selection)`
117
+ : !visiblePin
118
+ ? `${declaration.id} ${ref}`
119
+ : visiblePin.selection === 'branch'
120
+ ? `${declaration.id} ${ref} (${visiblePin.scope} pin)`
121
+ : `${declaration.id} main (${visiblePin.scope} override)`,
108
122
  summary,
109
123
  details: [
110
124
  ...(draftRef !== undefined
@@ -118,6 +132,9 @@ export function deriveSourceStatusView(status, context) {
118
132
  }),
119
133
  errors: status.errors,
120
134
  });
135
+ view.hidden = view.rows.length === 0 && !status.pins?.length;
136
+ view.line = view.rows.map((row) => row.line).join(' · ');
137
+ return view;
121
138
  }
122
139
  /** All renderers describe the same reported locks, pin audit and receipt facts. */
123
140
  function sourceRowFacts(row) {