tracemeld 0.1.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 (94) hide show
  1. package/build/analysis/bottleneck.d.ts +23 -0
  2. package/build/analysis/bottleneck.js +55 -0
  3. package/build/analysis/bottleneck.js.map +1 -0
  4. package/build/analysis/explain.d.ts +38 -0
  5. package/build/analysis/explain.js +139 -0
  6. package/build/analysis/explain.js.map +1 -0
  7. package/build/analysis/hotpaths.d.ts +19 -0
  8. package/build/analysis/hotpaths.js +55 -0
  9. package/build/analysis/hotpaths.js.map +1 -0
  10. package/build/analysis/hotspots.d.ts +24 -0
  11. package/build/analysis/hotspots.js +75 -0
  12. package/build/analysis/hotspots.js.map +1 -0
  13. package/build/analysis/query.d.ts +25 -0
  14. package/build/analysis/query.js +102 -0
  15. package/build/analysis/query.js.map +1 -0
  16. package/build/analysis/spinpaths.d.ts +17 -0
  17. package/build/analysis/spinpaths.js +48 -0
  18. package/build/analysis/spinpaths.js.map +1 -0
  19. package/build/analysis/starvations.d.ts +21 -0
  20. package/build/analysis/starvations.js +76 -0
  21. package/build/analysis/starvations.js.map +1 -0
  22. package/build/analysis/summary.d.ts +27 -0
  23. package/build/analysis/summary.js +130 -0
  24. package/build/analysis/summary.js.map +1 -0
  25. package/build/analysis/waste.d.ts +19 -0
  26. package/build/analysis/waste.js +33 -0
  27. package/build/analysis/waste.js.map +1 -0
  28. package/build/cli.d.ts +2 -0
  29. package/build/cli.js +4 -0
  30. package/build/cli.js.map +1 -0
  31. package/build/exporters/collapsed.d.ts +2 -0
  32. package/build/exporters/collapsed.js +34 -0
  33. package/build/exporters/collapsed.js.map +1 -0
  34. package/build/importers/chrome-trace.d.ts +2 -0
  35. package/build/importers/chrome-trace.js +146 -0
  36. package/build/importers/chrome-trace.js.map +1 -0
  37. package/build/importers/collapsed.d.ts +2 -0
  38. package/build/importers/collapsed.js +52 -0
  39. package/build/importers/collapsed.js.map +1 -0
  40. package/build/importers/detect.d.ts +2 -0
  41. package/build/importers/detect.js +60 -0
  42. package/build/importers/detect.js.map +1 -0
  43. package/build/importers/gecko.d.ts +2 -0
  44. package/build/importers/gecko.js +77 -0
  45. package/build/importers/gecko.js.map +1 -0
  46. package/build/importers/import.d.ts +11 -0
  47. package/build/importers/import.js +98 -0
  48. package/build/importers/import.js.map +1 -0
  49. package/build/importers/pprof.d.ts +2 -0
  50. package/build/importers/pprof.js +238 -0
  51. package/build/importers/pprof.js.map +1 -0
  52. package/build/importers/types.d.ts +6 -0
  53. package/build/importers/types.js +2 -0
  54. package/build/importers/types.js.map +1 -0
  55. package/build/index.d.ts +6 -0
  56. package/build/index.js +6 -0
  57. package/build/index.js.map +1 -0
  58. package/build/instrument/mark.d.ts +11 -0
  59. package/build/instrument/mark.js +13 -0
  60. package/build/instrument/mark.js.map +1 -0
  61. package/build/instrument/trace.d.ts +16 -0
  62. package/build/instrument/trace.js +107 -0
  63. package/build/instrument/trace.js.map +1 -0
  64. package/build/model/frame-table.d.ts +10 -0
  65. package/build/model/frame-table.js +27 -0
  66. package/build/model/frame-table.js.map +1 -0
  67. package/build/model/profile.d.ts +20 -0
  68. package/build/model/profile.js +89 -0
  69. package/build/model/profile.js.map +1 -0
  70. package/build/model/state.d.ts +21 -0
  71. package/build/model/state.js +59 -0
  72. package/build/model/state.js.map +1 -0
  73. package/build/model/types.d.ts +73 -0
  74. package/build/model/types.js +10 -0
  75. package/build/model/types.js.map +1 -0
  76. package/build/patterns/blind-edit.d.ts +3 -0
  77. package/build/patterns/blind-edit.js +119 -0
  78. package/build/patterns/blind-edit.js.map +1 -0
  79. package/build/patterns/redundant-read.d.ts +3 -0
  80. package/build/patterns/redundant-read.js +72 -0
  81. package/build/patterns/redundant-read.js.map +1 -0
  82. package/build/patterns/registry.d.ts +10 -0
  83. package/build/patterns/registry.js +27 -0
  84. package/build/patterns/registry.js.map +1 -0
  85. package/build/patterns/retry-loop.d.ts +3 -0
  86. package/build/patterns/retry-loop.js +57 -0
  87. package/build/patterns/retry-loop.js.map +1 -0
  88. package/build/patterns/types.d.ts +14 -0
  89. package/build/patterns/types.js +2 -0
  90. package/build/patterns/types.js.map +1 -0
  91. package/build/server.d.ts +3 -0
  92. package/build/server.js +247 -0
  93. package/build/server.js.map +1 -0
  94. package/package.json +47 -0
@@ -0,0 +1,52 @@
1
+ import { FrameTable } from '../model/frame-table.js';
2
+ export function importCollapsed(content, name) {
3
+ const frameTable = new FrameTable();
4
+ const samples = [];
5
+ const lines = content.split('\n');
6
+ for (const line of lines) {
7
+ const trimmed = line.trim();
8
+ if (trimmed.length === 0)
9
+ continue;
10
+ const lastSpace = trimmed.lastIndexOf(' ');
11
+ if (lastSpace < 0)
12
+ continue;
13
+ const stackStr = trimmed.substring(0, lastSpace).trim();
14
+ const countStr = trimmed.substring(lastSpace + 1).trim();
15
+ const count = parseInt(countStr, 10);
16
+ if (isNaN(count) || stackStr.length === 0)
17
+ continue;
18
+ const frameNames = stackStr.split(';');
19
+ const stack = [];
20
+ for (const frameName of frameNames) {
21
+ stack.push(frameTable.getOrInsert({ name: frameName }));
22
+ }
23
+ samples.push({
24
+ timestamp: null,
25
+ stack,
26
+ values: [count],
27
+ });
28
+ }
29
+ return {
30
+ format: 'collapsed',
31
+ profile: {
32
+ id: crypto.randomUUID(),
33
+ name,
34
+ created_at: Date.now(),
35
+ value_types: [{ key: 'weight', unit: 'none', description: 'Sample weight/count' }],
36
+ categories: [],
37
+ frames: [...frameTable.frames],
38
+ lanes: [
39
+ {
40
+ id: 'main',
41
+ name: 'main',
42
+ kind: 'main',
43
+ samples,
44
+ spans: [],
45
+ markers: [],
46
+ },
47
+ ],
48
+ metadata: { source_format: 'collapsed' },
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=collapsed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsed.js","sourceRoot":"","sources":["../../src/importers/collapsed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAY;IAC3D,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS;QAE5B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,IAAI;YACf,KAAK;YACL,MAAM,EAAE,CAAC,KAAK,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE;YACP,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;YAClF,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO;oBACP,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE,EAAE;iBACZ;aACF;YACD,QAAQ,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE;SACzC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ImportFormat } from './types.js';
2
+ export declare function detectFormat(content: string): ImportFormat;
@@ -0,0 +1,60 @@
1
+ export function detectFormat(content) {
2
+ const trimmed = content.trim();
3
+ if (trimmed.length === 0)
4
+ return 'unknown';
5
+ // Try JSON formats first
6
+ if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
7
+ try {
8
+ const parsed = JSON.parse(trimmed);
9
+ if (Array.isArray(parsed)) {
10
+ return detectArrayFormat(parsed);
11
+ }
12
+ if (typeof parsed === 'object' && parsed !== null) {
13
+ return detectJsonFormat(parsed);
14
+ }
15
+ }
16
+ catch {
17
+ // Not valid JSON, fall through to text formats
18
+ }
19
+ }
20
+ if (isCollapsedStacks(trimmed))
21
+ return 'collapsed';
22
+ return 'unknown';
23
+ }
24
+ function detectJsonFormat(obj) {
25
+ if (typeof obj['$schema'] === 'string' && obj['$schema'].includes('speedscope')) {
26
+ return 'speedscope';
27
+ }
28
+ if ('traceEvents' in obj && Array.isArray(obj['traceEvents'])) {
29
+ return 'chrome_trace';
30
+ }
31
+ if ('meta' in obj && 'threads' in obj && typeof obj['meta'] === 'object' && obj['meta'] !== null) {
32
+ const meta = obj['meta'];
33
+ if (typeof meta['version'] === 'number') {
34
+ return 'gecko';
35
+ }
36
+ }
37
+ return 'unknown';
38
+ }
39
+ function detectArrayFormat(arr) {
40
+ if (arr.length > 0 && typeof arr[0] === 'object' && arr[0] !== null) {
41
+ const first = arr[0];
42
+ if ('ph' in first)
43
+ return 'chrome_trace';
44
+ }
45
+ return 'unknown';
46
+ }
47
+ function isCollapsedStacks(content) {
48
+ const lines = content.split('\n').filter((l) => l.trim().length > 0);
49
+ if (lines.length === 0)
50
+ return false;
51
+ const pattern = /^.+\s+\d+$/;
52
+ const checkCount = Math.min(lines.length, 5);
53
+ let matchCount = 0;
54
+ for (let i = 0; i < checkCount; i++) {
55
+ if (pattern.test(lines[i]))
56
+ matchCount++;
57
+ }
58
+ return matchCount / checkCount >= 0.8;
59
+ }
60
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/importers/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ImportedProfile } from './types.js';
2
+ export declare function importGecko(content: string, name: string): ImportedProfile;
@@ -0,0 +1,77 @@
1
+ import { FrameTable } from '../model/frame-table.js';
2
+ export function importGecko(content, name) {
3
+ const gecko = JSON.parse(content);
4
+ const frameTable = new FrameTable();
5
+ const lanes = [];
6
+ const categories = (gecko.meta.categories ?? []).map((c) => ({
7
+ name: c.name,
8
+ color: c.color,
9
+ subcategories: c.subcategories,
10
+ }));
11
+ for (const thread of gecko.threads) {
12
+ if (thread.samples.length === 0)
13
+ continue;
14
+ const samples = [];
15
+ let cumulativeTime = 0;
16
+ for (let i = 0; i < thread.samples.length; i++) {
17
+ cumulativeTime += thread.samples.timeDeltas[i] ?? 0;
18
+ const stackIdx = thread.samples.stack[i];
19
+ const stack = resolveStack(thread, frameTable, stackIdx);
20
+ const weight = thread.samples.weight[i] ?? 1;
21
+ samples.push({
22
+ timestamp: gecko.meta.startTime + cumulativeTime,
23
+ stack,
24
+ values: [weight * gecko.meta.interval],
25
+ });
26
+ }
27
+ lanes.push({
28
+ id: `${thread.pid}:${thread.tid}`,
29
+ name: thread.name,
30
+ pid: thread.pid,
31
+ tid: thread.tid,
32
+ kind: thread.isMainThread === true ? 'main' : 'worker',
33
+ samples,
34
+ spans: [],
35
+ markers: [],
36
+ });
37
+ }
38
+ return {
39
+ format: 'gecko',
40
+ profile: {
41
+ id: crypto.randomUUID(),
42
+ name: gecko.meta.product ?? name,
43
+ created_at: gecko.meta.startTime,
44
+ value_types: [{ key: 'wall_ms', unit: 'milliseconds', description: 'Wall-clock duration' }],
45
+ categories,
46
+ frames: [...frameTable.frames],
47
+ lanes,
48
+ metadata: { source_format: 'gecko', version: gecko.meta.version },
49
+ },
50
+ };
51
+ }
52
+ function resolveStack(thread, frameTable, stackIdx) {
53
+ const frameIndices = [];
54
+ let current = stackIdx;
55
+ while (current != null) {
56
+ const frameIdx = thread.stackTable.frame[current];
57
+ const funcIdx = thread.frameTable.func[frameIdx];
58
+ const nameIdx = thread.funcTable.name[funcIdx];
59
+ const funcName = thread.stringArray[nameIdx] ?? `<unknown ${funcIdx}>`;
60
+ const fileNameIdx = thread.funcTable.fileName?.[funcIdx];
61
+ const file = fileNameIdx != null ? (thread.stringArray[fileNameIdx] ?? undefined) : undefined;
62
+ const line = thread.funcTable.lineNumber?.[funcIdx] ?? undefined;
63
+ const col = thread.funcTable.columnNumber?.[funcIdx] ?? undefined;
64
+ const category = thread.frameTable.category[frameIdx];
65
+ frameIndices.push(frameTable.getOrInsert({
66
+ name: funcName,
67
+ file,
68
+ line: line ?? undefined,
69
+ col: col ?? undefined,
70
+ category_index: category,
71
+ }));
72
+ current = thread.stackTable.prefix[current];
73
+ }
74
+ frameIndices.reverse();
75
+ return frameIndices;
76
+ }
77
+ //# sourceMappingURL=gecko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../src/importers/gecko.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ImportFormat } from './types.js';
2
+ import { ProfileBuilder } from '../model/profile.js';
3
+ export interface ImportProfileResult {
4
+ format_detected: string;
5
+ lanes_added: number;
6
+ frames_added: number;
7
+ samples_added: number;
8
+ spans_added: number;
9
+ value_types: string[];
10
+ }
11
+ export declare function importProfile(content: string, name: string, formatHint?: ImportFormat | 'auto', mergeInto?: ProfileBuilder): ImportProfileResult;
@@ -0,0 +1,98 @@
1
+ import { detectFormat } from './detect.js';
2
+ import { importCollapsed } from './collapsed.js';
3
+ import { importChromeTrace } from './chrome-trace.js';
4
+ import { importGecko } from './gecko.js';
5
+ import { importPprof } from './pprof.js';
6
+ export function importProfile(content, name, formatHint = 'auto', mergeInto) {
7
+ const format = formatHint === 'auto' ? detectFormat(content) : formatHint;
8
+ if (format === 'unknown') {
9
+ throw new Error(`Unable to detect format for '${name}'. Format is unknown.`);
10
+ }
11
+ const imported = runImporter(content, name, format);
12
+ let samplesAdded = 0;
13
+ let spansAdded = 0;
14
+ for (const lane of imported.profile.lanes) {
15
+ samplesAdded += lane.samples.length;
16
+ spansAdded += lane.spans.length;
17
+ }
18
+ const framesAdded = imported.profile.frames.length;
19
+ const lanesAdded = imported.profile.lanes.length;
20
+ const valueTypes = imported.profile.value_types.map((vt) => vt.key);
21
+ if (mergeInto) {
22
+ mergeImportedProfile(mergeInto, imported);
23
+ }
24
+ return {
25
+ format_detected: format,
26
+ lanes_added: lanesAdded,
27
+ frames_added: framesAdded,
28
+ samples_added: samplesAdded,
29
+ spans_added: spansAdded,
30
+ value_types: valueTypes,
31
+ };
32
+ }
33
+ function runImporter(content, name, format) {
34
+ switch (format) {
35
+ case 'collapsed':
36
+ return importCollapsed(content, name);
37
+ case 'chrome_trace':
38
+ return importChromeTrace(content, name);
39
+ case 'gecko':
40
+ return importGecko(content, name);
41
+ case 'pprof':
42
+ return importPprof(content, name);
43
+ case 'speedscope':
44
+ throw new Error(`Format '${format}' is not yet implemented`);
45
+ default:
46
+ throw new Error(`Unknown format: ${format}`);
47
+ }
48
+ }
49
+ function mergeImportedProfile(builder, imported) {
50
+ // Reconcile value types: build a mapping from imported indices to builder indices
51
+ const valueIndexMap = new Map();
52
+ for (let i = 0; i < imported.profile.value_types.length; i++) {
53
+ const builderIdx = builder.addValueType(imported.profile.value_types[i]);
54
+ valueIndexMap.set(i, builderIdx);
55
+ }
56
+ // Remap a values array from imported indices to builder indices
57
+ function remapValues(importedValues) {
58
+ const result = builder.emptyValues();
59
+ for (let i = 0; i < importedValues.length; i++) {
60
+ const targetIdx = valueIndexMap.get(i);
61
+ if (targetIdx !== undefined && targetIdx < result.length) {
62
+ result[targetIdx] = importedValues[i];
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ // Re-map frame indices from imported profile to the builder's frame table
68
+ const frameIndexMap = new Map();
69
+ for (let i = 0; i < imported.profile.frames.length; i++) {
70
+ const newIdx = builder.frameTable.getOrInsert(imported.profile.frames[i]);
71
+ frameIndexMap.set(i, newIdx);
72
+ }
73
+ // Add lanes with remapped frames and values
74
+ for (const lane of imported.profile.lanes) {
75
+ const newLane = builder.addLane(`imported:${lane.id}`, lane.kind);
76
+ newLane.name = lane.name;
77
+ newLane.pid = lane.pid;
78
+ newLane.tid = lane.tid;
79
+ for (const sample of lane.samples) {
80
+ newLane.samples.push({
81
+ ...sample,
82
+ stack: sample.stack.map((idx) => frameIndexMap.get(idx) ?? idx),
83
+ values: remapValues(sample.values),
84
+ });
85
+ }
86
+ for (const span of lane.spans) {
87
+ newLane.spans.push({
88
+ ...span,
89
+ frame_index: frameIndexMap.get(span.frame_index) ?? span.frame_index,
90
+ values: remapValues(span.values),
91
+ });
92
+ }
93
+ for (const marker of lane.markers) {
94
+ newLane.markers.push({ ...marker });
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/importers/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ImportedProfile } from './types.js';
2
+ export declare function importPprof(content: string, name: string): ImportedProfile;
@@ -0,0 +1,238 @@
1
+ import { FrameTable } from '../model/frame-table.js';
2
+ import pako from 'pako';
3
+ export function importPprof(content, name) {
4
+ // Convert binary string to Uint8Array
5
+ const bytes = new Uint8Array(content.length);
6
+ for (let i = 0; i < content.length; i++) {
7
+ bytes[i] = content.charCodeAt(i);
8
+ }
9
+ // Decompress if gzipped
10
+ let decompressed;
11
+ if (bytes.length >= 2 && bytes[0] === 0x1f && bytes[1] === 0x8b) {
12
+ decompressed = pako.ungzip(bytes);
13
+ }
14
+ else {
15
+ decompressed = bytes;
16
+ }
17
+ const pprof = decodeProfile(decompressed);
18
+ const frameTable = new FrameTable();
19
+ const samples = [];
20
+ const valueTypes = pprof.sampleTypes.map((st) => ({
21
+ key: pprof.stringTable[st.type] ?? 'unknown',
22
+ unit: mapUnit(pprof.stringTable[st.unit] ?? ''),
23
+ description: `${pprof.stringTable[st.type] ?? ''} (${pprof.stringTable[st.unit] ?? ''})`,
24
+ }));
25
+ for (const sample of pprof.samples) {
26
+ const stack = [];
27
+ // location_ids are leaf-to-root, reverse for root-to-leaf
28
+ for (let i = sample.locationIds.length - 1; i >= 0; i--) {
29
+ const loc = pprof.locations.get(sample.locationIds[i]);
30
+ if (!loc)
31
+ continue;
32
+ for (const line of loc.lines) {
33
+ const func = pprof.functions.get(line.functionId);
34
+ if (!func)
35
+ continue;
36
+ const funcName = pprof.stringTable[func.name] ?? '<unknown>';
37
+ const fileName = pprof.stringTable[func.filename] || undefined;
38
+ stack.push(frameTable.getOrInsert({
39
+ name: funcName,
40
+ file: fileName,
41
+ line: line.line || undefined,
42
+ }));
43
+ }
44
+ }
45
+ samples.push({ timestamp: null, stack, values: sample.values });
46
+ }
47
+ return {
48
+ format: 'pprof',
49
+ profile: {
50
+ id: crypto.randomUUID(),
51
+ name,
52
+ created_at: Date.now(),
53
+ value_types: valueTypes,
54
+ categories: [],
55
+ frames: [...frameTable.frames],
56
+ lanes: [{ id: 'main', name: 'main', kind: 'main', samples, spans: [], markers: [] }],
57
+ metadata: { source_format: 'pprof' },
58
+ },
59
+ };
60
+ }
61
+ function mapUnit(unit) {
62
+ const map = {
63
+ nanoseconds: 'nanoseconds',
64
+ microseconds: 'microseconds',
65
+ milliseconds: 'milliseconds',
66
+ seconds: 'seconds',
67
+ bytes: 'bytes',
68
+ };
69
+ return map[unit] ?? 'none';
70
+ }
71
+ class ProtoReader {
72
+ data;
73
+ pos = 0;
74
+ constructor(data) {
75
+ this.data = data;
76
+ }
77
+ hasMore() {
78
+ return this.pos < this.data.length;
79
+ }
80
+ readVarint() {
81
+ let result = 0;
82
+ let shift = 0;
83
+ while (this.pos < this.data.length) {
84
+ const byte = this.data[this.pos++];
85
+ // Use multiplication instead of bitwise shift to handle values > 2^28
86
+ result += (byte & 0x7f) * (2 ** shift);
87
+ if ((byte & 0x80) === 0)
88
+ break;
89
+ shift += 7;
90
+ }
91
+ return result;
92
+ }
93
+ readTag() {
94
+ const v = this.readVarint();
95
+ return { field: Math.floor(v / 8), wireType: v % 8 };
96
+ }
97
+ readBytes() {
98
+ const len = this.readVarint();
99
+ const result = this.data.slice(this.pos, this.pos + len);
100
+ this.pos += len;
101
+ return result;
102
+ }
103
+ readString() {
104
+ return new TextDecoder().decode(this.readBytes());
105
+ }
106
+ readSubMessage() {
107
+ return new ProtoReader(this.readBytes());
108
+ }
109
+ skip(wireType) {
110
+ switch (wireType) {
111
+ case 0:
112
+ this.readVarint();
113
+ break;
114
+ case 1:
115
+ this.pos += 8;
116
+ break;
117
+ case 2: {
118
+ const len = this.readVarint();
119
+ this.pos += len;
120
+ break;
121
+ }
122
+ case 5:
123
+ this.pos += 4;
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ function decodeProfile(data) {
129
+ const result = {
130
+ stringTable: [],
131
+ sampleTypes: [],
132
+ samples: [],
133
+ locations: new Map(),
134
+ functions: new Map(),
135
+ };
136
+ const reader = new ProtoReader(data);
137
+ while (reader.hasMore()) {
138
+ const { field, wireType } = reader.readTag();
139
+ switch (field) {
140
+ case 1:
141
+ result.sampleTypes.push(decodeSampleType(reader.readSubMessage()));
142
+ break;
143
+ case 2:
144
+ result.samples.push(decodeSample(reader.readSubMessage()));
145
+ break;
146
+ case 4: {
147
+ const loc = decodeLocation(reader.readSubMessage());
148
+ result.locations.set(loc.id, { lines: loc.lines });
149
+ break;
150
+ }
151
+ case 5: {
152
+ const fn = decodeFunction(reader.readSubMessage());
153
+ result.functions.set(fn.id, { name: fn.name, filename: fn.filename });
154
+ break;
155
+ }
156
+ case 6:
157
+ result.stringTable.push(reader.readString());
158
+ break;
159
+ default:
160
+ reader.skip(wireType);
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ function decodeSampleType(reader) {
166
+ let type = 0;
167
+ let unit = 0;
168
+ while (reader.hasMore()) {
169
+ const { field, wireType } = reader.readTag();
170
+ if (field === 1)
171
+ type = reader.readVarint();
172
+ else if (field === 2)
173
+ unit = reader.readVarint();
174
+ else
175
+ reader.skip(wireType);
176
+ }
177
+ return { type, unit };
178
+ }
179
+ function decodeSample(reader) {
180
+ const locationIds = [];
181
+ const values = [];
182
+ while (reader.hasMore()) {
183
+ const { field, wireType } = reader.readTag();
184
+ if (field === 1)
185
+ locationIds.push(reader.readVarint());
186
+ else if (field === 2)
187
+ values.push(reader.readVarint());
188
+ else
189
+ reader.skip(wireType);
190
+ }
191
+ return { locationIds, values };
192
+ }
193
+ function decodeLocation(reader) {
194
+ let id = 0;
195
+ const lines = [];
196
+ while (reader.hasMore()) {
197
+ const { field, wireType } = reader.readTag();
198
+ if (field === 1)
199
+ id = reader.readVarint();
200
+ else if (field === 4)
201
+ lines.push(decodeLine(reader.readSubMessage()));
202
+ else
203
+ reader.skip(wireType);
204
+ }
205
+ return { id, lines };
206
+ }
207
+ function decodeLine(reader) {
208
+ let functionId = 0;
209
+ let line = 0;
210
+ while (reader.hasMore()) {
211
+ const { field, wireType } = reader.readTag();
212
+ if (field === 1)
213
+ functionId = reader.readVarint();
214
+ else if (field === 2)
215
+ line = reader.readVarint();
216
+ else
217
+ reader.skip(wireType);
218
+ }
219
+ return { functionId, line };
220
+ }
221
+ function decodeFunction(reader) {
222
+ let id = 0;
223
+ let name = 0;
224
+ let filename = 0;
225
+ while (reader.hasMore()) {
226
+ const { field, wireType } = reader.readTag();
227
+ if (field === 1)
228
+ id = reader.readVarint();
229
+ else if (field === 2)
230
+ name = reader.readVarint();
231
+ else if (field === 4)
232
+ filename = reader.readVarint();
233
+ else
234
+ reader.skip(wireType);
235
+ }
236
+ return { id, name, filename };
237
+ }
238
+ //# sourceMappingURL=pprof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pprof.js","sourceRoot":"","sources":["../../src/importers/pprof.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Profile } from '../model/types.js';
2
+ export type ImportFormat = 'collapsed' | 'chrome_trace' | 'gecko' | 'pprof' | 'speedscope' | 'unknown';
3
+ export interface ImportedProfile {
4
+ format: ImportFormat;
5
+ profile: Profile;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/importers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export { createServer, startServer } from './server.js';
2
+ export type { Profile, Frame, Lane, Span, Sample, Marker, ValueType, Category, DetectedPattern, } from './model/types.js';
3
+ export { LLM_VALUE_TYPES } from './model/types.js';
4
+ export { ProfileBuilder } from './model/profile.js';
5
+ export { FrameTable } from './model/frame-table.js';
6
+ export { ProfilerState } from './model/state.js';
package/build/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createServer, startServer } from './server.js';
2
+ export { LLM_VALUE_TYPES } from './model/types.js';
3
+ export { ProfileBuilder } from './model/profile.js';
4
+ export { FrameTable } from './model/frame-table.js';
5
+ export { ProfilerState } from './model/state.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAYxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProfilerState } from '../model/state.js';
2
+ export interface MarkInput {
3
+ what: string;
4
+ severity?: 'info' | 'warning' | 'error';
5
+ data?: Record<string, unknown>;
6
+ }
7
+ export interface MarkResult {
8
+ marker_id: string;
9
+ timestamp: number;
10
+ }
11
+ export declare function handleMark(state: ProfilerState, input: MarkInput): MarkResult;
@@ -0,0 +1,13 @@
1
+ export function handleMark(state, input) {
2
+ const laneId = state.activeLaneId;
3
+ const markerId = state.nextMarkerId();
4
+ const timestamp = Date.now();
5
+ state.builder.addMarker(laneId, {
6
+ timestamp,
7
+ name: input.what,
8
+ severity: input.severity ?? 'info',
9
+ data: input.data,
10
+ });
11
+ return { marker_id: markerId, timestamp };
12
+ }
13
+ //# sourceMappingURL=mark.js.map