@agentmeshhq/agent 0.1.8 → 0.1.10
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/__tests__/runner.test.d.ts +1 -0
- package/dist/__tests__/runner.test.js +87 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/cli/index.js +5 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/restart.d.ts +3 -1
- package/dist/cli/restart.js +11 -3
- package/dist/cli/restart.js.map +1 -1
- package/dist/cli/start.d.ts +1 -0
- package/dist/cli/start.js +3 -0
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.js +7 -0
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/whoami.js +25 -0
- package/dist/cli/whoami.js.map +1 -1
- package/dist/config/schema.d.ts +5 -0
- package/dist/core/daemon.d.ts +14 -0
- package/dist/core/daemon.js +173 -17
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/registry.d.ts +26 -0
- package/dist/core/registry.js +18 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner.d.ts +49 -0
- package/dist/core/runner.js +148 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/tmux.d.ts +3 -0
- package/dist/core/tmux.js +23 -7
- package/dist/core/tmux.js.map +1 -1
- package/package.json +11 -11
- package/src/__tests__/runner.test.ts +105 -0
- package/src/cli/index.ts +5 -3
- package/src/cli/restart.ts +12 -3
- package/src/cli/start.ts +3 -0
- package/src/cli/status.ts +8 -0
- package/src/cli/whoami.ts +30 -1
- package/src/config/schema.ts +6 -0
- package/src/core/daemon.ts +223 -20
- package/src/core/registry.ts +57 -16
- package/src/core/runner.ts +200 -0
- package/src/core/tmux.ts +28 -9
- package/LICENSE +0 -21
package/dist/core/tmux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/core/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,GAAG,cAAc,GAAG,SAAS,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,IAAI,CAAC;QACH,QAAQ,CAAC,wBAAwB,WAAW,eAAe,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/core/tmux.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentmeshhq/agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
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",
|
|
7
7
|
"bin": {
|
|
8
8
|
"agentmesh": "dist/cli/index.js"
|
|
9
9
|
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
12
|
+
"build": "tsc -p tsconfig.json",
|
|
13
|
+
"lint": "biome check src",
|
|
14
|
+
"start": "node dist/cli/index.js",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:watch": "vitest"
|
|
17
|
+
},
|
|
10
18
|
"dependencies": {
|
|
11
19
|
"commander": "^12.0.0",
|
|
12
20
|
"picocolors": "^1.0.0",
|
|
@@ -25,13 +33,5 @@
|
|
|
25
33
|
"opencode"
|
|
26
34
|
],
|
|
27
35
|
"author": "AgentMesh",
|
|
28
|
-
"license": "MIT"
|
|
29
|
-
|
|
30
|
-
"dev": "tsx watch src/cli/index.ts",
|
|
31
|
-
"build": "tsc -p tsconfig.json",
|
|
32
|
-
"lint": "biome check src",
|
|
33
|
-
"start": "node dist/cli/index.js",
|
|
34
|
-
"test": "vitest run",
|
|
35
|
-
"test:watch": "vitest"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
36
|
+
"license": "MIT"
|
|
37
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
buildRunnerConfig,
|
|
4
|
+
detectRunner,
|
|
5
|
+
getRunnerDisplayName,
|
|
6
|
+
type RunnerType,
|
|
7
|
+
resolveModel,
|
|
8
|
+
} from "../core/runner.js";
|
|
9
|
+
|
|
10
|
+
describe("Runner Module", () => {
|
|
11
|
+
describe("detectRunner", () => {
|
|
12
|
+
it("should detect opencode runner", () => {
|
|
13
|
+
expect(detectRunner("opencode")).toBe("opencode");
|
|
14
|
+
expect(detectRunner("opencode --some-flag")).toBe("opencode");
|
|
15
|
+
expect(detectRunner("OPENCODE")).toBe("opencode");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should detect claude runner", () => {
|
|
19
|
+
expect(detectRunner("claude")).toBe("claude");
|
|
20
|
+
expect(detectRunner("claude --some-flag")).toBe("claude");
|
|
21
|
+
expect(detectRunner("CLAUDE")).toBe("claude");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("should detect custom runner for unknown commands", () => {
|
|
25
|
+
expect(detectRunner("aider")).toBe("custom");
|
|
26
|
+
expect(detectRunner("cursor")).toBe("custom");
|
|
27
|
+
expect(detectRunner("my-custom-tool")).toBe("custom");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe("resolveModel", () => {
|
|
32
|
+
it("should prioritize CLI model over all others", () => {
|
|
33
|
+
const result = resolveModel({
|
|
34
|
+
cliModel: "cli-model",
|
|
35
|
+
agentModel: "agent-model",
|
|
36
|
+
defaultModel: "default-model",
|
|
37
|
+
command: "opencode",
|
|
38
|
+
});
|
|
39
|
+
expect(result).toBe("cli-model");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("should use agent model when CLI not provided", () => {
|
|
43
|
+
const result = resolveModel({
|
|
44
|
+
agentModel: "agent-model",
|
|
45
|
+
defaultModel: "default-model",
|
|
46
|
+
command: "opencode",
|
|
47
|
+
});
|
|
48
|
+
expect(result).toBe("agent-model");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should fall back to default model", () => {
|
|
52
|
+
const result = resolveModel({
|
|
53
|
+
defaultModel: "default-model",
|
|
54
|
+
command: "opencode",
|
|
55
|
+
});
|
|
56
|
+
expect(result).toBe("default-model");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("buildRunnerConfig", () => {
|
|
61
|
+
it("should build config for opencode with OPENCODE_MODEL env", () => {
|
|
62
|
+
const config = buildRunnerConfig({
|
|
63
|
+
cliModel: "claude-sonnet-4",
|
|
64
|
+
defaultModel: "claude-sonnet-4",
|
|
65
|
+
command: "opencode",
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
expect(config.type).toBe("opencode");
|
|
69
|
+
expect(config.model).toBe("claude-sonnet-4");
|
|
70
|
+
expect(config.env.OPENCODE_MODEL).toBeDefined();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should build config for claude with CLAUDE_MODEL env", () => {
|
|
74
|
+
const config = buildRunnerConfig({
|
|
75
|
+
cliModel: "claude-sonnet-4",
|
|
76
|
+
defaultModel: "claude-sonnet-4",
|
|
77
|
+
command: "claude",
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
expect(config.type).toBe("claude");
|
|
81
|
+
expect(config.model).toBe("claude-sonnet-4");
|
|
82
|
+
expect(config.env.CLAUDE_MODEL).toBe("claude-sonnet-4");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("should build config for custom runner without env vars", () => {
|
|
86
|
+
const config = buildRunnerConfig({
|
|
87
|
+
cliModel: "gpt-4",
|
|
88
|
+
defaultModel: "claude-sonnet-4",
|
|
89
|
+
command: "aider",
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(config.type).toBe("custom");
|
|
93
|
+
expect(config.model).toBe("gpt-4");
|
|
94
|
+
expect(Object.keys(config.env)).toHaveLength(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("getRunnerDisplayName", () => {
|
|
99
|
+
it("should return correct display names", () => {
|
|
100
|
+
expect(getRunnerDisplayName("opencode")).toBe("OpenCode");
|
|
101
|
+
expect(getRunnerDisplayName("claude")).toBe("Claude CLI");
|
|
102
|
+
expect(getRunnerDisplayName("custom")).toBe("Custom");
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
package/src/cli/index.ts
CHANGED
|
@@ -48,6 +48,7 @@ program
|
|
|
48
48
|
.option("-m, --model <model>", "Model identifier")
|
|
49
49
|
.option("-f, --foreground", "Run in foreground (blocking)")
|
|
50
50
|
.option("--no-context", "Start fresh without restoring previous context")
|
|
51
|
+
.option("--auto-setup", "Auto-clone repository for project assignments")
|
|
51
52
|
.action(async (options) => {
|
|
52
53
|
try {
|
|
53
54
|
await start(options);
|
|
@@ -166,11 +167,12 @@ program
|
|
|
166
167
|
|
|
167
168
|
program
|
|
168
169
|
.command("restart")
|
|
169
|
-
.description("Restart an agent (preserves agent ID)")
|
|
170
|
+
.description("Restart an agent (preserves agent ID and runtime model)")
|
|
170
171
|
.argument("<name>", "Agent name")
|
|
171
|
-
.
|
|
172
|
+
.option("-m, --model <model>", "Override the runtime model")
|
|
173
|
+
.action(async (name, options) => {
|
|
172
174
|
try {
|
|
173
|
-
await restart(name);
|
|
175
|
+
await restart(name, { model: options.model });
|
|
174
176
|
} catch (error) {
|
|
175
177
|
console.error(pc.red((error as Error).message));
|
|
176
178
|
process.exit(1);
|
package/src/cli/restart.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { destroySession, getSessionName, sessionExists } from "../core/tmux.js";
|
|
|
4
4
|
import { start } from "./start.js";
|
|
5
5
|
import { stop } from "./stop.js";
|
|
6
6
|
|
|
7
|
-
export async function restart(name: string): Promise<void> {
|
|
7
|
+
export async function restart(name: string, options?: { model?: string }): Promise<void> {
|
|
8
8
|
const config = loadConfig();
|
|
9
9
|
|
|
10
10
|
if (!config) {
|
|
@@ -21,6 +21,12 @@ export async function restart(name: string): Promise<void> {
|
|
|
21
21
|
|
|
22
22
|
console.log(pc.dim(`Restarting agent "${name}"...`));
|
|
23
23
|
|
|
24
|
+
// Preserve runtime model from previous session unless overridden
|
|
25
|
+
const preservedModel = options?.model || agent.runtimeModel;
|
|
26
|
+
if (preservedModel) {
|
|
27
|
+
console.log(pc.dim(`Preserving runtime model: ${preservedModel}`));
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
// Stop the agent (but preserve the agent ID for re-registration)
|
|
25
31
|
const sessionName = getSessionName(name);
|
|
26
32
|
if (sessionExists(sessionName)) {
|
|
@@ -36,15 +42,18 @@ export async function restart(name: string): Promise<void> {
|
|
|
36
42
|
|
|
37
43
|
console.log(pc.dim("Starting new session..."));
|
|
38
44
|
|
|
39
|
-
// Start with
|
|
45
|
+
// Start with preserved model (prioritize: CLI override > previous runtime > agent config)
|
|
40
46
|
await start({
|
|
41
47
|
name,
|
|
42
48
|
command: agentConfig?.command,
|
|
43
49
|
workdir: agentConfig?.workdir,
|
|
44
|
-
model: agentConfig?.model,
|
|
50
|
+
model: preservedModel || agentConfig?.model,
|
|
45
51
|
foreground: false,
|
|
46
52
|
});
|
|
47
53
|
|
|
48
54
|
console.log(pc.green(`Agent "${name}" restarted.`));
|
|
49
55
|
console.log(pc.dim(`Agent ID preserved: ${agent.agentId}`));
|
|
56
|
+
if (preservedModel) {
|
|
57
|
+
console.log(pc.dim(`Runtime model: ${preservedModel}`));
|
|
58
|
+
}
|
|
50
59
|
}
|
package/src/cli/start.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface StartOptions {
|
|
|
13
13
|
model?: string;
|
|
14
14
|
foreground?: boolean;
|
|
15
15
|
noContext?: boolean;
|
|
16
|
+
autoSetup?: boolean;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export async function start(options: StartOptions): Promise<void> {
|
|
@@ -44,6 +45,7 @@ export async function start(options: StartOptions): Promise<void> {
|
|
|
44
45
|
const daemon = new AgentDaemon({
|
|
45
46
|
...options,
|
|
46
47
|
restoreContext: !options.noContext,
|
|
48
|
+
autoSetup: options.autoSetup,
|
|
47
49
|
});
|
|
48
50
|
await daemon.start();
|
|
49
51
|
// Keep process alive
|
|
@@ -67,6 +69,7 @@ export async function start(options: StartOptions): Promise<void> {
|
|
|
67
69
|
if (options.workdir) args.push("--workdir", options.workdir);
|
|
68
70
|
if (options.model) args.push("--model", options.model);
|
|
69
71
|
if (options.noContext) args.push("--no-context");
|
|
72
|
+
if (options.autoSetup) args.push("--auto-setup");
|
|
70
73
|
|
|
71
74
|
// Spawn detached background process
|
|
72
75
|
const child = spawn("node", [cliPath, ...args], {
|
package/src/cli/status.ts
CHANGED
|
@@ -61,6 +61,14 @@ export async function status(): Promise<void> {
|
|
|
61
61
|
|
|
62
62
|
if (runningAgents.length > 0) {
|
|
63
63
|
console.log(` Names: ${pc.dim(runningAgents.map((a) => a.name).join(", "))}`);
|
|
64
|
+
|
|
65
|
+
// Show models for running agents
|
|
66
|
+
const modelsInfo = runningAgents
|
|
67
|
+
.filter((a) => a.runtimeModel)
|
|
68
|
+
.map((a) => `${a.name}:${a.runtimeModel}`);
|
|
69
|
+
if (modelsInfo.length > 0) {
|
|
70
|
+
console.log(` Models: ${pc.dim(modelsInfo.join(", "))}`);
|
|
71
|
+
}
|
|
64
72
|
}
|
|
65
73
|
|
|
66
74
|
// Check tmux
|
package/src/cli/whoami.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import pc from "picocolors";
|
|
2
2
|
import { loadConfig, loadState } from "../config/loader.js";
|
|
3
|
-
import {
|
|
3
|
+
import type { RunnerType } from "../config/schema.js";
|
|
4
|
+
import { getRunnerDisplayName } from "../core/runner.js";
|
|
5
|
+
import { getTokenExpiry } from "../utils/jwt.js";
|
|
4
6
|
|
|
5
7
|
export async function whoami(agentName?: string): Promise<void> {
|
|
6
8
|
const config = loadConfig();
|
|
@@ -23,11 +25,23 @@ export async function whoami(agentName?: string): Promise<void> {
|
|
|
23
25
|
const expiry = getTokenExpiry(envToken);
|
|
24
26
|
const expiryStr = formatExpiry(expiry);
|
|
25
27
|
|
|
28
|
+
// Try to find agent in state for runtime info
|
|
29
|
+
const agentState = state.agents.find((a) => a.agentId === envAgentId);
|
|
30
|
+
|
|
26
31
|
console.log(pc.bold("Current Agent"));
|
|
27
32
|
console.log(` ID: ${pc.cyan(envAgentId)}`);
|
|
28
33
|
console.log(` Workspace: ${pc.dim(config.workspace)}`);
|
|
29
34
|
console.log(` Token: ${expiryStr}`);
|
|
30
35
|
console.log(` Hub: ${pc.dim(config.hubUrl)}`);
|
|
36
|
+
|
|
37
|
+
// Show runtime model info if available
|
|
38
|
+
if (agentState?.runtimeModel) {
|
|
39
|
+
const runnerName = agentState.runnerType
|
|
40
|
+
? getRunnerDisplayName(agentState.runnerType as RunnerType)
|
|
41
|
+
: "Unknown";
|
|
42
|
+
console.log(` Model: ${pc.cyan(agentState.runtimeModel)}`);
|
|
43
|
+
console.log(` Runner: ${pc.dim(runnerName)}`);
|
|
44
|
+
}
|
|
31
45
|
return;
|
|
32
46
|
}
|
|
33
47
|
|
|
@@ -50,6 +64,12 @@ export async function whoami(agentName?: string): Promise<void> {
|
|
|
50
64
|
console.log(` ID: ${pc.dim(agent.agentId)}`);
|
|
51
65
|
console.log(` Status: ${running ? pc.green("running") : pc.yellow("stopped")}`);
|
|
52
66
|
console.log(` Token: ${expiryStr}`);
|
|
67
|
+
if (agent.runtimeModel) {
|
|
68
|
+
const runnerName = agent.runnerType
|
|
69
|
+
? getRunnerDisplayName(agent.runnerType as RunnerType)
|
|
70
|
+
: "Unknown";
|
|
71
|
+
console.log(` Model: ${pc.dim(agent.runtimeModel)} (${runnerName})`);
|
|
72
|
+
}
|
|
53
73
|
console.log();
|
|
54
74
|
}
|
|
55
75
|
return;
|
|
@@ -75,6 +95,15 @@ export async function whoami(agentName?: string): Promise<void> {
|
|
|
75
95
|
console.log(` Session: ${pc.dim(agent.tmuxSession || "none")}`);
|
|
76
96
|
console.log(` Started: ${pc.dim(agent.startedAt || "unknown")}`);
|
|
77
97
|
console.log(` Hub: ${pc.dim(config.hubUrl)}`);
|
|
98
|
+
|
|
99
|
+
// Show runtime model info
|
|
100
|
+
if (agent.runtimeModel) {
|
|
101
|
+
const runnerName = agent.runnerType
|
|
102
|
+
? getRunnerDisplayName(agent.runnerType as RunnerType)
|
|
103
|
+
: "Unknown";
|
|
104
|
+
console.log(` Model: ${pc.cyan(agent.runtimeModel)}`);
|
|
105
|
+
console.log(` Runner: ${pc.dim(runnerName)}`);
|
|
106
|
+
}
|
|
78
107
|
}
|
|
79
108
|
|
|
80
109
|
function formatExpiry(expiry: Date | null): string {
|
package/src/config/schema.ts
CHANGED
|
@@ -30,6 +30,8 @@ export const DEFAULT_CONFIG: Partial<Config> = {
|
|
|
30
30
|
export const CONFIG_PATH = `${process.env.HOME}/.agentmesh/config.json`;
|
|
31
31
|
export const STATE_PATH = `${process.env.HOME}/.agentmesh/state.json`;
|
|
32
32
|
|
|
33
|
+
export type RunnerType = "opencode" | "claude" | "custom";
|
|
34
|
+
|
|
33
35
|
export interface AgentState {
|
|
34
36
|
name: string;
|
|
35
37
|
agentId: string;
|
|
@@ -37,6 +39,10 @@ export interface AgentState {
|
|
|
37
39
|
tmuxSession: string;
|
|
38
40
|
startedAt: string;
|
|
39
41
|
token?: string;
|
|
42
|
+
/** The effective runtime model (resolved from CLI > agent > defaults) */
|
|
43
|
+
runtimeModel?: string;
|
|
44
|
+
/** The runner type (opencode, claude, custom) */
|
|
45
|
+
runnerType?: RunnerType;
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
export interface State {
|