@farmslot/protocol 0.41.0 → 0.43.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 +14 -0
- package/dist/contracts/acceptance.d.ts +5 -0
- package/dist/contracts/acceptance.d.ts.map +1 -1
- package/dist/contracts/acceptance.js.map +1 -1
- package/dist/contracts/dispatch.d.ts +1 -0
- package/dist/contracts/dispatch.d.ts.map +1 -1
- package/dist/contracts/runs.d.ts +25 -0
- package/dist/contracts/runs.d.ts.map +1 -1
- package/dist/contracts/runs.js +7 -0
- package/dist/contracts/runs.js.map +1 -1
- package/dist/contracts/work-graph.d.ts +6 -0
- package/dist/contracts/work-graph.d.ts.map +1 -1
- package/dist/contracts/worker-terminal.d.ts +4 -0
- package/dist/contracts/worker-terminal.d.ts.map +1 -1
- package/dist/contracts/worker-terminal.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/recipe/claim-overrides.d.ts +32 -0
- package/dist/recipe/claim-overrides.d.ts.map +1 -0
- package/dist/recipe/claim-overrides.js +70 -0
- package/dist/recipe/claim-overrides.js.map +1 -0
- package/dist/recipe/claim-reviews.d.ts +26 -0
- package/dist/recipe/claim-reviews.d.ts.map +1 -0
- package/dist/recipe/claim-reviews.js +40 -0
- package/dist/recipe/claim-reviews.js.map +1 -0
- package/dist/recipe/document.d.ts +2 -0
- package/dist/recipe/document.d.ts.map +1 -1
- package/dist/recipe/document.js +39 -0
- package/dist/recipe/document.js.map +1 -1
- package/dist/recipe/evidence.d.ts.map +1 -1
- package/dist/recipe/evidence.js +1 -0
- package/dist/recipe/evidence.js.map +1 -1
- package/dist/recipe/index.d.ts +5 -1
- package/dist/recipe/index.d.ts.map +1 -1
- package/dist/recipe/index.js +4 -1
- package/dist/recipe/index.js.map +1 -1
- package/dist/recipe/publication-manifest.d.ts +30 -0
- package/dist/recipe/publication-manifest.d.ts.map +1 -0
- package/dist/recipe/publication-manifest.js +2 -0
- package/dist/recipe/publication-manifest.js.map +1 -0
- package/dist/recipe/run-contract.d.ts +8 -0
- package/dist/recipe/run-contract.d.ts.map +1 -0
- package/dist/recipe/run-contract.js +10 -0
- package/dist/recipe/run-contract.js.map +1 -0
- package/dist/rpc/dispatch.d.ts +3 -0
- package/dist/rpc/dispatch.d.ts.map +1 -1
- package/dist/rpc/registry.d.ts +5 -0
- package/dist/rpc/registry.d.ts.map +1 -1
- package/dist/rpc/registry.js +5 -0
- package/dist/rpc/registry.js.map +1 -1
- package/dist/rpc/run.d.ts +44 -0
- package/dist/rpc/run.d.ts.map +1 -1
- package/dist/rpc/run.js +2 -0
- package/dist/rpc/run.js.map +1 -1
- package/dist/rpc/sources.d.ts +20 -1
- package/dist/rpc/sources.d.ts.map +1 -1
- package/dist/rpc/work-graph.d.ts +8 -0
- package/dist/rpc/work-graph.d.ts.map +1 -1
- package/dist/rpc/work-graph.js +1 -0
- package/dist/rpc/work-graph.js.map +1 -1
- package/dist/runs/decision-resolution.d.ts +7 -1
- package/dist/runs/decision-resolution.d.ts.map +1 -1
- package/dist/runs/decision-resolution.js +21 -0
- package/dist/runs/decision-resolution.js.map +1 -1
- package/dist/runs/portable-bundle.d.ts.map +1 -1
- package/dist/runs/portable-bundle.js +2 -0
- package/dist/runs/portable-bundle.js.map +1 -1
- package/dist/runs/run-mode.d.ts +2 -0
- package/dist/runs/run-mode.d.ts.map +1 -1
- package/dist/runs/run-mode.js +17 -0
- package/dist/runs/run-mode.js.map +1 -1
- package/dist/sources/client.d.ts +46 -0
- package/dist/sources/client.d.ts.map +1 -0
- package/dist/sources/client.js +83 -0
- package/dist/sources/client.js.map +1 -0
- package/dist/sources/contracts.d.ts +12 -1
- package/dist/sources/contracts.d.ts.map +1 -1
- package/dist/sources/controller.d.ts +40 -0
- package/dist/sources/controller.d.ts.map +1 -0
- package/dist/sources/controller.js +205 -0
- package/dist/sources/controller.js.map +1 -0
- package/dist/sources/pins.d.ts +25 -0
- package/dist/sources/pins.d.ts.map +1 -0
- package/dist/sources/pins.js +65 -0
- package/dist/sources/pins.js.map +1 -0
- package/dist/sources/status-view.d.ts +52 -0
- package/dist/sources/status-view.d.ts.map +1 -0
- package/dist/sources/status-view.js +133 -0
- package/dist/sources/status-view.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-mode.js","sourceRoot":"","sources":["../../src/runs/run-mode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-mode.js","sourceRoot":"","sources":["../../src/runs/run-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Methods } from '../rpc/registry.js';
|
|
2
|
+
import type { SourcesPinParams, SourcesPinResult, SourcesStatusParams, SourcesStatusResult, SourcesSyncParams, SourcesSyncResult, SourcesUnpinParams } from '../rpc/sources.js';
|
|
3
|
+
import { type SourcePinTarget } from './pins.js';
|
|
4
|
+
export type SourceRpcRequest = <T>(method: string, params: unknown) => Promise<T>;
|
|
5
|
+
export type SourcePinInput = Omit<SourcesPinParams, 'operationId' | 'expectedDeclarationRevision' | 'expectedPinRevision'>;
|
|
6
|
+
export type SourceUnpinInput = Omit<SourcePinInput, 'ref'>;
|
|
7
|
+
export type SourceSyncInput = Omit<SourcesSyncParams, 'operationId' | 'expectedDeclarationRevision'>;
|
|
8
|
+
export type PreparedSourceCommand = {
|
|
9
|
+
method: typeof Methods.SOURCES_PIN;
|
|
10
|
+
params: SourcesPinParams;
|
|
11
|
+
} | {
|
|
12
|
+
method: typeof Methods.SOURCES_UNPIN;
|
|
13
|
+
params: SourcesUnpinParams;
|
|
14
|
+
} | {
|
|
15
|
+
method: typeof Methods.SOURCES_SYNC;
|
|
16
|
+
params: SourcesSyncParams;
|
|
17
|
+
};
|
|
18
|
+
interface SourceCommandResults {
|
|
19
|
+
[Methods.SOURCES_PIN]: SourcesPinResult;
|
|
20
|
+
[Methods.SOURCES_UNPIN]: SourcesPinResult;
|
|
21
|
+
[Methods.SOURCES_SYNC]: SourcesSyncResult;
|
|
22
|
+
}
|
|
23
|
+
export type SourceCommandResult<Command extends PreparedSourceCommand> = SourceCommandResults[Command['method']];
|
|
24
|
+
/** One target mapping serves SDK commands and every source status/picker context. */
|
|
25
|
+
export declare function sourceStatusParamsForTarget(sourceId?: string, target?: SourcePinTarget): SourcesStatusParams;
|
|
26
|
+
/** Existing authenticated transports own connectivity. This client never resolves refs. */
|
|
27
|
+
export declare class SourceCommandClient {
|
|
28
|
+
private readonly request;
|
|
29
|
+
constructor(request: SourceRpcRequest);
|
|
30
|
+
status(params?: SourcesStatusParams): Promise<SourcesStatusResult>;
|
|
31
|
+
private revisions;
|
|
32
|
+
preparePin(input: SourcePinInput, operationId?: string): Promise<Extract<PreparedSourceCommand, {
|
|
33
|
+
method: typeof Methods.SOURCES_PIN;
|
|
34
|
+
}>>;
|
|
35
|
+
prepareUnpin(input: SourceUnpinInput, operationId?: string): Promise<Extract<PreparedSourceCommand, {
|
|
36
|
+
method: typeof Methods.SOURCES_UNPIN;
|
|
37
|
+
}>>;
|
|
38
|
+
prepareSync(input?: SourceSyncInput, operationId?: string): Promise<Extract<PreparedSourceCommand, {
|
|
39
|
+
method: typeof Methods.SOURCES_SYNC;
|
|
40
|
+
}>>;
|
|
41
|
+
/** Retry this exact command after a lost response. Never recapture revisions or mint another ID. */
|
|
42
|
+
execute<Command extends PreparedSourceCommand>(command: Command): Promise<SourceCommandResult<Command>>;
|
|
43
|
+
}
|
|
44
|
+
export declare function createSourceCommandClient(request: SourceRpcRequest): SourceCommandClient;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sources/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,WAAW,CAAC;AAE1E,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAClF,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,gBAAgB,EAChB,aAAa,GAAG,6BAA6B,GAAG,qBAAqB,CACtE,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,iBAAiB,EACjB,aAAa,GAAG,6BAA6B,CAC9C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,OAAO,OAAO,CAAC,WAAW,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAChE;IAAE,MAAM,EAAE,OAAO,OAAO,CAAC,aAAa,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACpE;IAAE,MAAM,EAAE,OAAO,OAAO,CAAC,YAAY,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEvE,UAAU,oBAAoB;IAC5B,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAC3C;AACD,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,qBAAqB,IACnE,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAW1C,qFAAqF;AACrF,wBAAgB,2BAA2B,CACzC,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,eAAe,GACvB,mBAAmB,CAYrB;AAMD,2FAA2F;AAC3F,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEtD,MAAM,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAIxD,SAAS;IAgBjB,UAAU,CACd,KAAK,EAAE,cAAc,EACrB,WAAW,SAAmB,GAC7B,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAAE,MAAM,EAAE,OAAO,OAAO,CAAC,WAAW,CAAA;KAAE,CAAC,CAAC;IAa5E,YAAY,CAChB,KAAK,EAAE,gBAAgB,EACvB,WAAW,SAAmB,GAC7B,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAAE,MAAM,EAAE,OAAO,OAAO,CAAC,aAAa,CAAA;KAAE,CAAC,CAAC;IAa9E,WAAW,CACf,KAAK,GAAE,eAAoB,EAC3B,WAAW,SAAmB,GAC7B,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAAE,MAAM,EAAE,OAAO,OAAO,CAAC,YAAY,CAAA;KAAE,CAAC,CAAC;IAWnF,oGAAoG;IAC9F,OAAO,CAAC,OAAO,SAAS,qBAAqB,EACjD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;CAMzC;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,mBAAmB,CAExF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Methods } from '../rpc/registry.js';
|
|
2
|
+
import { validateSourceSelection } from './pins.js';
|
|
3
|
+
function pinRevisions(status) {
|
|
4
|
+
return {
|
|
5
|
+
expectedDeclarationRevision: status.declarationRevision,
|
|
6
|
+
expectedPinRevision: status.pinRevision,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/** One target mapping serves SDK commands and every source status/picker context. */
|
|
10
|
+
export function sourceStatusParamsForTarget(sourceId, target) {
|
|
11
|
+
const params = { ...(sourceId ? { sourceId } : {}) };
|
|
12
|
+
if (!target)
|
|
13
|
+
return params;
|
|
14
|
+
if (!['farm', 'node', 'run'].includes(target.scope) ||
|
|
15
|
+
!target.targetId ||
|
|
16
|
+
(target.scope === 'farm' && target.targetId !== 'farm'))
|
|
17
|
+
throw new Error('Select one source scope and its target.');
|
|
18
|
+
if (target.scope === 'node')
|
|
19
|
+
params.nodeId = target.targetId;
|
|
20
|
+
if (target.scope === 'run')
|
|
21
|
+
params.runId = target.targetId;
|
|
22
|
+
return params;
|
|
23
|
+
}
|
|
24
|
+
function newOperationId() {
|
|
25
|
+
return `sources-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
26
|
+
}
|
|
27
|
+
/** Existing authenticated transports own connectivity. This client never resolves refs. */
|
|
28
|
+
export class SourceCommandClient {
|
|
29
|
+
constructor(request) {
|
|
30
|
+
this.request = request;
|
|
31
|
+
}
|
|
32
|
+
status(params = {}) {
|
|
33
|
+
return this.request(Methods.SOURCES_STATUS, params);
|
|
34
|
+
}
|
|
35
|
+
async revisions(sourceId, target) {
|
|
36
|
+
const status = await this.status(sourceStatusParamsForTarget(sourceId, target));
|
|
37
|
+
if (!status.configured || !Number.isInteger(status.declarationRevision))
|
|
38
|
+
throw new Error('Source authority is unavailable or unsupported.');
|
|
39
|
+
if (target && !Number.isInteger(status.pinRevision))
|
|
40
|
+
throw new Error('This gateway does not support scoped source pins.');
|
|
41
|
+
if (target?.scope === 'run' && status.runSource?.canSelectSources !== true)
|
|
42
|
+
throw new Error(status.runSource?.selectionRefusal ?? 'Create another run to change source inputs.');
|
|
43
|
+
return status;
|
|
44
|
+
}
|
|
45
|
+
async preparePin(input, operationId = newOperationId()) {
|
|
46
|
+
const status = await this.revisions(input.sourceId, input);
|
|
47
|
+
const errors = validateSourceSelection({ sourceId: input.sourceId, selection: 'branch', ref: input.ref }, status.declarations);
|
|
48
|
+
if (errors.length)
|
|
49
|
+
throw new Error(errors.join(' '));
|
|
50
|
+
return {
|
|
51
|
+
method: Methods.SOURCES_PIN,
|
|
52
|
+
params: { ...input, operationId, ...pinRevisions(status) },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async prepareUnpin(input, operationId = newOperationId()) {
|
|
56
|
+
const status = await this.revisions(input.sourceId, input);
|
|
57
|
+
const errors = validateSourceSelection({ sourceId: input.sourceId, selection: 'main' }, status.declarations);
|
|
58
|
+
if (errors.length)
|
|
59
|
+
throw new Error(errors.join(' '));
|
|
60
|
+
return {
|
|
61
|
+
method: Methods.SOURCES_UNPIN,
|
|
62
|
+
params: { ...input, operationId, ...pinRevisions(status) },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async prepareSync(input = {}, operationId = newOperationId()) {
|
|
66
|
+
const status = await this.revisions(input.sourceId, input.nodeId ? { scope: 'node', targetId: input.nodeId } : undefined);
|
|
67
|
+
return {
|
|
68
|
+
method: Methods.SOURCES_SYNC,
|
|
69
|
+
params: { ...input, operationId, expectedDeclarationRevision: status.declarationRevision },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Retry this exact command after a lost response. Never recapture revisions or mint another ID. */
|
|
73
|
+
async execute(command) {
|
|
74
|
+
const result = await this.request(command.method, command.params);
|
|
75
|
+
if (result.operationId !== command.params.operationId)
|
|
76
|
+
throw new Error('Source acknowledgement belongs to a different operation.');
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function createSourceCommandClient(request) {
|
|
81
|
+
return new SourceCommandClient(request);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sources/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,6 +98,15 @@ export interface RunSourceProvenance {
|
|
|
98
98
|
bindings: SourceEntryRef[];
|
|
99
99
|
attempts: SourceExecutionAttemptReceipt[];
|
|
100
100
|
}
|
|
101
|
+
/** Read-only planning is revalidated before a run owns any source-dependent effect. */
|
|
102
|
+
export interface RunSourcePlan {
|
|
103
|
+
state: 'planned';
|
|
104
|
+
/** Slot used to validate configuration, separate from the caller's placement request. */
|
|
105
|
+
validatedSlotId?: string;
|
|
106
|
+
lock: SourceLock;
|
|
107
|
+
workerLock: SourceLock;
|
|
108
|
+
bindings: SourceEntryRef[];
|
|
109
|
+
}
|
|
101
110
|
export interface SourceExecutionAttemptReceipt {
|
|
102
111
|
id: string;
|
|
103
112
|
receiptIds: string[];
|
|
@@ -120,8 +129,10 @@ export interface SourceNodeStatus {
|
|
|
120
129
|
}
|
|
121
130
|
export interface RunSourceStatus {
|
|
122
131
|
runId: string;
|
|
123
|
-
state: 'locked' | 'unknown-legacy';
|
|
132
|
+
state: 'planned' | 'locked' | 'unknown-legacy';
|
|
124
133
|
lockDigest?: string;
|
|
125
134
|
attemptId?: string;
|
|
135
|
+
canSelectSources?: boolean;
|
|
136
|
+
selectionRefusal?: string;
|
|
126
137
|
}
|
|
127
138
|
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/sources/contracts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/sources/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type PreparedSourceCommand, type SourceCommandClient } from './client.js';
|
|
2
|
+
import type { SourceSelection } from './pins.js';
|
|
3
|
+
import { type SourceStatusViewContext, type SourceStatusViewModel, type SourceViewAction } from './status-view.js';
|
|
4
|
+
export interface SourceStatusSnapshot {
|
|
5
|
+
loading: boolean;
|
|
6
|
+
busy: boolean;
|
|
7
|
+
view?: SourceStatusViewModel;
|
|
8
|
+
error?: string;
|
|
9
|
+
operationError?: string;
|
|
10
|
+
notice?: string;
|
|
11
|
+
pending?: PreparedSourceCommand;
|
|
12
|
+
pendingLabel?: string;
|
|
13
|
+
canRetry?: boolean;
|
|
14
|
+
selections: SourceSelection[];
|
|
15
|
+
interactive: boolean;
|
|
16
|
+
canEdit: boolean;
|
|
17
|
+
selectionRefusal?: string;
|
|
18
|
+
}
|
|
19
|
+
/** One context-bound controller serves thin web/native status and selection renderers. */
|
|
20
|
+
export declare class SourceStatusController {
|
|
21
|
+
private readonly client;
|
|
22
|
+
private context;
|
|
23
|
+
private status?;
|
|
24
|
+
private version;
|
|
25
|
+
private listeners;
|
|
26
|
+
private snapshot;
|
|
27
|
+
private pendingConnectionKey?;
|
|
28
|
+
constructor(client: SourceCommandClient, context: SourceStatusViewContext);
|
|
29
|
+
getSnapshot: () => SourceStatusSnapshot;
|
|
30
|
+
subscribe: (listener: () => void) => (() => void);
|
|
31
|
+
private update;
|
|
32
|
+
setContext(context: SourceStatusViewContext): boolean;
|
|
33
|
+
refresh(): Promise<void>;
|
|
34
|
+
select(selection: SourceSelection): void;
|
|
35
|
+
clearSelection(sourceId: string): void;
|
|
36
|
+
apply(action: SourceViewAction, sourceId?: string): Promise<void>;
|
|
37
|
+
retry(): Promise<void>;
|
|
38
|
+
private submitPending;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { sourceStatusParamsForTarget, } from './client.js';
|
|
2
|
+
import { deriveSourceStatusView, } from './status-view.js';
|
|
3
|
+
function commandLabel(command) {
|
|
4
|
+
if (command.method === 'sources.sync')
|
|
5
|
+
return `Sync ${command.params.sourceId ?? 'sources'} on ${command.params.nodeId ?? 'the farm'}`;
|
|
6
|
+
return `${command.method === 'sources.pin' ? `Pin ${command.params.sourceId} to ${command.params.ref}` : `Return ${command.params.sourceId} to main`} on ${command.params.scope} ${command.params.targetId}`;
|
|
7
|
+
}
|
|
8
|
+
/** One context-bound controller serves thin web/native status and selection renderers. */
|
|
9
|
+
export class SourceStatusController {
|
|
10
|
+
constructor(client, context) {
|
|
11
|
+
this.client = client;
|
|
12
|
+
this.version = 0;
|
|
13
|
+
this.listeners = new Set();
|
|
14
|
+
this.getSnapshot = () => this.snapshot;
|
|
15
|
+
this.subscribe = (listener) => {
|
|
16
|
+
this.listeners.add(listener);
|
|
17
|
+
return () => this.listeners.delete(listener);
|
|
18
|
+
};
|
|
19
|
+
this.context = structuredClone(context);
|
|
20
|
+
this.snapshot = {
|
|
21
|
+
loading: false,
|
|
22
|
+
busy: false,
|
|
23
|
+
selections: structuredClone([...(context.selections ?? [])]),
|
|
24
|
+
interactive: true,
|
|
25
|
+
canEdit: false,
|
|
26
|
+
};
|
|
27
|
+
this.update({});
|
|
28
|
+
}
|
|
29
|
+
update(change) {
|
|
30
|
+
this.snapshot = { ...this.snapshot, ...change };
|
|
31
|
+
if (this.status)
|
|
32
|
+
this.snapshot.view = deriveSourceStatusView(this.status, {
|
|
33
|
+
...this.context,
|
|
34
|
+
...(this.context.selections !== undefined || this.snapshot.selections.length
|
|
35
|
+
? { selections: this.snapshot.selections }
|
|
36
|
+
: {}),
|
|
37
|
+
});
|
|
38
|
+
this.snapshot.interactive =
|
|
39
|
+
!this.snapshot.busy && !this.snapshot.loading && !this.snapshot.pending;
|
|
40
|
+
this.snapshot.canEdit = this.snapshot.interactive && this.snapshot.view?.editable === true;
|
|
41
|
+
this.snapshot.selectionRefusal =
|
|
42
|
+
this.snapshot.view?.selectionErrors[0] ??
|
|
43
|
+
(!this.context.target &&
|
|
44
|
+
this.context.selections !== undefined &&
|
|
45
|
+
this.snapshot.selections.length
|
|
46
|
+
? (this.snapshot.error ??
|
|
47
|
+
(!this.snapshot.interactive
|
|
48
|
+
? 'Wait for source selection validation.'
|
|
49
|
+
: !this.snapshot.view
|
|
50
|
+
? 'Source selection facts are unavailable.'
|
|
51
|
+
: undefined))
|
|
52
|
+
: undefined);
|
|
53
|
+
for (const listener of this.listeners)
|
|
54
|
+
listener();
|
|
55
|
+
}
|
|
56
|
+
setContext(context) {
|
|
57
|
+
if (JSON.stringify(context) === JSON.stringify(this.context))
|
|
58
|
+
return false;
|
|
59
|
+
if (JSON.stringify({ ...context, selections: undefined }) ===
|
|
60
|
+
JSON.stringify({ ...this.context, selections: undefined })) {
|
|
61
|
+
this.context = structuredClone(context);
|
|
62
|
+
if (this.snapshot.busy && !this.snapshot.pending)
|
|
63
|
+
this.version++;
|
|
64
|
+
this.update({ selections: structuredClone([...(context.selections ?? [])]) });
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
this.context = structuredClone(context);
|
|
68
|
+
this.version++;
|
|
69
|
+
this.status = undefined;
|
|
70
|
+
// An uncertain mutation retains its exact old target/request even if the view changes.
|
|
71
|
+
const canRetry = this.pendingConnectionKey === context.connectionKey;
|
|
72
|
+
this.update({
|
|
73
|
+
loading: false,
|
|
74
|
+
view: undefined,
|
|
75
|
+
error: undefined,
|
|
76
|
+
operationError: undefined,
|
|
77
|
+
notice: undefined,
|
|
78
|
+
selections: structuredClone([...(context.selections ?? [])]),
|
|
79
|
+
...(this.snapshot.pending
|
|
80
|
+
? {
|
|
81
|
+
canRetry,
|
|
82
|
+
pendingLabel: canRetry
|
|
83
|
+
? commandLabel(this.snapshot.pending)
|
|
84
|
+
: 'A source action belongs to the previous farm connection.',
|
|
85
|
+
}
|
|
86
|
+
: {}),
|
|
87
|
+
});
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
async refresh() {
|
|
91
|
+
const version = ++this.version;
|
|
92
|
+
const params = this.context.params ?? sourceStatusParamsForTarget(undefined, this.context.target);
|
|
93
|
+
this.update({ loading: true, error: undefined });
|
|
94
|
+
try {
|
|
95
|
+
const status = await this.client.status(params);
|
|
96
|
+
if (version !== this.version)
|
|
97
|
+
return;
|
|
98
|
+
this.status = status;
|
|
99
|
+
this.update({ loading: false });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Read failures remain visible; stale responses cannot replace another context's facts.
|
|
103
|
+
if (version === this.version)
|
|
104
|
+
this.update({ loading: false, error: error.message });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
select(selection) {
|
|
108
|
+
if (!this.snapshot.view?.editable || this.snapshot.busy || this.snapshot.pending)
|
|
109
|
+
return;
|
|
110
|
+
const selections = this.snapshot.selections.filter((value) => value.sourceId !== selection.sourceId);
|
|
111
|
+
selections.push(structuredClone(selection));
|
|
112
|
+
this.update({ selections });
|
|
113
|
+
}
|
|
114
|
+
clearSelection(sourceId) {
|
|
115
|
+
if (!this.snapshot.view?.editable || this.snapshot.busy || this.snapshot.pending)
|
|
116
|
+
return;
|
|
117
|
+
this.update({
|
|
118
|
+
selections: this.snapshot.selections.filter((selection) => selection.sourceId !== sourceId),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async apply(action, sourceId) {
|
|
122
|
+
if (this.snapshot.busy ||
|
|
123
|
+
this.snapshot.pending ||
|
|
124
|
+
!this.snapshot.view?.actions.includes(action))
|
|
125
|
+
return;
|
|
126
|
+
const version = this.version;
|
|
127
|
+
this.update({ busy: true, error: undefined, operationError: undefined, notice: undefined });
|
|
128
|
+
try {
|
|
129
|
+
const target = this.context.target;
|
|
130
|
+
let command;
|
|
131
|
+
if (action === 'sync')
|
|
132
|
+
command = await this.client.prepareSync({
|
|
133
|
+
...(sourceId ? { sourceId } : {}),
|
|
134
|
+
...(target?.scope === 'node' ? { nodeId: target.targetId } : {}),
|
|
135
|
+
});
|
|
136
|
+
else {
|
|
137
|
+
if (!target || !sourceId)
|
|
138
|
+
throw new Error('Select a source and its scope.');
|
|
139
|
+
if (action === 'unpin')
|
|
140
|
+
command = await this.client.prepareUnpin({ sourceId, ...target });
|
|
141
|
+
else {
|
|
142
|
+
const selection = this.snapshot.selections.find((value) => value.sourceId === sourceId);
|
|
143
|
+
command = await this.client.preparePin({
|
|
144
|
+
sourceId,
|
|
145
|
+
...target,
|
|
146
|
+
ref: selection?.ref ?? '',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (version !== this.version)
|
|
151
|
+
throw new Error('Source view changed before sending. Review the current scope and try again.');
|
|
152
|
+
this.pendingConnectionKey = this.context.connectionKey;
|
|
153
|
+
this.update({ pending: command, pendingLabel: commandLabel(command), canRetry: true });
|
|
154
|
+
await this.submitPending();
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Preparation has no mutation effect; submitPending retains uncertain submitted requests.
|
|
158
|
+
this.update({ busy: false, error: error.message });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async retry() {
|
|
162
|
+
if (this.snapshot.busy || !this.snapshot.pending)
|
|
163
|
+
return;
|
|
164
|
+
if (this.pendingConnectionKey !== this.context.connectionKey) {
|
|
165
|
+
this.update({ error: 'Select the original farm connection to retry this source action.' });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
await this.submitPending();
|
|
169
|
+
}
|
|
170
|
+
async submitPending() {
|
|
171
|
+
const command = this.snapshot.pending;
|
|
172
|
+
if (!command)
|
|
173
|
+
return;
|
|
174
|
+
this.update({ busy: true, error: undefined, operationError: undefined });
|
|
175
|
+
try {
|
|
176
|
+
const result = await this.client.execute(command);
|
|
177
|
+
const errors = 'errors' in result ? result.errors : [];
|
|
178
|
+
this.update({
|
|
179
|
+
busy: false,
|
|
180
|
+
pending: undefined,
|
|
181
|
+
pendingLabel: undefined,
|
|
182
|
+
canRetry: false,
|
|
183
|
+
notice: `${commandLabel(command)} ${errors.length ? 'completed with errors' : 'applied'}.`,
|
|
184
|
+
// Read refreshes report current facts separately from this operation's diagnostics.
|
|
185
|
+
operationError: errors.length
|
|
186
|
+
? errors
|
|
187
|
+
.map((error) => `${[error.nodeId, error.sourceId, error.project].filter(Boolean).join(' / ') || 'Source'}: ${error.reason}`)
|
|
188
|
+
.join('\n')
|
|
189
|
+
: undefined,
|
|
190
|
+
selections: [],
|
|
191
|
+
});
|
|
192
|
+
await this.refresh();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// A missing acknowledgement keeps the same operation ID, revisions and explicit target.
|
|
196
|
+
const stale = error.code === 'SOURCE_STATE_STALE';
|
|
197
|
+
this.update({
|
|
198
|
+
busy: false,
|
|
199
|
+
operationError: error.message,
|
|
200
|
+
...(stale ? { pending: undefined, pendingLabel: undefined, canRetry: false } : {}),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/sources/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SourceDeclaration, SourceLock, SourcePin } from './contracts.js';
|
|
2
|
+
export interface SourceSelection {
|
|
3
|
+
sourceId: string;
|
|
4
|
+
selection: 'branch' | 'main';
|
|
5
|
+
ref?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SourcePinTarget {
|
|
8
|
+
scope: SourcePin['scope'];
|
|
9
|
+
targetId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SourceEffectiveSelection {
|
|
12
|
+
sourceId: string;
|
|
13
|
+
declaredRef: string;
|
|
14
|
+
effectiveRef: string;
|
|
15
|
+
scope: SourcePin['scope'];
|
|
16
|
+
pin?: SourcePin;
|
|
17
|
+
shadowedPins: SourcePin[];
|
|
18
|
+
}
|
|
19
|
+
/** Branch syntax is portable; the gateway must also verify it exists upstream. */
|
|
20
|
+
export declare function isSourceBranchRef(ref: string): boolean;
|
|
21
|
+
export declare function validateSourceSelection(value: unknown, declarations?: readonly Pick<SourceDeclaration, 'id'>[]): string[];
|
|
22
|
+
export declare function validateSourceSelections(value: unknown, declarations?: readonly Pick<SourceDeclaration, 'id'>[]): string[];
|
|
23
|
+
/** One precedence calculation serves authority locks and all client projections. */
|
|
24
|
+
export declare function selectEffectiveSource(source: SourceDeclaration, pins: readonly SourcePin[], context?: Pick<SourceLock['context'], 'runId' | 'nodeId'>): SourceEffectiveSelection;
|
|
25
|
+
//# sourceMappingURL=pins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pins.d.ts","sourceRoot":"","sources":["../../src/sources/pins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYtD;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,SAAS,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,GACtD,MAAM,EAAE,CAwBV;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,SAAS,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,GACtD,MAAM,EAAE,CAMV;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,OAAO,GAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAM,GAC5D,wBAAwB,CAqB1B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Branch syntax is portable; the gateway must also verify it exists upstream. */
|
|
2
|
+
export function isSourceBranchRef(ref) {
|
|
3
|
+
const branch = ref.replace(/^refs\/heads\//, '');
|
|
4
|
+
return (/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/.test(branch) &&
|
|
5
|
+
!/^[0-9a-f]{40}$|^[0-9a-f]{64}$/.test(branch) &&
|
|
6
|
+
!branch.includes('..') &&
|
|
7
|
+
!branch.includes('//') &&
|
|
8
|
+
!branch.endsWith('/') &&
|
|
9
|
+
!branch.endsWith('.') &&
|
|
10
|
+
!branch.split('/').some((part) => part.startsWith('.') || part.endsWith('.lock')) &&
|
|
11
|
+
!ref.startsWith('refs/tags/'));
|
|
12
|
+
}
|
|
13
|
+
export function validateSourceSelection(value, declarations) {
|
|
14
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
15
|
+
return ['Select a declared source and a pushed branch or main.'];
|
|
16
|
+
const selected = value;
|
|
17
|
+
const errors = [];
|
|
18
|
+
if (typeof selected.sourceId !== 'string' ||
|
|
19
|
+
!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(selected.sourceId))
|
|
20
|
+
errors.push('Select a valid source ID.');
|
|
21
|
+
if (declarations && !declarations.some((source) => source.id === selected.sourceId))
|
|
22
|
+
errors.push('The source is not declared in this farm.');
|
|
23
|
+
if (selected.selection !== 'branch' && selected.selection !== 'main')
|
|
24
|
+
errors.push('Selection must be a pushed branch or main.');
|
|
25
|
+
if (selected.selection === 'branch' &&
|
|
26
|
+
(typeof selected.ref !== 'string' || !isSourceBranchRef(selected.ref)))
|
|
27
|
+
errors.push('Select a pushed branch, without local paths, tags or commit-only refs.');
|
|
28
|
+
if (selected.selection === 'main' && selected.ref !== undefined && selected.ref !== 'main')
|
|
29
|
+
errors.push('Returning to main cannot select another ref.');
|
|
30
|
+
if (Object.keys(selected).some((key) => !['sourceId', 'selection', 'ref'].includes(key)))
|
|
31
|
+
errors.push('Source selections contain unsupported fields.');
|
|
32
|
+
return errors;
|
|
33
|
+
}
|
|
34
|
+
export function validateSourceSelections(value, declarations) {
|
|
35
|
+
if (!Array.isArray(value))
|
|
36
|
+
return ['Source selections must be an array.'];
|
|
37
|
+
const errors = value.flatMap((selection) => validateSourceSelection(selection, declarations));
|
|
38
|
+
const ids = value.map((selection) => selection?.sourceId);
|
|
39
|
+
if (new Set(ids).size !== ids.length)
|
|
40
|
+
errors.push('Select each declared source once.');
|
|
41
|
+
return errors;
|
|
42
|
+
}
|
|
43
|
+
/** One precedence calculation serves authority locks and all client projections. */
|
|
44
|
+
export function selectEffectiveSource(source, pins, context = {}) {
|
|
45
|
+
const rank = (pin) => pin.scope === 'run' && pin.targetId === context.runId
|
|
46
|
+
? 3
|
|
47
|
+
: pin.scope === 'node' && pin.targetId === context.nodeId
|
|
48
|
+
? 2
|
|
49
|
+
: pin.scope === 'farm'
|
|
50
|
+
? 1
|
|
51
|
+
: 0;
|
|
52
|
+
const applicable = pins
|
|
53
|
+
.filter((pin) => pin.sourceId === source.id && rank(pin) > 0)
|
|
54
|
+
.sort((a, b) => rank(b) - rank(a));
|
|
55
|
+
const pin = applicable[0];
|
|
56
|
+
return {
|
|
57
|
+
sourceId: source.id,
|
|
58
|
+
declaredRef: source.ref ?? 'main',
|
|
59
|
+
effectiveRef: pin?.ref ?? source.ref ?? 'main',
|
|
60
|
+
scope: pin?.scope ?? 'farm',
|
|
61
|
+
...(pin ? { pin: structuredClone(pin) } : {}),
|
|
62
|
+
shadowedPins: structuredClone(applicable.slice(1)),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=pins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pins.js","sourceRoot":"","sources":["../../src/sources/pins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { SourcesStatusParams, SourcesStatusResult } from '../rpc/sources.js';
|
|
2
|
+
import type { SourceDeclaration, SourceLock, SourceLockEntry, SourceResolution } from './contracts.js';
|
|
3
|
+
import { type SourceEffectiveSelection, type SourcePinTarget, type SourceSelection } from './pins.js';
|
|
4
|
+
export type SourceViewAction = 'sync' | 'pin' | 'unpin';
|
|
5
|
+
export declare const SOURCE_VIEW_ACTION_LABELS: Record<SourceViewAction, string>;
|
|
6
|
+
/** Callers select presentation and actions; the gateway remains the mutation authority. */
|
|
7
|
+
export interface SourceStatusViewContext {
|
|
8
|
+
/** Opaque authenticated transport identity supplied by existing host connection authority. */
|
|
9
|
+
connectionKey?: string;
|
|
10
|
+
params?: SourcesStatusParams;
|
|
11
|
+
target?: SourcePinTarget;
|
|
12
|
+
actions: readonly SourceViewAction[];
|
|
13
|
+
selections?: readonly SourceSelection[];
|
|
14
|
+
}
|
|
15
|
+
export interface SourceStatusRowView {
|
|
16
|
+
summary: string;
|
|
17
|
+
details: string[];
|
|
18
|
+
declaration: SourceDeclaration;
|
|
19
|
+
effective?: SourceEffectiveSelection;
|
|
20
|
+
resolution?: SourceResolution;
|
|
21
|
+
recordedLocks: Array<{
|
|
22
|
+
digest: string;
|
|
23
|
+
context: SourceLock['context'];
|
|
24
|
+
entry: SourceLockEntry;
|
|
25
|
+
}>;
|
|
26
|
+
materializations: Array<{
|
|
27
|
+
nodeId: string;
|
|
28
|
+
lockDigest: string;
|
|
29
|
+
commit: string;
|
|
30
|
+
verifiedAt?: string;
|
|
31
|
+
drift: string[];
|
|
32
|
+
}>;
|
|
33
|
+
selection?: SourceSelection;
|
|
34
|
+
selectionErrors: string[];
|
|
35
|
+
canPin: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface SourceStatusViewModel {
|
|
38
|
+
configured: boolean;
|
|
39
|
+
declarationRevision?: number;
|
|
40
|
+
pinRevision?: number;
|
|
41
|
+
target?: SourcePinTarget;
|
|
42
|
+
actions: SourceViewAction[];
|
|
43
|
+
editable: boolean;
|
|
44
|
+
draft: boolean;
|
|
45
|
+
runSource: SourcesStatusResult['runSource'];
|
|
46
|
+
rows: SourceStatusRowView[];
|
|
47
|
+
selectionErrors: string[];
|
|
48
|
+
errors: SourcesStatusResult['errors'];
|
|
49
|
+
}
|
|
50
|
+
/** Project reported facts only. Retained generations are never inferred to be drift. */
|
|
51
|
+
export declare function deriveSourceStatusView(status: SourcesStatusResult, context: SourceStatusViewContext): SourceStatusViewModel;
|
|
52
|
+
//# sourceMappingURL=status-view.d.ts.map
|