@farmslot/protocol 0.83.1 → 0.84.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 (253) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/checklist-target.d.ts +5 -1
  3. package/dist/checklist-target.d.ts.map +1 -1
  4. package/dist/checklist-target.js +41 -0
  5. package/dist/checklist-target.js.map +1 -1
  6. package/dist/client-cache/cache.d.ts.map +1 -1
  7. package/dist/client-cache/cache.js +370 -26
  8. package/dist/client-cache/cache.js.map +1 -1
  9. package/dist/client-cache/command-method.d.ts +1 -1
  10. package/dist/client-cache/command-method.d.ts.map +1 -1
  11. package/dist/client-cache/command-method.js +1 -0
  12. package/dist/client-cache/command-method.js.map +1 -1
  13. package/dist/client-cache/entity-collection.d.ts +115 -0
  14. package/dist/client-cache/entity-collection.d.ts.map +1 -0
  15. package/dist/client-cache/entity-collection.js +323 -0
  16. package/dist/client-cache/entity-collection.js.map +1 -0
  17. package/dist/client-cache/entity-guards.d.ts +47 -0
  18. package/dist/client-cache/entity-guards.d.ts.map +1 -0
  19. package/dist/client-cache/entity-guards.js +193 -0
  20. package/dist/client-cache/entity-guards.js.map +1 -0
  21. package/dist/client-cache/entity-views.d.ts +62 -0
  22. package/dist/client-cache/entity-views.d.ts.map +1 -0
  23. package/dist/client-cache/entity-views.js +386 -0
  24. package/dist/client-cache/entity-views.js.map +1 -0
  25. package/dist/client-cache/index.d.ts +4 -0
  26. package/dist/client-cache/index.d.ts.map +1 -1
  27. package/dist/client-cache/index.js +4 -0
  28. package/dist/client-cache/index.js.map +1 -1
  29. package/dist/client-cache/keys.d.ts +13 -0
  30. package/dist/client-cache/keys.d.ts.map +1 -1
  31. package/dist/client-cache/keys.js +1 -0
  32. package/dist/client-cache/keys.js.map +1 -1
  33. package/dist/client-cache/native-history.d.ts +9 -2
  34. package/dist/client-cache/native-history.d.ts.map +1 -1
  35. package/dist/client-cache/native-history.js +66 -18
  36. package/dist/client-cache/native-history.js.map +1 -1
  37. package/dist/client-cache/registry.d.ts +15 -0
  38. package/dist/client-cache/registry.d.ts.map +1 -1
  39. package/dist/client-cache/registry.js +10 -0
  40. package/dist/client-cache/registry.js.map +1 -1
  41. package/dist/client-cache/run-details.d.ts +2 -1
  42. package/dist/client-cache/run-details.d.ts.map +1 -1
  43. package/dist/client-cache/run-details.js.map +1 -1
  44. package/dist/client-cache/run-list-versions.d.ts.map +1 -1
  45. package/dist/client-cache/run-list-versions.js.map +1 -1
  46. package/dist/client-cache/sync-state.d.ts +23 -0
  47. package/dist/client-cache/sync-state.d.ts.map +1 -0
  48. package/dist/client-cache/sync-state.js +39 -0
  49. package/dist/client-cache/sync-state.js.map +1 -0
  50. package/dist/client-cache/text-links.d.ts +11 -0
  51. package/dist/client-cache/text-links.d.ts.map +1 -0
  52. package/dist/client-cache/text-links.js +61 -0
  53. package/dist/client-cache/text-links.js.map +1 -0
  54. package/dist/client-cache/types.d.ts +11 -0
  55. package/dist/client-cache/types.d.ts.map +1 -1
  56. package/dist/contracts/agents.d.ts +6 -0
  57. package/dist/contracts/agents.d.ts.map +1 -1
  58. package/dist/contracts/agents.js.map +1 -1
  59. package/dist/contracts/analytics.d.ts +2 -2
  60. package/dist/contracts/analytics.d.ts.map +1 -1
  61. package/dist/contracts/evals.d.ts +9 -0
  62. package/dist/contracts/evals.d.ts.map +1 -1
  63. package/dist/contracts/evals.js +5 -0
  64. package/dist/contracts/evals.js.map +1 -1
  65. package/dist/contracts/family.d.ts +1 -1
  66. package/dist/contracts/family.d.ts.map +1 -1
  67. package/dist/contracts/pr-rules.d.ts +1 -1
  68. package/dist/contracts/pr-rules.d.ts.map +1 -1
  69. package/dist/contracts/pr-rules.js +3 -1
  70. package/dist/contracts/pr-rules.js.map +1 -1
  71. package/dist/contracts/review-workspace.d.ts +12 -0
  72. package/dist/contracts/review-workspace.d.ts.map +1 -1
  73. package/dist/contracts/review-workspace.js +9 -2
  74. package/dist/contracts/review-workspace.js.map +1 -1
  75. package/dist/contracts/reviews.d.ts +1 -1
  76. package/dist/contracts/reviews.d.ts.map +1 -1
  77. package/dist/contracts/run-lifecycle-view.d.ts.map +1 -1
  78. package/dist/contracts/run-lifecycle-view.js +9 -7
  79. package/dist/contracts/run-lifecycle-view.js.map +1 -1
  80. package/dist/contracts/runs.d.ts +77 -23
  81. package/dist/contracts/runs.d.ts.map +1 -1
  82. package/dist/contracts/runs.js +2 -2
  83. package/dist/contracts/runs.js.map +1 -1
  84. package/dist/contracts/slot-recovery.d.ts +10 -1
  85. package/dist/contracts/slot-recovery.d.ts.map +1 -1
  86. package/dist/contracts/slot-recovery.js +18 -10
  87. package/dist/contracts/slot-recovery.js.map +1 -1
  88. package/dist/contracts/slots.d.ts +31 -1
  89. package/dist/contracts/slots.d.ts.map +1 -1
  90. package/dist/contracts/task.d.ts +2 -0
  91. package/dist/contracts/task.d.ts.map +1 -1
  92. package/dist/contracts/task.js.map +1 -1
  93. package/dist/contracts/template-placeholders.d.ts.map +1 -1
  94. package/dist/contracts/template-placeholders.js +3 -2
  95. package/dist/contracts/template-placeholders.js.map +1 -1
  96. package/dist/deep-freeze.d.ts +6 -0
  97. package/dist/deep-freeze.d.ts.map +1 -0
  98. package/dist/deep-freeze.js +13 -0
  99. package/dist/deep-freeze.js.map +1 -0
  100. package/dist/file-stamp.d.ts +10 -0
  101. package/dist/file-stamp.d.ts.map +1 -0
  102. package/dist/file-stamp.js +12 -0
  103. package/dist/file-stamp.js.map +1 -0
  104. package/dist/fleet/host-load.d.ts +18 -0
  105. package/dist/fleet/host-load.d.ts.map +1 -0
  106. package/dist/fleet/host-load.js +30 -0
  107. package/dist/fleet/host-load.js.map +1 -0
  108. package/dist/fleet/stale.d.ts +13 -0
  109. package/dist/fleet/stale.d.ts.map +1 -0
  110. package/dist/fleet/stale.js +18 -0
  111. package/dist/fleet/stale.js.map +1 -0
  112. package/dist/fleet/summary.d.ts +8 -0
  113. package/dist/fleet/summary.d.ts.map +1 -0
  114. package/dist/fleet/summary.js +45 -0
  115. package/dist/fleet/summary.js.map +1 -0
  116. package/dist/index.d.ts +6 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +6 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/integrations/pr-rule-config.d.ts +2 -0
  121. package/dist/integrations/pr-rule-config.d.ts.map +1 -1
  122. package/dist/integrations/pr-rule-config.js +17 -4
  123. package/dist/integrations/pr-rule-config.js.map +1 -1
  124. package/dist/integrations/pr-workflow-defaults.d.ts.map +1 -1
  125. package/dist/integrations/pr-workflow-defaults.js +6 -3
  126. package/dist/integrations/pr-workflow-defaults.js.map +1 -1
  127. package/dist/node/farm-paths.d.ts +5 -0
  128. package/dist/node/farm-paths.d.ts.map +1 -1
  129. package/dist/node/farm-paths.js +64 -27
  130. package/dist/node/farm-paths.js.map +1 -1
  131. package/dist/node/pack-portability.d.ts +16 -0
  132. package/dist/node/pack-portability.d.ts.map +1 -1
  133. package/dist/node/pack-portability.js +169 -32
  134. package/dist/node/pack-portability.js.map +1 -1
  135. package/dist/node/slot-by-repo.d.ts +15 -1
  136. package/dist/node/slot-by-repo.d.ts.map +1 -1
  137. package/dist/node/slot-by-repo.js +115 -31
  138. package/dist/node/slot-by-repo.js.map +1 -1
  139. package/dist/node/tcp-metrics.d.ts +7 -0
  140. package/dist/node/tcp-metrics.d.ts.map +1 -0
  141. package/dist/node/tcp-metrics.js +131 -0
  142. package/dist/node/tcp-metrics.js.map +1 -0
  143. package/dist/performance/ranking.d.ts.map +1 -1
  144. package/dist/performance/ranking.js +1 -0
  145. package/dist/performance/ranking.js.map +1 -1
  146. package/dist/performance/recorder.d.ts.map +1 -1
  147. package/dist/performance/recorder.js +1 -1
  148. package/dist/performance/recorder.js.map +1 -1
  149. package/dist/performance/types.d.ts +5 -1
  150. package/dist/performance/types.d.ts.map +1 -1
  151. package/dist/performance/types.js +3 -0
  152. package/dist/performance/types.js.map +1 -1
  153. package/dist/performance/validation.d.ts.map +1 -1
  154. package/dist/performance/validation.js +19 -9
  155. package/dist/performance/validation.js.map +1 -1
  156. package/dist/recipe/common.d.ts.map +1 -1
  157. package/dist/recipe/common.js +2 -1
  158. package/dist/recipe/common.js.map +1 -1
  159. package/dist/recipe/manifest.js +1 -1
  160. package/dist/recipe/manifest.js.map +1 -1
  161. package/dist/rpc/auth.d.ts +6 -0
  162. package/dist/rpc/auth.d.ts.map +1 -1
  163. package/dist/rpc/auth.js.map +1 -1
  164. package/dist/rpc/clip.d.ts +38 -0
  165. package/dist/rpc/clip.d.ts.map +1 -0
  166. package/dist/rpc/clip.js +26 -0
  167. package/dist/rpc/clip.js.map +1 -0
  168. package/dist/rpc/eval.d.ts +5 -0
  169. package/dist/rpc/eval.d.ts.map +1 -1
  170. package/dist/rpc/fleet.d.ts +28 -1
  171. package/dist/rpc/fleet.d.ts.map +1 -1
  172. package/dist/rpc/fleet.js.map +1 -1
  173. package/dist/rpc/fs.d.ts +18 -0
  174. package/dist/rpc/fs.d.ts.map +1 -1
  175. package/dist/rpc/fs.js +2 -0
  176. package/dist/rpc/fs.js.map +1 -1
  177. package/dist/rpc/index.d.ts +1 -0
  178. package/dist/rpc/index.d.ts.map +1 -1
  179. package/dist/rpc/index.js +1 -0
  180. package/dist/rpc/index.js.map +1 -1
  181. package/dist/rpc/native-session.d.ts +31 -0
  182. package/dist/rpc/native-session.d.ts.map +1 -1
  183. package/dist/rpc/native-session.js.map +1 -1
  184. package/dist/rpc/pr.d.ts +24 -0
  185. package/dist/rpc/pr.d.ts.map +1 -1
  186. package/dist/rpc/registry.d.ts +3 -0
  187. package/dist/rpc/registry.d.ts.map +1 -1
  188. package/dist/rpc/registry.js +4 -0
  189. package/dist/rpc/registry.js.map +1 -1
  190. package/dist/rpc/run.d.ts +2 -1
  191. package/dist/rpc/run.d.ts.map +1 -1
  192. package/dist/rpc/run.js.map +1 -1
  193. package/dist/rpc/runner-models.d.ts.map +1 -1
  194. package/dist/rpc/runner-models.js +1 -0
  195. package/dist/rpc/runner-models.js.map +1 -1
  196. package/dist/rpc/slot.d.ts +26 -1
  197. package/dist/rpc/slot.d.ts.map +1 -1
  198. package/dist/rpc/slot.js +1 -0
  199. package/dist/rpc/slot.js.map +1 -1
  200. package/dist/runs/evidence-summary.d.ts +60 -4
  201. package/dist/runs/evidence-summary.d.ts.map +1 -1
  202. package/dist/runs/evidence-summary.js +148 -12
  203. package/dist/runs/evidence-summary.js.map +1 -1
  204. package/dist/runs/family-readiness.d.ts +4 -3
  205. package/dist/runs/family-readiness.d.ts.map +1 -1
  206. package/dist/runs/family-readiness.js.map +1 -1
  207. package/dist/runs/linked-tickets.d.ts +1 -1
  208. package/dist/runs/linked-tickets.d.ts.map +1 -1
  209. package/dist/runs/list-row.d.ts +57 -0
  210. package/dist/runs/list-row.d.ts.map +1 -0
  211. package/dist/runs/list-row.js +2 -0
  212. package/dist/runs/list-row.js.map +1 -0
  213. package/dist/runs/list-trim.d.ts +36 -4
  214. package/dist/runs/list-trim.d.ts.map +1 -1
  215. package/dist/runs/list-trim.js +327 -9
  216. package/dist/runs/list-trim.js.map +1 -1
  217. package/dist/runs/list-version.d.ts +2 -1
  218. package/dist/runs/list-version.d.ts.map +1 -1
  219. package/dist/runs/list-version.js.map +1 -1
  220. package/dist/runs/review-chain.d.ts +34 -2
  221. package/dist/runs/review-chain.d.ts.map +1 -1
  222. package/dist/runs/review-chain.js +31 -4
  223. package/dist/runs/review-chain.js.map +1 -1
  224. package/dist/runs/review-retries.d.ts +13 -3
  225. package/dist/runs/review-retries.d.ts.map +1 -1
  226. package/dist/runs/review-retries.js.map +1 -1
  227. package/dist/runs/run-family-groups.d.ts +7 -7
  228. package/dist/runs/run-family-groups.d.ts.map +1 -1
  229. package/dist/runs/run-family-groups.js.map +1 -1
  230. package/dist/runs/run-list-filter.d.ts +2 -1
  231. package/dist/runs/run-list-filter.d.ts.map +1 -1
  232. package/dist/runs/run-list-filter.js.map +1 -1
  233. package/dist/runs/run-list-observation.d.ts.map +1 -1
  234. package/dist/runs/run-list-observation.js.map +1 -1
  235. package/dist/runs/run-list-view.d.ts +3 -2
  236. package/dist/runs/run-list-view.d.ts.map +1 -1
  237. package/dist/runs/run-list-view.js.map +1 -1
  238. package/dist/slots/tracking-branch.d.ts.map +1 -1
  239. package/dist/slots/tracking-branch.js +4 -3
  240. package/dist/slots/tracking-branch.js.map +1 -1
  241. package/dist/surfaces/view-state.js +1 -1
  242. package/dist/surfaces/view-state.js.map +1 -1
  243. package/dist/transport/events.d.ts +42 -12
  244. package/dist/transport/events.d.ts.map +1 -1
  245. package/dist/transport/events.js +0 -1
  246. package/dist/transport/events.js.map +1 -1
  247. package/dist/transport/observations.d.ts +2 -0
  248. package/dist/transport/observations.d.ts.map +1 -1
  249. package/dist/version.d.ts +1 -1
  250. package/dist/version.js +1 -1
  251. package/package.json +12 -1
  252. package/scripts/literal-replacement.d.mts +2 -0
  253. package/scripts/literal-replacement.mjs +4 -0
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Entity collection for entity sync (ADR-071 Amendment 4): fleet slots and PR rows held as
3
+ * entities with content versions, kept current by pushes, a versions read and ids pages.
4
+ *
5
+ * Rules:
6
+ * - Rows stay displayed across reconnects; after every connection or epoch change the listing is
7
+ * verified by a versions read before the collection counts as current.
8
+ * - A push or deletion that lands after a read was sent wins over that read's entry for the id.
9
+ * - A change without a usable body reads that id; a deletion removes it.
10
+ * - An id the versions read listed but the ids page did not return ends in a fresh versions read,
11
+ * at most twice per sync, never a repeated page.
12
+ */
13
+ const FIRST_PAGE = 20;
14
+ /** Fresh versions reads after an ids page could not serve a listed id, per sync. */
15
+ const MAX_RECONCILES = 2;
16
+ /** Sync passes per call: new work arriving during a pass is picked up, but never forever. */
17
+ const MAX_PASSES = 6;
18
+ function superseded() {
19
+ return Object.assign(new Error('Entity collection read superseded'), {
20
+ code: 'RESOURCE_READ_SUPERSEDED',
21
+ });
22
+ }
23
+ export class EntityCollection {
24
+ constructor(options) {
25
+ this.options = options;
26
+ /** Every row held, displayed or not yet verified. */
27
+ this.rows = new Map();
28
+ /** The listing was confirmed by a versions read on the current connection. */
29
+ this.verified = false;
30
+ /** Ids whose change came without a usable body. */
31
+ this.pending = new Set();
32
+ /** Last local change per id, so a reply sent before it cannot overwrite it. */
33
+ this.touched = new Map();
34
+ this.sequence = 0;
35
+ /** Rows changed or removed since the store last took them. */
36
+ this.unstored = new Set();
37
+ this.unstoredDeletes = new Set();
38
+ }
39
+ /** The collection holds rows or a listing to show. */
40
+ get held() {
41
+ return this.listed !== undefined || this.rows.size > 0;
42
+ }
43
+ /** Verified on this connection, nothing notified since is unread, every listed row is held. */
44
+ get current() {
45
+ return this.verified && !this.membershipStale() && this.pending.size === 0 && this.complete();
46
+ }
47
+ /** True while a sync is running. */
48
+ get syncing() {
49
+ return this.inflight !== undefined;
50
+ }
51
+ membershipStale() {
52
+ return (this.membershipAskedAt !== undefined ||
53
+ (this.seenMarker !== undefined &&
54
+ (this.listedMarker === undefined || this.seenMarker > this.listedMarker)));
55
+ }
56
+ complete() {
57
+ if (!this.listed)
58
+ return false;
59
+ for (const [id, version] of this.listed)
60
+ if (this.rows.get(id)?.version !== version)
61
+ return false;
62
+ return true;
63
+ }
64
+ touch(id) {
65
+ this.touched.set(id, ++this.sequence);
66
+ }
67
+ changedSince(id, start) {
68
+ return (this.touched.get(id) ?? 0) > start;
69
+ }
70
+ /**
71
+ * Brings the collection current: a versions read when the listing is unverified or membership
72
+ * moved, then ids pages for what is missing or changed. Resolves true when current.
73
+ */
74
+ sync() {
75
+ if (this.inflight)
76
+ return this.inflight.promise;
77
+ const controller = new AbortController();
78
+ const inflight = {
79
+ controller,
80
+ promise: this.run(controller.signal).finally(() => {
81
+ if (this.inflight === inflight)
82
+ this.inflight = undefined;
83
+ }),
84
+ };
85
+ this.inflight = inflight;
86
+ return inflight.promise;
87
+ }
88
+ async run(signal) {
89
+ let reconciles = 0;
90
+ let reconcile = false;
91
+ for (let pass = 0; pass < MAX_PASSES && !this.current; pass++) {
92
+ if (!this.verified || !this.listed || this.membershipStale() || reconcile) {
93
+ await this.readVersions(signal);
94
+ reconcile = false;
95
+ }
96
+ const missing = await this.readPages(signal);
97
+ if (missing && reconciles < MAX_RECONCILES) {
98
+ reconciles++;
99
+ reconcile = true;
100
+ }
101
+ else if (missing)
102
+ break;
103
+ }
104
+ return this.current;
105
+ }
106
+ async readVersions(signal) {
107
+ const start = this.sequence;
108
+ const markerAtStart = this.seenMarker;
109
+ const reply = await this.options.fetchVersions(signal);
110
+ if (signal.aborted)
111
+ throw superseded();
112
+ const replied = new Map();
113
+ for (const entry of Array.isArray(reply.versions) ? reply.versions : [])
114
+ if (entry && typeof entry.id === 'string' && typeof entry.version === 'string')
115
+ replied.set(entry.id, entry.version);
116
+ // The reply's order is the gateway's; a change after the request was sent wins over its entry.
117
+ const listed = new Map();
118
+ for (const [id, version] of replied) {
119
+ const row = this.rows.get(id);
120
+ if (!this.changedSince(id, start))
121
+ listed.set(id, version);
122
+ // Pushed after the request: a member at the pushed version.
123
+ else if (row)
124
+ listed.set(id, row.version);
125
+ // Changed without a usable body: a member, read below. A deletion stays deleted.
126
+ else if (this.pending.has(id))
127
+ listed.set(id, version);
128
+ }
129
+ // Added by a push after the request: a member the reply could not list.
130
+ for (const [id, row] of this.rows)
131
+ if (this.changedSince(id, start) && !listed.has(id))
132
+ listed.set(id, row.version);
133
+ for (const id of [...this.rows.keys()]) {
134
+ if (listed.has(id))
135
+ continue;
136
+ this.rows.delete(id);
137
+ this.unstored.delete(id);
138
+ this.unstoredDeletes.add(id);
139
+ }
140
+ for (const id of [...this.pending])
141
+ if (!listed.has(id))
142
+ this.pending.delete(id);
143
+ this.listed = listed;
144
+ this.verified = true;
145
+ // A question raised after this request was sent needs a reply of its own.
146
+ if ((this.membershipAskedAt ?? 0) <= start)
147
+ this.membershipAskedAt = undefined;
148
+ const marker = reply.membershipRevision ?? markerAtStart;
149
+ this.listedMarker = marker;
150
+ if (marker !== undefined && (this.seenMarker === undefined || marker > this.seenMarker))
151
+ this.seenMarker = marker;
152
+ }
153
+ /** Reads every listed id whose row is missing or differs. Returns true if a listed id was not served. */
154
+ async readPages(signal) {
155
+ const listed = this.listed;
156
+ if (!listed)
157
+ return false;
158
+ let ask = [...listed]
159
+ .filter(([id, version]) => this.pending.has(id) || this.rows.get(id)?.version !== version)
160
+ .map(([id]) => id);
161
+ const total = ask.length;
162
+ if (total === 0)
163
+ return false;
164
+ let done = 0;
165
+ let missing = false;
166
+ let first = true;
167
+ while (ask.length > 0) {
168
+ const request = first ? ask.slice(0, FIRST_PAGE) : ask;
169
+ first = false;
170
+ const start = this.sequence;
171
+ const page = await this.options.fetchPage(request, signal);
172
+ if (signal.aborted)
173
+ throw superseded();
174
+ const served = new Set();
175
+ const versions = Array.isArray(page.versions) ? page.versions : [];
176
+ const entities = Array.isArray(page.entities) ? page.entities : [];
177
+ versions.forEach((entry, index) => {
178
+ if (!entry || typeof entry.id !== 'string' || !request.includes(entry.id))
179
+ return;
180
+ served.add(entry.id);
181
+ // A push after this page was sent is newer than the page.
182
+ if (this.changedSince(entry.id, start) || !this.listed?.has(entry.id))
183
+ return;
184
+ const entity = entities[index];
185
+ if (!this.options.accept(entity, entry.id, entry.version)) {
186
+ served.delete(entry.id);
187
+ return;
188
+ }
189
+ this.rows.set(entry.id, { entity, version: entry.version });
190
+ // A page is newer than the listing it followed.
191
+ this.listed.set(entry.id, entry.version);
192
+ this.pending.delete(entry.id);
193
+ this.unstored.add(entry.id);
194
+ this.unstoredDeletes.delete(entry.id);
195
+ });
196
+ // Pages keep request order and stop at a byte cap: ids before the last served one that
197
+ // were not served are gone or unusable; the rest are asked next.
198
+ let last = -1;
199
+ request.forEach((id, index) => {
200
+ if (served.has(id))
201
+ last = index;
202
+ });
203
+ const unserved = (last < 0 ? request : request.slice(0, last + 1)).filter((id) => !served.has(id) && !this.changedSince(id, start));
204
+ if (unserved.length)
205
+ missing = true;
206
+ const answered = new Set(last < 0 ? request : request.slice(0, last + 1));
207
+ ask = ask.filter((id) => !answered.has(id));
208
+ done += served.size;
209
+ this.options.onPage?.(Math.min(done, total), total);
210
+ }
211
+ return missing;
212
+ }
213
+ /** The listing must be read again: a change the client cannot place by itself. */
214
+ ask() {
215
+ this.membershipAskedAt = ++this.sequence;
216
+ }
217
+ /** A change without a usable body: read the id, or the listing when it does not hold the id. */
218
+ need(id) {
219
+ if (this.listed && !this.listed.has(id))
220
+ this.ask();
221
+ else
222
+ this.pending.add(id);
223
+ }
224
+ /** A pushed body. Returns false when it was not admitted; that id is then read. */
225
+ applyEntity(id, value, version) {
226
+ this.touch(id);
227
+ if (!this.options.accept(value, id, version)) {
228
+ this.need(id);
229
+ return false;
230
+ }
231
+ this.rows.set(id, { entity: value, version });
232
+ this.listed?.set(id, version);
233
+ this.pending.delete(id);
234
+ this.unstored.add(id);
235
+ this.unstoredDeletes.delete(id);
236
+ return true;
237
+ }
238
+ /** A change that names only the version: nothing to do when that version is held. */
239
+ applyVersion(id, version) {
240
+ this.touch(id);
241
+ if (this.rows.get(id)?.version === version) {
242
+ this.listed?.set(id, version);
243
+ this.pending.delete(id);
244
+ }
245
+ else
246
+ this.need(id);
247
+ }
248
+ /** A change with no body at all: read that id. */
249
+ applyUnknown(id) {
250
+ this.touch(id);
251
+ this.need(id);
252
+ }
253
+ applyDeleted(id) {
254
+ this.touch(id);
255
+ this.rows.delete(id);
256
+ this.listed?.delete(id);
257
+ this.pending.delete(id);
258
+ this.unstored.delete(id);
259
+ this.unstoredDeletes.add(id);
260
+ }
261
+ /** A collection change: its marker says whether membership or collection fields moved. */
262
+ noteMembership(marker) {
263
+ if (marker === undefined || !Number.isSafeInteger(marker)) {
264
+ this.ask();
265
+ return;
266
+ }
267
+ if (this.seenMarker === undefined || marker > this.seenMarker)
268
+ this.seenMarker = marker;
269
+ }
270
+ /** Stored rows from a previous session: admitted ones are shown, unverified, until a versions read. */
271
+ hydrate(rows) {
272
+ for (const row of rows) {
273
+ if (this.rows.has(row.id) || !this.options.accept(row.body, row.id, row.version))
274
+ continue;
275
+ this.rows.set(row.id, { entity: row.body, version: row.version });
276
+ }
277
+ }
278
+ /** Rows in the gateway's order: the listing's members once one exists, else every held row. */
279
+ assemble() {
280
+ if (!this.held)
281
+ return undefined;
282
+ if (!this.listed)
283
+ return [...this.rows.values()].map((row) => row.entity);
284
+ const entities = [];
285
+ for (const id of this.listed.keys()) {
286
+ const row = this.rows.get(id);
287
+ if (row)
288
+ entities.push(row.entity);
289
+ }
290
+ return entities;
291
+ }
292
+ /** Rows changed and removed since the last call, for one store merge. */
293
+ takeUnstored() {
294
+ const upserts = [...this.unstored].flatMap((id) => {
295
+ const row = this.rows.get(id);
296
+ return row ? [{ id, version: row.version, entity: row.entity }] : [];
297
+ });
298
+ const deletes = [...this.unstoredDeletes];
299
+ this.unstored.clear();
300
+ this.unstoredDeletes.clear();
301
+ return { upserts, deletes };
302
+ }
303
+ /** A new connection or epoch: keep the rows on screen, verify them before they count as current. */
304
+ unverify() {
305
+ this.inflight?.controller.abort();
306
+ this.inflight = undefined;
307
+ this.verified = false;
308
+ this.listedMarker = undefined;
309
+ this.seenMarker = undefined;
310
+ this.membershipAskedAt = undefined;
311
+ this.pending.clear();
312
+ }
313
+ /** Forget everything: a new store, owner or refusal. */
314
+ clear() {
315
+ this.unverify();
316
+ this.rows.clear();
317
+ this.listed = undefined;
318
+ this.touched.clear();
319
+ this.unstored.clear();
320
+ this.unstoredDeletes.clear();
321
+ }
322
+ }
323
+ //# sourceMappingURL=entity-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-collection.js","sourceRoot":"","sources":["../../src/client-cache/entity-collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { PRStatus } from '../contracts/reviews.js';
2
+ import type { MachineHealth, SlotEntity } from '../contracts/slots.js';
3
+ /** An entity's version: sha256 of its canonical JSON, the same digest the gateway stores. */
4
+ export declare function entityContentVersion(entity: unknown): string;
5
+ /** A pushed entity rides on its notification only up to this many UTF-8 JSON bytes. */
6
+ export declare const CHANGED_ENTITY_MAX_BYTES: number;
7
+ /**
8
+ * The fields of a slot that summary, host-load reattachment, sorting and the slot views read
9
+ * without a check of their own; the gateway's row transform always fills them.
10
+ *
11
+ * This is the boundary of admission: identity, the fields list consumers dereference unguarded,
12
+ * and agent contexts by their declared type. Everything else is trusted from the current
13
+ * gateway. A refused row is read again.
14
+ */
15
+ export declare function isSlotEntity(value: unknown): value is SlotEntity;
16
+ /**
17
+ * The fields of a PR row the board, its filters and the project scopes read without a check,
18
+ * down to the elements they dereference: a check, a bot comment, a reviewer.
19
+ */
20
+ export declare function isPRStatusEntity(value: unknown): value is PRStatus;
21
+ /** The fields host-load reattachment and the machine bar read. */
22
+ export declare function isMachineHealthEntity(value: unknown): value is MachineHealth;
23
+ /** A PR's entity id within its list: `owner/repo/number`. */
24
+ export declare function prEntityId(row: Pick<PRStatus, 'repo' | 'pr'>): string;
25
+ /** Admits an untrusted body only when its shape, identity and content version all match. */
26
+ export declare function admitEntity<T>(guard: (value: unknown) => value is T, idOf: (entity: T) => string, value: unknown, id: string, version: string): value is T;
27
+ /** Most ids one entity read may name. */
28
+ export declare const ENTITY_READ_MAX_IDS = 10000;
29
+ /** A fleet.status or pr.list read: the view it reads and, for entity sync, its read shape. */
30
+ export type EntitySyncRead = {
31
+ ok: true;
32
+ view: Record<string, unknown>;
33
+ shape?: {
34
+ versions: true;
35
+ } | {
36
+ ids: string[];
37
+ };
38
+ } | {
39
+ ok: false;
40
+ message: string;
41
+ };
42
+ /**
43
+ * Splits `{ versions: true }` or `{ ids }` from the view params they read. Both shapes read the
44
+ * same resource as the view, so the gateway stamps and authorizes them as the view.
45
+ */
46
+ export declare function entitySyncRead(params: unknown): EntitySyncRead;
47
+ //# sourceMappingURL=entity-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-guards.d.ts","sourceRoot":"","sources":["../../src/client-cache/entity-guards.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMvE,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAE5D;AAED,uFAAuF;AACvF,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAoElD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAyBhE;AAuBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CA2BlE;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAW5E;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,CAErE;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACrC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAC3B,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,KAAK,IAAI,CAAC,CAOZ;AAED,yCAAyC;AACzC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,8FAA8F;AAC9F,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAC3F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAoB9D"}
@@ -0,0 +1,193 @@
1
+ // Entity sync (ADR-071 Amendment 4): stored, paged and pushed entities are untrusted. One set of
2
+ // guards admits them: the shape every consumer dereferences, the identity and the content version.
3
+ import { sha256 } from '@noble/hashes/sha256';
4
+ import { bytesToHex } from '@noble/hashes/utils';
5
+ import { AGENT_ROLES } from '../contracts/agents.js';
6
+ import { canonicalResourceJson } from './keys.js';
7
+ const encoder = new TextEncoder();
8
+ /** An entity's version: sha256 of its canonical JSON, the same digest the gateway stores. */
9
+ export function entityContentVersion(entity) {
10
+ return bytesToHex(sha256(encoder.encode(canonicalResourceJson(entity))));
11
+ }
12
+ /** A pushed entity rides on its notification only up to this many UTF-8 JSON bytes. */
13
+ export const CHANGED_ENTITY_MAX_BYTES = 16 * 1024;
14
+ function isRecord(value) {
15
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
16
+ }
17
+ const isString = (value) => typeof value === 'string';
18
+ const isNumber = (value) => typeof value === 'number' && Number.isFinite(value);
19
+ const isNullableString = (value) => value === null || typeof value === 'string';
20
+ const everyOf = (value, each) => Array.isArray(value) && value.every(each);
21
+ const absentOr = (value, check) => value === undefined || value === null || check(value);
22
+ const AGENT_CONTEXT_STRINGS = [
23
+ 'runId',
24
+ 'taskFile',
25
+ 'taskIdentity',
26
+ 'signalFile',
27
+ 'runner',
28
+ 'model',
29
+ 'nativeCommandId',
30
+ 'lastSignalAt',
31
+ 'updatedAt',
32
+ ];
33
+ const isAgentContextTarget = (value) => isRecord(value) &&
34
+ isString(value.session) &&
35
+ isString(value.target) &&
36
+ absentOr(value.window, isString) &&
37
+ absentOr(value.pane, isString) &&
38
+ absentOr(value.paneId, isString);
39
+ /** The fields of a native binding the slot view and its session lookups read. */
40
+ const isNativeSessionBinding = (value) => isRecord(value) &&
41
+ isString(value.sessionId) &&
42
+ isString(value.executionNodeId) &&
43
+ isString(value.leaseId) &&
44
+ absentOr(value.closedAt, isString) &&
45
+ absentOr(value.releasedAt, isString);
46
+ const isNativeSessionOwner = (value) => isRecord(value) &&
47
+ isString(value.contextId) &&
48
+ isString(value.sessionId) &&
49
+ isString(value.leaseId);
50
+ /** An agent context summary, field by field by its declared type (AgentContextSummary). */
51
+ function isAgentContextSummary(value) {
52
+ return (isRecord(value) &&
53
+ isString(value.id) &&
54
+ isString(value.label) &&
55
+ AGENT_ROLES.some((role) => role === value.role) &&
56
+ isString(value.status) &&
57
+ AGENT_CONTEXT_STRINGS.every((field) => absentOr(value[field], isString)) &&
58
+ absentOr(value.nudgeCount, isNumber) &&
59
+ absentOr(value.ctxPct, isNumber) &&
60
+ absentOr(value.target, isAgentContextTarget) &&
61
+ absentOr(value.nativeSession, isNativeSessionBinding) &&
62
+ absentOr(value.nativeSessionOwner, isNativeSessionOwner));
63
+ }
64
+ /**
65
+ * The fields of a slot that summary, host-load reattachment, sorting and the slot views read
66
+ * without a check of their own; the gateway's row transform always fills them.
67
+ *
68
+ * This is the boundary of admission: identity, the fields list consumers dereference unguarded,
69
+ * and agent contexts by their declared type. Everything else is trusted from the current
70
+ * gateway. A refused row is read again.
71
+ */
72
+ export function isSlotEntity(value) {
73
+ if (!isRecord(value) || !isRecord(value.health))
74
+ return false;
75
+ const health = value.health;
76
+ return (isString(value.slot) &&
77
+ value.slot.length > 0 &&
78
+ isString(value.machine) &&
79
+ isString(value.platform) &&
80
+ isString(value.project) &&
81
+ isString(value.branch) &&
82
+ isString(value.agent) &&
83
+ isString(value.lifecycle) &&
84
+ isNullableString(value.phase) &&
85
+ typeof value.enabled === 'boolean' &&
86
+ typeof value.dispatchable === 'boolean' &&
87
+ typeof value.warm === 'boolean' &&
88
+ isString(health.ssh) &&
89
+ isString(health.device) &&
90
+ isString(health.devserver) &&
91
+ isString(health.cdp) &&
92
+ isString(health.fixtures) &&
93
+ absentOr(value.agentContexts, (contexts) => everyOf(contexts, isAgentContextSummary)) &&
94
+ // Host load is reattached from machine samples and never part of a slot entity.
95
+ value.hostLoad === undefined);
96
+ }
97
+ function isCheckSummary(value) {
98
+ return (isRecord(value) &&
99
+ isNumber(value.passed) &&
100
+ isNumber(value.failed) &&
101
+ isNumber(value.pending) &&
102
+ isNumber(value.skipped) &&
103
+ isNumber(value.total));
104
+ }
105
+ const isStrings = (value) => everyOf(value, isString);
106
+ const isCheck = (value) => isRecord(value) && isString(value.name) && isString(value.status);
107
+ const isBotComment = (value) => isRecord(value) && isString(value.author) && isString(value.createdAt);
108
+ const isReviewVerdict = (value) => isRecord(value) && isString(value.reviewer) && isString(value.state);
109
+ const isReviewRequests = (value) => isRecord(value) && isStrings(value.teams) && isStrings(value.users);
110
+ /**
111
+ * The fields of a PR row the board, its filters and the project scopes read without a check,
112
+ * down to the elements they dereference: a check, a bot comment, a reviewer.
113
+ */
114
+ export function isPRStatusEntity(value) {
115
+ return (isRecord(value) &&
116
+ isString(value.repo) &&
117
+ value.repo.length > 0 &&
118
+ isNumber(value.pr) &&
119
+ isString(value.title) &&
120
+ isString(value.project) &&
121
+ isString(value.prState) &&
122
+ isString(value.recommendation) &&
123
+ isString(value.mergeable) &&
124
+ isString(value.reviewDecision) &&
125
+ typeof value.allPassed === 'boolean' &&
126
+ typeof value.anyFailed === 'boolean' &&
127
+ typeof value.merged === 'boolean' &&
128
+ typeof value.mergeConflict === 'boolean' &&
129
+ everyOf(value.checks, isCheck) &&
130
+ isStrings(value.failedNames) &&
131
+ everyOf(value.botComments, isBotComment) &&
132
+ everyOf(value.actionableBotComments, isBotComment) &&
133
+ isCheckSummary(value.checkSummary) &&
134
+ absentOr(value.allCheckSummary, isCheckSummary) &&
135
+ absentOr(value.allPendingNames, isStrings) &&
136
+ absentOr(value.allFailedNames, isStrings) &&
137
+ absentOr(value.reviewVerdicts, (verdicts) => everyOf(verdicts, isReviewVerdict)) &&
138
+ absentOr(value.reviewRequests, isReviewRequests));
139
+ }
140
+ /** The fields host-load reattachment and the machine bar read. */
141
+ export function isMachineHealthEntity(value) {
142
+ if (!isRecord(value) || !isString(value.machine) || !value.machine)
143
+ return false;
144
+ if (typeof value.online !== 'boolean' || !isString(value.headroom))
145
+ return false;
146
+ if (value.system === undefined)
147
+ return true;
148
+ const system = value.system;
149
+ return (isRecord(system) &&
150
+ isNumber(system.cpuPercent) &&
151
+ isNumber(system.memoryPercent) &&
152
+ isNumber(system.diskPercent));
153
+ }
154
+ /** A PR's entity id within its list: `owner/repo/number`. */
155
+ export function prEntityId(row) {
156
+ return `${row.repo}/${row.pr}`;
157
+ }
158
+ /** Admits an untrusted body only when its shape, identity and content version all match. */
159
+ export function admitEntity(guard, idOf, value, id, version) {
160
+ return (guard(value) &&
161
+ idOf(value) === id &&
162
+ typeof version === 'string' &&
163
+ entityContentVersion(value) === version);
164
+ }
165
+ /** Most ids one entity read may name. */
166
+ export const ENTITY_READ_MAX_IDS = 10_000;
167
+ /**
168
+ * Splits `{ versions: true }` or `{ ids }` from the view params they read. Both shapes read the
169
+ * same resource as the view, so the gateway stamps and authorizes them as the view.
170
+ */
171
+ export function entitySyncRead(params) {
172
+ if (params === undefined || params === null)
173
+ return { ok: true, view: {} };
174
+ if (!isRecord(params))
175
+ return { ok: false, message: 'Read params must be an object' };
176
+ const { versions, ids, ...view } = params;
177
+ if (versions !== undefined && versions !== true)
178
+ return { ok: false, message: 'versions must be true or absent' };
179
+ if (ids !== undefined) {
180
+ if (versions !== undefined)
181
+ return { ok: false, message: 'Ask for versions or ids, not both' };
182
+ if (!Array.isArray(ids) ||
183
+ ids.length > ENTITY_READ_MAX_IDS ||
184
+ !ids.every((id) => typeof id === 'string' && id.length > 0 && id.length <= 1024))
185
+ return {
186
+ ok: false,
187
+ message: `ids must be at most ${ENTITY_READ_MAX_IDS} non-empty strings`,
188
+ };
189
+ return { ok: true, view, shape: { ids } };
190
+ }
191
+ return versions === true ? { ok: true, view, shape: { versions: true } } : { ok: true, view };
192
+ }
193
+ //# sourceMappingURL=entity-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-guards.js","sourceRoot":"","sources":["../../src/client-cache/entity-guards.ts"],"names":[],"mappings":"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"}