waygraph 0.12.17 → 0.12.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -238,8 +238,9 @@ snapshot, partitions edges by hash, and claims via in-process edge leases (audit
238
238
  `tone: "info" | "warning" | "danger" | "success"` (iconified captions), plus
239
239
  `size: "sm" | "md" | "lg"` and `weight: "normal" | "bold"`. Flow episode defaults:
240
240
  `withHighlightStyle(flow, { size, weight, tone? })` (slot/fixture wins). Episode pacing:
241
- `withDemoPace(flow, "fast" | "slow" | "normal" | "blitz")` or `withBlockPace(block, ...)`
242
- (FFCompose stays blitz). Living objectives: `docs/proposals/OBJECTIVES.md`.
241
+ `withDemoPace(flow, "fast" | "slow" | "normal" | "blitz" | number)` or `withBlockPace(block, ...)`
242
+ (`number` `<=20` = scale vs normal, e.g. `0.5` / `2`; `>20` = absolute ms, e.g. `4500`).
243
+ FFCompose stays blitz. Living objectives: `docs/proposals/OBJECTIVES.md`.
243
244
  `spawnTab(entry, page, mem)` drives a genuinely separate second tab through its own
244
245
  Block/Flow, in the same browser context an existing `page` already belongs to - the
245
246
  pattern `observe()` could already reach for (it's the only phase allowed to touch
package/dist/cli.js CHANGED
@@ -217,6 +217,10 @@ import {
217
217
  normalizeHighlightWeight,
218
218
  applyHighlightStyleDefaults,
219
219
  resolveStepDemoPace,
220
+ demoPaceGateMs,
221
+ demoPaceIsBlitz,
222
+ demoPaceIsFast,
223
+ demoPaceIsSlow,
220
224
  } from "waygraph";
221
225
 
222
226
  function walkDir(dir, pattern) {
@@ -1073,6 +1077,7 @@ async function cycleHighlightRings(page, highlights, gatesFast, opts) {
1073
1077
  // defaultHoldMs: when set (fail path), use instead of legacy 900/200 so BUG
1074
1078
  // rings stay visible ~2s before the error panel (PIA stubOnError RFC).
1075
1079
  const defaultHoldMs = opts && opts.defaultHoldMs != null ? opts.defaultHoldMs : null;
1080
+ const pace = opts && opts.pace !== undefined ? opts.pace : undefined;
1076
1081
  for (let i = 0; i < list.length; i++) {
1077
1082
  const h = list[i];
1078
1083
  try {
@@ -1082,7 +1087,7 @@ async function cycleHighlightRings(page, highlights, gatesFast, opts) {
1082
1087
  size: h.size,
1083
1088
  weight: h.weight,
1084
1089
  });
1085
- const authored = resolveFixtureDwellMs(h, { gatesFast });
1090
+ const authored = resolveFixtureDwellMs(h, { gatesFast, pace });
1086
1091
  const legacyMs = i === list.length - 1 ? 200 : 900;
1087
1092
  const holdMs =
1088
1093
  authored != null ? authored : defaultHoldMs != null ? defaultHoldMs : legacyMs;
@@ -1139,7 +1144,9 @@ async function renderAfterStep(page, info) {
1139
1144
  // it highlights something [else] and next," not just the first one.
1140
1145
  // duration / fastMode on stubAfter (or flow fixtures) override the legacy
1141
1146
  // 900ms / 200ms holds when set.
1142
- await cycleHighlightRings(page, highlights, gatesFast, null);
1147
+ await cycleHighlightRings(page, highlights, gatesFast, {
1148
+ pace: info.pace,
1149
+ });
1143
1150
  await page
1144
1151
  .evaluate((info) => {
1145
1152
  // Reused in place - see renderBeforeStep's own comment on this.
@@ -2160,13 +2167,10 @@ async function runStepMode(engine, start, end, context, page, mem, resolved, slo
2160
2167
  // gates too, not just skip its interaction dwell - otherwise autoplay
2161
2168
  // still stalls the full autoplayMs admiring a step that intentionally
2162
2169
  // ran too fast to watch.
2163
- const ms = pacing.skipTheater
2164
- ? Math.min(80, autoplayMs)
2165
- : pacing.gatesFast
2166
- ? Math.min(400, autoplayMs)
2167
- : pacing.gatesSlow
2168
- ? Math.max(autoplayMs * 2, 3500)
2169
- : autoplayMs;
2170
+ const ms = demoPaceGateMs(
2171
+ pacing.skipTheater ? "blitz" : pacing.demoPace,
2172
+ autoplayMs,
2173
+ );
2170
2174
  let elapsed = 0;
2171
2175
  for (;;) {
2172
2176
  // Re-read the checkbox EVERY loop tick, not once up front - a human
@@ -2249,31 +2253,32 @@ async function runStepMode(engine, start, end, context, page, mem, resolved, slo
2249
2253
  if ((clearSession || r.resetSession) && i > 0) {
2250
2254
  await resetPageState(context, page, baseURL);
2251
2255
  }
2252
- // gatesFast / skipTheater: opaque FF, former-FF inners (--ff-disabled/--ff-expand),
2253
- // WAYGRAPH_FAST_BLOCKS, or withDemoPace/withBlockPace. --fast alone = shorter
2254
- // gates only (keeps theater). Episode pace: block > flow > CLI --fast.
2256
+ // Episode pace: block > flow > CLI --fast (only when no authored pace).
2257
+ // Authoring wins: withDemoPace("slow"|2|4500) keeps slow dwell even under --fast.
2255
2258
  const stepPace = resolveStepDemoPace({
2256
2259
  blockPace: r.block.demoPace,
2257
2260
  flowPace: r.demoPace,
2258
2261
  fastForward: !!r.block.fastForward,
2259
2262
  wasFastForward: !!r.wasFastForward,
2260
2263
  });
2264
+ const authoredPace =
2265
+ (r.block.demoPace != null && r.block.demoPace !== "") ||
2266
+ (r.demoPace != null && r.demoPace !== "");
2261
2267
  const cliFast = demoFast || fastBlockNames.has(r.block.name);
2262
2268
  pacing.demoPace =
2263
- stepPace === "normal" && cliFast
2269
+ stepPace === "normal" && cliFast && !authoredPace
2264
2270
  ? fastBlockNames.has(r.block.name)
2265
2271
  ? "blitz"
2266
2272
  : "fast"
2267
2273
  : stepPace;
2268
2274
  pacing.gatesFast =
2269
- pacing.demoPace === "blitz" ||
2270
- pacing.demoPace === "fast" ||
2275
+ demoPaceIsFast(pacing.demoPace) ||
2271
2276
  !!r.block.fastForward ||
2272
2277
  !!r.wasFastForward ||
2273
- demoFast;
2274
- pacing.gatesSlow = pacing.demoPace === "slow";
2278
+ (!authoredPace && demoFast);
2279
+ pacing.gatesSlow = demoPaceIsSlow(pacing.demoPace);
2275
2280
  pacing.skipTheater =
2276
- pacing.demoPace === "blitz" ||
2281
+ demoPaceIsBlitz(pacing.demoPace) ||
2277
2282
  fastBlockNames.has(r.block.name) ||
2278
2283
  !!r.block.fastForward ||
2279
2284
  !!r.wasFastForward;
@@ -2387,6 +2392,7 @@ async function runStepMode(engine, start, end, context, page, mem, resolved, slo
2387
2392
  });
2388
2393
  await cycleHighlightRings(page, errHighlights, !!pacing.gatesFast, {
2389
2394
  defaultHoldMs: 2000,
2395
+ pace: pacing.demoPace,
2390
2396
  });
2391
2397
  }
2392
2398
  // A thrown act()/observe()/a failed verify Trait used to just crash
@@ -2480,6 +2486,7 @@ async function runStepMode(engine, start, end, context, page, mem, resolved, slo
2480
2486
  resultTag: JSON.stringify(result),
2481
2487
  highlights,
2482
2488
  gatesFast: pacing.gatesFast,
2489
+ pace: pacing.demoPace,
2483
2490
  isLast: i === resolved.length - 1,
2484
2491
  allNames: moduleNames,
2485
2492
  allDescriptions: moduleDescriptions,
package/dist/engine.d.ts CHANGED
@@ -269,6 +269,9 @@ export declare function withTitle<Out extends Checkpoint<string>>(flow: Flow<Out
269
269
  * Non-destructive. `fastForwardComposeBlock` is always blitz for its own step;
270
270
  * use this when an entire episode should be fast or slow.
271
271
  * @example withDemoPace(withTitle(gapFlow, "Episode 2 - gaps"), "slow")
272
+ * @example withDemoPace(happyFlow, 0.5) // 2x faster than normal
273
+ * @example withDemoPace(gapFlow, 2.5) // 2.5x slower
274
+ * @example withDemoPace(gapFlow, 4500) // absolute ~4.5s gates/dwells
272
275
  */
273
276
  export declare function withDemoPace<Out extends Checkpoint<string>>(flow: Flow<Out>, pace: DemoPace): Flow<Out>;
274
277
  /**
package/dist/engine.js CHANGED
@@ -357,6 +357,9 @@ export function withTitle(flow, title) {
357
357
  * Non-destructive. `fastForwardComposeBlock` is always blitz for its own step;
358
358
  * use this when an entire episode should be fast or slow.
359
359
  * @example withDemoPace(withTitle(gapFlow, "Episode 2 - gaps"), "slow")
360
+ * @example withDemoPace(happyFlow, 0.5) // 2x faster than normal
361
+ * @example withDemoPace(gapFlow, 2.5) // 2.5x slower
362
+ * @example withDemoPace(gapFlow, 4500) // absolute ~4.5s gates/dwells
360
363
  */
361
364
  export function withDemoPace(flow, pace) {
362
365
  const demoPace = pace;
@@ -106,12 +106,14 @@ export declare function toneIconPrefix(tone: HighlightTone): string;
106
106
  /**
107
107
  * Demo pacing for a Flow episode or a Block/compose group.
108
108
  * - `blitz` - FF-like: skip theater + short gates (same as fastForwardComposeBlock)
109
- * - `fast` - shorter gates, keep cursor theater
110
- * - `normal` - default demo pace
111
- * - `slow` - longer autoplay + fixture dwell (gaps / wrongs review)
109
+ * - `fast` - shorter gates, keep cursor theater (~0.33x normal)
110
+ * - `normal` - default demo pace (1x)
111
+ * - `slow` - longer autoplay + fixture dwell (~2x)
112
+ * - `number` - scale vs normal when `<= 20` (e.g. `0.5`, `1.5`, `3`);
113
+ * absolute gate/dwell ms when `> 20` (e.g. `4500`)
112
114
  */
113
- export type DemoPace = "blitz" | "fast" | "normal" | "slow";
114
- export declare function normalizeDemoPace(raw: unknown): DemoPace;
115
+ export type DemoPaceName = "blitz" | "fast" | "normal" | "slow";
116
+ export type DemoPace = DemoPaceName | number;
115
117
  /** Default fixture dwell when `duration: true`. */
116
118
  export declare const FIXTURE_DURATION_MS_DEFAULT = 2000;
117
119
  /** Default fixture dwell under `--fast` when duration is enabled. */
@@ -122,9 +124,21 @@ export declare const FIXTURE_DURATION_SLOW_MS_DEFAULT = 4000;
122
124
  export declare const SLIDE_DURATION_MS_DEFAULT = 2000;
123
125
  /** @deprecated Prefer FIXTURE_DURATION_FAST_MS_DEFAULT */
124
126
  export declare const SLIDE_DURATION_FAST_MS_DEFAULT = 600;
127
+ export declare function normalizeDemoPace(raw: unknown): DemoPace;
128
+ /** Named / numeric pace -> scale vs normal (1 = normal). Absolute ms (>20) maps via default dwell. */
129
+ export declare function demoPaceScale(pace: DemoPace): number;
130
+ export declare function demoPaceIsBlitz(pace: DemoPace): boolean;
131
+ /** True when pace should use the short-gate / fast fixture path (not slow authored). */
132
+ export declare function demoPaceIsFast(pace: DemoPace): boolean;
133
+ export declare function demoPaceIsSlow(pace: DemoPace): boolean;
134
+ /** Autoplay / Next-gate ms for this pace (base is WAYGRAPH_AUTOPLAY_MS or 1800). */
135
+ export declare function demoPaceGateMs(pace: DemoPace, baseAutoplayMs: number): number;
125
136
  /**
126
137
  * Resolve min dwell ms for any fixture (stub / flow fixture / yap slide),
127
138
  * or `null` when duration is unset (caller keeps legacy timing).
139
+ *
140
+ * Authoring wins: an explicit slow/numeric pace is not crushed by CLI `--fast`
141
+ * (`gatesFast`). `--fast` only shortens when pace is unset/normal.
128
142
  */
129
143
  export declare function resolveFixtureDwellMs(fixture: FixtureDurationFields, opts?: {
130
144
  gatesFast?: boolean;
@@ -140,8 +154,8 @@ export declare function resolveSlideDwellMs(slide: FixtureDurationFields, opts?:
140
154
  * Opaque FF / wasFastForward always win as blitz.
141
155
  */
142
156
  export declare function resolveStepDemoPace(opts: {
143
- blockPace?: DemoPace | string | null;
144
- flowPace?: DemoPace | string | null;
157
+ blockPace?: DemoPace | string | number | null;
158
+ flowPace?: DemoPace | string | number | null;
145
159
  fastForward?: boolean;
146
160
  wasFastForward?: boolean;
147
161
  }): DemoPace;
@@ -79,18 +79,6 @@ export function toneIconPrefix(tone) {
79
79
  const icon = TONE_ICONS[tone];
80
80
  return icon ? `[${icon}] ` : "";
81
81
  }
82
- export function normalizeDemoPace(raw) {
83
- if (typeof raw !== "string")
84
- return "normal";
85
- const t = raw.trim().toLowerCase();
86
- if (t === "blitz" || t === "ff")
87
- return "blitz";
88
- if (t === "fast" || t === "quick")
89
- return "fast";
90
- if (t === "slow" || t === "careful" || t === "review")
91
- return "slow";
92
- return "normal";
93
- }
94
82
  /** Default fixture dwell when `duration: true`. */
95
83
  export const FIXTURE_DURATION_MS_DEFAULT = 2000;
96
84
  /** Default fixture dwell under `--fast` when duration is enabled. */
@@ -101,24 +89,112 @@ export const FIXTURE_DURATION_SLOW_MS_DEFAULT = 4000;
101
89
  export const SLIDE_DURATION_MS_DEFAULT = FIXTURE_DURATION_MS_DEFAULT;
102
90
  /** @deprecated Prefer FIXTURE_DURATION_FAST_MS_DEFAULT */
103
91
  export const SLIDE_DURATION_FAST_MS_DEFAULT = FIXTURE_DURATION_FAST_MS_DEFAULT;
92
+ export function normalizeDemoPace(raw) {
93
+ if (typeof raw === "number" && Number.isFinite(raw) && raw > 0)
94
+ return raw;
95
+ if (typeof raw === "string") {
96
+ const t = raw.trim().toLowerCase();
97
+ if (t === "blitz" || t === "ff")
98
+ return "blitz";
99
+ if (t === "fast" || t === "quick")
100
+ return "fast";
101
+ if (t === "slow" || t === "careful" || t === "review")
102
+ return "slow";
103
+ if (t === "normal" || t === "default" || t === "1x")
104
+ return "normal";
105
+ // "2x" / "0.5x"
106
+ if (t.endsWith("x")) {
107
+ const n = Number(t.slice(0, -1));
108
+ if (Number.isFinite(n) && n > 0)
109
+ return n;
110
+ }
111
+ const n = Number(t);
112
+ if (Number.isFinite(n) && n > 0)
113
+ return n;
114
+ }
115
+ return "normal";
116
+ }
117
+ /** Named / numeric pace -> scale vs normal (1 = normal). Absolute ms (>20) maps via default dwell. */
118
+ export function demoPaceScale(pace) {
119
+ if (typeof pace === "number") {
120
+ if (pace > 20)
121
+ return Math.min(10, Math.max(0.05, pace / FIXTURE_DURATION_MS_DEFAULT));
122
+ return Math.min(10, Math.max(0.05, pace));
123
+ }
124
+ if (pace === "blitz")
125
+ return 0.05;
126
+ if (pace === "fast")
127
+ return 0.33;
128
+ if (pace === "slow")
129
+ return 2;
130
+ return 1;
131
+ }
132
+ export function demoPaceIsBlitz(pace) {
133
+ return pace === "blitz" || (typeof pace === "number" && pace > 0 && pace <= 0.1);
134
+ }
135
+ /** True when pace should use the short-gate / fast fixture path (not slow authored). */
136
+ export function demoPaceIsFast(pace) {
137
+ if (demoPaceIsBlitz(pace))
138
+ return true;
139
+ if (pace === "fast")
140
+ return true;
141
+ if (typeof pace === "number" && pace <= 20)
142
+ return pace < 0.75;
143
+ return false;
144
+ }
145
+ export function demoPaceIsSlow(pace) {
146
+ if (pace === "slow")
147
+ return true;
148
+ if (typeof pace === "number") {
149
+ if (pace > 20)
150
+ return pace >= 3000;
151
+ return pace > 1.25;
152
+ }
153
+ return false;
154
+ }
155
+ /** Autoplay / Next-gate ms for this pace (base is WAYGRAPH_AUTOPLAY_MS or 1800). */
156
+ export function demoPaceGateMs(pace, baseAutoplayMs) {
157
+ if (demoPaceIsBlitz(pace))
158
+ return Math.min(80, baseAutoplayMs);
159
+ if (typeof pace === "number" && pace > 20) {
160
+ return Math.min(30000, Math.max(80, Math.round(pace)));
161
+ }
162
+ const scale = demoPaceScale(pace);
163
+ return Math.min(30000, Math.max(80, Math.round(baseAutoplayMs * scale)));
164
+ }
104
165
  /**
105
166
  * Resolve min dwell ms for any fixture (stub / flow fixture / yap slide),
106
167
  * or `null` when duration is unset (caller keeps legacy timing).
168
+ *
169
+ * Authoring wins: an explicit slow/numeric pace is not crushed by CLI `--fast`
170
+ * (`gatesFast`). `--fast` only shortens when pace is unset/normal.
107
171
  */
108
172
  export function resolveFixtureDwellMs(fixture, opts) {
109
173
  if (fixture.duration === undefined || fixture.duration === false)
110
174
  return null;
111
- const pace = normalizeDemoPace(opts?.pace ?? (opts?.gatesFast ? "fast" : "normal"));
175
+ const pace = opts?.pace !== undefined && opts.pace !== null
176
+ ? normalizeDemoPace(opts.pace)
177
+ : opts?.gatesFast
178
+ ? "fast"
179
+ : "normal";
112
180
  const fastMs = typeof fixture.fastMode === "number" && Number.isFinite(fixture.fastMode) && fixture.fastMode >= 0
113
181
  ? fixture.fastMode
114
182
  : FIXTURE_DURATION_FAST_MS_DEFAULT;
115
- if (pace === "blitz" || pace === "fast" || opts?.gatesFast)
116
- return fastMs;
117
183
  const normalMs = fixture.duration === true
118
184
  ? FIXTURE_DURATION_MS_DEFAULT
119
185
  : typeof fixture.duration === "number" && Number.isFinite(fixture.duration) && fixture.duration >= 0
120
186
  ? fixture.duration
121
187
  : FIXTURE_DURATION_MS_DEFAULT;
188
+ if (typeof pace === "number") {
189
+ if (pace > 20)
190
+ return Math.round(pace);
191
+ return Math.max(0, Math.round(normalMs * Math.min(10, Math.max(0.05, pace))));
192
+ }
193
+ if (pace === "blitz" || pace === "fast")
194
+ return fastMs;
195
+ // CLI --fast only when author left pace at normal
196
+ if (opts?.gatesFast && pace === "normal")
197
+ return fastMs;
122
198
  if (pace === "slow")
123
199
  return Math.max(normalMs, FIXTURE_DURATION_SLOW_MS_DEFAULT);
124
200
  return normalMs;
package/dist/index.d.ts CHANGED
@@ -3,8 +3,8 @@ export { connect, checkpoint } from "./types.js";
3
3
  export { MemKey, MemPage, key, keyGroup } from "./mem-page.js";
4
4
  export { Trait, urlMatches, textEquals, visible } from "./trait.js";
5
5
  export { runGraph, spawnTab, narrate, Engine, start, end, branch, withVerify, modVerify, modVerifyAll, defineBlock, defineNavBlock, defineNavClickBlock, defineMethodBlock, defineActionBlock, definePageBlock, defineEffectBlock, defineMemEffectBlock, defineMemNavBlock, locate, composeBlock, fastForwardComposeBlock, isFastForwardBlock, preflight, withSessionReset, withTitle, withDemoPace, withBlockPace, withHighlightStyle, withExpectedFailure, withHighlightFixtures, chainFlow, } from "./engine.js";
6
- export { resolveHighlightSlots, resolveSlides, resolveFixtureDwellMs, resolveSlideDwellMs, formatHighlightCaption, hasAuthoredStubAfter, hasAuthoredStubOnError, normalizeHighlightTone, normalizeDemoPace, normalizeHighlightSize, normalizeHighlightWeight, applyHighlightStyleDefaults, toneIconPrefix, resolveStepDemoPace, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT, SLIDE_DURATION_MS_DEFAULT, SLIDE_DURATION_FAST_MS_DEFAULT, } from "./highlights.js";
7
- export type { WaygraphHighlightStub, WaygraphHighlightFixture, WaygraphSlide, FixtureDurationFields, HighlightStubPhase, HighlightStubPhaseName, HighlightFixtureMap, ResolvedHighlight, WaygraphHighlight, HighlightTone, HighlightSize, HighlightWeight, HighlightStyleDefaults, DemoPace, } from "./highlights.js";
6
+ export { resolveHighlightSlots, resolveSlides, resolveFixtureDwellMs, resolveSlideDwellMs, formatHighlightCaption, hasAuthoredStubAfter, hasAuthoredStubOnError, normalizeHighlightTone, normalizeDemoPace, normalizeHighlightSize, normalizeHighlightWeight, applyHighlightStyleDefaults, toneIconPrefix, resolveStepDemoPace, demoPaceScale, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, demoPaceGateMs, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT, SLIDE_DURATION_MS_DEFAULT, SLIDE_DURATION_FAST_MS_DEFAULT, } from "./highlights.js";
7
+ export type { WaygraphHighlightStub, WaygraphHighlightFixture, WaygraphSlide, FixtureDurationFields, HighlightStubPhase, HighlightStubPhaseName, HighlightFixtureMap, ResolvedHighlight, WaygraphHighlight, HighlightTone, HighlightSize, HighlightWeight, HighlightStyleDefaults, DemoPace, DemoPaceName, } from "./highlights.js";
8
8
  export type { Flow, EngineConfig, ComposedBlock, FastForwardComposedBlock, RunGraphOptions, BlockInfo, NavBlock, NavBlockOptions, NavClickBlock, NavClickBlockOptions, MethodBlock, ActionBlock, PageBlock, PageBlockOptions, PageMethodEntry, EffectBlock, MemEffectBlock, MemNavBlock, } from "./engine.js";
9
9
  export type { ActionPage } from "./types.js";
10
10
  export { discoverGraph, toMermaid, findOrphanBlocks, findBlockPath } from "./graph.js";
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ export { connect, checkpoint } from "./types.js";
2
2
  export { MemKey, MemPage, key, keyGroup } from "./mem-page.js";
3
3
  export { Trait, urlMatches, textEquals, visible } from "./trait.js";
4
4
  export { runGraph, spawnTab, narrate, Engine, start, end, branch, withVerify, modVerify, modVerifyAll, defineBlock, defineNavBlock, defineNavClickBlock, defineMethodBlock, defineActionBlock, definePageBlock, defineEffectBlock, defineMemEffectBlock, defineMemNavBlock, locate, composeBlock, fastForwardComposeBlock, isFastForwardBlock, preflight, withSessionReset, withTitle, withDemoPace, withBlockPace, withHighlightStyle, withExpectedFailure, withHighlightFixtures, chainFlow, } from "./engine.js";
5
- export { resolveHighlightSlots, resolveSlides, resolveFixtureDwellMs, resolveSlideDwellMs, formatHighlightCaption, hasAuthoredStubAfter, hasAuthoredStubOnError, normalizeHighlightTone, normalizeDemoPace, normalizeHighlightSize, normalizeHighlightWeight, applyHighlightStyleDefaults, toneIconPrefix, resolveStepDemoPace, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT, SLIDE_DURATION_MS_DEFAULT, SLIDE_DURATION_FAST_MS_DEFAULT, } from "./highlights.js";
5
+ export { resolveHighlightSlots, resolveSlides, resolveFixtureDwellMs, resolveSlideDwellMs, formatHighlightCaption, hasAuthoredStubAfter, hasAuthoredStubOnError, normalizeHighlightTone, normalizeDemoPace, normalizeHighlightSize, normalizeHighlightWeight, applyHighlightStyleDefaults, toneIconPrefix, resolveStepDemoPace, demoPaceScale, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, demoPaceGateMs, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT, SLIDE_DURATION_MS_DEFAULT, SLIDE_DURATION_FAST_MS_DEFAULT, } from "./highlights.js";
6
6
  export { discoverGraph, toMermaid, findOrphanBlocks, findBlockPath } from "./graph.js";
7
7
  export { isFileSelectToken, parseBlocksSelect, matchBlocksSelect, globToRegExp, } from "./blocks-select.js";
8
8
  export { EdgeLeaseCoordinator } from "./traverse-lease.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "waygraph",
3
- "version": "0.12.17",
3
+ "version": "0.12.18",
4
4
  "type": "module",
5
5
  "description": "A typed graph of reusable Blocks for driving a browser through E2E flows.",
6
6
  "license": "MIT",