@webda/debug 4.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +166 -0
- package/README.md +95 -0
- package/lib/bodycapture.d.ts +66 -0
- package/lib/bodycapture.js +162 -0
- package/lib/bodycapture.js.map +1 -0
- package/lib/debugservice.service.d.ts +166 -0
- package/lib/debugservice.service.js +609 -0
- package/lib/debugservice.service.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -0
- package/lib/introspection.d.ts +115 -0
- package/lib/introspection.js +260 -0
- package/lib/introspection.js.map +1 -0
- package/lib/logbuffer.d.ts +75 -0
- package/lib/logbuffer.js +98 -0
- package/lib/logbuffer.js.map +1 -0
- package/lib/requestlog.d.ts +181 -0
- package/lib/requestlog.js +153 -0
- package/lib/requestlog.js.map +1 -0
- package/lib/tui/client.d.ts +165 -0
- package/lib/tui/client.js +220 -0
- package/lib/tui/client.js.map +1 -0
- package/lib/tui/panels/config.d.ts +79 -0
- package/lib/tui/panels/config.js +291 -0
- package/lib/tui/panels/config.js.map +1 -0
- package/lib/tui/panels/logs.d.ts +106 -0
- package/lib/tui/panels/logs.js +342 -0
- package/lib/tui/panels/logs.js.map +1 -0
- package/lib/tui/panels/models.d.ts +47 -0
- package/lib/tui/panels/models.js +193 -0
- package/lib/tui/panels/models.js.map +1 -0
- package/lib/tui/panels/operations.d.ts +55 -0
- package/lib/tui/panels/operations.js +241 -0
- package/lib/tui/panels/operations.js.map +1 -0
- package/lib/tui/panels/panel.d.ts +55 -0
- package/lib/tui/panels/panel.js +31 -0
- package/lib/tui/panels/panel.js.map +1 -0
- package/lib/tui/panels/requests.d.ts +156 -0
- package/lib/tui/panels/requests.js +512 -0
- package/lib/tui/panels/requests.js.map +1 -0
- package/lib/tui/panels/routes.d.ts +45 -0
- package/lib/tui/panels/routes.js +154 -0
- package/lib/tui/panels/routes.js.map +1 -0
- package/lib/tui/panels/services.d.ts +49 -0
- package/lib/tui/panels/services.js +266 -0
- package/lib/tui/panels/services.js.map +1 -0
- package/lib/tui/tui.d.ts +58 -0
- package/lib/tui/tui.js +236 -0
- package/lib/tui/tui.js.map +1 -0
- package/package.json +60 -0
- package/webui/app.js +177 -0
- package/webui/components/logs.js +128 -0
- package/webui/components/model-graph.js +292 -0
- package/webui/components/models.js +213 -0
- package/webui/components/operations.js +315 -0
- package/webui/components/requests.js +264 -0
- package/webui/components/schema-form.js +268 -0
- package/webui/components/services.js +248 -0
- package/webui/index.html +22 -0
- package/webui/logo.svg +1 -0
- package/webui/styles.css +685 -0
- package/webui/vendor/htm.js +1 -0
- package/webui/vendor/preact-hooks.js +2 -0
- package/webui/vendor/preact.js +2 -0
- package/webui/webda.png +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ScrollablePanel } from "./panel.js";
|
|
2
|
+
import { DebugClient } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Routes panel: displays all registered routes with path, HTTP methods
|
|
5
|
+
* (color-coded), and executor service name.
|
|
6
|
+
*/
|
|
7
|
+
export declare class RoutesPanel extends ScrollablePanel {
|
|
8
|
+
private client;
|
|
9
|
+
name: string;
|
|
10
|
+
private routes;
|
|
11
|
+
private visibleRows;
|
|
12
|
+
/**
|
|
13
|
+
* @param client - Debug API client
|
|
14
|
+
*/
|
|
15
|
+
constructor(client: DebugClient);
|
|
16
|
+
/**
|
|
17
|
+
* Fetch routes from the debug server.
|
|
18
|
+
*/
|
|
19
|
+
refresh(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Handle keyboard input.
|
|
22
|
+
* @param key - key name from terminal-kit
|
|
23
|
+
*/
|
|
24
|
+
onKey(key: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Render the routes table.
|
|
27
|
+
* @param term - terminal-kit instance
|
|
28
|
+
* @param startRow - first available row
|
|
29
|
+
* @param endRow - last available row
|
|
30
|
+
* @param width - terminal width in columns
|
|
31
|
+
*/
|
|
32
|
+
render(term: any, startRow: number, endRow: number, width: number): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get a color function for an HTTP method.
|
|
35
|
+
* @param term - terminal-kit instance
|
|
36
|
+
* @param method - HTTP method string
|
|
37
|
+
* @param inverse - whether to apply inverse styling
|
|
38
|
+
* @returns bound color function
|
|
39
|
+
*/
|
|
40
|
+
private getMethodColor;
|
|
41
|
+
/**
|
|
42
|
+
* Clean up panel resources.
|
|
43
|
+
*/
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { ScrollablePanel } from "./panel.js";
|
|
2
|
+
/**
|
|
3
|
+
* Routes panel: displays all registered routes with path, HTTP methods
|
|
4
|
+
* (color-coded), and executor service name.
|
|
5
|
+
*/
|
|
6
|
+
export class RoutesPanel extends ScrollablePanel {
|
|
7
|
+
/**
|
|
8
|
+
* @param client - Debug API client
|
|
9
|
+
*/
|
|
10
|
+
constructor(client) {
|
|
11
|
+
super();
|
|
12
|
+
this.client = client;
|
|
13
|
+
this.name = "Routes";
|
|
14
|
+
this.routes = [];
|
|
15
|
+
this.visibleRows = 0;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fetch routes from the debug server.
|
|
19
|
+
*/
|
|
20
|
+
async refresh() {
|
|
21
|
+
try {
|
|
22
|
+
this.routes = await this.client.getRoutes();
|
|
23
|
+
this.itemCount = this.routes.length;
|
|
24
|
+
this.cursor = Math.min(this.cursor, Math.max(0, this.itemCount - 1));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
this.routes = [];
|
|
28
|
+
this.itemCount = 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle keyboard input.
|
|
33
|
+
* @param key - key name from terminal-kit
|
|
34
|
+
*/
|
|
35
|
+
onKey(key) {
|
|
36
|
+
switch (key) {
|
|
37
|
+
case "UP":
|
|
38
|
+
this.moveCursor(-1, this.visibleRows);
|
|
39
|
+
break;
|
|
40
|
+
case "DOWN":
|
|
41
|
+
this.moveCursor(1, this.visibleRows);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render the routes table.
|
|
47
|
+
* @param term - terminal-kit instance
|
|
48
|
+
* @param startRow - first available row
|
|
49
|
+
* @param endRow - last available row
|
|
50
|
+
* @param width - terminal width in columns
|
|
51
|
+
*/
|
|
52
|
+
render(term, startRow, endRow, width) {
|
|
53
|
+
this.visibleRows = endRow - startRow - 1;
|
|
54
|
+
if (this.routes.length === 0) {
|
|
55
|
+
term.moveTo(1, startRow);
|
|
56
|
+
term.eraseLine();
|
|
57
|
+
term(" No routes found. Is the debug server running?");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Header
|
|
61
|
+
term.moveTo(1, startRow);
|
|
62
|
+
term.eraseLine();
|
|
63
|
+
term.bold(" Path" + " ".repeat(Math.max(1, 40 - 4)) + "Methods" + " ".repeat(Math.max(1, 25 - 7)) + "Executor");
|
|
64
|
+
const dataStart = startRow + 1;
|
|
65
|
+
const visible = endRow - dataStart;
|
|
66
|
+
for (let i = 0; i < visible; i++) {
|
|
67
|
+
const idx = this.scrollOffset + i;
|
|
68
|
+
const row = dataStart + i;
|
|
69
|
+
term.moveTo(1, row);
|
|
70
|
+
term.eraseLine();
|
|
71
|
+
if (idx >= this.routes.length)
|
|
72
|
+
continue;
|
|
73
|
+
const route = this.routes[idx];
|
|
74
|
+
const isSelected = idx === this.cursor;
|
|
75
|
+
const path = (route.path || "unknown").substring(0, 38);
|
|
76
|
+
const methods = route.methods || [];
|
|
77
|
+
const executor = (route.executor || "unknown").substring(0, width - 70);
|
|
78
|
+
const pathCol = ` ${path.padEnd(38)} `;
|
|
79
|
+
if (isSelected) {
|
|
80
|
+
term.inverse(pathCol);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
term(pathCol);
|
|
84
|
+
}
|
|
85
|
+
// Color-code HTTP methods
|
|
86
|
+
for (let m = 0; m < methods.length; m++) {
|
|
87
|
+
if (m > 0) {
|
|
88
|
+
if (isSelected)
|
|
89
|
+
term.inverse(",");
|
|
90
|
+
else
|
|
91
|
+
term(",");
|
|
92
|
+
}
|
|
93
|
+
const method = methods[m];
|
|
94
|
+
const colorFn = this.getMethodColor(term, method, isSelected);
|
|
95
|
+
colorFn(method);
|
|
96
|
+
}
|
|
97
|
+
// Pad methods column and add executor
|
|
98
|
+
const methodsStr = methods.join(",");
|
|
99
|
+
const remaining = 23 - methodsStr.length;
|
|
100
|
+
const pad = remaining > 0 ? " ".repeat(remaining) : " ";
|
|
101
|
+
if (isSelected) {
|
|
102
|
+
term.inverse(pad + executor);
|
|
103
|
+
const totalLen = pathCol.length + methodsStr.length + pad.length + executor.length;
|
|
104
|
+
const endPad = width - totalLen;
|
|
105
|
+
if (endPad > 0)
|
|
106
|
+
term.inverse(" ".repeat(endPad));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
term(pad + executor);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get a color function for an HTTP method.
|
|
115
|
+
* @param term - terminal-kit instance
|
|
116
|
+
* @param method - HTTP method string
|
|
117
|
+
* @param inverse - whether to apply inverse styling
|
|
118
|
+
* @returns bound color function
|
|
119
|
+
*/
|
|
120
|
+
getMethodColor(term, method, inverse) {
|
|
121
|
+
const m = method.toUpperCase();
|
|
122
|
+
if (inverse) {
|
|
123
|
+
if (m === "GET")
|
|
124
|
+
return (s) => term.inverse.green(s);
|
|
125
|
+
if (m === "POST")
|
|
126
|
+
return (s) => term.inverse.cyan(s);
|
|
127
|
+
if (m === "PUT")
|
|
128
|
+
return (s) => term.inverse.yellow(s);
|
|
129
|
+
if (m === "DELETE")
|
|
130
|
+
return (s) => term.inverse.red(s);
|
|
131
|
+
if (m === "PATCH")
|
|
132
|
+
return (s) => term.inverse.magenta(s);
|
|
133
|
+
return (s) => term.inverse(s);
|
|
134
|
+
}
|
|
135
|
+
if (m === "GET")
|
|
136
|
+
return (s) => term.green(s);
|
|
137
|
+
if (m === "POST")
|
|
138
|
+
return (s) => term.cyan(s);
|
|
139
|
+
if (m === "PUT")
|
|
140
|
+
return (s) => term.yellow(s);
|
|
141
|
+
if (m === "DELETE")
|
|
142
|
+
return (s) => term.red(s);
|
|
143
|
+
if (m === "PATCH")
|
|
144
|
+
return (s) => term.magenta(s);
|
|
145
|
+
return (s) => term(s);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clean up panel resources.
|
|
149
|
+
*/
|
|
150
|
+
destroy() {
|
|
151
|
+
this.routes = [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/tui/panels/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IAK9C;;OAEG;IACH,YAAoB,MAAmB;QACrC,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAa;QAPvC,SAAI,GAAG,QAAQ,CAAC;QACR,WAAM,GAAU,EAAE,CAAC;QACnB,gBAAW,GAAG,CAAC,CAAC;IAOxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAW;QACf,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI;gBACP,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACrC,MAAM;QACV,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,IAAS,EAAE,QAAgB,EAAE,MAAc,EAAE,KAAa;QAC/D,IAAI,CAAC,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACzB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,iDAAiD,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,SAAS;QACT,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QAEjH,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,EAAE,CAAC;YAEjB,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,SAAS;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC;YAEvC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAa,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;YAExE,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;YAEzC,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,CAAC;YAChB,CAAC;YAED,0BAA0B;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACV,IAAI,UAAU;wBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;wBAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9D,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAED,sCAAsC;YACtC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YACzC,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAExD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACnF,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;gBAChC,IAAI,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,cAAc,CAAC,IAAS,EAAE,MAAc,EAAE,OAAgB;QAChE,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,KAAK;gBAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,KAAK;gBAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,OAAO;gBAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,OAAO;YAAE,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ScrollablePanel } from "./panel.js";
|
|
2
|
+
import { DebugClient } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Services panel: displays all registered services in a table with
|
|
5
|
+
* color-coded state indicators. Press Enter for detail view with
|
|
6
|
+
* configuration, capabilities, schema, and metrics.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ServicesPanel extends ScrollablePanel {
|
|
9
|
+
private client;
|
|
10
|
+
name: string;
|
|
11
|
+
private services;
|
|
12
|
+
private config;
|
|
13
|
+
private visibleRows;
|
|
14
|
+
private detailMode;
|
|
15
|
+
private detailScroll;
|
|
16
|
+
/**
|
|
17
|
+
* @param client - Debug API client
|
|
18
|
+
*/
|
|
19
|
+
constructor(client: DebugClient);
|
|
20
|
+
/**
|
|
21
|
+
* Fetch services and config from the debug server.
|
|
22
|
+
*/
|
|
23
|
+
refresh(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Handle keyboard input.
|
|
26
|
+
* @param key - key name from terminal-kit
|
|
27
|
+
*/
|
|
28
|
+
onKey(key: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Render the services table or detail view.
|
|
31
|
+
* @param term - terminal-kit instance
|
|
32
|
+
* @param startRow - first available row
|
|
33
|
+
* @param endRow - last available row
|
|
34
|
+
* @param width - terminal width in columns
|
|
35
|
+
*/
|
|
36
|
+
render(term: any, startRow: number, endRow: number, width: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Render detail view for the selected service.
|
|
39
|
+
* @param term - terminal-kit instance
|
|
40
|
+
* @param startRow - first available row
|
|
41
|
+
* @param endRow - last available row
|
|
42
|
+
* @param width - terminal width in columns
|
|
43
|
+
*/
|
|
44
|
+
private renderDetail;
|
|
45
|
+
/**
|
|
46
|
+
* Clean up panel resources.
|
|
47
|
+
*/
|
|
48
|
+
destroy(): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { ScrollablePanel } from "./panel.js";
|
|
2
|
+
/**
|
|
3
|
+
* Services panel: displays all registered services in a table with
|
|
4
|
+
* color-coded state indicators. Press Enter for detail view with
|
|
5
|
+
* configuration, capabilities, schema, and metrics.
|
|
6
|
+
*/
|
|
7
|
+
export class ServicesPanel extends ScrollablePanel {
|
|
8
|
+
/**
|
|
9
|
+
* @param client - Debug API client
|
|
10
|
+
*/
|
|
11
|
+
constructor(client) {
|
|
12
|
+
super();
|
|
13
|
+
this.client = client;
|
|
14
|
+
this.name = "Services";
|
|
15
|
+
this.services = [];
|
|
16
|
+
this.config = {};
|
|
17
|
+
this.visibleRows = 0;
|
|
18
|
+
this.detailMode = false;
|
|
19
|
+
this.detailScroll = 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fetch services and config from the debug server.
|
|
23
|
+
*/
|
|
24
|
+
async refresh() {
|
|
25
|
+
try {
|
|
26
|
+
const [services, config] = await Promise.all([this.client.getServices(), this.client.getConfig()]);
|
|
27
|
+
this.services = services;
|
|
28
|
+
this.config = config || {};
|
|
29
|
+
this.itemCount = this.services.length;
|
|
30
|
+
this.cursor = Math.min(this.cursor, Math.max(0, this.itemCount - 1));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
this.services = [];
|
|
34
|
+
this.config = {};
|
|
35
|
+
this.itemCount = 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Handle keyboard input.
|
|
40
|
+
* @param key - key name from terminal-kit
|
|
41
|
+
*/
|
|
42
|
+
onKey(key) {
|
|
43
|
+
if (this.detailMode) {
|
|
44
|
+
switch (key) {
|
|
45
|
+
case "ESCAPE":
|
|
46
|
+
case "BACKSPACE":
|
|
47
|
+
this.detailMode = false;
|
|
48
|
+
this.detailScroll = 0;
|
|
49
|
+
break;
|
|
50
|
+
case "UP":
|
|
51
|
+
this.detailScroll = Math.max(0, this.detailScroll - 1);
|
|
52
|
+
break;
|
|
53
|
+
case "DOWN":
|
|
54
|
+
this.detailScroll++;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
switch (key) {
|
|
60
|
+
case "UP":
|
|
61
|
+
this.moveCursor(-1, this.visibleRows);
|
|
62
|
+
break;
|
|
63
|
+
case "DOWN":
|
|
64
|
+
this.moveCursor(1, this.visibleRows);
|
|
65
|
+
break;
|
|
66
|
+
case "ENTER":
|
|
67
|
+
if (this.services.length > 0) {
|
|
68
|
+
this.detailMode = true;
|
|
69
|
+
this.detailScroll = 0;
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Render the services table or detail view.
|
|
76
|
+
* @param term - terminal-kit instance
|
|
77
|
+
* @param startRow - first available row
|
|
78
|
+
* @param endRow - last available row
|
|
79
|
+
* @param width - terminal width in columns
|
|
80
|
+
*/
|
|
81
|
+
render(term, startRow, endRow, width) {
|
|
82
|
+
this.visibleRows = endRow - startRow - 1;
|
|
83
|
+
if (this.services.length === 0) {
|
|
84
|
+
term.moveTo(1, startRow);
|
|
85
|
+
term.eraseLine();
|
|
86
|
+
term(" No services found. Is the debug server running?");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (this.detailMode) {
|
|
90
|
+
this.renderDetail(term, startRow, endRow, width);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Global Parameters header
|
|
94
|
+
const params = this.config?.parameters || {};
|
|
95
|
+
const paramKeys = Object.keys(params);
|
|
96
|
+
let row = startRow;
|
|
97
|
+
if (paramKeys.length > 0) {
|
|
98
|
+
term.moveTo(1, row);
|
|
99
|
+
term.eraseLine();
|
|
100
|
+
term.bold.cyan(" Global Parameters");
|
|
101
|
+
row++;
|
|
102
|
+
for (const key of paramKeys.slice(0, 3)) {
|
|
103
|
+
if (row >= endRow)
|
|
104
|
+
break;
|
|
105
|
+
term.moveTo(1, row);
|
|
106
|
+
term.eraseLine();
|
|
107
|
+
const val = typeof params[key] === "object" ? JSON.stringify(params[key]) : String(params[key]);
|
|
108
|
+
term.dim(` ${key}`);
|
|
109
|
+
term.dim(" = ");
|
|
110
|
+
term(`${val.substring(0, width - key.length - 10)}`);
|
|
111
|
+
row++;
|
|
112
|
+
}
|
|
113
|
+
if (paramKeys.length > 3) {
|
|
114
|
+
term.moveTo(1, row);
|
|
115
|
+
term.eraseLine();
|
|
116
|
+
term.dim(` ... and ${paramKeys.length - 3} more`);
|
|
117
|
+
row++;
|
|
118
|
+
}
|
|
119
|
+
term.moveTo(1, row);
|
|
120
|
+
term.eraseLine();
|
|
121
|
+
row++;
|
|
122
|
+
}
|
|
123
|
+
// Header
|
|
124
|
+
term.moveTo(1, row);
|
|
125
|
+
term.eraseLine();
|
|
126
|
+
term.bold(" Name" + " ".repeat(Math.max(1, 30 - 4)) + "Type" + " ".repeat(Math.max(1, 30 - 4)) + "State");
|
|
127
|
+
row++;
|
|
128
|
+
const visible = endRow - row;
|
|
129
|
+
for (let i = 0; i < visible; i++) {
|
|
130
|
+
const idx = this.scrollOffset + i;
|
|
131
|
+
const r = row + i;
|
|
132
|
+
term.moveTo(1, r);
|
|
133
|
+
term.eraseLine();
|
|
134
|
+
if (idx >= this.services.length)
|
|
135
|
+
continue;
|
|
136
|
+
const svc = this.services[idx];
|
|
137
|
+
const isSelected = idx === this.cursor;
|
|
138
|
+
const name = (svc.name || "unknown").substring(0, 28);
|
|
139
|
+
const type = (svc.type || "unknown").substring(0, 28);
|
|
140
|
+
const state = svc.state || "unknown";
|
|
141
|
+
const prefix = ` ${name.padEnd(28)} ${type.padEnd(28)} `;
|
|
142
|
+
if (isSelected) {
|
|
143
|
+
term.inverse(prefix);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
term(prefix);
|
|
147
|
+
}
|
|
148
|
+
const sl = state.toLowerCase();
|
|
149
|
+
if (sl === "running" || sl === "resolved") {
|
|
150
|
+
if (isSelected)
|
|
151
|
+
term.inverse.green(state);
|
|
152
|
+
else
|
|
153
|
+
term.green(state);
|
|
154
|
+
}
|
|
155
|
+
else if (sl === "stopped" || sl === "error" || sl === "failed") {
|
|
156
|
+
if (isSelected)
|
|
157
|
+
term.inverse.red(state);
|
|
158
|
+
else
|
|
159
|
+
term.red(state);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
if (isSelected)
|
|
163
|
+
term.inverse.yellow(state);
|
|
164
|
+
else
|
|
165
|
+
term.yellow(state);
|
|
166
|
+
}
|
|
167
|
+
if (isSelected) {
|
|
168
|
+
const remaining = width - prefix.length - state.length;
|
|
169
|
+
if (remaining > 0)
|
|
170
|
+
term.inverse(" ".repeat(remaining));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Render detail view for the selected service.
|
|
176
|
+
* @param term - terminal-kit instance
|
|
177
|
+
* @param startRow - first available row
|
|
178
|
+
* @param endRow - last available row
|
|
179
|
+
* @param width - terminal width in columns
|
|
180
|
+
*/
|
|
181
|
+
renderDetail(term, startRow, endRow, width) {
|
|
182
|
+
const svc = this.services[this.cursor];
|
|
183
|
+
if (!svc)
|
|
184
|
+
return;
|
|
185
|
+
const lines = [];
|
|
186
|
+
const addText = function addTextLine(text, style) {
|
|
187
|
+
lines.push({
|
|
188
|
+
render: function renderText(t, w) {
|
|
189
|
+
if (style === "bold")
|
|
190
|
+
t.bold(text.substring(0, w));
|
|
191
|
+
else if (style === "dim")
|
|
192
|
+
t.dim(text.substring(0, w));
|
|
193
|
+
else if (style === "cyan")
|
|
194
|
+
t.cyan(text.substring(0, w));
|
|
195
|
+
else
|
|
196
|
+
t(text.substring(0, w));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
const addEmpty = function addEmptyLine() {
|
|
201
|
+
lines.push({ render: function renderEmpty() { } });
|
|
202
|
+
};
|
|
203
|
+
addText(` Service: ${svc.name}`, "bold");
|
|
204
|
+
addText(` Type: ${svc.type} | State: ${svc.state}`);
|
|
205
|
+
addEmpty();
|
|
206
|
+
// Capabilities
|
|
207
|
+
const caps = Object.keys(svc.capabilities || {});
|
|
208
|
+
if (caps.length > 0) {
|
|
209
|
+
addText(" Capabilities:", "bold");
|
|
210
|
+
addText(` ${caps.join(", ")}`);
|
|
211
|
+
addEmpty();
|
|
212
|
+
}
|
|
213
|
+
// Configuration
|
|
214
|
+
const config = svc.configuration || {};
|
|
215
|
+
const configKeys = Object.keys(config).filter(k => !k.startsWith("_"));
|
|
216
|
+
if (configKeys.length > 0) {
|
|
217
|
+
addText(" Configuration:", "bold");
|
|
218
|
+
for (const key of configKeys) {
|
|
219
|
+
const val = typeof config[key] === "object" ? JSON.stringify(config[key]) : String(config[key]);
|
|
220
|
+
addText(` ${key}: ${val}`);
|
|
221
|
+
}
|
|
222
|
+
addEmpty();
|
|
223
|
+
}
|
|
224
|
+
// Schema properties
|
|
225
|
+
const schema = svc.schema;
|
|
226
|
+
if (schema?.properties) {
|
|
227
|
+
addText(" Schema Properties:", "bold");
|
|
228
|
+
for (const [name, prop] of Object.entries(schema.properties)) {
|
|
229
|
+
const desc = prop.description ? ` - ${prop.description.substring(0, 60)}` : "";
|
|
230
|
+
const def = prop.default !== undefined ? ` [default: ${JSON.stringify(prop.default)}]` : "";
|
|
231
|
+
addText(` ${name} (${prop.type || "ref"})${desc}${def}`);
|
|
232
|
+
}
|
|
233
|
+
addEmpty();
|
|
234
|
+
}
|
|
235
|
+
// Metrics
|
|
236
|
+
if (svc.metrics?.length > 0) {
|
|
237
|
+
addText(" Metrics:", "bold");
|
|
238
|
+
for (const m of svc.metrics) {
|
|
239
|
+
const val = m.values?.length ? m.values.reduce((a, v) => a + (v.value || 0), 0) : 0;
|
|
240
|
+
addText(` ${m.name} [${m.type}] = ${val}${m.help ? " " + m.help : ""}`);
|
|
241
|
+
}
|
|
242
|
+
addEmpty();
|
|
243
|
+
}
|
|
244
|
+
addText(" Press ESC to go back", "dim");
|
|
245
|
+
// Render with scroll
|
|
246
|
+
const visible = endRow - startRow;
|
|
247
|
+
this.detailScroll = Math.min(this.detailScroll, Math.max(0, lines.length - visible));
|
|
248
|
+
for (let i = 0; i < visible; i++) {
|
|
249
|
+
const lineIdx = this.detailScroll + i;
|
|
250
|
+
const row = startRow + i;
|
|
251
|
+
term.moveTo(1, row);
|
|
252
|
+
term.eraseLine();
|
|
253
|
+
if (lineIdx < lines.length) {
|
|
254
|
+
lines[lineIdx].render(term, width);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Clean up panel resources.
|
|
260
|
+
*/
|
|
261
|
+
destroy() {
|
|
262
|
+
this.services = [];
|
|
263
|
+
this.config = {};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/tui/panels/services.ts"],"names":[],"mappings":"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"}
|
package/lib/tui/tui.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal UI dashboard for the Webda debug server.
|
|
3
|
+
*
|
|
4
|
+
* Provides a tab-based interface with seven panels (Logs, Models, Services,
|
|
5
|
+
* Operations, Routes, Config, Requests) and live WebSocket updates.
|
|
6
|
+
* Connect to an already-running debug server started with `webda debug`.
|
|
7
|
+
*/
|
|
8
|
+
export declare class DebugTui {
|
|
9
|
+
private client;
|
|
10
|
+
private panels;
|
|
11
|
+
private logsPanel;
|
|
12
|
+
private activeTab;
|
|
13
|
+
private running;
|
|
14
|
+
/** Called once the TUI stopped (user quit) */
|
|
15
|
+
onStop?: () => void;
|
|
16
|
+
private renderTimer?;
|
|
17
|
+
private lastRefresh;
|
|
18
|
+
private wsUnsubscribe?;
|
|
19
|
+
private appInfo;
|
|
20
|
+
/**
|
|
21
|
+
* Create a new TUI instance.
|
|
22
|
+
*
|
|
23
|
+
* @param port - Port of the debug server to connect to
|
|
24
|
+
*/
|
|
25
|
+
constructor(port?: number);
|
|
26
|
+
/**
|
|
27
|
+
* Start the TUI: initialize terminal, load data, and begin rendering.
|
|
28
|
+
*/
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Refresh data for all panels.
|
|
32
|
+
*/
|
|
33
|
+
private refreshAll;
|
|
34
|
+
/**
|
|
35
|
+
* Handle keyboard input.
|
|
36
|
+
* @param key - key name from terminal-kit
|
|
37
|
+
*/
|
|
38
|
+
private handleKey;
|
|
39
|
+
/**
|
|
40
|
+
* Full render: header, panel content, status bar.
|
|
41
|
+
*/
|
|
42
|
+
private render;
|
|
43
|
+
/**
|
|
44
|
+
* Render the header/tab bar.
|
|
45
|
+
* @param width - terminal width in columns
|
|
46
|
+
*/
|
|
47
|
+
private renderHeader;
|
|
48
|
+
/**
|
|
49
|
+
* Render the status bar at the bottom.
|
|
50
|
+
* @param width - terminal width in columns
|
|
51
|
+
* @param height - terminal height in rows
|
|
52
|
+
*/
|
|
53
|
+
private renderStatusBar;
|
|
54
|
+
/**
|
|
55
|
+
* Stop the TUI and clean up.
|
|
56
|
+
*/
|
|
57
|
+
stop(): void;
|
|
58
|
+
}
|