@bluewombat/runtime 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -142
- package/SPECS.md +138 -97
- package/dist/cli.js +35 -37
- package/dist/cli.js.map +1 -1
- package/dist/config/agent-shorthand.d.ts +24 -4
- package/dist/config/agent-shorthand.d.ts.map +1 -1
- package/dist/config/agent-shorthand.js +65 -28
- package/dist/config/agent-shorthand.js.map +1 -1
- package/dist/config/defaults.d.ts +0 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +0 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/find-config.d.ts +3 -2
- package/dist/config/find-config.d.ts.map +1 -1
- package/dist/config/find-config.js +4 -4
- package/dist/config/find-config.js.map +1 -1
- package/dist/config/home.d.ts +2 -0
- package/dist/config/home.d.ts.map +1 -1
- package/dist/config/home.js +4 -2
- package/dist/config/home.js.map +1 -1
- package/dist/config/load-config.d.ts +2 -2
- package/dist/config/load-config.d.ts.map +1 -1
- package/dist/config/load-config.js +342 -73
- package/dist/config/load-config.js.map +1 -1
- package/dist/config/parse-args.d.ts +1 -1
- package/dist/config/parse-args.d.ts.map +1 -1
- package/dist/config/parse-args.js +132 -103
- package/dist/config/parse-args.js.map +1 -1
- package/dist/config/types.d.ts +142 -38
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +13 -1
- package/dist/config/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/authority.d.ts +41 -5
- package/dist/loop/authority.d.ts.map +1 -1
- package/dist/loop/authority.js +68 -24
- package/dist/loop/authority.js.map +1 -1
- package/dist/loop/context.d.ts +23 -3
- package/dist/loop/context.d.ts.map +1 -1
- package/dist/loop/deliveries.d.ts +16 -16
- package/dist/loop/deliveries.d.ts.map +1 -1
- package/dist/loop/deliveries.js +35 -187
- package/dist/loop/deliveries.js.map +1 -1
- package/dist/loop/describe.d.ts +4 -6
- package/dist/loop/describe.d.ts.map +1 -1
- package/dist/loop/describe.js +2 -2
- package/dist/loop/describe.js.map +1 -1
- package/dist/loop/drive.d.ts +11 -7
- package/dist/loop/drive.d.ts.map +1 -1
- package/dist/loop/drive.js +24 -38
- package/dist/loop/drive.js.map +1 -1
- package/dist/loop/features.d.ts +23 -0
- package/dist/loop/features.d.ts.map +1 -0
- package/dist/loop/features.js +834 -0
- package/dist/loop/features.js.map +1 -0
- package/dist/loop/journal.d.ts +1 -1
- package/dist/loop/journal.js +2 -2
- package/dist/loop/journal.js.map +1 -1
- package/dist/loop/lock.d.ts +1 -1
- package/dist/loop/lock.js +1 -1
- package/dist/loop/open-host.d.ts.map +1 -1
- package/dist/loop/open-host.js +132 -31
- package/dist/loop/open-host.js.map +1 -1
- package/dist/loop/probe.d.ts +1 -1
- package/dist/loop/probe.d.ts.map +1 -1
- package/dist/loop/probe.js +51 -22
- package/dist/loop/probe.js.map +1 -1
- package/dist/loop/process-tree.d.ts +1 -1
- package/dist/loop/process-tree.js +1 -1
- package/dist/loop/report.d.ts +9 -7
- package/dist/loop/report.d.ts.map +1 -1
- package/dist/loop/report.js +49 -106
- package/dist/loop/report.js.map +1 -1
- package/dist/loop/streams.d.ts +5 -5
- package/dist/loop/streams.d.ts.map +1 -1
- package/dist/loop/streams.js +3 -3
- package/dist/loop/streams.js.map +1 -1
- package/dist/loop/tick.d.ts +6 -4
- package/dist/loop/tick.d.ts.map +1 -1
- package/dist/loop/tick.js +50 -78
- package/dist/loop/tick.js.map +1 -1
- package/dist/loop/trace.d.ts +5 -5
- package/dist/loop/trace.d.ts.map +1 -1
- package/dist/loop/trace.js +5 -14
- package/dist/loop/trace.js.map +1 -1
- package/dist/loop/transformers.d.ts +18 -14
- package/dist/loop/transformers.d.ts.map +1 -1
- package/dist/loop/transformers.js +139 -74
- package/dist/loop/transformers.js.map +1 -1
- package/dist/loop/warm.d.ts +3 -3
- package/dist/loop/warm.js +4 -4
- package/dist/loop/warm.js.map +1 -1
- package/dist/loop/work-line.d.ts +1 -1
- package/dist/operator/agent-plugins.d.ts +11 -0
- package/dist/operator/agent-plugins.d.ts.map +1 -1
- package/dist/operator/agent-plugins.js +17 -11
- package/dist/operator/agent-plugins.js.map +1 -1
- package/dist/operator/board.d.ts +3 -8
- package/dist/operator/board.d.ts.map +1 -1
- package/dist/operator/board.js +2 -11
- package/dist/operator/board.js.map +1 -1
- package/dist/operator/cancel.d.ts +2 -2
- package/dist/operator/cancel.js +6 -6
- package/dist/operator/cancel.js.map +1 -1
- package/dist/operator/doctor.d.ts +9 -0
- package/dist/operator/doctor.d.ts.map +1 -1
- package/dist/operator/doctor.js +110 -53
- package/dist/operator/doctor.js.map +1 -1
- package/dist/operator/explain.d.ts +76 -0
- package/dist/operator/explain.d.ts.map +1 -0
- package/dist/operator/explain.js +585 -0
- package/dist/operator/explain.js.map +1 -0
- package/dist/operator/film.d.ts +3 -11
- package/dist/operator/film.d.ts.map +1 -1
- package/dist/operator/film.js +8 -93
- package/dist/operator/film.js.map +1 -1
- package/dist/operator/init.d.ts.map +1 -1
- package/dist/operator/init.js +52 -55
- package/dist/operator/init.js.map +1 -1
- package/dist/operator/live.js +1 -1
- package/dist/operator/live.js.map +1 -1
- package/dist/operator/log.js +12 -6
- package/dist/operator/log.js.map +1 -1
- package/dist/operator/release.d.ts +2 -2
- package/dist/operator/release.js +7 -7
- package/dist/operator/release.js.map +1 -1
- package/dist/operator/run.d.ts +25 -0
- package/dist/operator/run.d.ts.map +1 -0
- package/dist/operator/run.js +70 -0
- package/dist/operator/run.js.map +1 -0
- package/dist/operator/setup.d.ts.map +1 -1
- package/dist/operator/setup.js +22 -16
- package/dist/operator/setup.js.map +1 -1
- package/dist/plugins/manager.d.ts +33 -2
- package/dist/plugins/manager.d.ts.map +1 -1
- package/dist/plugins/manager.js +67 -0
- package/dist/plugins/manager.js.map +1 -1
- package/package.json +15 -16
package/dist/loop/authority.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { subjectOf } from "@bluewombat/conductor";
|
|
2
1
|
import { describe } from "./describe.js";
|
|
3
2
|
import { runSlot } from "./run-slot.js";
|
|
4
3
|
/**
|
|
@@ -6,7 +5,7 @@ import { runSlot } from "./run-slot.js";
|
|
|
6
5
|
*
|
|
7
6
|
* Two halves that do not belong to the same world: publishing the work is an
|
|
8
7
|
* operation on a directory Host owns, and offering it to the outside belongs to
|
|
9
|
-
* the
|
|
8
|
+
* the TicketTracker. Host runs the first as a slot it never reads into, then
|
|
10
9
|
* hands the second the name that slot published under. Neither of them judges:
|
|
11
10
|
* that is a Gate.
|
|
12
11
|
*
|
|
@@ -15,26 +14,35 @@ import { runSlot } from "./run-slot.js";
|
|
|
15
14
|
* places its work some other way changes that command and nothing else.
|
|
16
15
|
*/
|
|
17
16
|
export function openAuthority(input) {
|
|
18
|
-
const { manager, workLineStable,
|
|
17
|
+
const { manager, workLineStable, publishArgv, timeoutMs, refOf } = input;
|
|
19
18
|
if (manager.submit === undefined || manager.fold === undefined) {
|
|
20
19
|
return undefined;
|
|
21
20
|
}
|
|
22
21
|
const submit = manager.submit.bind(manager);
|
|
23
22
|
const fold = manager.fold.bind(manager);
|
|
23
|
+
const behind = manager.behind?.bind(manager);
|
|
24
24
|
return {
|
|
25
25
|
async submit(offer) {
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ref
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
// A Feature's line is already with the Authority: the cut and every
|
|
27
|
+
// Ticket folded into it happened there, so there is nothing to publish
|
|
28
|
+
// and a local copy of it would only have diverged. A Ticket is published
|
|
29
|
+
// under the name the strategy gave its Child; what the Publisher does
|
|
30
|
+
// with it — push it, copy it, upload it — is the Publisher's business.
|
|
31
|
+
let published;
|
|
32
|
+
if (offer.branch !== undefined) {
|
|
33
|
+
published = { ok: true, ref: offer.branch };
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
published = await publish({
|
|
37
|
+
argv: publishArgv,
|
|
38
|
+
cwd: workLineStable,
|
|
39
|
+
id: offer.key,
|
|
40
|
+
ref: refOf(offer.ref),
|
|
41
|
+
target: offer.target,
|
|
42
|
+
timeoutMs,
|
|
43
|
+
env: input.env,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
38
46
|
if (!published.ok) {
|
|
39
47
|
input.journal?.append({
|
|
40
48
|
event: "submit-refused",
|
|
@@ -46,14 +54,15 @@ export function openAuthority(input) {
|
|
|
46
54
|
}
|
|
47
55
|
// The Project's own words for what it submits, when it has a slot for
|
|
48
56
|
// them; the Authority puts them where its kind of Submission is read.
|
|
49
|
-
// Asked in the
|
|
57
|
+
// Asked in the ticket workspace, where the whole change is.
|
|
50
58
|
let description;
|
|
51
|
-
|
|
59
|
+
// A line the Feature kept is not described: its words are the Feature's.
|
|
60
|
+
if (input.describe !== undefined && offer.branch === undefined) {
|
|
52
61
|
const asked = await describe(input.describe, {
|
|
53
62
|
id: offer.key,
|
|
54
63
|
title: offer.title ?? offer.key,
|
|
55
64
|
intention: offer.intention ?? "",
|
|
56
|
-
target:
|
|
65
|
+
target: offer.target,
|
|
57
66
|
cwd: offer.workspace,
|
|
58
67
|
});
|
|
59
68
|
if (asked.ok) {
|
|
@@ -69,10 +78,7 @@ export function openAuthority(input) {
|
|
|
69
78
|
const submitted = await submit({
|
|
70
79
|
...request,
|
|
71
80
|
ref: published.ref,
|
|
72
|
-
target:
|
|
73
|
-
// What the Submission lists as its work: one line per Subtask, the way
|
|
74
|
-
// the plan was said on the tracker, not the whole intentions.
|
|
75
|
-
...(offer.steps === undefined ? {} : { steps: offer.steps.map(subjectOf) }),
|
|
81
|
+
target: offer.target,
|
|
76
82
|
...(description === undefined ? {} : { description }),
|
|
77
83
|
});
|
|
78
84
|
if (submitted.outcome === "refused") {
|
|
@@ -85,6 +91,8 @@ export function openAuthority(input) {
|
|
|
85
91
|
}
|
|
86
92
|
return submitted;
|
|
87
93
|
},
|
|
94
|
+
// Only a manager that can say whether the line moved on gets the question.
|
|
95
|
+
...(behind === undefined ? {} : { behind }),
|
|
88
96
|
async fold(asked) {
|
|
89
97
|
return await fold(asked);
|
|
90
98
|
},
|
|
@@ -97,7 +105,7 @@ export function openAuthority(input) {
|
|
|
97
105
|
* that cannot run at all is a refusal like any other here — the Submission does
|
|
98
106
|
* not happen, the reason reaches the tracker, and the next pass tries again.
|
|
99
107
|
*/
|
|
100
|
-
async function publish(input) {
|
|
108
|
+
export async function publish(input) {
|
|
101
109
|
const [command, ...rest] = input.argv;
|
|
102
110
|
if (command === undefined) {
|
|
103
111
|
return { ok: false, reason: "No Publisher is configured, so nothing can be submitted." };
|
|
@@ -149,6 +157,37 @@ function lastJsonLine(stdout) {
|
|
|
149
157
|
}
|
|
150
158
|
return undefined;
|
|
151
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* The shared work line copy, kept current for Conductor. Each refresh says in
|
|
162
|
+
* the journal how it went, since a copy that cannot move stops a Ticket cold.
|
|
163
|
+
*/
|
|
164
|
+
export function openLine(input) {
|
|
165
|
+
return {
|
|
166
|
+
async refresh(target) {
|
|
167
|
+
const refreshed = await refreshWorkLine({
|
|
168
|
+
workLineStable: input.workLineStable,
|
|
169
|
+
workLineTarget: target,
|
|
170
|
+
refreshArgv: input.refreshArgv,
|
|
171
|
+
timeoutMs: input.timeoutMs,
|
|
172
|
+
env: input.env,
|
|
173
|
+
});
|
|
174
|
+
if (!refreshed.ok) {
|
|
175
|
+
input.journal?.append({
|
|
176
|
+
event: "refresh",
|
|
177
|
+
outcome: "failed",
|
|
178
|
+
target,
|
|
179
|
+
...(refreshed.detail === undefined ? {} : { detail: refreshed.detail }),
|
|
180
|
+
});
|
|
181
|
+
input.trace?.(`work line cannot fast-forward onto ${target}, so nothing started. ${refreshed.detail ?? ""}`);
|
|
182
|
+
return {
|
|
183
|
+
ok: false,
|
|
184
|
+
...(refreshed.detail === undefined ? {} : { detail: refreshed.detail }),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return { ok: true };
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
152
191
|
/**
|
|
153
192
|
* Bring the work line copy up to what the Authority holds, through the slot the
|
|
154
193
|
* Project named.
|
|
@@ -164,7 +203,12 @@ export async function refreshWorkLine(input) {
|
|
|
164
203
|
}
|
|
165
204
|
const run = await runSlot({
|
|
166
205
|
command,
|
|
167
|
-
args: [
|
|
206
|
+
args: [
|
|
207
|
+
...rest,
|
|
208
|
+
"--target",
|
|
209
|
+
input.workLineTarget,
|
|
210
|
+
...(input.workLineBase === undefined ? [] : ["--base", input.workLineBase]),
|
|
211
|
+
],
|
|
168
212
|
cwd: input.workLineStable,
|
|
169
213
|
timeoutMs: input.timeoutMs,
|
|
170
214
|
env: { ...process.env, ...input.env },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/loop/authority.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/loop/authority.ts"],"names":[],"mappings":"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"}
|
package/dist/loop/context.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AuthorityPort, Conductor, ConductorMoment } from "@bluewombat/conductor";
|
|
2
|
-
import type { EventName,
|
|
1
|
+
import type { AuthorityPort, Conductor, ConductorMoment, Delivery, TransformerPort, WarmPort } from "@bluewombat/conductor";
|
|
2
|
+
import type { EventName, FeatureTrackerPort, TicketTrackerPort } from "@bluewombat/manager-kit";
|
|
3
3
|
import type { WorkLedger } from "@bluewombat/work-ledger";
|
|
4
4
|
import type { HostOptions } from "../config/types.js";
|
|
5
5
|
import type { Journal } from "./journal.js";
|
|
@@ -19,13 +19,33 @@ export type HostRunInput = {
|
|
|
19
19
|
};
|
|
20
20
|
ledger: WorkLedger;
|
|
21
21
|
conductor: Conductor;
|
|
22
|
-
|
|
22
|
+
/** Where Features are written, ordered and signalled. */
|
|
23
|
+
features: FeatureTrackerPort;
|
|
24
|
+
/** Where the Tickets of a Feature are, and the lines they land on. */
|
|
25
|
+
tickets: TicketTrackerPort;
|
|
26
|
+
/** The Transformers Conductor runs, for the one judgement Host makes itself: a Feature's line. */
|
|
27
|
+
transformers: TransformerPort;
|
|
23
28
|
journal: Journal;
|
|
24
29
|
/** Where a child's raw output was filmed, when the Project asked for it. */
|
|
25
30
|
streams?: Streams;
|
|
26
31
|
trace: Trace;
|
|
27
32
|
/** Present when the Project declared an Authority and the manager can submit. */
|
|
28
33
|
authority?: AuthorityPort;
|
|
34
|
+
/**
|
|
35
|
+
* How a Feature's line is delivered to the line it is folded into. Present
|
|
36
|
+
* with an Authority, and absent without one: nothing folds a line then.
|
|
37
|
+
*/
|
|
38
|
+
featureDelivery?: {
|
|
39
|
+
delivery: Delivery;
|
|
40
|
+
/** The copy of the line the Feature is folded into, merged into the Feature's work. */
|
|
41
|
+
targetStable: string;
|
|
42
|
+
/** Where the Feature's work is done, outside the Tickets' workspaces. */
|
|
43
|
+
workspaces: string;
|
|
44
|
+
/** Prepares that workspace the way a Ticket's is prepared, when the Project asked for it. */
|
|
45
|
+
warm?: WarmPort & {
|
|
46
|
+
durationMs: number;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
29
49
|
/**
|
|
30
50
|
* Where Conductor's moments land during a pass. A tick points it at its own
|
|
31
51
|
* report function before driving, so what is said mid-pass counts as that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/loop/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/loop/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,QAAQ,EACR,eAAe,EACf,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,yFAAyF;IACzF,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;IACxF,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,sEAAsE;IACtE,OAAO,EAAE,iBAAiB,CAAC;IAC3B,kGAAkG;IAClG,YAAY,EAAE,eAAe,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,iFAAiF;IACjF,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE;QAChB,QAAQ,EAAE,QAAQ,CAAC;QACnB,uFAAuF;QACvF,YAAY,EAAE,MAAM,CAAC;QACrB,yEAAyE;QACzE,UAAU,EAAE,MAAM,CAAC;QACnB,6FAA6F;QAC7F,IAAI,CAAC,EAAE,QAAQ,GAAG;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;IACF;;;;OAIG;IACH,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;IAChF;;;OAGG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnB,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG;IAC7C,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { ProjectRunResult } from "@bluewombat/conductor";
|
|
2
1
|
import type { HostDeliveryInput, HostRunInput } from "./context.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
/**
|
|
3
|
+
* A human unblocked an escalated Ticket: it resumes, and the signal is taken
|
|
4
|
+
* back. The sweep drives it; nothing here does.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleResume(ticket: {
|
|
7
|
+
key: string;
|
|
8
|
+
project: string;
|
|
9
|
+
}, input: HostDeliveryInput): Promise<void>;
|
|
10
|
+
export declare function handleCancel(ticket: {
|
|
11
11
|
key: string;
|
|
12
12
|
project: string;
|
|
13
13
|
}, input: HostDeliveryInput): Promise<void>;
|
|
@@ -26,13 +26,13 @@ export type ReleaseResult = {
|
|
|
26
26
|
state?: string;
|
|
27
27
|
};
|
|
28
28
|
/**
|
|
29
|
-
* Drop a held
|
|
29
|
+
* Drop a held unit by key — without waiting for the bail clock.
|
|
30
30
|
*
|
|
31
|
-
* `freed` is false when the
|
|
32
|
-
* held). Refused past `
|
|
33
|
-
*
|
|
31
|
+
* `freed` is false when the Ticket was already free (running with no unit
|
|
32
|
+
* held). Refused past `running`: those states hold no unit, or are past the
|
|
33
|
+
* point a local release can undo.
|
|
34
34
|
*/
|
|
35
|
-
export declare function
|
|
36
|
-
/** Abandon one
|
|
37
|
-
export declare function
|
|
35
|
+
export declare function releaseTicket(input: HostRunInput, key: string): Promise<ReleaseResult>;
|
|
36
|
+
/** Abandon one Ticket by key — the same path a `cancel` delivery takes. */
|
|
37
|
+
export declare function cancelTicket(input: HostRunInput, key: string): Promise<CancelResult>;
|
|
38
38
|
//# sourceMappingURL=deliveries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliveries.d.ts","sourceRoot":"","sources":["../../src/loop/deliveries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"deliveries.d.ts","sourceRoot":"","sources":["../../src/loop/deliveries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGpE;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACxC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACxC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,WAAW,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,MAAM,CAAC;CACzE,CAAC;AAEN,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5B;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,WAAW,GAAG,oBAAoB,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAe5F;AAED,2EAA2E;AAC3E,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkB1F"}
|
package/dist/loop/deliveries.js
CHANGED
|
@@ -1,160 +1,34 @@
|
|
|
1
|
-
import { driveUntilBlocked } from "./drive.js";
|
|
2
1
|
import { pushReport, resumePointOf } from "./report.js";
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The ledger still records a *new* fingerprint as pending_fingerprint; Host
|
|
7
|
-
* does not admit here, so an echo of Submitted cannot look like one.
|
|
3
|
+
* A human unblocked an escalated Ticket: it resumes, and the signal is taken
|
|
4
|
+
* back. The sweep drives it; nothing here does.
|
|
8
5
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"running",
|
|
12
|
-
"escalated",
|
|
13
|
-
"integrating",
|
|
14
|
-
"submitted",
|
|
15
|
-
"merging",
|
|
16
|
-
"done",
|
|
17
|
-
"cancelled",
|
|
18
|
-
]);
|
|
19
|
-
export async function handleDelivery(input) {
|
|
20
|
-
const adapted = await input.manager.adapt(input.payload);
|
|
21
|
-
switch (adapted.outcome) {
|
|
22
|
-
case "unavailable":
|
|
23
|
-
case "interrupted":
|
|
24
|
-
return { advance: false };
|
|
25
|
-
case "invalid": {
|
|
26
|
-
// Telling the tracker writes to it, and that write delivers the same
|
|
27
|
-
// intention again. What a human wrote has not changed: said once.
|
|
28
|
-
const before = await input.ledger.get(adapted.key);
|
|
29
|
-
if (before.ok &&
|
|
30
|
-
before.aggregate.state === "invalid" &&
|
|
31
|
-
before.aggregate.intention.fingerprint === adapted.fingerprint) {
|
|
32
|
-
input.journal.append({ event: "skipped", key: adapted.key, state: "invalid" });
|
|
33
|
-
return { advance: true };
|
|
34
|
-
}
|
|
35
|
-
await input.ledger.recordInvalid({
|
|
36
|
-
key: adapted.key,
|
|
37
|
-
project: adapted.project,
|
|
38
|
-
code: adapted.invalid.code,
|
|
39
|
-
reason: adapted.invalid.reason,
|
|
40
|
-
fingerprint: adapted.fingerprint,
|
|
41
|
-
});
|
|
42
|
-
input.journal.append({
|
|
43
|
-
event: "invalid",
|
|
44
|
-
key: adapted.key,
|
|
45
|
-
reason: adapted.invalid.reason,
|
|
46
|
-
});
|
|
47
|
-
await pushReport(input, {
|
|
48
|
-
event: "invalid",
|
|
49
|
-
key: adapted.key,
|
|
50
|
-
project: adapted.project,
|
|
51
|
-
// One per intention as written: an edit is a new fingerprint and is said again.
|
|
52
|
-
eventId: `${adapted.key}:invalid:${adapted.fingerprint}`,
|
|
53
|
-
fields: { reason: adapted.invalid.reason },
|
|
54
|
-
});
|
|
55
|
-
return { advance: true };
|
|
56
|
-
}
|
|
57
|
-
case "converted":
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
const feature = adapted.feature;
|
|
61
|
-
// Poll snapshots have no labeled edge: a ready signal on an escalated upsert
|
|
62
|
-
// is the same instruction as an explicit ready intent.
|
|
63
|
-
if (feature.intent === "upsert" && input.manager.signalsReady?.(input.payload) === true) {
|
|
64
|
-
const before = await input.ledger.get(feature.key);
|
|
65
|
-
if (before.ok && before.aggregate.state === "escalated") {
|
|
66
|
-
return await handleReady(feature, input);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
switch (feature.intent) {
|
|
70
|
-
case "ready":
|
|
71
|
-
return await handleReady(feature, input);
|
|
72
|
-
case "cancel":
|
|
73
|
-
await handleCancel(feature, input);
|
|
74
|
-
return { advance: true };
|
|
75
|
-
case "upsert":
|
|
76
|
-
return await handleUpsert(feature, input);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
async function handleUpsert(feature, input) {
|
|
80
|
-
const admission = toAdmission(feature);
|
|
81
|
-
if (admission === undefined) {
|
|
82
|
-
return { advance: true };
|
|
83
|
-
}
|
|
84
|
-
const before = await input.ledger.get(admission.key);
|
|
85
|
-
if (before.ok && IN_FLIGHT_OR_TERMINAL.has(before.aggregate.state)) {
|
|
86
|
-
input.journal.append({
|
|
87
|
-
event: "skipped",
|
|
88
|
-
key: admission.key,
|
|
89
|
-
state: before.aggregate.state,
|
|
90
|
-
});
|
|
91
|
-
return { advance: true };
|
|
92
|
-
}
|
|
93
|
-
const admitted = await input.ledger.admit(admission);
|
|
94
|
-
if (!admitted.ok) {
|
|
95
|
-
if (admitted.code === "too-late" || admitted.code === "point-of-no-return") {
|
|
96
|
-
await pushReport(input, {
|
|
97
|
-
event: "reject_late",
|
|
98
|
-
key: admission.key,
|
|
99
|
-
project: admission.project,
|
|
100
|
-
// One per intention: the same edit delivered again is the echo of
|
|
101
|
-
// this report, not another edit.
|
|
102
|
-
eventId: `${admission.key}:reject_late:${admission.fingerprint}`,
|
|
103
|
-
fields: { reason: `Admission refused: ${admitted.code}` },
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return { advance: true };
|
|
107
|
-
}
|
|
108
|
-
if (!before.ok || before.aggregate.state === "invalid") {
|
|
109
|
-
input.journal.append({ event: "admitted", key: admission.key, project: admission.project });
|
|
110
|
-
await pushReport(input, {
|
|
111
|
-
event: "accepted",
|
|
112
|
-
key: admission.key,
|
|
113
|
-
project: admission.project,
|
|
114
|
-
// One per intention as written, like `invalid`: a corrected issue is accepted again.
|
|
115
|
-
eventId: `${admission.key}:accepted:${admission.fingerprint}`,
|
|
116
|
-
fields: { priority: admission.priority },
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
const run = await driveUntilBlocked(input, admission.project, admission.key);
|
|
120
|
-
if (run === undefined) {
|
|
121
|
-
// Frozen Project: do not mark it driven, so a later delivery in this pass
|
|
122
|
-
// (a cancel, a ready) can free it and the sweep can start the queue.
|
|
123
|
-
return { advance: true };
|
|
124
|
-
}
|
|
125
|
-
return { advance: true, run, project: admission.project };
|
|
126
|
-
}
|
|
127
|
-
async function handleReady(feature, input) {
|
|
128
|
-
const before = await input.ledger.get(feature.key);
|
|
6
|
+
export async function handleResume(ticket, input) {
|
|
7
|
+
const before = await input.ledger.get(ticket.key);
|
|
129
8
|
if (!before.ok || before.aggregate.state !== "escalated") {
|
|
130
|
-
return
|
|
9
|
+
return;
|
|
131
10
|
}
|
|
132
11
|
const resumePoint = resumePointOf(before.aggregate);
|
|
133
|
-
const
|
|
134
|
-
if (!
|
|
135
|
-
return
|
|
12
|
+
const taken = await input.ledger.resumeTicket(ticket.key);
|
|
13
|
+
if (!taken.ok) {
|
|
14
|
+
return;
|
|
136
15
|
}
|
|
137
16
|
// The signal is an instruction, not a state: left where it is, it resumes the
|
|
138
|
-
//
|
|
139
|
-
await input.
|
|
17
|
+
// ticket again on every pass and an escalation never freezes anything.
|
|
18
|
+
await input.tickets.clearResume?.(ticket.key);
|
|
140
19
|
// The ledger counts the rounds; this resume is the latest one.
|
|
141
|
-
const resumed = await input.ledger.get(
|
|
142
|
-
const round = resumed.ok ?
|
|
20
|
+
const resumed = await input.ledger.get(ticket.key);
|
|
21
|
+
const round = resumed.ok ? resumed.aggregate.resumes : 0;
|
|
143
22
|
await pushReport(input, {
|
|
144
23
|
event: "resumed",
|
|
145
|
-
key:
|
|
146
|
-
project:
|
|
147
|
-
eventId: `${
|
|
24
|
+
key: ticket.key,
|
|
25
|
+
project: ticket.project,
|
|
26
|
+
eventId: `${ticket.key}:resumed:${round}`,
|
|
148
27
|
fields: { resume_point: resumePoint },
|
|
149
28
|
});
|
|
150
|
-
const run = await driveUntilBlocked(input, feature.project, feature.key);
|
|
151
|
-
if (run === undefined) {
|
|
152
|
-
return { advance: true };
|
|
153
|
-
}
|
|
154
|
-
return { advance: true, run, project: feature.project };
|
|
155
29
|
}
|
|
156
|
-
export async function handleCancel(
|
|
157
|
-
const before = await input.ledger.get(
|
|
30
|
+
export async function handleCancel(ticket, input) {
|
|
31
|
+
const before = await input.ledger.get(ticket.key);
|
|
158
32
|
if (!before.ok) {
|
|
159
33
|
return;
|
|
160
34
|
}
|
|
@@ -165,20 +39,20 @@ export async function handleCancel(feature, input) {
|
|
|
165
39
|
return;
|
|
166
40
|
}
|
|
167
41
|
if (state === "done") {
|
|
168
|
-
// A finished
|
|
42
|
+
// A finished ticket's issue closing is the tracker agreeing, not a
|
|
169
43
|
// cancel arriving late — the Submission itself asked for that close.
|
|
170
|
-
input.journal.append({ event: "skipped", key:
|
|
44
|
+
input.journal.append({ event: "skipped", key: ticket.key, state });
|
|
171
45
|
return;
|
|
172
46
|
}
|
|
173
|
-
const cancelled = await input.conductor.cancel(
|
|
47
|
+
const cancelled = await input.conductor.cancel(ticket.key);
|
|
174
48
|
if (!cancelled.ok) {
|
|
175
49
|
if (cancelled.code === "point-of-no-return") {
|
|
176
50
|
await pushReport(input, {
|
|
177
51
|
event: "reject_late",
|
|
178
|
-
key:
|
|
179
|
-
project:
|
|
52
|
+
key: ticket.key,
|
|
53
|
+
project: ticket.project,
|
|
180
54
|
// A closed issue stays closed: every later delivery is the same cancel.
|
|
181
|
-
eventId: `${
|
|
55
|
+
eventId: `${ticket.key}:reject_late:cancel`,
|
|
182
56
|
fields: { reason: "Cancel arrived after the point of no return." },
|
|
183
57
|
});
|
|
184
58
|
}
|
|
@@ -186,29 +60,27 @@ export async function handleCancel(feature, input) {
|
|
|
186
60
|
}
|
|
187
61
|
await pushReport(input, {
|
|
188
62
|
event: "cancelled",
|
|
189
|
-
key:
|
|
190
|
-
project:
|
|
191
|
-
// A
|
|
192
|
-
eventId: `${
|
|
63
|
+
key: ticket.key,
|
|
64
|
+
project: ticket.project,
|
|
65
|
+
// A Ticket is cancelled once: the ledger refuses a second cancel and never re-admits the key.
|
|
66
|
+
eventId: `${ticket.key}:cancelled`,
|
|
193
67
|
fields: { state },
|
|
194
68
|
});
|
|
195
69
|
}
|
|
196
70
|
/**
|
|
197
|
-
* Drop a held
|
|
71
|
+
* Drop a held unit by key — without waiting for the bail clock.
|
|
198
72
|
*
|
|
199
|
-
* `freed` is false when the
|
|
200
|
-
* held). Refused past `
|
|
201
|
-
*
|
|
73
|
+
* `freed` is false when the Ticket was already free (running with no unit
|
|
74
|
+
* held). Refused past `running`: those states hold no unit, or are past the
|
|
75
|
+
* point a local release can undo.
|
|
202
76
|
*/
|
|
203
|
-
export async function
|
|
77
|
+
export async function releaseTicket(input, key) {
|
|
204
78
|
const got = await input.ledger.get(key);
|
|
205
79
|
if (!got.ok) {
|
|
206
80
|
return { ok: false, code: "not-found" };
|
|
207
81
|
}
|
|
208
82
|
const { aggregate } = got;
|
|
209
|
-
const held = aggregate.state === "
|
|
210
|
-
(aggregate.state === "running" &&
|
|
211
|
-
(aggregate.plan?.subtasks.some((subtask) => subtask.state === "running") ?? false));
|
|
83
|
+
const held = aggregate.state === "running" && aggregate.bail !== undefined;
|
|
212
84
|
const released = await input.conductor.release(key);
|
|
213
85
|
if (!released.ok) {
|
|
214
86
|
if (released.code === "not-found") {
|
|
@@ -218,8 +90,8 @@ export async function releaseFeature(input, key) {
|
|
|
218
90
|
}
|
|
219
91
|
return { ok: true, freed: held };
|
|
220
92
|
}
|
|
221
|
-
/** Abandon one
|
|
222
|
-
export async function
|
|
93
|
+
/** Abandon one Ticket by key — the same path a `cancel` delivery takes. */
|
|
94
|
+
export async function cancelTicket(input, key) {
|
|
223
95
|
const got = await input.ledger.get(key);
|
|
224
96
|
if (!got.ok) {
|
|
225
97
|
return { ok: false, code: "not-found" };
|
|
@@ -238,28 +110,4 @@ export async function cancelFeature(input, key) {
|
|
|
238
110
|
}
|
|
239
111
|
return { ok: false, code: "point-of-no-return" };
|
|
240
112
|
}
|
|
241
|
-
function toAdmission(feature) {
|
|
242
|
-
if (feature.intent !== "upsert") {
|
|
243
|
-
return undefined;
|
|
244
|
-
}
|
|
245
|
-
if (feature.intention === undefined) {
|
|
246
|
-
return undefined;
|
|
247
|
-
}
|
|
248
|
-
const admission = {
|
|
249
|
-
key: feature.key,
|
|
250
|
-
project: feature.project,
|
|
251
|
-
fingerprint: feature.fingerprint,
|
|
252
|
-
priority: feature.priority,
|
|
253
|
-
intention: feature.intention,
|
|
254
|
-
manager: feature.manager,
|
|
255
|
-
external_id: feature.external_id,
|
|
256
|
-
};
|
|
257
|
-
if (feature.title !== undefined) {
|
|
258
|
-
admission.title = feature.title;
|
|
259
|
-
}
|
|
260
|
-
if (feature.source !== undefined) {
|
|
261
|
-
admission.source = feature.source;
|
|
262
|
-
}
|
|
263
|
-
return admission;
|
|
264
|
-
}
|
|
265
113
|
//# sourceMappingURL=deliveries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/loop/deliveries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/loop/deliveries.ts"],"names":[],"mappings":"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"}
|