@getpaseo/cli 0.1.2
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/bin/paseo +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +150 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent/archive.d.ts +17 -0
- package/dist/commands/agent/archive.d.ts.map +1 -0
- package/dist/commands/agent/archive.js +91 -0
- package/dist/commands/agent/archive.js.map +1 -0
- package/dist/commands/agent/attach.d.ts +10 -0
- package/dist/commands/agent/attach.d.ts.map +1 -0
- package/dist/commands/agent/attach.js +166 -0
- package/dist/commands/agent/attach.js.map +1 -0
- package/dist/commands/agent/index.d.ts +3 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +112 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/inspect.d.ts +14 -0
- package/dist/commands/agent/inspect.d.ts.map +1 -0
- package/dist/commands/agent/inspect.js +185 -0
- package/dist/commands/agent/inspect.js.map +1 -0
- package/dist/commands/agent/logs.d.ts +11 -0
- package/dist/commands/agent/logs.d.ts.map +1 -0
- package/dist/commands/agent/logs.js +207 -0
- package/dist/commands/agent/logs.js.map +1 -0
- package/dist/commands/agent/ls.d.ts +34 -0
- package/dist/commands/agent/ls.d.ts.map +1 -0
- package/dist/commands/agent/ls.js +153 -0
- package/dist/commands/agent/ls.js.map +1 -0
- package/dist/commands/agent/mode.d.ts +18 -0
- package/dist/commands/agent/mode.d.ts.map +1 -0
- package/dist/commands/agent/mode.js +97 -0
- package/dist/commands/agent/mode.js.map +1 -0
- package/dist/commands/agent/run.d.ts +27 -0
- package/dist/commands/agent/run.d.ts.map +1 -0
- package/dist/commands/agent/run.js +146 -0
- package/dist/commands/agent/run.js.map +1 -0
- package/dist/commands/agent/send.d.ts +16 -0
- package/dist/commands/agent/send.d.ts.map +1 -0
- package/dist/commands/agent/send.js +172 -0
- package/dist/commands/agent/send.js.map +1 -0
- package/dist/commands/agent/stop.d.ts +16 -0
- package/dist/commands/agent/stop.d.ts.map +1 -0
- package/dist/commands/agent/stop.js +104 -0
- package/dist/commands/agent/stop.js.map +1 -0
- package/dist/commands/agent/wait.d.ts +16 -0
- package/dist/commands/agent/wait.d.ts.map +1 -0
- package/dist/commands/agent/wait.js +171 -0
- package/dist/commands/agent/wait.js.map +1 -0
- package/dist/commands/daemon/index.d.ts +3 -0
- package/dist/commands/daemon/index.d.ts.map +1 -0
- package/dist/commands/daemon/index.js +41 -0
- package/dist/commands/daemon/index.js.map +1 -0
- package/dist/commands/daemon/local-daemon.d.ts +51 -0
- package/dist/commands/daemon/local-daemon.d.ts.map +1 -0
- package/dist/commands/daemon/local-daemon.js +298 -0
- package/dist/commands/daemon/local-daemon.js.map +1 -0
- package/dist/commands/daemon/pair.d.ts +8 -0
- package/dist/commands/daemon/pair.d.ts.map +1 -0
- package/dist/commands/daemon/pair.js +34 -0
- package/dist/commands/daemon/pair.js.map +1 -0
- package/dist/commands/daemon/restart.d.ts +12 -0
- package/dist/commands/daemon/restart.d.ts.map +1 -0
- package/dist/commands/daemon/restart.js +97 -0
- package/dist/commands/daemon/restart.js.map +1 -0
- package/dist/commands/daemon/start.d.ts +6 -0
- package/dist/commands/daemon/start.d.ts.map +1 -0
- package/dist/commands/daemon/start.js +121 -0
- package/dist/commands/daemon/start.js.map +1 -0
- package/dist/commands/daemon/status.d.ts +10 -0
- package/dist/commands/daemon/status.d.ts.map +1 -0
- package/dist/commands/daemon/status.js +119 -0
- package/dist/commands/daemon/status.js.map +1 -0
- package/dist/commands/daemon/stop.d.ts +12 -0
- package/dist/commands/daemon/stop.d.ts.map +1 -0
- package/dist/commands/daemon/stop.js +56 -0
- package/dist/commands/daemon/stop.js.map +1 -0
- package/dist/commands/permit/allow.d.ts +20 -0
- package/dist/commands/permit/allow.d.ts.map +1 -0
- package/dist/commands/permit/allow.js +133 -0
- package/dist/commands/permit/allow.js.map +1 -0
- package/dist/commands/permit/deny.d.ts +12 -0
- package/dist/commands/permit/deny.d.ts.map +1 -0
- package/dist/commands/permit/deny.js +105 -0
- package/dist/commands/permit/deny.js.map +1 -0
- package/dist/commands/permit/index.d.ts +3 -0
- package/dist/commands/permit/index.d.ts.map +1 -0
- package/dist/commands/permit/index.js +37 -0
- package/dist/commands/permit/index.js.map +1 -0
- package/dist/commands/permit/ls.d.ts +18 -0
- package/dist/commands/permit/ls.d.ts.map +1 -0
- package/dist/commands/permit/ls.js +65 -0
- package/dist/commands/permit/ls.js.map +1 -0
- package/dist/commands/provider/index.d.ts +3 -0
- package/dist/commands/provider/index.d.ts.map +1 -0
- package/dist/commands/provider/index.js +22 -0
- package/dist/commands/provider/index.js.map +1 -0
- package/dist/commands/provider/ls.d.ts +17 -0
- package/dist/commands/provider/ls.d.ts.map +1 -0
- package/dist/commands/provider/ls.js +51 -0
- package/dist/commands/provider/ls.js.map +1 -0
- package/dist/commands/provider/models.d.ts +16 -0
- package/dist/commands/provider/models.d.ts.map +1 -0
- package/dist/commands/provider/models.js +45 -0
- package/dist/commands/provider/models.js.map +1 -0
- package/dist/commands/speech/download.d.ts +14 -0
- package/dist/commands/speech/download.d.ts.map +1 -0
- package/dist/commands/speech/download.js +46 -0
- package/dist/commands/speech/download.js.map +1 -0
- package/dist/commands/speech/index.d.ts +3 -0
- package/dist/commands/speech/index.d.ts.map +1 -0
- package/dist/commands/speech/index.js +25 -0
- package/dist/commands/speech/index.js.map +1 -0
- package/dist/commands/speech/models.d.ts +16 -0
- package/dist/commands/speech/models.d.ts.map +1 -0
- package/dist/commands/speech/models.js +49 -0
- package/dist/commands/speech/models.js.map +1 -0
- package/dist/commands/worktree/archive.d.ts +16 -0
- package/dist/commands/worktree/archive.d.ts.map +1 -0
- package/dist/commands/worktree/archive.js +98 -0
- package/dist/commands/worktree/archive.js.map +1 -0
- package/dist/commands/worktree/index.d.ts +3 -0
- package/dist/commands/worktree/index.d.ts.map +1 -0
- package/dist/commands/worktree/index.js +22 -0
- package/dist/commands/worktree/index.js.map +1 -0
- package/dist/commands/worktree/ls.d.ts +17 -0
- package/dist/commands/worktree/ls.d.ts.map +1 -0
- package/dist/commands/worktree/ls.js +89 -0
- package/dist/commands/worktree/ls.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/output/index.d.ts +45 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +47 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/json.d.ts +11 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +37 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/quiet.d.ts +9 -0
- package/dist/output/quiet.d.ts.map +1 -0
- package/dist/output/quiet.js +22 -0
- package/dist/output/quiet.js.map +1 -0
- package/dist/output/render.d.ts +15 -0
- package/dist/output/render.d.ts.map +1 -0
- package/dist/output/render.js +80 -0
- package/dist/output/render.js.map +1 -0
- package/dist/output/table.d.ts +13 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +135 -0
- package/dist/output/table.js.map +1 -0
- package/dist/output/types.d.ts +71 -0
- package/dist/output/types.d.ts.map +1 -0
- package/dist/output/types.js +8 -0
- package/dist/output/types.js.map +1 -0
- package/dist/output/with-output.d.ts +37 -0
- package/dist/output/with-output.d.ts.map +1 -0
- package/dist/output/with-output.js +78 -0
- package/dist/output/with-output.js.map +1 -0
- package/dist/output/yaml.d.ts +11 -0
- package/dist/output/yaml.d.ts.map +1 -0
- package/dist/output/yaml.js +38 -0
- package/dist/output/yaml.js.map +1 -0
- package/dist/utils/client.d.ts +35 -0
- package/dist/utils/client.d.ts.map +1 -0
- package/dist/utils/client.js +110 -0
- package/dist/utils/client.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
/** Schema for agent wait output */
|
|
3
|
+
export const agentWaitSchema = {
|
|
4
|
+
idField: 'agentId',
|
|
5
|
+
columns: [
|
|
6
|
+
{ header: 'AGENT ID', field: 'agentId', width: 12 },
|
|
7
|
+
{ header: 'STATUS', field: 'status', width: 12 },
|
|
8
|
+
{ header: 'MESSAGE', field: 'message', width: 40 },
|
|
9
|
+
],
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Parse duration string to milliseconds.
|
|
13
|
+
* Supports formats like: 5m, 30s, 1h, 2h30m, 90, etc.
|
|
14
|
+
* If no unit is specified, assumes seconds.
|
|
15
|
+
*/
|
|
16
|
+
function parseDuration(input) {
|
|
17
|
+
const trimmed = input.trim();
|
|
18
|
+
// If it's just a number, treat as seconds
|
|
19
|
+
if (/^\d+$/.test(trimmed)) {
|
|
20
|
+
return parseInt(trimmed, 10) * 1000;
|
|
21
|
+
}
|
|
22
|
+
// Parse duration with units
|
|
23
|
+
let totalMs = 0;
|
|
24
|
+
const regex = /(\d+)([smh])/g;
|
|
25
|
+
let match;
|
|
26
|
+
let hasMatch = false;
|
|
27
|
+
while ((match = regex.exec(trimmed)) !== null) {
|
|
28
|
+
hasMatch = true;
|
|
29
|
+
const value = parseInt(match[1], 10);
|
|
30
|
+
const unit = match[2];
|
|
31
|
+
switch (unit) {
|
|
32
|
+
case 's':
|
|
33
|
+
totalMs += value * 1000;
|
|
34
|
+
break;
|
|
35
|
+
case 'm':
|
|
36
|
+
totalMs += value * 60 * 1000;
|
|
37
|
+
break;
|
|
38
|
+
case 'h':
|
|
39
|
+
totalMs += value * 60 * 60 * 1000;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!hasMatch) {
|
|
44
|
+
throw new Error(`Invalid duration format: ${input}. Use formats like: 5m, 30s, 1h, 2h30m`);
|
|
45
|
+
}
|
|
46
|
+
return totalMs;
|
|
47
|
+
}
|
|
48
|
+
export async function runWaitCommand(agentIdArg, options, _command) {
|
|
49
|
+
const host = getDaemonHost({ host: options.host });
|
|
50
|
+
// Validate arguments
|
|
51
|
+
if (!agentIdArg || agentIdArg.trim().length === 0) {
|
|
52
|
+
const error = {
|
|
53
|
+
code: 'MISSING_AGENT_ID',
|
|
54
|
+
message: 'Agent ID is required',
|
|
55
|
+
details: 'Usage: paseo agent wait <id>',
|
|
56
|
+
};
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
// Parse timeout (default 10 minutes)
|
|
60
|
+
let timeoutMs;
|
|
61
|
+
if (options.timeout) {
|
|
62
|
+
try {
|
|
63
|
+
timeoutMs = parseDuration(options.timeout);
|
|
64
|
+
if (timeoutMs <= 0) {
|
|
65
|
+
throw new Error('Timeout must be positive');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
70
|
+
const error = {
|
|
71
|
+
code: 'INVALID_TIMEOUT',
|
|
72
|
+
message: 'Invalid timeout value',
|
|
73
|
+
details: message,
|
|
74
|
+
};
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
timeoutMs = 10 * 60 * 1000; // default 10 minutes
|
|
80
|
+
}
|
|
81
|
+
const timeoutSeconds = Math.floor(timeoutMs / 1000);
|
|
82
|
+
let client;
|
|
83
|
+
try {
|
|
84
|
+
client = await connectToDaemon({ host: options.host });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
88
|
+
const error = {
|
|
89
|
+
code: 'DAEMON_NOT_RUNNING',
|
|
90
|
+
message: `Cannot connect to daemon at ${host}: ${message}`,
|
|
91
|
+
details: 'Start the daemon with: paseo daemon start',
|
|
92
|
+
};
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
try {
|
|
97
|
+
const state = await client.waitForFinish(agentIdArg, timeoutMs);
|
|
98
|
+
await client.close();
|
|
99
|
+
if (state.status === 'timeout') {
|
|
100
|
+
return {
|
|
101
|
+
type: 'single',
|
|
102
|
+
data: {
|
|
103
|
+
agentId: agentIdArg,
|
|
104
|
+
status: 'timeout',
|
|
105
|
+
message: `Timed out waiting for agent after ${timeoutSeconds} seconds`,
|
|
106
|
+
},
|
|
107
|
+
schema: agentWaitSchema,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (state.status === 'permission') {
|
|
111
|
+
const permission = state.final?.pendingPermissions?.[0];
|
|
112
|
+
return {
|
|
113
|
+
type: 'single',
|
|
114
|
+
data: {
|
|
115
|
+
agentId: state.final?.id ?? agentIdArg,
|
|
116
|
+
status: 'permission',
|
|
117
|
+
message: permission
|
|
118
|
+
? `Agent is waiting for permission: ${permission.kind}`
|
|
119
|
+
: 'Agent is waiting for permission',
|
|
120
|
+
},
|
|
121
|
+
schema: agentWaitSchema,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (state.status === 'error') {
|
|
125
|
+
return {
|
|
126
|
+
type: 'single',
|
|
127
|
+
data: {
|
|
128
|
+
agentId: state.final?.id ?? agentIdArg,
|
|
129
|
+
status: 'error',
|
|
130
|
+
message: state.error ?? 'Agent finished with error',
|
|
131
|
+
},
|
|
132
|
+
schema: agentWaitSchema,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Agent is idle
|
|
136
|
+
return {
|
|
137
|
+
type: 'single',
|
|
138
|
+
data: {
|
|
139
|
+
agentId: state.final?.id ?? agentIdArg,
|
|
140
|
+
status: 'idle',
|
|
141
|
+
message: 'Agent is now idle',
|
|
142
|
+
},
|
|
143
|
+
schema: agentWaitSchema,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (waitErr) {
|
|
147
|
+
await client.close().catch(() => { });
|
|
148
|
+
const waitMessage = waitErr instanceof Error ? waitErr.message : String(waitErr);
|
|
149
|
+
// Other errors
|
|
150
|
+
const error = {
|
|
151
|
+
code: 'WAIT_FAILED',
|
|
152
|
+
message: `Failed to wait for agent: ${waitMessage}`,
|
|
153
|
+
};
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
await client.close().catch(() => { });
|
|
159
|
+
// Re-throw CommandError as-is
|
|
160
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
161
|
+
throw err;
|
|
162
|
+
}
|
|
163
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
164
|
+
const error = {
|
|
165
|
+
code: 'WAIT_FAILED',
|
|
166
|
+
message: `Failed to wait for agent: ${message}`,
|
|
167
|
+
};
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/commands/agent/wait.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,mBAAmB,IAAI,OAAO,CAwC7C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { startCommand } from './start.js';
|
|
3
|
+
import { runStatusCommand } from './status.js';
|
|
4
|
+
import { runStopCommand } from './stop.js';
|
|
5
|
+
import { runRestartCommand } from './restart.js';
|
|
6
|
+
import { pairCommand } from './pair.js';
|
|
7
|
+
import { withOutput } from '../../output/index.js';
|
|
8
|
+
export function createDaemonCommand() {
|
|
9
|
+
const daemon = new Command('daemon').description('Manage the Paseo daemon');
|
|
10
|
+
daemon.addCommand(startCommand());
|
|
11
|
+
daemon.addCommand(pairCommand());
|
|
12
|
+
daemon
|
|
13
|
+
.command('status')
|
|
14
|
+
.description('Show local daemon status')
|
|
15
|
+
.option('--json', 'Output in JSON format')
|
|
16
|
+
.option('--home <path>', 'Paseo home directory (default: ~/.paseo)')
|
|
17
|
+
.action(withOutput(runStatusCommand));
|
|
18
|
+
daemon
|
|
19
|
+
.command('stop')
|
|
20
|
+
.description('Stop the local daemon')
|
|
21
|
+
.option('--json', 'Output in JSON format')
|
|
22
|
+
.option('--home <path>', 'Paseo home directory (default: ~/.paseo)')
|
|
23
|
+
.option('--timeout <seconds>', 'Wait timeout before failing (default: 15)')
|
|
24
|
+
.option('--force', 'Send SIGKILL if graceful stop times out')
|
|
25
|
+
.action(withOutput(runStopCommand));
|
|
26
|
+
daemon
|
|
27
|
+
.command('restart')
|
|
28
|
+
.description('Restart the local daemon')
|
|
29
|
+
.option('--json', 'Output in JSON format')
|
|
30
|
+
.option('--home <path>', 'Paseo home directory (default: ~/.paseo)')
|
|
31
|
+
.option('--timeout <seconds>', 'Wait timeout before force step (default: 15)')
|
|
32
|
+
.option('--force', 'Send SIGKILL if graceful stop times out')
|
|
33
|
+
.option('--listen <listen>', 'Listen target for restarted daemon (host:port, port, or unix socket)')
|
|
34
|
+
.option('--port <port>', 'Port for restarted daemon listen target')
|
|
35
|
+
.option('--no-relay', 'Disable relay on restarted daemon')
|
|
36
|
+
.option('--no-mcp', 'Disable Agent MCP on restarted daemon')
|
|
37
|
+
.option('--allowed-hosts <hosts>', 'Comma-separated Host allowlist values (example: "localhost,.example.com" or "true")')
|
|
38
|
+
.action(withOutput(runRestartCommand));
|
|
39
|
+
return daemon;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAA;IAE3E,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;IAEhC,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAEvC,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;SAC1E,MAAM,CAAC,SAAS,EAAE,yCAAyC,CAAC;SAC5D,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAA;IAErC,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC;SAC7E,MAAM,CAAC,SAAS,EAAE,yCAAyC,CAAC;SAC5D,MAAM,CAAC,mBAAmB,EAAE,sEAAsE,CAAC;SACnG,MAAM,CAAC,eAAe,EAAE,yCAAyC,CAAC;SAClE,MAAM,CAAC,YAAY,EAAE,mCAAmC,CAAC;SACzD,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;SAC3D,MAAM,CACL,yBAAyB,EACzB,qFAAqF,CACtF;SACA,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAExC,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface DaemonStartOptions {
|
|
2
|
+
port?: string;
|
|
3
|
+
listen?: string;
|
|
4
|
+
home?: string;
|
|
5
|
+
foreground?: boolean;
|
|
6
|
+
relay?: boolean;
|
|
7
|
+
mcp?: boolean;
|
|
8
|
+
allowedHosts?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LocalDaemonPidInfo {
|
|
11
|
+
pid: number;
|
|
12
|
+
startedAt?: string;
|
|
13
|
+
hostname?: string;
|
|
14
|
+
uid?: number;
|
|
15
|
+
sockPath?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface LocalDaemonState {
|
|
18
|
+
home: string;
|
|
19
|
+
listen: string;
|
|
20
|
+
logPath: string;
|
|
21
|
+
pidPath: string;
|
|
22
|
+
pidInfo: LocalDaemonPidInfo | null;
|
|
23
|
+
running: boolean;
|
|
24
|
+
stalePidFile: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface DetachedStartResult {
|
|
27
|
+
pid: number | null;
|
|
28
|
+
logPath: string;
|
|
29
|
+
}
|
|
30
|
+
export interface StopLocalDaemonOptions {
|
|
31
|
+
home?: string;
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
force?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface StopLocalDaemonResult {
|
|
36
|
+
action: 'stopped' | 'not_running';
|
|
37
|
+
home: string;
|
|
38
|
+
pid: number | null;
|
|
39
|
+
forced: boolean;
|
|
40
|
+
message: string;
|
|
41
|
+
}
|
|
42
|
+
export declare const DEFAULT_STOP_TIMEOUT_MS = 15000;
|
|
43
|
+
export declare function resolveLocalPaseoHome(home?: string): string;
|
|
44
|
+
export declare function resolveTcpHostFromListen(listen: string): string | null;
|
|
45
|
+
export declare function resolveLocalDaemonState(options?: {
|
|
46
|
+
home?: string;
|
|
47
|
+
}): LocalDaemonState;
|
|
48
|
+
export declare function tailDaemonLog(home?: string, lines?: number): string | null;
|
|
49
|
+
export declare function startLocalDaemonDetached(options: DaemonStartOptions): Promise<DetachedStartResult>;
|
|
50
|
+
export declare function stopLocalDaemon(options?: StopLocalDaemonOptions): Promise<StopLocalDaemonResult>;
|
|
51
|
+
//# sourceMappingURL=local-daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-daemon.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/local-daemon.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAkBD,eAAO,MAAM,uBAAuB,QAAS,CAAA;AA6I7C,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBtE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,gBAAgB,CAwBzF;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAgF9B;AAED,wBAAsB,eAAe,CACnC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CA0DhC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { closeSync, existsSync, openSync, readFileSync, rmSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { loadConfig, resolvePaseoHome } from '@getpaseo/server';
|
|
6
|
+
const DETACHED_STARTUP_GRACE_MS = 1200;
|
|
7
|
+
const PID_POLL_INTERVAL_MS = 100;
|
|
8
|
+
const KILL_TIMEOUT_MS = 3000;
|
|
9
|
+
const DAEMON_LOG_FILENAME = 'daemon.log';
|
|
10
|
+
const DAEMON_PID_FILENAME = 'paseo.pid';
|
|
11
|
+
export const DEFAULT_STOP_TIMEOUT_MS = 15000;
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const startupReady = () => ({ exitedEarly: false });
|
|
14
|
+
const startupExited = (details) => ({
|
|
15
|
+
exitedEarly: true,
|
|
16
|
+
...details,
|
|
17
|
+
});
|
|
18
|
+
function envWithHome(home) {
|
|
19
|
+
if (!home) {
|
|
20
|
+
return process.env;
|
|
21
|
+
}
|
|
22
|
+
return { ...process.env, PASEO_HOME: home };
|
|
23
|
+
}
|
|
24
|
+
function buildRunnerArgs(options) {
|
|
25
|
+
const args = [];
|
|
26
|
+
if (options.relay === false) {
|
|
27
|
+
args.push('--no-relay');
|
|
28
|
+
}
|
|
29
|
+
if (options.mcp === false) {
|
|
30
|
+
args.push('--no-mcp');
|
|
31
|
+
}
|
|
32
|
+
return args;
|
|
33
|
+
}
|
|
34
|
+
function resolveDaemonRunnerEntry() {
|
|
35
|
+
const serverExportPath = require.resolve('@getpaseo/server');
|
|
36
|
+
let currentDir = path.dirname(serverExportPath);
|
|
37
|
+
while (true) {
|
|
38
|
+
const packageJsonPath = path.join(currentDir, 'package.json');
|
|
39
|
+
if (existsSync(packageJsonPath)) {
|
|
40
|
+
try {
|
|
41
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
42
|
+
if (packageJson.name === '@getpaseo/server') {
|
|
43
|
+
const distRunner = path.join(currentDir, 'dist', 'scripts', 'daemon-runner.js');
|
|
44
|
+
if (existsSync(distRunner)) {
|
|
45
|
+
return distRunner;
|
|
46
|
+
}
|
|
47
|
+
return path.join(currentDir, 'scripts', 'daemon-runner.ts');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Continue searching up if package.json exists but is invalid.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const parentDir = path.dirname(currentDir);
|
|
55
|
+
if (parentDir === currentDir) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
currentDir = parentDir;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('Unable to resolve @getpaseo/server package root for daemon runner');
|
|
61
|
+
}
|
|
62
|
+
function pidFilePath(paseoHome) {
|
|
63
|
+
return path.join(paseoHome, DAEMON_PID_FILENAME);
|
|
64
|
+
}
|
|
65
|
+
function readPidFile(pidPath) {
|
|
66
|
+
try {
|
|
67
|
+
const parsed = JSON.parse(readFileSync(pidPath, 'utf-8'));
|
|
68
|
+
const pidValue = parsed.pid;
|
|
69
|
+
if (typeof pidValue !== 'number' || !Number.isInteger(pidValue) || pidValue <= 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
pid: pidValue,
|
|
74
|
+
startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : undefined,
|
|
75
|
+
hostname: typeof parsed.hostname === 'string' ? parsed.hostname : undefined,
|
|
76
|
+
uid: typeof parsed.uid === 'number' ? parsed.uid : undefined,
|
|
77
|
+
sockPath: typeof parsed.sockPath === 'string' ? parsed.sockPath : undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function tailFile(filePath, lines = 30) {
|
|
85
|
+
try {
|
|
86
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
87
|
+
return content.split('\n').filter(Boolean).slice(-lines).join('\n');
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function sleep(ms) {
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
setTimeout(resolve, ms);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function isProcessRunning(pid) {
|
|
99
|
+
try {
|
|
100
|
+
process.kill(pid, 0);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
const code = typeof err === 'object' && err && 'code' in err ? err.code : undefined;
|
|
105
|
+
if (code === 'EPERM') {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function signalProcess(pid, signal) {
|
|
112
|
+
try {
|
|
113
|
+
process.kill(pid, signal);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const code = typeof err === 'object' && err && 'code' in err ? err.code : undefined;
|
|
118
|
+
if (code === 'ESRCH') {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function waitForExit(pid, timeoutMs) {
|
|
125
|
+
const deadline = Date.now() + timeoutMs;
|
|
126
|
+
while (Date.now() < deadline) {
|
|
127
|
+
if (!isProcessRunning(pid)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
await sleep(PID_POLL_INTERVAL_MS);
|
|
131
|
+
}
|
|
132
|
+
return !isProcessRunning(pid);
|
|
133
|
+
}
|
|
134
|
+
export function resolveLocalPaseoHome(home) {
|
|
135
|
+
return resolvePaseoHome(envWithHome(home));
|
|
136
|
+
}
|
|
137
|
+
export function resolveTcpHostFromListen(listen) {
|
|
138
|
+
const normalized = listen.trim();
|
|
139
|
+
if (!normalized) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
if (normalized.startsWith('/') || normalized.startsWith('unix://')) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
if (/^\d+$/.test(normalized)) {
|
|
146
|
+
return `127.0.0.1:${normalized}`;
|
|
147
|
+
}
|
|
148
|
+
if (normalized.includes(':')) {
|
|
149
|
+
return normalized;
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
export function resolveLocalDaemonState(options = {}) {
|
|
154
|
+
const env = {
|
|
155
|
+
...envWithHome(options.home),
|
|
156
|
+
// Status should reflect local persisted config + pid file, not inherited daemon env overrides.
|
|
157
|
+
PASEO_LISTEN: undefined,
|
|
158
|
+
PASEO_ALLOWED_HOSTS: undefined,
|
|
159
|
+
};
|
|
160
|
+
const home = resolvePaseoHome(env);
|
|
161
|
+
const config = loadConfig(home, { env });
|
|
162
|
+
const pidPath = pidFilePath(home);
|
|
163
|
+
const logPath = path.join(home, DAEMON_LOG_FILENAME);
|
|
164
|
+
const pidInfo = existsSync(pidPath) ? readPidFile(pidPath) : null;
|
|
165
|
+
const running = pidInfo ? isProcessRunning(pidInfo.pid) : false;
|
|
166
|
+
const listen = pidInfo?.sockPath ?? config.listen;
|
|
167
|
+
return {
|
|
168
|
+
home,
|
|
169
|
+
listen,
|
|
170
|
+
logPath,
|
|
171
|
+
pidPath,
|
|
172
|
+
pidInfo,
|
|
173
|
+
running,
|
|
174
|
+
stalePidFile: Boolean(pidInfo) && !running,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function tailDaemonLog(home, lines = 30) {
|
|
178
|
+
const logPath = path.join(resolveLocalPaseoHome(home), DAEMON_LOG_FILENAME);
|
|
179
|
+
return tailFile(logPath, lines);
|
|
180
|
+
}
|
|
181
|
+
export async function startLocalDaemonDetached(options) {
|
|
182
|
+
if (options.listen && options.port) {
|
|
183
|
+
throw new Error('Cannot use --listen and --port together');
|
|
184
|
+
}
|
|
185
|
+
const childEnv = { ...process.env };
|
|
186
|
+
if (options.home) {
|
|
187
|
+
childEnv.PASEO_HOME = options.home;
|
|
188
|
+
}
|
|
189
|
+
if (options.listen) {
|
|
190
|
+
childEnv.PASEO_LISTEN = options.listen;
|
|
191
|
+
}
|
|
192
|
+
else if (options.port) {
|
|
193
|
+
childEnv.PASEO_LISTEN = `127.0.0.1:${options.port}`;
|
|
194
|
+
}
|
|
195
|
+
if (options.allowedHosts) {
|
|
196
|
+
childEnv.PASEO_ALLOWED_HOSTS = options.allowedHosts;
|
|
197
|
+
}
|
|
198
|
+
const paseoHome = resolvePaseoHome(childEnv);
|
|
199
|
+
const logPath = path.join(paseoHome, DAEMON_LOG_FILENAME);
|
|
200
|
+
const daemonRunnerEntry = resolveDaemonRunnerEntry();
|
|
201
|
+
const logFd = openSync(logPath, 'a');
|
|
202
|
+
try {
|
|
203
|
+
const child = spawn(process.execPath, [...process.execArgv, daemonRunnerEntry, ...buildRunnerArgs(options)], {
|
|
204
|
+
detached: true,
|
|
205
|
+
env: childEnv,
|
|
206
|
+
stdio: ['ignore', logFd, logFd],
|
|
207
|
+
});
|
|
208
|
+
child.unref();
|
|
209
|
+
const startup = await new Promise((resolve) => {
|
|
210
|
+
let settled = false;
|
|
211
|
+
const finish = (value) => {
|
|
212
|
+
if (settled)
|
|
213
|
+
return;
|
|
214
|
+
settled = true;
|
|
215
|
+
resolve(value);
|
|
216
|
+
};
|
|
217
|
+
const timer = setTimeout(() => finish(startupReady()), DETACHED_STARTUP_GRACE_MS);
|
|
218
|
+
child.once('error', (error) => {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
finish(startupExited({ code: null, signal: null, error }));
|
|
221
|
+
});
|
|
222
|
+
child.once('exit', (code, signal) => {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
finish(startupExited({ code, signal }));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
if (startup.exitedEarly) {
|
|
228
|
+
const reason = startup.error
|
|
229
|
+
? startup.error.message
|
|
230
|
+
: `exit code ${startup.code ?? 'unknown'}${startup.signal ? ` (${startup.signal})` : ''}`;
|
|
231
|
+
const recentLogs = tailFile(logPath);
|
|
232
|
+
throw new Error([
|
|
233
|
+
`Daemon failed to start in background (${reason}).`,
|
|
234
|
+
recentLogs ? `Recent daemon logs:\n${recentLogs}` : null,
|
|
235
|
+
]
|
|
236
|
+
.filter(Boolean)
|
|
237
|
+
.join('\n\n'));
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
pid: child.pid ?? null,
|
|
241
|
+
logPath,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
closeSync(logFd);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
export async function stopLocalDaemon(options = {}) {
|
|
249
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_STOP_TIMEOUT_MS;
|
|
250
|
+
const state = resolveLocalDaemonState({ home: options.home });
|
|
251
|
+
if (!state.pidInfo || !state.running) {
|
|
252
|
+
const staleSuffix = state.stalePidFile && state.pidInfo
|
|
253
|
+
? ` (stale PID file for ${state.pidInfo.pid})`
|
|
254
|
+
: '';
|
|
255
|
+
return {
|
|
256
|
+
action: 'not_running',
|
|
257
|
+
home: state.home,
|
|
258
|
+
pid: state.pidInfo?.pid ?? null,
|
|
259
|
+
forced: false,
|
|
260
|
+
message: `Daemon is not running${staleSuffix}`,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const pid = state.pidInfo.pid;
|
|
264
|
+
const signaled = signalProcess(pid, 'SIGTERM');
|
|
265
|
+
if (!signaled) {
|
|
266
|
+
return {
|
|
267
|
+
action: 'not_running',
|
|
268
|
+
home: state.home,
|
|
269
|
+
pid,
|
|
270
|
+
forced: false,
|
|
271
|
+
message: 'Daemon process was already stopped',
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
let forced = false;
|
|
275
|
+
let stopped = await waitForExit(pid, timeoutMs);
|
|
276
|
+
if (!stopped && options.force) {
|
|
277
|
+
forced = true;
|
|
278
|
+
const killSent = signalProcess(pid, 'SIGKILL');
|
|
279
|
+
if (killSent) {
|
|
280
|
+
stopped = await waitForExit(pid, KILL_TIMEOUT_MS);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
stopped = true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (!stopped) {
|
|
287
|
+
throw new Error(`Timed out waiting for daemon PID ${pid} to stop after ${Math.ceil(timeoutMs / 1000)}s`);
|
|
288
|
+
}
|
|
289
|
+
rmSync(state.pidPath, { force: true });
|
|
290
|
+
return {
|
|
291
|
+
action: 'stopped',
|
|
292
|
+
home: state.home,
|
|
293
|
+
pid,
|
|
294
|
+
forced,
|
|
295
|
+
message: forced ? 'Daemon was force-stopped' : 'Daemon stopped gracefully',
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=local-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-daemon.js","sourceRoot":"","sources":["../../../src/commands/daemon/local-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,WAAW,IAAI,OAAO,CAOrC;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBxE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { generateLocalPairingOffer, loadConfig, resolvePaseoHome } from '@getpaseo/server';
|
|
4
|
+
export function pairCommand() {
|
|
5
|
+
return new Command('pair')
|
|
6
|
+
.description('Print the daemon pairing QR code and link')
|
|
7
|
+
.option('--home <path>', 'Paseo home directory (default: ~/.paseo)')
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
await runPairCommand(options);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export async function runPairCommand(options) {
|
|
13
|
+
if (options.home) {
|
|
14
|
+
process.env.PASEO_HOME = options.home;
|
|
15
|
+
}
|
|
16
|
+
const paseoHome = resolvePaseoHome();
|
|
17
|
+
const config = loadConfig(paseoHome);
|
|
18
|
+
const pairing = await generateLocalPairingOffer({
|
|
19
|
+
paseoHome,
|
|
20
|
+
relayEnabled: config.relayEnabled,
|
|
21
|
+
relayEndpoint: config.relayEndpoint,
|
|
22
|
+
relayPublicEndpoint: config.relayPublicEndpoint,
|
|
23
|
+
appBaseUrl: config.appBaseUrl,
|
|
24
|
+
includeQr: true,
|
|
25
|
+
});
|
|
26
|
+
if (!pairing.relayEnabled || !pairing.url) {
|
|
27
|
+
console.error(chalk.red('Relay pairing is disabled for this daemon config.'));
|
|
28
|
+
console.error(chalk.yellow('Enable relay and run this command again.'));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const qrBlock = pairing.qr ? `${pairing.qr}\n` : '';
|
|
32
|
+
process.stdout.write(`\nScan to pair:\n${qrBlock}${pairing.url}\n`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../../src/commands/daemon/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAM1F,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACrC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAoB;IACvD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAA;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC;QAC9C,SAAS;QACT,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAA;QAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AACrE,CAAC"}
|