@farmslot/protocol 0.67.0 → 0.68.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 CHANGED
@@ -4,10 +4,16 @@ All notable changes to `@farmslot/protocol` are tracked here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ - Share source-first, deduplicated run reference links between Command Center and Companion; show shared total and current-step elapsed time on the existing metadata line.
8
+
7
9
  - Add shared linked-ticket lookup and operator ticket metadata on runs without changing frozen task inputs.
8
10
 
9
11
  - Active-development baseline; add user-facing changes here before release or package publication.
10
12
 
13
+ ## 0.68.0
14
+
15
+ - Add source-first run references and live/frozen elapsed metadata labels; wire protocol remains 0.63.0.
16
+
11
17
  ## 0.67.0 - 2026-10-23
12
18
 
13
19
  - Share one explicit person approval for accepted review findings and attestable evidence-policy gaps, with both receipt reason fields.
package/README.md CHANGED
@@ -273,6 +273,8 @@ MIT. See [LICENSE](LICENSE).
273
273
 
274
274
  Run ticket helpers `runLinkedTicketRefs`, `runLinkedTicketsView` and
275
275
  `normalizeRunLinkedTicketRefs` serve Command Center and Companion list/detail/search.
276
+ `runElapsedTimeView` supplies total/current-step elapsed labels and whether each list clock should tick.
277
+ `runLinkedTicketsView.references` supplies their source-first inline list without repeating the source ticket or PR.
276
278
  `parseRunLinkedTicketRefs` validates their additional-ticket editor text.
277
279
  `Run.linkedTicketRefs` stores operator additions; frozen ticket data stays intact.
278
280
  `RunMethods.setLinkedTickets` names the supported metadata RPC. See the
@@ -23,6 +23,7 @@ export interface RunLinkedTicketsView {
23
23
  label: string;
24
24
  url: string;
25
25
  } | null;
26
+ references: Pick<LinkedRunTicketView, 'ref' | 'url'>[];
26
27
  }
27
28
  /** Thin web/native renderers share ticket identities, destinations and edit values. */
28
29
  export declare function runLinkedTicketsView(run: RunTicketSource): RunLinkedTicketsView;
@@ -1 +1 @@
1
- {"version":3,"file":"linked-tickets.d.ts","sourceRoot":"","sources":["../../src/runs/linked-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK/D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,6DAA6D;AAC7D,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAUrE;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAGhE;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CAqBlE;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3C;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,oBAAoB,CAuB/E"}
1
+ {"version":3,"file":"linked-tickets.d.ts","sourceRoot":"","sources":["../../src/runs/linked-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM/D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,6DAA6D;AAC7D,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAUrE;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAGhE;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CAqBlE;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;CACxD;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,oBAAoB,CAiC/E"}
@@ -1,3 +1,4 @@
1
+ import { githubPullUrl, parseGitHubPullUrl, parseGitHubRef } from '../integrations/github-ref.js';
1
2
  const JIRA_KEY = /\b[A-Z][A-Z0-9]*-\d+\b/g;
2
3
  const EXACT_JIRA_KEY = /^[A-Z][A-Z0-9]*-\d+$/;
3
4
  /** Validate operator additions before any metadata write. */
@@ -54,14 +55,28 @@ export function runLinkedTicketsView(run) {
54
55
  .map((url) => url.match(/^(https?:\/\/[^?#]+\/browse\/)[A-Z][A-Z0-9]*-\d+(?:[?#].*)?$/i)?.[1])
55
56
  .find(Boolean);
56
57
  const pr = run.links?.find((link) => link.label === 'PR' && /^https?:\/\//.test(link.url));
58
+ const tickets = runLinkedTicketRefs(run).map((ref) => ({
59
+ ref,
60
+ url: recorded.find((ticket) => ticket.ref.toUpperCase() === ref && /^https?:\/\//.test(ticket.url))
61
+ ?.url ?? (browseRoot ? `${browseRoot}${ref}` : null),
62
+ operatorAdded: operatorRefs.includes(ref),
63
+ }));
64
+ const sourcePr = parseGitHubRef(run.ticketOrPr) ?? parseGitHubPullUrl(run.ticketOrPr);
65
+ const references = tickets.map(({ ref, url }) => ({
66
+ ref,
67
+ url,
68
+ }));
69
+ if (sourcePr)
70
+ references.unshift({ ref: sourcePr.ref, url: githubPullUrl(sourcePr) });
71
+ else if (!tickets.some((ticket) => ticket.ref === run.ticketOrPr.toUpperCase()))
72
+ references.unshift({ ref: run.ticketOrPr, url: null });
73
+ if (pr && !sourcePr)
74
+ references.push({ ref: 'PR ↗', url: pr.url });
57
75
  return {
58
- tickets: runLinkedTicketRefs(run).map((ref) => ({
59
- ref,
60
- url: recorded.find((ticket) => ticket.ref.toUpperCase() === ref && /^https?:\/\//.test(ticket.url))?.url ?? (browseRoot ? `${browseRoot}${ref}` : null),
61
- operatorAdded: operatorRefs.includes(ref),
62
- })),
76
+ tickets,
63
77
  operatorRefs,
64
78
  pr: pr ? { label: 'PR', url: pr.url } : null,
79
+ references,
65
80
  };
66
81
  }
67
82
  //# sourceMappingURL=linked-tickets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linked-tickets.js","sourceRoot":"","sources":["../../src/runs/linked-tickets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linked-tickets.js","sourceRoot":"","sources":["../../src/runs/linked-tickets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAElG,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAC3C,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAS9C,6DAA6D;AAC7D,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,UAAU;QACd,MAAM,EAAE,OAAO;QACf,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;KACpD,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC;SAC5C,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1D,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAC/E,CAAC;IACF,OAAO;QACL,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC;KAC9F,CAAC;AACJ,CAAC;AAcD,uFAAuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,MAAM,YAAY,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,aAAa,IAAI,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;KAC9C,CAAC;IACF,MAAM,UAAU,GAAG,IAAI;SACpB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,+DAA+D,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC7F,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,GAAG;QACH,GAAG,EACD,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5F,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,aAAa,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;KAC1C,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtF,MAAM,UAAU,GAAuC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACpF,GAAG;QACH,GAAG;KACJ,CAAC,CAAC,CAAC;IACJ,IAAI,QAAQ;QAAE,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACjF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC7E,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,EAAE,IAAI,CAAC,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACnE,OAAO;QACL,OAAO;QACP,YAAY;QACZ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;QAC5C,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1,4 +1,10 @@
1
- import type { Run, RunStep } from '../contracts/runs.js';
1
+ import { type Run, type RunStep } from '../contracts/runs.js';
2
+ export interface RunElapsedTimeView {
3
+ label: string;
4
+ live: boolean;
5
+ }
6
+ /** Compact wall time for the existing metadata line in both run lists. */
7
+ export declare function runElapsedTimeView(run: Pick<Run, 'status' | 'startedAt' | 'createdAt' | 'completedAt' | 'statusChangedAt' | 'updatedAt' | 'steps'>, nowMs?: number): RunElapsedTimeView;
2
8
  /** Dispatch-queue wait before the run existed: queue item creation to run creation. */
3
9
  export declare function runDispatchQueueWaitMs(run: Pick<Run, 'queuedAt' | 'createdAt'>): number | undefined;
4
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"step-timing.d.ts","sourceRoot":"","sources":["../../src/runs/step-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEzD,uFAAuF;AACvF,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAAC,GACvC,MAAM,GAAG,SAAS,CAIpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,SAAa,GAAG,MAAM,CAIzE;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,SAAa,GAAG,OAAO,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,EAClD,IAAI,EAAE,OAAO,EACb,KAAK,SAAa,GACjB,MAAM,GAAG,SAAS,CAOpB"}
1
+ {"version":3,"file":"step-timing.d.ts","sourceRoot":"","sources":["../../src/runs/step-timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,IAAI,CACP,GAAG,EACH,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,iBAAiB,GAAG,WAAW,GAAG,OAAO,CACjG,EACD,KAAK,SAAa,GACjB,kBAAkB,CAqBpB;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAAC,GACvC,MAAM,GAAG,SAAS,CAIpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,SAAa,GAAG,MAAM,CAIzE;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,SAAa,GAAG,OAAO,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,EAClD,IAAI,EAAE,OAAO,EACb,KAAK,SAAa,GACjB,MAAM,GAAG,SAAS,CAOpB"}
@@ -1,3 +1,27 @@
1
+ import { isTerminalRunStatus } from '../contracts/runs.js';
2
+ /** Compact wall time for the existing metadata line in both run lists. */
3
+ export function runElapsedTimeView(run, nowMs = Date.now()) {
4
+ const live = !isTerminalRunStatus(run.status);
5
+ const end = live ? nowMs : Date.parse(run.completedAt ?? run.statusChangedAt ?? run.updatedAt);
6
+ const start = Date.parse(run.startedAt ?? run.createdAt);
7
+ const minutes = (ms) => {
8
+ const value = Math.floor(Math.max(0, ms) / 60000);
9
+ return value < 60 ? `${value}m` : `${Math.floor(value / 60)}h ${value % 60}m`;
10
+ };
11
+ const total = `${minutes(end - start)} total`;
12
+ const current = live
13
+ ? run.steps.find((step) => step.status === 'running' && step.startedAt)
14
+ : null;
15
+ const stepName = current?.name
16
+ .replace(/^(?:pre|post)-gate-publication-review-active$/, 'review')
17
+ .replace(/^(?:pre|post)-gate-publication-review-fix$/, 'fix');
18
+ return {
19
+ live,
20
+ label: current?.startedAt
21
+ ? `${total} · ${stepName} ${minutes(nowMs - Date.parse(current.startedAt))}`
22
+ : total,
23
+ };
24
+ }
1
25
  /** Dispatch-queue wait before the run existed: queue item creation to run creation. */
2
26
  export function runDispatchQueueWaitMs(run) {
3
27
  if (!run.queuedAt)
@@ -1 +1 @@
1
- {"version":3,"file":"step-timing.js","sourceRoot":"","sources":["../../src/runs/step-timing.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,UAAU,sBAAsB,CACpC,GAAwC;IAExC,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/D,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QAC7D,WAAW,EAAE,SAAS;KACvB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAkD,EAClD,IAAa,EACb,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAElB,MAAM,MAAM,GACV,IAAI,CAAC,UAAU;QACf,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"step-timing.js","sourceRoot":"","sources":["../../src/runs/step-timing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farmslot/protocol",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",