@bluewombat/runtime 0.8.0 → 0.9.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 (135) hide show
  1. package/README.md +124 -100
  2. package/SPECS.md +103 -84
  3. package/dist/cli.js +32 -34
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/agent-shorthand.d.ts +0 -1
  6. package/dist/config/agent-shorthand.d.ts.map +1 -1
  7. package/dist/config/agent-shorthand.js +1 -9
  8. package/dist/config/agent-shorthand.js.map +1 -1
  9. package/dist/config/defaults.d.ts +0 -2
  10. package/dist/config/defaults.d.ts.map +1 -1
  11. package/dist/config/defaults.js +0 -2
  12. package/dist/config/defaults.js.map +1 -1
  13. package/dist/config/find-config.d.ts +3 -2
  14. package/dist/config/find-config.d.ts.map +1 -1
  15. package/dist/config/find-config.js +4 -4
  16. package/dist/config/find-config.js.map +1 -1
  17. package/dist/config/home.js +2 -2
  18. package/dist/config/home.js.map +1 -1
  19. package/dist/config/load-config.d.ts +2 -2
  20. package/dist/config/load-config.d.ts.map +1 -1
  21. package/dist/config/load-config.js +46 -29
  22. package/dist/config/load-config.js.map +1 -1
  23. package/dist/config/parse-args.d.ts.map +1 -1
  24. package/dist/config/parse-args.js +50 -48
  25. package/dist/config/parse-args.js.map +1 -1
  26. package/dist/config/types.d.ts +40 -24
  27. package/dist/config/types.d.ts.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/loop/authority.d.ts +3 -4
  33. package/dist/loop/authority.d.ts.map +1 -1
  34. package/dist/loop/authority.js +27 -22
  35. package/dist/loop/authority.js.map +1 -1
  36. package/dist/loop/context.d.ts +8 -3
  37. package/dist/loop/context.d.ts.map +1 -1
  38. package/dist/loop/deliveries.d.ts +16 -16
  39. package/dist/loop/deliveries.d.ts.map +1 -1
  40. package/dist/loop/deliveries.js +35 -187
  41. package/dist/loop/deliveries.js.map +1 -1
  42. package/dist/loop/describe.d.ts +4 -6
  43. package/dist/loop/describe.d.ts.map +1 -1
  44. package/dist/loop/describe.js +2 -2
  45. package/dist/loop/describe.js.map +1 -1
  46. package/dist/loop/drive.d.ts +4 -6
  47. package/dist/loop/drive.d.ts.map +1 -1
  48. package/dist/loop/drive.js +9 -33
  49. package/dist/loop/drive.js.map +1 -1
  50. package/dist/loop/features.d.ts +23 -0
  51. package/dist/loop/features.d.ts.map +1 -0
  52. package/dist/loop/features.js +571 -0
  53. package/dist/loop/features.js.map +1 -0
  54. package/dist/loop/journal.d.ts +1 -1
  55. package/dist/loop/journal.js +2 -2
  56. package/dist/loop/journal.js.map +1 -1
  57. package/dist/loop/lock.d.ts +1 -1
  58. package/dist/loop/lock.js +1 -1
  59. package/dist/loop/open-host.d.ts.map +1 -1
  60. package/dist/loop/open-host.js +23 -24
  61. package/dist/loop/open-host.js.map +1 -1
  62. package/dist/loop/probe.d.ts +1 -1
  63. package/dist/loop/probe.d.ts.map +1 -1
  64. package/dist/loop/probe.js +51 -22
  65. package/dist/loop/probe.js.map +1 -1
  66. package/dist/loop/process-tree.d.ts +1 -1
  67. package/dist/loop/process-tree.js +1 -1
  68. package/dist/loop/report.d.ts +9 -7
  69. package/dist/loop/report.d.ts.map +1 -1
  70. package/dist/loop/report.js +30 -99
  71. package/dist/loop/report.js.map +1 -1
  72. package/dist/loop/streams.d.ts +5 -5
  73. package/dist/loop/streams.d.ts.map +1 -1
  74. package/dist/loop/streams.js +3 -3
  75. package/dist/loop/streams.js.map +1 -1
  76. package/dist/loop/tick.d.ts +6 -4
  77. package/dist/loop/tick.d.ts.map +1 -1
  78. package/dist/loop/tick.js +50 -78
  79. package/dist/loop/tick.js.map +1 -1
  80. package/dist/loop/trace.d.ts +5 -5
  81. package/dist/loop/trace.d.ts.map +1 -1
  82. package/dist/loop/trace.js +5 -14
  83. package/dist/loop/trace.js.map +1 -1
  84. package/dist/loop/transformers.d.ts +3 -13
  85. package/dist/loop/transformers.d.ts.map +1 -1
  86. package/dist/loop/transformers.js +3 -53
  87. package/dist/loop/transformers.js.map +1 -1
  88. package/dist/loop/warm.d.ts +3 -3
  89. package/dist/loop/warm.js +3 -3
  90. package/dist/loop/work-line.d.ts +1 -1
  91. package/dist/operator/agent-plugins.d.ts +11 -0
  92. package/dist/operator/agent-plugins.d.ts.map +1 -1
  93. package/dist/operator/agent-plugins.js +3 -3
  94. package/dist/operator/agent-plugins.js.map +1 -1
  95. package/dist/operator/board.d.ts +3 -8
  96. package/dist/operator/board.d.ts.map +1 -1
  97. package/dist/operator/board.js +2 -11
  98. package/dist/operator/board.js.map +1 -1
  99. package/dist/operator/cancel.d.ts +2 -2
  100. package/dist/operator/cancel.js +6 -6
  101. package/dist/operator/cancel.js.map +1 -1
  102. package/dist/operator/doctor.d.ts +9 -0
  103. package/dist/operator/doctor.d.ts.map +1 -1
  104. package/dist/operator/doctor.js +32 -25
  105. package/dist/operator/doctor.js.map +1 -1
  106. package/dist/operator/explain.d.ts +76 -0
  107. package/dist/operator/explain.d.ts.map +1 -0
  108. package/dist/operator/explain.js +556 -0
  109. package/dist/operator/explain.js.map +1 -0
  110. package/dist/operator/film.d.ts +3 -11
  111. package/dist/operator/film.d.ts.map +1 -1
  112. package/dist/operator/film.js +8 -90
  113. package/dist/operator/film.js.map +1 -1
  114. package/dist/operator/init.d.ts.map +1 -1
  115. package/dist/operator/init.js +41 -49
  116. package/dist/operator/init.js.map +1 -1
  117. package/dist/operator/live.js +1 -1
  118. package/dist/operator/live.js.map +1 -1
  119. package/dist/operator/log.js +3 -4
  120. package/dist/operator/log.js.map +1 -1
  121. package/dist/operator/release.d.ts +2 -2
  122. package/dist/operator/release.js +7 -7
  123. package/dist/operator/release.js.map +1 -1
  124. package/dist/operator/run.d.ts +25 -0
  125. package/dist/operator/run.d.ts.map +1 -0
  126. package/dist/operator/run.js +70 -0
  127. package/dist/operator/run.js.map +1 -0
  128. package/dist/operator/setup.d.ts.map +1 -1
  129. package/dist/operator/setup.js +20 -16
  130. package/dist/operator/setup.js.map +1 -1
  131. package/dist/plugins/manager.d.ts +33 -2
  132. package/dist/plugins/manager.d.ts.map +1 -1
  133. package/dist/plugins/manager.js +67 -0
  134. package/dist/plugins/manager.js.map +1 -1
  135. package/package.json +15 -16
@@ -0,0 +1,23 @@
1
+ import type { ProjectRunResult } from "@bluewombat/conductor";
2
+ import type { HostDeliveryInput, HostRunInput } from "./context.js";
3
+ import { type CancelResult } from "./deliveries.js";
4
+ /**
5
+ * One Feature delivery: admit it, resume it, or abandon it. Nothing is driven
6
+ * here — the sweep that follows advances every Project that has a Feature.
7
+ */
8
+ export declare function handleFeatureDelivery(input: HostDeliveryInput, payload: Record<string, unknown>): Promise<{
9
+ advance: boolean;
10
+ }>;
11
+ /**
12
+ * Abandon a Feature: its Tickets that are not done are cancelled, its line is
13
+ * dropped, and the Project is free for the next one.
14
+ */
15
+ export declare function cancelFeatureFlow(input: HostDeliveryInput, key: string): Promise<void>;
16
+ /**
17
+ * Move a Project's Feature along by one step: open the next one that may open,
18
+ * make its Tickets, close its line, or watch for the human who folds it.
19
+ */
20
+ export declare function advanceProject(input: HostDeliveryInput, project: string): Promise<ProjectRunResult | undefined>;
21
+ /** Abandon a Feature or a Ticket by key: whichever the ledger knows. */
22
+ export declare function cancelKey(input: HostRunInput, key: string): Promise<CancelResult>;
23
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/loop/features.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAe9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AAiBzB;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+C/B;AAyDD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5F;AAUD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAsBvC;AAwdD,wEAAwE;AACxE,wBAAsB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAavF"}
@@ -0,0 +1,571 @@
1
+ import { refreshWorkLine } from "./authority.js";
2
+ import { cancelTicket, handleCancel as cancelTicketByKey, handleResume as resumeTicketByKey, } from "./deliveries.js";
3
+ import { driveUntilBlocked } from "./drive.js";
4
+ import { pushReport } from "./report.js";
5
+ /** Where a Ticket is while it still counts against its Feature. */
6
+ const LIVE = new Set([
7
+ "received",
8
+ "running",
9
+ "escalated",
10
+ "integrating",
11
+ "submitted",
12
+ "merging",
13
+ ]);
14
+ /** What a Feature says to its tracker: its own Thread, not a Ticket's. */
15
+ const TO = "features";
16
+ /**
17
+ * One Feature delivery: admit it, resume it, or abandon it. Nothing is driven
18
+ * here — the sweep that follows advances every Project that has a Feature.
19
+ */
20
+ export async function handleFeatureDelivery(input, payload) {
21
+ const adapted = await input.features.adapt(payload);
22
+ switch (adapted.outcome) {
23
+ case "unavailable":
24
+ case "interrupted":
25
+ return { advance: false };
26
+ case "invalid":
27
+ // Said once per intention as written: the report is itself an edit of the
28
+ // issue, and delivers it again.
29
+ input.journal.append({ event: "invalid", key: adapted.key, reason: adapted.invalid.reason });
30
+ await pushReport(input, {
31
+ event: "invalid",
32
+ key: adapted.key,
33
+ project: adapted.project,
34
+ eventId: `${adapted.key}:invalid:${adapted.fingerprint}`,
35
+ fields: { reason: adapted.invalid.reason },
36
+ }, TO);
37
+ return { advance: true };
38
+ case "converted":
39
+ break;
40
+ }
41
+ const feature = adapted.feature;
42
+ // Poll snapshots have no labeled edge: a resume signal on an escalated upsert
43
+ // is the same instruction as an explicit resume intent.
44
+ if (feature.intent === "upsert" && input.features.signalsResume?.(payload) === true) {
45
+ const before = await input.ledger.getFeature(feature.key);
46
+ if (before.ok && before.aggregate.state === "escalated") {
47
+ await resumeFeature(input, feature.key, feature.project);
48
+ return { advance: true };
49
+ }
50
+ }
51
+ switch (feature.intent) {
52
+ case "resume":
53
+ await resumeFeature(input, feature.key, feature.project);
54
+ return { advance: true };
55
+ case "cancel":
56
+ await cancelFeatureFlow(input, feature.key);
57
+ return { advance: true };
58
+ case "upsert":
59
+ await admitFeature(input, feature);
60
+ return { advance: true };
61
+ }
62
+ }
63
+ async function admitFeature(input, feature) {
64
+ if (feature.intention === undefined) {
65
+ return;
66
+ }
67
+ // Only a Feature that has not opened takes new words. After that every
68
+ // delivery is the tracker echoing a report of ours, or a human talking
69
+ // about work already made: nothing here restarts it.
70
+ const before = await input.ledger.getFeature(feature.key);
71
+ if (before.ok && before.aggregate.state !== "waiting") {
72
+ input.journal.append({ event: "skipped", key: feature.key, state: before.aggregate.state });
73
+ return;
74
+ }
75
+ const admission = {
76
+ key: feature.key,
77
+ project: feature.project,
78
+ fingerprint: feature.fingerprint,
79
+ priority: feature.priority,
80
+ intention: feature.intention,
81
+ manager: feature.manager,
82
+ external_id: feature.external_id,
83
+ blocked_by: feature.blocked_by,
84
+ merge_when_ready: feature.merge_when_ready,
85
+ ...(feature.title === undefined ? {} : { title: feature.title }),
86
+ ...(feature.source === undefined ? {} : { source: feature.source }),
87
+ };
88
+ await input.ledger.admitFeature(admission);
89
+ }
90
+ async function resumeFeature(input, key, project) {
91
+ const resumed = await input.ledger.resumeFeature(key);
92
+ if (!resumed.ok) {
93
+ return;
94
+ }
95
+ // The signal is an instruction, not a state; left in place it resumes the
96
+ // Feature again on every pass.
97
+ await input.features.clearResume?.(key);
98
+ const got = await input.ledger.getFeature(key);
99
+ const round = got.ok ? got.aggregate.resumes : 0;
100
+ await pushReport(input, {
101
+ event: "resumed",
102
+ key,
103
+ project,
104
+ eventId: `${key}:resumed:${round}`,
105
+ fields: { resume_point: "integrating" },
106
+ }, TO);
107
+ }
108
+ /**
109
+ * Abandon a Feature: its Tickets that are not done are cancelled, its line is
110
+ * dropped, and the Project is free for the next one.
111
+ */
112
+ export async function cancelFeatureFlow(input, key) {
113
+ const before = await input.ledger.getFeature(key);
114
+ if (!before.ok) {
115
+ return;
116
+ }
117
+ const feature = before.aggregate;
118
+ if (feature.state === "cancelled") {
119
+ return;
120
+ }
121
+ if (feature.state === "done") {
122
+ // A done Feature's issue closing is the tracker agreeing, not a cancel.
123
+ input.journal.append({ event: "skipped", key, state: feature.state });
124
+ return;
125
+ }
126
+ for (const summary of await ticketsOf(input, feature)) {
127
+ if (LIVE.has(summary.state)) {
128
+ await cancelTicketByKey({ key: summary.key, project: summary.project }, input);
129
+ }
130
+ }
131
+ if (feature.line !== undefined) {
132
+ await input.tickets.dropLine?.(feature.line);
133
+ }
134
+ const cancelled = await input.ledger.cancelFeature(key);
135
+ if (!cancelled.ok) {
136
+ return;
137
+ }
138
+ await pushReport(input, {
139
+ event: "cancelled",
140
+ key,
141
+ project: feature.intention.project,
142
+ eventId: `${key}:cancelled`,
143
+ fields: { state: feature.state },
144
+ }, TO);
145
+ }
146
+ async function ticketsOf(input, feature) {
147
+ const known = new Set(feature.tickets);
148
+ return (await input.ledger.list()).filter((summary) => known.has(summary.key));
149
+ }
150
+ /**
151
+ * Move a Project's Feature along by one step: open the next one that may open,
152
+ * make its Tickets, close its line, or watch for the human who folds it.
153
+ */
154
+ export async function advanceProject(input, project) {
155
+ let active = await input.ledger.activeFeatureOn(project);
156
+ if (active === undefined) {
157
+ await openNextFeature(input, project);
158
+ active = await input.ledger.activeFeatureOn(project);
159
+ }
160
+ if (active === undefined) {
161
+ return undefined;
162
+ }
163
+ const got = await input.ledger.getFeature(active.key);
164
+ if (!got.ok) {
165
+ return undefined;
166
+ }
167
+ switch (got.aggregate.state) {
168
+ case "open":
169
+ return await advanceOpenFeature(input, got.aggregate);
170
+ case "submitted":
171
+ await settleFeature(input, got.aggregate);
172
+ return undefined;
173
+ default:
174
+ return undefined;
175
+ }
176
+ }
177
+ function refOf(feature) {
178
+ const { intention } = feature;
179
+ return {
180
+ key: intention.key,
181
+ external_id: intention.external_id ?? intention.key,
182
+ project: intention.project,
183
+ ...(intention.source === undefined ? {} : { source: intention.source }),
184
+ };
185
+ }
186
+ /** The line a Feature's Tickets land on: `feature/<id>`, as one safe branch name. */
187
+ function lineOf(feature) {
188
+ const id = feature.intention.external_id ?? feature.intention.key;
189
+ return `feature/${id.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "")}`;
190
+ }
191
+ function admissionOf(ticket, feature, among) {
192
+ return {
193
+ key: ticket.key,
194
+ project: ticket.project,
195
+ fingerprint: ticket.fingerprint,
196
+ priority: ticket.priority,
197
+ intention: ticket.intention,
198
+ manager: ticket.manager,
199
+ external_id: ticket.external_id,
200
+ feature: feature.intention.key,
201
+ blocked_by: ticket.blocked_by.filter((other) => among.has(other)),
202
+ ...(feature.line === undefined ? {} : { line: feature.line }),
203
+ ...(ticket.title === undefined ? {} : { title: ticket.title }),
204
+ ...(ticket.source === undefined ? {} : { source: ticket.source }),
205
+ };
206
+ }
207
+ /**
208
+ * Open the next Feature that may: waiting, nothing blocking it, and every one
209
+ * of its Tickets written. Until then it waits and nothing is made.
210
+ */
211
+ async function openNextFeature(input, project) {
212
+ const next = await input.ledger.nextFeature(project);
213
+ if (next === undefined) {
214
+ return;
215
+ }
216
+ const got = await input.ledger.getFeature(next.key);
217
+ if (!got.ok) {
218
+ return;
219
+ }
220
+ const feature = got.aggregate;
221
+ const listed = await input.tickets.tickets(refOf(feature));
222
+ if (listed.outcome !== "listed") {
223
+ input.journal.append({ event: "tickets-unavailable", key: feature.intention.key });
224
+ return;
225
+ }
226
+ const live = listed.tickets.filter((entry) => entry.open);
227
+ if (live.length === 0 || !live.every((entry) => entry.task_ready)) {
228
+ input.journal.append({
229
+ event: "waiting",
230
+ key: feature.intention.key,
231
+ reason: live.length === 0 ? "it has no Ticket yet" : "a Ticket is not ready yet",
232
+ });
233
+ return;
234
+ }
235
+ const target = input.workLine.target;
236
+ let line;
237
+ if (input.authority !== undefined &&
238
+ input.tickets.openLine !== undefined &&
239
+ target !== undefined) {
240
+ line = lineOf(feature);
241
+ const made = await input.tickets.openLine({ line, from: target });
242
+ if (made.outcome === "unavailable") {
243
+ return;
244
+ }
245
+ if (made.outcome === "refused") {
246
+ input.journal.append({
247
+ event: "line-refused",
248
+ key: feature.intention.key,
249
+ reason: made.reason,
250
+ });
251
+ await pushReport(input, {
252
+ event: "progress",
253
+ key: feature.intention.key,
254
+ project,
255
+ eventId: `${feature.intention.key}:line-refused:${made.reason}`,
256
+ fields: { summary: `Its line could not be opened: ${made.reason}` },
257
+ }, TO);
258
+ return;
259
+ }
260
+ }
261
+ const among = new Set(live.map((entry) => entry.ticket.key));
262
+ const opened = await input.ledger.openFeature({
263
+ key: feature.intention.key,
264
+ ...(line === undefined ? {} : { line }),
265
+ tickets: [...among],
266
+ });
267
+ if (!opened.ok) {
268
+ return;
269
+ }
270
+ const withLine = { ...feature, ...(line === undefined ? {} : { line }) };
271
+ for (const entry of live) {
272
+ await input.ledger.admit(admissionOf(entry.ticket, withLine, among));
273
+ }
274
+ input.journal.append({
275
+ event: "feature-opened",
276
+ key: feature.intention.key,
277
+ ...(line === undefined ? {} : { line }),
278
+ tickets: live.length,
279
+ });
280
+ input.trace(`feature ${feature.intention.key} opened with ${live.length} ticket(s)`);
281
+ await pushReport(input, {
282
+ event: "accepted",
283
+ key: feature.intention.key,
284
+ project,
285
+ eventId: `${feature.intention.key}:accepted:${feature.intention.fingerprint}`,
286
+ fields: { priority: feature.intention.priority },
287
+ }, TO);
288
+ for (const entry of live) {
289
+ await pushReport(input, {
290
+ event: "accepted",
291
+ key: entry.ticket.key,
292
+ project,
293
+ eventId: `${entry.ticket.key}:accepted:${entry.ticket.fingerprint}`,
294
+ fields: { priority: entry.ticket.priority },
295
+ });
296
+ }
297
+ }
298
+ /**
299
+ * Bring the work line copy onto the line the next unit is made from. Without an
300
+ * Authority the work line is the operator's and nothing is fetched.
301
+ */
302
+ async function refreshOnto(input, branch) {
303
+ if (input.authority === undefined || branch === undefined) {
304
+ return true;
305
+ }
306
+ const refreshed = await refreshWorkLine({
307
+ workLineStable: input.workLine.stable,
308
+ workLineTarget: branch,
309
+ refreshArgv: input.options.authority?.refreshArgv ?? [],
310
+ timeoutMs: input.options.timeoutMs,
311
+ env: input.workLine.env,
312
+ });
313
+ if (!refreshed.ok) {
314
+ input.journal.append({
315
+ event: "refresh",
316
+ outcome: "failed",
317
+ target: branch,
318
+ ...(refreshed.detail === undefined ? {} : { detail: refreshed.detail }),
319
+ });
320
+ input.trace(`work line cannot fast-forward onto ${branch}, so nothing started. ${refreshed.detail ?? ""}`);
321
+ return false;
322
+ }
323
+ input.journal.append({ event: "refresh", outcome: "ok", target: branch });
324
+ return true;
325
+ }
326
+ /**
327
+ * What the tracker says of the Tickets of an open Feature: an edit, a human's
328
+ * resume, a Ticket closed under our feet. A Ticket that joined after the
329
+ * Feature opened is not part of it.
330
+ */
331
+ async function syncTickets(input, feature) {
332
+ const listed = await input.tickets.tickets(refOf(feature));
333
+ if (listed.outcome !== "listed") {
334
+ return;
335
+ }
336
+ const known = new Set(feature.tickets);
337
+ for (const entry of listed.tickets) {
338
+ if (!known.has(entry.ticket.key)) {
339
+ continue;
340
+ }
341
+ await syncTicket(input, feature, entry, known);
342
+ }
343
+ }
344
+ async function syncTicket(input, feature, entry, known) {
345
+ const { ticket } = entry;
346
+ const current = await input.ledger.get(ticket.key);
347
+ if (!current.ok) {
348
+ return;
349
+ }
350
+ const state = current.aggregate.state;
351
+ if (!entry.open) {
352
+ if (LIVE.has(state)) {
353
+ await cancelTicketByKey({ key: ticket.key, project: ticket.project }, input);
354
+ }
355
+ return;
356
+ }
357
+ // Only a Ticket that has not started takes the new words: the tracker's
358
+ // fingerprint moves with every comment, and a unit in flight is not rewritten.
359
+ if (state === "received" && current.aggregate.intention.fingerprint !== ticket.fingerprint) {
360
+ await input.ledger.admit(admissionOf(ticket, feature, known));
361
+ }
362
+ if (entry.resume && state === "escalated") {
363
+ await resumeTicketByKey({ key: ticket.key, project: ticket.project }, input);
364
+ }
365
+ }
366
+ async function advanceOpenFeature(input, feature) {
367
+ const project = feature.intention.project;
368
+ await syncTickets(input, feature);
369
+ const held = await input.ledger.activeOn(project);
370
+ if (held?.state === "escalated") {
371
+ return undefined;
372
+ }
373
+ const refreshed = await refreshOnto(input, feature.line ?? input.workLine.target);
374
+ if (!refreshed) {
375
+ return undefined;
376
+ }
377
+ let tickets = await ticketsOf(input, feature);
378
+ let run;
379
+ let pending = tickets.find((summary) => LIVE.has(summary.state));
380
+ // A Ticket that landed moved the line: the next one is cut from where it is
381
+ // now, in this same pass, not a poll later.
382
+ while (pending !== undefined) {
383
+ run = await driveUntilBlocked(input, project, pending.key);
384
+ tickets = await ticketsOf(input, feature);
385
+ pending = tickets.find((summary) => LIVE.has(summary.state));
386
+ const interrupted = input.options.interruptFlag?.interrupted === true;
387
+ if (run.outcome !== "done" ||
388
+ interrupted ||
389
+ pending === undefined ||
390
+ !(await refreshOnto(input, feature.line ?? input.workLine.target))) {
391
+ break;
392
+ }
393
+ }
394
+ await reportLanded(input, feature, tickets);
395
+ const settled = tickets.every((summary) => summary.state === "done" || summary.state === "cancelled");
396
+ if (settled && tickets.length > 0) {
397
+ await closeFeature(input, feature, tickets);
398
+ return run;
399
+ }
400
+ if (run?.outcome === "idle" && tickets.some((summary) => summary.state === "received")) {
401
+ await escalateFeature(input, feature, "No Ticket can start: each waits on a Ticket that is not done.");
402
+ }
403
+ return run;
404
+ }
405
+ /** One `progress` per Ticket that landed, in the words the tracker already has. */
406
+ async function reportLanded(input, feature, tickets) {
407
+ const total = feature.tickets.length;
408
+ const done = tickets.filter((summary) => summary.state === "done");
409
+ for (const [at, summary] of done.entries()) {
410
+ const got = await input.ledger.get(summary.key);
411
+ const title = got.ok ? (got.aggregate.intention.title ?? summary.key) : summary.key;
412
+ await pushReport(input, {
413
+ event: "progress",
414
+ key: feature.intention.key,
415
+ project: feature.intention.project,
416
+ eventId: `${feature.intention.key}:landed:${summary.key}`,
417
+ fields: { summary: `Landed ${at + 1} of ${total}: ${title}` },
418
+ }, TO);
419
+ }
420
+ }
421
+ async function escalateFeature(input, feature, report) {
422
+ const escalated = await input.ledger.escalateFeature({ key: feature.intention.key, report });
423
+ if (!escalated.ok) {
424
+ return;
425
+ }
426
+ const got = await input.ledger.getFeature(feature.intention.key);
427
+ const round = got.ok ? got.aggregate.resumes : 0;
428
+ input.trace(`feature ${feature.intention.key} escalated: ${report}`);
429
+ await pushReport(input, {
430
+ event: "escalated",
431
+ key: feature.intention.key,
432
+ project: feature.intention.project,
433
+ eventId: `${feature.intention.key}:escalated:${round}`,
434
+ fields: { reason: report, stage: "submitting" },
435
+ }, TO);
436
+ }
437
+ /**
438
+ * Every Ticket has landed: the line goes to the Authority. With none, the work
439
+ * is already in the work line and the Feature is done.
440
+ */
441
+ async function closeFeature(input, feature, tickets) {
442
+ const key = feature.intention.key;
443
+ const project = feature.intention.project;
444
+ if (!tickets.some((summary) => summary.state === "done")) {
445
+ await escalateFeature(input, feature, "Every Ticket was abandoned, so nothing was made.");
446
+ return;
447
+ }
448
+ if (input.authority === undefined || feature.line === undefined) {
449
+ await input.ledger.markFeatureSubmitted({ key, reference: "local" });
450
+ await input.ledger.markFeatureDone(key);
451
+ await reportDone(input, feature, undefined, undefined);
452
+ return;
453
+ }
454
+ if (feature.submission !== undefined) {
455
+ await input.ledger.markFeatureSubmitted({ key, reference: feature.submission.reference });
456
+ return;
457
+ }
458
+ const target = input.workLine.target;
459
+ if (target === undefined) {
460
+ return;
461
+ }
462
+ const submitted = await input.authority.submit({
463
+ key,
464
+ project,
465
+ ref: key,
466
+ branch: feature.line,
467
+ target,
468
+ workspace: input.workLine.stable,
469
+ ...(feature.intention.title === undefined ? {} : { title: feature.intention.title }),
470
+ intention: feature.intention.intention,
471
+ });
472
+ if (submitted.outcome === "unavailable") {
473
+ return;
474
+ }
475
+ if (submitted.outcome === "refused") {
476
+ await escalateFeature(input, feature, submitted.reason);
477
+ return;
478
+ }
479
+ await input.ledger.markFeatureSubmitted({ key, reference: submitted.reference });
480
+ await pushReport(input, {
481
+ event: "submitted",
482
+ key,
483
+ project,
484
+ eventId: `${key}:submitted:${submitted.reference}`,
485
+ fields: { reference: submitted.reference },
486
+ }, TO);
487
+ }
488
+ /**
489
+ * The line is with the Authority. If the Feature merges by itself, the checks
490
+ * decide; otherwise a human folds it and the system waits, starting nothing.
491
+ */
492
+ async function settleFeature(input, feature) {
493
+ const submission = feature.submission;
494
+ if (submission === undefined || input.authority === undefined || feature.line === undefined) {
495
+ return;
496
+ }
497
+ const key = feature.intention.key;
498
+ if (!feature.intention.merge_when_ready) {
499
+ const settled = (await input.tickets.settled?.({ reference: submission.reference })) ?? "unavailable";
500
+ if (settled === "folded") {
501
+ await input.ledger.markFeatureDone(key);
502
+ await reportDone(input, feature, submission.reference, undefined);
503
+ }
504
+ else if (settled === "closed") {
505
+ await escalateFeature(input, feature, `The Submission ${submission.reference} was closed without being folded.`);
506
+ }
507
+ return;
508
+ }
509
+ if (!(await refreshOnto(input, feature.line))) {
510
+ return;
511
+ }
512
+ const judged = await input.transformers.implement({
513
+ id: `${key}:judgement`,
514
+ context: key,
515
+ stage: "assembly",
516
+ produce: false,
517
+ intention: feature.intention.intention,
518
+ workspace: input.workLine.stable,
519
+ });
520
+ if (judged.outcome === "interrupted" || judged.outcome === "invalid-invocation") {
521
+ return;
522
+ }
523
+ if (judged.outcome === "escalated") {
524
+ const last = judged.traces.at(-1);
525
+ const why = last?.report ?? "The line was refused, with no reason given.";
526
+ await escalateFeature(input, feature, last?.refusedBy === undefined ? why : `${last.refusedBy}: ${why}`);
527
+ return;
528
+ }
529
+ const folded = await input.authority.fold({ reference: submission.reference });
530
+ if (folded.outcome === "unavailable") {
531
+ return;
532
+ }
533
+ if (folded.outcome === "conflict") {
534
+ await escalateFeature(input, feature, folded.reason);
535
+ return;
536
+ }
537
+ await input.ledger.markFeatureDone(key, { reference: folded.reference });
538
+ await reportDone(input, feature, submission.reference, folded.reference);
539
+ }
540
+ async function reportDone(input, feature, reference, integrationReference) {
541
+ const key = feature.intention.key;
542
+ input.trace(`feature ${key} done`);
543
+ await pushReport(input, {
544
+ event: "done",
545
+ key,
546
+ project: feature.intention.project,
547
+ eventId: `${key}:done`,
548
+ fields: {
549
+ ...(reference === undefined || reference === "local" ? {} : { reference }),
550
+ ...(integrationReference === undefined
551
+ ? {}
552
+ : { integration_reference: integrationReference }),
553
+ },
554
+ }, TO);
555
+ }
556
+ /** Abandon a Feature or a Ticket by key: whichever the ledger knows. */
557
+ export async function cancelKey(input, key) {
558
+ const feature = await input.ledger.getFeature(key);
559
+ if (!feature.ok) {
560
+ return await cancelTicket(input, key);
561
+ }
562
+ if (feature.aggregate.state === "cancelled") {
563
+ return { ok: false, code: "already-cancelled" };
564
+ }
565
+ if (feature.aggregate.state === "done") {
566
+ return { ok: false, code: "done" };
567
+ }
568
+ await cancelFeatureFlow({ ...input, reported: [] }, key);
569
+ return { ok: true };
570
+ }
571
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/loop/features.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAEL,YAAY,EACZ,YAAY,IAAI,iBAAiB,EACjC,YAAY,IAAI,iBAAiB,GAClC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,mEAAmE;AACnE,MAAM,IAAI,GAA6B,IAAI,GAAG,CAAC;IAC7C,UAAU;IACV,SAAS;IACT,WAAW;IACX,aAAa;IACb,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAEH,0EAA0E;AAC1E,MAAM,EAAE,GAAG,UAAmB,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAwB,EACxB,OAAgC;IAEhC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,aAAa,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,0EAA0E;YAC1E,gCAAgC;YAChC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7F,MAAM,UAAU,CACd,KAAK,EACL;gBACE,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,YAAY,OAAO,CAAC,WAAW,EAAE;gBACxD,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE;aAC3C,EACD,EAAE,CACH,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,WAAW;YACd,MAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,8EAA8E;IAC9E,wDAAwD;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACxD,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,OAAwB;IAC5E,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IACD,uEAAuE;IACvE,uEAAuE;IACvE,qDAAqD;IACrD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAqB;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;KACpE,CAAC;IACF,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAwB,EACxB,GAAW,EACX,OAAe;IAEf,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,+BAA+B;IAC/B,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,SAAS;QAChB,GAAG;QACH,OAAO;QACP,OAAO,EAAE,GAAG,GAAG,YAAY,KAAK,EAAE;QAClC,MAAM,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE;KACxC,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAwB,EAAE,GAAW;IAC3E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC7B,wEAAwE;QACxE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,WAAW;QAClB,GAAG;QACH,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;QAClC,OAAO,EAAE,GAAG,GAAG,YAAY;QAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;KACjC,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAwB,EACxB,OAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAwB,EACxB,OAAe;IAEf,IAAI,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,QAAQ,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,MAAM,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,KAAK,WAAW;YACd,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,OAAyB;IACtC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,OAAO;QACL,GAAG,EAAE,SAAS,CAAC,GAAG;QAClB,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,GAAG;QACnD,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,SAAS,MAAM,CAAC,OAAyB;IACvC,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;IAClE,OAAO,WAAW,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,WAAW,CAClB,MAAsB,EACtB,OAAyB,EACzB,KAA0B;IAE1B,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAC9B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,KAAwB,EAAE,OAAe;IACtE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,2BAA2B;SACjF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrC,IAAI,IAAwB,CAAC;IAC7B,IACE,KAAK,CAAC,SAAS,KAAK,SAAS;QAC7B,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;QACpC,MAAM,KAAK,SAAS,EACpB,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,MAAM,UAAU,CACd,KAAK,EACL;gBACE,KAAK,EAAE,UAAU;gBACjB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;gBAC1B,OAAO;gBACP,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,iBAAiB,IAAI,CAAC,MAAM,EAAE;gBAC/D,MAAM,EAAE,EAAE,OAAO,EAAE,iCAAiC,IAAI,CAAC,MAAM,EAAE,EAAE;aACpE,EACD,EAAE,CACH,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;QAC5C,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;KACpB,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAqB,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3F,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,gBAAgB;QACvB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,MAAM;KACrB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,SAAS,CAAC,GAAG,gBAAgB,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;IACxF,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAC1B,OAAO;QACP,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,aAAa,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;QAC7E,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;KACjD,EACD,EAAE,CACH,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,UAAU,CAAC,KAAK,EAAE;YACtB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG;YACrB,OAAO;YACP,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,aAAa,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;YACnE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,KAAwB,EAAE,MAA0B;IAC7E,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;QACtC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACrC,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,IAAI,EAAE;QACvD,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;QAClC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG;KACxB,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;SACxE,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CACT,uCAAuC,MAAM,yBAAyB,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAC/F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,KAAwB,EAAE,OAAyB;IAC5E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAwB,EACxB,OAAyB,EACzB,KAAkB,EAClB,KAA0B;IAE1B,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO;IACT,CAAC;IACD,wEAAwE;IACxE,+EAA+E;IAC/E,IAAI,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3F,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1C,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAwB,EACxB,OAAyB;IAEzB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAC1C,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,GAAiC,CAAC;IACtC,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,4EAA4E;IAC5E,4CAA4C;IAC5C,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,GAAG,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,WAAW,KAAK,IAAI,CAAC;QACtE,IACE,GAAG,CAAC,OAAO,KAAK,MAAM;YACtB,WAAW;YACX,OAAO,KAAK,SAAS;YACrB,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAClE,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAC3B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,CACvE,CAAC;IACF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,EAAE,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,EAAE,CAAC;QACvF,MAAM,eAAe,CACnB,KAAK,EACL,OAAO,EACP,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,YAAY,CACzB,KAAwB,EACxB,OAAyB,EACzB,OAAwB;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACpF,MAAM,UAAU,CACd,KAAK,EACL;YACE,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;YAC1B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;YAClC,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,WAAW,OAAO,CAAC,GAAG,EAAE;YACzD,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK,KAAK,EAAE,EAAE;SAC9D,EACD,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAwB,EACxB,OAAyB,EACzB,MAAc;IAEd,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,KAAK,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,SAAS,CAAC,GAAG,eAAe,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,WAAW;QAClB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAC1B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;QAClC,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,cAAc,KAAK,EAAE;QACtD,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE;KAChD,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CACzB,KAAwB,EACxB,OAAyB,EACzB,OAAwB;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;QACzD,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,kDAAkD,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChE,MAAM,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;QAC7C,GAAG;QACH,OAAO;QACP,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QAChC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACpF,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;KACvC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IACjF,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,WAAW;QAClB,GAAG;QACH,OAAO;QACP,OAAO,EAAE,GAAG,GAAG,cAAc,SAAS,CAAC,SAAS,EAAE;QAClD,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE;KAC3C,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAAC,KAAwB,EAAE,OAAyB;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5F,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,OAAO,GACX,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,aAAa,CAAC;QACxF,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACpE,CAAC;aAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,eAAe,CACnB,KAAK,EACL,OAAO,EACP,kBAAkB,UAAU,CAAC,SAAS,mCAAmC,CAC1E,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC;QAChD,EAAE,EAAE,GAAG,GAAG,YAAY;QACtB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;QACtC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;KACjC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,IAAI,MAAM,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAChF,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,6CAA6C,CAAC;QAC1E,MAAM,eAAe,CACnB,KAAK,EACL,OAAO,EACP,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,CAClE,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAwB,EACxB,OAAyB,EACzB,SAA6B,EAC7B,oBAAwC;IAExC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;IAClC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,CACd,KAAK,EACL;QACE,KAAK,EAAE,MAAM;QACb,GAAG;QACH,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;QAClC,OAAO,EAAE,GAAG,GAAG,OAAO;QACtB,MAAM,EAAE;YACN,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YAC1E,GAAG,CAAC,oBAAoB,KAAK,SAAS;gBACpC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;SACrD;KACF,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAmB,EAAE,GAAW;IAC9D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -40,7 +40,7 @@ export declare function stampJournal(base: Journal, stamp: Record<string, unknow
40
40
  export declare function coalesceQuiet(base: Journal, everyMs?: number, now?: () => number): Journal;
41
41
  /**
42
42
  * Split a file chunk into complete JSON objects. A truncated last line stays
43
- * in `remainder` and is not parsed as a Feature.
43
+ * in `remainder` and is not parsed as a Ticket.
44
44
  */
45
45
  export declare function parseJournalChunk(chunk: string, remainder: string): {
46
46
  lines: Record<string, unknown>[];
@@ -91,7 +91,7 @@ function isQuietListen(line) {
91
91
  }
92
92
  /**
93
93
  * Split a file chunk into complete JSON objects. A truncated last line stays
94
- * in `remainder` and is not parsed as a Feature.
94
+ * in `remainder` and is not parsed as a Ticket.
95
95
  */
96
96
  export function parseJournalChunk(chunk, remainder) {
97
97
  const text = `${remainder}${chunk}`;
@@ -109,7 +109,7 @@ export function parseJournalChunk(chunk, remainder) {
109
109
  }
110
110
  }
111
111
  catch {
112
- // Garbage or a split object that gained a newline: skip, do not invent a Feature.
112
+ // Garbage or a split object that gained a newline: skip, do not invent a Ticket.
113
113
  }
114
114
  }
115
115
  return { lines, remainder: nextRemainder };