callman-core 1.23.0 → 1.24.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/dist/index.d.ts CHANGED
@@ -27,6 +27,7 @@ export { applySoapRequestTransforms, type SoapRequestConfig, type SoapRuntimeReq
27
27
  export { buildWsSecurityHeader, injectWsSecurityHeader, type WsSecurityConfig, type WsSecurityHeaderParts, } from "./soap/wsSecurity.js";
28
28
  export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTemplate, } from "./soap/envelope.js";
29
29
  export * from "./ai/index.js";
30
+ export * from "./ui-test/compose.js";
30
31
  export * from "./scenario-runner/index.js";
31
32
  export * from "./host/index.js";
32
33
  export * from "./types/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTe
29
29
  // extraction (jsonRepair) — one source for backend hosted generation and
30
30
  // desktop local-CLI generation.
31
31
  export * from "./ai/index.js";
32
+ export * from "./ui-test/compose.js";
32
33
  export * from "./scenario-runner/index.js";
33
34
  export * from "./host/index.js";
34
35
  export * from "./types/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * UI-test flow composition — the ONE implementation of "turn a stored flow
3
+ * into the YAML the driver runs", shared by the desktop (Electron run) and
4
+ * the backend ui-runner (scheduled run). Both consumers MUST call
5
+ * `composeFlowForRun` so a flow behaves identically on a QA's machine and on
6
+ * the schedule.
7
+ *
8
+ * Rules (ported verbatim from the desktop, which is the reference behaviour):
9
+ * - A flow = optional config header (url / appId / env / tags …) + `---` +
10
+ * a YAML list of steps.
11
+ * - `- runFlow: "Name"` lines are inlined from the library BY NAME,
12
+ * recursively, with cycle protection; the flow's OWN name is seeded into the
13
+ * visited set so a self-reference is never expanded.
14
+ * - Every inlined sub-flow gets ITS OWN dataset applied first (a reused Login
15
+ * sub-flow keeps its `{{user}}` / `{{pass}}`).
16
+ * - The run dataset is applied TEXTUALLY over the whole expanded document —
17
+ * header included — before parsing, so `{{baseUrl}}` in `url:` works and
18
+ * dataset values win over a header `env:` key of the same name.
19
+ * - Unknown `{{tokens}}` are left intact (never collapse to "").
20
+ * - Web only: when the flow's own `url:` is the example.com placeholder, the
21
+ * entry URL falls back to the first precondition sub-flow's real URL.
22
+ *
23
+ * Pure string code — no YAML parser, no Node/Electron APIs — so it can live
24
+ * in callman-core.
25
+ */
26
+ /** Return everything before the first `---` separator (config block). */
27
+ export declare function extractHeader(yamlContent: string): string;
28
+ /**
29
+ * Return the steps block (everything after the first `---`). When no separator
30
+ * exists, the entire content is treated as the body. Leading newline is
31
+ * stripped so the result starts with the first step.
32
+ */
33
+ export declare function extractBody(yamlContent: string): string;
34
+ /** Split a flow body into top-level step blocks (a `- ` line at column 0 plus
35
+ * its indented sub-lines). Continuation/indented lines stay with their step. */
36
+ export declare function splitTopLevelSteps(body: string): string[];
37
+ /**
38
+ * Per-step provenance for a flow once its `- runFlow: "X"` references are
39
+ * inlined: returns one entry PER top-level executed step (same order the driver
40
+ * runs them), each being the name of the sub-flow that step came from, or "" for
41
+ * the parent flow's own steps. `flowMap` maps flow NAME → body (extractBody).
42
+ */
43
+ export declare function flattenStepSources(content: string, flowMap: Map<string, string>, visited?: Set<string>, source?: string): string[];
44
+ /**
45
+ * Tag each executed step with the imported sub-flow it came from (or leave it
46
+ * untagged for the parent flow's own steps). Skips the driver's leading
47
+ * config step(s) ("Apply configuration") which aren't YAML steps. Best-effort:
48
+ * returns the steps unchanged when the flow imports no sub-flows.
49
+ */
50
+ export declare function tagStepSources<T extends {
51
+ command: string;
52
+ source?: string;
53
+ }>(steps: T[], content: string, flowMap: Map<string, string>): T[];
54
+ /**
55
+ * Read the leading `- runFlow: "Name"` block of a flow as its "preconditions"
56
+ * (sub-flows that run first — e.g. Login, Register). Only the CONSECUTIVE
57
+ * runFlow lines at the very start of the body count.
58
+ */
59
+ export declare function extractPreconditions(content: string): {
60
+ names: string[];
61
+ rest: string;
62
+ };
63
+ /** Rewrite a flow's precondition block to exactly `names` (preserving the
64
+ * config header and the flow's own steps). */
65
+ export declare function setPreconditions(content: string, names: string[]): string;
66
+ /** The flow's config `url:` (from the header block), or "" when absent. */
67
+ export declare function extractUrl(content: string): string;
68
+ /** True for a usable start URL — a real http(s) address that ISN'T the template
69
+ * `example.com/.org` placeholder every new flow ships with. */
70
+ export declare function isRealUrl(url: string): boolean;
71
+ /** Set (or insert) the header `url:` to `url`, touching only the config block so
72
+ * step fields named `url` are never rewritten. */
73
+ export declare function setUrl(content: string, url: string): string;
74
+ /** The URL a run/mirror should actually START on: the flow's own real `url:`,
75
+ * otherwise the first precondition sub-flow's real URL (recursively). */
76
+ export declare function effectiveEntryUrl(content: string, contentByName: Map<string, string>, visited?: Set<string>): string;
77
+ /**
78
+ * Replace `- runFlow: "Name"` lines with the inlined commands of the
79
+ * referenced flow (by name). Recursive, with visited-set cycle protection.
80
+ * `flowMap` maps a flow NAME to its body (use `extractBody` on the content).
81
+ * Unknown / visited names are left as-is.
82
+ */
83
+ export declare function resolveRunFlowRefs(content: string, flowMap: Map<string, string>, visited: Set<string>): string;
84
+ /** Names of `- runFlow:` references still present in an EXPANDED body — i.e.
85
+ * sub-flows the library could not provide. Self-references (own name) are
86
+ * reported too; the caller decides whether that is an error. */
87
+ export declare function listUnresolvedRunFlowRefs(expandedContent: string): string[];
88
+ /** Replace `{{key}}` occurrences in `content` with the matching dataset value.
89
+ * GUARDED: only keys present in the dataset are replaced. */
90
+ export declare function applyDataset(content: string, dataset?: Record<string, string> | null): string;
91
+ /** The dataset keys referenced by `{{key}}` anywhere in `content`. */
92
+ export declare function datasetKeysUsedIn(content: string): string[];
93
+ /** Per-flow run settings the QA can toggle; persisted on the flow so a
94
+ * scheduled run honours the same choices as a desktop run. */
95
+ export interface UiTestRunSettings {
96
+ screenshotOnSuccess: boolean;
97
+ screenshotOnFailure: boolean;
98
+ autoRetryTransient: boolean;
99
+ captureNetwork: boolean;
100
+ }
101
+ export type UiTestRunSettingsPatch = {
102
+ [K in keyof UiTestRunSettings]?: UiTestRunSettings[K] | null;
103
+ };
104
+ /** The ONE default table for both sides. */
105
+ export declare const RUN_SETTING_DEFAULTS: Readonly<UiTestRunSettings>;
106
+ /** Fill missing / null settings from the defaults. */
107
+ export declare function resolveRunSettings(partial?: UiTestRunSettingsPatch | null): UiTestRunSettings;
108
+ /** Commands that only make sense on android/ios (the M mobile engine). A web
109
+ * run silently passes them; the desktop preflight and the server report warn.
110
+ * Keep in sync with the desktop step catalog's MOBILE_ONLY_STEP_KEYS. */
111
+ export declare const MOBILE_ONLY_COMMANDS: ReadonlySet<string>;
112
+ /** The distinct mobile-only commands used by the top-level steps of `body`. */
113
+ export declare function findMobileOnlyCommands(body: string): string[];
114
+ export interface ComposeFlowInput {
115
+ flow: {
116
+ name: string;
117
+ content: string;
118
+ platform: string;
119
+ };
120
+ /** Every flow visible to the runner (the parent itself may be included). */
121
+ library: Array<{
122
+ name: string;
123
+ content: string;
124
+ dataset?: Record<string, string> | null;
125
+ }>;
126
+ /** The resolved run dataset (static values + DB-sourced values). */
127
+ runDataset?: Record<string, string> | null;
128
+ /** Per-step ▶ on the desktop passes a one-step override. */
129
+ contentOverride?: string;
130
+ /** Web: swap the example.com placeholder for a precondition's real URL. */
131
+ applyEntryUrlFallback?: boolean;
132
+ }
133
+ export interface ComposeFlowOutput {
134
+ /** The YAML to parse and run. */
135
+ content: string;
136
+ /** name → body (with the sub-flow's own dataset applied) — for tagStepSources. */
137
+ flowMap: Map<string, string>;
138
+ /** The URL the run starts on ("" when the flow has none). */
139
+ entryUrl: string;
140
+ /** `runFlow` names the library could not resolve. */
141
+ unresolved: string[];
142
+ /** Mobile-only commands present in the expanded body. */
143
+ mobileOnly: string[];
144
+ }
145
+ export declare function composeFlowForRun(input: ComposeFlowInput): ComposeFlowOutput;
146
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/ui-test/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * UI-test flow composition — the ONE implementation of "turn a stored flow
3
+ * into the YAML the driver runs", shared by the desktop (Electron run) and
4
+ * the backend ui-runner (scheduled run). Both consumers MUST call
5
+ * `composeFlowForRun` so a flow behaves identically on a QA's machine and on
6
+ * the schedule.
7
+ *
8
+ * Rules (ported verbatim from the desktop, which is the reference behaviour):
9
+ * - A flow = optional config header (url / appId / env / tags …) + `---` +
10
+ * a YAML list of steps.
11
+ * - `- runFlow: "Name"` lines are inlined from the library BY NAME,
12
+ * recursively, with cycle protection; the flow's OWN name is seeded into the
13
+ * visited set so a self-reference is never expanded.
14
+ * - Every inlined sub-flow gets ITS OWN dataset applied first (a reused Login
15
+ * sub-flow keeps its `{{user}}` / `{{pass}}`).
16
+ * - The run dataset is applied TEXTUALLY over the whole expanded document —
17
+ * header included — before parsing, so `{{baseUrl}}` in `url:` works and
18
+ * dataset values win over a header `env:` key of the same name.
19
+ * - Unknown `{{tokens}}` are left intact (never collapse to "").
20
+ * - Web only: when the flow's own `url:` is the example.com placeholder, the
21
+ * entry URL falls back to the first precondition sub-flow's real URL.
22
+ *
23
+ * Pure string code — no YAML parser, no Node/Electron APIs — so it can live
24
+ * in callman-core.
25
+ */
26
+ // ── Header / body ───────────────────────────────────────────────────────────
27
+ const SEPARATOR_RE = /^[ \t]*---[ \t]*$/m;
28
+ /** Return everything before the first `---` separator (config block). */
29
+ export function extractHeader(yamlContent) {
30
+ const m = SEPARATOR_RE.exec(yamlContent);
31
+ if (!m)
32
+ return "";
33
+ return yamlContent.slice(0, yamlContent.indexOf(m[0]));
34
+ }
35
+ /**
36
+ * Return the steps block (everything after the first `---`). When no separator
37
+ * exists, the entire content is treated as the body. Leading newline is
38
+ * stripped so the result starts with the first step.
39
+ */
40
+ export function extractBody(yamlContent) {
41
+ const m = SEPARATOR_RE.exec(yamlContent);
42
+ if (!m)
43
+ return yamlContent.trimStart().trimEnd();
44
+ return yamlContent
45
+ .slice(yamlContent.indexOf(m[0]) + m[0].length)
46
+ .replace(/^\r?\n/, "")
47
+ .trimEnd();
48
+ }
49
+ const RUNFLOW_LINE_RE = /^[ \t]*-[ \t]+runFlow:[ \t]+(?:"([^"]+)"|'([^']+)')[ \t]*$/;
50
+ /** Split a flow body into top-level step blocks (a `- ` line at column 0 plus
51
+ * its indented sub-lines). Continuation/indented lines stay with their step. */
52
+ export function splitTopLevelSteps(body) {
53
+ const blocks = [];
54
+ let cur = [];
55
+ for (const line of body.split("\n")) {
56
+ if (/^-\s/.test(line)) {
57
+ if (cur.length)
58
+ blocks.push(cur.join("\n"));
59
+ cur = [line];
60
+ }
61
+ else if (cur.length) {
62
+ cur.push(line);
63
+ }
64
+ }
65
+ if (cur.length)
66
+ blocks.push(cur.join("\n"));
67
+ return blocks;
68
+ }
69
+ // ── Step provenance ─────────────────────────────────────────────────────────
70
+ /**
71
+ * Per-step provenance for a flow once its `- runFlow: "X"` references are
72
+ * inlined: returns one entry PER top-level executed step (same order the driver
73
+ * runs them), each being the name of the sub-flow that step came from, or "" for
74
+ * the parent flow's own steps. `flowMap` maps flow NAME → body (extractBody).
75
+ */
76
+ export function flattenStepSources(content, flowMap, visited = new Set(), source = "") {
77
+ const out = [];
78
+ for (const block of splitTopLevelSteps(extractBody(content))) {
79
+ const m = RUNFLOW_LINE_RE.exec(block.split("\n")[0]);
80
+ const name = m ? (m[1] ?? m[2]).trim() : null;
81
+ if (name && !visited.has(name) && flowMap.has(name)) {
82
+ const next = new Set(visited);
83
+ next.add(name);
84
+ out.push(...flattenStepSources(flowMap.get(name) ?? "", flowMap, next, name));
85
+ }
86
+ else {
87
+ out.push(source);
88
+ }
89
+ }
90
+ return out;
91
+ }
92
+ /**
93
+ * Tag each executed step with the imported sub-flow it came from (or leave it
94
+ * untagged for the parent flow's own steps). Skips the driver's leading
95
+ * config step(s) ("Apply configuration") which aren't YAML steps. Best-effort:
96
+ * returns the steps unchanged when the flow imports no sub-flows.
97
+ */
98
+ export function tagStepSources(steps, content, flowMap) {
99
+ const sources = flattenStepSources(content, flowMap);
100
+ if (!sources.some(Boolean))
101
+ return steps;
102
+ let offset = 0;
103
+ while (offset < steps.length && /^apply config/i.test(steps[offset].command))
104
+ offset++;
105
+ return steps.map((s, i) => {
106
+ const src = sources[i - offset];
107
+ return src ? { ...s, source: src } : s;
108
+ });
109
+ }
110
+ // ── Preconditions (leading runFlow block) ───────────────────────────────────
111
+ /**
112
+ * Read the leading `- runFlow: "Name"` block of a flow as its "preconditions"
113
+ * (sub-flows that run first — e.g. Login, Register). Only the CONSECUTIVE
114
+ * runFlow lines at the very start of the body count.
115
+ */
116
+ export function extractPreconditions(content) {
117
+ const body = extractBody(content);
118
+ const lines = body.split("\n");
119
+ const names = [];
120
+ let i = 0;
121
+ for (; i < lines.length; i++) {
122
+ const m = RUNFLOW_LINE_RE.exec(lines[i]);
123
+ if (!m)
124
+ break;
125
+ names.push((m[1] ?? m[2]).trim());
126
+ }
127
+ return { names, rest: lines.slice(i).join("\n").replace(/^\n+/, "") };
128
+ }
129
+ /** Rewrite a flow's precondition block to exactly `names` (preserving the
130
+ * config header and the flow's own steps). */
131
+ export function setPreconditions(content, names) {
132
+ const header = extractHeader(content).trimEnd();
133
+ const { rest } = extractPreconditions(content);
134
+ const pre = names.map((n) => `- runFlow: "${n.replace(/"/g, '\\"')}"`).join("\n");
135
+ const body = [pre, rest].filter((p) => p.trim().length > 0).join("\n");
136
+ if (!header)
137
+ return body;
138
+ return `${header}\n---\n${body}`;
139
+ }
140
+ // ── Entry URL ───────────────────────────────────────────────────────────────
141
+ const URL_HEADER_RE = /^[ \t]*url\s*:[ \t]*(.+?)[ \t]*$/m;
142
+ /** The flow's config `url:` (from the header block), or "" when absent. */
143
+ export function extractUrl(content) {
144
+ return extractHeader(content).match(URL_HEADER_RE)?.[1]?.trim() ?? "";
145
+ }
146
+ /** True for a usable start URL — a real http(s) address that ISN'T the template
147
+ * `example.com/.org` placeholder every new flow ships with. */
148
+ export function isRealUrl(url) {
149
+ return /^https?:\/\//i.test(url) && !/^https?:\/\/(www\.)?example\.(com|org)\/?$/i.test(url);
150
+ }
151
+ /** Set (or insert) the header `url:` to `url`, touching only the config block so
152
+ * step fields named `url` are never rewritten. */
153
+ export function setUrl(content, url) {
154
+ const m = SEPARATOR_RE.exec(content);
155
+ const sepIdx = m ? content.indexOf(m[0]) : -1;
156
+ const header = sepIdx >= 0 ? content.slice(0, sepIdx) : content;
157
+ const rest = sepIdx >= 0 ? content.slice(sepIdx) : "";
158
+ const newHeader = URL_HEADER_RE.test(header)
159
+ ? header.replace(URL_HEADER_RE, `url: ${url}`)
160
+ : `url: ${url}\n${header}`;
161
+ return newHeader + rest;
162
+ }
163
+ /** The URL a run/mirror should actually START on: the flow's own real `url:`,
164
+ * otherwise the first precondition sub-flow's real URL (recursively). */
165
+ export function effectiveEntryUrl(content, contentByName, visited = new Set()) {
166
+ const own = extractUrl(content);
167
+ if (isRealUrl(own))
168
+ return own;
169
+ const { names } = extractPreconditions(content);
170
+ for (const name of names) {
171
+ if (visited.has(name))
172
+ continue;
173
+ const sub = contentByName.get(name);
174
+ if (!sub)
175
+ continue;
176
+ const next = new Set(visited);
177
+ next.add(name);
178
+ const subUrl = effectiveEntryUrl(sub, contentByName, next);
179
+ if (isRealUrl(subUrl))
180
+ return subUrl;
181
+ }
182
+ return own;
183
+ }
184
+ // ── runFlow inlining ────────────────────────────────────────────────────────
185
+ const RUNFLOW_GLOBAL_RE = /^([ \t]*)(-[ \t]+)runFlow:[ \t]+(?:"([^"]+)"|'([^']+)')[ \t]*$/gm;
186
+ /**
187
+ * Replace `- runFlow: "Name"` lines with the inlined commands of the
188
+ * referenced flow (by name). Recursive, with visited-set cycle protection.
189
+ * `flowMap` maps a flow NAME to its body (use `extractBody` on the content).
190
+ * Unknown / visited names are left as-is.
191
+ */
192
+ export function resolveRunFlowRefs(content, flowMap, visited) {
193
+ return content.replace(RUNFLOW_GLOBAL_RE, (match, indent, _dash, dq, sq) => {
194
+ const name = (dq ?? sq ?? "").trim();
195
+ if (!name || visited.has(name))
196
+ return match;
197
+ const body = flowMap.get(name);
198
+ if (!body)
199
+ return match;
200
+ const childVisited = new Set(visited);
201
+ childVisited.add(name);
202
+ const expanded = resolveRunFlowRefs(body, flowMap, childVisited);
203
+ const lines = expanded.split("\n");
204
+ const nonEmpty = lines.filter((l) => l.trim());
205
+ const minIndent = nonEmpty.length
206
+ ? Math.min(...nonEmpty.map((l) => (/^[ \t]*/.exec(l)?.[0] ?? "").length))
207
+ : 0;
208
+ return lines.map((line) => (line.trim() ? indent + line.slice(minIndent) : line)).join("\n");
209
+ });
210
+ }
211
+ /** Names of `- runFlow:` references still present in an EXPANDED body — i.e.
212
+ * sub-flows the library could not provide. Self-references (own name) are
213
+ * reported too; the caller decides whether that is an error. */
214
+ export function listUnresolvedRunFlowRefs(expandedContent) {
215
+ const names = new Set();
216
+ for (const m of expandedContent.matchAll(RUNFLOW_GLOBAL_RE)) {
217
+ const name = (m[3] ?? m[4] ?? "").trim();
218
+ if (name)
219
+ names.add(name);
220
+ }
221
+ return [...names];
222
+ }
223
+ // ── Dataset ─────────────────────────────────────────────────────────────────
224
+ const TOKEN = /\{\{\s*([\w.$-]+)\s*\}\}/g;
225
+ /** Replace `{{key}}` occurrences in `content` with the matching dataset value.
226
+ * GUARDED: only keys present in the dataset are replaced. */
227
+ export function applyDataset(content, dataset) {
228
+ if (!dataset)
229
+ return content;
230
+ const keys = Object.keys(dataset);
231
+ if (keys.length === 0)
232
+ return content;
233
+ return content.replace(TOKEN, (match, key) => Object.prototype.hasOwnProperty.call(dataset, key) ? dataset[key] : match);
234
+ }
235
+ /** The dataset keys referenced by `{{key}}` anywhere in `content`. */
236
+ export function datasetKeysUsedIn(content) {
237
+ const used = new Set();
238
+ for (const m of content.matchAll(TOKEN))
239
+ used.add(m[1]);
240
+ return [...used];
241
+ }
242
+ /** The ONE default table for both sides. */
243
+ export const RUN_SETTING_DEFAULTS = Object.freeze({
244
+ screenshotOnSuccess: true,
245
+ screenshotOnFailure: true,
246
+ autoRetryTransient: true,
247
+ captureNetwork: false,
248
+ });
249
+ /** Fill missing / null settings from the defaults. */
250
+ export function resolveRunSettings(partial) {
251
+ const out = { ...RUN_SETTING_DEFAULTS };
252
+ if (!partial)
253
+ return out;
254
+ for (const key of Object.keys(RUN_SETTING_DEFAULTS)) {
255
+ const v = partial[key];
256
+ if (typeof v === "boolean")
257
+ out[key] = v;
258
+ }
259
+ return out;
260
+ }
261
+ // ── Mobile-only commands ────────────────────────────────────────────────────
262
+ /** Commands that only make sense on android/ios (the M mobile engine). A web
263
+ * run silently passes them; the desktop preflight and the server report warn.
264
+ * Keep in sync with the desktop step catalog's MOBILE_ONLY_STEP_KEYS. */
265
+ export const MOBILE_ONLY_COMMANDS = new Set([
266
+ "launchApp",
267
+ "hideKeyboard",
268
+ "clearState",
269
+ "clearKeychain",
270
+ "killApp",
271
+ "stopApp",
272
+ "setLocation",
273
+ "setPermissions",
274
+ "setOrientation",
275
+ "setAirplaneMode",
276
+ "toggleAirplaneMode",
277
+ "travel",
278
+ "addMedia",
279
+ ]);
280
+ const STEP_KEY_RE = /^-[ \t]+([A-Za-z][\w-]*)\b/;
281
+ /** The distinct mobile-only commands used by the top-level steps of `body`. */
282
+ export function findMobileOnlyCommands(body) {
283
+ const found = new Set();
284
+ for (const block of splitTopLevelSteps(extractBody(body))) {
285
+ const key = STEP_KEY_RE.exec(block.split("\n")[0])?.[1];
286
+ if (key && MOBILE_ONLY_COMMANDS.has(key))
287
+ found.add(key);
288
+ }
289
+ return [...found];
290
+ }
291
+ export function composeFlowForRun(input) {
292
+ const { flow, library } = input;
293
+ const flowMap = new Map();
294
+ const contentByName = new Map();
295
+ for (const f of library) {
296
+ if (!flowMap.has(f.name)) {
297
+ flowMap.set(f.name, applyDataset(extractBody(f.content), f.dataset));
298
+ contentByName.set(f.name, f.content);
299
+ }
300
+ }
301
+ const source = input.contentOverride ?? flow.content;
302
+ const expanded = resolveRunFlowRefs(source, flowMap, new Set([flow.name]));
303
+ let content = applyDataset(expanded, input.runDataset);
304
+ if (input.applyEntryUrlFallback &&
305
+ !input.contentOverride &&
306
+ flow.platform === "web" &&
307
+ !isRealUrl(extractUrl(flow.content))) {
308
+ const eff = effectiveEntryUrl(flow.content, contentByName);
309
+ if (isRealUrl(eff))
310
+ content = setUrl(content, eff);
311
+ }
312
+ return {
313
+ content,
314
+ flowMap,
315
+ entryUrl: extractUrl(content),
316
+ unresolved: listUnresolvedRunFlowRefs(content),
317
+ mobileOnly: findMobileOnlyCommands(content),
318
+ };
319
+ }
320
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/ui-test/compose.ts"],"names":[],"mappings":"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"}
package/dist-cjs/index.js CHANGED
@@ -93,6 +93,7 @@ Object.defineProperty(exports, "getSoapEnvelopeTemplate", { enumerable: true, ge
93
93
  // extraction (jsonRepair) — one source for backend hosted generation and
94
94
  // desktop local-CLI generation.
95
95
  __exportStar(require("./ai/index.js"), exports);
96
+ __exportStar(require("./ui-test/compose.js"), exports);
96
97
  __exportStar(require("./scenario-runner/index.js"), exports);
97
98
  __exportStar(require("./host/index.js"), exports);
98
99
  __exportStar(require("./types/index.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AA2B1B,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AA2B1B,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,uDAAqC;AACrC,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ /**
3
+ * UI-test flow composition — the ONE implementation of "turn a stored flow
4
+ * into the YAML the driver runs", shared by the desktop (Electron run) and
5
+ * the backend ui-runner (scheduled run). Both consumers MUST call
6
+ * `composeFlowForRun` so a flow behaves identically on a QA's machine and on
7
+ * the schedule.
8
+ *
9
+ * Rules (ported verbatim from the desktop, which is the reference behaviour):
10
+ * - A flow = optional config header (url / appId / env / tags …) + `---` +
11
+ * a YAML list of steps.
12
+ * - `- runFlow: "Name"` lines are inlined from the library BY NAME,
13
+ * recursively, with cycle protection; the flow's OWN name is seeded into the
14
+ * visited set so a self-reference is never expanded.
15
+ * - Every inlined sub-flow gets ITS OWN dataset applied first (a reused Login
16
+ * sub-flow keeps its `{{user}}` / `{{pass}}`).
17
+ * - The run dataset is applied TEXTUALLY over the whole expanded document —
18
+ * header included — before parsing, so `{{baseUrl}}` in `url:` works and
19
+ * dataset values win over a header `env:` key of the same name.
20
+ * - Unknown `{{tokens}}` are left intact (never collapse to "").
21
+ * - Web only: when the flow's own `url:` is the example.com placeholder, the
22
+ * entry URL falls back to the first precondition sub-flow's real URL.
23
+ *
24
+ * Pure string code — no YAML parser, no Node/Electron APIs — so it can live
25
+ * in callman-core.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.MOBILE_ONLY_COMMANDS = exports.RUN_SETTING_DEFAULTS = void 0;
29
+ exports.extractHeader = extractHeader;
30
+ exports.extractBody = extractBody;
31
+ exports.splitTopLevelSteps = splitTopLevelSteps;
32
+ exports.flattenStepSources = flattenStepSources;
33
+ exports.tagStepSources = tagStepSources;
34
+ exports.extractPreconditions = extractPreconditions;
35
+ exports.setPreconditions = setPreconditions;
36
+ exports.extractUrl = extractUrl;
37
+ exports.isRealUrl = isRealUrl;
38
+ exports.setUrl = setUrl;
39
+ exports.effectiveEntryUrl = effectiveEntryUrl;
40
+ exports.resolveRunFlowRefs = resolveRunFlowRefs;
41
+ exports.listUnresolvedRunFlowRefs = listUnresolvedRunFlowRefs;
42
+ exports.applyDataset = applyDataset;
43
+ exports.datasetKeysUsedIn = datasetKeysUsedIn;
44
+ exports.resolveRunSettings = resolveRunSettings;
45
+ exports.findMobileOnlyCommands = findMobileOnlyCommands;
46
+ exports.composeFlowForRun = composeFlowForRun;
47
+ // ── Header / body ───────────────────────────────────────────────────────────
48
+ const SEPARATOR_RE = /^[ \t]*---[ \t]*$/m;
49
+ /** Return everything before the first `---` separator (config block). */
50
+ function extractHeader(yamlContent) {
51
+ const m = SEPARATOR_RE.exec(yamlContent);
52
+ if (!m)
53
+ return "";
54
+ return yamlContent.slice(0, yamlContent.indexOf(m[0]));
55
+ }
56
+ /**
57
+ * Return the steps block (everything after the first `---`). When no separator
58
+ * exists, the entire content is treated as the body. Leading newline is
59
+ * stripped so the result starts with the first step.
60
+ */
61
+ function extractBody(yamlContent) {
62
+ const m = SEPARATOR_RE.exec(yamlContent);
63
+ if (!m)
64
+ return yamlContent.trimStart().trimEnd();
65
+ return yamlContent
66
+ .slice(yamlContent.indexOf(m[0]) + m[0].length)
67
+ .replace(/^\r?\n/, "")
68
+ .trimEnd();
69
+ }
70
+ const RUNFLOW_LINE_RE = /^[ \t]*-[ \t]+runFlow:[ \t]+(?:"([^"]+)"|'([^']+)')[ \t]*$/;
71
+ /** Split a flow body into top-level step blocks (a `- ` line at column 0 plus
72
+ * its indented sub-lines). Continuation/indented lines stay with their step. */
73
+ function splitTopLevelSteps(body) {
74
+ const blocks = [];
75
+ let cur = [];
76
+ for (const line of body.split("\n")) {
77
+ if (/^-\s/.test(line)) {
78
+ if (cur.length)
79
+ blocks.push(cur.join("\n"));
80
+ cur = [line];
81
+ }
82
+ else if (cur.length) {
83
+ cur.push(line);
84
+ }
85
+ }
86
+ if (cur.length)
87
+ blocks.push(cur.join("\n"));
88
+ return blocks;
89
+ }
90
+ // ── Step provenance ─────────────────────────────────────────────────────────
91
+ /**
92
+ * Per-step provenance for a flow once its `- runFlow: "X"` references are
93
+ * inlined: returns one entry PER top-level executed step (same order the driver
94
+ * runs them), each being the name of the sub-flow that step came from, or "" for
95
+ * the parent flow's own steps. `flowMap` maps flow NAME → body (extractBody).
96
+ */
97
+ function flattenStepSources(content, flowMap, visited = new Set(), source = "") {
98
+ const out = [];
99
+ for (const block of splitTopLevelSteps(extractBody(content))) {
100
+ const m = RUNFLOW_LINE_RE.exec(block.split("\n")[0]);
101
+ const name = m ? (m[1] ?? m[2]).trim() : null;
102
+ if (name && !visited.has(name) && flowMap.has(name)) {
103
+ const next = new Set(visited);
104
+ next.add(name);
105
+ out.push(...flattenStepSources(flowMap.get(name) ?? "", flowMap, next, name));
106
+ }
107
+ else {
108
+ out.push(source);
109
+ }
110
+ }
111
+ return out;
112
+ }
113
+ /**
114
+ * Tag each executed step with the imported sub-flow it came from (or leave it
115
+ * untagged for the parent flow's own steps). Skips the driver's leading
116
+ * config step(s) ("Apply configuration") which aren't YAML steps. Best-effort:
117
+ * returns the steps unchanged when the flow imports no sub-flows.
118
+ */
119
+ function tagStepSources(steps, content, flowMap) {
120
+ const sources = flattenStepSources(content, flowMap);
121
+ if (!sources.some(Boolean))
122
+ return steps;
123
+ let offset = 0;
124
+ while (offset < steps.length && /^apply config/i.test(steps[offset].command))
125
+ offset++;
126
+ return steps.map((s, i) => {
127
+ const src = sources[i - offset];
128
+ return src ? { ...s, source: src } : s;
129
+ });
130
+ }
131
+ // ── Preconditions (leading runFlow block) ───────────────────────────────────
132
+ /**
133
+ * Read the leading `- runFlow: "Name"` block of a flow as its "preconditions"
134
+ * (sub-flows that run first — e.g. Login, Register). Only the CONSECUTIVE
135
+ * runFlow lines at the very start of the body count.
136
+ */
137
+ function extractPreconditions(content) {
138
+ const body = extractBody(content);
139
+ const lines = body.split("\n");
140
+ const names = [];
141
+ let i = 0;
142
+ for (; i < lines.length; i++) {
143
+ const m = RUNFLOW_LINE_RE.exec(lines[i]);
144
+ if (!m)
145
+ break;
146
+ names.push((m[1] ?? m[2]).trim());
147
+ }
148
+ return { names, rest: lines.slice(i).join("\n").replace(/^\n+/, "") };
149
+ }
150
+ /** Rewrite a flow's precondition block to exactly `names` (preserving the
151
+ * config header and the flow's own steps). */
152
+ function setPreconditions(content, names) {
153
+ const header = extractHeader(content).trimEnd();
154
+ const { rest } = extractPreconditions(content);
155
+ const pre = names.map((n) => `- runFlow: "${n.replace(/"/g, '\\"')}"`).join("\n");
156
+ const body = [pre, rest].filter((p) => p.trim().length > 0).join("\n");
157
+ if (!header)
158
+ return body;
159
+ return `${header}\n---\n${body}`;
160
+ }
161
+ // ── Entry URL ───────────────────────────────────────────────────────────────
162
+ const URL_HEADER_RE = /^[ \t]*url\s*:[ \t]*(.+?)[ \t]*$/m;
163
+ /** The flow's config `url:` (from the header block), or "" when absent. */
164
+ function extractUrl(content) {
165
+ return extractHeader(content).match(URL_HEADER_RE)?.[1]?.trim() ?? "";
166
+ }
167
+ /** True for a usable start URL — a real http(s) address that ISN'T the template
168
+ * `example.com/.org` placeholder every new flow ships with. */
169
+ function isRealUrl(url) {
170
+ return /^https?:\/\//i.test(url) && !/^https?:\/\/(www\.)?example\.(com|org)\/?$/i.test(url);
171
+ }
172
+ /** Set (or insert) the header `url:` to `url`, touching only the config block so
173
+ * step fields named `url` are never rewritten. */
174
+ function setUrl(content, url) {
175
+ const m = SEPARATOR_RE.exec(content);
176
+ const sepIdx = m ? content.indexOf(m[0]) : -1;
177
+ const header = sepIdx >= 0 ? content.slice(0, sepIdx) : content;
178
+ const rest = sepIdx >= 0 ? content.slice(sepIdx) : "";
179
+ const newHeader = URL_HEADER_RE.test(header)
180
+ ? header.replace(URL_HEADER_RE, `url: ${url}`)
181
+ : `url: ${url}\n${header}`;
182
+ return newHeader + rest;
183
+ }
184
+ /** The URL a run/mirror should actually START on: the flow's own real `url:`,
185
+ * otherwise the first precondition sub-flow's real URL (recursively). */
186
+ function effectiveEntryUrl(content, contentByName, visited = new Set()) {
187
+ const own = extractUrl(content);
188
+ if (isRealUrl(own))
189
+ return own;
190
+ const { names } = extractPreconditions(content);
191
+ for (const name of names) {
192
+ if (visited.has(name))
193
+ continue;
194
+ const sub = contentByName.get(name);
195
+ if (!sub)
196
+ continue;
197
+ const next = new Set(visited);
198
+ next.add(name);
199
+ const subUrl = effectiveEntryUrl(sub, contentByName, next);
200
+ if (isRealUrl(subUrl))
201
+ return subUrl;
202
+ }
203
+ return own;
204
+ }
205
+ // ── runFlow inlining ────────────────────────────────────────────────────────
206
+ const RUNFLOW_GLOBAL_RE = /^([ \t]*)(-[ \t]+)runFlow:[ \t]+(?:"([^"]+)"|'([^']+)')[ \t]*$/gm;
207
+ /**
208
+ * Replace `- runFlow: "Name"` lines with the inlined commands of the
209
+ * referenced flow (by name). Recursive, with visited-set cycle protection.
210
+ * `flowMap` maps a flow NAME to its body (use `extractBody` on the content).
211
+ * Unknown / visited names are left as-is.
212
+ */
213
+ function resolveRunFlowRefs(content, flowMap, visited) {
214
+ return content.replace(RUNFLOW_GLOBAL_RE, (match, indent, _dash, dq, sq) => {
215
+ const name = (dq ?? sq ?? "").trim();
216
+ if (!name || visited.has(name))
217
+ return match;
218
+ const body = flowMap.get(name);
219
+ if (!body)
220
+ return match;
221
+ const childVisited = new Set(visited);
222
+ childVisited.add(name);
223
+ const expanded = resolveRunFlowRefs(body, flowMap, childVisited);
224
+ const lines = expanded.split("\n");
225
+ const nonEmpty = lines.filter((l) => l.trim());
226
+ const minIndent = nonEmpty.length
227
+ ? Math.min(...nonEmpty.map((l) => (/^[ \t]*/.exec(l)?.[0] ?? "").length))
228
+ : 0;
229
+ return lines.map((line) => (line.trim() ? indent + line.slice(minIndent) : line)).join("\n");
230
+ });
231
+ }
232
+ /** Names of `- runFlow:` references still present in an EXPANDED body — i.e.
233
+ * sub-flows the library could not provide. Self-references (own name) are
234
+ * reported too; the caller decides whether that is an error. */
235
+ function listUnresolvedRunFlowRefs(expandedContent) {
236
+ const names = new Set();
237
+ for (const m of expandedContent.matchAll(RUNFLOW_GLOBAL_RE)) {
238
+ const name = (m[3] ?? m[4] ?? "").trim();
239
+ if (name)
240
+ names.add(name);
241
+ }
242
+ return [...names];
243
+ }
244
+ // ── Dataset ─────────────────────────────────────────────────────────────────
245
+ const TOKEN = /\{\{\s*([\w.$-]+)\s*\}\}/g;
246
+ /** Replace `{{key}}` occurrences in `content` with the matching dataset value.
247
+ * GUARDED: only keys present in the dataset are replaced. */
248
+ function applyDataset(content, dataset) {
249
+ if (!dataset)
250
+ return content;
251
+ const keys = Object.keys(dataset);
252
+ if (keys.length === 0)
253
+ return content;
254
+ return content.replace(TOKEN, (match, key) => Object.prototype.hasOwnProperty.call(dataset, key) ? dataset[key] : match);
255
+ }
256
+ /** The dataset keys referenced by `{{key}}` anywhere in `content`. */
257
+ function datasetKeysUsedIn(content) {
258
+ const used = new Set();
259
+ for (const m of content.matchAll(TOKEN))
260
+ used.add(m[1]);
261
+ return [...used];
262
+ }
263
+ /** The ONE default table for both sides. */
264
+ exports.RUN_SETTING_DEFAULTS = Object.freeze({
265
+ screenshotOnSuccess: true,
266
+ screenshotOnFailure: true,
267
+ autoRetryTransient: true,
268
+ captureNetwork: false,
269
+ });
270
+ /** Fill missing / null settings from the defaults. */
271
+ function resolveRunSettings(partial) {
272
+ const out = { ...exports.RUN_SETTING_DEFAULTS };
273
+ if (!partial)
274
+ return out;
275
+ for (const key of Object.keys(exports.RUN_SETTING_DEFAULTS)) {
276
+ const v = partial[key];
277
+ if (typeof v === "boolean")
278
+ out[key] = v;
279
+ }
280
+ return out;
281
+ }
282
+ // ── Mobile-only commands ────────────────────────────────────────────────────
283
+ /** Commands that only make sense on android/ios (the M mobile engine). A web
284
+ * run silently passes them; the desktop preflight and the server report warn.
285
+ * Keep in sync with the desktop step catalog's MOBILE_ONLY_STEP_KEYS. */
286
+ exports.MOBILE_ONLY_COMMANDS = new Set([
287
+ "launchApp",
288
+ "hideKeyboard",
289
+ "clearState",
290
+ "clearKeychain",
291
+ "killApp",
292
+ "stopApp",
293
+ "setLocation",
294
+ "setPermissions",
295
+ "setOrientation",
296
+ "setAirplaneMode",
297
+ "toggleAirplaneMode",
298
+ "travel",
299
+ "addMedia",
300
+ ]);
301
+ const STEP_KEY_RE = /^-[ \t]+([A-Za-z][\w-]*)\b/;
302
+ /** The distinct mobile-only commands used by the top-level steps of `body`. */
303
+ function findMobileOnlyCommands(body) {
304
+ const found = new Set();
305
+ for (const block of splitTopLevelSteps(extractBody(body))) {
306
+ const key = STEP_KEY_RE.exec(block.split("\n")[0])?.[1];
307
+ if (key && exports.MOBILE_ONLY_COMMANDS.has(key))
308
+ found.add(key);
309
+ }
310
+ return [...found];
311
+ }
312
+ function composeFlowForRun(input) {
313
+ const { flow, library } = input;
314
+ const flowMap = new Map();
315
+ const contentByName = new Map();
316
+ for (const f of library) {
317
+ if (!flowMap.has(f.name)) {
318
+ flowMap.set(f.name, applyDataset(extractBody(f.content), f.dataset));
319
+ contentByName.set(f.name, f.content);
320
+ }
321
+ }
322
+ const source = input.contentOverride ?? flow.content;
323
+ const expanded = resolveRunFlowRefs(source, flowMap, new Set([flow.name]));
324
+ let content = applyDataset(expanded, input.runDataset);
325
+ if (input.applyEntryUrlFallback &&
326
+ !input.contentOverride &&
327
+ flow.platform === "web" &&
328
+ !isRealUrl(extractUrl(flow.content))) {
329
+ const eff = effectiveEntryUrl(flow.content, contentByName);
330
+ if (isRealUrl(eff))
331
+ content = setUrl(content, eff);
332
+ }
333
+ return {
334
+ content,
335
+ flowMap,
336
+ entryUrl: extractUrl(content),
337
+ unresolved: listUnresolvedRunFlowRefs(content),
338
+ mobileOnly: findMobileOnlyCommands(content),
339
+ };
340
+ }
341
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/ui-test/compose.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "callman-core",
3
- "version": "1.23.0",
3
+ "version": "1.24.0",
4
4
  "main": "dist-cjs/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",