@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.
Files changed (56) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/src/index.js +63 -30
  3. package/dist/src/index.js.map +1 -1
  4. package/dist/src/server.d.ts +4 -0
  5. package/dist/src/server.d.ts.map +1 -1
  6. package/dist/src/server.js +8 -0
  7. package/dist/src/server.js.map +1 -1
  8. package/dist/src/tui/App.d.ts +18 -0
  9. package/dist/src/tui/App.d.ts.map +1 -0
  10. package/dist/src/tui/App.js +57 -0
  11. package/dist/src/tui/App.js.map +1 -0
  12. package/dist/src/tui/Dashboard.d.ts +26 -0
  13. package/dist/src/tui/Dashboard.d.ts.map +1 -0
  14. package/dist/src/tui/Dashboard.js +21 -0
  15. package/dist/src/tui/Dashboard.js.map +1 -0
  16. package/dist/src/tui/LogBuffer.d.ts +10 -0
  17. package/dist/src/tui/LogBuffer.d.ts.map +1 -0
  18. package/dist/src/tui/LogBuffer.js +23 -0
  19. package/dist/src/tui/LogBuffer.js.map +1 -0
  20. package/dist/src/tui/ServiceRegistry.d.ts +22 -0
  21. package/dist/src/tui/ServiceRegistry.d.ts.map +1 -0
  22. package/dist/src/tui/ServiceRegistry.js +41 -0
  23. package/dist/src/tui/ServiceRegistry.js.map +1 -0
  24. package/dist/src/tui/components/AutoTab.d.ts +24 -0
  25. package/dist/src/tui/components/AutoTab.d.ts.map +1 -0
  26. package/dist/src/tui/components/AutoTab.js +21 -0
  27. package/dist/src/tui/components/AutoTab.js.map +1 -0
  28. package/dist/src/tui/components/Footer.d.ts +3 -0
  29. package/dist/src/tui/components/Footer.d.ts.map +1 -0
  30. package/dist/src/tui/components/Footer.js +6 -0
  31. package/dist/src/tui/components/Footer.js.map +1 -0
  32. package/dist/src/tui/components/ServiceTab.d.ts +8 -0
  33. package/dist/src/tui/components/ServiceTab.d.ts.map +1 -0
  34. package/dist/src/tui/components/ServiceTab.js +12 -0
  35. package/dist/src/tui/components/ServiceTab.js.map +1 -0
  36. package/dist/src/tui/components/SummaryTab.d.ts +15 -0
  37. package/dist/src/tui/components/SummaryTab.d.ts.map +1 -0
  38. package/dist/src/tui/components/SummaryTab.js +19 -0
  39. package/dist/src/tui/components/SummaryTab.js.map +1 -0
  40. package/dist/src/tui/components/TabBar.d.ts +13 -0
  41. package/dist/src/tui/components/TabBar.d.ts.map +1 -0
  42. package/dist/src/tui/components/TabBar.js +10 -0
  43. package/dist/src/tui/components/TabBar.js.map +1 -0
  44. package/dist/src/tui/hooks/useServiceStreams.d.ts +4 -0
  45. package/dist/src/tui/hooks/useServiceStreams.d.ts.map +1 -0
  46. package/dist/src/tui/hooks/useServiceStreams.js +7 -0
  47. package/dist/src/tui/hooks/useServiceStreams.js.map +1 -0
  48. package/dist/src/tui/index.d.ts +20 -0
  49. package/dist/src/tui/index.d.ts.map +1 -0
  50. package/dist/src/tui/index.js +10 -0
  51. package/dist/src/tui/index.js.map +1 -0
  52. package/dist/src/tunnel.d.ts.map +1 -1
  53. package/dist/src/tunnel.js +31 -1
  54. package/dist/src/tunnel.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. 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,3 @@
1
+ import type { ReactElement } from 'react';
2
+ export declare function Footer(): ReactElement;
3
+ //# sourceMappingURL=Footer.d.ts.map
@@ -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,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function Footer() {
4
+ return (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: "[Tab] switch [q] quit" }) }));
5
+ }
6
+ //# sourceMappingURL=Footer.js.map
@@ -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,8 @@
1
+ import type { ReactElement } from 'react';
2
+ interface ServiceTabProps {
3
+ displayName: string;
4
+ logs: string[];
5
+ }
6
+ export declare function ServiceTab({ displayName, logs }: ServiceTabProps): ReactElement;
7
+ export {};
8
+ //# sourceMappingURL=ServiceTab.d.ts.map
@@ -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,4 @@
1
+ import type { Readable } from 'node:stream';
2
+ import type { LogBuffer } from '../LogBuffer.js';
3
+ export declare function wireServiceStream(stream: Readable, buffer: LogBuffer, onChange?: () => void): void;
4
+ //# sourceMappingURL=useServiceStreams.d.ts.map
@@ -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,7 @@
1
+ export function wireServiceStream(stream, buffer, onChange) {
2
+ stream.on('data', (chunk) => {
3
+ buffer.append(chunk.toString());
4
+ onChange?.();
5
+ });
6
+ }
7
+ //# sourceMappingURL=useServiceStreams.js.map
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,cAAc,EAAY,MAAM,SAAS,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/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,CAmBvD"}
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"}
@@ -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: () => listener.close(),
70
+ close: async () => {
71
+ stdout.end();
72
+ stderr.end();
73
+ await listener.close();
74
+ },
45
75
  };
46
76
  }
47
77
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,UAAU,KAAK,UAAU,WAAW,EAAE,EAAE,CAAC;YAC3C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,WAAmB;IAC9D,OAAO,CAAC,MAAc,EAAE,IAA2B,EAAE,EAAE;QACrD,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAI,MAAM,CAAC,SAAS,CAAC,IAA+B,CAAC,KAAK,CAAC;QACtE,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAIjC;IACC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAG;YACpB,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,qEAAqE,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"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"}