@auto-engineer/cli 1.17.0 → 1.19.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.
- package/CHANGELOG.md +98 -0
- package/dist/src/index.js +63 -30
- package/dist/src/index.js.map +1 -1
- package/dist/src/server.d.ts +4 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +8 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/tui/App.d.ts +18 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +57 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/Dashboard.d.ts +26 -0
- package/dist/src/tui/Dashboard.d.ts.map +1 -0
- package/dist/src/tui/Dashboard.js +21 -0
- package/dist/src/tui/Dashboard.js.map +1 -0
- package/dist/src/tui/LogBuffer.d.ts +10 -0
- package/dist/src/tui/LogBuffer.d.ts.map +1 -0
- package/dist/src/tui/LogBuffer.js +23 -0
- package/dist/src/tui/LogBuffer.js.map +1 -0
- package/dist/src/tui/ServiceRegistry.d.ts +22 -0
- package/dist/src/tui/ServiceRegistry.d.ts.map +1 -0
- package/dist/src/tui/ServiceRegistry.js +41 -0
- package/dist/src/tui/ServiceRegistry.js.map +1 -0
- package/dist/src/tui/components/AutoTab.d.ts +24 -0
- package/dist/src/tui/components/AutoTab.d.ts.map +1 -0
- package/dist/src/tui/components/AutoTab.js +21 -0
- package/dist/src/tui/components/AutoTab.js.map +1 -0
- package/dist/src/tui/components/Footer.d.ts +3 -0
- package/dist/src/tui/components/Footer.d.ts.map +1 -0
- package/dist/src/tui/components/Footer.js +6 -0
- package/dist/src/tui/components/Footer.js.map +1 -0
- package/dist/src/tui/components/ServiceTab.d.ts +8 -0
- package/dist/src/tui/components/ServiceTab.d.ts.map +1 -0
- package/dist/src/tui/components/ServiceTab.js +12 -0
- package/dist/src/tui/components/ServiceTab.js.map +1 -0
- package/dist/src/tui/components/SummaryTab.d.ts +15 -0
- package/dist/src/tui/components/SummaryTab.d.ts.map +1 -0
- package/dist/src/tui/components/SummaryTab.js +19 -0
- package/dist/src/tui/components/SummaryTab.js.map +1 -0
- package/dist/src/tui/components/TabBar.d.ts +13 -0
- package/dist/src/tui/components/TabBar.d.ts.map +1 -0
- package/dist/src/tui/components/TabBar.js +10 -0
- package/dist/src/tui/components/TabBar.js.map +1 -0
- package/dist/src/tui/hooks/useServiceStreams.d.ts +4 -0
- package/dist/src/tui/hooks/useServiceStreams.d.ts.map +1 -0
- package/dist/src/tui/hooks/useServiceStreams.js +7 -0
- package/dist/src/tui/hooks/useServiceStreams.js.map +1 -0
- package/dist/src/tui/index.d.ts +20 -0
- package/dist/src/tui/index.d.ts.map +1 -0
- package/dist/src/tui/index.js +10 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tunnel.d.ts.map +1 -1
- package/dist/src/tunnel.js +31 -1
- package/dist/src/tunnel.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -4
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class ServiceRegistry {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.services = new Map();
|
|
4
|
+
this.listeners = [];
|
|
5
|
+
}
|
|
6
|
+
register(handle) {
|
|
7
|
+
this.services.set(handle.id, handle);
|
|
8
|
+
for (const listener of this.listeners) {
|
|
9
|
+
listener(handle);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get(id) {
|
|
13
|
+
return this.services.get(id);
|
|
14
|
+
}
|
|
15
|
+
getAll() {
|
|
16
|
+
return [...this.services.values()];
|
|
17
|
+
}
|
|
18
|
+
onServiceAdded(listener) {
|
|
19
|
+
this.listeners.push(listener);
|
|
20
|
+
return () => {
|
|
21
|
+
const index = this.listeners.indexOf(listener);
|
|
22
|
+
if (index !== -1) {
|
|
23
|
+
this.listeners.splice(index, 1);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
killAll() {
|
|
28
|
+
for (const handle of this.services.values()) {
|
|
29
|
+
try {
|
|
30
|
+
// Only kill actual child processes (not the main process used as placeholder)
|
|
31
|
+
if (handle.process?.pid && typeof handle.process.kill === 'function' && handle.process.pid !== process.pid) {
|
|
32
|
+
handle.process.kill('SIGTERM');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Process may already be dead
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ServiceRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceRegistry.js","sourceRoot":"","sources":["../../../src/tui/ServiceRegistry.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,eAAe;IAA5B;QACU,aAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC5C,cAAS,GAAsB,EAAE,CAAC;IAuC5C,CAAC;IArCC,QAAQ,CAAC,MAAqB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,QAAyB;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,8EAA8E;gBAC9E,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC3G,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
type ServiceStatus = 'starting' | 'running' | 'error' | 'stopped';
|
|
3
|
+
interface ServiceSummary {
|
|
4
|
+
id: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
status: ServiceStatus;
|
|
7
|
+
statusMessage?: string;
|
|
8
|
+
}
|
|
9
|
+
interface TunnelInfo {
|
|
10
|
+
url: string;
|
|
11
|
+
token: string;
|
|
12
|
+
}
|
|
13
|
+
interface ServerInfo {
|
|
14
|
+
port: number;
|
|
15
|
+
tunnel?: TunnelInfo;
|
|
16
|
+
tunnelError?: string;
|
|
17
|
+
}
|
|
18
|
+
interface AutoTabProps {
|
|
19
|
+
serverInfo: ServerInfo;
|
|
20
|
+
services: ServiceSummary[];
|
|
21
|
+
}
|
|
22
|
+
export declare function AutoTab({ serverInfo, services }: AutoTabProps): ReactElement;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=AutoTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoTab.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/AutoTab.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAeD,wBAAgB,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,YAAY,GAAG,YAAY,CA2F5E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
function StatusIcon({ status }) {
|
|
4
|
+
switch (status) {
|
|
5
|
+
case 'running':
|
|
6
|
+
return _jsx(Text, { color: "green", children: "\u2713" });
|
|
7
|
+
case 'starting':
|
|
8
|
+
return _jsx(Text, { color: "yellow", children: "\u23F3" });
|
|
9
|
+
case 'error':
|
|
10
|
+
return _jsx(Text, { color: "red", children: "\u2717" });
|
|
11
|
+
case 'stopped':
|
|
12
|
+
return _jsx(Text, { color: "gray", children: "\u25CB" });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function AutoTab({ serverInfo, services }) {
|
|
16
|
+
const { port, tunnel, tunnelError } = serverInfo;
|
|
17
|
+
const baseUrl = `http://localhost:${port}`;
|
|
18
|
+
const errors = services.filter((s) => s.status === 'error');
|
|
19
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: "green", children: "\u2713 " }), _jsx(Text, { children: "Pipeline server running at " }), _jsx(Text, { color: "cyan", children: baseUrl })] }), tunnelError ? (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "red", children: "Tunnel Error:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "red", children: tunnelError }) })] })) : tunnel ? (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Tunnel:" }), _jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: "Public URL: " }), _jsx(Text, { children: tunnel.url })] }), _jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: "Auth Token: " }), _jsx(Text, { children: tunnel.token })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "Use these to connect from the Auto cloud app." }) })] })) : (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Remote Access:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "Run with --tunnel to expose a public URL via ngrok for the Auto cloud app." }) })] })), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Endpoints:" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "/health \u00B7 /registry \u00B7 /pipeline \u00B7 /pipeline/diagram" }) }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "/events (SSE) \u00B7 /file-sync (WebSocket)" }) })] }), services.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Services:" }), services.map((service) => (_jsxs(Box, { marginLeft: 2, children: [_jsx(StatusIcon, { status: service.status }), _jsxs(Text, { children: [" ", service.displayName] }), service.statusMessage && _jsxs(Text, { dimColor: true, children: [" ", service.statusMessage] })] }, service.id)))] })), errors.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "red", children: "Recent Issues:" }), errors.map((service) => (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { color: "red", children: [service.displayName, ": ", service.statusMessage] }) }, service.id)))] }))] }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=AutoTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoTab.js","sourceRoot":"","sources":["../../../../src/tui/components/AutoTab.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/Footer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,wBAAgB,MAAM,IAAI,YAAY,CAMrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../../src/tui/components/Footer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC,MAAM,UAAU,MAAM;IACpB,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,4CAA6B,GACvC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceTab.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/ServiceTab.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,eAAe,GAAG,YAAY,CA8B/E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useStdout } from 'ink';
|
|
3
|
+
export function ServiceTab({ displayName, logs }) {
|
|
4
|
+
const { stdout } = useStdout();
|
|
5
|
+
// Reserve lines for: header (2 with margin), footer (1), tab bar (1), padding (2)
|
|
6
|
+
const reservedLines = 6;
|
|
7
|
+
const maxLines = Math.max(1, (stdout?.rows ?? 24) - reservedLines);
|
|
8
|
+
// Show only the last N lines that fit
|
|
9
|
+
const visibleLogs = logs.slice(-maxLines);
|
|
10
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, height: maxLines + 3, overflowY: "hidden", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "cyan", children: displayName }) }), logs.length === 0 ? (_jsx(Text, { dimColor: true, children: "No output yet" })) : (_jsx(Box, { flexDirection: "column", overflowY: "hidden", children: visibleLogs.map((line, index) => (_jsx(Text, { wrap: "truncate", children: line }, `log-${index}-${line.slice(0, 20)}`))) }))] }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ServiceTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceTab.js","sourceRoot":"","sources":["../../../../src/tui/components/ServiceTab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAQ3C,MAAM,UAAU,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAmB;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,kFAAkF;IAClF,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC;IAEnE,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE1C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAC,QAAQ,aAC9E,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YACpB,WAAW,GACP,GACH,EAEL,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACnB,KAAC,IAAI,IAAC,QAAQ,oCAAqB,CACpC,CAAC,CAAC,CAAC,CACF,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,YAC3C,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,IAAI,IAA2C,IAAI,EAAC,UAAU,YAC5D,IAAI,IADI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAEvC,CACR,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
type ServiceStatus = 'starting' | 'running' | 'error' | 'stopped';
|
|
3
|
+
interface ServiceSummary {
|
|
4
|
+
id: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
status: ServiceStatus;
|
|
7
|
+
statusMessage?: string;
|
|
8
|
+
}
|
|
9
|
+
interface SummaryTabProps {
|
|
10
|
+
serverUrl: string;
|
|
11
|
+
services: ServiceSummary[];
|
|
12
|
+
}
|
|
13
|
+
export declare function SummaryTab({ serverUrl, services }: SummaryTabProps): ReactElement;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=SummaryTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTab.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/SummaryTab.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,KAAK,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAeD,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,YAAY,CAwCjF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
function StatusIcon({ status }) {
|
|
4
|
+
switch (status) {
|
|
5
|
+
case 'running':
|
|
6
|
+
return _jsx(Text, { color: "green", children: "\u2713" });
|
|
7
|
+
case 'starting':
|
|
8
|
+
return _jsx(Text, { color: "yellow", children: "\u23F3" });
|
|
9
|
+
case 'error':
|
|
10
|
+
return _jsx(Text, { color: "red", children: "\u2717" });
|
|
11
|
+
case 'stopped':
|
|
12
|
+
return _jsx(Text, { color: "gray", children: "\u25CB" });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function SummaryTab({ serverUrl, services }) {
|
|
16
|
+
const errors = services.filter((s) => s.status === 'error');
|
|
17
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: "green", children: "\u2713 " }), _jsx(Text, { children: "Pipeline server running at " }), _jsx(Text, { color: "cyan", children: serverUrl })] }), services.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Services:" }), services.map((service) => (_jsxs(Box, { marginLeft: 2, children: [_jsx(StatusIcon, { status: service.status }), _jsxs(Text, { children: [" ", service.displayName] }), service.statusMessage && _jsxs(Text, { dimColor: true, children: [" ", service.statusMessage] })] }, service.id)))] })), errors.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "red", children: "Recent Issues:" }), errors.map((service) => (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { color: "red", children: [service.displayName, ": ", service.statusMessage] }) }, service.id)))] }))] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SummaryTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTab.js","sourceRoot":"","sources":["../../../../src/tui/components/SummaryTab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAiBhC,SAAS,UAAU,CAAC,EAAE,MAAM,EAA6B;IACvD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,uBAAS,CAAC;QACtC,KAAK,UAAU;YACb,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,uBAAS,CAAC;QACvC,KAAK,OAAO;YACV,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,uBAAS,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAmB;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAE5D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,wBAAU,EAC7B,KAAC,IAAI,8CAAmC,EACxC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,GAAQ,IACjC,EAEL,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,IAAI,gCAAiB,EAC1B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzB,MAAC,GAAG,IAAkB,UAAU,EAAE,CAAC,aACjC,KAAC,UAAU,IAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAI,EACtC,MAAC,IAAI,oBAAG,OAAO,CAAC,WAAW,IAAQ,EAClC,OAAO,CAAC,aAAa,IAAI,MAAC,IAAI,IAAC,QAAQ,wBAAG,OAAO,CAAC,aAAa,IAAQ,KAHhE,OAAO,CAAC,EAAE,CAId,CACP,CAAC,IACE,CACP,EAEA,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,+BAEf,EACN,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACvB,KAAC,GAAG,IAAkB,UAAU,EAAE,CAAC,YACjC,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,aACd,OAAO,CAAC,WAAW,QAAI,OAAO,CAAC,aAAa,IACxC,IAHC,OAAO,CAAC,EAAE,CAId,CACP,CAAC,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
export interface Tab {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
hasError?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface TabBarProps {
|
|
8
|
+
tabs: Tab[];
|
|
9
|
+
activeTab: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function TabBar({ tabs, activeTab }: TabBarProps): ReactElement;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=TabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/TabBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,GAAG,YAAY,CAqBrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function TabBar({ tabs, activeTab }) {
|
|
4
|
+
return (_jsx(Box, { children: tabs.map((tab) => {
|
|
5
|
+
const isActive = tab.id === activeTab;
|
|
6
|
+
const errorIndicator = tab.hasError ? _jsx(Text, { color: "red", children: "\u25CF" }) : null;
|
|
7
|
+
return (_jsxs(Box, { marginRight: 1, children: [isActive ? (_jsxs(Text, { bold: true, color: "cyan", children: ["[", tab.label, "]"] })) : (_jsxs(Text, { dimColor: true, children: [" ", tab.label, " "] })), errorIndicator] }, tab.id));
|
|
8
|
+
}) }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=TabBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../../src/tui/components/TabBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAchC,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAe;IACrD,OAAO,CACL,KAAC,GAAG,cACD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC;YACtC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,uBAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YACxE,OAAO,CACL,MAAC,GAAG,IAAc,WAAW,EAAE,CAAC,aAC7B,QAAQ,CAAC,CAAC,CAAC,CACV,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,kBACnB,GAAG,CAAC,KAAK,SACN,CACR,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,IAAC,QAAQ,wBAAG,GAAG,CAAC,KAAK,SAAS,CACpC,EACA,cAAc,KARP,GAAG,CAAC,EAAE,CASV,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useServiceStreams.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/useServiceStreams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAKlG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useServiceStreams.js","sourceRoot":"","sources":["../../../../src/tui/hooks/useServiceStreams.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,MAAgB,EAAE,MAAiB,EAAE,QAAqB;IAC1F,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ServiceRegistry } from './ServiceRegistry.js';
|
|
2
|
+
export { LogBuffer } from './LogBuffer.js';
|
|
3
|
+
export { type ServiceHandle, ServiceRegistry } from './ServiceRegistry.js';
|
|
4
|
+
interface TunnelInfo {
|
|
5
|
+
url: string;
|
|
6
|
+
token: string;
|
|
7
|
+
}
|
|
8
|
+
interface ServerInfo {
|
|
9
|
+
port: number;
|
|
10
|
+
tunnel?: TunnelInfo;
|
|
11
|
+
tunnelError?: string;
|
|
12
|
+
}
|
|
13
|
+
interface RenderTuiOptions {
|
|
14
|
+
serverInfo: ServerInfo;
|
|
15
|
+
registry: ServiceRegistry;
|
|
16
|
+
}
|
|
17
|
+
export declare function renderTui({ serverInfo, registry }: RenderTuiOptions): {
|
|
18
|
+
unmount: () => void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE3E,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAG7F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { render } from 'ink';
|
|
3
|
+
import { App } from './App.js';
|
|
4
|
+
export { LogBuffer } from './LogBuffer.js';
|
|
5
|
+
export { ServiceRegistry } from './ServiceRegistry.js';
|
|
6
|
+
export function renderTui({ serverInfo, registry }) {
|
|
7
|
+
const { unmount } = render(_jsx(App, { serverInfo: serverInfo, registry: registry }));
|
|
8
|
+
return { unmount };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAsB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAkB3E,MAAM,UAAU,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAoB;IAClE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,KAAC,GAAG,IAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC;IAChF,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
package/dist/src/tunnel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAe9E;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAelF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAkDvD"}
|
package/dist/src/tunnel.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
|
+
import { PassThrough } from 'node:stream';
|
|
3
|
+
import { getServiceRegistry } from './server.js';
|
|
2
4
|
const LOCALHOST_IPS = new Set(['127.0.0.1', '::1', '::ffff:127.0.0.1']);
|
|
3
5
|
export function generateBearerToken() {
|
|
4
6
|
return crypto.randomBytes(32).toString('hex');
|
|
@@ -34,14 +36,42 @@ export function createTunnelSocketMiddleware(bearerToken) {
|
|
|
34
36
|
export async function startTunnel(options) {
|
|
35
37
|
try {
|
|
36
38
|
const ngrok = await import('@ngrok/ngrok');
|
|
39
|
+
const isTuiMode = process.env.AUTO_TUI_MODE === '1';
|
|
40
|
+
// Create streams to capture ngrok logs for TUI
|
|
41
|
+
const stdout = new PassThrough();
|
|
42
|
+
const stderr = new PassThrough();
|
|
37
43
|
const listener = await ngrok.default.forward({
|
|
38
44
|
addr: options.port,
|
|
39
45
|
authtoken: options.authtoken,
|
|
40
46
|
domain: options.domain,
|
|
47
|
+
onLogEvent: isTuiMode
|
|
48
|
+
? (log) => {
|
|
49
|
+
stdout.write(`${log}\n`);
|
|
50
|
+
}
|
|
51
|
+
: undefined,
|
|
41
52
|
});
|
|
53
|
+
// Register ngrok as a service in TUI mode
|
|
54
|
+
if (isTuiMode) {
|
|
55
|
+
const registry = getServiceRegistry();
|
|
56
|
+
if (registry) {
|
|
57
|
+
stdout.write(`Tunnel established: ${listener.url()}\n`);
|
|
58
|
+
registry.register({
|
|
59
|
+
id: 'ngrok',
|
|
60
|
+
displayName: 'ngrok',
|
|
61
|
+
color: 'blue',
|
|
62
|
+
stdout,
|
|
63
|
+
stderr,
|
|
64
|
+
process: process, // ngrok doesn't have a child process, use current process as placeholder
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
42
68
|
return {
|
|
43
69
|
url: listener.url(),
|
|
44
|
-
close: () =>
|
|
70
|
+
close: async () => {
|
|
71
|
+
stdout.end();
|
|
72
|
+
stderr.end();
|
|
73
|
+
await listener.close();
|
|
74
|
+
},
|
|
45
75
|
};
|
|
46
76
|
}
|
|
47
77
|
catch (error) {
|
package/dist/src/tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"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"}
|