@statechange/xano-cli 0.2.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 (72) hide show
  1. package/README.md +251 -0
  2. package/dist/auth.d.ts +22 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +94 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/commands/audit.d.ts +6 -0
  7. package/dist/commands/audit.d.ts.map +1 -0
  8. package/dist/commands/audit.js +316 -0
  9. package/dist/commands/audit.js.map +1 -0
  10. package/dist/commands/auth.d.ts +6 -0
  11. package/dist/commands/auth.d.ts.map +1 -0
  12. package/dist/commands/auth.js +179 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/health.d.ts +6 -0
  15. package/dist/commands/health.d.ts.map +1 -0
  16. package/dist/commands/health.js +115 -0
  17. package/dist/commands/health.js.map +1 -0
  18. package/dist/commands/history.d.ts +6 -0
  19. package/dist/commands/history.d.ts.map +1 -0
  20. package/dist/commands/history.js +250 -0
  21. package/dist/commands/history.js.map +1 -0
  22. package/dist/commands/inventory.d.ts +6 -0
  23. package/dist/commands/inventory.d.ts.map +1 -0
  24. package/dist/commands/inventory.js +282 -0
  25. package/dist/commands/inventory.js.map +1 -0
  26. package/dist/commands/logs.d.ts +6 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +411 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/performance.d.ts +6 -0
  31. package/dist/commands/performance.d.ts.map +1 -0
  32. package/dist/commands/performance.js +520 -0
  33. package/dist/commands/performance.js.map +1 -0
  34. package/dist/commands/secure.d.ts +6 -0
  35. package/dist/commands/secure.d.ts.map +1 -0
  36. package/dist/commands/secure.js +52 -0
  37. package/dist/commands/secure.js.map +1 -0
  38. package/dist/commands/xanoscript.d.ts +6 -0
  39. package/dist/commands/xanoscript.d.ts.map +1 -0
  40. package/dist/commands/xanoscript.js +216 -0
  41. package/dist/commands/xanoscript.js.map +1 -0
  42. package/dist/commands/xray.d.ts +6 -0
  43. package/dist/commands/xray.d.ts.map +1 -0
  44. package/dist/commands/xray.js +194 -0
  45. package/dist/commands/xray.js.map +1 -0
  46. package/dist/format.d.ts +10 -0
  47. package/dist/format.d.ts.map +1 -0
  48. package/dist/format.js +59 -0
  49. package/dist/format.js.map +1 -0
  50. package/dist/index.d.ts +7 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +43 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/performance/load-analysis.d.ts +33 -0
  55. package/dist/performance/load-analysis.d.ts.map +1 -0
  56. package/dist/performance/load-analysis.js +290 -0
  57. package/dist/performance/load-analysis.js.map +1 -0
  58. package/dist/performance/stack-rollup.d.ts +57 -0
  59. package/dist/performance/stack-rollup.d.ts.map +1 -0
  60. package/dist/performance/stack-rollup.js +108 -0
  61. package/dist/performance/stack-rollup.js.map +1 -0
  62. package/dist/registry-client.d.ts +81 -0
  63. package/dist/registry-client.d.ts.map +1 -0
  64. package/dist/registry-client.js +333 -0
  65. package/dist/registry-client.js.map +1 -0
  66. package/dist/xano-client.d.ts +103 -0
  67. package/dist/xano-client.d.ts.map +1 -0
  68. package/dist/xano-client.js +399 -0
  69. package/dist/xano-client.js.map +1 -0
  70. package/package.json +49 -0
  71. package/skills/performance-analysis/SKILL.md +135 -0
  72. package/skills/xano-cli/SKILL.md +158 -0
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Performance Load Analysis - Portable from src/workers/performance.ts
3
+ */
4
+ export async function generateLoadAnalysis(client, options) {
5
+ const startTime = Date.now();
6
+ const { workspace, branch_id, lookBack } = options;
7
+ let stuff;
8
+ if (options.apps && options.queries) {
9
+ stuff = { apps: options.apps, queries: options.queries };
10
+ }
11
+ else {
12
+ const result = await client.getAPIAppsAndQueries(workspace, branch_id);
13
+ stuff = { apps: result.apps, queries: result.queries };
14
+ }
15
+ const canonicalObj = stuff.apps.reduce((acc, app) => {
16
+ acc[app.canonical] = app;
17
+ const endpoints = stuff.queries
18
+ .filter((endpoint) => endpoint.app.id === app.id)
19
+ .map((endpoint) => {
20
+ const { name } = endpoint;
21
+ const blobName = name.replace(/{[^}]*}/g, ".?");
22
+ return { blobName, ...endpoint };
23
+ });
24
+ app.endpoints = endpoints;
25
+ return acc;
26
+ }, {});
27
+ let page = 1;
28
+ let requests = [];
29
+ // Process triggers
30
+ const triggers = await client.getTriggers(workspace, branch_id);
31
+ if (triggers.length > 0) {
32
+ for (const trigger of triggers) {
33
+ page = 1;
34
+ while (true) {
35
+ try {
36
+ const { items: triggerHistory } = await client.getTriggerHistory(trigger.id, branch_id, page);
37
+ if (!triggerHistory || triggerHistory.length === 0) {
38
+ break;
39
+ }
40
+ triggerHistory.forEach((item) => {
41
+ item.scpType = "trigger";
42
+ item.scpSource = "trigger:" + trigger.id;
43
+ item.scpSourceId = trigger.id;
44
+ const time = new Date(item.created_at).valueOf() - item.duration * 1000;
45
+ if (time > startTime - lookBack) {
46
+ requests.push(item);
47
+ }
48
+ });
49
+ const oldestTime = Math.min(...triggerHistory.map((item) => new Date(item.created_at).valueOf() - item.duration * 1000));
50
+ if (oldestTime < startTime - lookBack) {
51
+ break;
52
+ }
53
+ page = page + 1;
54
+ if (page > 1000) {
55
+ console.error("Too many pages for trigger", trigger.id);
56
+ break;
57
+ }
58
+ }
59
+ catch (e) {
60
+ console.error("Error in trigger", trigger.id, e);
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ // Process API requests
67
+ page = 1;
68
+ while (true) {
69
+ const { items: newRequests } = await client.getRequestHistory(workspace, page, branch_id);
70
+ if (!newRequests || newRequests.length === 0) {
71
+ break;
72
+ }
73
+ newRequests.forEach((request) => {
74
+ request.scpType = "request";
75
+ const url = new URL(request.uri);
76
+ const path = url.pathname;
77
+ request.path = path;
78
+ const pieces = path.split("/");
79
+ const appCanonical = pieces[1].split(":")[1];
80
+ const app = canonicalObj[appCanonical];
81
+ if (app) {
82
+ request.app = app;
83
+ const endpoint = app.endpoints?.find((ep) => {
84
+ const { blobName } = ep;
85
+ const regex = new RegExp(blobName);
86
+ const newPath = "/" + pieces.slice(2).join("/");
87
+ return regex.test(newPath);
88
+ });
89
+ request.endpoint = endpoint;
90
+ if (endpoint) {
91
+ request.scpSource =
92
+ "endpoint:" +
93
+ endpoint.id +
94
+ "::" +
95
+ request.verb +
96
+ "::" +
97
+ request.status;
98
+ request.scpSourceId = endpoint.id;
99
+ }
100
+ else {
101
+ request.scpSource =
102
+ "endpoint:unknown::" + request.verb + "::" + request.status;
103
+ request.scpSourceId = "unknown";
104
+ }
105
+ }
106
+ else if (pieces[1] === "api:meta") {
107
+ request.app = "metadata";
108
+ const id = pieces.slice(2).join("/");
109
+ request.scpSource =
110
+ "endpoint:" +
111
+ id +
112
+ "::" +
113
+ request.verb +
114
+ "::" +
115
+ request.app +
116
+ "::" +
117
+ request.status;
118
+ request.scpSourceId = id;
119
+ }
120
+ else {
121
+ request.app = pieces[1].split(":")[1].replace("::", " ") + " (Deleted)";
122
+ const id = pieces.slice(2).join("/");
123
+ request.scpSource =
124
+ "endpoint:" +
125
+ id +
126
+ "::" +
127
+ request.verb +
128
+ "::" +
129
+ request.app +
130
+ "::" +
131
+ request.status;
132
+ request.scpSourceId = id;
133
+ }
134
+ const time = new Date(request.created_at).valueOf() - request.duration * 1000;
135
+ if (time > startTime - lookBack)
136
+ requests.push(request);
137
+ });
138
+ const oldestTime = Math.min(...newRequests.map((request) => new Date(request.created_at).valueOf() - request.duration * 1000));
139
+ if (oldestTime < startTime - lookBack) {
140
+ break;
141
+ }
142
+ page = page + 1;
143
+ if (page > 1000) {
144
+ console.error("Too many pages");
145
+ break;
146
+ }
147
+ }
148
+ // Process tasks
149
+ const tasks = await client.getTasks(workspace, branch_id);
150
+ if (tasks.length > 0) {
151
+ for (const task of tasks) {
152
+ page = 1;
153
+ while (true) {
154
+ try {
155
+ const { items: taskHistory } = await client.getTaskHistory(task.id, page);
156
+ if (!taskHistory || taskHistory.length === 0) {
157
+ break;
158
+ }
159
+ taskHistory.forEach((item) => {
160
+ item.scpType = "task";
161
+ item.scpSource = "task:" + task.id;
162
+ item.scpSourceId = task.id;
163
+ const time = new Date(item.created_at).valueOf() - item.duration * 1000;
164
+ if (time > startTime - lookBack) {
165
+ requests.push(item);
166
+ }
167
+ });
168
+ const oldestTime = Math.min(...taskHistory.map((item) => new Date(item.created_at).valueOf() - item.duration * 1000));
169
+ if (oldestTime < startTime - lookBack) {
170
+ break;
171
+ }
172
+ page = page + 1;
173
+ if (page > 1000) {
174
+ console.error("Too many pages for task", task.id);
175
+ break;
176
+ }
177
+ }
178
+ catch (e) {
179
+ console.error("Error in task", task.id, e);
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ }
185
+ // Process MCP servers
186
+ const mcpServers = await client.getMCPServers(workspace, branch_id);
187
+ if (mcpServers.length > 0) {
188
+ for (const mcpServer of mcpServers) {
189
+ page = 1;
190
+ while (page <= 10) {
191
+ try {
192
+ const { items: mcpServerHistory } = await client.getMCPServerHistory(mcpServer.id, branch_id, page);
193
+ if (!mcpServerHistory || mcpServerHistory.length === 0) {
194
+ break;
195
+ }
196
+ mcpServerHistory.forEach((item) => {
197
+ item.scpType = "tool";
198
+ item.scpSource = "tool:" + item.tool.id;
199
+ item.scpSourceId = item.tool.id;
200
+ const time = new Date(item.created_at).valueOf() - item.duration * 1000;
201
+ if (time > startTime - lookBack) {
202
+ requests.push(item);
203
+ }
204
+ });
205
+ const oldestTime = Math.min(...mcpServerHistory.map((item) => new Date(item.created_at).valueOf() - item.duration * 1000));
206
+ if (oldestTime < startTime - lookBack) {
207
+ break;
208
+ }
209
+ page = page + 1;
210
+ }
211
+ catch (e) {
212
+ console.error("Error in mcp server", mcpServer.id, e);
213
+ break;
214
+ }
215
+ }
216
+ }
217
+ }
218
+ // Build summary
219
+ requests.sort((a, b) => {
220
+ const aDate = new Date(a.created_at).valueOf() - a.duration * 1000;
221
+ const bDate = new Date(b.created_at).valueOf() - b.duration * 1000;
222
+ return bDate - aDate;
223
+ });
224
+ // Build lookup maps for names/descriptions
225
+ const triggerMap = new Map(triggers.map((t) => [t.id, t]));
226
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
227
+ const mcpToolMap = new Map();
228
+ for (const server of mcpServers) {
229
+ mcpToolMap.set(server.id, server);
230
+ }
231
+ const requestSummary = requests.reduce((acc, request) => {
232
+ const { duration, scpSource, scpType, scpSourceId } = request;
233
+ const old = acc[scpSource] || { totalDuration: 0, totalRequests: 0, avgDuration: 0 };
234
+ old.totalDuration += duration;
235
+ old.totalRequests++;
236
+ old.avgDuration = old.totalDuration / old.totalRequests;
237
+ // Enrich with metadata on first encounter
238
+ if (!old.type) {
239
+ old.type = scpType;
240
+ old.objectId = scpSourceId;
241
+ if (scpType === "request" && request.endpoint) {
242
+ const ep = request.endpoint;
243
+ const appName = typeof request.app === "object" ? request.app.name : String(request.app || "");
244
+ old.name = `${appName} / ${ep.name || ep.path || "unknown"}`;
245
+ old.description = ep.description || request.app?.description || undefined;
246
+ old.verb = request.verb;
247
+ old.status = request.status;
248
+ old.objectId = ep.id;
249
+ }
250
+ else if (scpType === "request") {
251
+ const appName = typeof request.app === "object" ? request.app.name : String(request.app || "unknown");
252
+ old.name = `${appName} (unmatched endpoint)`;
253
+ old.verb = request.verb;
254
+ old.status = request.status;
255
+ }
256
+ else if (scpType === "trigger") {
257
+ const trigger = triggerMap.get(scpSourceId);
258
+ old.name = trigger?.name || `Trigger ${scpSourceId}`;
259
+ old.description = trigger?.description || undefined;
260
+ }
261
+ else if (scpType === "task") {
262
+ const task = taskMap.get(scpSourceId);
263
+ old.name = task?.name || `Task ${scpSourceId}`;
264
+ old.description = task?.description || undefined;
265
+ }
266
+ else if (scpType === "tool") {
267
+ const tool = mcpToolMap.get(scpSourceId);
268
+ old.name = tool?.name || `MCP Tool ${scpSourceId}`;
269
+ old.description = tool?.description || undefined;
270
+ }
271
+ }
272
+ acc[scpSource] = old;
273
+ return acc;
274
+ }, {});
275
+ const totals = Object.values(requestSummary).reduce((acc, item) => {
276
+ acc.totalDuration += item.totalDuration;
277
+ acc.totalRequests += item.totalRequests;
278
+ acc.avgDuration = acc.totalDuration / acc.totalRequests;
279
+ return acc;
280
+ }, { totalDuration: 0, totalRequests: 0, avgDuration: 0 });
281
+ return {
282
+ date: startTime,
283
+ lookBack,
284
+ requestSummary,
285
+ totals,
286
+ reportTime: Date.now(),
287
+ reportDuration: Date.now() - startTime,
288
+ };
289
+ }
290
+ //# sourceMappingURL=load-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-analysis.js","sourceRoot":"","sources":["../../src/performance/load-analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkB,EAClB,OAA4B;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEnD,IAAI,KAAsC,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvE,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAwB,EAAE,GAAQ,EAAE,EAAE;QAC5E,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;QACzB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO;aAC5B,MAAM,CAAC,CAAC,QAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;aACrD,GAAG,CAAC,CAAC,QAAa,EAAE,EAAE;YACrB,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QACL,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,GAAU,EAAE,CAAC;IAEzB,mBAAmB;IACnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,CAAC;YACT,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAC9D,OAAO,CAAC,EAAE,EACV,SAAS,EACT,IAAI,CACL,CAAC;oBACF,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACnD,MAAM;oBACR,CAAC;oBACD,cAAc,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;wBACnC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;wBACzB,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC;wBAE9B,MAAM,IAAI,GACR,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;wBAC7D,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;4BAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,cAAc,CAAC,GAAG,CACnB,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAC7D,CACF,CAAC;oBACF,IAAI,UAAU,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;wBACtC,MAAM;oBACR,CAAC;oBACD,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;oBAChB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;wBAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;wBACxD,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,CAAC,CAAC;IACT,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAC3D,SAAS,EACT,IAAI,EACJ,SAAS,CACV,CAAC;QACF,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM;QACR,CAAC;QACD,WAAW,CAAC,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE;YACnC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7C,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;gBAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE;oBAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;oBACxB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnC,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC5B,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,CAAC,SAAS;wBACf,WAAW;4BACX,QAAQ,CAAC,EAAE;4BACX,IAAI;4BACJ,OAAO,CAAC,IAAI;4BACZ,IAAI;4BACJ,OAAO,CAAC,MAAM,CAAC;oBACjB,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,SAAS;wBACf,oBAAoB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;oBAC9D,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;gBAClC,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC;gBACzB,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrC,OAAO,CAAC,SAAS;oBACf,WAAW;wBACX,EAAE;wBACF,IAAI;wBACJ,OAAO,CAAC,IAAI;wBACZ,IAAI;wBACJ,OAAO,CAAC,GAAG;wBACX,IAAI;wBACJ,OAAO,CAAC,MAAM,CAAC;gBACjB,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC;gBACxE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrC,OAAO,CAAC,SAAS;oBACf,WAAW;wBACX,EAAE;wBACF,IAAI;wBACJ,OAAO,CAAC,IAAI;wBACZ,IAAI;wBACJ,OAAO,CAAC,GAAG;wBACX,IAAI;wBACJ,OAAO,CAAC,MAAM,CAAC;gBACjB,OAAO,CAAC,WAAW,GAAG,EAAE,CAAC;YAC3B,CAAC;YAED,MAAM,IAAI,GACR,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YACnE,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,WAAW,CAAC,GAAG,CAChB,CAAC,OAAY,EAAE,EAAE,CACf,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CACnE,CACF,CAAC;QACF,IAAI,UAAU,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;YACtC,MAAM;QACR,CAAC;QACD,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,CAAC;YACT,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAC1E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC7C,MAAM;oBACR,CAAC;oBACD,WAAW,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;wBAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;wBACtB,IAAI,CAAC,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;wBACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC;wBAE3B,MAAM,IAAI,GACR,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;wBAC7D,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;4BAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,WAAW,CAAC,GAAG,CAChB,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAC7D,CACF,CAAC;oBACF,IAAI,UAAU,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;wBACtC,MAAM;oBACR,CAAC;oBACD,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;oBAChB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;wBAChB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;wBAClD,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC3C,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,CAAC;YACT,OAAO,IAAI,IAAI,EAAE,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAClE,SAAS,CAAC,EAAE,EACZ,SAAS,EACT,IAAI,CACL,CAAC;oBACF,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvD,MAAM;oBACR,CAAC;oBACD,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;wBACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;wBACtB,IAAI,CAAC,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAEhC,MAAM,IAAI,GACR,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;wBAC7D,IAAI,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;4BAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,gBAAgB,CAAC,GAAG,CACrB,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAC7D,CACF,CAAC;oBACF,IAAI,UAAU,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;wBACtC,MAAM;oBACR,CAAC;oBACD,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACtD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnE,OAAO,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAe,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAmC,EAAE,OAAY,EAAE,EAAE;QAC3F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC;QAC9B,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QAExD,0CAA0C;QAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;YACnB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;YAE3B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAC5B,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC/F,GAAG,CAAC,IAAI,GAAG,GAAG,OAAO,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7D,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,WAAW,IAAI,SAAS,CAAC;gBAC1E,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACxB,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC5B,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC;YACvB,CAAC;iBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;gBACtG,GAAG,CAAC,IAAI,GAAG,GAAG,OAAO,uBAAuB,CAAC;gBAC7C,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACxB,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC;iBAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5C,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,WAAW,WAAW,EAAE,CAAC;gBACrD,GAAG,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACtC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,QAAQ,WAAW,EAAE,CAAC;gBAC/C,GAAG,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,SAAS,CAAC;YACnD,CAAC;iBAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACzC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;gBACnD,GAAG,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,SAAS,CAAC;YACnD,CAAC;QACH,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAoC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CACjD,CACE,GAAmB,EACnB,IAAoB,EACpB,EAAE;QACF,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;QACxC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;QACxC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CACvD,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,cAAc;QACd,MAAM;QACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Stack Rollup — Walk a runtime execution stack and compute timing breakdowns.
3
+ * Ported from parcel-test-2/src/content/performance.ts (perfByXsid),
4
+ * redesigned for CLI tree output rather than flat xsid-keyed aggregation.
5
+ */
6
+ export interface StackNode {
7
+ position: string;
8
+ name: string;
9
+ title?: string;
10
+ _xsid?: string;
11
+ direct_seconds: number;
12
+ rollup_seconds: number;
13
+ pct_of_total: number;
14
+ pct_of_parent?: number;
15
+ iterations?: number;
16
+ function_id?: number;
17
+ function_name?: string;
18
+ warning?: string;
19
+ children: StackNode[];
20
+ }
21
+ export interface DeepDiveResult {
22
+ request: {
23
+ id: number;
24
+ verb?: string;
25
+ uri?: string;
26
+ status?: number;
27
+ duration_seconds: number;
28
+ created_at?: string;
29
+ stack_truncated: boolean;
30
+ };
31
+ stack: StackNode[];
32
+ functions_called: FunctionCallSummary[];
33
+ warnings: string[];
34
+ }
35
+ export interface FunctionCallSummary {
36
+ id: number;
37
+ name?: string;
38
+ call_count: number;
39
+ total_seconds: number;
40
+ }
41
+ /**
42
+ * Walk a runtime stack array and produce a tree of StackNodes with timing rollups.
43
+ */
44
+ export declare function walkStack(stack: any[], totalDuration: number, parentRollup?: number, positionPrefix?: string, functionMap?: Map<number, string>, loopDepth?: number): StackNode[];
45
+ /**
46
+ * Collect all function calls from a StackNode tree.
47
+ */
48
+ export declare function collectFunctionCalls(nodes: StackNode[], acc?: Map<number, {
49
+ name?: string;
50
+ count: number;
51
+ totalSecs: number;
52
+ }>): FunctionCallSummary[];
53
+ /**
54
+ * Collect all warning strings from a StackNode tree.
55
+ */
56
+ export declare function collectWarnings(nodes: StackNode[]): string[];
57
+ //# sourceMappingURL=stack-rollup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-rollup.d.ts","sourceRoot":"","sources":["../../src/performance/stack-rollup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,GAAG,EAAE,EACZ,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,SAAK,EACnB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,SAAS,SAAI,GACZ,SAAS,EAAE,CAgEb;AAWD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAAE,EAClB,GAAG,GAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAa,GAChF,mBAAmB,EAAE,CAwBvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAU5D"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Stack Rollup — Walk a runtime execution stack and compute timing breakdowns.
3
+ * Ported from parcel-test-2/src/content/performance.ts (perfByXsid),
4
+ * redesigned for CLI tree output rather than flat xsid-keyed aggregation.
5
+ */
6
+ const LOOP_NAMES = ["mvp:foreach", "mvp:for", "mvp:while"];
7
+ /**
8
+ * Walk a runtime stack array and produce a tree of StackNodes with timing rollups.
9
+ */
10
+ export function walkStack(stack, totalDuration, parentRollup, positionPrefix = "", functionMap, loopDepth = 0) {
11
+ if (!stack || stack.length === 0)
12
+ return [];
13
+ const nodes = [];
14
+ for (let i = 0; i < stack.length; i++) {
15
+ const step = stack[i];
16
+ const position = positionPrefix ? `${positionPrefix}.${i + 1}` : `${i + 1}`;
17
+ const timingSecs = step.timing ?? 0;
18
+ const isLoop = LOOP_NAMES.includes(step.name);
19
+ const childLoopDepth = isLoop ? loopDepth + 1 : loopDepth;
20
+ // Recurse into children
21
+ const children = walkStack(step.stack || [], totalDuration, timingSecs, position, functionMap, childLoopDepth);
22
+ const childrenRollup = children.reduce((sum, c) => sum + c.rollup_seconds, 0);
23
+ const directSecs = Math.max(0, timingSecs - childrenRollup);
24
+ const rollupSecs = timingSecs;
25
+ const node = {
26
+ position,
27
+ name: step.name || "unknown",
28
+ title: step.title || undefined,
29
+ _xsid: step._xsid || undefined,
30
+ direct_seconds: +directSecs.toFixed(4),
31
+ rollup_seconds: +rollupSecs.toFixed(4),
32
+ pct_of_total: totalDuration > 0 ? +((rollupSecs / totalDuration) * 100).toFixed(1) : 0,
33
+ children,
34
+ };
35
+ if (parentRollup != null && parentRollup > 0) {
36
+ node.pct_of_parent = +((rollupSecs / parentRollup) * 100).toFixed(1);
37
+ }
38
+ if (step.cnt != null && step.cnt > 1) {
39
+ node.iterations = step.cnt;
40
+ }
41
+ // Resolve function references
42
+ if (step.name === "mvp:function" && step.raw?.context?.function?.id) {
43
+ node.function_id = step.raw.context.function.id;
44
+ if (functionMap?.has(node.function_id)) {
45
+ node.function_name = functionMap.get(node.function_id);
46
+ }
47
+ }
48
+ // Warn on slow steps inside loops
49
+ if (loopDepth > 0 && isSlowRuntimeStep(step.name)) {
50
+ node.warning = loopDepth === 1
51
+ ? "Slow step inside loop"
52
+ : `Slow step inside nested loops (depth: ${loopDepth})`;
53
+ }
54
+ nodes.push(node);
55
+ }
56
+ return nodes;
57
+ }
58
+ function isSlowRuntimeStep(name) {
59
+ return [
60
+ "mvp:dbo_view",
61
+ "mvp:api_request",
62
+ "mvp:lambda",
63
+ "mvp:dbo_direct_query",
64
+ ].includes(name);
65
+ }
66
+ /**
67
+ * Collect all function calls from a StackNode tree.
68
+ */
69
+ export function collectFunctionCalls(nodes, acc = new Map()) {
70
+ for (const node of nodes) {
71
+ if (node.function_id != null) {
72
+ const existing = acc.get(node.function_id) || { name: node.function_name, count: 0, totalSecs: 0 };
73
+ existing.count++;
74
+ existing.totalSecs += node.rollup_seconds;
75
+ if (node.function_name)
76
+ existing.name = node.function_name;
77
+ acc.set(node.function_id, existing);
78
+ }
79
+ collectFunctionCalls(node.children, acc);
80
+ }
81
+ // Only return from top-level call
82
+ if (acc.size > 0) {
83
+ return Array.from(acc.entries())
84
+ .map(([id, info]) => ({
85
+ id,
86
+ name: info.name,
87
+ call_count: info.count,
88
+ total_seconds: +info.totalSecs.toFixed(4),
89
+ }))
90
+ .sort((a, b) => b.total_seconds - a.total_seconds);
91
+ }
92
+ return [];
93
+ }
94
+ /**
95
+ * Collect all warning strings from a StackNode tree.
96
+ */
97
+ export function collectWarnings(nodes) {
98
+ const warnings = [];
99
+ for (const node of nodes) {
100
+ if (node.warning) {
101
+ const label = node.title || node.name;
102
+ warnings.push(`${node.warning}: ${label} at position ${node.position} (${node.rollup_seconds}s)`);
103
+ }
104
+ warnings.push(...collectWarnings(node.children));
105
+ }
106
+ return warnings;
107
+ }
108
+ //# sourceMappingURL=stack-rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-rollup.js","sourceRoot":"","sources":["../../src/performance/stack-rollup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * StateChange Backend Client - Fetch Xano token from StateChange backend
3
+ */
4
+ import { XanoClient } from "./xano-client.js";
5
+ export interface ResolveTokenOptions {
6
+ instance: string;
7
+ token?: string;
8
+ apiKey?: string;
9
+ }
10
+ export interface XanoTokenInfo {
11
+ instanceId: string;
12
+ instanceName?: string;
13
+ workspaceId?: number;
14
+ branchId?: number;
15
+ createdAt?: number;
16
+ ttl?: number;
17
+ }
18
+ export interface XanoTokenListResponse {
19
+ tokens: XanoTokenInfo[];
20
+ }
21
+ export interface XanoTokenResponse {
22
+ rawXanoToken: string;
23
+ instanceId: string;
24
+ instanceName?: string;
25
+ workspaceId?: number;
26
+ branchId?: number;
27
+ createdAt: number;
28
+ ttl: number;
29
+ }
30
+ export declare function listXanoTokens(apiKey: string): Promise<XanoTokenListResponse>;
31
+ export declare function getXanoToken(instanceId: string, apiKey: string): Promise<XanoTokenResponse>;
32
+ export interface XanoMasterTokenResponse {
33
+ rawXanoToken: string;
34
+ }
35
+ export declare function getXanoMasterToken(apiKey: string): Promise<XanoMasterTokenResponse>;
36
+ export declare function resolveMasterToken(options: {
37
+ token?: string;
38
+ apiKey?: string;
39
+ }): Promise<string>;
40
+ export type TokenStatus = "fresh" | "stale" | "expired" | "unknown";
41
+ export interface TokenHealth {
42
+ status: TokenStatus;
43
+ updatedAt: number;
44
+ ttl: number;
45
+ expiresAt: number;
46
+ ageHours: number;
47
+ remainingHours: number;
48
+ message: string;
49
+ }
50
+ export declare function checkTokenHealth(token: any): TokenHealth;
51
+ export declare function getTokenHealthForInstance(apiKey: string, instanceId?: string): Promise<{
52
+ token: any;
53
+ health: TokenHealth;
54
+ } | null>;
55
+ /** Print a refresh prompt and poll until the token is updated. Returns the fresh raw token. */
56
+ export declare function waitForFreshToken(apiKey: string, instanceId: string, staleUpdatedAt: number, { timeoutMs, intervalMs }?: {
57
+ timeoutMs?: number;
58
+ intervalMs?: number;
59
+ }): Promise<string>;
60
+ export declare function resolveInstance(options: {
61
+ instance?: string;
62
+ apiKey?: string;
63
+ }): Promise<string>;
64
+ export declare function resolveWorkspace(options: {
65
+ workspace?: string;
66
+ apiKey?: string;
67
+ }): Promise<number>;
68
+ export declare function resolveXanoToken(options: ResolveTokenOptions & {
69
+ skipHealthCheck?: boolean;
70
+ }): Promise<string>;
71
+ /**
72
+ * Resolve instance/workspace/token and create a XanoClient with auto-refresh on 401.
73
+ * Replaces the per-command makeClient() boilerplate.
74
+ */
75
+ export declare function makeClient(options: any): Promise<{
76
+ client: XanoClient;
77
+ instance: string;
78
+ workspace: number;
79
+ branchId: number;
80
+ }>;
81
+ //# sourceMappingURL=registry-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../src/registry-client.ts"],"names":[],"mappings":"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"}