@junctionpanel/cli 0.1.16
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/LICENSE +671 -0
- package/bin/junction +2 -0
- package/bin/junction-daemon +5 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +211 -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 +92 -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 +153 -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 +125 -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 +198 -0
- package/dist/commands/agent/inspect.js.map +1 -0
- package/dist/commands/agent/logs.d.ts +15 -0
- package/dist/commands/agent/logs.d.ts.map +1 -0
- package/dist/commands/agent/logs.js +163 -0
- package/dist/commands/agent/logs.js.map +1 -0
- package/dist/commands/agent/ls.d.ts +37 -0
- package/dist/commands/agent/ls.d.ts.map +1 -0
- package/dist/commands/agent/ls.js +185 -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 +100 -0
- package/dist/commands/agent/mode.js.map +1 -0
- package/dist/commands/agent/run.d.ts +40 -0
- package/dist/commands/agent/run.d.ts.map +1 -0
- package/dist/commands/agent/run.js +354 -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 +105 -0
- package/dist/commands/agent/stop.js.map +1 -0
- package/dist/commands/agent/update.d.ts +18 -0
- package/dist/commands/agent/update.d.ts.map +1 -0
- package/dist/commands/agent/update.js +139 -0
- package/dist/commands/agent/update.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 +194 -0
- package/dist/commands/agent/wait.js.map +1 -0
- package/dist/commands/daemon/index.d.ts +4 -0
- package/dist/commands/daemon/index.d.ts.map +1 -0
- package/dist/commands/daemon/index.js +50 -0
- package/dist/commands/daemon/index.js.map +1 -0
- package/dist/commands/daemon/local-daemon.d.ts +60 -0
- package/dist/commands/daemon/local-daemon.d.ts.map +1 -0
- package/dist/commands/daemon/local-daemon.js +501 -0
- package/dist/commands/daemon/local-daemon.js.map +1 -0
- package/dist/commands/daemon/package-context.d.ts +7 -0
- package/dist/commands/daemon/package-context.d.ts.map +1 -0
- package/dist/commands/daemon/package-context.js +41 -0
- package/dist/commands/daemon/package-context.js.map +1 -0
- package/dist/commands/daemon/pair.d.ts +3 -0
- package/dist/commands/daemon/pair.d.ts.map +1 -0
- package/dist/commands/daemon/pair.js +11 -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 +102 -0
- package/dist/commands/daemon/restart.js.map +1 -0
- package/dist/commands/daemon/runtime-toolchain.d.ts +24 -0
- package/dist/commands/daemon/runtime-toolchain.d.ts.map +1 -0
- package/dist/commands/daemon/runtime-toolchain.js +93 -0
- package/dist/commands/daemon/runtime-toolchain.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 +48 -0
- package/dist/commands/daemon/start.js.map +1 -0
- package/dist/commands/daemon/status.d.ts +11 -0
- package/dist/commands/daemon/status.d.ts.map +1 -0
- package/dist/commands/daemon/status.js +389 -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 +69 -0
- package/dist/commands/daemon/stop.js.map +1 -0
- package/dist/commands/daemon/update.d.ts +11 -0
- package/dist/commands/daemon/update.d.ts.map +1 -0
- package/dist/commands/daemon/update.js +88 -0
- package/dist/commands/daemon/update.js.map +1 -0
- package/dist/commands/onboard.d.ts +9 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +299 -0
- package/dist/commands/onboard.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 +134 -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 +106 -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 +66 -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 +23 -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 +20 -0
- package/dist/commands/provider/models.d.ts.map +1 -0
- package/dist/commands/provider/models.js +53 -0
- package/dist/commands/provider/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 +19 -0
- package/dist/commands/worktree/ls.d.ts.map +1 -0
- package/dist/commands/worktree/ls.js +97 -0
- package/dist/commands/worktree/ls.js.map +1 -0
- package/dist/daemon-only-cli.d.ts +4 -0
- package/dist/daemon-only-cli.d.ts.map +1 -0
- package/dist/daemon-only-cli.js +5 -0
- package/dist/daemon-only-cli.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 +87 -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-id.d.ts +2 -0
- package/dist/utils/client-id.d.ts.map +1 -0
- package/dist/utils/client-id.js +37 -0
- package/dist/utils/client-id.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 +113 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/errors.d.ts +5 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +10 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/timeline.d.ts +8 -0
- package/dist/utils/timeline.d.ts.map +1 -0
- package/dist/utils/timeline.js +9 -0
- package/dist/utils/timeline.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { cancel, intro, log, note, outro, spinner } from '@clack/prompts';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { buildRelayWebSocketUrl, getOrCreateServerId, loadConfig, loadOrCreateDaemonKeyPair, } from '@junctionpanel/server';
|
|
5
|
+
import { resolveLocalJunctionHome, resolveLocalDaemonState, resolveTcpHostFromListen, startLocalDaemonDetached, tailDaemonLog, } from './daemon/local-daemon.js';
|
|
6
|
+
import { tryConnectToDaemon } from '../utils/client.js';
|
|
7
|
+
const DEFAULT_READY_TIMEOUT_MS = 10 * 60 * 1000;
|
|
8
|
+
const DEFAULT_WEB_APP_URL = 'https://app.junctionpanel.dev';
|
|
9
|
+
const DEFAULT_RELAY_ENDPOINT = 'relay.junctionpanel.dev:443';
|
|
10
|
+
const plainNoteFormat = (line) => line;
|
|
11
|
+
function renderNote(message, title) {
|
|
12
|
+
note(message, title, { format: plainNoteFormat });
|
|
13
|
+
}
|
|
14
|
+
function sleep(ms) {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
setTimeout(resolve, ms);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function parseTimeoutMs(raw) {
|
|
20
|
+
if (!raw || raw.trim().length === 0) {
|
|
21
|
+
return DEFAULT_READY_TIMEOUT_MS;
|
|
22
|
+
}
|
|
23
|
+
const seconds = Number(raw);
|
|
24
|
+
if (!Number.isFinite(seconds) || seconds <= 0) {
|
|
25
|
+
throw new Error(`Invalid timeout value: ${raw}`);
|
|
26
|
+
}
|
|
27
|
+
return Math.ceil(seconds * 1000);
|
|
28
|
+
}
|
|
29
|
+
function toCliOverrides(options) {
|
|
30
|
+
const cliOverrides = {};
|
|
31
|
+
if (options.listen) {
|
|
32
|
+
cliOverrides.listen = options.listen;
|
|
33
|
+
}
|
|
34
|
+
else if (options.port) {
|
|
35
|
+
cliOverrides.listen = `127.0.0.1:${options.port}`;
|
|
36
|
+
}
|
|
37
|
+
if (options.relay === false) {
|
|
38
|
+
cliOverrides.relayEnabled = false;
|
|
39
|
+
}
|
|
40
|
+
if (options.allowedHosts) {
|
|
41
|
+
const raw = options.allowedHosts.trim();
|
|
42
|
+
cliOverrides.allowedHosts =
|
|
43
|
+
raw.toLowerCase() === 'true'
|
|
44
|
+
? true
|
|
45
|
+
: raw.split(',').map(host => host.trim()).filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
if (options.mcp === false) {
|
|
48
|
+
cliOverrides.mcpEnabled = false;
|
|
49
|
+
}
|
|
50
|
+
return cliOverrides;
|
|
51
|
+
}
|
|
52
|
+
async function waitForDaemonReady(args) {
|
|
53
|
+
const deadline = Date.now() + args.timeoutMs;
|
|
54
|
+
let lastStatus = '';
|
|
55
|
+
let lastPrintedAt = 0;
|
|
56
|
+
while (Date.now() < deadline) {
|
|
57
|
+
const state = resolveLocalDaemonState({ home: args.home });
|
|
58
|
+
const host = resolveTcpHostFromListen(state.listen);
|
|
59
|
+
if (state.running && host) {
|
|
60
|
+
const client = await tryConnectToDaemon({ host, timeout: 1200 });
|
|
61
|
+
if (client) {
|
|
62
|
+
try {
|
|
63
|
+
await client.fetchAgents();
|
|
64
|
+
return { listen: state.listen, host };
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Daemon process is alive but not API-ready yet.
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await client.close().catch(() => { });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (state.running && !host) {
|
|
75
|
+
return { listen: state.listen, host: null };
|
|
76
|
+
}
|
|
77
|
+
const statusMessage = 'Waiting for daemon to become ready...';
|
|
78
|
+
if (statusMessage !== lastStatus) {
|
|
79
|
+
args.onStatus?.(statusMessage);
|
|
80
|
+
lastStatus = statusMessage;
|
|
81
|
+
lastPrintedAt = Date.now();
|
|
82
|
+
}
|
|
83
|
+
else if (!args.onStatus && Date.now() - lastPrintedAt >= 3000) {
|
|
84
|
+
console.log(statusMessage);
|
|
85
|
+
lastPrintedAt = Date.now();
|
|
86
|
+
}
|
|
87
|
+
await sleep(200);
|
|
88
|
+
}
|
|
89
|
+
const recentLogs = tailDaemonLog(args.home, 60);
|
|
90
|
+
throw new Error([
|
|
91
|
+
`Timed out after ${Math.ceil(args.timeoutMs / 1000)}s waiting for daemon readiness.`,
|
|
92
|
+
recentLogs ? `Recent daemon logs:\n${recentLogs}` : null,
|
|
93
|
+
]
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
.join('\n\n'));
|
|
96
|
+
}
|
|
97
|
+
function printConnectionInfo(readyState, richUi) {
|
|
98
|
+
const endpointLine = readyState.host
|
|
99
|
+
? `WebSocket endpoint: ws://${readyState.host}/ws`
|
|
100
|
+
: `Daemon listen: ${readyState.listen}`;
|
|
101
|
+
const infoLines = [
|
|
102
|
+
endpointLine,
|
|
103
|
+
`Web app: ${DEFAULT_WEB_APP_URL}`,
|
|
104
|
+
'Status: ready',
|
|
105
|
+
];
|
|
106
|
+
if (!richUi) {
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log('Daemon ready:');
|
|
109
|
+
for (const line of infoLines) {
|
|
110
|
+
console.log(line);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
renderNote(infoLines.join('\n'), 'Daemon ready');
|
|
115
|
+
}
|
|
116
|
+
async function buildPairingUrl(args) {
|
|
117
|
+
const pairingUrl = new URL(buildRelayWebSocketUrl({
|
|
118
|
+
endpoint: args.relayEndpoint,
|
|
119
|
+
serverId: args.serverId,
|
|
120
|
+
role: 'client',
|
|
121
|
+
version: '2',
|
|
122
|
+
}));
|
|
123
|
+
const daemonKeyPair = await loadOrCreateDaemonKeyPair(args.junctionHome);
|
|
124
|
+
pairingUrl.searchParams.set('daemonPublicKeyB64', daemonKeyPair.publicKeyB64);
|
|
125
|
+
return pairingUrl.toString();
|
|
126
|
+
}
|
|
127
|
+
function printPairingUrl(pairingUrl, richUi) {
|
|
128
|
+
const lines = [
|
|
129
|
+
pairingUrl,
|
|
130
|
+
'Paste this URL into the web app Daemon URL field.',
|
|
131
|
+
];
|
|
132
|
+
if (!richUi) {
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log('Pairing URL:');
|
|
135
|
+
for (const line of lines) {
|
|
136
|
+
console.log(line);
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
renderNote(lines.join('\n'), 'Pairing URL');
|
|
141
|
+
}
|
|
142
|
+
function printNextSteps(junctionHome, richUi) {
|
|
143
|
+
const daemonLogPath = path.join(junctionHome, 'daemon.log');
|
|
144
|
+
const nextStepsLines = [
|
|
145
|
+
`1. Open the Junction web app: ${DEFAULT_WEB_APP_URL}`,
|
|
146
|
+
'2. Connect using the Pairing URL shown above.',
|
|
147
|
+
'3. Example: junction run "your prompt"',
|
|
148
|
+
];
|
|
149
|
+
const quickReferenceLines = [
|
|
150
|
+
'1. junction --help',
|
|
151
|
+
'2. junction ls',
|
|
152
|
+
'3. junction run "your prompt"',
|
|
153
|
+
'4. junction status',
|
|
154
|
+
'5. junction stop',
|
|
155
|
+
`6. Daemon logs: ${daemonLogPath}`,
|
|
156
|
+
];
|
|
157
|
+
if (!richUi) {
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log('Next steps:');
|
|
160
|
+
for (const line of nextStepsLines) {
|
|
161
|
+
console.log(line);
|
|
162
|
+
}
|
|
163
|
+
console.log('');
|
|
164
|
+
console.log('CLI quick reference:');
|
|
165
|
+
for (const line of quickReferenceLines) {
|
|
166
|
+
console.log(line);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
renderNote(nextStepsLines.join('\n'), 'Next steps');
|
|
171
|
+
renderNote(quickReferenceLines.join('\n'), 'CLI quick reference');
|
|
172
|
+
}
|
|
173
|
+
export function onboardCommand() {
|
|
174
|
+
return new Command('onboard')
|
|
175
|
+
.description('Run first-time setup and start the daemon')
|
|
176
|
+
.option('--listen <listen>', 'Listen target (host:port, port, or unix socket path)')
|
|
177
|
+
.option('--port <port>', 'Port to listen on (default: 6767)')
|
|
178
|
+
.option('--home <path>', 'Home directory (default: ~/.junction)')
|
|
179
|
+
.option('--no-relay', 'Disable relay connection')
|
|
180
|
+
.option('--no-mcp', 'Disable the Agent MCP HTTP endpoint')
|
|
181
|
+
.option('--allowed-hosts <hosts>', 'Comma-separated Host allowlist values (example: "localhost,.example.com" or "true")')
|
|
182
|
+
.option('--timeout <seconds>', 'Max time to wait for daemon readiness (default: 600)')
|
|
183
|
+
.action(async (options) => {
|
|
184
|
+
await runOnboard(options);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
export async function runOnboard(options) {
|
|
188
|
+
const richUi = process.stdin.isTTY && process.stdout.isTTY;
|
|
189
|
+
if (richUi) {
|
|
190
|
+
intro('Welcome to Junction');
|
|
191
|
+
}
|
|
192
|
+
if (options.listen && options.port) {
|
|
193
|
+
cancel('Cannot use --listen and --port together');
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
let timeoutMs = DEFAULT_READY_TIMEOUT_MS;
|
|
197
|
+
let readyState = null;
|
|
198
|
+
try {
|
|
199
|
+
timeoutMs = parseTimeoutMs(options.timeout);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
203
|
+
cancel(message);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
const junctionHome = resolveLocalJunctionHome(options.home);
|
|
207
|
+
if (richUi) {
|
|
208
|
+
renderNote(junctionHome, 'Junction home');
|
|
209
|
+
}
|
|
210
|
+
const cliOverrides = toCliOverrides(options);
|
|
211
|
+
const daemonConfig = loadConfig(junctionHome, { cli: cliOverrides });
|
|
212
|
+
const stateBeforeStart = resolveLocalDaemonState({ home: options.home });
|
|
213
|
+
const startSpinner = richUi ? spinner() : null;
|
|
214
|
+
if (!stateBeforeStart.running) {
|
|
215
|
+
try {
|
|
216
|
+
if (startSpinner) {
|
|
217
|
+
startSpinner.start('Starting daemon...');
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
log.message('Starting daemon...');
|
|
221
|
+
}
|
|
222
|
+
const startup = await startLocalDaemonDetached(options);
|
|
223
|
+
if (startSpinner) {
|
|
224
|
+
startSpinner.stop(`Daemon started (PID ${startup.pid ?? 'unknown'})`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
log.message(`Daemon started (PID ${startup.pid ?? 'unknown'})`);
|
|
228
|
+
}
|
|
229
|
+
log.message(`Logs: ${startup.logPath}`);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
233
|
+
if (startSpinner) {
|
|
234
|
+
startSpinner.error(message);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
log.error(message);
|
|
238
|
+
}
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
log.message(`Daemon already running (PID ${stateBeforeStart.pidInfo?.pid ?? 'unknown'}).`);
|
|
244
|
+
}
|
|
245
|
+
const readySpinner = richUi ? spinner() : null;
|
|
246
|
+
try {
|
|
247
|
+
if (readySpinner) {
|
|
248
|
+
readySpinner.start('Waiting for daemon to become ready...');
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
log.message('Waiting for daemon to become ready...');
|
|
252
|
+
}
|
|
253
|
+
readyState = await waitForDaemonReady({
|
|
254
|
+
home: options.home ?? junctionHome,
|
|
255
|
+
timeoutMs,
|
|
256
|
+
onStatus: readySpinner ? (message) => readySpinner.message(message) : undefined,
|
|
257
|
+
});
|
|
258
|
+
if (readySpinner) {
|
|
259
|
+
readySpinner.stop(`Daemon ready on ${readyState.listen}`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
log.message(`Daemon ready on ${readyState.listen}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
267
|
+
if (readySpinner) {
|
|
268
|
+
readySpinner.error(message);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
log.error(message);
|
|
272
|
+
}
|
|
273
|
+
process.exit(1);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (readyState) {
|
|
277
|
+
printConnectionInfo(readyState, richUi);
|
|
278
|
+
}
|
|
279
|
+
if (daemonConfig.relayEnabled) {
|
|
280
|
+
try {
|
|
281
|
+
const relayEndpoint = daemonConfig.relayPublicEndpoint ?? daemonConfig.relayEndpoint ?? DEFAULT_RELAY_ENDPOINT;
|
|
282
|
+
const pairingUrl = await buildPairingUrl({
|
|
283
|
+
junctionHome,
|
|
284
|
+
relayEndpoint,
|
|
285
|
+
serverId: getOrCreateServerId(junctionHome),
|
|
286
|
+
});
|
|
287
|
+
printPairingUrl(pairingUrl, richUi);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
291
|
+
log.warn(`Could not generate pairing URL: ${message}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
printNextSteps(junctionHome, richUi);
|
|
295
|
+
if (richUi) {
|
|
296
|
+
outro('Junction daemon is running.');
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CAqH5B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
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: junction daemon start',
|
|
51
|
+
};
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const fetchResult = await client.fetchAgent(agentIdOrPrefix);
|
|
56
|
+
if (!fetchResult) {
|
|
57
|
+
await client.close();
|
|
58
|
+
const error = {
|
|
59
|
+
code: 'AGENT_NOT_FOUND',
|
|
60
|
+
message: `Agent not found: ${agentIdOrPrefix}`,
|
|
61
|
+
details: 'Use "junction ls" to list available agents',
|
|
62
|
+
};
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
const agent = fetchResult.agent;
|
|
66
|
+
const resolvedAgentId = agent.id;
|
|
67
|
+
// Get pending permissions for this agent
|
|
68
|
+
const pendingPermissions = agent.pendingPermissions || [];
|
|
69
|
+
if (pendingPermissions.length === 0) {
|
|
70
|
+
await client.close();
|
|
71
|
+
const error = {
|
|
72
|
+
code: 'NO_PENDING_PERMISSIONS',
|
|
73
|
+
message: `No pending permissions for agent ${agent.id.slice(0, 7)}`,
|
|
74
|
+
};
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
// Determine which permissions to allow
|
|
78
|
+
let permissionsToAllow;
|
|
79
|
+
if (!reqId || options.all) {
|
|
80
|
+
// Default: allow all pending permissions if no req_id specified
|
|
81
|
+
// --all flag is kept as an explicit alias for clarity
|
|
82
|
+
permissionsToAllow = pendingPermissions;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Find permission by ID prefix
|
|
86
|
+
const permission = pendingPermissions.find((p) => p.id === reqId || p.id.startsWith(reqId));
|
|
87
|
+
if (!permission) {
|
|
88
|
+
await client.close();
|
|
89
|
+
const error = {
|
|
90
|
+
code: 'PERMISSION_NOT_FOUND',
|
|
91
|
+
message: `Permission request not found: ${reqId}`,
|
|
92
|
+
details: `Available requests: ${pendingPermissions.map((p) => p.id.slice(0, 8)).join(', ')}`,
|
|
93
|
+
};
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
permissionsToAllow = [permission];
|
|
97
|
+
}
|
|
98
|
+
// Allow permissions
|
|
99
|
+
const results = [];
|
|
100
|
+
for (const permission of permissionsToAllow) {
|
|
101
|
+
await client.respondToPermission(resolvedAgentId, permission.id, {
|
|
102
|
+
behavior: 'allow',
|
|
103
|
+
...(updatedInput ? { updatedInput } : {}),
|
|
104
|
+
});
|
|
105
|
+
results.push({
|
|
106
|
+
requestId: permission.id.slice(0, 8),
|
|
107
|
+
agentId: resolvedAgentId,
|
|
108
|
+
agentShortId: resolvedAgentId.slice(0, 7),
|
|
109
|
+
name: permission.name,
|
|
110
|
+
result: 'allowed',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
await client.close();
|
|
114
|
+
return {
|
|
115
|
+
type: 'list',
|
|
116
|
+
data: results,
|
|
117
|
+
schema: permitResponseSchema,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
await client.close().catch(() => { });
|
|
122
|
+
// Re-throw CommandErrors
|
|
123
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
127
|
+
const error = {
|
|
128
|
+
code: 'ALLOW_PERMISSION_FAILED',
|
|
129
|
+
message: `Failed to allow permission: ${message}`,
|
|
130
|
+
};
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=allow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allow.js","sourceRoot":"","sources":["../../../src/commands/permit/allow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, ListResult } from '../../output/index.js';
|
|
3
|
+
import { type PermissionResponseItem } from './allow.js';
|
|
4
|
+
export type PermitDenyResult = ListResult<PermissionResponseItem>;
|
|
5
|
+
export interface PermitDenyOptions extends CommandOptions {
|
|
6
|
+
all?: boolean;
|
|
7
|
+
message?: string;
|
|
8
|
+
interrupt?: boolean;
|
|
9
|
+
host?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function runDenyCommand(agentIdOrPrefix: string, reqId: string | undefined, options: PermitDenyOptions, _command: Command): Promise<PermitDenyResult>;
|
|
12
|
+
//# sourceMappingURL=deny.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deny.d.ts","sourceRoot":"","sources":["../../../src/commands/permit/deny.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAgB,MAAM,uBAAuB,CAAA;AACrF,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAE9E,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAA;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,cAAc,CAClC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,gBAAgB,CAAC,CA6G3B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
import { permitResponseSchema } from './allow.js';
|
|
3
|
+
export async function runDenyCommand(agentIdOrPrefix, reqId, options, _command) {
|
|
4
|
+
const host = getDaemonHost({ host: options.host });
|
|
5
|
+
// Validate arguments
|
|
6
|
+
if (!options.all && !reqId) {
|
|
7
|
+
const error = {
|
|
8
|
+
code: 'MISSING_ARGUMENT',
|
|
9
|
+
message: 'Request ID is required unless --all is specified',
|
|
10
|
+
details: 'Usage: junction permit deny <agent> <req_id> or junction permit deny <agent> --all',
|
|
11
|
+
};
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
let client;
|
|
15
|
+
try {
|
|
16
|
+
client = await connectToDaemon({ host: options.host });
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
20
|
+
const error = {
|
|
21
|
+
code: 'DAEMON_NOT_RUNNING',
|
|
22
|
+
message: `Cannot connect to daemon at ${host}: ${message}`,
|
|
23
|
+
details: 'Start the daemon with: junction daemon start',
|
|
24
|
+
};
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const fetchResult = await client.fetchAgent(agentIdOrPrefix);
|
|
29
|
+
if (!fetchResult) {
|
|
30
|
+
await client.close();
|
|
31
|
+
const error = {
|
|
32
|
+
code: 'AGENT_NOT_FOUND',
|
|
33
|
+
message: `Agent not found: ${agentIdOrPrefix}`,
|
|
34
|
+
details: 'Use "junction ls" to list available agents',
|
|
35
|
+
};
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const agent = fetchResult.agent;
|
|
39
|
+
const resolvedAgentId = agent.id;
|
|
40
|
+
// Get pending permissions for this agent
|
|
41
|
+
const pendingPermissions = agent.pendingPermissions || [];
|
|
42
|
+
if (pendingPermissions.length === 0) {
|
|
43
|
+
await client.close();
|
|
44
|
+
const error = {
|
|
45
|
+
code: 'NO_PENDING_PERMISSIONS',
|
|
46
|
+
message: `No pending permissions for agent ${agent.id.slice(0, 7)}`,
|
|
47
|
+
};
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
// Determine which permissions to deny
|
|
51
|
+
let permissionsToDeny;
|
|
52
|
+
if (options.all) {
|
|
53
|
+
permissionsToDeny = pendingPermissions;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Find permission by ID prefix
|
|
57
|
+
const permission = pendingPermissions.find((p) => p.id === reqId || p.id.startsWith(reqId));
|
|
58
|
+
if (!permission) {
|
|
59
|
+
await client.close();
|
|
60
|
+
const error = {
|
|
61
|
+
code: 'PERMISSION_NOT_FOUND',
|
|
62
|
+
message: `Permission request not found: ${reqId}`,
|
|
63
|
+
details: `Available requests: ${pendingPermissions.map((p) => p.id.slice(0, 8)).join(', ')}`,
|
|
64
|
+
};
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
permissionsToDeny = [permission];
|
|
68
|
+
}
|
|
69
|
+
// Deny permissions
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const permission of permissionsToDeny) {
|
|
72
|
+
await client.respondToPermission(resolvedAgentId, permission.id, {
|
|
73
|
+
behavior: 'deny',
|
|
74
|
+
...(options.message ? { message: options.message } : {}),
|
|
75
|
+
...(options.interrupt ? { interrupt: true } : {}),
|
|
76
|
+
});
|
|
77
|
+
results.push({
|
|
78
|
+
requestId: permission.id.slice(0, 8),
|
|
79
|
+
agentId: resolvedAgentId,
|
|
80
|
+
agentShortId: resolvedAgentId.slice(0, 7),
|
|
81
|
+
name: permission.name,
|
|
82
|
+
result: 'denied',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
await client.close();
|
|
86
|
+
return {
|
|
87
|
+
type: 'list',
|
|
88
|
+
data: results,
|
|
89
|
+
schema: permitResponseSchema,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
await client.close().catch(() => { });
|
|
94
|
+
// Re-throw CommandErrors
|
|
95
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
99
|
+
const error = {
|
|
100
|
+
code: 'DENY_PERMISSION_FAILED',
|
|
101
|
+
message: `Failed to deny permission: ${message}`,
|
|
102
|
+
};
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=deny.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deny.js","sourceRoot":"","sources":["../../../src/commands/permit/deny.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/permit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,wBAAgB,mBAAmB,IAAI,OAAO,CAkC7C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runLsCommand } from './ls.js';
|
|
3
|
+
import { runAllowCommand } from './allow.js';
|
|
4
|
+
import { runDenyCommand } from './deny.js';
|
|
5
|
+
import { withOutput } from '../../output/index.js';
|
|
6
|
+
export function createPermitCommand() {
|
|
7
|
+
const permit = new Command('permit').description('Manage permission requests');
|
|
8
|
+
permit
|
|
9
|
+
.command('ls')
|
|
10
|
+
.description('List all pending permissions')
|
|
11
|
+
.option('--json', 'Output in JSON format')
|
|
12
|
+
.option('--host <host>', 'Daemon host:port (default: localhost:6767)')
|
|
13
|
+
.action(withOutput(runLsCommand));
|
|
14
|
+
permit
|
|
15
|
+
.command('allow')
|
|
16
|
+
.description('Allow a permission request')
|
|
17
|
+
.argument('<agent>', 'Agent ID (or prefix)')
|
|
18
|
+
.argument('[req_id]', 'Permission request ID (optional if --all)')
|
|
19
|
+
.option('--all', 'Allow all pending permissions for this agent')
|
|
20
|
+
.option('--input <json>', 'Modified input parameters (JSON)')
|
|
21
|
+
.option('--json', 'Output in JSON format')
|
|
22
|
+
.option('--host <host>', 'Daemon host:port (default: localhost:6767)')
|
|
23
|
+
.action(withOutput(runAllowCommand));
|
|
24
|
+
permit
|
|
25
|
+
.command('deny')
|
|
26
|
+
.description('Deny a permission request')
|
|
27
|
+
.argument('<agent>', 'Agent ID (or prefix)')
|
|
28
|
+
.argument('[req_id]', 'Permission request ID (optional if --all)')
|
|
29
|
+
.option('--all', 'Deny all pending permissions for this agent')
|
|
30
|
+
.option('--message <msg>', 'Denial reason message')
|
|
31
|
+
.option('--interrupt', 'Stop agent after denial')
|
|
32
|
+
.option('--json', 'Output in JSON format')
|
|
33
|
+
.option('--host <host>', 'Daemon host:port (default: localhost:6767)')
|
|
34
|
+
.action(withOutput(runDenyCommand));
|
|
35
|
+
return permit;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|