@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,105 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
/** Schema for stop command output */
|
|
3
|
+
export const stopSchema = {
|
|
4
|
+
// For quiet mode, output the stopped agent IDs (one per line)
|
|
5
|
+
idField: (item) => item.agentIds.join('\n'),
|
|
6
|
+
columns: [{ header: 'STOPPED', field: 'stoppedCount' }],
|
|
7
|
+
};
|
|
8
|
+
export async function runStopCommand(id, options, _command) {
|
|
9
|
+
const host = getDaemonHost({ host: options.host });
|
|
10
|
+
// Validate arguments - need either an id, --all, or --cwd
|
|
11
|
+
if (!id && !options.all && !options.cwd) {
|
|
12
|
+
const error = {
|
|
13
|
+
code: 'MISSING_ARGUMENT',
|
|
14
|
+
message: 'Agent ID required unless --all or --cwd is specified',
|
|
15
|
+
details: 'Usage: junction agent stop <id> | --all | --cwd <path>',
|
|
16
|
+
};
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
let client;
|
|
20
|
+
try {
|
|
21
|
+
client = await connectToDaemon({ host: options.host });
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
25
|
+
const error = {
|
|
26
|
+
code: 'DAEMON_NOT_RUNNING',
|
|
27
|
+
message: `Cannot connect to daemon at ${host}: ${message}`,
|
|
28
|
+
details: 'Start the daemon with: junction daemon start',
|
|
29
|
+
};
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const fetchPayload = await client.fetchAgents({ filter: { includeArchived: true } });
|
|
34
|
+
let agents = fetchPayload.entries.map((entry) => entry.agent);
|
|
35
|
+
const stoppedIds = [];
|
|
36
|
+
if (options.all) {
|
|
37
|
+
// Stop all agents (not archived)
|
|
38
|
+
agents = agents.filter((a) => !a.archivedAt);
|
|
39
|
+
}
|
|
40
|
+
else if (options.cwd) {
|
|
41
|
+
// Stop agents in directory
|
|
42
|
+
const filterCwd = options.cwd;
|
|
43
|
+
agents = agents.filter((a) => {
|
|
44
|
+
if (a.archivedAt)
|
|
45
|
+
return false;
|
|
46
|
+
const agentCwd = a.cwd.replace(/\/$/, '');
|
|
47
|
+
const targetCwd = filterCwd.replace(/\/$/, '');
|
|
48
|
+
return agentCwd === targetCwd || agentCwd.startsWith(targetCwd + '/');
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else if (id) {
|
|
52
|
+
// Stop specific agent
|
|
53
|
+
const fetchResult = await client.fetchAgent(id);
|
|
54
|
+
if (!fetchResult) {
|
|
55
|
+
const error = {
|
|
56
|
+
code: 'AGENT_NOT_FOUND',
|
|
57
|
+
message: `No agent found matching: ${id}`,
|
|
58
|
+
details: 'Use `junction ls` to list available agents',
|
|
59
|
+
};
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
agents = [fetchResult.agent];
|
|
63
|
+
}
|
|
64
|
+
// Stop each agent
|
|
65
|
+
for (const agent of agents) {
|
|
66
|
+
try {
|
|
67
|
+
// Cancel if running
|
|
68
|
+
if (agent.status === 'running') {
|
|
69
|
+
await client.cancelAgent(agent.id);
|
|
70
|
+
}
|
|
71
|
+
// Delete the agent
|
|
72
|
+
await client.deleteAgent(agent.id);
|
|
73
|
+
stoppedIds.push(agent.id);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// Continue stopping other agents even if one fails
|
|
77
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
+
console.error(`Warning: Failed to stop agent ${agent.id.slice(0, 7)}: ${message}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
await client.close();
|
|
82
|
+
return {
|
|
83
|
+
type: 'single',
|
|
84
|
+
data: {
|
|
85
|
+
stoppedCount: stoppedIds.length,
|
|
86
|
+
agentIds: stoppedIds,
|
|
87
|
+
},
|
|
88
|
+
schema: stopSchema,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
await client.close().catch(() => { });
|
|
93
|
+
// Re-throw if it's already a CommandError
|
|
94
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
98
|
+
const error = {
|
|
99
|
+
code: 'STOP_AGENT_FAILED',
|
|
100
|
+
message: `Failed to stop agent(s): ${message}`,
|
|
101
|
+
};
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/agent/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, SingleResult, OutputSchema } from '../../output/index.js';
|
|
3
|
+
/** Result type for agent update command */
|
|
4
|
+
export interface AgentUpdateResult {
|
|
5
|
+
agentId: string;
|
|
6
|
+
name: string | null;
|
|
7
|
+
labels: string;
|
|
8
|
+
}
|
|
9
|
+
/** Schema for update command output */
|
|
10
|
+
export declare const updateSchema: OutputSchema<AgentUpdateResult>;
|
|
11
|
+
export interface AgentUpdateOptions extends CommandOptions {
|
|
12
|
+
name?: string;
|
|
13
|
+
label?: string[];
|
|
14
|
+
host?: string;
|
|
15
|
+
}
|
|
16
|
+
export type AgentUpdateCommandResult = SingleResult<AgentUpdateResult>;
|
|
17
|
+
export declare function runUpdateCommand(agentIdArg: string, options: AgentUpdateOptions, _command: Command): Promise<AgentUpdateCommandResult>;
|
|
18
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAA;AAErG,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,uCAAuC;AACvC,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,iBAAiB,CAOxD,CAAA;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAA;AAmDtE,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,wBAAwB,CAAC,CA8FnC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
/** Schema for update command output */
|
|
3
|
+
export const updateSchema = {
|
|
4
|
+
idField: 'agentId',
|
|
5
|
+
columns: [
|
|
6
|
+
{ header: 'AGENT ID', field: 'agentId' },
|
|
7
|
+
{ header: 'NAME', field: 'name' },
|
|
8
|
+
{ header: 'LABELS', field: 'labels' },
|
|
9
|
+
],
|
|
10
|
+
};
|
|
11
|
+
function parseLabelOptions(labels) {
|
|
12
|
+
const parsed = {};
|
|
13
|
+
if (!labels) {
|
|
14
|
+
return parsed;
|
|
15
|
+
}
|
|
16
|
+
for (const rawLabel of labels) {
|
|
17
|
+
for (const segment of rawLabel.split(',')) {
|
|
18
|
+
const label = segment.trim();
|
|
19
|
+
if (!label) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const eqIndex = label.indexOf('=');
|
|
23
|
+
if (eqIndex === -1) {
|
|
24
|
+
const error = {
|
|
25
|
+
code: 'INVALID_LABEL',
|
|
26
|
+
message: `Invalid label format: ${label}`,
|
|
27
|
+
details: 'Labels must be in key=value format',
|
|
28
|
+
};
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
const key = label.slice(0, eqIndex).trim();
|
|
32
|
+
const value = label.slice(eqIndex + 1);
|
|
33
|
+
if (!key) {
|
|
34
|
+
const error = {
|
|
35
|
+
code: 'INVALID_LABEL',
|
|
36
|
+
message: `Invalid label format: ${label}`,
|
|
37
|
+
details: 'Labels must include a non-empty key in key=value format',
|
|
38
|
+
};
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
parsed[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
function formatLabels(labels) {
|
|
47
|
+
const entries = Object.entries(labels);
|
|
48
|
+
if (entries.length === 0) {
|
|
49
|
+
return '-';
|
|
50
|
+
}
|
|
51
|
+
return entries.map(([key, value]) => `${key}=${value}`).join(',');
|
|
52
|
+
}
|
|
53
|
+
export async function runUpdateCommand(agentIdArg, options, _command) {
|
|
54
|
+
const host = getDaemonHost({ host: options.host });
|
|
55
|
+
// Validate arguments
|
|
56
|
+
if (!agentIdArg || agentIdArg.trim().length === 0) {
|
|
57
|
+
const error = {
|
|
58
|
+
code: 'MISSING_AGENT_ID',
|
|
59
|
+
message: 'Agent ID is required',
|
|
60
|
+
details: 'Usage: junction agent update <id> [--name <name>] [--label <key=value>]',
|
|
61
|
+
};
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
const name = options.name?.trim();
|
|
65
|
+
if (options.name !== undefined && !name) {
|
|
66
|
+
const error = {
|
|
67
|
+
code: 'INVALID_NAME',
|
|
68
|
+
message: 'Name cannot be empty',
|
|
69
|
+
details: 'Use --name <name> with a non-empty value',
|
|
70
|
+
};
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
const labels = parseLabelOptions(options.label);
|
|
74
|
+
if (!name && Object.keys(labels).length === 0) {
|
|
75
|
+
const error = {
|
|
76
|
+
code: 'NO_CHANGES_PROVIDED',
|
|
77
|
+
message: 'Nothing to update',
|
|
78
|
+
details: 'Provide at least one of: --name <name>, --label <key=value>',
|
|
79
|
+
};
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
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: junction daemon start',
|
|
92
|
+
};
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const fetchResult = await client.fetchAgent(agentIdArg);
|
|
97
|
+
if (!fetchResult) {
|
|
98
|
+
const error = {
|
|
99
|
+
code: 'AGENT_NOT_FOUND',
|
|
100
|
+
message: `Agent not found: ${agentIdArg}`,
|
|
101
|
+
details: 'Use "junction ls" to list available agents',
|
|
102
|
+
};
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
const agentId = fetchResult.agent.id;
|
|
106
|
+
await client.updateAgent(agentId, {
|
|
107
|
+
...(name ? { name } : {}),
|
|
108
|
+
...(Object.keys(labels).length > 0 ? { labels } : {}),
|
|
109
|
+
});
|
|
110
|
+
const updatedResult = await client.fetchAgent(agentId);
|
|
111
|
+
if (!updatedResult) {
|
|
112
|
+
throw new Error(`Agent not found after update: ${agentId}`);
|
|
113
|
+
}
|
|
114
|
+
await client.close();
|
|
115
|
+
return {
|
|
116
|
+
type: 'single',
|
|
117
|
+
data: {
|
|
118
|
+
agentId,
|
|
119
|
+
name: updatedResult.agent.title,
|
|
120
|
+
labels: formatLabels(updatedResult.agent.labels),
|
|
121
|
+
},
|
|
122
|
+
schema: updateSchema,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
await client.close().catch(() => { });
|
|
127
|
+
// Re-throw CommandError as-is
|
|
128
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
132
|
+
const error = {
|
|
133
|
+
code: 'UPDATE_FAILED',
|
|
134
|
+
message: `Failed to update agent: ${message}`,
|
|
135
|
+
};
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/agent/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAUtE,uCAAuC;AACvC,MAAM,CAAC,MAAM,YAAY,GAAoC;IAC3D,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE;QACP,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;QACxC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QACjC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;KACtC;CACF,CAAA;AAUD,SAAS,iBAAiB,CAAC,MAA4B;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAQ;YACV,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAiB;oBAC1B,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,yBAAyB,KAAK,EAAE;oBACzC,OAAO,EAAE,oCAAoC;iBAC9C,CAAA;gBACD,MAAM,KAAK,CAAA;YACb,CAAC;YAED,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,KAAK,GAAiB;oBAC1B,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,yBAAyB,KAAK,EAAE;oBACzC,OAAO,EAAE,yDAAyD;iBACnE,CAAA;gBACD,MAAM,KAAK,CAAA;YACb,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAA8B;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,OAA2B,EAC3B,QAAiB;IAEjB,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAA0B,EAAE,CAAC,CAAA;IAExE,qBAAqB;IACrB,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAiB;YAC1B,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,yEAAyE;SACnF,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAiB;YAC1B,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,0CAA0C;SACpD,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC/C,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAiB;YAC1B,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,6DAA6D;SACvE,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAA0B,EAAE,CAAC,CAAA;IAC9E,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,oBAAoB;YAC1B,OAAO,EAAE,+BAA+B,IAAI,KAAK,OAAO,EAAE;YAC1D,OAAO,EAAE,8CAA8C;SACxD,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;QACvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,KAAK,GAAiB;gBAC1B,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,oBAAoB,UAAU,EAAE;gBACzC,OAAO,EAAE,4CAA4C;aACtD,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAA;QAEpC,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE;YAChC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAA;QAC7D,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAEpB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE;gBACJ,OAAO;gBACP,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK;gBAC/B,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;aACjD;YACD,MAAM,EAAE,YAAY;SACrB,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAEpC,8BAA8B;QAC9B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,GAAG,CAAA;QACX,CAAC;QAED,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,eAAe;YACrB,OAAO,EAAE,2BAA2B,OAAO,EAAE;SAC9C,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, SingleResult, OutputSchema } from '../../output/index.js';
|
|
3
|
+
/** Result type for agent wait command */
|
|
4
|
+
export interface AgentWaitResult {
|
|
5
|
+
agentId: string;
|
|
6
|
+
status: 'idle' | 'timeout' | 'permission' | 'error';
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
/** Schema for agent wait output */
|
|
10
|
+
export declare const agentWaitSchema: OutputSchema<AgentWaitResult>;
|
|
11
|
+
export interface AgentWaitOptions extends CommandOptions {
|
|
12
|
+
timeout?: string;
|
|
13
|
+
host?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runWaitCommand(agentIdArg: string, options: AgentWaitOptions, _command: Command): Promise<SingleResult<AgentWaitResult>>;
|
|
16
|
+
//# sourceMappingURL=wait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAA;AAGrG,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAAA;IACnD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,mCAAmC;AACnC,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,eAAe,CAOzD,CAAA;AAED,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAoED,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CA0IxC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { connectToDaemon, getDaemonHost } from '../../utils/client.js';
|
|
2
|
+
import { fetchAgentTimelineItems, formatAgentActivityTranscript } from './logs.js';
|
|
3
|
+
/** Schema for agent wait output */
|
|
4
|
+
export const agentWaitSchema = {
|
|
5
|
+
idField: 'agentId',
|
|
6
|
+
columns: [
|
|
7
|
+
{ header: 'AGENT ID', field: 'agentId', width: 12 },
|
|
8
|
+
{ header: 'STATUS', field: 'status', width: 12 },
|
|
9
|
+
{ header: 'MESSAGE', field: 'message', width: 40 },
|
|
10
|
+
],
|
|
11
|
+
};
|
|
12
|
+
const WAIT_ACTIVITY_PREVIEW_COUNT = 5;
|
|
13
|
+
function appendRecentActivity(message, transcript) {
|
|
14
|
+
if (!transcript || transcript.trim().length === 0) {
|
|
15
|
+
return message;
|
|
16
|
+
}
|
|
17
|
+
return `${message}\nLast ${WAIT_ACTIVITY_PREVIEW_COUNT} activity items:\n${transcript}`;
|
|
18
|
+
}
|
|
19
|
+
async function getRecentActivityTranscript(client, agentId) {
|
|
20
|
+
try {
|
|
21
|
+
const timelineItems = await fetchAgentTimelineItems(client, agentId);
|
|
22
|
+
return formatAgentActivityTranscript(timelineItems, WAIT_ACTIVITY_PREVIEW_COUNT);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse duration string to milliseconds.
|
|
30
|
+
* Supports formats like: 5m, 30s, 1h, 2h30m, 90, etc.
|
|
31
|
+
* If no unit is specified, assumes seconds.
|
|
32
|
+
*/
|
|
33
|
+
function parseDuration(input) {
|
|
34
|
+
const trimmed = input.trim();
|
|
35
|
+
// If it's just a number, treat as seconds
|
|
36
|
+
if (/^\d+$/.test(trimmed)) {
|
|
37
|
+
return parseInt(trimmed, 10) * 1000;
|
|
38
|
+
}
|
|
39
|
+
// Parse duration with units
|
|
40
|
+
let totalMs = 0;
|
|
41
|
+
const regex = /(\d+)([smh])/g;
|
|
42
|
+
let match;
|
|
43
|
+
let hasMatch = false;
|
|
44
|
+
while ((match = regex.exec(trimmed)) !== null) {
|
|
45
|
+
hasMatch = true;
|
|
46
|
+
const value = parseInt(match[1], 10);
|
|
47
|
+
const unit = match[2];
|
|
48
|
+
switch (unit) {
|
|
49
|
+
case 's':
|
|
50
|
+
totalMs += value * 1000;
|
|
51
|
+
break;
|
|
52
|
+
case 'm':
|
|
53
|
+
totalMs += value * 60 * 1000;
|
|
54
|
+
break;
|
|
55
|
+
case 'h':
|
|
56
|
+
totalMs += value * 60 * 60 * 1000;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!hasMatch) {
|
|
61
|
+
throw new Error(`Invalid duration format: ${input}. Use formats like: 5m, 30s, 1h, 2h30m`);
|
|
62
|
+
}
|
|
63
|
+
return totalMs;
|
|
64
|
+
}
|
|
65
|
+
export async function runWaitCommand(agentIdArg, options, _command) {
|
|
66
|
+
const host = getDaemonHost({ host: options.host });
|
|
67
|
+
// Validate arguments
|
|
68
|
+
if (!agentIdArg || agentIdArg.trim().length === 0) {
|
|
69
|
+
const error = {
|
|
70
|
+
code: 'MISSING_AGENT_ID',
|
|
71
|
+
message: 'Agent ID is required',
|
|
72
|
+
details: 'Usage: junction agent wait <id>',
|
|
73
|
+
};
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
// Parse timeout (no limit unless explicitly provided)
|
|
77
|
+
let timeoutMs = 0;
|
|
78
|
+
let timeoutLabel = null;
|
|
79
|
+
if (options.timeout) {
|
|
80
|
+
try {
|
|
81
|
+
timeoutMs = parseDuration(options.timeout);
|
|
82
|
+
if (timeoutMs <= 0) {
|
|
83
|
+
throw new Error('Timeout must be positive');
|
|
84
|
+
}
|
|
85
|
+
const timeoutSeconds = Math.floor(timeoutMs / 1000);
|
|
86
|
+
timeoutLabel = `${timeoutSeconds} second${timeoutSeconds === 1 ? '' : 's'}`;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
90
|
+
const error = {
|
|
91
|
+
code: 'INVALID_TIMEOUT',
|
|
92
|
+
message: 'Invalid timeout value',
|
|
93
|
+
details: message,
|
|
94
|
+
};
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
let client;
|
|
99
|
+
try {
|
|
100
|
+
client = await connectToDaemon({ host: options.host });
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
+
const error = {
|
|
105
|
+
code: 'DAEMON_NOT_RUNNING',
|
|
106
|
+
message: `Cannot connect to daemon at ${host}: ${message}`,
|
|
107
|
+
details: 'Start the daemon with: junction daemon start',
|
|
108
|
+
};
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
try {
|
|
113
|
+
const state = await client.waitForFinish(agentIdArg, timeoutMs);
|
|
114
|
+
const resolvedAgentId = state.final?.id ?? agentIdArg;
|
|
115
|
+
const recentActivity = state.status === 'timeout' || state.status === 'idle'
|
|
116
|
+
? await getRecentActivityTranscript(client, resolvedAgentId)
|
|
117
|
+
: null;
|
|
118
|
+
await client.close();
|
|
119
|
+
if (state.status === 'timeout') {
|
|
120
|
+
const timeoutMessage = timeoutLabel
|
|
121
|
+
? `Agent did not finish within ${timeoutLabel}. Run \`junction wait ${resolvedAgentId}\` again to keep waiting.`
|
|
122
|
+
: `Agent wait timed out. Run \`junction wait ${resolvedAgentId}\` again to keep waiting.`;
|
|
123
|
+
return {
|
|
124
|
+
type: 'single',
|
|
125
|
+
data: {
|
|
126
|
+
agentId: resolvedAgentId,
|
|
127
|
+
status: 'timeout',
|
|
128
|
+
message: appendRecentActivity(timeoutMessage, recentActivity),
|
|
129
|
+
},
|
|
130
|
+
schema: agentWaitSchema,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (state.status === 'permission') {
|
|
134
|
+
const permission = state.final?.pendingPermissions?.[0];
|
|
135
|
+
return {
|
|
136
|
+
type: 'single',
|
|
137
|
+
data: {
|
|
138
|
+
agentId: resolvedAgentId,
|
|
139
|
+
status: 'permission',
|
|
140
|
+
message: permission
|
|
141
|
+
? `Agent is waiting for permission: ${permission.kind}`
|
|
142
|
+
: 'Agent is waiting for permission',
|
|
143
|
+
},
|
|
144
|
+
schema: agentWaitSchema,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (state.status === 'error') {
|
|
148
|
+
return {
|
|
149
|
+
type: 'single',
|
|
150
|
+
data: {
|
|
151
|
+
agentId: resolvedAgentId,
|
|
152
|
+
status: 'error',
|
|
153
|
+
message: state.error ?? 'Agent finished with error',
|
|
154
|
+
},
|
|
155
|
+
schema: agentWaitSchema,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// Agent is idle
|
|
159
|
+
return {
|
|
160
|
+
type: 'single',
|
|
161
|
+
data: {
|
|
162
|
+
agentId: resolvedAgentId,
|
|
163
|
+
status: 'idle',
|
|
164
|
+
message: appendRecentActivity('Agent is idle.', recentActivity),
|
|
165
|
+
},
|
|
166
|
+
schema: agentWaitSchema,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
catch (waitErr) {
|
|
170
|
+
await client.close().catch(() => { });
|
|
171
|
+
const waitMessage = waitErr instanceof Error ? waitErr.message : String(waitErr);
|
|
172
|
+
// Other errors
|
|
173
|
+
const error = {
|
|
174
|
+
code: 'WAIT_FAILED',
|
|
175
|
+
message: `Failed to wait for agent: ${waitMessage}`,
|
|
176
|
+
};
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
await client.close().catch(() => { });
|
|
182
|
+
// Re-throw CommandError as-is
|
|
183
|
+
if (err && typeof err === 'object' && 'code' in err) {
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
187
|
+
const error = {
|
|
188
|
+
code: 'WAIT_FAILED',
|
|
189
|
+
message: `Failed to wait for agent: ${message}`,
|
|
190
|
+
};
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# 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;AAOnC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAA;AAG7B,wBAAgB,mBAAmB,CAAC,cAAc,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAAG,OAAO,CAmD/F"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { updateCommand } from './update.js';
|
|
8
|
+
import { resolveDaemonPackageContext, } from './package-context.js';
|
|
9
|
+
import { withOutput } from '../../output/index.js';
|
|
10
|
+
export function createDaemonCommand(packageContext = {}) {
|
|
11
|
+
const resolvedPackageContext = resolveDaemonPackageContext(packageContext);
|
|
12
|
+
const daemon = new Command('daemon').description('Manage the Junction daemon');
|
|
13
|
+
daemon.addCommand(startCommand());
|
|
14
|
+
daemon.addCommand(pairCommand());
|
|
15
|
+
daemon.addCommand(updateCommand(resolvedPackageContext));
|
|
16
|
+
daemon
|
|
17
|
+
.command('status')
|
|
18
|
+
.description('Show local daemon status')
|
|
19
|
+
.option('--json', 'Output in JSON format')
|
|
20
|
+
.option('--home <path>', 'Junction home directory (default: ~/.junction)')
|
|
21
|
+
.option('--all', 'Show status of all running daemons')
|
|
22
|
+
.option('--port <port>', 'Show status of daemon on specific port')
|
|
23
|
+
.action(withOutput(async (options, command) => runStatusCommand(options, command, resolvedPackageContext)));
|
|
24
|
+
daemon
|
|
25
|
+
.command('stop')
|
|
26
|
+
.description('Stop the local daemon')
|
|
27
|
+
.option('--json', 'Output in JSON format')
|
|
28
|
+
.option('--home <path>', 'Junction home directory (default: ~/.junction)')
|
|
29
|
+
.option('--timeout <seconds>', 'Wait timeout before failing (default: 15)')
|
|
30
|
+
.option('--force', 'Send SIGKILL if graceful stop times out')
|
|
31
|
+
.option('--all', 'Stop all running daemons')
|
|
32
|
+
.option('--port <port>', 'Stop daemon on specific port')
|
|
33
|
+
.option('--listen <listen>', 'Stop daemon on specific listen address')
|
|
34
|
+
.action(withOutput(runStopCommand));
|
|
35
|
+
daemon
|
|
36
|
+
.command('restart')
|
|
37
|
+
.description('Restart the local daemon')
|
|
38
|
+
.option('--json', 'Output in JSON format')
|
|
39
|
+
.option('--home <path>', 'Junction home directory (default: ~/.junction)')
|
|
40
|
+
.option('--timeout <seconds>', 'Wait timeout before force step (default: 15)')
|
|
41
|
+
.option('--force', 'Send SIGKILL if graceful stop times out')
|
|
42
|
+
.option('--listen <listen>', 'Listen target for restarted daemon (host:port, port, or unix socket)')
|
|
43
|
+
.option('--port <port>', 'Port for restarted daemon listen target')
|
|
44
|
+
.option('--no-relay', 'Disable relay on restarted daemon')
|
|
45
|
+
.option('--no-mcp', 'Disable Agent MCP on restarted daemon')
|
|
46
|
+
.option('--allowed-hosts <hosts>', 'Comma-separated Host allowlist values (example: "localhost,.example.com" or "true")')
|
|
47
|
+
.action(withOutput(runRestartCommand));
|
|
48
|
+
return daemon;
|
|
49
|
+
}
|
|
50
|
+
//# 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,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EACL,2BAA2B,GAE5B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAuB,MAAM,uBAAuB,CAAA;AAEvE,MAAM,UAAU,mBAAmB,CAAC,iBAAgD,EAAE;IACpF,MAAM,sBAAsB,GAAG,2BAA2B,CAAC,cAAc,CAAC,CAAA;IAC1E,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAA;IAE9E,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAExD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACzE,MAAM,CAAC,OAAO,EAAE,oCAAoC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;SACjE,MAAM,CACL,UAAU,CAAC,KAAK,EAAE,OAAuB,EAAE,OAAgB,EAAE,EAAE,CAC7D,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAC3D,CACF,CAAA;IAEH,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACzE,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;SAC1E,MAAM,CAAC,SAAS,EAAE,yCAAyC,CAAC;SAC5D,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;SAC3C,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;SACrE,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,gDAAgD,CAAC;SACzE,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,60 @@
|
|
|
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
|
+
listen?: string;
|
|
33
|
+
port?: string;
|
|
34
|
+
all?: boolean;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
force?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface StopLocalDaemonResult {
|
|
39
|
+
action: 'stopped' | 'not_running';
|
|
40
|
+
home: string;
|
|
41
|
+
pid: number | null;
|
|
42
|
+
forced: boolean;
|
|
43
|
+
message: string;
|
|
44
|
+
}
|
|
45
|
+
export declare const DEFAULT_STOP_TIMEOUT_MS = 15000;
|
|
46
|
+
export declare function resolveLocalJunctionHome(home?: string): string;
|
|
47
|
+
export declare function resolveTcpHostFromListen(listen: string): string | null;
|
|
48
|
+
export declare function resolveAllLocalDaemonStates(options?: {
|
|
49
|
+
home?: string;
|
|
50
|
+
}): LocalDaemonState[];
|
|
51
|
+
export declare function resolveLocalDaemonState(options?: {
|
|
52
|
+
home?: string;
|
|
53
|
+
listen?: string;
|
|
54
|
+
port?: string;
|
|
55
|
+
}): LocalDaemonState;
|
|
56
|
+
export declare function tailDaemonLog(home?: string, lines?: number): string | null;
|
|
57
|
+
export declare function startLocalDaemonDetached(options: DaemonStartOptions): Promise<DetachedStartResult>;
|
|
58
|
+
export declare function startLocalDaemonForeground(options: DaemonStartOptions): number;
|
|
59
|
+
export declare function stopLocalDaemon(options?: StopLocalDaemonOptions): Promise<StopLocalDaemonResult | StopLocalDaemonResult[]>;
|
|
60
|
+
//# 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":"AAOA,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,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,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;AAmBD,eAAO,MAAM,uBAAuB,QAAS,CAAA;AA+M7C,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBtE;AAuDD,wBAAgB,2BAA2B,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,gBAAgB,EAAE,CAG/F;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D,gBAAgB,CAuDlB;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,CAqE9B;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAqB9E;AAmGD,wBAAsB,eAAe,CACnC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,GAAG,qBAAqB,EAAE,CAAC,CA2B1D"}
|