@almadar/core 10.30.0 → 10.32.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/{builders-C458pIMW.d.ts → builders-CnPRr1cq.d.ts} +688 -688
- package/dist/builders.d.ts +4 -4
- package/dist/builders.js +10 -6
- package/dist/builders.js.map +1 -1
- package/dist/{pattern-types-CLcOXOmW.d.ts → effect-8eas3tpU.d.ts} +1559 -39
- package/dist/{expression-CB9R3KWk.d.ts → expression-BlFrxmNB.d.ts} +1 -1
- package/dist/factory/index.d.ts +6 -6
- package/dist/factory-runtime/index.d.ts +4 -4
- package/dist/factory-runtime/index.js +10 -6
- package/dist/factory-runtime/index.js.map +1 -1
- package/dist/index.d.ts +30 -12
- package/dist/index.js +1490 -1029
- package/dist/index.js.map +1 -1
- package/dist/patterns/component-mapping.json +13 -3
- package/dist/patterns/event-contracts.json +23 -3
- package/dist/patterns/index.d.ts +2189 -1056
- package/dist/patterns/index.js +992 -616
- package/dist/patterns/index.js.map +1 -1
- package/dist/patterns/patterns-registry.json +1102 -777
- package/dist/patterns/registry.json +1102 -777
- package/dist/state-machine/index.d.ts +13 -2
- package/dist/state-machine/index.js +48 -23
- package/dist/state-machine/index.js.map +1 -1
- package/dist/{trait-CwWjkU-1.d.ts → trait-CMGaEccZ.d.ts} +53 -1503
- package/dist/types/index.d.ts +11 -11
- package/dist/types/index.js +21 -17
- package/dist/types/index.js.map +1 -1
- package/dist/{types-yW22YNNt.d.ts → types-B6IYPXZM.d.ts} +2 -3
- package/package.json +1 -1
- package/dist/json-DOTchoRS.d.ts +0 -57
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as EventPayload, S as SExpr } from '../expression-BlFrxmNB.js';
|
|
2
2
|
import 'zod';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -216,6 +216,17 @@ declare function walkStatePairs(transitions: GraphTransition[], initialState: st
|
|
|
216
216
|
* extractPayloadFieldRef('@user.name'); // returns null
|
|
217
217
|
*/
|
|
218
218
|
declare function extractPayloadFieldRef(ref: unknown): string | null;
|
|
219
|
+
/**
|
|
220
|
+
* Full dotted path of a payload reference — `'@payload.data.providerName'`
|
|
221
|
+
* → `['data', 'providerName']`. `extractPayloadFieldRef` keeps only the
|
|
222
|
+
* first segment, which made every guard on a NESTED payload field
|
|
223
|
+
* unsatisfiable by synthesis: `when ?data.providerName` was seeded as
|
|
224
|
+
* `{data: 'mock-test-value'}`, the runtime read `.providerName` off a
|
|
225
|
+
* string, and the pass-case dispatch was correctly rejected (std-booking
|
|
226
|
+
* BookingWizard NEXT — the whole step chain became unwalkable). Returns
|
|
227
|
+
* `null` for non-payload references.
|
|
228
|
+
*/
|
|
229
|
+
declare function extractPayloadFieldPath(ref: unknown): string[] | null;
|
|
219
230
|
/**
|
|
220
231
|
* Builds test payloads that satisfy or violate guard conditions.
|
|
221
232
|
*
|
|
@@ -344,4 +355,4 @@ declare function buildReplayPaths(transitions: ReplayTransition[], initialState:
|
|
|
344
355
|
*/
|
|
345
356
|
declare function buildEdgeCoveringWalk(transitions: EdgeWalkTransition[], initialState: string): WalkStep[];
|
|
346
357
|
|
|
347
|
-
export { type BFSNode, type BFSPathNode, type EdgeWalkTransition, type GraphTransition, type GuardPayload, type PayloadFieldSchema, type ReplayStep, type ReplayTransition, type StateEdge, type WalkStep, buildEdgeCoveringWalk, buildGuardPayloads, buildReplayPaths, buildStateGraph, collectReachableStates, constTruth, extractPayloadFieldRef, walkStatePairs };
|
|
358
|
+
export { type BFSNode, type BFSPathNode, type EdgeWalkTransition, type GraphTransition, type GuardPayload, type PayloadFieldSchema, type ReplayStep, type ReplayTransition, type StateEdge, type WalkStep, buildEdgeCoveringWalk, buildGuardPayloads, buildReplayPaths, buildStateGraph, collectReachableStates, constTruth, extractPayloadFieldPath, extractPayloadFieldRef, walkStatePairs };
|
|
@@ -59,6 +59,29 @@ function extractPayloadFieldRef(ref) {
|
|
|
59
59
|
const match = ref.match(/^@payload\.([A-Za-z0-9_]+)/);
|
|
60
60
|
return match ? match[1] : null;
|
|
61
61
|
}
|
|
62
|
+
function extractPayloadFieldPath(ref) {
|
|
63
|
+
if (typeof ref !== "string") return null;
|
|
64
|
+
const match = ref.match(/^@payload\.([A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)*)/);
|
|
65
|
+
return match ? match[1].split(".") : null;
|
|
66
|
+
}
|
|
67
|
+
function nestedPayload(path, leaf) {
|
|
68
|
+
let value = leaf;
|
|
69
|
+
for (let i = path.length - 1; i >= 1; i--) {
|
|
70
|
+
value = { [path[i]]: value };
|
|
71
|
+
}
|
|
72
|
+
return { [path[0]]: value };
|
|
73
|
+
}
|
|
74
|
+
function isPayloadObject(v) {
|
|
75
|
+
return typeof v === "object" && v !== null && !Array.isArray(v) && !(v instanceof Date);
|
|
76
|
+
}
|
|
77
|
+
function mergePayloads(a, b) {
|
|
78
|
+
const out = { ...a };
|
|
79
|
+
for (const [k, v] of Object.entries(b)) {
|
|
80
|
+
const prev = out[k];
|
|
81
|
+
out[k] = prev !== void 0 && isPayloadObject(prev) && v !== void 0 && isPayloadObject(v) ? mergePayloads(prev, v) : v;
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
62
85
|
function constTruth(guard) {
|
|
63
86
|
if (typeof guard === "boolean") return guard;
|
|
64
87
|
if (typeof guard === "string") {
|
|
@@ -97,62 +120,64 @@ function buildGuardPayloads(guard) {
|
|
|
97
120
|
return { pass: {}, fail: {} };
|
|
98
121
|
}
|
|
99
122
|
if (typeof guard === "string") {
|
|
100
|
-
const
|
|
101
|
-
if (
|
|
123
|
+
const path = extractPayloadFieldPath(guard);
|
|
124
|
+
if (path) {
|
|
125
|
+
return path.length === 1 ? { pass: { [path[0]]: { id: "mock-test-id", name: "mock-test-name" } }, fail: { [path[0]]: null } } : { pass: nestedPayload(path, "mock-test-value"), fail: nestedPayload(path, null) };
|
|
126
|
+
}
|
|
102
127
|
}
|
|
103
128
|
if (!Array.isArray(guard) || guard.length === 0) {
|
|
104
129
|
return { pass: {}, fail: {} };
|
|
105
130
|
}
|
|
106
131
|
const op = String(guard[0]);
|
|
107
132
|
if (op === "not-nil" || op === "not_nil") {
|
|
108
|
-
const
|
|
109
|
-
if (
|
|
133
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
134
|
+
if (path) return { pass: nestedPayload(path, "mock-test-value"), fail: nestedPayload(path, null) };
|
|
110
135
|
}
|
|
111
136
|
if (op === "nil") {
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
137
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
138
|
+
if (path) return { pass: {}, fail: nestedPayload(path, "mock-test-value") };
|
|
114
139
|
}
|
|
115
140
|
if (op === "eq" || op === "==" || op === "=") {
|
|
116
|
-
const
|
|
141
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
117
142
|
const val = guard[2];
|
|
118
|
-
if (
|
|
143
|
+
if (path && val !== void 0) {
|
|
119
144
|
const failVal = typeof val === "number" ? val + 1 : typeof val === "string" ? `not-${val}` : null;
|
|
120
|
-
return { pass:
|
|
145
|
+
return { pass: nestedPayload(path, val), fail: nestedPayload(path, failVal) };
|
|
121
146
|
}
|
|
122
147
|
}
|
|
123
148
|
if (op === "not-eq" || op === "!=" || op === "neq") {
|
|
124
|
-
const
|
|
149
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
125
150
|
const val = guard[2];
|
|
126
|
-
if (
|
|
151
|
+
if (path && val !== void 0) {
|
|
127
152
|
const passVal = typeof val === "number" ? val + 1 : typeof val === "string" ? `not-${val}` : "other";
|
|
128
|
-
return { pass:
|
|
153
|
+
return { pass: nestedPayload(path, passVal), fail: nestedPayload(path, val) };
|
|
129
154
|
}
|
|
130
155
|
}
|
|
131
156
|
if (op === "gt" || op === ">") {
|
|
132
|
-
const
|
|
157
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
133
158
|
const n = typeof guard[2] === "number" ? guard[2] : 0;
|
|
134
|
-
if (
|
|
159
|
+
if (path) return { pass: nestedPayload(path, n + 1), fail: nestedPayload(path, n - 1) };
|
|
135
160
|
}
|
|
136
161
|
if (op === "gte" || op === ">=") {
|
|
137
|
-
const
|
|
162
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
138
163
|
const n = typeof guard[2] === "number" ? guard[2] : 0;
|
|
139
|
-
if (
|
|
164
|
+
if (path) return { pass: nestedPayload(path, n), fail: nestedPayload(path, n - 1) };
|
|
140
165
|
}
|
|
141
166
|
if (op === "lt" || op === "<") {
|
|
142
|
-
const
|
|
167
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
143
168
|
const n = typeof guard[2] === "number" ? guard[2] : 0;
|
|
144
|
-
if (
|
|
169
|
+
if (path) return { pass: nestedPayload(path, n - 1), fail: nestedPayload(path, n + 1) };
|
|
145
170
|
}
|
|
146
171
|
if (op === "lte" || op === "<=") {
|
|
147
|
-
const
|
|
172
|
+
const path = extractPayloadFieldPath(guard[1]);
|
|
148
173
|
const n = typeof guard[2] === "number" ? guard[2] : 0;
|
|
149
|
-
if (
|
|
174
|
+
if (path) return { pass: nestedPayload(path, n), fail: nestedPayload(path, n + 1) };
|
|
150
175
|
}
|
|
151
176
|
if (op === "and") {
|
|
152
177
|
const subs = guard.slice(1);
|
|
153
178
|
if (subs.length >= 2) {
|
|
154
179
|
const built = subs.map(buildGuardPayloads);
|
|
155
|
-
const pass = built.reduce((acc, b) => (
|
|
180
|
+
const pass = built.reduce((acc, b) => mergePayloads(acc, b.pass), {});
|
|
156
181
|
return { pass, fail: built[0].fail };
|
|
157
182
|
}
|
|
158
183
|
if (subs.length === 1) return buildGuardPayloads(subs[0]);
|
|
@@ -163,7 +188,7 @@ function buildGuardPayloads(guard) {
|
|
|
163
188
|
const s1 = buildGuardPayloads(subs[0]);
|
|
164
189
|
const s2 = buildGuardPayloads(subs[1]);
|
|
165
190
|
const combinedPass = Object.keys(s1.pass).length > 0 ? s1.pass : s2.pass;
|
|
166
|
-
return { pass: combinedPass, fail:
|
|
191
|
+
return { pass: combinedPass, fail: mergePayloads(s1.fail, s2.fail) };
|
|
167
192
|
}
|
|
168
193
|
if (subs.length === 1) return buildGuardPayloads(subs[0]);
|
|
169
194
|
}
|
|
@@ -385,6 +410,6 @@ function buildPayloadForEdge(transition, guardCase) {
|
|
|
385
410
|
return {};
|
|
386
411
|
}
|
|
387
412
|
|
|
388
|
-
export { buildEdgeCoveringWalk, buildGuardPayloads, buildReplayPaths, buildStateGraph, collectReachableStates, constTruth, extractPayloadFieldRef, walkStatePairs };
|
|
413
|
+
export { buildEdgeCoveringWalk, buildGuardPayloads, buildReplayPaths, buildStateGraph, collectReachableStates, constTruth, extractPayloadFieldPath, extractPayloadFieldRef, walkStatePairs };
|
|
389
414
|
//# sourceMappingURL=index.js.map
|
|
390
415
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/state-machine/graph.ts","../../src/state-machine/bfs.ts","../../src/state-machine/guard-payloads.ts","../../src/state-machine/replay-paths.ts","../../src/state-machine/edge-walk.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * State Graph Construction\n *\n * Build an adjacency list from state machine transitions.\n * Extracted from orbital-verify-unified/src/analyze.ts.\n *\n * @packageDocumentation\n */\n\nimport type { GraphTransition, StateEdge } from './types.js';\n\n/**\n * Builds an adjacency list from state machine transitions.\n * \n * Constructs a state transition graph where each state maps to an array\n * of outgoing edges (events and target states). Wildcard transitions\n * (from === '*') are excluded since they don't represent fixed edges.\n * Used as the foundation for state machine analysis, traversal, and verification.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @returns {Map<string, StateEdge[]>} State transition graph\n * \n * @example\n * const graph = buildStateGraph(transitions);\n * const edgesFromInitial = graph.get('initial'); // Array of outgoing edges\n * console.log(`Initial state has ${edgesFromInitial?.length} transitions`);\n */\nexport function buildStateGraph(\n transitions: GraphTransition[]\n): Map<string, StateEdge[]> {\n const graph = new Map<string, StateEdge[]>();\n for (const t of transitions) {\n if (t.from === '*') continue;\n if (!graph.has(t.from)) graph.set(t.from, []);\n graph.get(t.from)!.push({ event: t.event, to: t.to });\n }\n return graph;\n}\n","/**\n * BFS Reachability Algorithms\n *\n * Breadth-first search over state machine graphs.\n * Extracted from orbital-verify-unified/src/analyze.ts and phase3-server.ts.\n *\n * @packageDocumentation\n */\n\nimport type { BFSNode, StateEdge } from './types.js';\nimport { buildStateGraph } from './graph.js';\nimport type { GraphTransition } from './types.js';\n\n/**\n * Collects all reachable states from an initial state using breadth-first search.\n * \n * Performs BFS traversal of the state machine to find all states reachable\n * from the initial state, up to the specified maximum depth. Used for\n * state machine analysis, verification, and test coverage assessment.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @param {string} initialState - Starting state name\n * @param {number} [maxDepth=5] - Maximum search depth\n * @returns {Set<string>} Set of reachable state names\n * \n * @example\n * const reachable = collectReachableStates(transitions, 'initial', 10);\n * console.log('Reachable states:', Array.from(reachable));\n */\nexport function collectReachableStates(\n transitions: GraphTransition[],\n initialState: string,\n maxDepth = 5\n): Set<string> {\n const graph = buildStateGraph(transitions);\n const visited = new Set<string>([initialState]);\n const queue: BFSNode[] = [{ state: initialState, depth: 0 }];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current.depth >= maxDepth) continue;\n\n const edges = graph.get(current.state) ?? [];\n for (const edge of edges) {\n if (!visited.has(edge.to)) {\n visited.add(edge.to);\n queue.push({ state: edge.to, depth: current.depth + 1 });\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Walks all reachable (state, event) pairs using BFS and invokes callback for each.\n * \n * Traverses the state machine using breadth-first search and calls the visitor\n * function for each (state, edge) pair encountered. Used by server verification\n * to test transitions by POSTing to endpoints and checking responses.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @param {string} initialState - Starting state name\n * @param {number} maxDepth - Maximum BFS depth\n * @param {(state: string, edge: StateEdge, depth: number) => Promise<boolean>} visitor - Callback for each pair\n * @returns {Promise<{ visitedPairs: Set<string>; walkedEdges: number }>} Traversal statistics\n * \n * @example\n * const result = await walkStatePairs(transitions, 'initial', 5, async (state, edge) => {\n * console.log(`Transition: ${state} --${edge.event}--> ${edge.to}`);\n * return true; // Continue exploration\n * });\n * console.log(`Visited ${result.visitedPairs.size} state-event pairs`);\n */\nexport async function walkStatePairs(\n transitions: GraphTransition[],\n initialState: string,\n maxDepth: number,\n visitor: (state: string, edge: StateEdge, depth: number) => Promise<boolean>\n): Promise<{ visitedPairs: Set<string>; walkedEdges: number }> {\n const graph = buildStateGraph(transitions);\n const visitedPairs = new Set<string>();\n const queue: BFSNode[] = [{ state: initialState, depth: 0 }];\n let walkedEdges = 0;\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current.depth >= maxDepth) continue;\n\n const edges = graph.get(current.state) ?? [];\n for (const edge of edges) {\n const pairKey = `${current.state}:${edge.event}`;\n if (visitedPairs.has(pairKey)) continue;\n visitedPairs.add(pairKey);\n\n const shouldEnqueue = await visitor(current.state, edge, current.depth);\n walkedEdges++;\n\n if (shouldEnqueue) {\n const stateVisited = [...visitedPairs].some((k) => k.startsWith(`${edge.to}:`));\n if (!stateVisited) {\n queue.push({ state: edge.to, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { visitedPairs, walkedEdges };\n}\n","/**\n * Guard Payload Builder\n *\n * Derive pass and fail payloads from guard s-expressions.\n * Extracted from orbital-verify-unified/src/analyze.ts.\n *\n * @packageDocumentation\n */\n\nimport type { GuardPayload } from './types.js';\n\n/**\n * Extracts the first segment of a payload field reference.\n * \n * Parses binding references in the format \"@payload.field\" and extracts\n * the first field name segment. Used for identifying payload fields in\n * guard conditions for test data generation.\n * \n * @param {unknown} ref - Binding reference to extract from\n * @returns {string | null} First field segment or null for non-payload references\n * \n * @example\n * extractPayloadFieldRef('@payload.item'); // returns 'item'\n * extractPayloadFieldRef('@payload.data.weight'); // returns 'data'\n * extractPayloadFieldRef('@entity.id'); // returns null\n * extractPayloadFieldRef('@user.name'); // returns null\n */\nexport function extractPayloadFieldRef(ref: unknown): string | null {\n if (typeof ref !== 'string') return null;\n const match = ref.match(/^@payload\\.([A-Za-z0-9_]+)/);\n return match ? match[1] : null;\n}\n\n/**\n * Builds test payloads that satisfy or violate guard conditions.\n * \n * Generates pass/fail test data for guard s-expressions used in state machine\n * transitions. Pass payloads satisfy the guard condition (allowing transition),\n * fail payloads violate it (blocking transition). Used for automated testing\n * and validation of state machine behavior.\n * \n * Supports operators: not-nil, nil, eq, not-eq, gt, gte, lt, lte, and, or, not\n * \n * @param {unknown} guard - Guard s-expression to analyze\n * @returns {GuardPayload} Object with pass and fail payloads\n * \n * @example\n * // Guard: ['not-nil', '@payload.completed']\n * buildGuardPayloads(['not-nil', '@payload.completed']);\n * // Returns: { pass: { completed: 'mock-test-value' }, fail: { completed: null } }\n * \n * @example\n * // Guard: ['eq', '@payload.status', 'active']\n * buildGuardPayloads(['eq', '@payload.status', 'active']);\n * // Returns: { pass: { status: 'active' }, fail: { status: 'not-active' } }\n * \n * @example\n * // Guard: ['and', ['not-nil', '@payload.id'], ['eq', '@payload.status', 'ready']]\n * buildGuardPayloads(['and', ['not-nil', '@payload.id'], ['eq', '@payload.status', 'ready']]);\n * // Returns: { pass: { id: 'mock-test-value', status: 'ready' }, fail: { id: null } }\n */\n/**\n * Evaluate a guard that is fully constant (no `@payload`/`@entity`/`@config`\n * bindings — e.g. after molecule/organism inlining folds `@config.mode` to a\n * literal). Returns the constant truth value, or `null` when the guard depends\n * on a binding (so a payload must be synthesized). This lets callers (a) emit\n * an empty payload for a constant guard (no field to satisfy) and (b) skip the\n * meaningless variant: an always-true guard has no fail case, an always-false\n * guard has no pass case. Without it, `(or (= \"create\" \"create\") @payload.row)`\n * (create-mode modal OPEN) was synthesized with a spurious `row`, which the\n * runtime read as edit-mode and rejected.\n */\nexport function constTruth(guard: unknown): boolean | null {\n if (typeof guard === 'boolean') return guard;\n if (typeof guard === 'string') {\n if (guard.startsWith('@')) return null; // a binding — not constant\n return guard.length > 0; // bare non-binding literal: truthy iff non-empty\n }\n if (!Array.isArray(guard) || guard.length === 0) return null;\n const op = String(guard[0]);\n const isLiteral = (x: unknown): boolean =>\n x === null ||\n typeof x === 'number' ||\n typeof x === 'boolean' ||\n (typeof x === 'string' && !x.startsWith('@'));\n if (op === '=' || op === '==' || op === 'eq') {\n return isLiteral(guard[1]) && isLiteral(guard[2]) ? guard[1] === guard[2] : null;\n }\n if (op === '!=' || op === 'ne' || op === 'not-eq' || op === 'neq') {\n return isLiteral(guard[1]) && isLiteral(guard[2]) ? guard[1] !== guard[2] : null;\n }\n if (op === 'not') {\n const inner = constTruth(guard[1]);\n return inner === null ? null : !inner;\n }\n if (op === 'or') {\n const subs = (guard.slice(1) as unknown[]).map(constTruth);\n if (subs.some((s) => s === true)) return true; // short-circuit\n if (subs.every((s) => s === false)) return false;\n return null;\n }\n if (op === 'and') {\n const subs = (guard.slice(1) as unknown[]).map(constTruth);\n if (subs.some((s) => s === false)) return false; // short-circuit\n if (subs.every((s) => s === true)) return true;\n return null;\n }\n return null;\n}\n\nexport function buildGuardPayloads(guard: unknown): GuardPayload {\n // A fully-constant guard (post-inline literal fold) is decided by its\n // literals, not by the payload — synthesize nothing for either case.\n if (constTruth(guard) !== null) {\n return { pass: {}, fail: {} };\n }\n // Bare-binding existence guard: e.g. `when @payload.row` lowers to\n // the string `\"@payload.row\"`. The transition fires iff that field is\n // truthy. Synthesize pass with a truthy mock and fail with null so\n // the verifier can drive both branches. Without this, std-confirmation\n // and std-modal's existence guards (REQUEST/EDIT requiring @payload.row)\n // get empty payloads in both cases — the pass case then fails the\n // server-side guard and the portal observer flags \"slot not mounted\".\n if (typeof guard === 'string') {\n const field = extractPayloadFieldRef(guard);\n if (field) return { pass: { [field]: { id: 'mock-test-id', name: 'mock-test-name' } }, fail: { [field]: null } };\n }\n\n if (!Array.isArray(guard) || guard.length === 0) {\n return { pass: {}, fail: {} };\n }\n\n const op = String(guard[0]);\n\n if (op === 'not-nil' || op === 'not_nil') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: { [field]: 'mock-test-value' }, fail: { [field]: null } };\n }\n\n if (op === 'nil') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: {}, fail: { [field]: 'mock-test-value' } };\n }\n\n if (op === 'eq' || op === '==' || op === '=') {\n const field = extractPayloadFieldRef(guard[1]);\n const val = guard[2];\n if (field && val !== undefined) {\n const failVal =\n typeof val === 'number' ? val + 1\n : typeof val === 'string' ? `not-${val}`\n : null;\n return { pass: { [field]: val }, fail: { [field]: failVal } };\n }\n }\n\n if (op === 'not-eq' || op === '!=' || op === 'neq') {\n const field = extractPayloadFieldRef(guard[1]);\n const val = guard[2];\n if (field && val !== undefined) {\n const passVal =\n typeof val === 'number' ? val + 1\n : typeof val === 'string' ? `not-${val}`\n : 'other';\n return { pass: { [field]: passVal }, fail: { [field]: val } };\n }\n }\n\n if (op === 'gt' || op === '>') {\n const field = extractPayloadFieldRef(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (field) return { pass: { [field]: n + 1 }, fail: { [field]: n - 1 } };\n }\n\n if (op === 'gte' || op === '>=') {\n const field = extractPayloadFieldRef(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (field) return { pass: { [field]: n }, fail: { [field]: n - 1 } };\n }\n\n if (op === 'lt' || op === '<') {\n const field = extractPayloadFieldRef(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (field) return { pass: { [field]: n - 1 }, fail: { [field]: n + 1 } };\n }\n\n if (op === 'lte' || op === '<=') {\n const field = extractPayloadFieldRef(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (field) return { pass: { [field]: n }, fail: { [field]: n + 1 } };\n }\n\n if (op === 'and') {\n // Accept BOTH array sub-guards and bare-binding string sub-guards\n // (e.g. `(and \"@payload.row\" (not-nil \"@payload.id\"))`). Dropping the\n // bare strings with filter(Array.isArray) lost their fields from the\n // pass payload. AND passes iff every sub-guard passes, so merge all\n // sub-guards' pass payloads; AND fails iff any sub-guard fails, so the\n // first sub-guard's fail payload is a sufficient violation.\n const subs = guard.slice(1) as unknown[];\n if (subs.length >= 2) {\n const built = subs.map(buildGuardPayloads);\n const pass = built.reduce<GuardPayload['pass']>((acc, b) => ({ ...acc, ...b.pass }), {});\n return { pass, fail: built[0].fail };\n }\n if (subs.length === 1) return buildGuardPayloads(subs[0]);\n }\n\n if (op === 'or') {\n // Accept BOTH array sub-guards and bare-binding string sub-guards\n // (post-substitution mode-aware guards like\n // `(or (= \"edit\" \"create\") \"@payload.row\")` mix array + string children).\n const subs = guard.slice(1) as unknown[];\n if (subs.length >= 2) {\n const s1 = buildGuardPayloads(subs[0]);\n const s2 = buildGuardPayloads(subs[1]);\n // For OR: pass if EITHER branch passes. Prefer the second branch's\n // pass payload if the first yields nothing useful — the literal-fold\n // case `(= \"edit\" \"create\") || @payload.row` has the first branch\n // return `{}` and the row-payload comes from the second.\n const combinedPass = Object.keys(s1.pass).length > 0 ? s1.pass : s2.pass;\n return { pass: combinedPass, fail: { ...s1.fail, ...s2.fail } };\n }\n if (subs.length === 1) return buildGuardPayloads(subs[0]);\n }\n\n if (op === 'not') {\n const inner = buildGuardPayloads(guard[1]);\n return { pass: inner.fail, fail: inner.pass };\n }\n\n // Agent pure operators used in guards\n if (op === 'agent/is-pinned') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: { [field]: 'mem_test_unpinned' }, fail: { [field]: 'mem_test_pinned' } };\n }\n\n if (op === 'agent/memory-strength') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: { [field]: 'mem_test_id' }, fail: { [field]: 'mem_nonexistent' } };\n }\n\n // Agent operators in comparison contexts (e.g., [\">=\", [\"agent/context-usage\"], 0.85])\n // These don't use @payload, they query agent state directly. Return empty payloads\n // since the guard result depends on agent context, not event payload.\n if (op.startsWith('agent/')) {\n return { pass: {}, fail: {} };\n }\n\n return { pass: {}, fail: {} };\n}\n","/**\n * Replay Path Builder\n *\n * Compute the shortest path (replay steps) from an initial state\n * to every reachable state in a state machine. Used by browser\n * verification to navigate through states before running assertions.\n *\n * Extracted from orbital-verify-unified/src/analyze.ts (collectDataMutationTests).\n *\n * @packageDocumentation\n */\n\nimport type { GraphTransition, ReplayStep, PayloadFieldSchema } from './types.js';\n\n/** Entity-data sentinel payload fields: presence means transition needs a selected row */\nconst ENTITY_PAYLOAD_FIELDS = new Set(['data', 'row', 'item', 'id']);\n\n/**\n * Extended transition with render and payload info needed for replay path building.\n * Compatible with orbital-verify's UnifiedTransition.\n */\nexport interface ReplayTransition extends GraphTransition {\n hasGuard: boolean;\n guard?: unknown[];\n payloadFields: string[];\n payloadSchema: PayloadFieldSchema[];\n renderEffects: Array<{\n slot: string;\n patternType: string | null;\n }>;\n}\n\n/**\n * Builds the shortest replay paths from initial state to all reachable states.\n * \n * Computes step-by-step navigation paths for state machine testing and verification.\n * Uses breadth-first search to find shortest paths up to specified depth limit.\n * Each path contains replay steps with event, state, and payload information\n * needed to reproduce state transitions in tests.\n * \n * @param {ReplayTransition[]} transitions - Transitions with render/payload information\n * @param {string} initialState - Starting state name\n * @param {number} [maxDepth=3] - Maximum path length (default: 3)\n * @returns {Map<string, ReplayStep[]>} Map of state names to replay step arrays\n * \n * @example\n * // Build paths from 'initial' state\n * const paths = buildReplayPaths(transitions, 'initial', 5);\n * \n * // Get steps to reach 'completed' state\n * const stepsToComplete = paths.get('completed');\n * \n * // Execute replay steps\n * for (const step of stepsToComplete) {\n * await dispatchEvent(step.event, step.payload);\n * }\n */\nexport function buildReplayPaths(\n transitions: ReplayTransition[],\n initialState: string,\n maxDepth = 3\n): Map<string, ReplayStep[]> {\n type QueueNode = { state: string; path: ReplayStep[] };\n\n const queue: QueueNode[] = [{ state: initialState, path: [] }];\n const replayPaths = new Map<string, ReplayStep[]>();\n replayPaths.set(initialState, []);\n\n while (queue.length > 0) {\n const { state, path } = queue.shift()!;\n if (path.length >= maxDepth) continue;\n\n const fromHere = transitions.filter(\n (t) => t.from === state && t.event !== 'INIT',\n );\n\n for (const transition of fromHere) {\n if (replayPaths.has(transition.to)) continue;\n\n const renderEffect = transition.renderEffects.find((re) => re.patternType !== null);\n const stepNeedsEntityData =\n transition.hasGuard ||\n transition.payloadFields.some((f) => ENTITY_PAYLOAD_FIELDS.has(f));\n\n const step: ReplayStep = {\n event: transition.event,\n fromState: state,\n toState: transition.to,\n slot: renderEffect?.slot ?? 'main',\n expectedPattern: renderEffect?.patternType ?? undefined,\n needsEntityData: stepNeedsEntityData,\n payloadSchema: transition.payloadSchema.length > 0 ? transition.payloadSchema : undefined,\n };\n\n const newPath = [...path, step];\n replayPaths.set(transition.to, newPath);\n queue.push({ state: transition.to, path: newPath });\n }\n }\n\n return replayPaths;\n}\n","/**\n * Edge-Covering Walk Algorithm\n *\n * Computes an ordered sequence of events (WalkStep[]) that attempts to cover\n * every transition (edge) in a state machine graph. This is a greedy chained\n * walk: it does NOT guarantee 100% coverage. With no reset concept it can\n * strand on absorbing states (no outgoing edges and no path back to uncovered\n * edges), and a guard-fail misprediction desyncs the chained walk so later\n * steps fire from the wrong state. Superseded by the hermetic per-frame walk\n * in @almadar-io/verify, which re-seeds each frame independently.\n *\n * Algorithm:\n * 1. Build adjacency list and edge universe (guarded transitions produce two edges)\n * 2. Precompute BFS shortest paths between all state pairs (for repositioning)\n * 3. Greedy DFS: at each state, prefer uncovered outgoing edges\n * 4. When stuck, insert repositioning steps to nearest state with uncovered edges\n * 5. Guard-fail steps don't advance state (guard blocks transition)\n *\n * Used by StateWalkEngine in @almadar-io/verify. Both orbital-verify and\n * runtime-verify share this algorithm for consistent coverage.\n *\n * @packageDocumentation\n */\n\nimport type { EdgeWalkTransition, WalkStep, StateEdge } from './types.js';\nimport type { EventPayload, EventPayloadValue } from '../types/expression.js';\nimport { buildGuardPayloads } from './guard-payloads.js';\n\n/**\n * Build an ordered walk that covers every edge in the state machine.\n *\n * @param transitions - All transitions in the state machine\n * @param initialState - Starting state\n * @returns Ordered walk steps covering every edge\n */\nexport function buildEdgeCoveringWalk(\n transitions: EdgeWalkTransition[],\n initialState: string,\n): WalkStep[] {\n // 1. Build adjacency list. Skip wildcards (pseudostates) and skip the\n // boot INIT (the runtime auto-fires INIT from the initial state on\n // mount, so the walker doesn't need to fire it). User-triggered INITs\n // from non-initial states (refresh, retry) ARE walkable edges and\n // stay in the graph so coverage can reach them.\n const filtered = transitions.filter(\n (t) => t.from !== '*' && !(t.event === 'INIT' && t.from === initialState),\n );\n\n const graph = new Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>();\n const allStates = new Set<string>();\n\n for (const t of filtered) {\n allStates.add(t.from);\n allStates.add(t.to);\n if (!graph.has(t.from)) graph.set(t.from, []);\n graph.get(t.from)!.push({ event: t.event, to: t.to, transition: t });\n }\n\n // Ensure initial state is in the set\n allStates.add(initialState);\n\n // 2. Build edge universe. Guarded transitions produce pass + fail edges.\n const uncovered = new Set<string>();\n const edgeMeta = new Map<string, { transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }>();\n\n for (const t of filtered) {\n if (t.hasGuard) {\n const keyPass = `${t.from}+${t.event}->${t.to}[pass]`;\n const keyFail = `${t.from}+${t.event}->${t.to}[fail]`;\n uncovered.add(keyPass);\n uncovered.add(keyFail);\n edgeMeta.set(keyPass, { transition: t, guardCase: 'pass' });\n edgeMeta.set(keyFail, { transition: t, guardCase: 'fail' });\n } else {\n const key = `${t.from}+${t.event}->${t.to}`;\n uncovered.add(key);\n edgeMeta.set(key, { transition: t, guardCase: null });\n }\n }\n\n if (uncovered.size === 0) return [];\n\n // 3. Precompute BFS shortest paths between all state pairs\n const shortestPaths = new Map<string, Map<string, Array<{ event: string; to: string }>>>();\n for (const state of allStates) {\n shortestPaths.set(state, bfsShortestPaths(state, graph));\n }\n\n // 4. Greedy walk\n const walk: WalkStep[] = [];\n let currentState = initialState;\n const maxIterations = uncovered.size * allStates.size * 2; // safety bound\n let iterations = 0;\n\n while (uncovered.size > 0 && iterations < maxIterations) {\n iterations++;\n\n // Find uncovered edges from currentState\n const outgoing = findUncoveredEdges(currentState, graph, uncovered);\n\n if (outgoing.length > 0) {\n // Pick first uncovered edge\n const pick = outgoing[0];\n const payload = buildPayloadForEdge(pick.transition, pick.guardCase);\n\n walk.push({\n from: currentState,\n event: pick.transition.event,\n to: pick.transition.to,\n guardCase: pick.guardCase,\n payload,\n isRepositioning: false,\n });\n\n uncovered.delete(pick.key);\n\n // Guard-fail doesn't advance state\n if (pick.guardCase !== 'fail') {\n currentState = pick.transition.to;\n }\n } else {\n // Stuck: find nearest state with uncovered edges\n const target = findNearestUncoveredState(currentState, graph, uncovered, shortestPaths);\n\n if (!target) {\n // No reachable state with uncovered edges. Remaining edges are unreachable.\n break;\n }\n\n // Insert repositioning steps\n const repoPath = shortestPaths.get(currentState)?.get(target);\n if (!repoPath || repoPath.length === 0) break;\n\n for (const step of repoPath) {\n walk.push({\n from: currentState,\n event: step.event,\n to: step.to,\n guardCase: null,\n payload: {},\n isRepositioning: true,\n });\n currentState = step.to;\n }\n }\n }\n\n return walk;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * BFS from a source state, returning shortest paths to all reachable states.\n * Each path is an array of {event, to} steps.\n */\nfunction bfsShortestPaths(\n source: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n): Map<string, Array<{ event: string; to: string }>> {\n const paths = new Map<string, Array<{ event: string; to: string }>>();\n const visited = new Set<string>([source]);\n const queue: Array<{ state: string; path: Array<{ event: string; to: string }> }> = [\n { state: source, path: [] },\n ];\n\n while (queue.length > 0) {\n const { state, path } = queue.shift()!;\n const edges = graph.get(state) ?? [];\n\n for (const edge of edges) {\n if (visited.has(edge.to)) continue;\n visited.add(edge.to);\n const newPath = [...path, { event: edge.event, to: edge.to }];\n paths.set(edge.to, newPath);\n queue.push({ state: edge.to, path: newPath });\n }\n }\n\n return paths;\n}\n\n/**\n * Find uncovered edges from a given state.\n */\nfunction findUncoveredEdges(\n state: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n uncovered: Set<string>,\n): Array<{ key: string; transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }> {\n const edges = graph.get(state) ?? [];\n const result: Array<{ key: string; transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }> = [];\n\n for (const edge of edges) {\n if (edge.transition.hasGuard) {\n const keyPass = `${state}+${edge.event}->${edge.to}[pass]`;\n const keyFail = `${state}+${edge.event}->${edge.to}[fail]`;\n // Prefer pass first (advances state), then fail\n if (uncovered.has(keyPass)) {\n result.push({ key: keyPass, transition: edge.transition, guardCase: 'pass' });\n }\n if (uncovered.has(keyFail)) {\n result.push({ key: keyFail, transition: edge.transition, guardCase: 'fail' });\n }\n } else {\n const key = `${state}+${edge.event}->${edge.to}`;\n if (uncovered.has(key)) {\n result.push({ key, transition: edge.transition, guardCase: null });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Find the nearest state (from currentState) that has uncovered outgoing edges.\n */\nfunction findNearestUncoveredState(\n currentState: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n uncovered: Set<string>,\n shortestPaths: Map<string, Map<string, Array<{ event: string; to: string }>>>,\n): string | null {\n // Collect states that have uncovered edges\n const statesWithUncovered = new Set<string>();\n for (const key of uncovered) {\n // Key format: \"state+EVENT->target\" or \"state+EVENT->target[pass]\"\n const fromState = key.split('+')[0];\n statesWithUncovered.add(fromState);\n }\n\n // If current state has uncovered edges, return it (shouldn't happen, but handle it)\n if (statesWithUncovered.has(currentState)) return currentState;\n\n // Find nearest reachable state with uncovered edges\n const paths = shortestPaths.get(currentState);\n if (!paths) return null;\n\n let nearestState: string | null = null;\n let nearestDist = Infinity;\n\n for (const target of statesWithUncovered) {\n const path = paths.get(target);\n if (path && path.length < nearestDist) {\n nearestDist = path.length;\n nearestState = target;\n }\n }\n\n return nearestState;\n}\n\n/**\n * Build a payload for a given edge based on its guard case and payload schema.\n * For guarded transitions, uses guard expressions to generate pass/fail payloads.\n * For unguarded transitions with payload schemas (e.g., EDIT/VIEW with { id }),\n * generates mock values so fetch-by-ID effects can resolve entity data.\n */\nfunction buildPayloadForEdge(\n transition: EdgeWalkTransition,\n guardCase: 'pass' | 'fail' | null,\n): EventPayload {\n // Guard-based payload generation (existing behavior)\n if (transition.hasGuard && transition.guard && guardCase) {\n const payloads = buildGuardPayloads(transition.guard);\n return guardCase === 'pass' ? payloads.pass : payloads.fail;\n }\n\n // Schema-based payload generation for events that declare required fields\n // (e.g., EDIT/VIEW declare { name: \"id\", type: \"string\", required: true })\n if (transition.payloadSchema && transition.payloadSchema.length > 0) {\n const payload: EventPayload = {};\n for (const field of transition.payloadSchema) {\n // Use caller-provided mockValue if available (set from entity context)\n if (field.mockValue !== undefined) {\n payload[field.name] = field.mockValue as EventPayloadValue;\n } else if (field.type === 'string') {\n payload[field.name] = `mock-${field.name}`;\n } else if (field.type === 'number') {\n payload[field.name] = 1;\n } else if (field.type === 'boolean') {\n payload[field.name] = true;\n } else if (field.type === 'object' || field.type === 'any') {\n // `mock-<name>` is a plain string; persisting that for an object\n // field (e.g. SAVE's `data: object` carrying a form row) spreads\n // the string's characters across numeric keys server-side and\n // the downstream grid renders blank cards. An empty object is a\n // safer default — callers that need entity-shaped mocks should\n // set `mockValue` at the call site (see orbital-verify-unified's\n // phase4-browser TraitWalkConfig builder).\n payload[field.name] = {};\n } else {\n payload[field.name] = `mock-${field.name}`;\n }\n }\n return payload;\n }\n\n return {};\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/state-machine/graph.ts","../../src/state-machine/bfs.ts","../../src/state-machine/guard-payloads.ts","../../src/state-machine/replay-paths.ts","../../src/state-machine/edge-walk.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * State Graph Construction\n *\n * Build an adjacency list from state machine transitions.\n * Extracted from orbital-verify-unified/src/analyze.ts.\n *\n * @packageDocumentation\n */\n\nimport type { GraphTransition, StateEdge } from './types.js';\n\n/**\n * Builds an adjacency list from state machine transitions.\n * \n * Constructs a state transition graph where each state maps to an array\n * of outgoing edges (events and target states). Wildcard transitions\n * (from === '*') are excluded since they don't represent fixed edges.\n * Used as the foundation for state machine analysis, traversal, and verification.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @returns {Map<string, StateEdge[]>} State transition graph\n * \n * @example\n * const graph = buildStateGraph(transitions);\n * const edgesFromInitial = graph.get('initial'); // Array of outgoing edges\n * console.log(`Initial state has ${edgesFromInitial?.length} transitions`);\n */\nexport function buildStateGraph(\n transitions: GraphTransition[]\n): Map<string, StateEdge[]> {\n const graph = new Map<string, StateEdge[]>();\n for (const t of transitions) {\n if (t.from === '*') continue;\n if (!graph.has(t.from)) graph.set(t.from, []);\n graph.get(t.from)!.push({ event: t.event, to: t.to });\n }\n return graph;\n}\n","/**\n * BFS Reachability Algorithms\n *\n * Breadth-first search over state machine graphs.\n * Extracted from orbital-verify-unified/src/analyze.ts and phase3-server.ts.\n *\n * @packageDocumentation\n */\n\nimport type { BFSNode, StateEdge } from './types.js';\nimport { buildStateGraph } from './graph.js';\nimport type { GraphTransition } from './types.js';\n\n/**\n * Collects all reachable states from an initial state using breadth-first search.\n * \n * Performs BFS traversal of the state machine to find all states reachable\n * from the initial state, up to the specified maximum depth. Used for\n * state machine analysis, verification, and test coverage assessment.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @param {string} initialState - Starting state name\n * @param {number} [maxDepth=5] - Maximum search depth\n * @returns {Set<string>} Set of reachable state names\n * \n * @example\n * const reachable = collectReachableStates(transitions, 'initial', 10);\n * console.log('Reachable states:', Array.from(reachable));\n */\nexport function collectReachableStates(\n transitions: GraphTransition[],\n initialState: string,\n maxDepth = 5\n): Set<string> {\n const graph = buildStateGraph(transitions);\n const visited = new Set<string>([initialState]);\n const queue: BFSNode[] = [{ state: initialState, depth: 0 }];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current.depth >= maxDepth) continue;\n\n const edges = graph.get(current.state) ?? [];\n for (const edge of edges) {\n if (!visited.has(edge.to)) {\n visited.add(edge.to);\n queue.push({ state: edge.to, depth: current.depth + 1 });\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Walks all reachable (state, event) pairs using BFS and invokes callback for each.\n * \n * Traverses the state machine using breadth-first search and calls the visitor\n * function for each (state, edge) pair encountered. Used by server verification\n * to test transitions by POSTing to endpoints and checking responses.\n * \n * @param {GraphTransition[]} transitions - Array of state transitions\n * @param {string} initialState - Starting state name\n * @param {number} maxDepth - Maximum BFS depth\n * @param {(state: string, edge: StateEdge, depth: number) => Promise<boolean>} visitor - Callback for each pair\n * @returns {Promise<{ visitedPairs: Set<string>; walkedEdges: number }>} Traversal statistics\n * \n * @example\n * const result = await walkStatePairs(transitions, 'initial', 5, async (state, edge) => {\n * console.log(`Transition: ${state} --${edge.event}--> ${edge.to}`);\n * return true; // Continue exploration\n * });\n * console.log(`Visited ${result.visitedPairs.size} state-event pairs`);\n */\nexport async function walkStatePairs(\n transitions: GraphTransition[],\n initialState: string,\n maxDepth: number,\n visitor: (state: string, edge: StateEdge, depth: number) => Promise<boolean>\n): Promise<{ visitedPairs: Set<string>; walkedEdges: number }> {\n const graph = buildStateGraph(transitions);\n const visitedPairs = new Set<string>();\n const queue: BFSNode[] = [{ state: initialState, depth: 0 }];\n let walkedEdges = 0;\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current.depth >= maxDepth) continue;\n\n const edges = graph.get(current.state) ?? [];\n for (const edge of edges) {\n const pairKey = `${current.state}:${edge.event}`;\n if (visitedPairs.has(pairKey)) continue;\n visitedPairs.add(pairKey);\n\n const shouldEnqueue = await visitor(current.state, edge, current.depth);\n walkedEdges++;\n\n if (shouldEnqueue) {\n const stateVisited = [...visitedPairs].some((k) => k.startsWith(`${edge.to}:`));\n if (!stateVisited) {\n queue.push({ state: edge.to, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { visitedPairs, walkedEdges };\n}\n","/**\n * Guard Payload Builder\n *\n * Derive pass and fail payloads from guard s-expressions.\n * Extracted from orbital-verify-unified/src/analyze.ts.\n *\n * @packageDocumentation\n */\n\nimport type { GuardPayload } from './types.js';\nimport type { EventPayload, EventPayloadValue } from '../types/expression.js';\n\n/**\n * Extracts the first segment of a payload field reference.\n * \n * Parses binding references in the format \"@payload.field\" and extracts\n * the first field name segment. Used for identifying payload fields in\n * guard conditions for test data generation.\n * \n * @param {unknown} ref - Binding reference to extract from\n * @returns {string | null} First field segment or null for non-payload references\n * \n * @example\n * extractPayloadFieldRef('@payload.item'); // returns 'item'\n * extractPayloadFieldRef('@payload.data.weight'); // returns 'data'\n * extractPayloadFieldRef('@entity.id'); // returns null\n * extractPayloadFieldRef('@user.name'); // returns null\n */\nexport function extractPayloadFieldRef(ref: unknown): string | null {\n if (typeof ref !== 'string') return null;\n const match = ref.match(/^@payload\\.([A-Za-z0-9_]+)/);\n return match ? match[1] : null;\n}\n\n/**\n * Full dotted path of a payload reference — `'@payload.data.providerName'`\n * → `['data', 'providerName']`. `extractPayloadFieldRef` keeps only the\n * first segment, which made every guard on a NESTED payload field\n * unsatisfiable by synthesis: `when ?data.providerName` was seeded as\n * `{data: 'mock-test-value'}`, the runtime read `.providerName` off a\n * string, and the pass-case dispatch was correctly rejected (std-booking\n * BookingWizard NEXT — the whole step chain became unwalkable). Returns\n * `null` for non-payload references.\n */\nexport function extractPayloadFieldPath(ref: unknown): string[] | null {\n if (typeof ref !== 'string') return null;\n const match = ref.match(/^@payload\\.([A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*)/);\n return match ? match[1].split('.') : null;\n}\n\n/** `['data','providerName']` + leaf → `{data: {providerName: leaf}}`. */\nfunction nestedPayload(path: string[], leaf: EventPayloadValue): EventPayload {\n let value: EventPayloadValue = leaf;\n for (let i = path.length - 1; i >= 1; i--) {\n value = { [path[i]]: value };\n }\n return { [path[0]]: value };\n}\n\nfunction isPayloadObject(v: EventPayloadValue): v is EventPayload {\n return typeof v === 'object' && v !== null && !Array.isArray(v) && !(v instanceof Date);\n}\n\n/**\n * Deep-merge for synthesized payloads. A shallow spread clobbers sibling\n * NESTED fields — `(and ?data.customerName ?data.email)` built\n * `{data:{customerName}}` then `{data:{email}}` and the spread kept only\n * the last, so multi-field AND guards on one payload object could never\n * pass. Later keys win on genuine conflicts, mirroring spread order.\n */\nfunction mergePayloads(a: EventPayload, b: EventPayload): EventPayload {\n const out: EventPayload = { ...a };\n for (const [k, v] of Object.entries(b)) {\n const prev = out[k];\n out[k] = prev !== undefined && isPayloadObject(prev) && v !== undefined && isPayloadObject(v)\n ? mergePayloads(prev, v)\n : v;\n }\n return out;\n}\n\n/**\n * Builds test payloads that satisfy or violate guard conditions.\n * \n * Generates pass/fail test data for guard s-expressions used in state machine\n * transitions. Pass payloads satisfy the guard condition (allowing transition),\n * fail payloads violate it (blocking transition). Used for automated testing\n * and validation of state machine behavior.\n * \n * Supports operators: not-nil, nil, eq, not-eq, gt, gte, lt, lte, and, or, not\n * \n * @param {unknown} guard - Guard s-expression to analyze\n * @returns {GuardPayload} Object with pass and fail payloads\n * \n * @example\n * // Guard: ['not-nil', '@payload.completed']\n * buildGuardPayloads(['not-nil', '@payload.completed']);\n * // Returns: { pass: { completed: 'mock-test-value' }, fail: { completed: null } }\n * \n * @example\n * // Guard: ['eq', '@payload.status', 'active']\n * buildGuardPayloads(['eq', '@payload.status', 'active']);\n * // Returns: { pass: { status: 'active' }, fail: { status: 'not-active' } }\n * \n * @example\n * // Guard: ['and', ['not-nil', '@payload.id'], ['eq', '@payload.status', 'ready']]\n * buildGuardPayloads(['and', ['not-nil', '@payload.id'], ['eq', '@payload.status', 'ready']]);\n * // Returns: { pass: { id: 'mock-test-value', status: 'ready' }, fail: { id: null } }\n */\n/**\n * Evaluate a guard that is fully constant (no `@payload`/`@entity`/`@config`\n * bindings — e.g. after molecule/organism inlining folds `@config.mode` to a\n * literal). Returns the constant truth value, or `null` when the guard depends\n * on a binding (so a payload must be synthesized). This lets callers (a) emit\n * an empty payload for a constant guard (no field to satisfy) and (b) skip the\n * meaningless variant: an always-true guard has no fail case, an always-false\n * guard has no pass case. Without it, `(or (= \"create\" \"create\") @payload.row)`\n * (create-mode modal OPEN) was synthesized with a spurious `row`, which the\n * runtime read as edit-mode and rejected.\n */\nexport function constTruth(guard: unknown): boolean | null {\n if (typeof guard === 'boolean') return guard;\n if (typeof guard === 'string') {\n if (guard.startsWith('@')) return null; // a binding — not constant\n return guard.length > 0; // bare non-binding literal: truthy iff non-empty\n }\n if (!Array.isArray(guard) || guard.length === 0) return null;\n const op = String(guard[0]);\n const isLiteral = (x: unknown): boolean =>\n x === null ||\n typeof x === 'number' ||\n typeof x === 'boolean' ||\n (typeof x === 'string' && !x.startsWith('@'));\n if (op === '=' || op === '==' || op === 'eq') {\n return isLiteral(guard[1]) && isLiteral(guard[2]) ? guard[1] === guard[2] : null;\n }\n if (op === '!=' || op === 'ne' || op === 'not-eq' || op === 'neq') {\n return isLiteral(guard[1]) && isLiteral(guard[2]) ? guard[1] !== guard[2] : null;\n }\n if (op === 'not') {\n const inner = constTruth(guard[1]);\n return inner === null ? null : !inner;\n }\n if (op === 'or') {\n const subs = (guard.slice(1) as unknown[]).map(constTruth);\n if (subs.some((s) => s === true)) return true; // short-circuit\n if (subs.every((s) => s === false)) return false;\n return null;\n }\n if (op === 'and') {\n const subs = (guard.slice(1) as unknown[]).map(constTruth);\n if (subs.some((s) => s === false)) return false; // short-circuit\n if (subs.every((s) => s === true)) return true;\n return null;\n }\n return null;\n}\n\nexport function buildGuardPayloads(guard: unknown): GuardPayload {\n // A fully-constant guard (post-inline literal fold) is decided by its\n // literals, not by the payload — synthesize nothing for either case.\n if (constTruth(guard) !== null) {\n return { pass: {}, fail: {} };\n }\n // Bare-binding existence guard: e.g. `when @payload.row` lowers to\n // the string `\"@payload.row\"`. The transition fires iff that field is\n // truthy. Synthesize pass with a truthy mock and fail with null so\n // the verifier can drive both branches. Without this, std-confirmation\n // and std-modal's existence guards (REQUEST/EDIT requiring @payload.row)\n // get empty payloads in both cases — the pass case then fails the\n // server-side guard and the portal observer flags \"slot not mounted\".\n if (typeof guard === 'string') {\n const path = extractPayloadFieldPath(guard);\n // Single-segment existence guards keep the row-shaped mock (`?row` —\n // std-confirmation/std-modal open a record view off it); a NESTED leaf\n // (`?data.providerName`) is a scalar field, so a string mock is the\n // truthy value its consumers (str/…, renders) can actually use.\n if (path) {\n return path.length === 1\n ? { pass: { [path[0]]: { id: 'mock-test-id', name: 'mock-test-name' } }, fail: { [path[0]]: null } }\n : { pass: nestedPayload(path, 'mock-test-value'), fail: nestedPayload(path, null) };\n }\n }\n\n if (!Array.isArray(guard) || guard.length === 0) {\n return { pass: {}, fail: {} };\n }\n\n const op = String(guard[0]);\n\n if (op === 'not-nil' || op === 'not_nil') {\n const path = extractPayloadFieldPath(guard[1]);\n if (path) return { pass: nestedPayload(path, 'mock-test-value'), fail: nestedPayload(path, null) };\n }\n\n if (op === 'nil') {\n const path = extractPayloadFieldPath(guard[1]);\n if (path) return { pass: {}, fail: nestedPayload(path, 'mock-test-value') };\n }\n\n if (op === 'eq' || op === '==' || op === '=') {\n const path = extractPayloadFieldPath(guard[1]);\n const val = guard[2];\n if (path && val !== undefined) {\n const failVal =\n typeof val === 'number' ? val + 1\n : typeof val === 'string' ? `not-${val}`\n : null;\n return { pass: nestedPayload(path, val), fail: nestedPayload(path, failVal) };\n }\n }\n\n if (op === 'not-eq' || op === '!=' || op === 'neq') {\n const path = extractPayloadFieldPath(guard[1]);\n const val = guard[2];\n if (path && val !== undefined) {\n const passVal =\n typeof val === 'number' ? val + 1\n : typeof val === 'string' ? `not-${val}`\n : 'other';\n return { pass: nestedPayload(path, passVal), fail: nestedPayload(path, val) };\n }\n }\n\n if (op === 'gt' || op === '>') {\n const path = extractPayloadFieldPath(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (path) return { pass: nestedPayload(path, n + 1), fail: nestedPayload(path, n - 1) };\n }\n\n if (op === 'gte' || op === '>=') {\n const path = extractPayloadFieldPath(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (path) return { pass: nestedPayload(path, n), fail: nestedPayload(path, n - 1) };\n }\n\n if (op === 'lt' || op === '<') {\n const path = extractPayloadFieldPath(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (path) return { pass: nestedPayload(path, n - 1), fail: nestedPayload(path, n + 1) };\n }\n\n if (op === 'lte' || op === '<=') {\n const path = extractPayloadFieldPath(guard[1]);\n const n = typeof guard[2] === 'number' ? guard[2] : 0;\n if (path) return { pass: nestedPayload(path, n), fail: nestedPayload(path, n + 1) };\n }\n\n if (op === 'and') {\n // Accept BOTH array sub-guards and bare-binding string sub-guards\n // (e.g. `(and \"@payload.row\" (not-nil \"@payload.id\"))`). Dropping the\n // bare strings with filter(Array.isArray) lost their fields from the\n // pass payload. AND passes iff every sub-guard passes, so merge all\n // sub-guards' pass payloads; AND fails iff any sub-guard fails, so the\n // first sub-guard's fail payload is a sufficient violation.\n const subs = guard.slice(1) as unknown[];\n if (subs.length >= 2) {\n const built = subs.map(buildGuardPayloads);\n const pass = built.reduce<GuardPayload['pass']>((acc, b) => mergePayloads(acc, b.pass), {});\n return { pass, fail: built[0].fail };\n }\n if (subs.length === 1) return buildGuardPayloads(subs[0]);\n }\n\n if (op === 'or') {\n // Accept BOTH array sub-guards and bare-binding string sub-guards\n // (post-substitution mode-aware guards like\n // `(or (= \"edit\" \"create\") \"@payload.row\")` mix array + string children).\n const subs = guard.slice(1) as unknown[];\n if (subs.length >= 2) {\n const s1 = buildGuardPayloads(subs[0]);\n const s2 = buildGuardPayloads(subs[1]);\n // For OR: pass if EITHER branch passes. Prefer the second branch's\n // pass payload if the first yields nothing useful — the literal-fold\n // case `(= \"edit\" \"create\") || @payload.row` has the first branch\n // return `{}` and the row-payload comes from the second.\n const combinedPass = Object.keys(s1.pass).length > 0 ? s1.pass : s2.pass;\n return { pass: combinedPass, fail: mergePayloads(s1.fail, s2.fail) };\n }\n if (subs.length === 1) return buildGuardPayloads(subs[0]);\n }\n\n if (op === 'not') {\n const inner = buildGuardPayloads(guard[1]);\n return { pass: inner.fail, fail: inner.pass };\n }\n\n // Agent pure operators used in guards\n if (op === 'agent/is-pinned') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: { [field]: 'mem_test_unpinned' }, fail: { [field]: 'mem_test_pinned' } };\n }\n\n if (op === 'agent/memory-strength') {\n const field = extractPayloadFieldRef(guard[1]);\n if (field) return { pass: { [field]: 'mem_test_id' }, fail: { [field]: 'mem_nonexistent' } };\n }\n\n // Agent operators in comparison contexts (e.g., [\">=\", [\"agent/context-usage\"], 0.85])\n // These don't use @payload, they query agent state directly. Return empty payloads\n // since the guard result depends on agent context, not event payload.\n if (op.startsWith('agent/')) {\n return { pass: {}, fail: {} };\n }\n\n return { pass: {}, fail: {} };\n}\n","/**\n * Replay Path Builder\n *\n * Compute the shortest path (replay steps) from an initial state\n * to every reachable state in a state machine. Used by browser\n * verification to navigate through states before running assertions.\n *\n * Extracted from orbital-verify-unified/src/analyze.ts (collectDataMutationTests).\n *\n * @packageDocumentation\n */\n\nimport type { GraphTransition, ReplayStep, PayloadFieldSchema } from './types.js';\n\n/** Entity-data sentinel payload fields: presence means transition needs a selected row */\nconst ENTITY_PAYLOAD_FIELDS = new Set(['data', 'row', 'item', 'id']);\n\n/**\n * Extended transition with render and payload info needed for replay path building.\n * Compatible with orbital-verify's UnifiedTransition.\n */\nexport interface ReplayTransition extends GraphTransition {\n hasGuard: boolean;\n guard?: unknown[];\n payloadFields: string[];\n payloadSchema: PayloadFieldSchema[];\n renderEffects: Array<{\n slot: string;\n patternType: string | null;\n }>;\n}\n\n/**\n * Builds the shortest replay paths from initial state to all reachable states.\n * \n * Computes step-by-step navigation paths for state machine testing and verification.\n * Uses breadth-first search to find shortest paths up to specified depth limit.\n * Each path contains replay steps with event, state, and payload information\n * needed to reproduce state transitions in tests.\n * \n * @param {ReplayTransition[]} transitions - Transitions with render/payload information\n * @param {string} initialState - Starting state name\n * @param {number} [maxDepth=3] - Maximum path length (default: 3)\n * @returns {Map<string, ReplayStep[]>} Map of state names to replay step arrays\n * \n * @example\n * // Build paths from 'initial' state\n * const paths = buildReplayPaths(transitions, 'initial', 5);\n * \n * // Get steps to reach 'completed' state\n * const stepsToComplete = paths.get('completed');\n * \n * // Execute replay steps\n * for (const step of stepsToComplete) {\n * await dispatchEvent(step.event, step.payload);\n * }\n */\nexport function buildReplayPaths(\n transitions: ReplayTransition[],\n initialState: string,\n maxDepth = 3\n): Map<string, ReplayStep[]> {\n type QueueNode = { state: string; path: ReplayStep[] };\n\n const queue: QueueNode[] = [{ state: initialState, path: [] }];\n const replayPaths = new Map<string, ReplayStep[]>();\n replayPaths.set(initialState, []);\n\n while (queue.length > 0) {\n const { state, path } = queue.shift()!;\n if (path.length >= maxDepth) continue;\n\n const fromHere = transitions.filter(\n (t) => t.from === state && t.event !== 'INIT',\n );\n\n for (const transition of fromHere) {\n if (replayPaths.has(transition.to)) continue;\n\n const renderEffect = transition.renderEffects.find((re) => re.patternType !== null);\n const stepNeedsEntityData =\n transition.hasGuard ||\n transition.payloadFields.some((f) => ENTITY_PAYLOAD_FIELDS.has(f));\n\n const step: ReplayStep = {\n event: transition.event,\n fromState: state,\n toState: transition.to,\n slot: renderEffect?.slot ?? 'main',\n expectedPattern: renderEffect?.patternType ?? undefined,\n needsEntityData: stepNeedsEntityData,\n payloadSchema: transition.payloadSchema.length > 0 ? transition.payloadSchema : undefined,\n };\n\n const newPath = [...path, step];\n replayPaths.set(transition.to, newPath);\n queue.push({ state: transition.to, path: newPath });\n }\n }\n\n return replayPaths;\n}\n","/**\n * Edge-Covering Walk Algorithm\n *\n * Computes an ordered sequence of events (WalkStep[]) that attempts to cover\n * every transition (edge) in a state machine graph. This is a greedy chained\n * walk: it does NOT guarantee 100% coverage. With no reset concept it can\n * strand on absorbing states (no outgoing edges and no path back to uncovered\n * edges), and a guard-fail misprediction desyncs the chained walk so later\n * steps fire from the wrong state. Superseded by the hermetic per-frame walk\n * in @almadar-io/verify, which re-seeds each frame independently.\n *\n * Algorithm:\n * 1. Build adjacency list and edge universe (guarded transitions produce two edges)\n * 2. Precompute BFS shortest paths between all state pairs (for repositioning)\n * 3. Greedy DFS: at each state, prefer uncovered outgoing edges\n * 4. When stuck, insert repositioning steps to nearest state with uncovered edges\n * 5. Guard-fail steps don't advance state (guard blocks transition)\n *\n * Used by StateWalkEngine in @almadar-io/verify. Both orbital-verify and\n * runtime-verify share this algorithm for consistent coverage.\n *\n * @packageDocumentation\n */\n\nimport type { EdgeWalkTransition, WalkStep, StateEdge } from './types.js';\nimport type { EventPayload, EventPayloadValue } from '../types/expression.js';\nimport { buildGuardPayloads } from './guard-payloads.js';\n\n/**\n * Build an ordered walk that covers every edge in the state machine.\n *\n * @param transitions - All transitions in the state machine\n * @param initialState - Starting state\n * @returns Ordered walk steps covering every edge\n */\nexport function buildEdgeCoveringWalk(\n transitions: EdgeWalkTransition[],\n initialState: string,\n): WalkStep[] {\n // 1. Build adjacency list. Skip wildcards (pseudostates) and skip the\n // boot INIT (the runtime auto-fires INIT from the initial state on\n // mount, so the walker doesn't need to fire it). User-triggered INITs\n // from non-initial states (refresh, retry) ARE walkable edges and\n // stay in the graph so coverage can reach them.\n const filtered = transitions.filter(\n (t) => t.from !== '*' && !(t.event === 'INIT' && t.from === initialState),\n );\n\n const graph = new Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>();\n const allStates = new Set<string>();\n\n for (const t of filtered) {\n allStates.add(t.from);\n allStates.add(t.to);\n if (!graph.has(t.from)) graph.set(t.from, []);\n graph.get(t.from)!.push({ event: t.event, to: t.to, transition: t });\n }\n\n // Ensure initial state is in the set\n allStates.add(initialState);\n\n // 2. Build edge universe. Guarded transitions produce pass + fail edges.\n const uncovered = new Set<string>();\n const edgeMeta = new Map<string, { transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }>();\n\n for (const t of filtered) {\n if (t.hasGuard) {\n const keyPass = `${t.from}+${t.event}->${t.to}[pass]`;\n const keyFail = `${t.from}+${t.event}->${t.to}[fail]`;\n uncovered.add(keyPass);\n uncovered.add(keyFail);\n edgeMeta.set(keyPass, { transition: t, guardCase: 'pass' });\n edgeMeta.set(keyFail, { transition: t, guardCase: 'fail' });\n } else {\n const key = `${t.from}+${t.event}->${t.to}`;\n uncovered.add(key);\n edgeMeta.set(key, { transition: t, guardCase: null });\n }\n }\n\n if (uncovered.size === 0) return [];\n\n // 3. Precompute BFS shortest paths between all state pairs\n const shortestPaths = new Map<string, Map<string, Array<{ event: string; to: string }>>>();\n for (const state of allStates) {\n shortestPaths.set(state, bfsShortestPaths(state, graph));\n }\n\n // 4. Greedy walk\n const walk: WalkStep[] = [];\n let currentState = initialState;\n const maxIterations = uncovered.size * allStates.size * 2; // safety bound\n let iterations = 0;\n\n while (uncovered.size > 0 && iterations < maxIterations) {\n iterations++;\n\n // Find uncovered edges from currentState\n const outgoing = findUncoveredEdges(currentState, graph, uncovered);\n\n if (outgoing.length > 0) {\n // Pick first uncovered edge\n const pick = outgoing[0];\n const payload = buildPayloadForEdge(pick.transition, pick.guardCase);\n\n walk.push({\n from: currentState,\n event: pick.transition.event,\n to: pick.transition.to,\n guardCase: pick.guardCase,\n payload,\n isRepositioning: false,\n });\n\n uncovered.delete(pick.key);\n\n // Guard-fail doesn't advance state\n if (pick.guardCase !== 'fail') {\n currentState = pick.transition.to;\n }\n } else {\n // Stuck: find nearest state with uncovered edges\n const target = findNearestUncoveredState(currentState, graph, uncovered, shortestPaths);\n\n if (!target) {\n // No reachable state with uncovered edges. Remaining edges are unreachable.\n break;\n }\n\n // Insert repositioning steps\n const repoPath = shortestPaths.get(currentState)?.get(target);\n if (!repoPath || repoPath.length === 0) break;\n\n for (const step of repoPath) {\n walk.push({\n from: currentState,\n event: step.event,\n to: step.to,\n guardCase: null,\n payload: {},\n isRepositioning: true,\n });\n currentState = step.to;\n }\n }\n }\n\n return walk;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * BFS from a source state, returning shortest paths to all reachable states.\n * Each path is an array of {event, to} steps.\n */\nfunction bfsShortestPaths(\n source: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n): Map<string, Array<{ event: string; to: string }>> {\n const paths = new Map<string, Array<{ event: string; to: string }>>();\n const visited = new Set<string>([source]);\n const queue: Array<{ state: string; path: Array<{ event: string; to: string }> }> = [\n { state: source, path: [] },\n ];\n\n while (queue.length > 0) {\n const { state, path } = queue.shift()!;\n const edges = graph.get(state) ?? [];\n\n for (const edge of edges) {\n if (visited.has(edge.to)) continue;\n visited.add(edge.to);\n const newPath = [...path, { event: edge.event, to: edge.to }];\n paths.set(edge.to, newPath);\n queue.push({ state: edge.to, path: newPath });\n }\n }\n\n return paths;\n}\n\n/**\n * Find uncovered edges from a given state.\n */\nfunction findUncoveredEdges(\n state: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n uncovered: Set<string>,\n): Array<{ key: string; transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }> {\n const edges = graph.get(state) ?? [];\n const result: Array<{ key: string; transition: EdgeWalkTransition; guardCase: 'pass' | 'fail' | null }> = [];\n\n for (const edge of edges) {\n if (edge.transition.hasGuard) {\n const keyPass = `${state}+${edge.event}->${edge.to}[pass]`;\n const keyFail = `${state}+${edge.event}->${edge.to}[fail]`;\n // Prefer pass first (advances state), then fail\n if (uncovered.has(keyPass)) {\n result.push({ key: keyPass, transition: edge.transition, guardCase: 'pass' });\n }\n if (uncovered.has(keyFail)) {\n result.push({ key: keyFail, transition: edge.transition, guardCase: 'fail' });\n }\n } else {\n const key = `${state}+${edge.event}->${edge.to}`;\n if (uncovered.has(key)) {\n result.push({ key, transition: edge.transition, guardCase: null });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Find the nearest state (from currentState) that has uncovered outgoing edges.\n */\nfunction findNearestUncoveredState(\n currentState: string,\n graph: Map<string, Array<{ event: string; to: string; transition: EdgeWalkTransition }>>,\n uncovered: Set<string>,\n shortestPaths: Map<string, Map<string, Array<{ event: string; to: string }>>>,\n): string | null {\n // Collect states that have uncovered edges\n const statesWithUncovered = new Set<string>();\n for (const key of uncovered) {\n // Key format: \"state+EVENT->target\" or \"state+EVENT->target[pass]\"\n const fromState = key.split('+')[0];\n statesWithUncovered.add(fromState);\n }\n\n // If current state has uncovered edges, return it (shouldn't happen, but handle it)\n if (statesWithUncovered.has(currentState)) return currentState;\n\n // Find nearest reachable state with uncovered edges\n const paths = shortestPaths.get(currentState);\n if (!paths) return null;\n\n let nearestState: string | null = null;\n let nearestDist = Infinity;\n\n for (const target of statesWithUncovered) {\n const path = paths.get(target);\n if (path && path.length < nearestDist) {\n nearestDist = path.length;\n nearestState = target;\n }\n }\n\n return nearestState;\n}\n\n/**\n * Build a payload for a given edge based on its guard case and payload schema.\n * For guarded transitions, uses guard expressions to generate pass/fail payloads.\n * For unguarded transitions with payload schemas (e.g., EDIT/VIEW with { id }),\n * generates mock values so fetch-by-ID effects can resolve entity data.\n */\nfunction buildPayloadForEdge(\n transition: EdgeWalkTransition,\n guardCase: 'pass' | 'fail' | null,\n): EventPayload {\n // Guard-based payload generation (existing behavior)\n if (transition.hasGuard && transition.guard && guardCase) {\n const payloads = buildGuardPayloads(transition.guard);\n return guardCase === 'pass' ? payloads.pass : payloads.fail;\n }\n\n // Schema-based payload generation for events that declare required fields\n // (e.g., EDIT/VIEW declare { name: \"id\", type: \"string\", required: true })\n if (transition.payloadSchema && transition.payloadSchema.length > 0) {\n const payload: EventPayload = {};\n for (const field of transition.payloadSchema) {\n // Use caller-provided mockValue if available (set from entity context)\n if (field.mockValue !== undefined) {\n payload[field.name] = field.mockValue as EventPayloadValue;\n } else if (field.type === 'string') {\n payload[field.name] = `mock-${field.name}`;\n } else if (field.type === 'number') {\n payload[field.name] = 1;\n } else if (field.type === 'boolean') {\n payload[field.name] = true;\n } else if (field.type === 'object' || field.type === 'any') {\n // `mock-<name>` is a plain string; persisting that for an object\n // field (e.g. SAVE's `data: object` carrying a form row) spreads\n // the string's characters across numeric keys server-side and\n // the downstream grid renders blank cards. An empty object is a\n // safer default — callers that need entity-shaped mocks should\n // set `mockValue` at the call site (see orbital-verify-unified's\n // phase4-browser TraitWalkConfig builder).\n payload[field.name] = {};\n } else {\n payload[field.name] = `mock-${field.name}`;\n }\n }\n return payload;\n }\n\n return {};\n}\n"]}
|