@automatalabs/workflows 0.48.1 → 0.50.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.
@@ -126,6 +126,60 @@ export declare const MOCK_TOKENS_PER_AGENT = 1000;
126
126
  /** Maximum advertised model count for client-side ordered thought-domain enumeration.
127
127
  * Larger catalogs stay on exact advertised-value validation so zero-token validation remains bounded. */
128
128
  export declare const ORDERED_THOUGHT_LEVEL_ENUMERATION_MODEL_LIMIT = 32;
129
+ type SelectConfigOption = Extract<SessionConfigOption, {
130
+ type: "select";
131
+ }>;
132
+ /** Every leaf {value,label} the select advertises, flattening any advertised optgroups. */
133
+ export declare function selectChoicePairs(option: SelectConfigOption): {
134
+ value: string;
135
+ label?: string;
136
+ }[];
137
+ /**
138
+ * Above this many advertised choices, a select's inline enumeration is replaced by a
139
+ * grouped summary in every RENDERED surface — the human table AND `--json` — so a harness
140
+ * with a huge model catalog (pi, opencode) cannot flood an agent's context on either flag.
141
+ * The complete list stays in the in-memory report (validation reads it, SDK embedders get
142
+ * it) and is reachable only through the explicit `config <harness> --models[=<filter>]`
143
+ * path. Small catalogs — claude, codex, and every effort/mode/boolean option — stay under
144
+ * this bound and render verbatim, unchanged.
145
+ */
146
+ export declare const MAX_INLINE_SELECT_CHOICES = 24;
147
+ export interface SelectChoiceGroup {
148
+ group: string;
149
+ count: number;
150
+ }
151
+ export interface SelectChoiceSummary {
152
+ total: number;
153
+ groups: SelectChoiceGroup[];
154
+ }
155
+ /**
156
+ * Group a select's choices for summary display. Prefers the harness-advertised optgroup
157
+ * labels; absent those, groups by the first "/"-segment of each value. Groups come back
158
+ * largest-first, ties broken by first appearance.
159
+ */
160
+ export declare function summarizeSelectChoices(option: SelectConfigOption): SelectChoiceSummary;
161
+ /** A select whose leaf-choice count exceeds the inline bound — rendered as a summary. */
162
+ export declare function isOversizedSelect(option: SessionConfigOption): option is SelectConfigOption;
163
+ /** A select option reshaped for SERIALIZED output (--json): the huge `options` leaf array
164
+ * is dropped in favor of a compact grouped summary. Every scalar field is preserved. */
165
+ export type CollapsedSelectOption = Omit<SelectConfigOption, "options"> & {
166
+ truncated: true;
167
+ choiceSummary: SelectChoiceSummary & {
168
+ expand: string;
169
+ };
170
+ };
171
+ export type RenderedConfigOption = SessionConfigOption | CollapsedSelectOption;
172
+ export interface RenderedHarnessOptions extends Omit<ValidateHarnessOptions, "options"> {
173
+ options?: RenderedConfigOption[];
174
+ }
175
+ /**
176
+ * Collapse each harness's oversized select options for serialized (`--json`) output — the
177
+ * only place the full catalog would otherwise reach an agent's context through a machine
178
+ * flag. Small options and every non-select option pass through untouched. Applied ONLY at
179
+ * the CLI print boundary; the in-memory report keeps the complete catalog so validation
180
+ * and programmatic `probeHarnessConfig()` callers are unaffected.
181
+ */
182
+ export declare function collapseHarnessOptionsForOutput(harnesses: readonly ValidateHarnessOptions[] | undefined): RenderedHarnessOptions[] | undefined;
129
183
  /**
130
184
  * Validate a workflow script: parse it, dry-run against a mock AgentRunner, then probe
131
185
  * each routed backend/model pair's advertised config options. Never throws for an invalid script —
@@ -138,4 +192,5 @@ export declare function validateWorkflowScript(script: string, options?: Validat
138
192
  export declare function renderHarnessOptionLines(harnesses: readonly ValidateHarnessOptions[], indent: string): string[];
139
193
  /** Render a ValidateWorkflowReport as the human-readable CLI output. */
140
194
  export declare function formatValidateReport(report: ValidateWorkflowReport): string;
195
+ export {};
141
196
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/dist/validate.js CHANGED
@@ -959,12 +959,107 @@ function clampSelectValue(requested, supported, recognized) {
959
959
  function selectChoiceValues(option) {
960
960
  return option.options.flatMap((entry) => ("options" in entry ? entry.options : [entry])).map((entry) => entry.value);
961
961
  }
962
+ /** Every leaf {value,label} the select advertises, flattening any advertised optgroups. */
963
+ export function selectChoicePairs(option) {
964
+ return option.options
965
+ .flatMap((entry) => ("options" in entry ? entry.options : [entry]))
966
+ .map((entry) => ({ value: entry.value, label: entry.name }));
967
+ }
968
+ /**
969
+ * Above this many advertised choices, a select's inline enumeration is replaced by a
970
+ * grouped summary in every RENDERED surface — the human table AND `--json` — so a harness
971
+ * with a huge model catalog (pi, opencode) cannot flood an agent's context on either flag.
972
+ * The complete list stays in the in-memory report (validation reads it, SDK embedders get
973
+ * it) and is reachable only through the explicit `config <harness> --models[=<filter>]`
974
+ * path. Small catalogs — claude, codex, and every effort/mode/boolean option — stay under
975
+ * this bound and render verbatim, unchanged.
976
+ */
977
+ export const MAX_INLINE_SELECT_CHOICES = 24;
978
+ /** The group a bare (ungrouped) choice value belongs to: its first "/"-segment
979
+ * (pi/opencode ids are "<provider>/<model>"); a value with no "/" is "(ungrouped)". */
980
+ function groupOfValue(value) {
981
+ const slash = value.indexOf("/");
982
+ return slash > 0 ? value.slice(0, slash) : "(ungrouped)";
983
+ }
984
+ /**
985
+ * Group a select's choices for summary display. Prefers the harness-advertised optgroup
986
+ * labels; absent those, groups by the first "/"-segment of each value. Groups come back
987
+ * largest-first, ties broken by first appearance.
988
+ */
989
+ export function summarizeSelectChoices(option) {
990
+ const counts = new Map();
991
+ const order = [];
992
+ const bump = (name, n) => {
993
+ if (!counts.has(name))
994
+ order.push(name);
995
+ counts.set(name, (counts.get(name) ?? 0) + n);
996
+ };
997
+ const hasAdvertisedGroups = option.options.some((entry) => "options" in entry);
998
+ for (const entry of option.options) {
999
+ if ("options" in entry)
1000
+ bump(entry.name ?? entry.group, entry.options.length);
1001
+ else if (hasAdvertisedGroups)
1002
+ bump(groupOfValue(entry.value), 1); // stray leaf beside groups
1003
+ else
1004
+ bump(groupOfValue(entry.value), 1);
1005
+ }
1006
+ const total = [...counts.values()].reduce((sum, n) => sum + n, 0);
1007
+ const groups = order
1008
+ .map((group) => ({ group, count: counts.get(group) ?? 0 }))
1009
+ .sort((a, b) => b.count - a.count || order.indexOf(a.group) - order.indexOf(b.group));
1010
+ return { total, groups };
1011
+ }
1012
+ /** A select whose leaf-choice count exceeds the inline bound — rendered as a summary. */
1013
+ export function isOversizedSelect(option) {
1014
+ return option.type === "select" && selectChoicePairs(option).length > MAX_INLINE_SELECT_CHOICES;
1015
+ }
1016
+ /** The collapsed choices-cell for an oversized select in the human option table. */
1017
+ function summaryChoicesCell(option, backendId) {
1018
+ const { total, groups } = summarizeSelectChoices(option);
1019
+ const shown = groups.slice(0, 3).map((group) => `${group.group} (${group.count})`).join(", ");
1020
+ const more = groups.length > 3 ? ", …" : "";
1021
+ return (`${total} choices across ${groups.length} group(s): ${shown}${more} — ` +
1022
+ `list with \`config ${backendId} --models[=<filter>]\``);
1023
+ }
962
1024
  function displayValue(value) {
963
1025
  return JSON.stringify(value) ?? String(value);
964
1026
  }
965
1027
  function displayAlternatives(values) {
966
1028
  return values.length > 0 ? values.map((value) => JSON.stringify(value)).join(", ") : "(none advertised)";
967
1029
  }
1030
+ /** The choices-cell text for a select: verbatim when small, summarized when oversized. */
1031
+ function selectChoicesCell(option, backendId) {
1032
+ return isOversizedSelect(option)
1033
+ ? summaryChoicesCell(option, backendId)
1034
+ : displayAlternatives(selectChoiceValues(option));
1035
+ }
1036
+ function collapseSelectOption(option, backendId) {
1037
+ const { options: _leaves, ...scalars } = option;
1038
+ return {
1039
+ ...scalars,
1040
+ truncated: true,
1041
+ choiceSummary: { ...summarizeSelectChoices(option), expand: `config ${backendId} --models=<filter>` },
1042
+ };
1043
+ }
1044
+ /**
1045
+ * Collapse each harness's oversized select options for serialized (`--json`) output — the
1046
+ * only place the full catalog would otherwise reach an agent's context through a machine
1047
+ * flag. Small options and every non-select option pass through untouched. Applied ONLY at
1048
+ * the CLI print boundary; the in-memory report keeps the complete catalog so validation
1049
+ * and programmatic `probeHarnessConfig()` callers are unaffected.
1050
+ */
1051
+ export function collapseHarnessOptionsForOutput(harnesses) {
1052
+ if (!harnesses)
1053
+ return harnesses === undefined ? undefined : [];
1054
+ return harnesses.map((harness) => {
1055
+ if (!harness.options)
1056
+ return harness;
1057
+ return {
1058
+ ...harness,
1059
+ options: harness.options.map((option) => isOversizedSelect(option) ? collapseSelectOption(option, harness.backendId) : option),
1060
+ };
1061
+ });
1062
+ }
968
1063
  /**
969
1064
  * Validate a workflow script: parse it, dry-run against a mock AgentRunner, then probe
970
1065
  * each routed backend/model pair's advertised config options. Never throws for an invalid script —
@@ -1211,7 +1306,7 @@ export function renderHarnessOptionLines(harnesses, indent) {
1211
1306
  continue;
1212
1307
  }
1213
1308
  for (const option of harness.options ?? []) {
1214
- const choices = option.type === "select" ? displayAlternatives(selectChoiceValues(option)) : "true, false";
1309
+ const choices = option.type === "select" ? selectChoicesCell(option, harness.backendId) : "true, false";
1215
1310
  lines.push(`${indent} ${option.id} | ${option.type} | ${displayValue(option.currentValue)} | ${choices}`);
1216
1311
  }
1217
1312
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automatalabs/workflows",
3
- "version": "0.48.1",
3
+ "version": "0.50.0",
4
4
  "license": "Apache-2.0",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -31,16 +31,16 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "typebox": "1.3.2",
34
- "@automatalabs/repl-engine": "0.3.1",
35
- "@automatalabs/shared-types": "0.30.0",
36
- "@automatalabs/workflow-engine": "0.36.0",
37
- "@automatalabs/acp-agents": "0.37.3"
34
+ "@automatalabs/repl-engine": "0.3.3",
35
+ "@automatalabs/shared-types": "0.31.0",
36
+ "@automatalabs/acp-agents": "0.38.0",
37
+ "@automatalabs/workflow-engine": "0.36.1"
38
38
  },
39
39
  "devDependencies": {
40
40
  "esbuild": "^0.28.1"
41
41
  },
42
42
  "scripts": {
43
- "build": "node ../../scripts/ensure-run-monitor-html.mjs && tsc -b && esbuild ../mcp-server/src/entry.ts --bundle --platform=node --format=esm --target=node22 --external:@automatalabs/* --outfile=dist/mcp-server.js && node ../../scripts/check-workflows-bundle-deps.mjs",
43
+ "build": "node ../../scripts/ensure-run-monitor-html.mjs && tsc -b && node scripts/bundle-mcp-server.mjs && node ../../scripts/check-workflows-bundle-deps.mjs",
44
44
  "typecheck": "tsc -p tsconfig.test.json --noEmit",
45
45
  "test": "tsx --test \"test/**/*.test.ts\""
46
46
  }