@agentmeshhq/agent 0.1.17 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/__tests__/orphan-process.test.d.ts +11 -0
- package/dist/__tests__/orphan-process.test.js +286 -0
- package/dist/__tests__/orphan-process.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +16 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/watchdog.test.js +138 -12
- package/dist/__tests__/watchdog.test.js.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/start.d.ts +2 -1
- package/dist/cli/start.js +6 -3
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.js +11 -0
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/stop.js +7 -2
- package/dist/cli/stop.js.map +1 -1
- package/dist/config/schema.d.ts +4 -2
- package/dist/core/daemon/assignment-message.d.ts +12 -0
- package/dist/core/daemon/assignment-message.js +36 -0
- package/dist/core/daemon/assignment-message.js.map +1 -0
- package/dist/core/daemon/bootstrap.d.ts +35 -0
- package/dist/core/daemon/bootstrap.js +52 -0
- package/dist/core/daemon/bootstrap.js.map +1 -0
- package/dist/core/daemon/crash-log.d.ts +16 -0
- package/dist/core/daemon/crash-log.js +24 -0
- package/dist/core/daemon/crash-log.js.map +1 -0
- package/dist/core/daemon/health-policy.d.ts +21 -0
- package/dist/core/daemon/health-policy.js +32 -0
- package/dist/core/daemon/health-policy.js.map +1 -0
- package/dist/core/daemon/sandbox-config.d.ts +9 -0
- package/dist/core/daemon/sandbox-config.js +17 -0
- package/dist/core/daemon/sandbox-config.js.map +1 -0
- package/dist/core/daemon/state.d.ts +33 -0
- package/dist/core/daemon/state.js +77 -0
- package/dist/core/daemon/state.js.map +1 -0
- package/dist/core/daemon/tmux-session.d.ts +17 -0
- package/dist/core/daemon/tmux-session.js +34 -0
- package/dist/core/daemon/tmux-session.js.map +1 -0
- package/dist/core/daemon/workspace.d.ts +10 -0
- package/dist/core/daemon/workspace.js +51 -0
- package/dist/core/daemon/workspace.js.map +1 -0
- package/dist/core/daemon.d.ts +4 -7
- package/dist/core/daemon.js +143 -259
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/injector.js +6 -0
- package/dist/core/injector.js.map +1 -1
- package/dist/core/registry.js +1 -1
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner/build.d.ts +9 -0
- package/dist/core/runner/build.js +53 -0
- package/dist/core/runner/build.js.map +1 -0
- package/dist/core/runner/detect.d.ts +5 -0
- package/dist/core/runner/detect.js +14 -0
- package/dist/core/runner/detect.js.map +1 -0
- package/dist/core/runner/index.d.ts +5 -0
- package/dist/core/runner/index.js +5 -0
- package/dist/core/runner/index.js.map +1 -0
- package/dist/core/runner/model.d.ts +5 -0
- package/dist/core/runner/model.js +7 -0
- package/dist/core/runner/model.js.map +1 -0
- package/dist/core/runner/opencode-models.d.ts +15 -0
- package/dist/core/runner/opencode-models.js +70 -0
- package/dist/core/runner/opencode-models.js.map +1 -0
- package/dist/core/runner/types.d.ts +19 -0
- package/dist/core/runner/types.js +8 -0
- package/dist/core/runner/types.js.map +1 -0
- package/dist/core/runner.d.ts +5 -47
- package/dist/core/runner.js +5 -167
- package/dist/core/runner.js.map +1 -1
- package/dist/core/tmux-runtime.d.ts +13 -0
- package/dist/core/tmux-runtime.js +72 -0
- package/dist/core/tmux-runtime.js.map +1 -0
- package/dist/core/tmux.d.ts +7 -1
- package/dist/core/tmux.js +75 -45
- package/dist/core/tmux.js.map +1 -1
- package/dist/core/watchdog.d.ts +18 -1
- package/dist/core/watchdog.js +78 -29
- package/dist/core/watchdog.js.map +1 -1
- package/package.json +30 -11
- package/dist/cli/inbox.d.ts +0 -5
- package/dist/cli/inbox.js +0 -123
- package/dist/cli/inbox.js.map +0 -1
- package/dist/cli/issue.d.ts +0 -42
- package/dist/cli/issue.js +0 -297
- package/dist/cli/issue.js.map +0 -1
- package/dist/cli/ready.d.ts +0 -5
- package/dist/cli/ready.js +0 -131
- package/dist/cli/ready.js.map +0 -1
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +0 -154
- package/dist/cli/sync.js.map +0 -1
- package/dist/core/issue-cache.d.ts +0 -44
- package/dist/core/issue-cache.js +0 -75
- package/dist/core/issue-cache.js.map +0 -1
- package/src/__tests__/context.test.ts +0 -464
- package/src/__tests__/injector.test.ts +0 -29
- package/src/__tests__/jwt.test.ts +0 -112
- package/src/__tests__/loader.test.ts +0 -239
- package/src/__tests__/runner.test.ts +0 -104
- package/src/__tests__/sandbox.test.ts +0 -435
- package/src/__tests__/watchdog.test.ts +0 -368
- package/src/cli/attach.ts +0 -22
- package/src/cli/build.ts +0 -145
- package/src/cli/config.ts +0 -148
- package/src/cli/context.ts +0 -231
- package/src/cli/deploy.ts +0 -155
- package/src/cli/index.ts +0 -375
- package/src/cli/init.ts +0 -75
- package/src/cli/list.ts +0 -70
- package/src/cli/local.ts +0 -183
- package/src/cli/logs.ts +0 -64
- package/src/cli/migrate.ts +0 -212
- package/src/cli/nudge.ts +0 -81
- package/src/cli/restart.ts +0 -59
- package/src/cli/slack.ts +0 -70
- package/src/cli/start.ts +0 -115
- package/src/cli/status.ts +0 -91
- package/src/cli/stop.ts +0 -48
- package/src/cli/test.ts +0 -143
- package/src/cli/token.ts +0 -188
- package/src/cli/whoami.ts +0 -142
- package/src/config/loader.ts +0 -121
- package/src/config/schema.ts +0 -68
- package/src/context/handoff.ts +0 -122
- package/src/context/index.ts +0 -8
- package/src/context/schema.ts +0 -111
- package/src/context/storage.ts +0 -197
- package/src/core/daemon.ts +0 -1308
- package/src/core/heartbeat.ts +0 -129
- package/src/core/injector.ts +0 -292
- package/src/core/registry.ts +0 -159
- package/src/core/runner.ts +0 -225
- package/src/core/sandbox.ts +0 -547
- package/src/core/session-id.ts +0 -111
- package/src/core/tmux.ts +0 -405
- package/src/core/watchdog.ts +0 -238
- package/src/core/websocket.ts +0 -94
- package/src/index.ts +0 -10
- package/src/utils/jwt.ts +0 -87
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -12
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { addAgentToState } from "../../config/loader.js";
|
|
3
|
+
import { getSessionName } from "../tmux.js";
|
|
4
|
+
/**
|
|
5
|
+
* Get the PID of the foreground process running in a tmux pane.
|
|
6
|
+
* Returns null if session doesn't exist or PID can't be determined.
|
|
7
|
+
*/
|
|
8
|
+
export function getTmuxPanePid(sessionName) {
|
|
9
|
+
try {
|
|
10
|
+
const result = execSync(`tmux list-panes -t "${sessionName}" -F '#{pane_pid}' 2>/dev/null`, {
|
|
11
|
+
encoding: "utf-8",
|
|
12
|
+
});
|
|
13
|
+
const pid = parseInt(result.trim(), 10);
|
|
14
|
+
return Number.isNaN(pid) ? null : pid;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Recursively get all descendant PIDs of a process (process tree).
|
|
22
|
+
* Returns empty array if the process has no children or doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export function getProcessTree(pid) {
|
|
25
|
+
try {
|
|
26
|
+
const result = execSync(`pgrep -P ${pid} 2>/dev/null`, { encoding: "utf-8" });
|
|
27
|
+
const childPids = result
|
|
28
|
+
.trim()
|
|
29
|
+
.split("\n")
|
|
30
|
+
.map((p) => parseInt(p, 10))
|
|
31
|
+
.filter((p) => !Number.isNaN(p) && p > 0);
|
|
32
|
+
const allDescendants = [...childPids];
|
|
33
|
+
for (const childPid of childPids) {
|
|
34
|
+
allDescendants.push(...getProcessTree(childPid));
|
|
35
|
+
}
|
|
36
|
+
return allDescendants;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Capture all PIDs for a running agent: the tmux pane process + full process tree.
|
|
44
|
+
* This includes the opencode process and any LSP servers it spawned.
|
|
45
|
+
*/
|
|
46
|
+
export function captureAgentChildPids(agentName) {
|
|
47
|
+
const sessionName = getSessionName(agentName);
|
|
48
|
+
const panePid = getTmuxPanePid(sessionName);
|
|
49
|
+
if (!panePid) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const pids = [panePid, ...getProcessTree(panePid)];
|
|
53
|
+
// Deduplicate
|
|
54
|
+
return [...new Set(pids)];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Persists daemon runtime state for status/attach/restart operations.
|
|
58
|
+
*/
|
|
59
|
+
export function persistRunningState(input) {
|
|
60
|
+
const sessionName = input.serveMode
|
|
61
|
+
? `serve:${input.servePort}`
|
|
62
|
+
: getSessionName(input.agentName);
|
|
63
|
+
addAgentToState({
|
|
64
|
+
name: input.agentName,
|
|
65
|
+
agentId: input.agentId,
|
|
66
|
+
pid: input.pid,
|
|
67
|
+
tmuxSession: sessionName,
|
|
68
|
+
startedAt: new Date().toISOString(),
|
|
69
|
+
token: input.token,
|
|
70
|
+
workdir: input.workdir,
|
|
71
|
+
assignedProject: input.assignedProject,
|
|
72
|
+
runtimeModel: input.runtimeModel,
|
|
73
|
+
runnerType: input.runnerType,
|
|
74
|
+
sandboxContainer: input.sandboxContainer,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SessionEnv } from "../tmux.js";
|
|
2
|
+
export interface StartTmuxSessionInput {
|
|
3
|
+
agentName: string;
|
|
4
|
+
agentId: string | null;
|
|
5
|
+
command: string;
|
|
6
|
+
workdir?: string;
|
|
7
|
+
runnerEnv: SessionEnv;
|
|
8
|
+
shouldRestoreContext: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface StartTmuxSessionResult {
|
|
11
|
+
preStartSessionId?: string | null;
|
|
12
|
+
attemptedResumeSessionId?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Starts or reconnects to the interactive tmux runtime session.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startTmuxRuntimeSession(input: StartTmuxSessionInput): StartTmuxSessionResult;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { loadContext } from "../../context/index.js";
|
|
2
|
+
import { snapshotSessionId } from "../session-id.js";
|
|
3
|
+
import { createSession, getSessionName, sessionExists, updateSessionEnvironment, } from "../tmux.js";
|
|
4
|
+
/**
|
|
5
|
+
* Starts or reconnects to the interactive tmux runtime session.
|
|
6
|
+
*/
|
|
7
|
+
export function startTmuxRuntimeSession(input) {
|
|
8
|
+
const sessionName = getSessionName(input.agentName);
|
|
9
|
+
const alreadyExists = sessionExists(sessionName);
|
|
10
|
+
if (!alreadyExists) {
|
|
11
|
+
let savedSessionId;
|
|
12
|
+
if (input.shouldRestoreContext && input.agentId) {
|
|
13
|
+
const savedContext = loadContext(input.agentId);
|
|
14
|
+
savedSessionId = savedContext?.custom?.opencodeSessionId;
|
|
15
|
+
if (savedSessionId) {
|
|
16
|
+
console.log(`[CONTEXT] Found saved OpenCode session ID: ${savedSessionId}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const preStartSessionId = snapshotSessionId(input.agentName);
|
|
20
|
+
console.log(`Creating tmux session: ${sessionName}`);
|
|
21
|
+
const created = createSession(input.agentName, input.command, input.workdir, input.runnerEnv, savedSessionId);
|
|
22
|
+
if (!created) {
|
|
23
|
+
throw new Error("Failed to create tmux session");
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
preStartSessionId,
|
|
27
|
+
attemptedResumeSessionId: savedSessionId,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
console.log(`Reconnecting to existing session: ${sessionName}`);
|
|
31
|
+
updateSessionEnvironment(input.agentName, input.runnerEnv);
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=tmux-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux-session.js","sourceRoot":"","sources":["../../../src/core/daemon/tmux-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,aAAa,EACb,cAAc,EAEd,aAAa,EACb,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,cAAkC,CAAC;QAEvC,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChD,cAAc,GAAG,YAAY,EAAE,MAAM,EAAE,iBAAuC,CAAC;YAC/E,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,8CAA8C,cAAc,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,aAAa,CAC3B,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,cAAc,CACf,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO;YACL,iBAAiB;YACjB,wBAAwB,EAAE,cAAc;SACzC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;IAChE,wBAAwB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface WorkspaceSetupInput {
|
|
2
|
+
workspacePath: string;
|
|
3
|
+
repoUrl: string;
|
|
4
|
+
defaultBranch: string;
|
|
5
|
+
projectName: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Ensures a project workspace exists and is on the target default branch.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupWorkspace(input: WorkspaceSetupInput): string;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Ensures a project workspace exists and is on the target default branch.
|
|
6
|
+
*/
|
|
7
|
+
export function setupWorkspace(input) {
|
|
8
|
+
const { workspacePath, repoUrl, defaultBranch, projectName } = input;
|
|
9
|
+
console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
10
|
+
console.log(`🔧 AUTO-SETUP: Setting up workspace for ${projectName}`);
|
|
11
|
+
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
|
|
12
|
+
const gitDir = path.join(workspacePath, ".git");
|
|
13
|
+
if (fs.existsSync(gitDir)) {
|
|
14
|
+
console.log(`✓ Workspace already exists: ${workspacePath}`);
|
|
15
|
+
console.log(" Updating from remote...");
|
|
16
|
+
try {
|
|
17
|
+
execSync("git fetch origin", { cwd: workspacePath, stdio: "inherit" });
|
|
18
|
+
execSync(`git checkout ${defaultBranch}`, { cwd: workspacePath, stdio: "inherit" });
|
|
19
|
+
execSync(`git pull origin ${defaultBranch}`, { cwd: workspacePath, stdio: "inherit" });
|
|
20
|
+
console.log("✓ Workspace updated successfully\n");
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.warn(`⚠ Could not update workspace: ${error.message}`);
|
|
24
|
+
console.log(" Continuing with existing state...\n");
|
|
25
|
+
}
|
|
26
|
+
return workspacePath;
|
|
27
|
+
}
|
|
28
|
+
const parentDir = path.dirname(workspacePath);
|
|
29
|
+
if (!fs.existsSync(parentDir)) {
|
|
30
|
+
console.log(`Creating directory: ${parentDir}`);
|
|
31
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
console.log("Cloning repository...");
|
|
34
|
+
console.log(` URL: ${repoUrl}`);
|
|
35
|
+
console.log(` Path: ${workspacePath}`);
|
|
36
|
+
console.log(` Branch: ${defaultBranch}\n`);
|
|
37
|
+
try {
|
|
38
|
+
execSync(`git clone --branch ${defaultBranch} "${repoUrl}" "${workspacePath}"`, {
|
|
39
|
+
stdio: "inherit",
|
|
40
|
+
});
|
|
41
|
+
console.log("\n✓ Repository cloned successfully");
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(`\n✗ Failed to clone repository: ${error.message}`);
|
|
45
|
+
console.error("\nMake sure you have access to the repository and SSH keys are configured.");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
console.log(`✓ Workspace ready: ${workspacePath}\n`);
|
|
49
|
+
return workspacePath;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/core/daemon/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,2CAA2C,WAAW,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;IAElG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACvE,QAAQ,CAAC,gBAAgB,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACpF,QAAQ,CAAC,mBAAmB,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;QAChD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,aAAa,aAAa,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,aAAa,KAAK,OAAO,MAAM,aAAa,GAAG,EAAE;YAC9E,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,IAAI,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/dist/core/daemon.d.ts
CHANGED
|
@@ -4,8 +4,10 @@ export interface DaemonOptions {
|
|
|
4
4
|
workdir?: string;
|
|
5
5
|
model?: string;
|
|
6
6
|
daemonize?: boolean;
|
|
7
|
-
/** Whether to restore context from previous session (default:
|
|
7
|
+
/** Whether to restore context from previous session (default: false) */
|
|
8
8
|
restoreContext?: boolean;
|
|
9
|
+
/** Only send nudges/restart for worker agents (default: false) */
|
|
10
|
+
worker?: boolean;
|
|
9
11
|
/** Auto-clone repository for project assignments */
|
|
10
12
|
autoSetup?: boolean;
|
|
11
13
|
/** Run opencode serve instead of tmux TUI (for Integration Service) */
|
|
@@ -33,6 +35,7 @@ export declare class AgentDaemon {
|
|
|
33
35
|
private isRunning;
|
|
34
36
|
private assignedProject;
|
|
35
37
|
private shouldRestoreContext;
|
|
38
|
+
private isWorkerAgent;
|
|
36
39
|
private autoSetup;
|
|
37
40
|
private serveMode;
|
|
38
41
|
private servePort;
|
|
@@ -43,7 +46,6 @@ export declare class AgentDaemon {
|
|
|
43
46
|
private sandboxMemory;
|
|
44
47
|
private sandbox;
|
|
45
48
|
private healthCheckInterval;
|
|
46
|
-
private serverContext;
|
|
47
49
|
private _preStartSessionId;
|
|
48
50
|
private _attemptedResumeSessionId;
|
|
49
51
|
private restartCount;
|
|
@@ -93,11 +95,6 @@ export declare class AgentDaemon {
|
|
|
93
95
|
* Uses project.workdir from HQ as source of truth, falls back to helpful instructions
|
|
94
96
|
*/
|
|
95
97
|
private checkAssignments;
|
|
96
|
-
/**
|
|
97
|
-
* Sets up workspace by cloning repository or using existing clone
|
|
98
|
-
* Returns the absolute path to the workspace
|
|
99
|
-
*/
|
|
100
|
-
private setupWorkspace;
|
|
101
98
|
/**
|
|
102
99
|
* Ensures the sandbox OpenCode config exists
|
|
103
100
|
* Creates ~/.agentmesh/opencode-sandbox.json with permissive permissions and model
|