@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,12 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, SingleResult } from '../../output/index.js';
|
|
3
|
+
interface RestartResult {
|
|
4
|
+
action: 'restarted';
|
|
5
|
+
home: string;
|
|
6
|
+
pid: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export type RestartCommandResult = SingleResult<RestartResult>;
|
|
10
|
+
export declare function runRestartCommand(options: CommandOptions, _command: Command): Promise<RestartCommandResult>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=restart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/restart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOxC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAA8B,MAAM,uBAAuB,CAAA;AAErG,UAAU,aAAa;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAgBD,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAA;AAyC9D,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAgD/B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { startLocalDaemonDetached, stopLocalDaemon, DEFAULT_STOP_TIMEOUT_MS, } from './local-daemon.js';
|
|
2
|
+
const restartResultSchema = {
|
|
3
|
+
idField: 'action',
|
|
4
|
+
columns: [
|
|
5
|
+
{
|
|
6
|
+
header: 'STATUS',
|
|
7
|
+
field: 'action',
|
|
8
|
+
color: () => 'green',
|
|
9
|
+
},
|
|
10
|
+
{ header: 'HOME', field: 'home' },
|
|
11
|
+
{ header: 'PID', field: 'pid' },
|
|
12
|
+
{ header: 'MESSAGE', field: 'message' },
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
function parseTimeoutMs(raw) {
|
|
16
|
+
if (typeof raw !== 'string' || raw.trim().length === 0) {
|
|
17
|
+
return DEFAULT_STOP_TIMEOUT_MS;
|
|
18
|
+
}
|
|
19
|
+
const seconds = Number(raw);
|
|
20
|
+
if (!Number.isFinite(seconds) || seconds <= 0) {
|
|
21
|
+
const error = {
|
|
22
|
+
code: 'INVALID_TIMEOUT',
|
|
23
|
+
message: `Invalid timeout value: ${raw}`,
|
|
24
|
+
details: 'Timeout must be a positive number of seconds',
|
|
25
|
+
};
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return Math.ceil(seconds * 1000);
|
|
29
|
+
}
|
|
30
|
+
function toStartOptions(options) {
|
|
31
|
+
const startOptions = {
|
|
32
|
+
home: typeof options.home === 'string' ? options.home : undefined,
|
|
33
|
+
listen: typeof options.listen === 'string' ? options.listen : undefined,
|
|
34
|
+
port: typeof options.port === 'string' ? options.port : undefined,
|
|
35
|
+
relay: typeof options.relay === 'boolean' ? options.relay : undefined,
|
|
36
|
+
mcp: typeof options.mcp === 'boolean' ? options.mcp : undefined,
|
|
37
|
+
allowedHosts: typeof options.allowedHosts === 'string' ? options.allowedHosts : undefined,
|
|
38
|
+
};
|
|
39
|
+
if (startOptions.listen && startOptions.port) {
|
|
40
|
+
const error = {
|
|
41
|
+
code: 'INVALID_OPTIONS',
|
|
42
|
+
message: 'Cannot use --listen and --port together',
|
|
43
|
+
};
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
return startOptions;
|
|
47
|
+
}
|
|
48
|
+
export async function runRestartCommand(options, _command) {
|
|
49
|
+
const timeoutMs = parseTimeoutMs(options.timeout);
|
|
50
|
+
const force = options.force === true;
|
|
51
|
+
const startOptions = toStartOptions(options);
|
|
52
|
+
try {
|
|
53
|
+
let stopResult;
|
|
54
|
+
try {
|
|
55
|
+
stopResult = await stopLocalDaemon({
|
|
56
|
+
home: startOptions.home,
|
|
57
|
+
timeoutMs,
|
|
58
|
+
force,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const isTimeout = err instanceof Error && err.message.includes('Timed out waiting for daemon PID');
|
|
63
|
+
if (!force && isTimeout) {
|
|
64
|
+
stopResult = await stopLocalDaemon({
|
|
65
|
+
home: startOptions.home,
|
|
66
|
+
timeoutMs,
|
|
67
|
+
force: true,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const startup = await startLocalDaemonDetached(startOptions);
|
|
75
|
+
const before = stopResult.pid === null ? 'not running' : `PID ${stopResult.pid}`;
|
|
76
|
+
const after = startup.pid === null ? 'unknown PID' : `PID ${startup.pid}`;
|
|
77
|
+
return {
|
|
78
|
+
type: 'single',
|
|
79
|
+
data: {
|
|
80
|
+
action: 'restarted',
|
|
81
|
+
home: stopResult.home,
|
|
82
|
+
pid: startup.pid === null ? '-' : String(startup.pid),
|
|
83
|
+
message: `Local daemon restarted (${before} -> ${after})`,
|
|
84
|
+
},
|
|
85
|
+
schema: restartResultSchema,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
90
|
+
const error = {
|
|
91
|
+
code: 'RESTART_FAILED',
|
|
92
|
+
message: `Failed to restart local daemon: ${message}`,
|
|
93
|
+
};
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/daemon/restart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type DaemonStartOptions as StartOptions } from './local-daemon.js';
|
|
3
|
+
export type { DaemonStartOptions as StartOptions } from './local-daemon.js';
|
|
4
|
+
export declare function startCommand(): Command;
|
|
5
|
+
export declare function runStart(options: StartOptions): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,OAAO,EAEL,KAAK,kBAAkB,IAAI,YAAY,EACxC,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE3E,wBAAgB,YAAY,IAAI,OAAO,CAgBtC;AA8BD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFnE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { createPaseoDaemon, loadConfig, resolvePaseoHome, createRootLogger, loadPersistedConfig, } from '@getpaseo/server';
|
|
4
|
+
import { startLocalDaemonDetached, } from './local-daemon.js';
|
|
5
|
+
export function startCommand() {
|
|
6
|
+
return new Command('start')
|
|
7
|
+
.description('Start the local Paseo daemon')
|
|
8
|
+
.option('--listen <listen>', 'Listen target (host:port, port, or unix socket path)')
|
|
9
|
+
.option('--port <port>', 'Port to listen on (default: 6767)')
|
|
10
|
+
.option('--home <path>', 'Paseo home directory (default: ~/.paseo)')
|
|
11
|
+
.option('--foreground', 'Run in foreground (don\'t daemonize)')
|
|
12
|
+
.option('--no-relay', 'Disable relay connection')
|
|
13
|
+
.option('--no-mcp', 'Disable the Agent MCP HTTP endpoint')
|
|
14
|
+
.option('--allowed-hosts <hosts>', 'Comma-separated Host allowlist values (example: "localhost,.example.com" or "true")')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
await runStart(options);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function toCliOverrides(options) {
|
|
20
|
+
const cliOverrides = {};
|
|
21
|
+
if (options.listen) {
|
|
22
|
+
cliOverrides.listen = options.listen;
|
|
23
|
+
}
|
|
24
|
+
else if (options.port) {
|
|
25
|
+
cliOverrides.listen = `127.0.0.1:${options.port}`;
|
|
26
|
+
}
|
|
27
|
+
if (options.relay === false) {
|
|
28
|
+
cliOverrides.relayEnabled = false;
|
|
29
|
+
}
|
|
30
|
+
if (options.allowedHosts) {
|
|
31
|
+
const raw = options.allowedHosts.trim();
|
|
32
|
+
cliOverrides.allowedHosts =
|
|
33
|
+
raw.toLowerCase() === 'true'
|
|
34
|
+
? true
|
|
35
|
+
: raw.split(',').map(h => h.trim()).filter(Boolean);
|
|
36
|
+
}
|
|
37
|
+
if (options.mcp === false) {
|
|
38
|
+
cliOverrides.mcpEnabled = false;
|
|
39
|
+
}
|
|
40
|
+
return cliOverrides;
|
|
41
|
+
}
|
|
42
|
+
export async function runStart(options) {
|
|
43
|
+
if (options.listen && options.port) {
|
|
44
|
+
console.error(chalk.red('Cannot use --listen and --port together'));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
if (!options.foreground) {
|
|
48
|
+
try {
|
|
49
|
+
const startup = await startLocalDaemonDetached(options);
|
|
50
|
+
console.log(chalk.green(`Daemon starting in background (PID ${startup.pid ?? 'unknown'}).`));
|
|
51
|
+
console.log(chalk.dim(`Logs: ${startup.logPath}`));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
console.error(chalk.red(message));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (options.home) {
|
|
61
|
+
process.env.PASEO_HOME = options.home;
|
|
62
|
+
}
|
|
63
|
+
let paseoHome;
|
|
64
|
+
let logger;
|
|
65
|
+
let config;
|
|
66
|
+
try {
|
|
67
|
+
paseoHome = resolvePaseoHome();
|
|
68
|
+
const persistedConfig = loadPersistedConfig(paseoHome);
|
|
69
|
+
logger = createRootLogger(persistedConfig);
|
|
70
|
+
config = loadConfig(paseoHome, { cli: toCliOverrides(options) });
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
74
|
+
console.error(chalk.red(message));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
let daemon;
|
|
78
|
+
try {
|
|
79
|
+
daemon = await createPaseoDaemon(config, logger);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
83
|
+
console.error(chalk.red(`Failed to initialize daemon: ${message}`));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
let shuttingDown = false;
|
|
87
|
+
const handleShutdown = async (signal) => {
|
|
88
|
+
if (shuttingDown) {
|
|
89
|
+
logger.info('Forcing exit...');
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
shuttingDown = true;
|
|
93
|
+
logger.info(`${signal} received, shutting down gracefully... (press Ctrl+C again to force exit)`);
|
|
94
|
+
const forceExit = setTimeout(() => {
|
|
95
|
+
logger.warn('Forcing shutdown - HTTP server didn\'t close in time');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}, 10000);
|
|
98
|
+
try {
|
|
99
|
+
await daemon.stop();
|
|
100
|
+
clearTimeout(forceExit);
|
|
101
|
+
logger.info('Server closed');
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
clearTimeout(forceExit);
|
|
106
|
+
logger.error({ err }, 'Shutdown failed');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
111
|
+
process.on('SIGINT', () => handleShutdown('SIGINT'));
|
|
112
|
+
try {
|
|
113
|
+
await daemon.start();
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
117
|
+
console.error(chalk.red(`Failed to start daemon: ${message}`));
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/daemon/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, ListResult } from '../../output/index.js';
|
|
3
|
+
interface StatusRow {
|
|
4
|
+
key: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export type StatusResult = ListResult<StatusRow>;
|
|
8
|
+
export declare function runStatusCommand(options: CommandOptions, _command: Command): Promise<StatusResult>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAgB,MAAM,uBAAuB,CAAA;AAgBrF,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAmED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;AAEhD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,YAAY,CAAC,CAwDvB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { tryConnectToDaemon } from '../../utils/client.js';
|
|
2
|
+
import { resolveLocalDaemonState, resolveTcpHostFromListen } from './local-daemon.js';
|
|
3
|
+
function createStatusSchema(status) {
|
|
4
|
+
return {
|
|
5
|
+
idField: 'key',
|
|
6
|
+
columns: [
|
|
7
|
+
{ header: 'KEY', field: 'key' },
|
|
8
|
+
{
|
|
9
|
+
header: 'VALUE',
|
|
10
|
+
field: 'value',
|
|
11
|
+
color: (_, item) => {
|
|
12
|
+
if (item.key !== 'Status') {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
if (item.value === 'running') {
|
|
16
|
+
return 'green';
|
|
17
|
+
}
|
|
18
|
+
if (item.value === 'unresponsive') {
|
|
19
|
+
return 'yellow';
|
|
20
|
+
}
|
|
21
|
+
return 'red';
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
serialize: () => status,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function toStatusRows(status) {
|
|
29
|
+
const rows = [
|
|
30
|
+
{ key: 'Status', value: status.status },
|
|
31
|
+
{ key: 'Home', value: status.home },
|
|
32
|
+
{ key: 'Listen', value: status.listen },
|
|
33
|
+
{ key: 'PID', value: status.pid === null ? '-' : String(status.pid) },
|
|
34
|
+
{ key: 'Started', value: status.startedAt ?? '-' },
|
|
35
|
+
{ key: 'Owner', value: status.owner ?? '-' },
|
|
36
|
+
{ key: 'Logs', value: status.logPath },
|
|
37
|
+
];
|
|
38
|
+
if (status.runningAgents !== null && status.idleAgents !== null) {
|
|
39
|
+
rows.push({
|
|
40
|
+
key: 'Agents',
|
|
41
|
+
value: `${status.runningAgents} running, ${status.idleAgents} idle`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
rows.push({
|
|
46
|
+
key: 'Agents',
|
|
47
|
+
value: 'Unavailable (daemon API not reachable)',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (status.note) {
|
|
51
|
+
rows.push({ key: 'Note', value: status.note });
|
|
52
|
+
}
|
|
53
|
+
return rows;
|
|
54
|
+
}
|
|
55
|
+
function resolveOwnerLabel(uid, hostname) {
|
|
56
|
+
if (uid === undefined && !hostname) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const uidPart = uid === undefined ? '?' : String(uid);
|
|
60
|
+
const hostPart = hostname ?? 'unknown-host';
|
|
61
|
+
return `${uidPart}@${hostPart}`;
|
|
62
|
+
}
|
|
63
|
+
export async function runStatusCommand(options, _command) {
|
|
64
|
+
const home = typeof options.home === 'string' ? options.home : undefined;
|
|
65
|
+
const state = resolveLocalDaemonState({ home });
|
|
66
|
+
const owner = resolveOwnerLabel(state.pidInfo?.uid, state.pidInfo?.hostname);
|
|
67
|
+
let status = state.running ? 'running' : 'stopped';
|
|
68
|
+
let runningAgents = null;
|
|
69
|
+
let idleAgents = null;
|
|
70
|
+
let note;
|
|
71
|
+
if (!state.running && state.stalePidFile && state.pidInfo) {
|
|
72
|
+
note = `Stale PID file found for PID ${state.pidInfo.pid}`;
|
|
73
|
+
}
|
|
74
|
+
if (state.running) {
|
|
75
|
+
const host = resolveTcpHostFromListen(state.listen);
|
|
76
|
+
if (host) {
|
|
77
|
+
const client = await tryConnectToDaemon({ host, timeout: 1500 });
|
|
78
|
+
if (client) {
|
|
79
|
+
try {
|
|
80
|
+
const agents = await client.fetchAgents();
|
|
81
|
+
runningAgents = agents.filter(a => a.status === 'running').length;
|
|
82
|
+
idleAgents = agents.filter(a => a.status === 'idle').length;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
status = 'unresponsive';
|
|
86
|
+
note = `Daemon PID is running but API requests to ${host} failed`;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await client.close().catch(() => { });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
status = 'unresponsive';
|
|
94
|
+
note = `Daemon PID is running but websocket at ${host} is not reachable`;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
note = 'Daemon is configured for unix socket listen; API probe skipped';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const daemonStatus = {
|
|
102
|
+
status,
|
|
103
|
+
home: state.home,
|
|
104
|
+
listen: state.listen,
|
|
105
|
+
pid: state.pidInfo?.pid ?? null,
|
|
106
|
+
startedAt: state.pidInfo?.startedAt ?? null,
|
|
107
|
+
owner,
|
|
108
|
+
logPath: state.logPath,
|
|
109
|
+
runningAgents,
|
|
110
|
+
idleAgents,
|
|
111
|
+
note,
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
type: 'list',
|
|
115
|
+
data: toStatusRows(daemonStatus),
|
|
116
|
+
schema: createStatusSchema(daemonStatus),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/daemon/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, SingleResult } from '../../output/index.js';
|
|
3
|
+
interface StopResult {
|
|
4
|
+
action: 'stopped' | 'not_running';
|
|
5
|
+
home: string;
|
|
6
|
+
pid: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export type StopCommandResult = SingleResult<StopResult>;
|
|
10
|
+
export declare function runStopCommand(options: CommandOptions, _command: Command): Promise<StopCommandResult>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAA8B,MAAM,uBAAuB,CAAA;AAErG,UAAU,UAAU;IAClB,MAAM,EAAE,SAAS,GAAG,aAAa,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAgBD,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;AAoBxD,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAyB5B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { stopLocalDaemon, DEFAULT_STOP_TIMEOUT_MS } from './local-daemon.js';
|
|
2
|
+
const stopResultSchema = {
|
|
3
|
+
idField: 'action',
|
|
4
|
+
columns: [
|
|
5
|
+
{
|
|
6
|
+
header: 'STATUS',
|
|
7
|
+
field: 'action',
|
|
8
|
+
color: (value) => (value === 'stopped' ? 'green' : 'yellow'),
|
|
9
|
+
},
|
|
10
|
+
{ header: 'HOME', field: 'home' },
|
|
11
|
+
{ header: 'PID', field: 'pid' },
|
|
12
|
+
{ header: 'MESSAGE', field: 'message' },
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
function parseTimeoutMs(raw) {
|
|
16
|
+
if (typeof raw !== 'string' || raw.trim().length === 0) {
|
|
17
|
+
return DEFAULT_STOP_TIMEOUT_MS;
|
|
18
|
+
}
|
|
19
|
+
const seconds = Number(raw);
|
|
20
|
+
if (!Number.isFinite(seconds) || seconds <= 0) {
|
|
21
|
+
const error = {
|
|
22
|
+
code: 'INVALID_TIMEOUT',
|
|
23
|
+
message: `Invalid timeout value: ${raw}`,
|
|
24
|
+
details: 'Timeout must be a positive number of seconds',
|
|
25
|
+
};
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return Math.ceil(seconds * 1000);
|
|
29
|
+
}
|
|
30
|
+
export async function runStopCommand(options, _command) {
|
|
31
|
+
const home = typeof options.home === 'string' ? options.home : undefined;
|
|
32
|
+
const force = options.force === true;
|
|
33
|
+
const timeoutMs = parseTimeoutMs(options.timeout);
|
|
34
|
+
try {
|
|
35
|
+
const result = await stopLocalDaemon({ home, force, timeoutMs });
|
|
36
|
+
return {
|
|
37
|
+
type: 'single',
|
|
38
|
+
data: {
|
|
39
|
+
action: result.action,
|
|
40
|
+
home: result.home,
|
|
41
|
+
pid: result.pid === null ? '-' : String(result.pid),
|
|
42
|
+
message: result.message,
|
|
43
|
+
},
|
|
44
|
+
schema: stopResultSchema,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
49
|
+
const error = {
|
|
50
|
+
code: 'STOP_FAILED',
|
|
51
|
+
message: `Failed to stop local daemon: ${message}`,
|
|
52
|
+
};
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/daemon/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAU5E,MAAM,gBAAgB,GAA6B;IACjD,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE;QACP;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;SAC7D;QACD,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QACjC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;QAC/B,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;KACxC;CACF,CAAA;AAID,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,OAAO,uBAAuB,CAAA;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAiB;YAC1B,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,0BAA0B,GAAG,EAAE;YACxC,OAAO,EAAE,8CAA8C;SACxD,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,QAAiB;IAEjB,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;IACpC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAChE,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACnD,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;YACD,MAAM,EAAE,gBAAgB;SACzB,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,KAAK,GAAiB;YAC1B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,gCAAgC,OAAO,EAAE;SACnD,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, ListResult, OutputSchema } from '../../output/index.js';
|
|
3
|
+
/** Permission response item for display */
|
|
4
|
+
export interface PermissionResponseItem {
|
|
5
|
+
requestId: string;
|
|
6
|
+
agentId: string;
|
|
7
|
+
agentShortId: string;
|
|
8
|
+
name: string;
|
|
9
|
+
result: string;
|
|
10
|
+
}
|
|
11
|
+
/** Schema for permit allow/deny output */
|
|
12
|
+
export declare const permitResponseSchema: OutputSchema<PermissionResponseItem>;
|
|
13
|
+
export type PermitAllowResult = ListResult<PermissionResponseItem>;
|
|
14
|
+
export interface PermitAllowOptions extends CommandOptions {
|
|
15
|
+
all?: boolean;
|
|
16
|
+
input?: string;
|
|
17
|
+
host?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function runAllowCommand(agentIdOrPrefix: string, reqId: string | undefined, options: PermitAllowOptions, _command: Command): Promise<PermitAllowResult>;
|
|
20
|
+
//# sourceMappingURL=allow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allow.d.ts","sourceRoot":"","sources":["../../../src/commands/permit/allow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAA;AAEnG,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,EAAE,YAAY,CAAC,sBAAsB,CAiBrE,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAA;AAElE,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,eAAe,CACnC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAoH5B"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
/** Schema for permit allow/deny output */
|
|
3
|
+
export const permitResponseSchema = {
|
|
4
|
+
idField: 'requestId',
|
|
5
|
+
columns: [
|
|
6
|
+
{ header: 'REQUEST ID', field: 'requestId', width: 12 },
|
|
7
|
+
{ header: 'AGENT', field: 'agentShortId', width: 10 },
|
|
8
|
+
{ header: 'TOOL', field: 'name', width: 20 },
|
|
9
|
+
{
|
|
10
|
+
header: 'RESULT',
|
|
11
|
+
field: 'result',
|
|
12
|
+
width: 10,
|
|
13
|
+
color: (value) => {
|
|
14
|
+
if (value === 'allowed')
|
|
15
|
+
return 'green';
|
|
16
|
+
if (value === 'denied')
|
|
17
|
+
return 'red';
|
|
18
|
+
return undefined;
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
export async function runAllowCommand(agentIdOrPrefix, reqId, options, _command) {
|
|
24
|
+
const host = getDaemonHost({ host: options.host });
|
|
25
|
+
// No validation needed - if no reqId provided, allow all by default
|
|
26
|
+
// Parse input JSON if provided
|
|
27
|
+
let updatedInput;
|
|
28
|
+
if (options.input) {
|
|
29
|
+
try {
|
|
30
|
+
updatedInput = JSON.parse(options.input);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const error = {
|
|
34
|
+
code: 'INVALID_JSON',
|
|
35
|
+
message: `Invalid JSON for --input: ${err instanceof Error ? err.message : String(err)}`,
|
|
36
|
+
details: 'Provide valid JSON, e.g., --input \'{"key": "value"}\'',
|
|
37
|
+
};
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
let client;
|
|
42
|
+
try {
|
|
43
|
+
client = await connectToDaemon({ host: options.host });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
+
const error = {
|
|
48
|
+
code: 'DAEMON_NOT_RUNNING',
|
|
49
|
+
message: `Cannot connect to daemon at ${host}: ${message}`,
|
|
50
|
+
details: 'Start the daemon with: paseo daemon start',
|
|
51
|
+
};
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const agent = await client.fetchAgent(agentIdOrPrefix);
|
|
56
|
+
if (!agent) {
|
|
57
|
+
await client.close();
|
|
58
|
+
const error = {
|
|
59
|
+
code: 'AGENT_NOT_FOUND',
|
|
60
|
+
message: `Agent not found: ${agentIdOrPrefix}`,
|
|
61
|
+
details: 'Use "paseo ls" to list available agents',
|
|
62
|
+
};
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
const resolvedAgentId = agent.id;
|
|
66
|
+
// Get pending permissions for this agent
|
|
67
|
+
const pendingPermissions = agent.pendingPermissions || [];
|
|
68
|
+
if (pendingPermissions.length === 0) {
|
|
69
|
+
await client.close();
|
|
70
|
+
const error = {
|
|
71
|
+
code: 'NO_PENDING_PERMISSIONS',
|
|
72
|
+
message: `No pending permissions for agent ${agent.id.slice(0, 7)}`,
|
|
73
|
+
};
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
// Determine which permissions to allow
|
|
77
|
+
let permissionsToAllow;
|
|
78
|
+
if (!reqId || options.all) {
|
|
79
|
+
// Default: allow all pending permissions if no req_id specified
|
|
80
|
+
// --all flag is kept as an explicit alias for clarity
|
|
81
|
+
permissionsToAllow = pendingPermissions;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Find permission by ID prefix
|
|
85
|
+
const permission = pendingPermissions.find((p) => p.id === reqId || p.id.startsWith(reqId));
|
|
86
|
+
if (!permission) {
|
|
87
|
+
await client.close();
|
|
88
|
+
const error = {
|
|
89
|
+
code: 'PERMISSION_NOT_FOUND',
|
|
90
|
+
message: `Permission request not found: ${reqId}`,
|
|
91
|
+
details: `Available requests: ${pendingPermissions.map((p) => p.id.slice(0, 8)).join(', ')}`,
|
|
92
|
+
};
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
permissionsToAllow = [permission];
|
|
96
|
+
}
|
|
97
|
+
// Allow permissions
|
|
98
|
+
const results = [];
|
|
99
|
+
for (const permission of permissionsToAllow) {
|
|
100
|
+
await client.respondToPermission(resolvedAgentId, permission.id, {
|
|
101
|
+
behavior: 'allow',
|
|
102
|
+
...(updatedInput ? { updatedInput } : {}),
|
|
103
|
+
});
|
|
104
|
+
results.push({
|
|
105
|
+
requestId: permission.id.slice(0, 8),
|
|
106
|
+
agentId: resolvedAgentId,
|
|
107
|
+
agentShortId: resolvedAgentId.slice(0, 7),
|
|
108
|
+
name: permission.name,
|
|
109
|
+
result: 'allowed',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
await client.close();
|
|
113
|
+
return {
|
|
114
|
+
type: 'list',
|
|
115
|
+
data: results,
|
|
116
|
+
schema: permitResponseSchema,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
await client.close().catch(() => { });
|
|
121
|
+
// Re-throw CommandErrors
|
|
122
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
126
|
+
const error = {
|
|
127
|
+
code: 'ALLOW_PERMISSION_FAILED',
|
|
128
|
+
message: `Failed to allow permission: ${message}`,
|
|
129
|
+
};
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=allow.js.map
|