@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.
@@ -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":"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"}
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("0.1.4");
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,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,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,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,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,cAAc,CAAC,mBAAmB,EAAE,YAAY,CAAC;KACjD,MAAM,CAAC,yBAAyB,EAAE,oCAAoC,CAAC;KACvE,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;KACnD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,eAAe,CAAC;KAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mCAAmC,CAAC;KAChD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,UAAU,EAAE,uCAAuC,CAAC;KAC7D,MAAM,CAAC,mBAAmB,EAAE,YAAY,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uCAAuC,CAAC;KACpD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,UAAU,EAAE,8CAA8C,CAAC;KACpE,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;KAC7C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,MAAM,IAAI,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function logs(name: string, options: {
2
+ follow?: boolean;
3
+ lines?: number;
4
+ }): Promise<void>;
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,IAAY,EACZ,OAA6C;IAE7C,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,cAAc,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,WAAW,gBAAgB,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAElC,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,yCAAyC;QACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpC,sCAAsC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;YACtE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAExD,2BAA2B;YAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,WAAW,YAAY,KAAK,EAAE,EAAE;gBAC/E,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;aAC5B,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2BAA4B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentmeshhq/agent",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "AgentMesh Agent Wrapper - Turn any AI coding assistant into a dispatchable, nudge-able agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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("0.1.4");
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();
@@ -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
+ }