@agentmeshhq/agent 0.1.5 → 0.1.7
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/dist/cli/config.d.ts +1 -0
- package/dist/cli/config.js +129 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.js +63 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/logs.d.ts +4 -0
- package/dist/cli/logs.js +54 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/restart.d.ts +1 -0
- package/dist/cli/restart.js +41 -0
- package/dist/cli/restart.js.map +1 -0
- package/dist/cli/status.d.ts +1 -0
- package/dist/cli/status.js +73 -0
- package/dist/cli/status.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/config.ts +148 -0
- package/src/cli/index.ts +64 -1
- package/src/cli/logs.ts +64 -0
- package/src/cli/restart.ts +50 -0
- package/src/cli/status.ts +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function configCmd(action: string, key?: string, value?: string): Promise<void>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { loadConfig, saveConfig } from "../config/loader.js";
|
|
3
|
+
import { CONFIG_PATH } from "../config/schema.js";
|
|
4
|
+
export async function configCmd(action, key, value) {
|
|
5
|
+
const config = loadConfig();
|
|
6
|
+
if (!config) {
|
|
7
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
switch (action) {
|
|
11
|
+
case "show":
|
|
12
|
+
case "view":
|
|
13
|
+
showConfig(config);
|
|
14
|
+
break;
|
|
15
|
+
case "get":
|
|
16
|
+
if (!key) {
|
|
17
|
+
console.log(pc.red("Key required. Usage: agentmesh config get <key>"));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
getConfigValue(config, key);
|
|
21
|
+
break;
|
|
22
|
+
case "set":
|
|
23
|
+
if (!key || value === undefined) {
|
|
24
|
+
console.log(pc.red("Key and value required. Usage: agentmesh config set <key> <value>"));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
setConfigValue(config, key, value);
|
|
28
|
+
break;
|
|
29
|
+
case "path":
|
|
30
|
+
console.log(CONFIG_PATH);
|
|
31
|
+
break;
|
|
32
|
+
case "edit":
|
|
33
|
+
await editConfig();
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
// Default to show
|
|
37
|
+
showConfig(config);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function showConfig(config) {
|
|
41
|
+
console.log(pc.bold("AgentMesh Configuration\n"));
|
|
42
|
+
console.log(pc.dim(`Path: ${CONFIG_PATH}\n`));
|
|
43
|
+
// Show main settings
|
|
44
|
+
console.log(`hubUrl: ${pc.cyan(config.hubUrl)}`);
|
|
45
|
+
console.log(`workspace: ${pc.cyan(config.workspace)}`);
|
|
46
|
+
console.log(`apiKey: ${pc.dim(maskApiKey(config.apiKey))}`);
|
|
47
|
+
// Show defaults
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(pc.dim("Defaults:"));
|
|
50
|
+
console.log(` command: ${config.defaults.command}`);
|
|
51
|
+
console.log(` model: ${config.defaults.model}`);
|
|
52
|
+
// Show agents
|
|
53
|
+
if (config.agents.length > 0) {
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(pc.dim("Agent Configs:"));
|
|
56
|
+
for (const agent of config.agents) {
|
|
57
|
+
console.log(` ${agent.name}:`);
|
|
58
|
+
if (agent.command)
|
|
59
|
+
console.log(` command: ${agent.command}`);
|
|
60
|
+
if (agent.model)
|
|
61
|
+
console.log(` model: ${agent.model}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function getConfigValue(config, key) {
|
|
66
|
+
const parts = key.split(".");
|
|
67
|
+
let value = config;
|
|
68
|
+
for (const part of parts) {
|
|
69
|
+
if (value && typeof value === "object" && part in value) {
|
|
70
|
+
value = value[part];
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(pc.red(`Key "${key}" not found.`));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (typeof value === "object") {
|
|
78
|
+
console.log(JSON.stringify(value, null, 2));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(String(value));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function setConfigValue(config, key, value) {
|
|
85
|
+
const parts = key.split(".");
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
+
let target = config;
|
|
88
|
+
// Navigate to parent
|
|
89
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
90
|
+
const part = parts[i];
|
|
91
|
+
if (!(part in target)) {
|
|
92
|
+
target[part] = {};
|
|
93
|
+
}
|
|
94
|
+
target = target[part];
|
|
95
|
+
}
|
|
96
|
+
const finalKey = parts[parts.length - 1];
|
|
97
|
+
const oldValue = target[finalKey];
|
|
98
|
+
// Try to parse as JSON, otherwise use string
|
|
99
|
+
try {
|
|
100
|
+
target[finalKey] = JSON.parse(value);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
target[finalKey] = value;
|
|
104
|
+
}
|
|
105
|
+
saveConfig(config);
|
|
106
|
+
console.log(pc.green(`Set ${key}:`));
|
|
107
|
+
console.log(` Old: ${pc.dim(String(oldValue))}`);
|
|
108
|
+
console.log(` New: ${pc.cyan(String(target[finalKey]))}`);
|
|
109
|
+
}
|
|
110
|
+
async function editConfig() {
|
|
111
|
+
const { spawn } = await import("node:child_process");
|
|
112
|
+
const editor = process.env.EDITOR || process.env.VISUAL || "vi";
|
|
113
|
+
console.log(pc.dim(`Opening ${CONFIG_PATH} with ${editor}...`));
|
|
114
|
+
const child = spawn(editor, [CONFIG_PATH], {
|
|
115
|
+
stdio: "inherit",
|
|
116
|
+
});
|
|
117
|
+
child.on("exit", (code) => {
|
|
118
|
+
if (code === 0) {
|
|
119
|
+
console.log(pc.green("Config saved."));
|
|
120
|
+
}
|
|
121
|
+
process.exit(code ?? 0);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function maskApiKey(key) {
|
|
125
|
+
if (!key || key.length < 12)
|
|
126
|
+
return "***";
|
|
127
|
+
return `${key.slice(0, 8)}...${key.slice(-4)}`;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,GAAY,EAAE,KAAc;IAC1E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,UAAU,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM;QAER,KAAK,KAAK;YACR,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,KAAK;YACR,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,MAAM;QAER,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,MAAM;QAER,KAAK,MAAM;YACT,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM;QAER;YACE,kBAAkB;YAClB,UAAU,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,CAAC;IAE9C,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/D,gBAAgB;IAChB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAEnD,cAAc;IACd,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,IAAI,KAAK,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,GAAW;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAY,MAAM,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YACxD,KAAK,GAAI,KAAiC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,8DAA8D;IAC9D,IAAI,MAAM,GAAQ,MAAM,CAAC;IAEzB,qBAAqB;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElC,6CAA6C;IAC7C,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,WAAW,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;QACzC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module";
|
|
2
3
|
import { Command } from "commander";
|
|
3
4
|
import pc from "picocolors";
|
|
4
5
|
import { attach } from "./attach.js";
|
|
6
|
+
import { configCmd } from "./config.js";
|
|
5
7
|
import { init } from "./init.js";
|
|
6
8
|
import { list } from "./list.js";
|
|
9
|
+
import { logs } from "./logs.js";
|
|
7
10
|
import { nudge } from "./nudge.js";
|
|
11
|
+
import { restart } from "./restart.js";
|
|
8
12
|
import { start } from "./start.js";
|
|
13
|
+
import { status } from "./status.js";
|
|
9
14
|
import { stop } from "./stop.js";
|
|
10
15
|
import { token } from "./token.js";
|
|
11
16
|
import { whoami } from "./whoami.js";
|
|
17
|
+
const require = createRequire(import.meta.url);
|
|
18
|
+
const pkg = require("../../package.json");
|
|
12
19
|
const program = new Command();
|
|
13
20
|
program
|
|
14
21
|
.name("agentmesh")
|
|
15
22
|
.description("AgentMesh Agent Wrapper - Turn any AI assistant into a dispatchable agent")
|
|
16
|
-
.version(
|
|
23
|
+
.version(pkg.version);
|
|
17
24
|
program
|
|
18
25
|
.command("init")
|
|
19
26
|
.description("Initialize AgentMesh configuration")
|
|
@@ -123,5 +130,60 @@ program
|
|
|
123
130
|
process.exit(1);
|
|
124
131
|
}
|
|
125
132
|
});
|
|
133
|
+
program
|
|
134
|
+
.command("status")
|
|
135
|
+
.description("Show AgentMesh status and health")
|
|
136
|
+
.action(async () => {
|
|
137
|
+
try {
|
|
138
|
+
await status();
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error(pc.red(error.message));
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
program
|
|
146
|
+
.command("logs")
|
|
147
|
+
.description("View agent session logs")
|
|
148
|
+
.argument("<name>", "Agent name")
|
|
149
|
+
.option("-f, --follow", "Follow log output (attach read-only)")
|
|
150
|
+
.option("-n, --lines <number>", "Number of lines to show", "50")
|
|
151
|
+
.action(async (name, options) => {
|
|
152
|
+
try {
|
|
153
|
+
await logs(name, { follow: options.follow, lines: parseInt(options.lines, 10) });
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.error(pc.red(error.message));
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
program
|
|
161
|
+
.command("restart")
|
|
162
|
+
.description("Restart an agent (preserves agent ID)")
|
|
163
|
+
.argument("<name>", "Agent name")
|
|
164
|
+
.action(async (name) => {
|
|
165
|
+
try {
|
|
166
|
+
await restart(name);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error(pc.red(error.message));
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
program
|
|
174
|
+
.command("config")
|
|
175
|
+
.description("View or edit configuration")
|
|
176
|
+
.argument("[action]", "Action: show (default), get, set, edit, path")
|
|
177
|
+
.argument("[key]", "Config key (for get/set)")
|
|
178
|
+
.argument("[value]", "Config value (for set)")
|
|
179
|
+
.action(async (action, key, value) => {
|
|
180
|
+
try {
|
|
181
|
+
await configCmd(action || "show", key, value);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error(pc.red(error.message));
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
126
188
|
program.parse();
|
|
127
189
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/logs.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { getAgentState, loadConfig } from "../config/loader.js";
|
|
4
|
+
import { getSessionName, sessionExists } from "../core/tmux.js";
|
|
5
|
+
export async function logs(name, options) {
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
if (!config) {
|
|
8
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const agent = getAgentState(name);
|
|
12
|
+
if (!agent) {
|
|
13
|
+
console.log(pc.red(`Agent "${name}" not found.`));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const sessionName = getSessionName(name);
|
|
17
|
+
if (!sessionExists(sessionName)) {
|
|
18
|
+
console.log(pc.red(`Session "${sessionName}" not running.`));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const lines = options.lines || 50;
|
|
22
|
+
// Capture pane content using tmux capture-pane
|
|
23
|
+
if (options.follow) {
|
|
24
|
+
// Follow mode - attach in view-only mode
|
|
25
|
+
console.log(pc.dim(`Following logs for "${name}"... (Ctrl+C to exit)`));
|
|
26
|
+
console.log(pc.dim("─".repeat(60)));
|
|
27
|
+
// Use tmux pipe-pane to stream output
|
|
28
|
+
const tmux = spawn("tmux", ["attach-session", "-t", sessionName, "-r"], {
|
|
29
|
+
stdio: "inherit",
|
|
30
|
+
});
|
|
31
|
+
tmux.on("exit", (code) => {
|
|
32
|
+
process.exit(code ?? 0);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Static mode - capture and print
|
|
37
|
+
try {
|
|
38
|
+
const { execSync } = await import("node:child_process");
|
|
39
|
+
// Capture the pane history
|
|
40
|
+
const output = execSync(`tmux capture-pane -t "${sessionName}" -p -S -${lines}`, {
|
|
41
|
+
encoding: "utf-8",
|
|
42
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
43
|
+
});
|
|
44
|
+
console.log(pc.dim(`Last ${lines} lines from "${name}":`));
|
|
45
|
+
console.log(pc.dim("─".repeat(60)));
|
|
46
|
+
console.log(output);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.log(pc.red(`Failed to capture logs: ${error.message}`));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function restart(name: string): Promise<void>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { getAgentState, loadConfig } from "../config/loader.js";
|
|
3
|
+
import { getSessionName, sessionExists } from "../core/tmux.js";
|
|
4
|
+
import { start } from "./start.js";
|
|
5
|
+
import { stop } from "./stop.js";
|
|
6
|
+
export async function restart(name) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config) {
|
|
9
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const agent = getAgentState(name);
|
|
13
|
+
if (!agent) {
|
|
14
|
+
console.log(pc.red(`Agent "${name}" not found in state.`));
|
|
15
|
+
console.log(pc.dim("Use 'agentmesh start' to create a new agent."));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
console.log(pc.dim(`Restarting agent "${name}"...`));
|
|
19
|
+
// Stop the agent (but preserve the agent ID for re-registration)
|
|
20
|
+
const sessionName = getSessionName(name);
|
|
21
|
+
if (sessionExists(sessionName)) {
|
|
22
|
+
console.log(pc.dim("Stopping current session..."));
|
|
23
|
+
await stop(name);
|
|
24
|
+
// Small delay to ensure clean shutdown
|
|
25
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
26
|
+
}
|
|
27
|
+
// Find agent config to get workdir and other settings
|
|
28
|
+
const agentConfig = config.agents.find((a) => a.name === name);
|
|
29
|
+
console.log(pc.dim("Starting new session..."));
|
|
30
|
+
// Start with the same settings, agent ID will be reused from state
|
|
31
|
+
await start({
|
|
32
|
+
name,
|
|
33
|
+
command: agentConfig?.command,
|
|
34
|
+
workdir: agentConfig?.workdir,
|
|
35
|
+
model: agentConfig?.model,
|
|
36
|
+
foreground: false,
|
|
37
|
+
});
|
|
38
|
+
console.log(pc.green(`Agent "${name}" restarted.`));
|
|
39
|
+
console.log(pc.dim(`Agent ID preserved: ${agent.agentId}`));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/cli/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAkB,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,CAAC,CAAC;IAErD,iEAAiE;IACjE,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,uCAAuC;QACvC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,sDAAsD;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAE/C,mEAAmE;IACnE,MAAM,KAAK,CAAC;QACV,IAAI;QACJ,OAAO,EAAE,WAAW,EAAE,OAAO;QAC7B,OAAO,EAAE,WAAW,EAAE,OAAO;QAC7B,KAAK,EAAE,WAAW,EAAE,KAAK;QACzB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function status(): Promise<void>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { loadConfig, loadState } from "../config/loader.js";
|
|
3
|
+
import { getSessionName, sessionExists } from "../core/tmux.js";
|
|
4
|
+
export async function status() {
|
|
5
|
+
const config = loadConfig();
|
|
6
|
+
if (!config) {
|
|
7
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
console.log(pc.bold("AgentMesh Status\n"));
|
|
11
|
+
// Check hub connectivity
|
|
12
|
+
console.log(pc.dim("Hub:"));
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(`${config.hubUrl}/health`, {
|
|
15
|
+
signal: AbortSignal.timeout(5000),
|
|
16
|
+
});
|
|
17
|
+
if (response.ok) {
|
|
18
|
+
const data = (await response.json());
|
|
19
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
20
|
+
console.log(` Status: ${pc.green("connected")}`);
|
|
21
|
+
if (data.version) {
|
|
22
|
+
console.log(` Version: ${pc.dim(data.version)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
27
|
+
console.log(` Status: ${pc.yellow(`HTTP ${response.status}`)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
32
|
+
console.log(` Status: ${pc.red("unreachable")}`);
|
|
33
|
+
console.log(` Error: ${pc.dim(error.message)}`);
|
|
34
|
+
}
|
|
35
|
+
// Check local agents
|
|
36
|
+
const state = loadState();
|
|
37
|
+
const runningAgents = state.agents.filter((a) => {
|
|
38
|
+
if (!a.pid)
|
|
39
|
+
return false;
|
|
40
|
+
try {
|
|
41
|
+
process.kill(a.pid, 0);
|
|
42
|
+
return sessionExists(getSessionName(a.name));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(pc.dim("Local Agents:"));
|
|
50
|
+
console.log(` Running: ${pc.cyan(String(runningAgents.length))}`);
|
|
51
|
+
console.log(` Total: ${pc.dim(String(state.agents.length))}`);
|
|
52
|
+
if (runningAgents.length > 0) {
|
|
53
|
+
console.log(` Names: ${pc.dim(runningAgents.map((a) => a.name).join(", "))}`);
|
|
54
|
+
}
|
|
55
|
+
// Check tmux
|
|
56
|
+
console.log();
|
|
57
|
+
console.log(pc.dim("Dependencies:"));
|
|
58
|
+
try {
|
|
59
|
+
const { execSync } = await import("node:child_process");
|
|
60
|
+
const tmuxVersion = execSync("tmux -V", { encoding: "utf-8" }).trim();
|
|
61
|
+
console.log(` tmux: ${pc.green(tmuxVersion)}`);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
console.log(` tmux: ${pc.red("not found")}`);
|
|
65
|
+
}
|
|
66
|
+
// Config info
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(pc.dim("Config:"));
|
|
69
|
+
console.log(` Workspace: ${pc.cyan(config.workspace)}`);
|
|
70
|
+
console.log(` Command: ${pc.dim(config.defaults.command)}`);
|
|
71
|
+
console.log(` Model: ${pc.dim(config.defaults.model)}`);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { loadConfig, saveConfig } from "../config/loader.js";
|
|
3
|
+
import { CONFIG_PATH, type Config } from "../config/schema.js";
|
|
4
|
+
|
|
5
|
+
export async function configCmd(action: string, key?: string, value?: string): Promise<void> {
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
|
|
8
|
+
if (!config) {
|
|
9
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
switch (action) {
|
|
14
|
+
case "show":
|
|
15
|
+
case "view":
|
|
16
|
+
showConfig(config);
|
|
17
|
+
break;
|
|
18
|
+
|
|
19
|
+
case "get":
|
|
20
|
+
if (!key) {
|
|
21
|
+
console.log(pc.red("Key required. Usage: agentmesh config get <key>"));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
getConfigValue(config, key);
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
case "set":
|
|
28
|
+
if (!key || value === undefined) {
|
|
29
|
+
console.log(pc.red("Key and value required. Usage: agentmesh config set <key> <value>"));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
setConfigValue(config, key, value);
|
|
33
|
+
break;
|
|
34
|
+
|
|
35
|
+
case "path":
|
|
36
|
+
console.log(CONFIG_PATH);
|
|
37
|
+
break;
|
|
38
|
+
|
|
39
|
+
case "edit":
|
|
40
|
+
await editConfig();
|
|
41
|
+
break;
|
|
42
|
+
|
|
43
|
+
default:
|
|
44
|
+
// Default to show
|
|
45
|
+
showConfig(config);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function showConfig(config: Config): void {
|
|
50
|
+
console.log(pc.bold("AgentMesh Configuration\n"));
|
|
51
|
+
console.log(pc.dim(`Path: ${CONFIG_PATH}\n`));
|
|
52
|
+
|
|
53
|
+
// Show main settings
|
|
54
|
+
console.log(`hubUrl: ${pc.cyan(config.hubUrl)}`);
|
|
55
|
+
console.log(`workspace: ${pc.cyan(config.workspace)}`);
|
|
56
|
+
console.log(`apiKey: ${pc.dim(maskApiKey(config.apiKey))}`);
|
|
57
|
+
|
|
58
|
+
// Show defaults
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(pc.dim("Defaults:"));
|
|
61
|
+
console.log(` command: ${config.defaults.command}`);
|
|
62
|
+
console.log(` model: ${config.defaults.model}`);
|
|
63
|
+
|
|
64
|
+
// Show agents
|
|
65
|
+
if (config.agents.length > 0) {
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(pc.dim("Agent Configs:"));
|
|
68
|
+
for (const agent of config.agents) {
|
|
69
|
+
console.log(` ${agent.name}:`);
|
|
70
|
+
if (agent.command) console.log(` command: ${agent.command}`);
|
|
71
|
+
if (agent.model) console.log(` model: ${agent.model}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getConfigValue(config: Config, key: string): void {
|
|
77
|
+
const parts = key.split(".");
|
|
78
|
+
let value: unknown = config;
|
|
79
|
+
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
if (value && typeof value === "object" && part in value) {
|
|
82
|
+
value = (value as Record<string, unknown>)[part];
|
|
83
|
+
} else {
|
|
84
|
+
console.log(pc.red(`Key "${key}" not found.`));
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof value === "object") {
|
|
90
|
+
console.log(JSON.stringify(value, null, 2));
|
|
91
|
+
} else {
|
|
92
|
+
console.log(String(value));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function setConfigValue(config: Config, key: string, value: string): void {
|
|
97
|
+
const parts = key.split(".");
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
99
|
+
let target: any = config;
|
|
100
|
+
|
|
101
|
+
// Navigate to parent
|
|
102
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
103
|
+
const part = parts[i];
|
|
104
|
+
if (!(part in target)) {
|
|
105
|
+
target[part] = {};
|
|
106
|
+
}
|
|
107
|
+
target = target[part];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const finalKey = parts[parts.length - 1];
|
|
111
|
+
const oldValue = target[finalKey];
|
|
112
|
+
|
|
113
|
+
// Try to parse as JSON, otherwise use string
|
|
114
|
+
try {
|
|
115
|
+
target[finalKey] = JSON.parse(value);
|
|
116
|
+
} catch {
|
|
117
|
+
target[finalKey] = value;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
saveConfig(config);
|
|
121
|
+
|
|
122
|
+
console.log(pc.green(`Set ${key}:`));
|
|
123
|
+
console.log(` Old: ${pc.dim(String(oldValue))}`);
|
|
124
|
+
console.log(` New: ${pc.cyan(String(target[finalKey]))}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function editConfig(): Promise<void> {
|
|
128
|
+
const { spawn } = await import("node:child_process");
|
|
129
|
+
const editor = process.env.EDITOR || process.env.VISUAL || "vi";
|
|
130
|
+
|
|
131
|
+
console.log(pc.dim(`Opening ${CONFIG_PATH} with ${editor}...`));
|
|
132
|
+
|
|
133
|
+
const child = spawn(editor, [CONFIG_PATH], {
|
|
134
|
+
stdio: "inherit",
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
child.on("exit", (code) => {
|
|
138
|
+
if (code === 0) {
|
|
139
|
+
console.log(pc.green("Config saved."));
|
|
140
|
+
}
|
|
141
|
+
process.exit(code ?? 0);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function maskApiKey(key: string): string {
|
|
146
|
+
if (!key || key.length < 12) return "***";
|
|
147
|
+
return `${key.slice(0, 8)}...${key.slice(-4)}`;
|
|
148
|
+
}
|
package/src/cli/index.ts
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
import { createRequire } from "node:module";
|
|
3
4
|
import { Command } from "commander";
|
|
4
5
|
import pc from "picocolors";
|
|
5
6
|
import { attach } from "./attach.js";
|
|
7
|
+
import { configCmd } from "./config.js";
|
|
6
8
|
import { init } from "./init.js";
|
|
7
9
|
import { list } from "./list.js";
|
|
10
|
+
import { logs } from "./logs.js";
|
|
8
11
|
import { nudge } from "./nudge.js";
|
|
12
|
+
import { restart } from "./restart.js";
|
|
9
13
|
import { start } from "./start.js";
|
|
14
|
+
import { status } from "./status.js";
|
|
10
15
|
import { stop } from "./stop.js";
|
|
11
16
|
import { token } from "./token.js";
|
|
12
17
|
import { whoami } from "./whoami.js";
|
|
13
18
|
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
const pkg = require("../../package.json") as { version: string };
|
|
21
|
+
|
|
14
22
|
const program = new Command();
|
|
15
23
|
|
|
16
24
|
program
|
|
17
25
|
.name("agentmesh")
|
|
18
26
|
.description("AgentMesh Agent Wrapper - Turn any AI assistant into a dispatchable agent")
|
|
19
|
-
.version(
|
|
27
|
+
.version(pkg.version);
|
|
20
28
|
|
|
21
29
|
program
|
|
22
30
|
.command("init")
|
|
@@ -127,4 +135,59 @@ program
|
|
|
127
135
|
}
|
|
128
136
|
});
|
|
129
137
|
|
|
138
|
+
program
|
|
139
|
+
.command("status")
|
|
140
|
+
.description("Show AgentMesh status and health")
|
|
141
|
+
.action(async () => {
|
|
142
|
+
try {
|
|
143
|
+
await status();
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error(pc.red((error as Error).message));
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
program
|
|
151
|
+
.command("logs")
|
|
152
|
+
.description("View agent session logs")
|
|
153
|
+
.argument("<name>", "Agent name")
|
|
154
|
+
.option("-f, --follow", "Follow log output (attach read-only)")
|
|
155
|
+
.option("-n, --lines <number>", "Number of lines to show", "50")
|
|
156
|
+
.action(async (name, options) => {
|
|
157
|
+
try {
|
|
158
|
+
await logs(name, { follow: options.follow, lines: parseInt(options.lines, 10) });
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error(pc.red((error as Error).message));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
program
|
|
166
|
+
.command("restart")
|
|
167
|
+
.description("Restart an agent (preserves agent ID)")
|
|
168
|
+
.argument("<name>", "Agent name")
|
|
169
|
+
.action(async (name) => {
|
|
170
|
+
try {
|
|
171
|
+
await restart(name);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error(pc.red((error as Error).message));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
program
|
|
179
|
+
.command("config")
|
|
180
|
+
.description("View or edit configuration")
|
|
181
|
+
.argument("[action]", "Action: show (default), get, set, edit, path")
|
|
182
|
+
.argument("[key]", "Config key (for get/set)")
|
|
183
|
+
.argument("[value]", "Config value (for set)")
|
|
184
|
+
.action(async (action, key, value) => {
|
|
185
|
+
try {
|
|
186
|
+
await configCmd(action || "show", key, value);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
console.error(pc.red((error as Error).message));
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
130
193
|
program.parse();
|
package/src/cli/logs.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { getAgentState, loadConfig } from "../config/loader.js";
|
|
4
|
+
import { getSessionName, sessionExists } from "../core/tmux.js";
|
|
5
|
+
|
|
6
|
+
export async function logs(
|
|
7
|
+
name: string,
|
|
8
|
+
options: { follow?: boolean; lines?: number },
|
|
9
|
+
): Promise<void> {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
|
|
12
|
+
if (!config) {
|
|
13
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const agent = getAgentState(name);
|
|
18
|
+
if (!agent) {
|
|
19
|
+
console.log(pc.red(`Agent "${name}" not found.`));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const sessionName = getSessionName(name);
|
|
24
|
+
if (!sessionExists(sessionName)) {
|
|
25
|
+
console.log(pc.red(`Session "${sessionName}" not running.`));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const lines = options.lines || 50;
|
|
30
|
+
|
|
31
|
+
// Capture pane content using tmux capture-pane
|
|
32
|
+
if (options.follow) {
|
|
33
|
+
// Follow mode - attach in view-only mode
|
|
34
|
+
console.log(pc.dim(`Following logs for "${name}"... (Ctrl+C to exit)`));
|
|
35
|
+
console.log(pc.dim("─".repeat(60)));
|
|
36
|
+
|
|
37
|
+
// Use tmux pipe-pane to stream output
|
|
38
|
+
const tmux = spawn("tmux", ["attach-session", "-t", sessionName, "-r"], {
|
|
39
|
+
stdio: "inherit",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
tmux.on("exit", (code) => {
|
|
43
|
+
process.exit(code ?? 0);
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
// Static mode - capture and print
|
|
47
|
+
try {
|
|
48
|
+
const { execSync } = await import("node:child_process");
|
|
49
|
+
|
|
50
|
+
// Capture the pane history
|
|
51
|
+
const output = execSync(`tmux capture-pane -t "${sessionName}" -p -S -${lines}`, {
|
|
52
|
+
encoding: "utf-8",
|
|
53
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
console.log(pc.dim(`Last ${lines} lines from "${name}":`));
|
|
57
|
+
console.log(pc.dim("─".repeat(60)));
|
|
58
|
+
console.log(output);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.log(pc.red(`Failed to capture logs: ${(error as Error).message}`));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { getAgentState, loadConfig } from "../config/loader.js";
|
|
3
|
+
import { destroySession, getSessionName, sessionExists } from "../core/tmux.js";
|
|
4
|
+
import { start } from "./start.js";
|
|
5
|
+
import { stop } from "./stop.js";
|
|
6
|
+
|
|
7
|
+
export async function restart(name: string): Promise<void> {
|
|
8
|
+
const config = loadConfig();
|
|
9
|
+
|
|
10
|
+
if (!config) {
|
|
11
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const agent = getAgentState(name);
|
|
16
|
+
if (!agent) {
|
|
17
|
+
console.log(pc.red(`Agent "${name}" not found in state.`));
|
|
18
|
+
console.log(pc.dim("Use 'agentmesh start' to create a new agent."));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
console.log(pc.dim(`Restarting agent "${name}"...`));
|
|
23
|
+
|
|
24
|
+
// Stop the agent (but preserve the agent ID for re-registration)
|
|
25
|
+
const sessionName = getSessionName(name);
|
|
26
|
+
if (sessionExists(sessionName)) {
|
|
27
|
+
console.log(pc.dim("Stopping current session..."));
|
|
28
|
+
await stop(name);
|
|
29
|
+
|
|
30
|
+
// Small delay to ensure clean shutdown
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Find agent config to get workdir and other settings
|
|
35
|
+
const agentConfig = config.agents.find((a) => a.name === name);
|
|
36
|
+
|
|
37
|
+
console.log(pc.dim("Starting new session..."));
|
|
38
|
+
|
|
39
|
+
// Start with the same settings, agent ID will be reused from state
|
|
40
|
+
await start({
|
|
41
|
+
name,
|
|
42
|
+
command: agentConfig?.command,
|
|
43
|
+
workdir: agentConfig?.workdir,
|
|
44
|
+
model: agentConfig?.model,
|
|
45
|
+
foreground: false,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
console.log(pc.green(`Agent "${name}" restarted.`));
|
|
49
|
+
console.log(pc.dim(`Agent ID preserved: ${agent.agentId}`));
|
|
50
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { loadConfig, loadState } from "../config/loader.js";
|
|
3
|
+
import { getSessionName, sessionExists } from "../core/tmux.js";
|
|
4
|
+
|
|
5
|
+
interface HealthResponse {
|
|
6
|
+
status: string;
|
|
7
|
+
service?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function status(): Promise<void> {
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
|
|
14
|
+
if (!config) {
|
|
15
|
+
console.log(pc.red("No config found. Run 'agentmesh init' first."));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
console.log(pc.bold("AgentMesh Status\n"));
|
|
20
|
+
|
|
21
|
+
// Check hub connectivity
|
|
22
|
+
console.log(pc.dim("Hub:"));
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(`${config.hubUrl}/health`, {
|
|
25
|
+
signal: AbortSignal.timeout(5000),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (response.ok) {
|
|
29
|
+
const data = (await response.json()) as HealthResponse;
|
|
30
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
31
|
+
console.log(` Status: ${pc.green("connected")}`);
|
|
32
|
+
if (data.version) {
|
|
33
|
+
console.log(` Version: ${pc.dim(data.version)}`);
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
37
|
+
console.log(` Status: ${pc.yellow(`HTTP ${response.status}`)}`);
|
|
38
|
+
}
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.log(` URL: ${pc.cyan(config.hubUrl)}`);
|
|
41
|
+
console.log(` Status: ${pc.red("unreachable")}`);
|
|
42
|
+
console.log(` Error: ${pc.dim((error as Error).message)}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Check local agents
|
|
46
|
+
const state = loadState();
|
|
47
|
+
const runningAgents = state.agents.filter((a) => {
|
|
48
|
+
if (!a.pid) return false;
|
|
49
|
+
try {
|
|
50
|
+
process.kill(a.pid, 0);
|
|
51
|
+
return sessionExists(getSessionName(a.name));
|
|
52
|
+
} catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
console.log();
|
|
58
|
+
console.log(pc.dim("Local Agents:"));
|
|
59
|
+
console.log(` Running: ${pc.cyan(String(runningAgents.length))}`);
|
|
60
|
+
console.log(` Total: ${pc.dim(String(state.agents.length))}`);
|
|
61
|
+
|
|
62
|
+
if (runningAgents.length > 0) {
|
|
63
|
+
console.log(` Names: ${pc.dim(runningAgents.map((a) => a.name).join(", "))}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Check tmux
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(pc.dim("Dependencies:"));
|
|
69
|
+
try {
|
|
70
|
+
const { execSync } = await import("node:child_process");
|
|
71
|
+
const tmuxVersion = execSync("tmux -V", { encoding: "utf-8" }).trim();
|
|
72
|
+
console.log(` tmux: ${pc.green(tmuxVersion)}`);
|
|
73
|
+
} catch {
|
|
74
|
+
console.log(` tmux: ${pc.red("not found")}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Config info
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(pc.dim("Config:"));
|
|
80
|
+
console.log(` Workspace: ${pc.cyan(config.workspace)}`);
|
|
81
|
+
console.log(` Command: ${pc.dim(config.defaults.command)}`);
|
|
82
|
+
console.log(` Model: ${pc.dim(config.defaults.model)}`);
|
|
83
|
+
}
|