ttyd-mux 0.3.0 → 0.4.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/README.md +105 -1
- package/dist/caddy/client.d.ts +3 -55
- package/dist/caddy/client.d.ts.map +1 -1
- package/dist/caddy/client.js +0 -73
- package/dist/caddy/client.js.map +1 -1
- package/dist/caddy/route-builder.d.ts +49 -0
- package/dist/caddy/route-builder.d.ts.map +1 -0
- package/dist/caddy/route-builder.js +175 -0
- package/dist/caddy/route-builder.js.map +1 -0
- package/dist/caddy/types.d.ts +27 -0
- package/dist/caddy/types.d.ts.map +1 -0
- package/dist/caddy/types.js +3 -0
- package/dist/caddy/types.js.map +1 -0
- package/dist/client/api-client.d.ts +26 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +62 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/daemon-client.d.ts +48 -0
- package/dist/client/daemon-client.d.ts.map +1 -0
- package/dist/client/daemon-client.js +205 -0
- package/dist/client/daemon-client.js.map +1 -0
- package/dist/client/index.d.ts +2 -10
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -136
- package/dist/client/index.js.map +1 -1
- package/dist/commands/attach.js +3 -4
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/caddy.d.ts +2 -1
- package/dist/commands/caddy.d.ts.map +1 -1
- package/dist/commands/caddy.js +227 -75
- package/dist/commands/caddy.js.map +1 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +100 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +180 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +11 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/reload.d.ts +14 -0
- package/dist/commands/reload.d.ts.map +1 -0
- package/dist/commands/reload.js +50 -0
- package/dist/commands/reload.js.map +1 -0
- package/dist/commands/shutdown.d.ts +2 -1
- package/dist/commands/shutdown.d.ts.map +1 -1
- package/dist/commands/shutdown.js +8 -2
- package/dist/commands/shutdown.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +16 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/up.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +9 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/state-store.d.ts +27 -0
- package/dist/config/state-store.d.ts.map +1 -0
- package/dist/config/state-store.js +55 -0
- package/dist/config/state-store.js.map +1 -0
- package/dist/config/state.d.ts +6 -0
- package/dist/config/state.d.ts.map +1 -1
- package/dist/config/state.js +49 -14
- package/dist/config/state.js.map +1 -1
- package/dist/config/types.d.ts +35 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +23 -1
- package/dist/config/types.js.map +1 -1
- package/dist/daemon/api-handler.d.ts +5 -0
- package/dist/daemon/api-handler.d.ts.map +1 -0
- package/dist/daemon/api-handler.js +97 -0
- package/dist/daemon/api-handler.js.map +1 -0
- package/dist/daemon/config-manager.d.ts +43 -0
- package/dist/daemon/config-manager.d.ts.map +1 -0
- package/dist/daemon/config-manager.js +154 -0
- package/dist/daemon/config-manager.js.map +1 -0
- package/dist/daemon/http-proxy.d.ts +27 -0
- package/dist/daemon/http-proxy.d.ts.map +1 -0
- package/dist/daemon/http-proxy.js +110 -0
- package/dist/daemon/http-proxy.js.map +1 -0
- package/dist/daemon/ime-helper.d.ts +1 -1
- package/dist/daemon/ime-helper.d.ts.map +1 -1
- package/dist/daemon/ime-helper.js +284 -10
- package/dist/daemon/ime-helper.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +134 -29
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/portal-utils.d.ts +20 -0
- package/dist/daemon/portal-utils.d.ts.map +1 -0
- package/dist/daemon/portal-utils.js +109 -0
- package/dist/daemon/portal-utils.js.map +1 -0
- package/dist/daemon/portal.d.ts.map +1 -1
- package/dist/daemon/portal.js +20 -77
- package/dist/daemon/portal.js.map +1 -1
- package/dist/daemon/pwa.d.ts +52 -0
- package/dist/daemon/pwa.d.ts.map +1 -0
- package/dist/daemon/pwa.js +229 -0
- package/dist/daemon/pwa.js.map +1 -0
- package/dist/daemon/router.d.ts +15 -0
- package/dist/daemon/router.d.ts.map +1 -0
- package/dist/daemon/router.js +164 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +15 -3
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +23 -271
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +44 -10
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +125 -49
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/daemon/session-resolver.d.ts +1 -1
- package/dist/daemon/session-resolver.d.ts.map +1 -1
- package/dist/daemon/session-resolver.js.map +1 -1
- package/dist/daemon/toolbar/config.d.ts +13 -0
- package/dist/daemon/toolbar/config.d.ts.map +1 -0
- package/dist/daemon/toolbar/config.js +13 -0
- package/dist/daemon/toolbar/config.js.map +1 -0
- package/dist/daemon/toolbar/index.d.ts +43 -0
- package/dist/daemon/toolbar/index.d.ts.map +1 -0
- package/dist/daemon/toolbar/index.js +835 -0
- package/dist/daemon/toolbar/index.js.map +1 -0
- package/dist/daemon/toolbar/styles.d.ts +5 -0
- package/dist/daemon/toolbar/styles.d.ts.map +1 -0
- package/dist/daemon/toolbar/styles.js +278 -0
- package/dist/daemon/toolbar/styles.js.map +1 -0
- package/dist/daemon/toolbar/template.d.ts +6 -0
- package/dist/daemon/toolbar/template.d.ts.map +1 -0
- package/dist/daemon/toolbar/template.js +45 -0
- package/dist/daemon/toolbar/template.js.map +1 -0
- package/dist/daemon/ws-proxy.d.ts +17 -0
- package/dist/daemon/ws-proxy.d.ts.map +1 -0
- package/dist/daemon/ws-proxy.js +95 -0
- package/dist/daemon/ws-proxy.js.map +1 -0
- package/dist/deploy/caddyfile.d.ts +8 -0
- package/dist/deploy/caddyfile.d.ts.map +1 -0
- package/dist/deploy/caddyfile.js +62 -0
- package/dist/deploy/caddyfile.js.map +1 -0
- package/dist/deploy/deploy-script.d.ts +8 -0
- package/dist/deploy/deploy-script.d.ts.map +1 -0
- package/dist/deploy/deploy-script.js +72 -0
- package/dist/deploy/deploy-script.js.map +1 -0
- package/dist/deploy/static-portal.d.ts +3 -0
- package/dist/deploy/static-portal.d.ts.map +1 -0
- package/dist/deploy/static-portal.js +59 -0
- package/dist/deploy/static-portal.js.map +1 -0
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/test-setup.d.ts +19 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +33 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tmux.d.ts +28 -1
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +37 -32
- package/dist/tmux.js.map +1 -1
- package/dist/ui.d.ts +2 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +16 -9
- package/dist/ui.js.map +1 -1
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +9 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process-runner.d.ts +50 -0
- package/dist/utils/process-runner.d.ts.map +1 -0
- package/dist/utils/process-runner.js +73 -0
- package/dist/utils/process-runner.js.map +1 -0
- package/dist/utils/socket-client.d.ts +24 -0
- package/dist/utils/socket-client.d.ts.map +1 -0
- package/dist/utils/socket-client.js +30 -0
- package/dist/utils/socket-client.js.map +1 -0
- package/dist/utils/tmux-client.d.ts +57 -0
- package/dist/utils/tmux-client.d.ts.map +1 -0
- package/dist/utils/tmux-client.js +117 -0
- package/dist/utils/tmux-client.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -2
- package/dist/daemon/proxy.d.ts +0 -7
- package/dist/daemon/proxy.d.ts.map +0 -1
- package/dist/daemon/proxy.js +0 -17
- package/dist/daemon/proxy.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { getDaemonClientDeps } from './daemon-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get daemon URL from state or config
|
|
4
|
+
*/
|
|
5
|
+
function getDaemonUrl(config) {
|
|
6
|
+
const deps = getDaemonClientDeps();
|
|
7
|
+
const daemon = deps.stateStore.getDaemonState();
|
|
8
|
+
const port = daemon?.port ?? config.daemon_port;
|
|
9
|
+
return `http://localhost:${port}`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Make an API request to the daemon
|
|
13
|
+
*/
|
|
14
|
+
export async function apiRequest(config, method, path, body) {
|
|
15
|
+
const url = `${getDaemonUrl(config)}${config.base_path}${path}`;
|
|
16
|
+
const response = await fetch(url, {
|
|
17
|
+
method,
|
|
18
|
+
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
19
|
+
body: body ? JSON.stringify(body) : undefined
|
|
20
|
+
});
|
|
21
|
+
const data = await response.json();
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(data.error ?? 'Request failed');
|
|
24
|
+
}
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get daemon status
|
|
29
|
+
*/
|
|
30
|
+
export function getStatus(config) {
|
|
31
|
+
return apiRequest(config, 'GET', '/api/status');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all sessions
|
|
35
|
+
*/
|
|
36
|
+
export function getSessions(config) {
|
|
37
|
+
return apiRequest(config, 'GET', '/api/sessions');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Start a new session
|
|
41
|
+
*/
|
|
42
|
+
export function startSession(config, request) {
|
|
43
|
+
return apiRequest(config, 'POST', '/api/sessions', request);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop a session
|
|
47
|
+
*/
|
|
48
|
+
export async function stopSession(config, name) {
|
|
49
|
+
await apiRequest(config, 'DELETE', `/api/sessions/${encodeURIComponent(name)}`);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Request daemon shutdown
|
|
53
|
+
*/
|
|
54
|
+
export async function requestShutdown(config) {
|
|
55
|
+
try {
|
|
56
|
+
await apiRequest(config, 'POST', '/api/shutdown');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Server will shut down, so connection may be lost
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;GAEG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC;IAChD,OAAO,oBAAoB,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC;IAEhE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS;QAClE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAE,IAA2B,CAAC,KAAK,IAAI,gBAAgB,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,UAAU,CAAiB,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,UAAU,CAAoB,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,OAA4B;IAE5B,OAAO,UAAU,CAAkB,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY;IAC5D,MAAM,UAAU,CACd,MAAM,EACN,QAAQ,EACR,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,CAAuB,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type StateStore } from '../config/state-store.js';
|
|
2
|
+
import { type ProcessRunner } from '../utils/process-runner.js';
|
|
3
|
+
import { type SocketClient } from '../utils/socket-client.js';
|
|
4
|
+
/**
|
|
5
|
+
* Dependencies for DaemonClient (for testing)
|
|
6
|
+
*/
|
|
7
|
+
export interface DaemonClientDeps {
|
|
8
|
+
stateStore: StateStore;
|
|
9
|
+
socketClient: SocketClient;
|
|
10
|
+
processRunner: ProcessRunner;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Default dependencies using real implementations
|
|
14
|
+
*/
|
|
15
|
+
export declare const defaultDaemonClientDeps: DaemonClientDeps;
|
|
16
|
+
/**
|
|
17
|
+
* Set dependencies (for testing)
|
|
18
|
+
*/
|
|
19
|
+
export declare function setDaemonClientDeps(deps: Partial<DaemonClientDeps>): void;
|
|
20
|
+
/**
|
|
21
|
+
* Reset dependencies to defaults
|
|
22
|
+
*/
|
|
23
|
+
export declare function resetDaemonClientDeps(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get current dependencies (for api-client)
|
|
26
|
+
*/
|
|
27
|
+
export declare function getDaemonClientDeps(): DaemonClientDeps;
|
|
28
|
+
/**
|
|
29
|
+
* Check if daemon is running by pinging the socket
|
|
30
|
+
*/
|
|
31
|
+
export declare function isDaemonRunning(): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Ensure daemon is running, starting it if necessary
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureDaemon(configPath?: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Send a command to the daemon and get response
|
|
38
|
+
*/
|
|
39
|
+
export declare function sendCommand(command: string): Promise<string | null>;
|
|
40
|
+
export interface ShutdownDaemonOptions {
|
|
41
|
+
/** Stop all sessions before shutting down the daemon */
|
|
42
|
+
stopSessions?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Shutdown daemon via socket command
|
|
46
|
+
*/
|
|
47
|
+
export declare function shutdownDaemon(options?: ShutdownDaemonOptions): Promise<void>;
|
|
48
|
+
//# sourceMappingURL=daemon-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../../src/client/daemon-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAKlF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,gBAIrC,CAAC;AAKF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BxD;AAoFD;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BzE;AAED,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvF"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
2
|
+
import { defaultStateStore } from '../config/state-store.js';
|
|
3
|
+
import { defaultProcessRunner } from '../utils/process-runner.js';
|
|
4
|
+
import { defaultSocketClient } from '../utils/socket-client.js';
|
|
5
|
+
const DAEMON_START_TIMEOUT = 5000;
|
|
6
|
+
const DAEMON_CHECK_INTERVAL = 100;
|
|
7
|
+
/**
|
|
8
|
+
* Default dependencies using real implementations
|
|
9
|
+
*/
|
|
10
|
+
export const defaultDaemonClientDeps = {
|
|
11
|
+
stateStore: defaultStateStore,
|
|
12
|
+
socketClient: defaultSocketClient,
|
|
13
|
+
processRunner: defaultProcessRunner
|
|
14
|
+
};
|
|
15
|
+
// Module-level deps (allows dependency injection for testing)
|
|
16
|
+
let currentDeps = defaultDaemonClientDeps;
|
|
17
|
+
/**
|
|
18
|
+
* Set dependencies (for testing)
|
|
19
|
+
*/
|
|
20
|
+
export function setDaemonClientDeps(deps) {
|
|
21
|
+
currentDeps = { ...defaultDaemonClientDeps, ...deps };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reset dependencies to defaults
|
|
25
|
+
*/
|
|
26
|
+
export function resetDaemonClientDeps() {
|
|
27
|
+
currentDeps = defaultDaemonClientDeps;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get current dependencies (for api-client)
|
|
31
|
+
*/
|
|
32
|
+
export function getDaemonClientDeps() {
|
|
33
|
+
return currentDeps;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if daemon is running by pinging the socket
|
|
37
|
+
*/
|
|
38
|
+
export async function isDaemonRunning() {
|
|
39
|
+
const socketPath = currentDeps.stateStore.getSocketPath();
|
|
40
|
+
if (!currentDeps.socketClient.exists(socketPath)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
const socket = currentDeps.socketClient.connect(socketPath);
|
|
45
|
+
socket.on('connect', () => {
|
|
46
|
+
socket.write('ping');
|
|
47
|
+
});
|
|
48
|
+
socket.on('data', (data) => {
|
|
49
|
+
const response = data.toString().trim();
|
|
50
|
+
socket.end();
|
|
51
|
+
resolve(response === 'pong');
|
|
52
|
+
});
|
|
53
|
+
socket.on('error', () => {
|
|
54
|
+
resolve(false);
|
|
55
|
+
});
|
|
56
|
+
socket.setTimeout(1000, () => {
|
|
57
|
+
socket.destroy();
|
|
58
|
+
resolve(false);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve script path to absolute path
|
|
64
|
+
*/
|
|
65
|
+
function resolveScriptPath(scriptPath) {
|
|
66
|
+
if (!scriptPath) {
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
return isAbsolute(scriptPath) ? scriptPath : resolve(scriptPath);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect how the script is being run
|
|
73
|
+
*/
|
|
74
|
+
function detectRunMode() {
|
|
75
|
+
const arg1 = process.argv[1];
|
|
76
|
+
if (arg1 === 'run') {
|
|
77
|
+
return 'bun-run';
|
|
78
|
+
}
|
|
79
|
+
if (arg1?.endsWith('.ts') || arg1?.endsWith('.js')) {
|
|
80
|
+
return 'script';
|
|
81
|
+
}
|
|
82
|
+
if (arg1 && arg1 !== process.execPath) {
|
|
83
|
+
return 'script'; // symlink
|
|
84
|
+
}
|
|
85
|
+
return 'binary';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build the command to spawn daemon based on how this script is being run
|
|
89
|
+
*/
|
|
90
|
+
function buildDaemonCommand(configPath) {
|
|
91
|
+
const mode = detectRunMode();
|
|
92
|
+
let executable;
|
|
93
|
+
let args;
|
|
94
|
+
switch (mode) {
|
|
95
|
+
case 'bun-run': {
|
|
96
|
+
executable = process.argv[0] ?? 'bun';
|
|
97
|
+
args = ['run', resolveScriptPath(process.argv[2]), 'daemon', '-f'];
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'script': {
|
|
101
|
+
executable = process.argv[0] ?? 'bun';
|
|
102
|
+
args = [resolveScriptPath(process.argv[1]), 'daemon', '-f'];
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
default: {
|
|
106
|
+
executable = process.execPath;
|
|
107
|
+
args = ['daemon', '-f'];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (configPath) {
|
|
111
|
+
args.push('-c', configPath);
|
|
112
|
+
}
|
|
113
|
+
return { executable, args };
|
|
114
|
+
}
|
|
115
|
+
function sleep(ms) {
|
|
116
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Wait for daemon to become ready
|
|
120
|
+
*/
|
|
121
|
+
async function waitForDaemon() {
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
while (Date.now() - startTime < DAEMON_START_TIMEOUT) {
|
|
124
|
+
if (await isDaemonRunning()) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
await sleep(DAEMON_CHECK_INTERVAL);
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Ensure daemon is running, starting it if necessary
|
|
133
|
+
*/
|
|
134
|
+
export async function ensureDaemon(configPath) {
|
|
135
|
+
if (await isDaemonRunning()) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const { executable, args } = buildDaemonCommand(configPath);
|
|
139
|
+
const child = currentDeps.processRunner.spawn(executable, args, {
|
|
140
|
+
detached: true,
|
|
141
|
+
stdio: 'ignore',
|
|
142
|
+
env: process.env
|
|
143
|
+
});
|
|
144
|
+
child.unref();
|
|
145
|
+
if (!(await waitForDaemon())) {
|
|
146
|
+
throw new Error(`Failed to start daemon: timeout after ${DAEMON_START_TIMEOUT / 1000} seconds.\n Possible causes:\n - Required commands (ttyd, tmux) not installed\n - Port ${process.env['TTYD_MUX_DAEMON_PORT'] || 7680} already in use\n - Permission issues with socket path\n Run 'ttyd-mux doctor' to diagnose the problem.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Send a command to the daemon and get response
|
|
151
|
+
*/
|
|
152
|
+
export async function sendCommand(command) {
|
|
153
|
+
const socketPath = currentDeps.stateStore.getSocketPath();
|
|
154
|
+
if (!currentDeps.socketClient.exists(socketPath)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
const socket = currentDeps.socketClient.connect(socketPath);
|
|
159
|
+
socket.on('connect', () => {
|
|
160
|
+
socket.write(command);
|
|
161
|
+
});
|
|
162
|
+
socket.on('data', (data) => {
|
|
163
|
+
const response = data.toString().trim();
|
|
164
|
+
socket.end();
|
|
165
|
+
resolve(response);
|
|
166
|
+
});
|
|
167
|
+
socket.on('error', (err) => {
|
|
168
|
+
reject(err);
|
|
169
|
+
});
|
|
170
|
+
socket.setTimeout(5000, () => {
|
|
171
|
+
socket.destroy();
|
|
172
|
+
reject(new Error('Command timeout'));
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Shutdown daemon via socket command
|
|
178
|
+
*/
|
|
179
|
+
export async function shutdownDaemon(options = {}) {
|
|
180
|
+
const socketPath = currentDeps.stateStore.getSocketPath();
|
|
181
|
+
if (!currentDeps.socketClient.exists(socketPath)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const command = options.stopSessions ? 'shutdown-with-sessions' : 'shutdown';
|
|
185
|
+
return new Promise((resolve, reject) => {
|
|
186
|
+
const socket = currentDeps.socketClient.connect(socketPath);
|
|
187
|
+
socket.on('connect', () => {
|
|
188
|
+
socket.write(command);
|
|
189
|
+
});
|
|
190
|
+
socket.on('data', (data) => {
|
|
191
|
+
const response = data.toString().trim();
|
|
192
|
+
socket.end();
|
|
193
|
+
if (response === 'ok') {
|
|
194
|
+
resolve();
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
reject(new Error('Unexpected response'));
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
socket.on('error', (err) => {
|
|
201
|
+
reject(err);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=daemon-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/client/daemon-client.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export declare function ensureDaemon(configPath?: string): Promise<void>;
|
|
4
|
-
export declare function shutdownDaemon(): Promise<void>;
|
|
5
|
-
export declare function apiRequest<T>(config: Config, method: string, path: string, body?: unknown): Promise<T>;
|
|
6
|
-
export declare function getStatus(config: Config): Promise<StatusResponse>;
|
|
7
|
-
export declare function getSessions(config: Config): Promise<SessionResponse[]>;
|
|
8
|
-
export declare function startSession(config: Config, request: StartSessionRequest): Promise<SessionResponse>;
|
|
9
|
-
export declare function stopSession(config: Config, name: string): Promise<void>;
|
|
10
|
-
export declare function requestShutdown(config: Config): Promise<void>;
|
|
1
|
+
export { type DaemonClientDeps, defaultDaemonClientDeps, setDaemonClientDeps, resetDaemonClientDeps, isDaemonRunning, ensureDaemon, shutdownDaemon } from './daemon-client.js';
|
|
2
|
+
export { apiRequest, getStatus, getSessions, startSession, stopSession, requestShutdown } from './api-client.js';
|
|
11
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,iBAAiB,CAAC"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,137 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const DAEMON_START_TIMEOUT = 5000;
|
|
6
|
-
const DAEMON_CHECK_INTERVAL = 100;
|
|
7
|
-
export async function isDaemonRunning() {
|
|
8
|
-
const socketPath = getSocketPath();
|
|
9
|
-
if (!existsSync(socketPath)) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
return new Promise((resolve) => {
|
|
13
|
-
const socket = connect(socketPath);
|
|
14
|
-
socket.on('connect', () => {
|
|
15
|
-
socket.write('ping');
|
|
16
|
-
});
|
|
17
|
-
socket.on('data', (data) => {
|
|
18
|
-
const response = data.toString().trim();
|
|
19
|
-
socket.end();
|
|
20
|
-
resolve(response === 'pong');
|
|
21
|
-
});
|
|
22
|
-
socket.on('error', () => {
|
|
23
|
-
resolve(false);
|
|
24
|
-
});
|
|
25
|
-
socket.setTimeout(1000, () => {
|
|
26
|
-
socket.destroy();
|
|
27
|
-
resolve(false);
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
export async function ensureDaemon(configPath) {
|
|
32
|
-
if (await isDaemonRunning()) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// Build command to spawn daemon in background
|
|
36
|
-
// For 'bun run src/index.ts': argv[1] ends with '.ts' or is 'run'
|
|
37
|
-
// For compiled binary: execPath is the binary itself
|
|
38
|
-
let executable;
|
|
39
|
-
let args;
|
|
40
|
-
const isBunRun = process.argv[1] === 'run' || process.argv[1]?.endsWith('.ts');
|
|
41
|
-
if (isBunRun) {
|
|
42
|
-
// Running via 'bun run' or 'bun src/index.ts'
|
|
43
|
-
executable = process.argv[0] ?? 'bun';
|
|
44
|
-
args = process.argv.slice(1, 3).concat(['daemon', '-f']);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
// Compiled binary - use execPath which is the actual binary path
|
|
48
|
-
executable = process.execPath;
|
|
49
|
-
args = ['daemon', '-f'];
|
|
50
|
-
}
|
|
51
|
-
if (configPath) {
|
|
52
|
-
args.push('-c', configPath);
|
|
53
|
-
}
|
|
54
|
-
const child = spawn(executable, args, {
|
|
55
|
-
detached: true,
|
|
56
|
-
stdio: 'ignore',
|
|
57
|
-
env: process.env
|
|
58
|
-
});
|
|
59
|
-
child.unref();
|
|
60
|
-
// Wait for daemon to be ready
|
|
61
|
-
const startTime = Date.now();
|
|
62
|
-
while (Date.now() - startTime < DAEMON_START_TIMEOUT) {
|
|
63
|
-
if (await isDaemonRunning()) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
await sleep(DAEMON_CHECK_INTERVAL);
|
|
67
|
-
}
|
|
68
|
-
throw new Error('Failed to start daemon: timeout');
|
|
69
|
-
}
|
|
70
|
-
export async function shutdownDaemon() {
|
|
71
|
-
const socketPath = getSocketPath();
|
|
72
|
-
if (!existsSync(socketPath)) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
return new Promise((resolve, reject) => {
|
|
76
|
-
const socket = connect(socketPath);
|
|
77
|
-
socket.on('connect', () => {
|
|
78
|
-
socket.write('shutdown');
|
|
79
|
-
});
|
|
80
|
-
socket.on('data', (data) => {
|
|
81
|
-
const response = data.toString().trim();
|
|
82
|
-
socket.end();
|
|
83
|
-
if (response === 'ok') {
|
|
84
|
-
resolve();
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
reject(new Error('Unexpected response'));
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
socket.on('error', (err) => {
|
|
91
|
-
reject(err);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
// === HTTP API Client ===
|
|
96
|
-
function getDaemonUrl(config) {
|
|
97
|
-
const daemon = getDaemonState();
|
|
98
|
-
const port = daemon?.port ?? config.daemon_port;
|
|
99
|
-
return `http://localhost:${port}`;
|
|
100
|
-
}
|
|
101
|
-
export async function apiRequest(config, method, path, body) {
|
|
102
|
-
const url = `${getDaemonUrl(config)}${config.base_path}${path}`;
|
|
103
|
-
const response = await fetch(url, {
|
|
104
|
-
method,
|
|
105
|
-
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
106
|
-
body: body ? JSON.stringify(body) : undefined
|
|
107
|
-
});
|
|
108
|
-
const data = await response.json();
|
|
109
|
-
if (!response.ok) {
|
|
110
|
-
throw new Error(data.error ?? 'Request failed');
|
|
111
|
-
}
|
|
112
|
-
return data;
|
|
113
|
-
}
|
|
114
|
-
export async function getStatus(config) {
|
|
115
|
-
return apiRequest(config, 'GET', '/api/status');
|
|
116
|
-
}
|
|
117
|
-
export async function getSessions(config) {
|
|
118
|
-
return apiRequest(config, 'GET', '/api/sessions');
|
|
119
|
-
}
|
|
120
|
-
export async function startSession(config, request) {
|
|
121
|
-
return apiRequest(config, 'POST', '/api/sessions', request);
|
|
122
|
-
}
|
|
123
|
-
export async function stopSession(config, name) {
|
|
124
|
-
await apiRequest(config, 'DELETE', `/api/sessions/${encodeURIComponent(name)}`);
|
|
125
|
-
}
|
|
126
|
-
export async function requestShutdown(config) {
|
|
127
|
-
try {
|
|
128
|
-
await apiRequest(config, 'POST', '/api/shutdown');
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
// Server will shut down, so connection may be lost
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
function sleep(ms) {
|
|
135
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
136
|
-
}
|
|
1
|
+
// Re-export all from daemon-client
|
|
2
|
+
export { defaultDaemonClientDeps, setDaemonClientDeps, resetDaemonClientDeps, isDaemonRunning, ensureDaemon, shutdownDaemon } from './daemon-client.js';
|
|
3
|
+
// Re-export all from api-client
|
|
4
|
+
export { apiRequest, getStatus, getSessions, startSession, stopSession, requestShutdown } from './api-client.js';
|
|
137
5
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAEL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,gCAAgC;AAChC,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,iBAAiB,CAAC"}
|
package/dist/commands/attach.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
1
|
+
import { execSync, spawn } from 'node:child_process';
|
|
2
2
|
import { getSessions, isDaemonRunning } from '../client/index.js';
|
|
3
3
|
import { loadConfig } from '../config/config.js';
|
|
4
4
|
export async function attachCommand(name, options) {
|
|
@@ -23,7 +23,7 @@ async function interactiveAttach(_options) {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
// Also get tmux sessions directly
|
|
26
|
-
const tmuxSessions =
|
|
26
|
+
const tmuxSessions = getTmuxSessions();
|
|
27
27
|
// Merge session lists (prefer daemon info)
|
|
28
28
|
const allSessions = new Map();
|
|
29
29
|
for (const session of sessions) {
|
|
@@ -81,8 +81,7 @@ async function attachToSession(name) {
|
|
|
81
81
|
process.exit(code ?? 0);
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
const { execSync } = await import('node:child_process');
|
|
84
|
+
function getTmuxSessions() {
|
|
86
85
|
try {
|
|
87
86
|
const output = execSync('tmux list-sessions -F "#{session_name}"', {
|
|
88
87
|
encoding: 'utf-8',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/caddy.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ export interface CaddyOptions {
|
|
|
3
3
|
adminApi?: string;
|
|
4
4
|
config?: string;
|
|
5
5
|
}
|
|
6
|
-
export declare function caddySnippetCommand(options: CaddyOptions): void
|
|
6
|
+
export declare function caddySnippetCommand(options: CaddyOptions): Promise<void>;
|
|
7
7
|
export declare function caddySetupCommand(options: CaddyOptions): Promise<void>;
|
|
8
8
|
export declare function caddyRemoveCommand(options: CaddyOptions): Promise<void>;
|
|
9
|
+
export declare function caddySyncCommand(options: CaddyOptions): Promise<void>;
|
|
9
10
|
export declare function caddyStatusCommand(options: CaddyOptions): Promise<void>;
|
|
10
11
|
//# sourceMappingURL=caddy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caddy.d.ts","sourceRoot":"","sources":["../../src/commands/caddy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caddy.d.ts","sourceRoot":"","sources":["../../src/commands/caddy.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9E;AAGD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C5E;AAqED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC7E;AA+CD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD3E;AA6BD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7E"}
|