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,136 @@
1
+ /**
2
+ * Tree Formatter - Generates Mermaid diagram from tree structure
3
+ */
4
+ /**
5
+ * Format tree as Mermaid diagram
6
+ */
7
+ export function formatTreeAsMermaid(root) {
8
+ if (!root) {
9
+ return 'graph TD\n A["No execution tree"]';
10
+ }
11
+ const lines = [];
12
+ lines.push('graph TD');
13
+ lines.push('');
14
+ // Generate nodes
15
+ const nodes = [];
16
+ const edges = [];
17
+ const styles = [];
18
+ collectNodesAndEdges(root, nodes, edges, styles);
19
+ // Add nodes section
20
+ lines.push('%% Nodes');
21
+ lines.push(...nodes);
22
+ lines.push('');
23
+ // Add edges section
24
+ lines.push('%% Edges');
25
+ lines.push(...edges);
26
+ lines.push('');
27
+ // Add styles section
28
+ lines.push('%% Styles');
29
+ lines.push(...styles);
30
+ return lines.join('\n');
31
+ }
32
+ /**
33
+ * Collect nodes, edges, and styles recursively
34
+ */
35
+ function collectNodesAndEdges(node, nodes, edges, styles, isRoot = true) {
36
+ // Generate node definition
37
+ const nodeLabel = formatNodeLabel(node);
38
+ nodes.push(`${node.id}[${nodeLabel}]`);
39
+ // Generate style
40
+ const style = getNodeStyle(node, isRoot);
41
+ if (style) {
42
+ styles.push(style);
43
+ }
44
+ // Generate edges to children
45
+ for (let i = 0; i < node.children.length; i++) {
46
+ const child = node.children[i];
47
+ // Use actual subgoal content if available, otherwise generic label
48
+ let edgeLabel = `subgoal ${i + 1}`;
49
+ if (node.subgoals && i < node.subgoals.length) {
50
+ edgeLabel = node.subgoals[i].goal;
51
+ }
52
+ edges.push(`${node.id} -->|"${edgeLabel}"| ${child.id}`);
53
+ // Recursively process child
54
+ collectNodesAndEdges(child, nodes, edges, styles, false);
55
+ }
56
+ }
57
+ /**
58
+ * Format node label with circled numbers and clause info
59
+ */
60
+ function formatNodeLabel(node) {
61
+ const parts = [];
62
+ // Use source clause head if available, otherwise use goal
63
+ const displayGoal = node.clauseHead || node.goal;
64
+ // Add call step with circled number
65
+ parts.push(`${toCircledNumber(node.callStep)} ${displayGoal}`);
66
+ // Add clause number if available
67
+ if (node.clauseNumber) {
68
+ parts.push(`clause ${node.clauseNumber}`);
69
+ }
70
+ // Add exit step and binding if available
71
+ if (node.exitStep) {
72
+ parts.push(`${toCircledNumber(node.exitStep)} EXIT${node.finalBinding ? ': ' + node.finalBinding : ''}`);
73
+ }
74
+ return `"${parts.join('<br/>')}"`;
75
+ }
76
+ /**
77
+ * Convert number to circled Unicode character
78
+ */
79
+ function toCircledNumber(n) {
80
+ if (n >= 1 && n <= 20) {
81
+ // Unicode circled numbers 1-20
82
+ return String.fromCharCode(0x2460 + n - 1);
83
+ }
84
+ else if (n >= 21 && n <= 35) {
85
+ // Unicode circled numbers 21-35
86
+ return String.fromCharCode(0x3251 + n - 21);
87
+ }
88
+ else if (n >= 36 && n <= 50) {
89
+ // Unicode circled numbers 36-50
90
+ return String.fromCharCode(0x32B1 + n - 36);
91
+ }
92
+ else {
93
+ // Fallback for numbers > 50
94
+ return `(${n})`;
95
+ }
96
+ }
97
+ /**
98
+ * Get Mermaid style for node based on status
99
+ */
100
+ function getNodeStyle(node, isRoot) {
101
+ if (isRoot) {
102
+ // Blue for root query
103
+ return `style ${node.id} fill:#e1f5ff,stroke:#01579b,stroke-width:3px`;
104
+ }
105
+ switch (node.status) {
106
+ case 'success':
107
+ // Green for success
108
+ return `style ${node.id} fill:#c8e6c9,stroke:#388e3c`;
109
+ case 'failure':
110
+ // Red for failure
111
+ return `style ${node.id} fill:#ffcdd2,stroke:#c62828`;
112
+ case 'pending':
113
+ // Yellow for pending
114
+ return `style ${node.id} fill:#fff9c4,stroke:#f57f17`;
115
+ default:
116
+ return null;
117
+ }
118
+ }
119
+ /**
120
+ * Handle backtracking visualization in tree
121
+ */
122
+ export function markBacktrackingPaths(root) {
123
+ // Walk the tree and mark failed attempts
124
+ function markNode(node) {
125
+ // If this node failed, mark it
126
+ if (node.status === 'failure') {
127
+ // Already marked by status
128
+ }
129
+ // Process children
130
+ for (const child of node.children) {
131
+ markNode(child);
132
+ }
133
+ }
134
+ markNode(root);
135
+ }
136
+ //# sourceMappingURL=tree-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-formatter.js","sourceRoot":"","sources":["../src/tree-formatter.ts"],"names":[],"mappings":"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"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Tree Builder - Constructs hierarchical call tree from trace events
3
+ */
4
+ import { TraceEvent } from './timeline.js';
5
+ import { SourceClauseMap } from './clauses.js';
6
+ export interface TreeNode {
7
+ id: string;
8
+ goal: string;
9
+ clauseHead?: string;
10
+ clauseNumber?: string;
11
+ callStep: number;
12
+ exitStep?: number;
13
+ status: 'success' | 'failure' | 'pending';
14
+ children: TreeNode[];
15
+ finalBinding?: string;
16
+ subgoals?: Array<{
17
+ label: string;
18
+ goal: string;
19
+ }>;
20
+ }
21
+ /**
22
+ * Tree Builder class - constructs call tree from trace events
23
+ */
24
+ export declare class TreeBuilder {
25
+ private events;
26
+ private sourceClauseMap?;
27
+ private nodes;
28
+ private nodeCounter;
29
+ private callStack;
30
+ private stepToNode;
31
+ private stepCounter;
32
+ constructor(events: TraceEvent[], sourceClauseMap?: SourceClauseMap | undefined);
33
+ /**
34
+ * Check if a predicate is part of tracer infrastructure and should be filtered
35
+ */
36
+ private isTracerPredicate;
37
+ /**
38
+ * Build the complete tree from trace events
39
+ */
40
+ build(): TreeNode | null;
41
+ /**
42
+ * Backfill clause information from EXIT events to nodes
43
+ * CALL events don't have clause info, only EXIT events do
44
+ */
45
+ private backfillClauseInfo;
46
+ /**
47
+ * Generate node ID (A-Z, AA-AZ, BA-BZ, ...)
48
+ */
49
+ private generateNodeId;
50
+ /**
51
+ * Process CALL event - create new node
52
+ */
53
+ private processCall;
54
+ /**
55
+ * Extract subgoals from a clause body
56
+ */
57
+ private extractSubgoals;
58
+ /**
59
+ * Process EXIT event - mark node as successful
60
+ */
61
+ private processExit;
62
+ /**
63
+ * Process FAIL event - mark node as failed
64
+ */
65
+ private processFail;
66
+ /**
67
+ * Extract binding by comparing CALL and EXIT goals
68
+ */
69
+ private extractBinding;
70
+ /**
71
+ * Split arguments respecting parentheses and brackets
72
+ */
73
+ private splitArguments;
74
+ }
75
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,qBAAa,WAAW;IAOV,OAAO,CAAC,MAAM;IAAgB,OAAO,CAAC,eAAe,CAAC;IANlE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,WAAW,CAAK;gBAEJ,MAAM,EAAE,UAAU,EAAE,EAAU,eAAe,CAAC,EAAE,eAAe,YAAA;IAEnF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,KAAK,IAAI,QAAQ,GAAG,IAAI;IAsCxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,WAAW;IA+CnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,cAAc;CA0BvB"}
package/dist/tree.js ADDED
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Tree Builder - Constructs hierarchical call tree from trace events
3
+ */
4
+ /**
5
+ * Tree Builder class - constructs call tree from trace events
6
+ */
7
+ export class TreeBuilder {
8
+ events;
9
+ sourceClauseMap;
10
+ nodes = [];
11
+ nodeCounter = 0;
12
+ callStack = new Map(); // level -> node
13
+ stepToNode = new Map(); // step number -> node
14
+ stepCounter = 0;
15
+ constructor(events, sourceClauseMap) {
16
+ this.events = events;
17
+ this.sourceClauseMap = sourceClauseMap;
18
+ }
19
+ /**
20
+ * Check if a predicate is part of tracer infrastructure and should be filtered
21
+ */
22
+ isTracerPredicate(predicate) {
23
+ const tracerPredicates = [
24
+ 'catch/3',
25
+ 'export_trace_json/1',
26
+ 'run_trace/0',
27
+ 'install_tracer/1',
28
+ 'remove_tracer/0',
29
+ ];
30
+ return tracerPredicates.includes(predicate);
31
+ }
32
+ /**
33
+ * Build the complete tree from trace events
34
+ */
35
+ build() {
36
+ let root = null;
37
+ for (const event of this.events) {
38
+ // Filter out tracer infrastructure
39
+ if (this.isTracerPredicate(event.predicate)) {
40
+ continue;
41
+ }
42
+ this.stepCounter++;
43
+ switch (event.port) {
44
+ case 'call':
45
+ const node = this.processCall(event, this.stepCounter);
46
+ if (!root) {
47
+ root = node;
48
+ }
49
+ break;
50
+ case 'exit':
51
+ this.processExit(event, this.stepCounter);
52
+ break;
53
+ case 'redo':
54
+ // REDO doesn't create new nodes, just marks retry
55
+ break;
56
+ case 'fail':
57
+ this.processFail(event, this.stepCounter);
58
+ break;
59
+ }
60
+ }
61
+ // Backfill clause info from EXIT events to nodes
62
+ if (root) {
63
+ this.backfillClauseInfo();
64
+ }
65
+ return root;
66
+ }
67
+ /**
68
+ * Backfill clause information from EXIT events to nodes
69
+ * CALL events don't have clause info, only EXIT events do
70
+ */
71
+ backfillClauseInfo() {
72
+ // For each node, find its EXIT event to get clause info
73
+ for (const node of this.nodes) {
74
+ if (!node.clauseHead && node.clauseNumber && this.sourceClauseMap) {
75
+ const lineNumber = parseInt(node.clauseNumber);
76
+ const sourceClause = this.sourceClauseMap[lineNumber];
77
+ if (sourceClause) {
78
+ node.clauseHead = sourceClause.head;
79
+ // Extract subgoals from clause body
80
+ if (sourceClause.body && sourceClause.body !== 'true') {
81
+ const subgoalGoals = this.extractSubgoals(sourceClause.body);
82
+ node.subgoals = subgoalGoals.map((goal, index) => ({
83
+ label: `[${node.callStep}.${index + 1}]`,
84
+ goal,
85
+ }));
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Generate node ID (A-Z, AA-AZ, BA-BZ, ...)
93
+ */
94
+ generateNodeId() {
95
+ const index = this.nodeCounter++;
96
+ if (index < 26) {
97
+ return String.fromCharCode(65 + index); // A-Z
98
+ }
99
+ // After Z: AA, AB, AC, ..., AZ, BA, BB, ...
100
+ const firstChar = String.fromCharCode(65 + Math.floor(index / 26) - 1);
101
+ const secondChar = String.fromCharCode(65 + (index % 26));
102
+ return firstChar + secondChar;
103
+ }
104
+ /**
105
+ * Process CALL event - create new node
106
+ */
107
+ processCall(event, stepNumber) {
108
+ // Get source clause if available
109
+ let clauseHead;
110
+ let subgoals;
111
+ if (event.clause && this.sourceClauseMap) {
112
+ const sourceClause = this.sourceClauseMap[event.clause.line];
113
+ if (sourceClause) {
114
+ clauseHead = sourceClause.head;
115
+ // Extract subgoals from clause body
116
+ if (sourceClause.body && sourceClause.body !== 'true') {
117
+ const subgoalGoals = this.extractSubgoals(sourceClause.body);
118
+ subgoals = subgoalGoals.map((goal, index) => ({
119
+ label: `[${stepNumber}.${index + 1}]`,
120
+ goal,
121
+ }));
122
+ }
123
+ }
124
+ }
125
+ const node = {
126
+ id: this.generateNodeId(),
127
+ goal: event.goal,
128
+ clauseHead,
129
+ clauseNumber: event.clause?.line.toString(),
130
+ callStep: stepNumber,
131
+ status: 'pending',
132
+ children: [],
133
+ subgoals,
134
+ };
135
+ // Add as child to parent if there is one
136
+ const parentLevel = event.level - 1;
137
+ const parent = this.callStack.get(parentLevel);
138
+ if (parent) {
139
+ parent.children.push(node);
140
+ }
141
+ // Track in call stack
142
+ this.callStack.set(event.level, node);
143
+ this.stepToNode.set(stepNumber, node);
144
+ this.nodes.push(node);
145
+ return node;
146
+ }
147
+ /**
148
+ * Extract subgoals from a clause body
149
+ */
150
+ extractSubgoals(clauseBody) {
151
+ if (!clauseBody || clauseBody === 'true') {
152
+ return [];
153
+ }
154
+ // Split on commas, respecting parentheses depth
155
+ const subgoals = [];
156
+ let current = '';
157
+ let depth = 0;
158
+ for (const char of clauseBody) {
159
+ if (char === '(') {
160
+ depth++;
161
+ current += char;
162
+ }
163
+ else if (char === ')') {
164
+ depth--;
165
+ current += char;
166
+ }
167
+ else if (char === ',' && depth === 0) {
168
+ subgoals.push(current.trim());
169
+ current = '';
170
+ }
171
+ else {
172
+ current += char;
173
+ }
174
+ }
175
+ if (current.trim()) {
176
+ subgoals.push(current.trim());
177
+ }
178
+ return subgoals;
179
+ }
180
+ /**
181
+ * Process EXIT event - mark node as successful
182
+ */
183
+ processExit(event, stepNumber) {
184
+ const node = this.callStack.get(event.level);
185
+ if (node) {
186
+ node.exitStep = stepNumber;
187
+ node.status = 'success';
188
+ // Store clause number from EXIT event
189
+ if (event.clause && !node.clauseNumber) {
190
+ node.clauseNumber = event.clause.line.toString();
191
+ }
192
+ // Extract final binding if available
193
+ // Compare CALL goal with EXIT goal to find bindings
194
+ const callGoal = node.goal;
195
+ const exitGoal = event.goal;
196
+ if (callGoal !== exitGoal) {
197
+ node.finalBinding = this.extractBinding(callGoal, exitGoal);
198
+ }
199
+ // Remove from call stack
200
+ this.callStack.delete(event.level);
201
+ }
202
+ }
203
+ /**
204
+ * Process FAIL event - mark node as failed
205
+ */
206
+ processFail(event, stepNumber) {
207
+ const node = this.callStack.get(event.level);
208
+ if (node) {
209
+ node.exitStep = stepNumber;
210
+ node.status = 'failure';
211
+ // Remove from call stack
212
+ this.callStack.delete(event.level);
213
+ }
214
+ }
215
+ /**
216
+ * Extract binding by comparing CALL and EXIT goals
217
+ */
218
+ extractBinding(callGoal, exitGoal) {
219
+ // Simple extraction - find the first variable that changed
220
+ const callMatch = callGoal.match(/^([^(]+)\((.*)\)$/);
221
+ const exitMatch = exitGoal.match(/^([^(]+)\((.*)\)$/);
222
+ if (!callMatch || !exitMatch) {
223
+ return undefined;
224
+ }
225
+ const callArgs = this.splitArguments(callMatch[2]);
226
+ const exitArgs = this.splitArguments(exitMatch[2]);
227
+ // Find first differing argument where call has variable
228
+ for (let i = 0; i < Math.min(callArgs.length, exitArgs.length); i++) {
229
+ const callArg = callArgs[i].trim();
230
+ const exitArg = exitArgs[i].trim();
231
+ if (callArg !== exitArg && /^[A-Z_]/.test(callArg)) {
232
+ return `${callArg}=${exitArg}`;
233
+ }
234
+ }
235
+ return undefined;
236
+ }
237
+ /**
238
+ * Split arguments respecting parentheses and brackets
239
+ */
240
+ splitArguments(argsStr) {
241
+ const args = [];
242
+ let current = '';
243
+ let depth = 0;
244
+ for (const char of argsStr) {
245
+ if (char === '(' || char === '[') {
246
+ depth++;
247
+ current += char;
248
+ }
249
+ else if (char === ')' || char === ']') {
250
+ depth--;
251
+ current += char;
252
+ }
253
+ else if (char === ',' && depth === 0) {
254
+ args.push(current.trim());
255
+ current = '';
256
+ }
257
+ else {
258
+ current += char;
259
+ }
260
+ }
261
+ if (current.trim()) {
262
+ args.push(current.trim());
263
+ }
264
+ return args;
265
+ }
266
+ }
267
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"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"}
package/dist/wrapper.d.ts CHANGED
@@ -19,8 +19,15 @@ export interface TempFile {
19
19
  */
20
20
  export declare function generateWrapper(config: WrapperConfig): string;
21
21
  /**
22
- * Creates a temporary wrapper file and returns its path along with a cleanup function.
22
+ * Calculates the line offset between wrapper file and original source file.
23
+ * This is needed because the tracer reports line numbers from the wrapper file,
24
+ * but we need to map them back to the original source file line numbers.
23
25
  */
26
+ export declare function calculateLineOffset(prologContent: string): number;
27
+ /**
28
+ * Maps a line number from the wrapper file back to the original source file.
29
+ */
30
+ export declare function mapWrapperLineToSource(wrapperLine: number, prologContent: string): number;
24
31
  export declare function createTempWrapper(config: WrapperConfig): Promise<TempFile>;
25
32
  /**
26
33
  * Serializes a wrapper back to its component parts (for testing round-trips).
@@ -1 +1 @@
1
- {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA0B7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BlE"}
1
+ {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgC7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CASjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAMzF;AACD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BlE"}
package/dist/wrapper.js CHANGED
@@ -11,33 +11,57 @@ import * as os from 'node:os';
11
11
  * - Tracer cleanup
12
12
  */
13
13
  export function generateWrapper(config) {
14
- const { prologContent, query, tracerPath } = config;
14
+ const { prologContent, query, depth, tracerPath } = config;
15
+ const maxDepth = depth || 100; // Default to 100 if not specified
15
16
  const lines = [
16
17
  `% Load custom tracer`,
17
18
  `:- ['${tracerPath}'].`,
18
19
  '',
19
20
  `% User's Prolog code (no instrumentation)`,
20
- prologContent.trim(),
21
- '',
22
- '% Run trace with error handling',
23
- 'run_trace :-',
24
- ' install_tracer,',
25
- ' catch(',
26
- ` (${query.trim()}, export_trace_json('trace.json')),`,
27
- ' Error,',
28
- ` (format('Error: ~w~n', [Error]), export_trace_json('trace.json'))`,
29
- ' ),',
30
- ' remove_tracer.',
31
- '',
32
- ':- run_trace.',
33
- ':- halt.',
34
- '',
35
21
  ];
22
+ // Add user content and track line mapping
23
+ const userLines = prologContent.trim().split('\n');
24
+ const wrapperStartLine = lines.length + 1; // +1 for 1-based indexing
25
+ lines.push(...userLines);
26
+ lines.push('');
27
+ lines.push('% Run trace with error handling');
28
+ lines.push('run_trace :-');
29
+ lines.push(` install_tracer(${maxDepth}),`);
30
+ lines.push(' catch(');
31
+ lines.push(` (${query.trim()}, export_trace_json('trace.json')),`);
32
+ lines.push(' Error,');
33
+ lines.push(` (format('Error: ~w~n', [Error]), export_trace_json('trace.json'))`);
34
+ lines.push(' ),');
35
+ lines.push(' remove_tracer.');
36
+ lines.push('');
37
+ lines.push(':- run_trace.');
38
+ lines.push(':- halt.');
39
+ lines.push('');
36
40
  return lines.join('\n');
37
41
  }
38
42
  /**
39
- * Creates a temporary wrapper file and returns its path along with a cleanup function.
43
+ * Calculates the line offset between wrapper file and original source file.
44
+ * This is needed because the tracer reports line numbers from the wrapper file,
45
+ * but we need to map them back to the original source file line numbers.
40
46
  */
47
+ export function calculateLineOffset(prologContent) {
48
+ // The wrapper structure is:
49
+ // Line 1: % Load custom tracer
50
+ // Line 2: :- ['tracerPath'].
51
+ // Line 3: (empty)
52
+ // Line 4: % User's Prolog code (no instrumentation)
53
+ // Line 5+: User content starts here
54
+ return 4; // User content starts at line 5 in wrapper, so offset is 4
55
+ }
56
+ /**
57
+ * Maps a line number from the wrapper file back to the original source file.
58
+ */
59
+ export function mapWrapperLineToSource(wrapperLine, prologContent) {
60
+ const offset = calculateLineOffset(prologContent);
61
+ // Simple mapping: wrapper line - offset = source line
62
+ // The wrapper includes all source lines as-is, so no need to skip empty lines or comments
63
+ return wrapperLine - offset;
64
+ }
41
65
  export async function createTempWrapper(config) {
42
66
  const content = generateWrapper(config);
43
67
  const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'prolog-trace-viz-'));
@@ -1 +1 @@
1
- {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAc9B;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEpD,MAAM,KAAK,GAAa;QACtB,sBAAsB;QACtB,QAAQ,UAAU,KAAK;QACvB,EAAE;QACF,2CAA2C;QAC3C,aAAa,CAAC,IAAI,EAAE;QACpB,EAAE;QACF,iCAAiC;QACjC,cAAc;QACd,qBAAqB;QACrB,YAAY;QACZ,YAAY,KAAK,CAAC,IAAI,EAAE,qCAAqC;QAC7D,gBAAgB;QAChB,2EAA2E;QAC3E,QAAQ;QACR,oBAAoB;QACpB,EAAE;QACF,eAAe;QACf,UAAU;QACV,EAAE;KACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAqB;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAErD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,sBAAsB;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAElC,8FAA8F;IAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnC,oEAAoE;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC3H,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7C,OAAO;QACL,aAAa;QACb,KAAK;QACL,UAAU;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prolog-trace-viz",
3
- "version": "1.1.2",
3
+ "version": "2.0.0",
4
4
  "description": "Generate enhanced visual trace diagrams for Prolog query execution",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",