@bluewombat/manager-fake 0.1.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 +58 -0
- package/SPECS.md +65 -0
- package/dist/adapter/fetch/run-fetch.d.ts +24 -0
- package/dist/adapter/fetch/run-fetch.d.ts.map +1 -0
- package/dist/adapter/fetch/run-fetch.js +119 -0
- package/dist/adapter/fetch/run-fetch.js.map +1 -0
- package/dist/adapter/normalize/fingerprint.d.ts +8 -0
- package/dist/adapter/normalize/fingerprint.d.ts.map +1 -0
- package/dist/adapter/normalize/fingerprint.js +26 -0
- package/dist/adapter/normalize/fingerprint.js.map +1 -0
- package/dist/adapter/normalize/normalize.d.ts +17 -0
- package/dist/adapter/normalize/normalize.d.ts.map +1 -0
- package/dist/adapter/normalize/normalize.js +199 -0
- package/dist/adapter/normalize/normalize.js.map +1 -0
- package/dist/adapter/progress/emit.d.ts +3 -0
- package/dist/adapter/progress/emit.d.ts.map +1 -0
- package/dist/adapter/progress/emit.js +6 -0
- package/dist/adapter/progress/emit.js.map +1 -0
- package/dist/adapter/raw/parse-raw.d.ts +14 -0
- package/dist/adapter/raw/parse-raw.d.ts.map +1 -0
- package/dist/adapter/raw/parse-raw.js +47 -0
- package/dist/adapter/raw/parse-raw.js.map +1 -0
- package/dist/adapter/run/run-adapter.d.ts +25 -0
- package/dist/adapter/run/run-adapter.d.ts.map +1 -0
- package/dist/adapter/run/run-adapter.js +125 -0
- package/dist/adapter/run/run-adapter.js.map +1 -0
- package/dist/adapter/types.d.ts +51 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +3 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/emitter/event/field-matrix.d.ts +29 -0
- package/dist/emitter/event/field-matrix.d.ts.map +1 -0
- package/dist/emitter/event/field-matrix.js +93 -0
- package/dist/emitter/event/field-matrix.js.map +1 -0
- package/dist/emitter/progress/emit.d.ts +3 -0
- package/dist/emitter/progress/emit.d.ts.map +1 -0
- package/dist/emitter/progress/emit.js +6 -0
- package/dist/emitter/progress/emit.js.map +1 -0
- package/dist/emitter/render/render-event.d.ts +14 -0
- package/dist/emitter/render/render-event.d.ts.map +1 -0
- package/dist/emitter/render/render-event.js +116 -0
- package/dist/emitter/render/render-event.js.map +1 -0
- package/dist/emitter/render/truncate.d.ts +9 -0
- package/dist/emitter/render/truncate.d.ts.map +1 -0
- package/dist/emitter/render/truncate.js +10 -0
- package/dist/emitter/render/truncate.js.map +1 -0
- package/dist/emitter/run/run-emitter.d.ts +21 -0
- package/dist/emitter/run/run-emitter.d.ts.map +1 -0
- package/dist/emitter/run/run-emitter.js +89 -0
- package/dist/emitter/run/run-emitter.js.map +1 -0
- package/dist/emitter/thread/slug.d.ts +7 -0
- package/dist/emitter/thread/slug.d.ts.map +1 -0
- package/dist/emitter/thread/slug.js +18 -0
- package/dist/emitter/thread/slug.js.map +1 -0
- package/dist/emitter/thread/thread.d.ts +32 -0
- package/dist/emitter/thread/thread.d.ts.map +1 -0
- package/dist/emitter/thread/thread.js +58 -0
- package/dist/emitter/thread/thread.js.map +1 -0
- package/dist/emitter/types.d.ts +45 -0
- package/dist/emitter/types.d.ts.map +1 -0
- package/dist/emitter/types.js +3 -0
- package/dist/emitter/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/listener/delivery/run-hook.d.ts +8 -0
- package/dist/listener/delivery/run-hook.d.ts.map +1 -0
- package/dist/listener/delivery/run-hook.js +50 -0
- package/dist/listener/delivery/run-hook.js.map +1 -0
- package/dist/listener/progress/emit.d.ts +3 -0
- package/dist/listener/progress/emit.d.ts.map +1 -0
- package/dist/listener/progress/emit.js +6 -0
- package/dist/listener/progress/emit.js.map +1 -0
- package/dist/listener/run/run-listener.d.ts +31 -0
- package/dist/listener/run/run-listener.d.ts.map +1 -0
- package/dist/listener/run/run-listener.js +173 -0
- package/dist/listener/run/run-listener.js.map +1 -0
- package/dist/listener/source/list-source.d.ts +13 -0
- package/dist/listener/source/list-source.d.ts.map +1 -0
- package/dist/listener/source/list-source.js +35 -0
- package/dist/listener/source/list-source.js.map +1 -0
- package/dist/listener/source/read-event.d.ts +7 -0
- package/dist/listener/source/read-event.d.ts.map +1 -0
- package/dist/listener/source/read-event.js +47 -0
- package/dist/listener/source/read-event.js.map +1 -0
- package/dist/listener/source/select-events.d.ts +13 -0
- package/dist/listener/source/select-events.d.ts.map +1 -0
- package/dist/listener/source/select-events.js +23 -0
- package/dist/listener/source/select-events.js.map +1 -0
- package/dist/listener/types.d.ts +42 -0
- package/dist/listener/types.d.ts.map +1 -0
- package/dist/listener/types.js +3 -0
- package/dist/listener/types.js.map +1 -0
- package/dist/manager.d.ts +17 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +114 -0
- package/dist/manager.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ProgressWriter } from "../progress/emit.js";
|
|
2
|
+
import type { FeatureStandard, Invalid, Invocation, RunOutcome } from "../types.js";
|
|
3
|
+
export type RunResult = {
|
|
4
|
+
outcome: RunOutcome;
|
|
5
|
+
feature?: FeatureStandard;
|
|
6
|
+
invalid?: Invalid;
|
|
7
|
+
detail?: string;
|
|
8
|
+
exitCode: number;
|
|
9
|
+
};
|
|
10
|
+
export type RunOptions = {
|
|
11
|
+
invocation: Invocation;
|
|
12
|
+
/** The raw intention; the CLI reads it from --raw or stdin. */
|
|
13
|
+
raw: string;
|
|
14
|
+
write?: ProgressWriter;
|
|
15
|
+
now?: () => number;
|
|
16
|
+
interruptFlag?: {
|
|
17
|
+
interrupted: boolean;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare function invalidInvocationResult(write: ProgressWriter, reason: string): RunResult;
|
|
21
|
+
/**
|
|
22
|
+
* Run one FeatureAdapter invocation to a run outcome.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runAdapter(options: RunOptions): Promise<RunResult>;
|
|
25
|
+
//# sourceMappingURL=run-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapter/run/run-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AAiBF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAOxF;AAmBD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA4FxE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { runFetch } from "../fetch/run-fetch.js";
|
|
2
|
+
import { normalize } from "../normalize/normalize.js";
|
|
3
|
+
import { parseRaw } from "../raw/parse-raw.js";
|
|
4
|
+
function exitCodeFor(outcome) {
|
|
5
|
+
switch (outcome) {
|
|
6
|
+
case "converted":
|
|
7
|
+
return 0;
|
|
8
|
+
case "invalid":
|
|
9
|
+
return 1;
|
|
10
|
+
case "invalid-invocation":
|
|
11
|
+
return 2;
|
|
12
|
+
case "unavailable":
|
|
13
|
+
return 3;
|
|
14
|
+
case "interrupted":
|
|
15
|
+
return 130;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function invalidInvocationResult(write, reason) {
|
|
19
|
+
write({ event: "result", outcome: "invalid-invocation", detail: reason });
|
|
20
|
+
return {
|
|
21
|
+
outcome: "invalid-invocation",
|
|
22
|
+
detail: reason,
|
|
23
|
+
exitCode: exitCodeFor("invalid-invocation"),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** The raw `id`, as written, for the Fetch argv. */
|
|
27
|
+
function rawIdArgument(raw) {
|
|
28
|
+
const value = raw.id;
|
|
29
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function rawKindArgument(raw) {
|
|
38
|
+
const value = raw.kind;
|
|
39
|
+
return typeof value === "string" && value.trim().length > 0 ? value : "create";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Run one FeatureAdapter invocation to a run outcome.
|
|
43
|
+
*/
|
|
44
|
+
export async function runAdapter(options) {
|
|
45
|
+
const { invocation, raw } = options;
|
|
46
|
+
const write = options.write ?? (() => { });
|
|
47
|
+
const now = options.now ?? (() => Date.now());
|
|
48
|
+
const interruptState = options.interruptFlag ?? { interrupted: false };
|
|
49
|
+
const shouldInterrupt = () => interruptState.interrupted;
|
|
50
|
+
const finishInvalid = (invalid) => {
|
|
51
|
+
write({
|
|
52
|
+
event: "result",
|
|
53
|
+
manager: invocation.manager,
|
|
54
|
+
outcome: "invalid",
|
|
55
|
+
code: invalid.code,
|
|
56
|
+
reason: invalid.reason,
|
|
57
|
+
});
|
|
58
|
+
return { outcome: "invalid", invalid, exitCode: exitCodeFor("invalid") };
|
|
59
|
+
};
|
|
60
|
+
const finishUnavailable = (detail) => {
|
|
61
|
+
write({ event: "result", manager: invocation.manager, outcome: "unavailable", detail });
|
|
62
|
+
return { outcome: "unavailable", detail, exitCode: exitCodeFor("unavailable") };
|
|
63
|
+
};
|
|
64
|
+
const finishInterrupted = () => {
|
|
65
|
+
write({ event: "result", manager: invocation.manager, outcome: "interrupted" });
|
|
66
|
+
return { outcome: "interrupted", exitCode: exitCodeFor("interrupted") };
|
|
67
|
+
};
|
|
68
|
+
if (shouldInterrupt()) {
|
|
69
|
+
return finishInterrupted();
|
|
70
|
+
}
|
|
71
|
+
const parsed = parseRaw(raw, invocation.maxRawBytes);
|
|
72
|
+
if (!parsed.ok) {
|
|
73
|
+
// No id to enrich: the Fetch is skipped entirely.
|
|
74
|
+
return finishInvalid(parsed.invalid);
|
|
75
|
+
}
|
|
76
|
+
let merged = parsed.object;
|
|
77
|
+
if (invocation.fetchArgv !== undefined) {
|
|
78
|
+
const argv = [...invocation.fetchArgv, "--manager", invocation.manager];
|
|
79
|
+
const rawId = rawIdArgument(parsed.object);
|
|
80
|
+
if (rawId !== undefined) {
|
|
81
|
+
argv.push("--id", rawId);
|
|
82
|
+
}
|
|
83
|
+
argv.push("--kind", rawKindArgument(parsed.object));
|
|
84
|
+
const fetched = await runFetch({
|
|
85
|
+
argv,
|
|
86
|
+
timeoutMs: invocation.fetchDurationMs ?? 1,
|
|
87
|
+
shouldInterrupt,
|
|
88
|
+
});
|
|
89
|
+
write({ event: "fetch-finished", manager: invocation.manager, result: fetched.kind });
|
|
90
|
+
if (fetched.kind === "interrupted") {
|
|
91
|
+
return finishInterrupted();
|
|
92
|
+
}
|
|
93
|
+
if (fetched.kind === "unavailable") {
|
|
94
|
+
return finishUnavailable(fetched.detail);
|
|
95
|
+
}
|
|
96
|
+
if (fetched.kind === "merged") {
|
|
97
|
+
// The Fetch is the base; the raw intention is the fresher of the two.
|
|
98
|
+
merged = { ...fetched.object, ...parsed.object };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (shouldInterrupt()) {
|
|
102
|
+
return finishInterrupted();
|
|
103
|
+
}
|
|
104
|
+
const normalizeOptions = {
|
|
105
|
+
manager: invocation.manager,
|
|
106
|
+
defaultPriority: invocation.defaultPriority,
|
|
107
|
+
normalizedAt: invocation.at ?? new Date(now()).toISOString(),
|
|
108
|
+
...(invocation.defaultProject !== undefined
|
|
109
|
+
? { defaultProject: invocation.defaultProject }
|
|
110
|
+
: {}),
|
|
111
|
+
};
|
|
112
|
+
const result = normalize(merged, normalizeOptions);
|
|
113
|
+
if (!result.ok) {
|
|
114
|
+
return finishInvalid(result.invalid);
|
|
115
|
+
}
|
|
116
|
+
write({
|
|
117
|
+
event: "result",
|
|
118
|
+
manager: invocation.manager,
|
|
119
|
+
key: result.feature.key,
|
|
120
|
+
outcome: "converted",
|
|
121
|
+
feature: result.feature,
|
|
122
|
+
});
|
|
123
|
+
return { outcome: "converted", feature: result.feature, exitCode: exitCodeFor("converted") };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=run-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-adapter.js","sourceRoot":"","sources":["../../../src/adapter/run/run-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Domain types owned by FeatureAdapter. Names match the Block perimeter only. */
|
|
2
|
+
export type RunOutcome = "converted" | "invalid" | "invalid-invocation" | "unavailable" | "interrupted";
|
|
3
|
+
export type Intent = "upsert" | "ready" | "cancel";
|
|
4
|
+
export type InvalidCode = "raw-too-large" | "raw-not-json" | "raw-not-object" | "unknown-kind" | "missing-id" | "missing-project" | "missing-intention" | "bad-field-type" | "bad-priority";
|
|
5
|
+
export type Invocation = {
|
|
6
|
+
manager: string;
|
|
7
|
+
/** The raw intention as one argument; absent means stdin. */
|
|
8
|
+
raw?: string;
|
|
9
|
+
defaultProject?: string;
|
|
10
|
+
defaultPriority: number;
|
|
11
|
+
maxRawBytes: number;
|
|
12
|
+
fetchArgv?: string[];
|
|
13
|
+
fetchDurationMs?: number;
|
|
14
|
+
/** Value stamped as normalized_at; absent means the current time. */
|
|
15
|
+
at?: string;
|
|
16
|
+
};
|
|
17
|
+
export type ParseResult = {
|
|
18
|
+
ok: true;
|
|
19
|
+
invocation: Invocation;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
reason: string;
|
|
23
|
+
};
|
|
24
|
+
export type FeatureStandard = {
|
|
25
|
+
key: string;
|
|
26
|
+
manager: string;
|
|
27
|
+
external_id: string;
|
|
28
|
+
intent: Intent;
|
|
29
|
+
project: string;
|
|
30
|
+
title?: string;
|
|
31
|
+
intention?: string;
|
|
32
|
+
priority: number;
|
|
33
|
+
source?: {
|
|
34
|
+
ref?: string;
|
|
35
|
+
revision?: string;
|
|
36
|
+
};
|
|
37
|
+
fingerprint: string;
|
|
38
|
+
normalized_at: string;
|
|
39
|
+
};
|
|
40
|
+
export type Invalid = {
|
|
41
|
+
code: InvalidCode;
|
|
42
|
+
reason: string;
|
|
43
|
+
};
|
|
44
|
+
export type NormalizeResult = {
|
|
45
|
+
ok: true;
|
|
46
|
+
feature: FeatureStandard;
|
|
47
|
+
} | {
|
|
48
|
+
ok: false;
|
|
49
|
+
invalid: Invalid;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnD,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA,kFAAkF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { EventFields, EventName } from "../types.js";
|
|
2
|
+
export type FieldName = keyof EventFields;
|
|
3
|
+
/** Column order of the matrix: it also orders a rendered section. */
|
|
4
|
+
export declare const FIELD_ORDER: FieldName[];
|
|
5
|
+
export declare const EVENT_NAMES: EventName[];
|
|
6
|
+
type Rule = {
|
|
7
|
+
required: FieldName[];
|
|
8
|
+
optional: FieldName[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* What each Event accepts. A field outside its row is refused, not dropped:
|
|
12
|
+
* a caller setting `reference` on `planned` has confused two Events, and a
|
|
13
|
+
* report that hides that is worse than a refusal.
|
|
14
|
+
*/
|
|
15
|
+
export declare const FIELD_MATRIX: Record<EventName, Rule>;
|
|
16
|
+
export type ValidationResult = {
|
|
17
|
+
ok: true;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
reason: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Check one Event's fields against the matrix, plus the two rules on top of it.
|
|
24
|
+
* Pure: no directory, no clock.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateFields(event: EventName, fields: EventFields): ValidationResult;
|
|
27
|
+
export declare function flagOf(field: FieldName): string;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=field-matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-matrix.d.ts","sourceRoot":"","sources":["../../../src/emitter/event/field-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC;AAE1C,qEAAqE;AACrE,eAAO,MAAM,WAAW,EAAE,SAAS,EAclC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,SAAS,EAYlC,CAAC;AAEF,KAAK,IAAI,GAAG;IAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAyBhD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,gBAAgB,CA4BtF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** Column order of the matrix: it also orders a rendered section. */
|
|
2
|
+
export const FIELD_ORDER = [
|
|
3
|
+
"summary",
|
|
4
|
+
"reason",
|
|
5
|
+
"stage",
|
|
6
|
+
"trace",
|
|
7
|
+
"counters",
|
|
8
|
+
"plan",
|
|
9
|
+
"priority",
|
|
10
|
+
"unit",
|
|
11
|
+
"remaining",
|
|
12
|
+
"state",
|
|
13
|
+
"resume_point",
|
|
14
|
+
"reference",
|
|
15
|
+
"workspace_ref",
|
|
16
|
+
];
|
|
17
|
+
export const EVENT_NAMES = [
|
|
18
|
+
"invalid",
|
|
19
|
+
"accepted",
|
|
20
|
+
"planned",
|
|
21
|
+
"progress",
|
|
22
|
+
"escalated",
|
|
23
|
+
"escalation_reminder",
|
|
24
|
+
"resumed",
|
|
25
|
+
"submitted",
|
|
26
|
+
"done",
|
|
27
|
+
"cancelled",
|
|
28
|
+
"reject_late",
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* What each Event accepts. A field outside its row is refused, not dropped:
|
|
32
|
+
* a caller setting `reference` on `planned` has confused two Events, and a
|
|
33
|
+
* report that hides that is worse than a refusal.
|
|
34
|
+
*/
|
|
35
|
+
export const FIELD_MATRIX = {
|
|
36
|
+
invalid: { required: ["reason"], optional: [] },
|
|
37
|
+
accepted: { required: ["priority"], optional: [] },
|
|
38
|
+
planned: { required: ["plan"], optional: [] },
|
|
39
|
+
// Progress is one sentence a person reads — a Subtask landed, a refusal
|
|
40
|
+
// being repaired — and whatever detail the caller wants to leave under it.
|
|
41
|
+
progress: {
|
|
42
|
+
required: ["summary"],
|
|
43
|
+
optional: ["unit", "remaining", "state", "stage", "reason", "trace", "counters"],
|
|
44
|
+
},
|
|
45
|
+
escalated: {
|
|
46
|
+
required: ["reason", "stage"],
|
|
47
|
+
optional: ["trace", "counters", "unit"],
|
|
48
|
+
},
|
|
49
|
+
escalation_reminder: {
|
|
50
|
+
required: ["reason", "stage"],
|
|
51
|
+
optional: ["trace", "counters", "unit"],
|
|
52
|
+
},
|
|
53
|
+
resumed: { required: ["resume_point"], optional: ["reason"] },
|
|
54
|
+
// The work is in front of the Authority; the reference is where it can be seen.
|
|
55
|
+
submitted: { required: ["reference"], optional: [] },
|
|
56
|
+
// A local fold names nothing a reader could open; only an Authority's fold has a reference.
|
|
57
|
+
done: { required: [], optional: ["reference", "integration_reference"] },
|
|
58
|
+
cancelled: { required: ["state"], optional: ["reason", "workspace_ref"] },
|
|
59
|
+
reject_late: { required: ["reason"], optional: ["state", "reference"] },
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Check one Event's fields against the matrix, plus the two rules on top of it.
|
|
63
|
+
* Pure: no directory, no clock.
|
|
64
|
+
*/
|
|
65
|
+
export function validateFields(event, fields) {
|
|
66
|
+
const rule = FIELD_MATRIX[event];
|
|
67
|
+
const allowed = new Set([...rule.required, ...rule.optional]);
|
|
68
|
+
const given = FIELD_ORDER.filter((field) => fields[field] !== undefined);
|
|
69
|
+
const refused = given.filter((field) => !allowed.has(field));
|
|
70
|
+
if (refused.length > 0) {
|
|
71
|
+
return {
|
|
72
|
+
ok: false,
|
|
73
|
+
reason: `Event "${event}" does not accept: ${refused.map(flagOf).join(", ")}.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const missing = rule.required.filter((field) => fields[field] === undefined);
|
|
77
|
+
if (missing.length > 0) {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
reason: `Event "${event}" requires: ${missing.map(flagOf).join(", ")}.`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// An escalation about work that ran, without what it left behind, forces a
|
|
84
|
+
// human to reproduce the failure before they can understand it.
|
|
85
|
+
if (fields.stage === "unit" && fields.trace === undefined) {
|
|
86
|
+
return { ok: false, reason: 'Stage "unit" requires --trace or --trace-file.' };
|
|
87
|
+
}
|
|
88
|
+
return { ok: true };
|
|
89
|
+
}
|
|
90
|
+
export function flagOf(field) {
|
|
91
|
+
return `--${field.replace(/_/g, "-")}`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=field-matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-matrix.js","sourceRoot":"","sources":["../../../src/emitter/event/field-matrix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emitter/progress/emit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAErE,wBAAgB,0BAA0B,IAAI,cAAc,CAI3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/emitter/progress/emit.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EventRecord, Invocation } from "../types.js";
|
|
2
|
+
export type Rendered = {
|
|
3
|
+
record: EventRecord;
|
|
4
|
+
/** One line for the machine surface, newline included. */
|
|
5
|
+
line: string;
|
|
6
|
+
/** One section for the human surface, trailing newline included. */
|
|
7
|
+
section: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Turn one invocation into the exact bytes both Thread files receive.
|
|
11
|
+
* Pure: --dry-run renders through this same function, so a preview cannot lie.
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderEvent(invocation: Invocation): Rendered;
|
|
14
|
+
//# sourceMappingURL=render-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-event.d.ts","sourceRoot":"","sources":["../../../src/emitter/render/render-event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASxE,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CA2B5D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { FIELD_ORDER } from "../event/field-matrix.js";
|
|
2
|
+
import { truncateText } from "./truncate.js";
|
|
3
|
+
/** Free-text fields the report ceiling applies to. */
|
|
4
|
+
const BOUNDED_FIELDS = ["reason", "plan", "trace"];
|
|
5
|
+
/** Fields rendered as a fenced block rather than a bullet. */
|
|
6
|
+
const BLOCK_FIELDS = ["trace", "plan"];
|
|
7
|
+
/**
|
|
8
|
+
* Turn one invocation into the exact bytes both Thread files receive.
|
|
9
|
+
* Pure: --dry-run renders through this same function, so a preview cannot lie.
|
|
10
|
+
*/
|
|
11
|
+
export function renderEvent(invocation) {
|
|
12
|
+
const bounded = applyCeiling(invocation.fields, invocation.maxReportChars);
|
|
13
|
+
const record = {
|
|
14
|
+
event: invocation.event,
|
|
15
|
+
key: invocation.key,
|
|
16
|
+
project: invocation.project,
|
|
17
|
+
at: invocation.at,
|
|
18
|
+
};
|
|
19
|
+
if (invocation.eventId !== undefined) {
|
|
20
|
+
record.event_id = invocation.eventId;
|
|
21
|
+
}
|
|
22
|
+
for (const field of FIELD_ORDER) {
|
|
23
|
+
const value = bounded.fields[field];
|
|
24
|
+
if (value !== undefined) {
|
|
25
|
+
record[field] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (bounded.truncated.length > 0) {
|
|
29
|
+
record.truncated = bounded.truncated;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
record,
|
|
33
|
+
line: `${JSON.stringify(record)}\n`,
|
|
34
|
+
section: renderSection(invocation, bounded.fields),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function applyCeiling(fields, maxChars) {
|
|
38
|
+
const out = { ...fields };
|
|
39
|
+
const truncated = [];
|
|
40
|
+
for (const field of BOUNDED_FIELDS) {
|
|
41
|
+
const value = out[field];
|
|
42
|
+
if (typeof value !== "string") {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const cut = truncateText(value, maxChars);
|
|
46
|
+
if (cut.truncated) {
|
|
47
|
+
truncated.push(field);
|
|
48
|
+
out[field] = cut.text;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { fields: out, truncated };
|
|
52
|
+
}
|
|
53
|
+
function renderSection(invocation, fields) {
|
|
54
|
+
const lines = [
|
|
55
|
+
`## ${invocation.at} — ${invocation.event}`,
|
|
56
|
+
"",
|
|
57
|
+
`- project: ${invocation.project}`,
|
|
58
|
+
];
|
|
59
|
+
for (const field of FIELD_ORDER) {
|
|
60
|
+
if (BLOCK_FIELDS.includes(field) || field === "summary") {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const value = fields[field];
|
|
64
|
+
if (value === undefined) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
lines.push(`- ${label(field)}: ${bullet(value)}`);
|
|
68
|
+
}
|
|
69
|
+
if (typeof fields.summary === "string") {
|
|
70
|
+
lines.splice(2, 0, fields.summary, "");
|
|
71
|
+
}
|
|
72
|
+
const note = standingNote(invocation);
|
|
73
|
+
if (note !== undefined) {
|
|
74
|
+
lines.push(`- ${note}`);
|
|
75
|
+
}
|
|
76
|
+
for (const field of BLOCK_FIELDS) {
|
|
77
|
+
const value = fields[field];
|
|
78
|
+
if (typeof value !== "string") {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
lines.push("", `### ${title(field)}`, "", "```text", value, "```");
|
|
82
|
+
}
|
|
83
|
+
lines.push("");
|
|
84
|
+
return `${lines.join("\n")}\n`;
|
|
85
|
+
}
|
|
86
|
+
/** What a reader must be told about this Event beyond its fields. */
|
|
87
|
+
function standingNote(invocation) {
|
|
88
|
+
switch (invocation.event) {
|
|
89
|
+
case "escalated":
|
|
90
|
+
return "frozen: no further work starts until a human answers";
|
|
91
|
+
case "escalation_reminder":
|
|
92
|
+
return "frozen: still waiting, this is a repeat of an earlier escalation";
|
|
93
|
+
case "reject_late":
|
|
94
|
+
return "too late: this arrived after the point of no return";
|
|
95
|
+
default:
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function label(field) {
|
|
100
|
+
return field.replace(/_/g, " ");
|
|
101
|
+
}
|
|
102
|
+
function title(field) {
|
|
103
|
+
return field === "trace" ? "Trace" : "Plan";
|
|
104
|
+
}
|
|
105
|
+
function bullet(value) {
|
|
106
|
+
if (Array.isArray(value)) {
|
|
107
|
+
return value.map((entry) => String(entry)).join("; ");
|
|
108
|
+
}
|
|
109
|
+
if (value !== null && typeof value === "object") {
|
|
110
|
+
return Object.entries(value)
|
|
111
|
+
.map(([name, entry]) => `${name}=${entry}`)
|
|
112
|
+
.join(", ");
|
|
113
|
+
}
|
|
114
|
+
return String(value);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=render-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-event.js","sourceRoot":"","sources":["../../../src/emitter/render/render-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const TRUNCATION_MARKER = " [\u2026truncated]";
|
|
2
|
+
export type TruncateResult = {
|
|
3
|
+
text: string;
|
|
4
|
+
truncated: boolean;
|
|
5
|
+
};
|
|
6
|
+
/** Cut long free text, and say so: a silent cut makes a human trust a
|
|
7
|
+
* truncated diagnosis. */
|
|
8
|
+
export declare function truncateText(text: string, maxChars: number): TruncateResult;
|
|
9
|
+
//# sourceMappingURL=truncate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../src/emitter/render/truncate.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,uBAAkB,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE;2BAC2B;AAC3B,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAK3E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const TRUNCATION_MARKER = " […truncated]";
|
|
2
|
+
/** Cut long free text, and say so: a silent cut makes a human trust a
|
|
3
|
+
* truncated diagnosis. */
|
|
4
|
+
export function truncateText(text, maxChars) {
|
|
5
|
+
if (text.length <= maxChars) {
|
|
6
|
+
return { text, truncated: false };
|
|
7
|
+
}
|
|
8
|
+
return { text: `${text.slice(0, maxChars)}${TRUNCATION_MARKER}`, truncated: true };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../src/emitter/render/truncate.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAIjD;2BAC2B;AAC3B,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,QAAgB;IACzD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ProgressWriter } from "../progress/emit.js";
|
|
2
|
+
import type { Invocation, RunOutcome } from "../types.js";
|
|
3
|
+
export type RunResult = {
|
|
4
|
+
outcome: RunOutcome;
|
|
5
|
+
thread?: string;
|
|
6
|
+
detail?: string;
|
|
7
|
+
exitCode: number;
|
|
8
|
+
};
|
|
9
|
+
export type RunOptions = {
|
|
10
|
+
invocation: Invocation;
|
|
11
|
+
write?: ProgressWriter;
|
|
12
|
+
interruptFlag?: {
|
|
13
|
+
interrupted: boolean;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare function invalidInvocationResult(write: ProgressWriter, reason: string): RunResult;
|
|
17
|
+
/**
|
|
18
|
+
* Run one FeatureEmitter invocation to a run outcome.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runEmitter(options: RunOptions): RunResult;
|
|
21
|
+
//# sourceMappingURL=run-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-emitter.d.ts","sourceRoot":"","sources":["../../../src/emitter/run/run-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AAiBF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAOxF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAsEzD"}
|