@farmslot/protocol 0.40.0 → 0.42.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 (153) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/contracts/acceptance.d.ts +5 -0
  3. package/dist/contracts/acceptance.d.ts.map +1 -1
  4. package/dist/contracts/acceptance.js.map +1 -1
  5. package/dist/contracts/config.d.ts.map +1 -1
  6. package/dist/contracts/config.js +6 -1
  7. package/dist/contracts/config.js.map +1 -1
  8. package/dist/contracts/dispatch.d.ts +1 -0
  9. package/dist/contracts/dispatch.d.ts.map +1 -1
  10. package/dist/contracts/execution-templates.d.ts +9 -0
  11. package/dist/contracts/execution-templates.d.ts.map +1 -1
  12. package/dist/contracts/execution-templates.js.map +1 -1
  13. package/dist/contracts/family.d.ts +6 -0
  14. package/dist/contracts/family.d.ts.map +1 -1
  15. package/dist/contracts/family.js.map +1 -1
  16. package/dist/contracts/run-gate-readiness.d.ts +19 -0
  17. package/dist/contracts/run-gate-readiness.d.ts.map +1 -1
  18. package/dist/contracts/run-gate-readiness.js.map +1 -1
  19. package/dist/contracts/runs.d.ts +39 -2
  20. package/dist/contracts/runs.d.ts.map +1 -1
  21. package/dist/contracts/runs.js +8 -0
  22. package/dist/contracts/runs.js.map +1 -1
  23. package/dist/contracts/work-graph.d.ts +6 -0
  24. package/dist/contracts/work-graph.d.ts.map +1 -1
  25. package/dist/contracts/worker-terminal.d.ts +4 -0
  26. package/dist/contracts/worker-terminal.d.ts.map +1 -1
  27. package/dist/contracts/worker-terminal.js.map +1 -1
  28. package/dist/index.d.ts +8 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +8 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/node/pack-portability.d.ts.map +1 -1
  33. package/dist/node/pack-portability.js +16 -1
  34. package/dist/node/pack-portability.js.map +1 -1
  35. package/dist/recipe/claim-overrides.d.ts +32 -0
  36. package/dist/recipe/claim-overrides.d.ts.map +1 -0
  37. package/dist/recipe/claim-overrides.js +67 -0
  38. package/dist/recipe/claim-overrides.js.map +1 -0
  39. package/dist/recipe/document.d.ts +2 -0
  40. package/dist/recipe/document.d.ts.map +1 -1
  41. package/dist/recipe/document.js +39 -0
  42. package/dist/recipe/document.js.map +1 -1
  43. package/dist/recipe/evidence.d.ts.map +1 -1
  44. package/dist/recipe/evidence.js +1 -0
  45. package/dist/recipe/evidence.js.map +1 -1
  46. package/dist/recipe/hud-intent.d.ts +5 -0
  47. package/dist/recipe/hud-intent.d.ts.map +1 -1
  48. package/dist/recipe/hud-intent.js +39 -0
  49. package/dist/recipe/hud-intent.js.map +1 -1
  50. package/dist/recipe/index.d.ts +6 -2
  51. package/dist/recipe/index.d.ts.map +1 -1
  52. package/dist/recipe/index.js +5 -2
  53. package/dist/recipe/index.js.map +1 -1
  54. package/dist/recipe/publication-manifest.d.ts +30 -0
  55. package/dist/recipe/publication-manifest.d.ts.map +1 -0
  56. package/dist/recipe/publication-manifest.js +2 -0
  57. package/dist/recipe/publication-manifest.js.map +1 -0
  58. package/dist/recipe/run-contract.d.ts +8 -0
  59. package/dist/recipe/run-contract.d.ts.map +1 -0
  60. package/dist/recipe/run-contract.js +10 -0
  61. package/dist/recipe/run-contract.js.map +1 -0
  62. package/dist/recipe/run-pointer.d.ts +9 -0
  63. package/dist/recipe/run-pointer.d.ts.map +1 -0
  64. package/dist/recipe/run-pointer.js +20 -0
  65. package/dist/recipe/run-pointer.js.map +1 -0
  66. package/dist/recipes/step-io.d.ts +2 -0
  67. package/dist/recipes/step-io.d.ts.map +1 -1
  68. package/dist/recipes/step-io.js +5 -0
  69. package/dist/recipes/step-io.js.map +1 -1
  70. package/dist/roadmap/delivery-view.d.ts +12 -0
  71. package/dist/roadmap/delivery-view.d.ts.map +1 -0
  72. package/dist/roadmap/delivery-view.js +15 -0
  73. package/dist/roadmap/delivery-view.js.map +1 -0
  74. package/dist/rpc/dispatch.d.ts +3 -0
  75. package/dist/rpc/dispatch.d.ts.map +1 -1
  76. package/dist/rpc/index.d.ts +1 -0
  77. package/dist/rpc/index.d.ts.map +1 -1
  78. package/dist/rpc/index.js +1 -0
  79. package/dist/rpc/index.js.map +1 -1
  80. package/dist/rpc/registry.d.ts +6 -0
  81. package/dist/rpc/registry.d.ts.map +1 -1
  82. package/dist/rpc/registry.js +6 -0
  83. package/dist/rpc/registry.js.map +1 -1
  84. package/dist/rpc/run.d.ts +40 -0
  85. package/dist/rpc/run.d.ts.map +1 -1
  86. package/dist/rpc/run.js +1 -0
  87. package/dist/rpc/run.js.map +1 -1
  88. package/dist/rpc/sources.d.ts +50 -0
  89. package/dist/rpc/sources.d.ts.map +1 -0
  90. package/dist/rpc/sources.js +2 -0
  91. package/dist/rpc/sources.js.map +1 -0
  92. package/dist/rpc/work-graph.d.ts +8 -0
  93. package/dist/rpc/work-graph.d.ts.map +1 -1
  94. package/dist/rpc/work-graph.js +1 -0
  95. package/dist/rpc/work-graph.js.map +1 -1
  96. package/dist/runs/decision-resolution.d.ts +9 -1
  97. package/dist/runs/decision-resolution.d.ts.map +1 -1
  98. package/dist/runs/decision-resolution.js +24 -0
  99. package/dist/runs/decision-resolution.js.map +1 -1
  100. package/dist/runs/family-iteration-ledger.d.ts +2 -0
  101. package/dist/runs/family-iteration-ledger.d.ts.map +1 -1
  102. package/dist/runs/family-iteration-ledger.js +15 -3
  103. package/dist/runs/family-iteration-ledger.js.map +1 -1
  104. package/dist/runs/portable-bundle.d.ts.map +1 -1
  105. package/dist/runs/portable-bundle.js +2 -0
  106. package/dist/runs/portable-bundle.js.map +1 -1
  107. package/dist/runs/publish-approval.d.ts +8 -0
  108. package/dist/runs/publish-approval.d.ts.map +1 -1
  109. package/dist/runs/publish-approval.js +32 -0
  110. package/dist/runs/publish-approval.js.map +1 -1
  111. package/dist/runs/review-chain.d.ts +9 -0
  112. package/dist/runs/review-chain.d.ts.map +1 -1
  113. package/dist/runs/review-chain.js +24 -0
  114. package/dist/runs/review-chain.js.map +1 -1
  115. package/dist/runs/review-retries.d.ts +4 -1
  116. package/dist/runs/review-retries.d.ts.map +1 -1
  117. package/dist/runs/review-retries.js +16 -0
  118. package/dist/runs/review-retries.js.map +1 -1
  119. package/dist/runs/run-mode.d.ts +2 -0
  120. package/dist/runs/run-mode.d.ts.map +1 -1
  121. package/dist/runs/run-mode.js +17 -0
  122. package/dist/runs/run-mode.js.map +1 -1
  123. package/dist/runs/run-title.d.ts +18 -0
  124. package/dist/runs/run-title.d.ts.map +1 -0
  125. package/dist/runs/run-title.js +64 -0
  126. package/dist/runs/run-title.js.map +1 -0
  127. package/dist/sources/client.d.ts +46 -0
  128. package/dist/sources/client.d.ts.map +1 -0
  129. package/dist/sources/client.js +83 -0
  130. package/dist/sources/client.js.map +1 -0
  131. package/dist/sources/contracts.d.ts +138 -0
  132. package/dist/sources/contracts.d.ts.map +1 -0
  133. package/dist/sources/contracts.js +2 -0
  134. package/dist/sources/contracts.js.map +1 -0
  135. package/dist/sources/controller.d.ts +40 -0
  136. package/dist/sources/controller.d.ts.map +1 -0
  137. package/dist/sources/controller.js +205 -0
  138. package/dist/sources/controller.js.map +1 -0
  139. package/dist/sources/pins.d.ts +25 -0
  140. package/dist/sources/pins.d.ts.map +1 -0
  141. package/dist/sources/pins.js +65 -0
  142. package/dist/sources/pins.js.map +1 -0
  143. package/dist/sources/status-view.d.ts +52 -0
  144. package/dist/sources/status-view.d.ts.map +1 -0
  145. package/dist/sources/status-view.js +133 -0
  146. package/dist/sources/status-view.js.map +1 -0
  147. package/dist/sources/validation.d.ts +9 -0
  148. package/dist/sources/validation.d.ts.map +1 -0
  149. package/dist/sources/validation.js +79 -0
  150. package/dist/sources/validation.js.map +1 -0
  151. package/dist/version.d.ts +1 -1
  152. package/dist/version.js +1 -1
  153. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ export function runDisplayTitle(run, maxLength = 120, source = 'task') {
2
+ const taskTitle = cleanDisplayText(run.ticketData?.title, maxLength);
3
+ const summary = cleanDisplayText(run.summary, maxLength);
4
+ const ticket = cleanDisplayText(run.ticketOrPr, maxLength);
5
+ const branch = cleanDisplayText(run.branch, maxLength);
6
+ const title = (source === 'summary'
7
+ ? (summary ?? ticket ?? branch)
8
+ : (taskTitle ?? summary ?? ticket ?? branch)) ?? 'Untitled run';
9
+ const subtitle = [ticket, branch].find((value) => value && value !== title) ?? null;
10
+ return { title, subtitle };
11
+ }
12
+ export function decisionDisplayTitle(decision, maxLength = 120) {
13
+ const payload = decision.payload;
14
+ const inputSnapshot = recordField(payload, 'inputSnapshot');
15
+ const ticketData = recordField(inputSnapshot, 'ticketData');
16
+ const taskTitle = cleanDisplayText(ticketData?.title, maxLength);
17
+ const runSummary = cleanDisplayText(decision.runMeta?.summary, maxLength);
18
+ const ticket = cleanDisplayText(decision.runMeta?.ticketOrPr, maxLength);
19
+ const decisionTitle = cleanDisplayText(decision.title, maxLength);
20
+ const title = taskTitle ?? runSummary ?? decisionTitle ?? ticket ?? 'Pending decision';
21
+ const subtitle = [decisionTitle, ticket].find((value) => value && value !== title) ?? null;
22
+ return { title, subtitle };
23
+ }
24
+ function recordField(record, key) {
25
+ const value = record?.[key];
26
+ return value && typeof value === 'object' && !Array.isArray(value)
27
+ ? value
28
+ : undefined;
29
+ }
30
+ /** Extract a human title without changing the task body. Also handles stored legacy summaries. */
31
+ export function taskTitleText(value, maxLength = 120) {
32
+ const htmlHeading = value.trimStart().startsWith('<')
33
+ ? (value.match(/<title\b[^>]*>([\s\S]*?)<\/title\s*>/i) ??
34
+ value.match(/<h1\b[^>]*>([\s\S]*?)<\/h1\s*>/i))
35
+ : null;
36
+ const firstLine = value.trim().split(/\r?\n/)[0] ?? '';
37
+ const markdownHeading = firstLine.match(/^[ \t]{0,3}#{1,6}[ \t]+(.+?)[ \t]*#*[ \t]*$/);
38
+ const candidate = htmlHeading?.[1] ?? markdownHeading?.[1] ?? firstLine;
39
+ const text = candidate
40
+ .replace(/<[^>]*>/g, ' ')
41
+ .replace(/&(?:amp|lt|gt|quot|apos|nbsp);|&#(?:x[0-9a-f]+|[0-9]+);/gi, (entity) => {
42
+ const named = {
43
+ amp: '&',
44
+ lt: '<',
45
+ gt: '>',
46
+ quot: '\"',
47
+ apos: "'",
48
+ nbsp: ' ',
49
+ };
50
+ if (!entity.startsWith('&#'))
51
+ return named[entity.slice(1, -1).toLowerCase()];
52
+ const code = entity[2].toLowerCase() === 'x'
53
+ ? Number.parseInt(entity.slice(3, -1), 16)
54
+ : Number(entity.slice(2, -1));
55
+ return code <= 0x10ffff ? String.fromCodePoint(code) : '';
56
+ })
57
+ .replace(/\s+/g, ' ')
58
+ .trim();
59
+ return text.length > maxLength ? text.slice(0, maxLength - 1).trimEnd() + '…' : text;
60
+ }
61
+ function cleanDisplayText(value, maxLength = 120) {
62
+ return typeof value === 'string' ? taskTitleText(value, maxLength) || null : null;
63
+ }
64
+ //# sourceMappingURL=run-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-title.js","sourceRoot":"","sources":["../../src/runs/run-title.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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAW7C,OAAO,EAAwB,uBAAuB,EAAE,MAAM,WAAW,CAAC;AA0B1E,SAAS,YAAY,CACnB,MAA2B;IAE3B,OAAO;QACL,2BAA2B,EAAE,MAAM,CAAC,mBAAoB;QACxD,mBAAmB,EAAE,MAAM,CAAC,WAAY;KACzC,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,2BAA2B,CACzC,QAAiB,EACjB,MAAwB;IAExB,MAAM,MAAM,GAAwB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,IACE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/C,CAAC,MAAM,CAAC,QAAQ;QAChB,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC;QAEvD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,2FAA2F;AAC3F,MAAM,OAAO,mBAAmB;IAC9B,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAE1D,MAAM,CAAC,SAA8B,EAAE;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,QAAiB,EACjB,MAAwB;QAExB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,IAAI,MAAM,EAAE,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI;YACxE,MAAM,IAAI,KAAK,CACb,MAAM,CAAC,SAAS,EAAE,gBAAgB,IAAI,6CAA6C,CACpF,CAAC;QACJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAAqB,EACrB,WAAW,GAAG,cAAc,EAAE;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,uBAAuB,CACpC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EACjE,MAAM,CAAC,YAAY,CACpB,CAAC;QACF,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,WAAW;YAC3B,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAuB,EACvB,WAAW,GAAG,cAAc,EAAE;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,uBAAuB,CACpC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAC/C,MAAM,CAAC,YAAY,CACpB,CAAC;QACF,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,aAAa;YAC7B,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAyB,EAAE,EAC3B,WAAW,GAAG,cAAc,EAAE;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CACjC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CACrE,CAAC;QACF,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,YAAY;YAC5B,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,CAAC,mBAAoB,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,oGAAoG;IACpG,KAAK,CAAC,OAAO,CACX,OAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAA+B,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAChG,IAAI,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,WAAW;YACnD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAyB;IACjE,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,138 @@
1
+ /** ADR-069 source authority. Paths and credentials never belong in portable records. */
2
+ export interface SourceEntryRef {
3
+ sourceId: string;
4
+ entry: string;
5
+ }
6
+ export interface SourceDeclaration {
7
+ id: string;
8
+ kind: 'pack' | 'recipe-library' | 'helper';
9
+ repo: string;
10
+ ref?: string;
11
+ }
12
+ export interface SourceConfiguration {
13
+ schemaVersion: 1;
14
+ revision: number;
15
+ pollIntervalMs: number;
16
+ sources: SourceDeclaration[];
17
+ packs: Record<string, SourceEntryRef>;
18
+ }
19
+ export interface SourcePin {
20
+ sourceId: string;
21
+ selection: 'branch' | 'main';
22
+ ref: string;
23
+ scope: 'run' | 'node' | 'farm';
24
+ targetId: string;
25
+ actor: string;
26
+ declarationRevision: number;
27
+ revision: number;
28
+ baseMainCommit: string;
29
+ createdAt: string;
30
+ }
31
+ export interface SourceResolution {
32
+ sourceId: string;
33
+ ref: string;
34
+ declarationRevision: number;
35
+ generation: number;
36
+ commit?: string;
37
+ refObject?: string;
38
+ objectFormat?: 'sha1' | 'sha256';
39
+ treeDigest?: string;
40
+ resolvedAt?: string;
41
+ status: 'resolved' | 'stale' | 'failed';
42
+ reason?: string;
43
+ rewrites: Array<{
44
+ before: string;
45
+ after: string;
46
+ observedAt: string;
47
+ }>;
48
+ }
49
+ export interface SourceLockEntry {
50
+ sourceId: string;
51
+ kind: SourceDeclaration['kind'];
52
+ repo: string;
53
+ declaredRef: string;
54
+ effectiveRef: string;
55
+ commit: string;
56
+ objectFormat: 'sha1' | 'sha256';
57
+ treeDigest: string;
58
+ resolutionGeneration: number;
59
+ scope: 'run' | 'node' | 'farm';
60
+ pin?: SourcePin;
61
+ dependencies: SourceEntryRef[];
62
+ }
63
+ export interface SourceLock {
64
+ schemaVersion: 1;
65
+ context: {
66
+ project: string;
67
+ nodeId?: string;
68
+ runId?: string;
69
+ };
70
+ generation: number;
71
+ declarationRevision: number;
72
+ pinRevision: number;
73
+ resolvedAt: string;
74
+ entries: SourceLockEntry[];
75
+ packBindings: Record<string, SourceEntryRef>;
76
+ digest: string;
77
+ }
78
+ export interface SourceMaterializationReceipt {
79
+ schemaVersion: 1;
80
+ id: string;
81
+ nodeId: string;
82
+ lockDigest: string;
83
+ verifiedAt: string;
84
+ sources: Array<{
85
+ sourceId: string;
86
+ commit: string;
87
+ treeDigest: string;
88
+ protection: 'read-only-volume';
89
+ }>;
90
+ }
91
+ export interface RunSourceProvenance {
92
+ state: 'locked';
93
+ attemptId: string;
94
+ lock: SourceLock;
95
+ /** Stable execution-input lock retained across tasks with identical source inputs. */
96
+ workerLock: SourceLock;
97
+ receiptIds: string[];
98
+ bindings: SourceEntryRef[];
99
+ attempts: SourceExecutionAttemptReceipt[];
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
+ }
110
+ export interface SourceExecutionAttemptReceipt {
111
+ id: string;
112
+ receiptIds: string[];
113
+ }
114
+ /** An execution-local attestation adds paths only inside the authenticated node boundary. */
115
+ export interface SourceMaterialization {
116
+ lock: SourceLock;
117
+ receipt: SourceMaterializationReceipt;
118
+ roots: Record<string, string>;
119
+ receiptPath: string;
120
+ }
121
+ export interface SourceNodeStatus {
122
+ nodeId: string;
123
+ materializations: Array<{
124
+ lockDigest: string;
125
+ sources: SourceMaterializationReceipt['sources'];
126
+ verifiedAt?: string;
127
+ drift: string[];
128
+ }>;
129
+ }
130
+ export interface RunSourceStatus {
131
+ runId: string;
132
+ state: 'planned' | 'locked' | 'unknown-legacy';
133
+ lockDigest?: string;
134
+ attemptId?: string;
135
+ canSelectSources?: boolean;
136
+ selectionRefusal?: string;
137
+ }
138
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/sources/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/sources/contracts.ts"],"names":[],"mappings":""}
@@ -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":"AAEA,OAAO,EAGL,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,GAIvB,MAAM,kBAAkB,CAAC;AAkB1B,SAAS,YAAY,CAAC,OAA8B;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc;QACnC,OAAO,QAAQ,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,SAAS,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAClG,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,MAAM,CAAC,QAAQ,UAAU,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC/M,CAAC;AAED,0FAA0F;AAC1F,MAAM,OAAO,sBAAsB;IAQjC,YACmB,MAA2B,EAC5C,OAAgC;QADf,WAAM,GAAN,MAAM,CAAqB;QANtC,YAAO,GAAG,CAAC,CAAC;QACZ,cAAS,GAAG,IAAI,GAAG,EAAc,CAAC;QAmB1C,gBAAW,GAAG,GAAyB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAExD,cAAS,GAAG,CAAC,QAAoB,EAAgB,EAAE;YACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC;QAhBA,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG;YACd,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,KAAK;SACf,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IASO,MAAM,CAAC,MAAqC;QAClD,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM;YACb,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE;gBACvD,GAAG,IAAI,CAAC,OAAO;gBACf,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;oBAC1E,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,IAAI,CAAC,QAAQ,CAAC,WAAW;YACvB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;QAC3F,IAAI,CAAC,QAAQ,CAAC,gBAAgB;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;oBACrB,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;oBACrC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;oBAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;wBACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW;4BACzB,CAAC,CAAC,uCAAuC;4BACzC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;gCACnB,CAAC,CAAC,yCAAyC;gCAC3C,CAAC,CAAC,SAAS,CAAC,CAAC;oBACnB,CAAC,CAAC,SAAS,CAAC,CAAC;QACjB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,OAAgC;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,IACE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAC1D,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,uFAAuF;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,KAAK,OAAO,CAAC,aAAa,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC;YACV,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,cAAc,EAAE,SAAS;YACzB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;gBACvB,CAAC,CAAC;oBACE,QAAQ;oBACR,YAAY,EAAE,QAAQ;wBACpB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACrC,CAAC,CAAC,0DAA0D;iBAC/D;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,MAAM,GACV,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wFAAwF;YACxF,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO;gBAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAA0B;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO;QACzF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,CACjD,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO;QACzF,IAAI,CAAC,MAAM,CAAC;YACV,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC;SAC5F,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAwB,EAAE,QAAiB;QACrD,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAClB,IAAI,CAAC,QAAQ,CAAC,OAAO;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAE7C,OAAO;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,OAA8B,CAAC;YACnC,IAAI,MAAM,KAAK,MAAM;gBACnB,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBACtC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjC,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACjE,CAAC,CAAC;iBACA,CAAC;gBACJ,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAC5E,IAAI,MAAM,KAAK,OAAO;oBAAE,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;qBACrF,CAAC;oBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;oBACxF,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;wBACrC,QAAQ;wBACR,GAAG,MAAM;wBACT,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE;qBAC1B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO;gBAC1B,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0FAA0F;YAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO;QACzD,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,kEAAkE,EAAE,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC;gBACV,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,SAAS;gBAClB,YAAY,EAAE,SAAS;gBACvB,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,GAAG;gBAC1F,oFAAoF;gBACpF,cAAc,EAAE,MAAM,CAAC,MAAM;oBAC3B,CAAC,CAAC,MAAM;yBACH,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,CAC9G;yBACA,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,EAAE;aACf,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wFAAwF;YACxF,MAAM,KAAK,GAAI,KAA2B,CAAC,IAAI,KAAK,oBAAoB,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC;gBACV,IAAI,EAAE,KAAK;gBACX,cAAc,EAAG,KAAe,CAAC,OAAO;gBACxC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}