@renaiss-shipflow/cli 0.12.1 → 0.15.1
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/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +3 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/escalation-format.d.ts +69 -12
- package/dist/escalation-format.d.ts.map +1 -1
- package/dist/escalation-format.js +145 -18
- package/dist/escalation-format.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkD5D"}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadConfig, saveConfig, parseBool, parseIntOr, resolveAutoIssue, resolveLiveReload, resolveRequireCi, resolveMergePolicy, resolveMaxFixAttempts, resolveWipLimit, resolveStalePrHours, resolveBugHunt, resolveBugHuntCap, resolveRequireReview, resolveSignoffOwner, } from "../config.js";
|
|
1
|
+
import { loadConfig, saveConfig, parseBool, parseIntOr, resolveAutoIssue, resolveLiveReload, resolveRequireCi, resolveMergePolicy, resolveMaxFixAttempts, resolveWipLimit, resolveStalePrHours, resolveBugHunt, resolveBugHuntCap, resolveRequireReview, resolveSignoffOwner, resolveLoopWorkerModel, } from "../config.js";
|
|
2
2
|
const MERGE_POLICIES = ["manual", "auto-on-green", "auto-timeout"];
|
|
3
3
|
const SETTINGS = [
|
|
4
4
|
{ key: "auto-issue", field: "autoIssue",
|
|
@@ -28,6 +28,8 @@ const SETTINGS = [
|
|
|
28
28
|
set: (v, c) => String((c.requireReview = parseBool(v))), effective: resolveRequireReview },
|
|
29
29
|
{ key: "signoff-owner", field: "signoffOwner",
|
|
30
30
|
set: (v, c) => (c.signoffOwner = v.trim().replace(/^@/, "")), effective: resolveSignoffOwner },
|
|
31
|
+
{ key: "loop-worker-model", field: "loopWorkerModel",
|
|
32
|
+
set: (v, c) => (c.loopWorkerModel = v.trim()), effective: resolveLoopWorkerModel },
|
|
31
33
|
];
|
|
32
34
|
const byKey = new Map(SETTINGS.map((s) => [s.key, s]));
|
|
33
35
|
const KEYS = SETTINGS.map((s) => s.key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface StoredConfig {
|
|
|
30
30
|
gitName?: string;
|
|
31
31
|
gitEmail?: string;
|
|
32
32
|
signoffOwner?: string;
|
|
33
|
+
loopWorkerModel?: string;
|
|
33
34
|
}
|
|
34
35
|
/** How far the loop may drive a PR toward merge without a human. */
|
|
35
36
|
export type MergePolicy = "manual" | "auto-on-green" | "auto-timeout";
|
|
@@ -98,6 +99,11 @@ export declare function resolveRequireReview(): boolean;
|
|
|
98
99
|
* the escalate command then falls back to the issue author). A leading @ is
|
|
99
100
|
* tolerated and stripped so both "gemscng" and "@gemscng" work. */
|
|
100
101
|
export declare function resolveSignoffOwner(): string | undefined;
|
|
102
|
+
/** Model for loop WORKER dispatches (env > config > undefined — the loop then
|
|
103
|
+
* keeps the host's default per dispatch). Freeform trimmed string; no
|
|
104
|
+
* allowlist because valid model names are host-specific. Blank values fall
|
|
105
|
+
* through, so `SHIPFLOW_LOOP_WORKER_MODEL=""` doesn't mask the stored config. */
|
|
106
|
+
export declare function resolveLoopWorkerModel(): string | undefined;
|
|
101
107
|
export declare function resolveApiUrl(flagUrl?: string): string;
|
|
102
108
|
/** JWT first, API key fallback. */
|
|
103
109
|
export declare function resolveAuthToken(): {
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA;;oBAEoB;AACpB,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;oFAGoF;AACpF,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAMD;8EAC8E;AAC9E,wBAAgB,YAAY,IAAI,MAAM,EAAE,CASvC;AAED;0EAC0E;AAC1E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAG5E;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,SAAS,CAAC,EAAE,OAAO,CAAC;IAIpB,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAIpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAG1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IAItB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA;;oBAEoB;AACpB,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;oFAGoF;AACpF,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAMD;8EAC8E;AAC9E,wBAAgB,YAAY,IAAI,MAAM,EAAE,CASvC;AAED;0EAC0E;AAC1E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAG5E;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,SAAS,CAAC,EAAE,OAAO,CAAC;IAIpB,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAIpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAG1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IAItB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,cAAc,CAAC;AAGtE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AA0BtD,eAAO,MAAM,UAAU,QAAO,YAA0D,CAAC;AACzF,eAAO,MAAM,UAAU,GAAI,GAAG,YAAY,KAAG,IAAkC,CAAC;AAChF,eAAO,MAAM,WAAW,QAAO,IAAsD,CAAC;AAGtF,eAAO,MAAM,eAAe,QAAO,iBAAiB,GAAG,IACE,CAAC;AAC1D,eAAO,MAAM,eAAe,GAAI,GAAG,iBAAiB,KAAG,IAAiC,CAAC;AACzF,eAAO,MAAM,gBAAgB,QAAO,IAAqD,CAAC;AAE1F;;0FAE0F;AAC1F,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtF,CAMA;AAGD,eAAO,MAAM,gBAAgB,QAAO,YAA4D,CAAC;AACjG,eAAO,MAAM,gBAAgB,GAAI,GAAG,YAAY,KAAG,IAAoC,CAAC;AAExF,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtE;AAID,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGxD;AAED;6EAC6E;AAC7E,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED;0CAC0C;AAC1C,wBAAgB,iBAAiB,IAAI,OAAO,GAAG,SAAS,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,WAAW,CAIhD;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,wFAAwF;AACxF,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,OAAO,CAKxC;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAED;;mEAEmE;AACnE,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAIxD;AAED;;;iFAGiF;AACjF,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAI3D;AAGD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAA;CAAE,GAAG,IAAI,CAKnF;AAED,mFAAmF;AACnF,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAGlD"}
|
package/dist/config.js
CHANGED
|
@@ -194,6 +194,16 @@ export function resolveSignoffOwner() {
|
|
|
194
194
|
const raw = env != null && env.trim() !== "" ? env : loadConfig().signoffOwner ?? "";
|
|
195
195
|
return normalizeOwner(raw);
|
|
196
196
|
}
|
|
197
|
+
/** Model for loop WORKER dispatches (env > config > undefined — the loop then
|
|
198
|
+
* keeps the host's default per dispatch). Freeform trimmed string; no
|
|
199
|
+
* allowlist because valid model names are host-specific. Blank values fall
|
|
200
|
+
* through, so `SHIPFLOW_LOOP_WORKER_MODEL=""` doesn't mask the stored config. */
|
|
201
|
+
export function resolveLoopWorkerModel() {
|
|
202
|
+
const env = process.env.SHIPFLOW_LOOP_WORKER_MODEL?.trim();
|
|
203
|
+
if (env)
|
|
204
|
+
return env;
|
|
205
|
+
return loadConfig().loopWorkerModel?.trim() || undefined;
|
|
206
|
+
}
|
|
197
207
|
// ── url + auth resolution ──
|
|
198
208
|
export function resolveApiUrl(flagUrl) {
|
|
199
209
|
return flagUrl || process.env.SHIPFLOW_API_URL || loadConfig().apiUrl || "http://localhost:8080";
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEnE;wEACwE;AACxE,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,YAAY,CAAC;AACzD,CAAC;AAED;;oBAEoB;AACpB,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;oFAGoF;AACpF,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACtE,MAAM,YAAY,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;AAEtE;8EAC8E;AAC9E,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC3E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC7E,OAAO,UAAU,CAA2B,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;AACnF,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,11 @@ export declare function bulletizeReason(reason: string): string;
|
|
|
21
21
|
export declare function enumerateReason(reason: string, marker: RegExp, // matches "(n)"/"(x)" incl. surrounding whitespace, capturing the token
|
|
22
22
|
firstMarker: string, // the token the sequence must open with ("1" / "a")
|
|
23
23
|
line: (marker: string, text: string) => string): string | null;
|
|
24
|
-
/** Why each escalation class is gated on a human. Rendered verbatim
|
|
25
|
-
*
|
|
26
|
-
* and never depends on how verbose a given reviewer subagent
|
|
27
|
-
* motivated by rental-portal#121's bare "money-write risk —
|
|
24
|
+
/** Why each escalation class is gated on a human. Rendered verbatim inside a
|
|
25
|
+
* folded "Why a human must decide — <category>" details block so the rationale
|
|
26
|
+
* is standardized and never depends on how verbose a given reviewer subagent
|
|
27
|
+
* felt (issue #58, motivated by rental-portal#121's bare "money-write risk —
|
|
28
|
+
* see the issue body"). */
|
|
28
29
|
export declare const ESCALATION_CATEGORIES: Record<string, string>;
|
|
29
30
|
export interface EscalationOptions {
|
|
30
31
|
/** One of ESCALATION_CATEGORIES — appends the standardized "why a human" rationale. */
|
|
@@ -32,15 +33,71 @@ export interface EscalationOptions {
|
|
|
32
33
|
/** GitHub login (with or without a leading @) accountable for acting on this. */
|
|
33
34
|
owner?: string;
|
|
34
35
|
}
|
|
36
|
+
/** Names the Action-needed section, tolerating LLM heading drift (emoji, case,
|
|
37
|
+
* colons, extra decoration). Single source of truth for the fold (what stays
|
|
38
|
+
* visible), the word-cap lint (which lines it applies to), and the
|
|
39
|
+
* missing-section check — sharing it means a section can never render
|
|
40
|
+
* unfolded while escaping the cap, or vice versa. */
|
|
41
|
+
export declare function isActionHeading(heading: string): boolean;
|
|
42
|
+
/** Progressive disclosure (issue #166): the on-screen comment is the banner, the
|
|
43
|
+
* owner, and the Action-needed steps — every other `###` section collapses into
|
|
44
|
+
* a closed `<details>` block, one click away. Prompt-side brevity contracts
|
|
45
|
+
* alone didn't hold (the reviewer still wrote walls of text), so the fold is
|
|
46
|
+
* enforced here where it can't drift. Sections matching "action needed" stay
|
|
47
|
+
* visible, as does any lead text before the first heading; if NO section
|
|
48
|
+
* matches, the first section stays visible so a fold can never hide the whole
|
|
49
|
+
* reason. Reasons without `###` headings pass through untouched. */
|
|
50
|
+
export declare function foldSecondarySections(reason: string): string;
|
|
35
51
|
/** Canonical GitHub login: trimmed, leading @ stripped, empty collapsed to
|
|
36
52
|
* undefined — so "@gemscng", " gemscng " and "gemscng" all render as one
|
|
37
53
|
* consistent `@gemscng` (comment body, console line, and JSON alike). */
|
|
38
54
|
export declare function normalizeOwner(raw?: string | null): string | undefined;
|
|
55
|
+
/** The visible part of the comment must read in one breath per line: any line
|
|
56
|
+
* in the Action-needed section over this many words is dense prose, not a step
|
|
57
|
+
* (the contract caps sentences at ~20 words; 30 leaves room for a code ref). */
|
|
58
|
+
export declare const ACTION_LINE_WORD_LIMIT = 30;
|
|
59
|
+
/** Lines of the Action-needed section(s) that exceed ACTION_LINE_WORD_LIMIT
|
|
60
|
+
* words. Only those sections are checked — they're the part that renders
|
|
61
|
+
* unfolded, and the fix for an overlong step is precisely to move detail into
|
|
62
|
+
* a folded section. An inline code span collapses to one word before counting:
|
|
63
|
+
* the cap measures prose, and an exact runnable command (which the contract
|
|
64
|
+
* requires for action escalations) must not blow it. Every section whose
|
|
65
|
+
* heading matches "action needed" is checked, not just the first — heading
|
|
66
|
+
* drift can produce more than one. */
|
|
67
|
+
export declare function overlongActionLines(reason: string): string[];
|
|
39
68
|
/** Deterministic quality gate on an escalation reason — pure string checks, no
|
|
40
69
|
* AI. Returns one message per problem (empty array = clean). The rules encode
|
|
41
70
|
* the loop contract: no open questions without a recommendation, no pointers
|
|
42
|
-
* out of the comment, structured reasons lead with the action
|
|
71
|
+
* out of the comment, structured reasons lead with the action, and the visible
|
|
72
|
+
* action steps stay short enough to read without effort (issue #166). */
|
|
43
73
|
export declare function lintEscalationReason(reason: string): string[];
|
|
74
|
+
export interface DecisionReply {
|
|
75
|
+
/** The escalation decision number the human answered (the `N` in `N: answer`). */
|
|
76
|
+
n: number;
|
|
77
|
+
/** The human's answer, trimmed. May itself contain colons and commas. */
|
|
78
|
+
answer: string;
|
|
79
|
+
}
|
|
80
|
+
/** Parse a human's structured per-decision reply on a `needs-human` issue into
|
|
81
|
+
* the decisions they answered (issue #60). The loop maps each answer back to the
|
|
82
|
+
* escalation's numbered decisions, so a reply like
|
|
83
|
+
*
|
|
84
|
+
* 1: frankfurter
|
|
85
|
+
* 3: me
|
|
86
|
+
*
|
|
87
|
+
* resolves decisions 1 and 3 and leaves the rest escalated (partial answers stay
|
|
88
|
+
* escalated with the remaining items). Accepted input, whitespace-tolerant throughout:
|
|
89
|
+
* - one decision per line — `N: answer`;
|
|
90
|
+
* - several on one line, comma-separated — `1: frankfurter, 3: me`;
|
|
91
|
+
* - only the FIRST colon splits the number from the answer, so an answer may
|
|
92
|
+
* itself contain colons (`1: use frankfurter: free tier` → n=1,
|
|
93
|
+
* answer="use frankfurter: free tier");
|
|
94
|
+
* - a comma only starts a new decision when a `N:` marker follows it, so an
|
|
95
|
+
* answer may contain commas (`1: A, B or C`) as long as no `N:` follows one.
|
|
96
|
+
* A line that does not START with `N:` is chatter and ignored — a non-numeric
|
|
97
|
+
* prefix ("option 1: x", "see step 2: …") is NOT a decision. No decisions → `[]`.
|
|
98
|
+
* Duplicate N → **last wins**: a later answer for the same decision overrides the
|
|
99
|
+
* earlier one, keeping the decision at its first-seen position. */
|
|
100
|
+
export declare function parseDecisionReplies(body: string): DecisionReply[];
|
|
44
101
|
export interface EscalationCommentRef {
|
|
45
102
|
id: string;
|
|
46
103
|
body: string;
|
|
@@ -53,12 +110,12 @@ export interface EscalationCommentRef {
|
|
|
53
110
|
* only ones the CLI's own account authored. */
|
|
54
111
|
export declare function findLatestEscalationComment(comments: EscalationCommentRef[]): EscalationCommentRef | null;
|
|
55
112
|
/** Renders the escalation comment the loop posts when it hands an issue to a
|
|
56
|
-
* human.
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
113
|
+
* human. What a dev sees unfolded is deliberately minimal: banner, owner, the
|
|
114
|
+
* Action-needed steps, footer. Everything explanatory — the reason's other
|
|
115
|
+
* `###` sections and the `--category` rationale — collapses into `<details>`
|
|
116
|
+
* blocks (foldSecondarySections), so readability no longer depends on how
|
|
117
|
+
* verbose the reviewer subagent felt. A plain-paragraph reason just reads as
|
|
118
|
+
* text; this adds no competing heading of its own. `owner` names the
|
|
119
|
+
* accountable human right under the banner. */
|
|
63
120
|
export declare function formatEscalationBody(reason: string, opts?: EscalationOptions): string;
|
|
64
121
|
//# sourceMappingURL=escalation-format.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-format.d.ts","sourceRoot":"","sources":["../src/escalation-format.ts"],"names":[],"mappings":"AAIA;;;;;iCAKiC;AACjC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;;;;;;;;;6EAY6E;AAC7E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAO,wEAAwE;AAC7F,WAAW,EAAE,MAAM,EAAE,oDAAoD;AACzE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7C,MAAM,GAAG,IAAI,CAaf;AAED
|
|
1
|
+
{"version":3,"file":"escalation-format.d.ts","sourceRoot":"","sources":["../src/escalation-format.ts"],"names":[],"mappings":"AAIA;;;;;iCAKiC;AACjC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;;;;;;;;;6EAY6E;AAC7E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAO,wEAAwE;AAC7F,WAAW,EAAE,MAAM,EAAE,oDAAoD;AACzE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7C,MAAM,GAAG,IAAI,CAaf;AAED;;;;4BAI4B;AAC5B,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBxD,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;sDAIsD;AACtD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;qEAOqE;AACrE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB5D;AAED;;0EAE0E;AAC1E,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED;;iFAEiF;AACjF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;uCAOuC;AACvC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED;;;;0EAI0E;AAC1E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B7D;AAED,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,CAAC,EAAE,MAAM,CAAC;IACV,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;oEAmBoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAelE;AAOD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;gDAIgD;AAChD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,GAAG,IAAI,CAOzG;AAED;;;;;;;gDAOgD;AAChD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CA4BzF"}
|
|
@@ -47,10 +47,11 @@ line) {
|
|
|
47
47
|
return null; // not a real multi-item list
|
|
48
48
|
return lead ? `${lead}\n\n${items.join("\n")}` : items.join("\n");
|
|
49
49
|
}
|
|
50
|
-
/** Why each escalation class is gated on a human. Rendered verbatim
|
|
51
|
-
*
|
|
52
|
-
* and never depends on how verbose a given reviewer subagent
|
|
53
|
-
* motivated by rental-portal#121's bare "money-write risk —
|
|
50
|
+
/** Why each escalation class is gated on a human. Rendered verbatim inside a
|
|
51
|
+
* folded "Why a human must decide — <category>" details block so the rationale
|
|
52
|
+
* is standardized and never depends on how verbose a given reviewer subagent
|
|
53
|
+
* felt (issue #58, motivated by rental-portal#121's bare "money-write risk —
|
|
54
|
+
* see the issue body"). */
|
|
54
55
|
export const ESCALATION_CATEGORIES = {
|
|
55
56
|
"money-write": "Enabling this writes real money-bearing values (prices, payouts, billing) to live systems. " +
|
|
56
57
|
"A bad value reaches customers immediately, and transactions made at a wrong value can't be " +
|
|
@@ -67,6 +68,49 @@ export const ESCALATION_CATEGORIES = {
|
|
|
67
68
|
invalid: "The issue looks invalid, duplicate, or out of scope; closing someone's issue is a judgment " +
|
|
68
69
|
"call the loop leaves to a human.",
|
|
69
70
|
};
|
|
71
|
+
/** Names the Action-needed section, tolerating LLM heading drift (emoji, case,
|
|
72
|
+
* colons, extra decoration). Single source of truth for the fold (what stays
|
|
73
|
+
* visible), the word-cap lint (which lines it applies to), and the
|
|
74
|
+
* missing-section check — sharing it means a section can never render
|
|
75
|
+
* unfolded while escaping the cap, or vice versa. */
|
|
76
|
+
export function isActionHeading(heading) {
|
|
77
|
+
return /action\s+needed/i.test(heading);
|
|
78
|
+
}
|
|
79
|
+
/** Progressive disclosure (issue #166): the on-screen comment is the banner, the
|
|
80
|
+
* owner, and the Action-needed steps — every other `###` section collapses into
|
|
81
|
+
* a closed `<details>` block, one click away. Prompt-side brevity contracts
|
|
82
|
+
* alone didn't hold (the reviewer still wrote walls of text), so the fold is
|
|
83
|
+
* enforced here where it can't drift. Sections matching "action needed" stay
|
|
84
|
+
* visible, as does any lead text before the first heading; if NO section
|
|
85
|
+
* matches, the first section stays visible so a fold can never hide the whole
|
|
86
|
+
* reason. Reasons without `###` headings pass through untouched. */
|
|
87
|
+
export function foldSecondarySections(reason) {
|
|
88
|
+
if (!/^###\s/m.test(reason))
|
|
89
|
+
return reason;
|
|
90
|
+
const sections = [{ heading: null, lines: [] }];
|
|
91
|
+
for (const line of reason.split("\n")) {
|
|
92
|
+
if (/^###\s/.test(line))
|
|
93
|
+
sections.push({ heading: line.replace(/^#+\s*/, "").trim(), lines: [] });
|
|
94
|
+
else
|
|
95
|
+
sections[sections.length - 1].lines.push(line);
|
|
96
|
+
}
|
|
97
|
+
const anyAction = sections.some((s) => s.heading && isActionHeading(s.heading));
|
|
98
|
+
let firstHeaded = true;
|
|
99
|
+
const rendered = sections
|
|
100
|
+
.map((s) => {
|
|
101
|
+
const body = s.lines.join("\n").trim();
|
|
102
|
+
if (s.heading === null)
|
|
103
|
+
return body; // lead text — always visible
|
|
104
|
+
const visible = anyAction ? isActionHeading(s.heading) : firstHeaded;
|
|
105
|
+
firstHeaded = false;
|
|
106
|
+
if (visible)
|
|
107
|
+
return `### ${s.heading}\n${body}`;
|
|
108
|
+
// Blank line after <summary> is required for GitHub to render the markdown inside.
|
|
109
|
+
return `<details>\n<summary><b>${s.heading}</b></summary>\n\n${body}\n\n</details>`;
|
|
110
|
+
})
|
|
111
|
+
.filter(Boolean);
|
|
112
|
+
return rendered.join("\n\n");
|
|
113
|
+
}
|
|
70
114
|
/** Canonical GitHub login: trimmed, leading @ stripped, empty collapsed to
|
|
71
115
|
* undefined — so "@gemscng", " gemscng " and "gemscng" all render as one
|
|
72
116
|
* consistent `@gemscng` (comment body, console line, and JSON alike). */
|
|
@@ -74,10 +118,39 @@ export function normalizeOwner(raw) {
|
|
|
74
118
|
const login = (raw ?? "").trim().replace(/^@/, "");
|
|
75
119
|
return login || undefined;
|
|
76
120
|
}
|
|
121
|
+
/** The visible part of the comment must read in one breath per line: any line
|
|
122
|
+
* in the Action-needed section over this many words is dense prose, not a step
|
|
123
|
+
* (the contract caps sentences at ~20 words; 30 leaves room for a code ref). */
|
|
124
|
+
export const ACTION_LINE_WORD_LIMIT = 30;
|
|
125
|
+
/** Lines of the Action-needed section(s) that exceed ACTION_LINE_WORD_LIMIT
|
|
126
|
+
* words. Only those sections are checked — they're the part that renders
|
|
127
|
+
* unfolded, and the fix for an overlong step is precisely to move detail into
|
|
128
|
+
* a folded section. An inline code span collapses to one word before counting:
|
|
129
|
+
* the cap measures prose, and an exact runnable command (which the contract
|
|
130
|
+
* requires for action escalations) must not blow it. Every section whose
|
|
131
|
+
* heading matches "action needed" is checked, not just the first — heading
|
|
132
|
+
* drift can produce more than one. */
|
|
133
|
+
export function overlongActionLines(reason) {
|
|
134
|
+
const offenders = [];
|
|
135
|
+
let inActionSection = false;
|
|
136
|
+
for (const line of reason.split("\n")) {
|
|
137
|
+
if (/^###\s/.test(line)) {
|
|
138
|
+
inActionSection = isActionHeading(line);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (!inActionSection)
|
|
142
|
+
continue;
|
|
143
|
+
const prose = line.replace(/`[^`]+`/g, "code");
|
|
144
|
+
if (prose.split(/\s+/).filter(Boolean).length > ACTION_LINE_WORD_LIMIT)
|
|
145
|
+
offenders.push(line.trim());
|
|
146
|
+
}
|
|
147
|
+
return offenders;
|
|
148
|
+
}
|
|
77
149
|
/** Deterministic quality gate on an escalation reason — pure string checks, no
|
|
78
150
|
* AI. Returns one message per problem (empty array = clean). The rules encode
|
|
79
151
|
* the loop contract: no open questions without a recommendation, no pointers
|
|
80
|
-
* out of the comment, structured reasons lead with the action
|
|
152
|
+
* out of the comment, structured reasons lead with the action, and the visible
|
|
153
|
+
* action steps stay short enough to read without effort (issue #166). */
|
|
81
154
|
export function lintEscalationReason(reason) {
|
|
82
155
|
const r = reason.trim();
|
|
83
156
|
const problems = [];
|
|
@@ -93,12 +166,58 @@ export function lintEscalationReason(reason) {
|
|
|
93
166
|
}
|
|
94
167
|
// Tolerant match: subagents drift on heading spelling (case, emoji, colon);
|
|
95
168
|
// a substantively action-first reason must not be rejected.
|
|
96
|
-
if (r.includes("\n") &&
|
|
169
|
+
if (r.includes("\n") && !r.split("\n").some((l) => /^###\s/.test(l) && isActionHeading(l))) {
|
|
97
170
|
problems.push('structured reason is missing the "### 👤 Action needed" section — lead with the concrete steps');
|
|
98
171
|
}
|
|
172
|
+
for (const line of overlongActionLines(r)) {
|
|
173
|
+
problems.push(`"Action needed" line over ${ACTION_LINE_WORD_LIMIT} words ("${line.slice(0, 60)}…") — ` +
|
|
174
|
+
'a step must read in one breath; move the detail to "### Why it\'s blocked" (it renders folded)');
|
|
175
|
+
}
|
|
99
176
|
return problems;
|
|
100
177
|
}
|
|
101
|
-
|
|
178
|
+
/** Parse a human's structured per-decision reply on a `needs-human` issue into
|
|
179
|
+
* the decisions they answered (issue #60). The loop maps each answer back to the
|
|
180
|
+
* escalation's numbered decisions, so a reply like
|
|
181
|
+
*
|
|
182
|
+
* 1: frankfurter
|
|
183
|
+
* 3: me
|
|
184
|
+
*
|
|
185
|
+
* resolves decisions 1 and 3 and leaves the rest escalated (partial answers stay
|
|
186
|
+
* escalated with the remaining items). Accepted input, whitespace-tolerant throughout:
|
|
187
|
+
* - one decision per line — `N: answer`;
|
|
188
|
+
* - several on one line, comma-separated — `1: frankfurter, 3: me`;
|
|
189
|
+
* - only the FIRST colon splits the number from the answer, so an answer may
|
|
190
|
+
* itself contain colons (`1: use frankfurter: free tier` → n=1,
|
|
191
|
+
* answer="use frankfurter: free tier");
|
|
192
|
+
* - a comma only starts a new decision when a `N:` marker follows it, so an
|
|
193
|
+
* answer may contain commas (`1: A, B or C`) as long as no `N:` follows one.
|
|
194
|
+
* A line that does not START with `N:` is chatter and ignored — a non-numeric
|
|
195
|
+
* prefix ("option 1: x", "see step 2: …") is NOT a decision. No decisions → `[]`.
|
|
196
|
+
* Duplicate N → **last wins**: a later answer for the same decision overrides the
|
|
197
|
+
* earlier one, keeping the decision at its first-seen position. */
|
|
198
|
+
export function parseDecisionReplies(body) {
|
|
199
|
+
if (!body)
|
|
200
|
+
return []; // null/undefined/empty body — no decisions
|
|
201
|
+
const byNumber = new Map();
|
|
202
|
+
// A decision marker opens the line or follows a comma; its answer runs lazily
|
|
203
|
+
// to the next marker (or end of line), so the first colon splits and commas
|
|
204
|
+
// inside an answer survive unless a real `N:` marker follows them.
|
|
205
|
+
const marker = /(?:^|,)\s*(\d+)\s*:\s*([^]*?)(?=,\s*\d+\s*:|$)/g;
|
|
206
|
+
for (const line of body.split("\n")) {
|
|
207
|
+
if (!/^\s*\d+\s*:/.test(line))
|
|
208
|
+
continue; // not a decision line — chatter, skip
|
|
209
|
+
for (const m of line.matchAll(marker)) {
|
|
210
|
+
const answer = m[2].trim();
|
|
211
|
+
if (answer)
|
|
212
|
+
byNumber.set(Number(m[1]), answer); // last-wins on a duplicate N
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return [...byNumber].map(([n, answer]) => ({ n, answer }));
|
|
216
|
+
}
|
|
217
|
+
// The "🚧 **Needs a human**" prefix is load-bearing: findLatestEscalationComment
|
|
218
|
+
// matches comments on it, and the server's auto-unblock treats a leading 🚧 as
|
|
219
|
+
// loop machinery. Reword only what follows the dash.
|
|
220
|
+
const ESCALATION_BANNER = "🚧 **Needs a human** — the loop is parked here until you reply.";
|
|
102
221
|
/** The loop's most recent escalation comment on an issue (input oldest-first,
|
|
103
222
|
* as `gh issue view --json comments` returns them), so `issue escalate
|
|
104
223
|
* --update` can edit it in place instead of stacking a new banner. Only
|
|
@@ -115,30 +234,38 @@ export function findLatestEscalationComment(comments) {
|
|
|
115
234
|
return null;
|
|
116
235
|
}
|
|
117
236
|
/** Renders the escalation comment the loop posts when it hands an issue to a
|
|
118
|
-
* human.
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
237
|
+
* human. What a dev sees unfolded is deliberately minimal: banner, owner, the
|
|
238
|
+
* Action-needed steps, footer. Everything explanatory — the reason's other
|
|
239
|
+
* `###` sections and the `--category` rationale — collapses into `<details>`
|
|
240
|
+
* blocks (foldSecondarySections), so readability no longer depends on how
|
|
241
|
+
* verbose the reviewer subagent felt. A plain-paragraph reason just reads as
|
|
242
|
+
* text; this adds no competing heading of its own. `owner` names the
|
|
243
|
+
* accountable human right under the banner. */
|
|
125
244
|
export function formatEscalationBody(reason, opts = {}) {
|
|
126
245
|
if (opts.category && !(opts.category in ESCALATION_CATEGORIES)) {
|
|
127
246
|
throw new Error(`Unknown escalation category "${opts.category}" — valid: ${Object.keys(ESCALATION_CATEGORIES).join(", ")}`);
|
|
128
247
|
}
|
|
129
|
-
const why = bulletizeReason(reason.trim()) || "_No reason given._";
|
|
248
|
+
const why = foldSecondarySections(bulletizeReason(reason.trim())) || "_No reason given._";
|
|
130
249
|
const owner = normalizeOwner(opts.owner);
|
|
131
250
|
return [
|
|
132
251
|
ESCALATION_BANNER,
|
|
133
252
|
"",
|
|
134
|
-
...(owner ? [`**Owner:** @${owner}
|
|
253
|
+
...(owner ? [`**Owner:** @${owner}`, ""] : []),
|
|
135
254
|
why,
|
|
136
255
|
"",
|
|
137
256
|
...(opts.category
|
|
138
|
-
? [
|
|
257
|
+
? [
|
|
258
|
+
"<details>",
|
|
259
|
+
`<summary><b>Why a human must decide — ${opts.category}</b></summary>`,
|
|
260
|
+
"",
|
|
261
|
+
ESCALATION_CATEGORIES[opts.category],
|
|
262
|
+
"",
|
|
263
|
+
"</details>",
|
|
264
|
+
"",
|
|
265
|
+
]
|
|
139
266
|
: []),
|
|
140
267
|
"---",
|
|
141
|
-
"<sub>
|
|
268
|
+
"<sub>Reply with your decision (`1: <answer>` per numbered item works) — the **`needs-human`** label clears automatically and the loop resumes.</sub>",
|
|
142
269
|
].join("\n");
|
|
143
270
|
}
|
|
144
271
|
//# sourceMappingURL=escalation-format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation-format.js","sourceRoot":"","sources":["../src/escalation-format.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,gBAAgB;AAEhB;;;;;iCAKiC;AACjC,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,CAAY,+DAA+D;IACpH,OAAO,CACL,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7E,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5E,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;6EAY6E;AAC7E,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,MAAc,EAAO,wEAAwE;AAC7F,WAAmB,EAAE,oDAAoD;AACzE,IAA8C;IAE9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAmB,0CAA0C;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC,CAAW,sCAAsC;IAC3F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,QAAQ;YAAE,SAAS,CAA2B,gDAAgD;QACnG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAmB,6BAA6B;IAClF,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"escalation-format.js","sourceRoot":"","sources":["../src/escalation-format.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,gBAAgB;AAEhB;;;;;iCAKiC;AACjC,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,CAAY,+DAA+D;IACpH,OAAO,CACL,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7E,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5E,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;6EAY6E;AAC7E,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,MAAc,EAAO,wEAAwE;AAC7F,WAAmB,EAAE,oDAAoD;AACzE,IAA8C;IAE9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAmB,0CAA0C;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC,CAAW,sCAAsC;IAC3F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,QAAQ;YAAE,SAAS,CAA2B,gDAAgD;QACnG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAmB,6BAA6B;IAClF,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;;;4BAI4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,aAAa,EACX,6FAA6F;QAC7F,6FAA6F;QAC7F,oGAAoG;IACtG,aAAa,EACX,6FAA6F;QAC7F,yFAAyF;QACzF,4DAA4D;IAC9D,QAAQ,EACN,4FAA4F;QAC5F,2FAA2F;IAC7F,gBAAgB,EACd,8FAA8F;QAC9F,wEAAwE;IAC1E,qBAAqB,EACnB,6FAA6F;QAC7F,mCAAmC;IACrC,OAAO,EACL,6FAA6F;QAC7F,kCAAkC;CACrC,CAAC;AASF;;;;sDAIsD;AACtD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;qEAOqE;AACrE,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE3C,MAAM,QAAQ,GAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;;YAC7F,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChF,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,MAAM,QAAQ,GAAG,QAAQ;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,6BAA6B;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QACrE,WAAW,GAAG,KAAK,CAAC;QACpB,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,mFAAmF;QACnF,OAAO,0BAA0B,CAAC,CAAC,OAAO,qBAAqB,IAAI,gBAAgB,CAAC;IACtF,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED;;iFAEiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;uCAOuC;AACvC,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,eAAe;YAAE,SAAS;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,sBAAsB;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;0EAI0E;AAC1E,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,oEAAoE,CAAC,CAAC;IACtF,yEAAyE;IACzE,kEAAkE;IAClE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,QAAQ,CAAC,IAAI,CACX,2IAA2I,CAC5I,CAAC;IACJ,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;IAC1G,CAAC;IACD,4EAA4E;IAC5E,4DAA4D;IAC5D,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IAClH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CACX,6BAA6B,sBAAsB,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ;YACtF,gGAAgG,CACnG,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD;;;;;;;;;;;;;;;;;;;oEAmBoE;AACpE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC,CAAkC,2CAA2C;IAClG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,8EAA8E;IAC9E,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,MAAM,GAAG,iDAAiD,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS,CAAa,sCAAsC;QAC3F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,MAAM;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAI,6BAA6B;QAClF,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,iFAAiF;AACjF,+EAA+E;AAC/E,qDAAqD;AACrD,MAAM,iBAAiB,GAAG,iEAAiE,CAAC;AAQ5F;;;;gDAIgD;AAChD,MAAM,UAAU,2BAA2B,CAAC,QAAgC;IAC1E,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,eAAe,KAAK,KAAK;YAAE,SAAS;QAC1C,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC;YAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;gDAOgD;AAChD,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,OAA0B,EAAE;IAC/E,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,qBAAqB,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,QAAQ,cAAc,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,qBAAqB,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,oBAAoB,CAAC;IAC1F,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO;QACL,iBAAiB;QACjB,EAAE;QACF,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG;QACH,EAAE;QACF,GAAG,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC;gBACE,WAAW;gBACX,yCAAyC,IAAI,CAAC,QAAQ,gBAAgB;gBACtE,EAAE;gBACF,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpC,EAAE;gBACF,YAAY;gBACZ,EAAE;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK;QACL,sJAAsJ;KACvJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|