prolog-trace-viz 1.1.2 → 2.0.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.
Files changed (46) hide show
  1. package/README.md +43 -30
  2. package/dist/analyzer.d.ts.map +1 -1
  3. package/dist/analyzer.js +268 -96
  4. package/dist/analyzer.js.map +1 -1
  5. package/dist/build-info.d.ts +3 -3
  6. package/dist/build-info.js +3 -3
  7. package/dist/clauses.d.ts +11 -0
  8. package/dist/clauses.d.ts.map +1 -1
  9. package/dist/clauses.js +12 -0
  10. package/dist/clauses.js.map +1 -1
  11. package/dist/cli.d.ts +4 -6
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +2 -25
  14. package/dist/cli.js.map +1 -1
  15. package/dist/index.js +80 -22
  16. package/dist/index.js.map +1 -1
  17. package/dist/markdown-generator.d.ts +24 -0
  18. package/dist/markdown-generator.d.ts.map +1 -0
  19. package/dist/markdown-generator.js +124 -0
  20. package/dist/markdown-generator.js.map +1 -0
  21. package/dist/parser.d.ts +12 -1
  22. package/dist/parser.d.ts.map +1 -1
  23. package/dist/parser.js +67 -35
  24. package/dist/parser.js.map +1 -1
  25. package/dist/timeline-formatter.d.ts +9 -0
  26. package/dist/timeline-formatter.d.ts.map +1 -0
  27. package/dist/timeline-formatter.js +149 -0
  28. package/dist/timeline-formatter.js.map +1 -0
  29. package/dist/timeline.d.ts +148 -0
  30. package/dist/timeline.d.ts.map +1 -0
  31. package/dist/timeline.js +601 -0
  32. package/dist/timeline.js.map +1 -0
  33. package/dist/tree-formatter.d.ts +13 -0
  34. package/dist/tree-formatter.d.ts.map +1 -0
  35. package/dist/tree-formatter.js +136 -0
  36. package/dist/tree-formatter.js.map +1 -0
  37. package/dist/tree.d.ts +75 -0
  38. package/dist/tree.d.ts.map +1 -0
  39. package/dist/tree.js +267 -0
  40. package/dist/tree.js.map +1 -0
  41. package/dist/wrapper.d.ts +8 -1
  42. package/dist/wrapper.d.ts.map +1 -1
  43. package/dist/wrapper.js +41 -17
  44. package/dist/wrapper.js.map +1 -1
  45. package/package.json +1 -1
  46. package/tracer.pl +127 -16
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Timeline Builder - Constructs a flat, sequential timeline from trace events
3
+ */
4
+ /**
5
+ * Timeline Builder class - processes trace events into timeline steps
6
+ */
7
+ export class TimelineBuilder {
8
+ events;
9
+ sourceClauseMap;
10
+ steps = [];
11
+ stepCounter = 0;
12
+ callStack = new Map(); // level -> step number
13
+ subgoalMap = new Map(); // level -> subgoal info
14
+ parentSubgoals = new Map(); // step number -> subgoals
15
+ completedSubgoals = new Map(); // parent step -> count of completed subgoals
16
+ constructor(events, sourceClauseMap) {
17
+ this.events = events;
18
+ this.sourceClauseMap = sourceClauseMap;
19
+ }
20
+ /**
21
+ * Check if a predicate is part of tracer infrastructure and should be filtered
22
+ */
23
+ isTracerPredicate(predicate) {
24
+ const tracerPredicates = [
25
+ 'catch/3',
26
+ 'export_trace_json/1',
27
+ 'run_trace/0',
28
+ 'install_tracer/1',
29
+ 'remove_tracer/0',
30
+ ];
31
+ return tracerPredicates.includes(predicate);
32
+ }
33
+ /**
34
+ * Build the complete timeline from trace events
35
+ */
36
+ build() {
37
+ // First pass: process all events
38
+ for (const event of this.events) {
39
+ // Filter out tracer infrastructure
40
+ if (!this.isTracerPredicate(event.predicate)) {
41
+ this.processEvent(event);
42
+ }
43
+ }
44
+ // Second pass: backfill clause info from EXIT to CALL steps
45
+ this.backfillClauseInfo();
46
+ // Third pass: update subgoal tracking based on execution flow
47
+ this.updateSubgoalTracking();
48
+ // Fourth pass: add variable flow tracking notes
49
+ this.addVariableFlowNotes();
50
+ return this.steps;
51
+ }
52
+ /**
53
+ * Backfill clause information from EXIT events to their corresponding CALL events
54
+ */
55
+ backfillClauseInfo() {
56
+ // For each CALL step without clause info, find its matching EXIT
57
+ for (let i = 0; i < this.steps.length; i++) {
58
+ const callStep = this.steps[i];
59
+ if (callStep.port === 'call' && !callStep.clause) {
60
+ // Find the matching EXIT for this CALL
61
+ // It should be at the same level and have the same predicate
62
+ const exitStep = this.findMatchingExit(callStep, i);
63
+ if (exitStep && exitStep.clause) {
64
+ // Use source clause if available, otherwise use runtime clause
65
+ const sourceClause = this.getSourceClause(exitStep.clause.line);
66
+ if (sourceClause) {
67
+ callStep.clause = {
68
+ head: sourceClause.head,
69
+ body: sourceClause.body || 'true',
70
+ line: sourceClause.number,
71
+ };
72
+ }
73
+ else {
74
+ callStep.clause = exitStep.clause;
75
+ }
76
+ // Extract pattern match bindings using source clause head
77
+ const patternBindings = this.extractPatternMatchBindings(callStep.goal, callStep.clause.head);
78
+ callStep.unifications = patternBindings;
79
+ // Re-extract subgoals now that we have clause info
80
+ if (callStep.clause.body && callStep.clause.body !== 'true') {
81
+ const subgoalGoals = this.extractSubgoals(callStep.clause.body);
82
+ callStep.subgoals = subgoalGoals.map((goal, index) => ({
83
+ label: `[${callStep.stepNumber}.${index + 1}]`,
84
+ goal,
85
+ }));
86
+ // Update parent subgoals map
87
+ if (callStep.subgoals.length > 0) {
88
+ this.parentSubgoals.set(callStep.stepNumber, callStep.subgoals);
89
+ this.completedSubgoals.set(callStep.stepNumber, 0);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Update subgoal tracking markers based on execution flow
98
+ * This must run after backfillClauseInfo so we have all subgoals defined
99
+ */
100
+ updateSubgoalTracking() {
101
+ // Track which subgoal is currently active at each level
102
+ const activeSubgoalMap = new Map();
103
+ for (const step of this.steps) {
104
+ if (step.port === 'call') {
105
+ // Check if this CALL is solving a subgoal
106
+ const subgoalInfo = activeSubgoalMap.get(step.level);
107
+ if (subgoalInfo) {
108
+ step.subgoalLabel = `[${subgoalInfo.parentStep}.${subgoalInfo.subgoalIndex}]`;
109
+ }
110
+ // If this CALL has subgoals, set up tracking for the first one
111
+ if (step.subgoals.length > 0) {
112
+ activeSubgoalMap.set(step.level + 1, {
113
+ parentStep: step.stepNumber,
114
+ subgoalIndex: 1,
115
+ });
116
+ }
117
+ }
118
+ else if (step.port === 'exit') {
119
+ // Check if this EXIT completes a subgoal
120
+ const subgoalInfo = activeSubgoalMap.get(step.level);
121
+ if (subgoalInfo) {
122
+ step.subgoalLabel = `[${subgoalInfo.parentStep}.${subgoalInfo.subgoalIndex}]`;
123
+ // Check if there's a next subgoal
124
+ const parentSubgoals = this.parentSubgoals.get(subgoalInfo.parentStep);
125
+ if (parentSubgoals && subgoalInfo.subgoalIndex < parentSubgoals.length) {
126
+ // Move to next subgoal
127
+ const nextSubgoalIndex = subgoalInfo.subgoalIndex + 1;
128
+ const nextSubgoalData = parentSubgoals[nextSubgoalIndex - 1];
129
+ step.nextSubgoal = `Subgoal ${nextSubgoalData.label}`;
130
+ // Update active subgoal for this level
131
+ activeSubgoalMap.set(step.level, {
132
+ parentStep: subgoalInfo.parentStep,
133
+ subgoalIndex: nextSubgoalIndex,
134
+ });
135
+ }
136
+ else {
137
+ // All subgoals completed
138
+ activeSubgoalMap.delete(step.level);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Add variable flow tracking notes to steps
146
+ * This shows how variables from parent clauses flow into child goals
147
+ */
148
+ addVariableFlowNotes() {
149
+ // Track variable bindings: step number -> variable name -> value
150
+ const bindingMap = new Map();
151
+ for (const step of this.steps) {
152
+ // Record bindings from this step
153
+ if (step.unifications.length > 0) {
154
+ const stepBindings = new Map();
155
+ for (const unif of step.unifications) {
156
+ stepBindings.set(unif.variable, unif.value);
157
+ }
158
+ bindingMap.set(step.stepNumber, stepBindings);
159
+ }
160
+ // For EXIT steps, add notes about which variables got bound
161
+ if (step.port === 'exit' && step.returnsTo) {
162
+ const callStep = this.steps.find(s => s.stepNumber === step.returnsTo);
163
+ if (callStep && callStep.unifications.length > 0) {
164
+ const notes = [];
165
+ for (const unif of callStep.unifications) {
166
+ // Check if this variable was unbound at CALL and is now bound at EXIT
167
+ if (unif.value.startsWith('_') && !step.goal.includes(unif.value)) {
168
+ // Variable was unbound, now it's bound - extract the new value from EXIT goal
169
+ const exitValue = this.extractVariableValueFromGoal(step.goal, unif.variable, callStep.clause?.head);
170
+ if (exitValue && exitValue !== unif.value) {
171
+ notes.push(`${unif.variable} from Step ${callStep.stepNumber} is now bound to ${exitValue}`);
172
+ }
173
+ }
174
+ }
175
+ if (notes.length > 0) {
176
+ step.variableFlowNotes = notes;
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Extract the value of a variable from a goal based on its position in the clause head
184
+ */
185
+ extractVariableValueFromGoal(goal, variable, clauseHead) {
186
+ if (!clauseHead) {
187
+ return null;
188
+ }
189
+ // Find the position of the variable in the clause head
190
+ const headMatch = clauseHead.match(/^([^(]+)\((.*)\)$/);
191
+ const goalMatch = goal.match(/^([^(]+)\((.*)\)$/);
192
+ if (!headMatch || !goalMatch) {
193
+ return null;
194
+ }
195
+ const headArgs = this.splitArguments(headMatch[2]);
196
+ const goalArgs = this.splitArguments(goalMatch[2]);
197
+ // Find which argument position contains the variable
198
+ for (let i = 0; i < headArgs.length; i++) {
199
+ if (headArgs[i].trim() === variable) {
200
+ return goalArgs[i]?.trim() || null;
201
+ }
202
+ }
203
+ return null;
204
+ }
205
+ /**
206
+ * Get source clause from the source clause map
207
+ */
208
+ getSourceClause(lineNumber) {
209
+ if (!this.sourceClauseMap) {
210
+ return null;
211
+ }
212
+ const clause = this.sourceClauseMap[lineNumber];
213
+ if (!clause) {
214
+ return null;
215
+ }
216
+ return {
217
+ head: clause.head,
218
+ body: clause.body,
219
+ number: clause.number,
220
+ };
221
+ }
222
+ /**
223
+ * Find the matching EXIT step for a CALL step
224
+ */
225
+ findMatchingExit(callStep, startIndex) {
226
+ // Look forward from the CALL to find the matching EXIT
227
+ // The EXIT should be at the same level and return to this CALL
228
+ for (let i = startIndex + 1; i < this.steps.length; i++) {
229
+ const step = this.steps[i];
230
+ if (step.port === 'exit' &&
231
+ step.level === callStep.level &&
232
+ step.returnsTo === callStep.stepNumber) {
233
+ return step;
234
+ }
235
+ }
236
+ return null;
237
+ }
238
+ /**
239
+ * Process a single trace event
240
+ */
241
+ processEvent(event) {
242
+ switch (event.port) {
243
+ case 'call':
244
+ this.processCall(event);
245
+ break;
246
+ case 'exit':
247
+ this.processExit(event);
248
+ break;
249
+ case 'redo':
250
+ this.processRedo(event);
251
+ break;
252
+ case 'fail':
253
+ this.processFail(event);
254
+ break;
255
+ }
256
+ }
257
+ /**
258
+ * Extract subgoals from a clause body
259
+ */
260
+ extractSubgoals(clauseBody) {
261
+ if (!clauseBody || clauseBody === 'true') {
262
+ return [];
263
+ }
264
+ // Split on commas, respecting parentheses depth
265
+ const subgoals = [];
266
+ let current = '';
267
+ let depth = 0;
268
+ for (const char of clauseBody) {
269
+ if (char === '(') {
270
+ depth++;
271
+ current += char;
272
+ }
273
+ else if (char === ')') {
274
+ depth--;
275
+ current += char;
276
+ }
277
+ else if (char === ',' && depth === 0) {
278
+ subgoals.push(current.trim());
279
+ current = '';
280
+ }
281
+ else {
282
+ current += char;
283
+ }
284
+ }
285
+ if (current.trim()) {
286
+ subgoals.push(current.trim());
287
+ }
288
+ return subgoals;
289
+ }
290
+ /**
291
+ * Process CALL event
292
+ */
293
+ processCall(event) {
294
+ this.stepCounter++;
295
+ const stepNumber = this.stepCounter;
296
+ // Track this call in the stack
297
+ this.callStack.set(event.level, stepNumber);
298
+ // Use source clause if available
299
+ let clauseInfo = event.clause;
300
+ if (clauseInfo && this.sourceClauseMap) {
301
+ const sourceClause = this.getSourceClause(clauseInfo.line);
302
+ if (sourceClause) {
303
+ clauseInfo = {
304
+ head: sourceClause.head,
305
+ body: sourceClause.body || 'true',
306
+ line: sourceClause.number,
307
+ };
308
+ }
309
+ }
310
+ // Extract subgoals from clause body if available
311
+ const subgoals = [];
312
+ if (clauseInfo && clauseInfo.body) {
313
+ const subgoalGoals = this.extractSubgoals(clauseInfo.body);
314
+ subgoalGoals.forEach((goal, index) => {
315
+ subgoals.push({
316
+ label: `[${stepNumber}.${index + 1}]`,
317
+ goal,
318
+ });
319
+ });
320
+ // Store subgoals for this step
321
+ if (subgoals.length > 0) {
322
+ this.parentSubgoals.set(stepNumber, subgoals);
323
+ this.completedSubgoals.set(stepNumber, 0);
324
+ }
325
+ }
326
+ // Determine if this call is solving a subgoal (will be set during backfill)
327
+ let subgoalLabel;
328
+ // Extract pattern match bindings if clause available
329
+ const unifications = [];
330
+ if (clauseInfo) {
331
+ const patternBindings = this.extractPatternMatchBindings(event.goal, clauseInfo.head);
332
+ unifications.push(...patternBindings);
333
+ }
334
+ const step = {
335
+ stepNumber,
336
+ port: 'call',
337
+ level: event.level,
338
+ goal: event.goal,
339
+ clause: clauseInfo,
340
+ unifications,
341
+ subgoals,
342
+ subgoalLabel,
343
+ };
344
+ this.steps.push(step);
345
+ }
346
+ /**
347
+ * Extract pattern match bindings by comparing goal with clause head
348
+ * Uses structural decomposition - not heuristics, just comparing known data
349
+ */
350
+ extractPatternMatchBindings(goal, clauseHead) {
351
+ const bindings = [];
352
+ // Parse both goal and clause head
353
+ const goalMatch = goal.match(/^([^(]+)\((.*)\)$/);
354
+ const headMatch = clauseHead.match(/^([^(]+)\((.*)\)$/);
355
+ if (!goalMatch || !headMatch) {
356
+ return bindings;
357
+ }
358
+ const goalArgs = this.splitArguments(goalMatch[2]);
359
+ const headArgs = this.splitArguments(headMatch[2]);
360
+ // Match arguments positionally with structural decomposition
361
+ for (let i = 0; i < Math.min(goalArgs.length, headArgs.length); i++) {
362
+ const goalArg = goalArgs[i].trim();
363
+ const headArg = headArgs[i].trim();
364
+ // Recursively extract bindings from this argument pair
365
+ this.extractBindingsFromTermPair(headArg, goalArg, bindings);
366
+ }
367
+ return bindings;
368
+ }
369
+ /**
370
+ * Recursively extract bindings by comparing pattern term with value term
371
+ * This is structural decomposition, not unification - we're just comparing strings
372
+ */
373
+ extractBindingsFromTermPair(pattern, value, bindings) {
374
+ // If pattern is a simple variable (single uppercase/underscore identifier)
375
+ if (this.isSimpleVariable(pattern)) {
376
+ bindings.push({ variable: pattern, value });
377
+ return;
378
+ }
379
+ // If pattern and value are identical, no binding needed
380
+ if (pattern === value) {
381
+ return;
382
+ }
383
+ // Try to decompose as compound term with operators
384
+ // e.g., "X+1+1" vs "0+1+1" -> extract X=0
385
+ const patternOp = this.findOperator(pattern);
386
+ const valueOp = this.findOperator(value);
387
+ if (patternOp && valueOp && patternOp.op === valueOp.op) {
388
+ // Same operator - recursively match operands
389
+ this.extractBindingsFromTermPair(patternOp.left, valueOp.left, bindings);
390
+ this.extractBindingsFromTermPair(patternOp.right, valueOp.right, bindings);
391
+ return;
392
+ }
393
+ // Try to decompose as list
394
+ // e.g., "[H|T]" vs "[1,2,3]" -> extract H=1, T=[2,3]
395
+ if (pattern.startsWith('[') && value.startsWith('[')) {
396
+ const patternList = this.parseListPattern(pattern);
397
+ const valueList = this.parseListPattern(value);
398
+ if (patternList && valueList) {
399
+ if (patternList.head && valueList.head) {
400
+ this.extractBindingsFromTermPair(patternList.head, valueList.head, bindings);
401
+ }
402
+ if (patternList.tail && valueList.tail) {
403
+ this.extractBindingsFromTermPair(patternList.tail, valueList.tail, bindings);
404
+ }
405
+ return;
406
+ }
407
+ }
408
+ // If we can't decompose further, no binding
409
+ }
410
+ /**
411
+ * Check if a term is a simple variable
412
+ */
413
+ isSimpleVariable(term) {
414
+ return /^[A-Z_][A-Za-z0-9_]*$/.test(term);
415
+ }
416
+ /**
417
+ * Find the main operator in a term
418
+ * Returns null if no operator found
419
+ */
420
+ findOperator(term) {
421
+ const operators = ['+', '-', '*', '/'];
422
+ // Find operator at depth 0 (not inside parentheses)
423
+ let depth = 0;
424
+ for (let i = term.length - 1; i >= 0; i--) {
425
+ const char = term[i];
426
+ if (char === ')' || char === ']') {
427
+ depth++;
428
+ }
429
+ else if (char === '(' || char === '[') {
430
+ depth--;
431
+ }
432
+ else if (depth === 0 && operators.includes(char)) {
433
+ return {
434
+ op: char,
435
+ left: term.slice(0, i).trim(),
436
+ right: term.slice(i + 1).trim(),
437
+ };
438
+ }
439
+ }
440
+ return null;
441
+ }
442
+ /**
443
+ * Parse a list pattern
444
+ */
445
+ parseListPattern(list) {
446
+ if (!list.startsWith('[') || !list.endsWith(']')) {
447
+ return null;
448
+ }
449
+ const content = list.slice(1, -1).trim();
450
+ // Check for [H|T] pattern
451
+ const pipeIndex = content.indexOf('|');
452
+ if (pipeIndex !== -1) {
453
+ return {
454
+ head: content.slice(0, pipeIndex).trim(),
455
+ tail: content.slice(pipeIndex + 1).trim(),
456
+ };
457
+ }
458
+ // Check for [H, ...] pattern
459
+ const commaIndex = content.indexOf(',');
460
+ if (commaIndex !== -1) {
461
+ return {
462
+ head: content.slice(0, commaIndex).trim(),
463
+ tail: `[${content.slice(commaIndex + 1).trim()}]`,
464
+ };
465
+ }
466
+ // Single element or empty list
467
+ if (content) {
468
+ return { head: content, tail: '[]' };
469
+ }
470
+ return null;
471
+ }
472
+ /**
473
+ * Extract unifications by comparing CALL and EXIT goals
474
+ */
475
+ extractUnifications(callGoal, exitGoal) {
476
+ const unifications = [];
477
+ // Simple structural comparison - extract arguments
478
+ const callMatch = callGoal.match(/^([^(]+)\((.*)\)$/);
479
+ const exitMatch = exitGoal.match(/^([^(]+)\((.*)\)$/);
480
+ if (!callMatch || !exitMatch) {
481
+ return unifications;
482
+ }
483
+ const callArgs = this.splitArguments(callMatch[2]);
484
+ const exitArgs = this.splitArguments(exitMatch[2]);
485
+ // Compare arguments positionally
486
+ for (let i = 0; i < Math.min(callArgs.length, exitArgs.length); i++) {
487
+ const callArg = callArgs[i].trim();
488
+ const exitArg = exitArgs[i].trim();
489
+ // If call arg is a variable (starts with _ or uppercase) and exit arg is different
490
+ if (callArg !== exitArg && /^[A-Z_]/.test(callArg)) {
491
+ unifications.push({
492
+ variable: callArg,
493
+ value: exitArg,
494
+ });
495
+ }
496
+ }
497
+ return unifications;
498
+ }
499
+ /**
500
+ * Split arguments respecting parentheses and brackets
501
+ */
502
+ splitArguments(argsStr) {
503
+ const args = [];
504
+ let current = '';
505
+ let depth = 0;
506
+ for (const char of argsStr) {
507
+ if (char === '(' || char === '[') {
508
+ depth++;
509
+ current += char;
510
+ }
511
+ else if (char === ')' || char === ']') {
512
+ depth--;
513
+ current += char;
514
+ }
515
+ else if (char === ',' && depth === 0) {
516
+ args.push(current.trim());
517
+ current = '';
518
+ }
519
+ else {
520
+ current += char;
521
+ }
522
+ }
523
+ if (current.trim()) {
524
+ args.push(current.trim());
525
+ }
526
+ return args;
527
+ }
528
+ /**
529
+ * Process EXIT event
530
+ */
531
+ processExit(event) {
532
+ this.stepCounter++;
533
+ const stepNumber = this.stepCounter;
534
+ // Find the matching CALL step
535
+ const callStep = this.callStack.get(event.level);
536
+ // Extract unifications by comparing with CALL goal
537
+ let unifications = [];
538
+ if (callStep) {
539
+ const callStepData = this.steps.find(s => s.stepNumber === callStep);
540
+ if (callStepData) {
541
+ unifications = this.extractUnifications(callStepData.goal, event.goal);
542
+ }
543
+ }
544
+ // Subgoal tracking will be updated in updateSubgoalTracking pass
545
+ const step = {
546
+ stepNumber,
547
+ port: 'exit',
548
+ level: event.level,
549
+ goal: event.goal,
550
+ clause: event.clause,
551
+ unifications,
552
+ subgoals: [],
553
+ returnsTo: callStep,
554
+ };
555
+ // Remove from call stack
556
+ this.callStack.delete(event.level);
557
+ this.steps.push(step);
558
+ }
559
+ /**
560
+ * Process REDO event
561
+ */
562
+ processRedo(event) {
563
+ this.stepCounter++;
564
+ const stepNumber = this.stepCounter;
565
+ // Find the step being retried
566
+ const retriedStep = this.callStack.get(event.level);
567
+ const step = {
568
+ stepNumber,
569
+ port: 'redo',
570
+ level: event.level,
571
+ goal: event.goal,
572
+ unifications: [],
573
+ subgoals: [],
574
+ note: retriedStep ? `Retrying Step ${retriedStep}` : undefined,
575
+ };
576
+ this.steps.push(step);
577
+ }
578
+ /**
579
+ * Process FAIL event
580
+ */
581
+ processFail(event) {
582
+ this.stepCounter++;
583
+ const stepNumber = this.stepCounter;
584
+ // Find parent step
585
+ const parentLevel = event.level - 1;
586
+ const parentStep = this.callStack.get(parentLevel);
587
+ const step = {
588
+ stepNumber,
589
+ port: 'fail',
590
+ level: event.level,
591
+ goal: event.goal,
592
+ unifications: [],
593
+ subgoals: [],
594
+ note: parentStep ? `Returns to Step ${parentStep}` : undefined,
595
+ };
596
+ // Remove from call stack
597
+ this.callStack.delete(event.level);
598
+ this.steps.push(step);
599
+ }
600
+ }
601
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tree Formatter - Generates Mermaid diagram from tree structure
3
+ */
4
+ import { TreeNode } from './tree.js';
5
+ /**
6
+ * Format tree as Mermaid diagram
7
+ */
8
+ export declare function formatTreeAsMermaid(root: TreeNode | null): string;
9
+ /**
10
+ * Handle backtracking visualization in tree
11
+ */
12
+ export declare function markBacktrackingPaths(root: TreeNode): void;
13
+ //# sourceMappingURL=tree-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-formatter.d.ts","sourceRoot":"","sources":["../src/tree-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CA+BjE;AA2GD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAe1D"}