@agentmeshhq/agent 0.1.16 → 0.1.17
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/attach.js +0 -19
- package/dist/cli/attach.js.map +1 -1
- package/dist/cli/nudge.js +0 -13
- package/dist/cli/nudge.js.map +1 -1
- package/dist/config/schema.d.ts +2 -0
- package/dist/core/daemon.d.ts +2 -0
- package/dist/core/daemon.js +134 -7
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/runner.js +5 -26
- package/dist/core/runner.js.map +1 -1
- package/dist/core/sandbox.js +2 -6
- package/dist/core/sandbox.js.map +1 -1
- package/dist/core/session-id.d.ts +30 -0
- package/dist/core/session-id.js +90 -0
- package/dist/core/session-id.js.map +1 -0
- package/dist/core/tmux.d.ts +1 -1
- package/dist/core/tmux.js +9 -1
- package/dist/core/tmux.js.map +1 -1
- package/dist/core/watchdog.js +2 -7
- package/dist/core/watchdog.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/attach.ts +0 -21
- package/src/cli/nudge.ts +0 -18
- package/src/config/schema.ts +2 -0
- package/src/core/daemon.ts +147 -5
- package/src/core/runner.ts +5 -28
- package/src/core/sandbox.ts +2 -5
- package/src/core/session-id.ts +111 -0
- package/src/core/tmux.ts +12 -0
- package/src/core/watchdog.ts +2 -7
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Session ID Utilities
|
|
3
|
+
*
|
|
4
|
+
* Parses OpenCode log files to extract the active session ID (ses_XXXXX).
|
|
5
|
+
* Used for native session resumption via `opencode --session <id> --continue`.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Gets the latest OpenCode session ID from agent log files.
|
|
9
|
+
*
|
|
10
|
+
* Parses log files in ~/.agentmesh/opencode-data/<agentName>/opencode/log/
|
|
11
|
+
* for the pattern: `service=session id=ses_XXXXX ... created`
|
|
12
|
+
*
|
|
13
|
+
* @returns The session ID string (e.g. "ses_365c3ec5bffeAV7qWirhNr1sU9") or null
|
|
14
|
+
*/
|
|
15
|
+
export declare function getLatestSessionId(agentName: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Waits for OpenCode to write a NEW session ID to logs (different from `previousId`).
|
|
18
|
+
* Polls log files up to `maxWaitMs` with `intervalMs` between checks.
|
|
19
|
+
*
|
|
20
|
+
* This solves the race condition where we read logs before OpenCode has started
|
|
21
|
+
* and see the old session ID, falsely concluding resume succeeded.
|
|
22
|
+
*
|
|
23
|
+
* @returns The new session ID, or null if timeout or no new session appeared
|
|
24
|
+
*/
|
|
25
|
+
export declare function waitForNewSessionId(agentName: string, previousId: string | null, maxWaitMs?: number, intervalMs?: number): Promise<string | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Snapshots the latest session ID BEFORE starting OpenCode.
|
|
28
|
+
* Used to detect whether OpenCode created a new session or resumed the requested one.
|
|
29
|
+
*/
|
|
30
|
+
export declare function snapshotSessionId(agentName: string): string | null;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Session ID Utilities
|
|
3
|
+
*
|
|
4
|
+
* Parses OpenCode log files to extract the active session ID (ses_XXXXX).
|
|
5
|
+
* Used for native session resumption via `opencode --session <id> --continue`.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import os from "node:os";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
const SESSION_ID_PATTERN = /service=session\s+id=(ses_[A-Za-z0-9]+)/;
|
|
11
|
+
function getLogDir(agentName) {
|
|
12
|
+
return path.join(os.homedir(), ".agentmesh", "opencode-data", agentName, "opencode", "log");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Gets the latest OpenCode session ID from agent log files.
|
|
16
|
+
*
|
|
17
|
+
* Parses log files in ~/.agentmesh/opencode-data/<agentName>/opencode/log/
|
|
18
|
+
* for the pattern: `service=session id=ses_XXXXX ... created`
|
|
19
|
+
*
|
|
20
|
+
* @returns The session ID string (e.g. "ses_365c3ec5bffeAV7qWirhNr1sU9") or null
|
|
21
|
+
*/
|
|
22
|
+
export function getLatestSessionId(agentName) {
|
|
23
|
+
const logDir = getLogDir(agentName);
|
|
24
|
+
if (!fs.existsSync(logDir)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
// List log files sorted by name (they're timestamped, so newest last)
|
|
29
|
+
const logFiles = fs
|
|
30
|
+
.readdirSync(logDir)
|
|
31
|
+
.filter((f) => f.endsWith(".log"))
|
|
32
|
+
.sort();
|
|
33
|
+
if (logFiles.length === 0) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
// Search from newest log file backwards
|
|
37
|
+
for (let i = logFiles.length - 1; i >= 0; i--) {
|
|
38
|
+
const logPath = path.join(logDir, logFiles[i]);
|
|
39
|
+
const content = fs.readFileSync(logPath, "utf-8");
|
|
40
|
+
// Find all session creation lines and take the last one
|
|
41
|
+
const lines = content.split("\n");
|
|
42
|
+
let lastSessionId = null;
|
|
43
|
+
for (const line of lines) {
|
|
44
|
+
if (line.includes("service=session") && line.includes("created")) {
|
|
45
|
+
const match = line.match(SESSION_ID_PATTERN);
|
|
46
|
+
if (match) {
|
|
47
|
+
lastSessionId = match[1];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (lastSessionId) {
|
|
52
|
+
return lastSessionId;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`[SESSION-ID] Failed to parse logs for ${agentName}:`, error);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Waits for OpenCode to write a NEW session ID to logs (different from `previousId`).
|
|
64
|
+
* Polls log files up to `maxWaitMs` with `intervalMs` between checks.
|
|
65
|
+
*
|
|
66
|
+
* This solves the race condition where we read logs before OpenCode has started
|
|
67
|
+
* and see the old session ID, falsely concluding resume succeeded.
|
|
68
|
+
*
|
|
69
|
+
* @returns The new session ID, or null if timeout or no new session appeared
|
|
70
|
+
*/
|
|
71
|
+
export async function waitForNewSessionId(agentName, previousId, maxWaitMs = 15000, intervalMs = 1000) {
|
|
72
|
+
const deadline = Date.now() + maxWaitMs;
|
|
73
|
+
while (Date.now() < deadline) {
|
|
74
|
+
const currentId = getLatestSessionId(agentName);
|
|
75
|
+
// If we see a different session ID than before, OpenCode has started
|
|
76
|
+
if (currentId && currentId !== previousId) {
|
|
77
|
+
return currentId;
|
|
78
|
+
}
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Snapshots the latest session ID BEFORE starting OpenCode.
|
|
85
|
+
* Used to detect whether OpenCode created a new session or resumed the requested one.
|
|
86
|
+
*/
|
|
87
|
+
export function snapshotSessionId(agentName) {
|
|
88
|
+
return getLatestSessionId(agentName);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=session-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-id.js","sourceRoot":"","sources":["../../src/core/session-id.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tmux.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface SessionEnv {
|
|
|
7
7
|
CLAUDE_MODEL?: string;
|
|
8
8
|
[key: string]: string | undefined;
|
|
9
9
|
}
|
|
10
|
-
export declare function createSession(agentName: string, command: string, workdir?: string, env?: SessionEnv): boolean;
|
|
10
|
+
export declare function createSession(agentName: string, command: string, workdir?: string, env?: SessionEnv, opencodeSessionId?: string): boolean;
|
|
11
11
|
export declare function setSessionEnvironment(sessionName: string, env: SessionEnv): boolean;
|
|
12
12
|
export declare function updateSessionEnvironment(agentName: string, env: SessionEnv): boolean;
|
|
13
13
|
export declare function destroySession(agentName: string): boolean;
|
package/dist/core/tmux.js
CHANGED
|
@@ -15,7 +15,7 @@ export function sessionExists(sessionName) {
|
|
|
15
15
|
return false;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
export function createSession(agentName, command, workdir, env) {
|
|
18
|
+
export function createSession(agentName, command, workdir, env, opencodeSessionId) {
|
|
19
19
|
const sessionName = getSessionName(agentName);
|
|
20
20
|
if (sessionExists(sessionName)) {
|
|
21
21
|
console.error(`Session ${sessionName} already exists`);
|
|
@@ -70,6 +70,14 @@ export function createSession(agentName, command, workdir, env) {
|
|
|
70
70
|
finalCommand = `${command} --model ${env.OPENCODE_MODEL}`;
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
+
// Append --session --continue flags for native session resume
|
|
74
|
+
if (opencodeSessionId &&
|
|
75
|
+
(finalCommand === "opencode" || finalCommand.startsWith("opencode ")) &&
|
|
76
|
+
!finalCommand.includes("--session") &&
|
|
77
|
+
!finalCommand.includes("--continue")) {
|
|
78
|
+
finalCommand = `${finalCommand} --session ${opencodeSessionId} --continue`;
|
|
79
|
+
console.log(`[TMUX] Resuming OpenCode session: ${opencodeSessionId}`);
|
|
80
|
+
}
|
|
73
81
|
const fullCommand = `${envPrefix}${finalCommand}`;
|
|
74
82
|
// Set reasonable terminal size for TUI applications
|
|
75
83
|
const args = ["new-session", "-d", "-s", sessionName, "-x", "200", "-y", "50"];
|
package/dist/core/tmux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/core/tmux.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/core/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,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;AAUD,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,OAAe,EACf,OAAgB,EAChB,GAAgB,EAChB,iBAA0B;IAE1B,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,WAAW,WAAW,iBAAiB,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,yEAAyE;QACzE,mEAAmE;QACnE,0DAA0D;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;QACvF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,4EAA4E;QAC5E,mFAAmF;QACnF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,OAAO,IAAI,CAAC,GAAG,CAAC;gBAChB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,0DAA0D;QAC1D,MAAM,SAAS,GAAe;YAC5B,aAAa,EAAE,YAAY;YAC3B,GAAG,GAAG;SACP,CAAC;QAEF,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,qCAAqC;gBACrC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACvC,CAAC;QAED,4DAA4D;QAC5D,IAAI,YAAY,GAAG,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE,cAAc,IAAI,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACvF,6CAA6C;YAC7C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7D,YAAY,GAAG,GAAG,OAAO,YAAY,GAAG,CAAC,cAAc,EAAE,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IACE,iBAAiB;YACjB,CAAC,YAAY,KAAK,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACrE,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YACnC,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EACpC,CAAC;YACD,YAAY,GAAG,GAAG,YAAY,cAAc,iBAAiB,aAAa,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,qCAAqC,iBAAiB,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,SAAS,GAAG,YAAY,EAAE,CAAC;QAElD,oDAAoD;QACpD,MAAM,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE/E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE3B,sEAAsE;QACtE,IAAI,GAAG,EAAE,CAAC;YACR,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,GAAe;IACxE,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,YAAY,CAAC,MAAM,EAAE,CAAC,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,GAAe;IACzE,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,WAAW,WAAW,iBAAiB,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,CAAC,eAAe;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,WAAW,GAAG,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAe;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,WAAW,WAAW,iBAAiB,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,2FAA2F;QAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEnD,kEAAkE;QAClE,mCAAmC;QACnC,YAAY,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3E,YAAY,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,WAAW,WAAW,iBAAiB,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mDAAmD;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;QAChE,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,yCAAyC,EAAE;YACjE,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,uBAAuB,WAAW,gCAAgC,EAAE;YAC3F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,aAAsB;IAEtB,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,oDAAoD;IACpD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,eAAe,GAAG,QAAQ,CAC9B,2CAA2C,aAAa,GAAG,EAC3D;gBACE,QAAQ,EAAE,OAAO;aAClB,CACF,CAAC,IAAI,EAAE,CAAC;YAET,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;gBAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;YAC7D,CAAC;YAED,gDAAgD;YAChD,MAAM,SAAS,GAAG,QAAQ,CACxB,gBAAgB,aAAa,0BAA0B,WAAW,6BAA6B,EAC/F,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;YAET,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;YACtE,CAAC;YAED,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,QAAQ,CACvB,gBAAgB,aAAa,yBAAyB,WAAW,iCAAiC,EAClG,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;YAET,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;YAC9D,CAAC;YAED,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;YAC3D,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,KAAK,EAAE,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACzD,CAAC;IAED,IAAI,CAAC;QACH,yDAAyD;QACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,WAAW,iCAAiC,EAAE;YAC7F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,KAAK,EAAE,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,4BAA4B,WAAW,6BAA6B,EAAE;YAC7F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,CAAC;QAE5C,uCAAuC;QACvC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,6CAA6C,EAAE;gBACxE,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,OAAO;aACb,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;YAChC,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,gCAAgC,EAAE;gBAC3D,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,OAAO;aACb,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,SAAS,EAAE,CAAC;gBACd,uBAAuB;gBACvB,OAAO,CAAC,SAAS;oBACf,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG;IACjE,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,WAAW,YAAY,KAAK,EAAE,EAAE;YAC/E,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/core/watchdog.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* Checks OpenCode logs for activity and tmux pane for permission prompts.
|
|
6
6
|
*/
|
|
7
7
|
import { execSync, spawnSync } from "node:child_process";
|
|
8
|
-
import fs from "node:fs";
|
|
9
8
|
import { captureSessionOutput } from "./tmux.js";
|
|
10
9
|
// Patterns that indicate a permission prompt is blocking the agent
|
|
11
10
|
const PERMISSION_PROMPT_PATTERNS = [
|
|
@@ -114,12 +113,8 @@ export function getLastActivityTime(agentName, containerName) {
|
|
|
114
113
|
logLine = result.stdout.trim();
|
|
115
114
|
}
|
|
116
115
|
else {
|
|
117
|
-
// Non-sandbox mode: read from
|
|
118
|
-
|
|
119
|
-
const agentLogDir = `${process.env.HOME}/.agentmesh/opencode-data/${agentName}/opencode/log`;
|
|
120
|
-
const sharedLogDir = `${process.env.HOME}/.local/share/opencode/log`;
|
|
121
|
-
// Prefer agent-specific logs, fall back to shared dir for backwards compatibility
|
|
122
|
-
const logDir = fs.existsSync(agentLogDir) ? agentLogDir : sharedLogDir;
|
|
116
|
+
// Non-sandbox mode: read from local logs
|
|
117
|
+
const logDir = `${process.env.HOME}/.local/share/opencode/log`;
|
|
123
118
|
const result = spawnSync("sh", ["-c", `ls -t ${logDir}/*.log 2>/dev/null | head -1 | xargs tail -1 2>/dev/null`], { encoding: "utf-8", timeout: 5000 });
|
|
124
119
|
if (result.status !== 0 || !result.stdout.trim()) {
|
|
125
120
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/core/watchdog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/core/watchdog.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/attach.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
1
|
import pc from "picocolors";
|
|
3
|
-
import { getAgentState } from "../config/loader.js";
|
|
4
2
|
import { attachSession, getSessionName, sessionExists } from "../core/tmux.js";
|
|
5
3
|
|
|
6
4
|
export function attach(name: string): void {
|
|
@@ -9,25 +7,6 @@ export function attach(name: string): void {
|
|
|
9
7
|
process.exit(1);
|
|
10
8
|
}
|
|
11
9
|
|
|
12
|
-
// Check if this is a sandbox agent
|
|
13
|
-
const localAgent = getAgentState(name);
|
|
14
|
-
|
|
15
|
-
if (localAgent?.sandboxContainer) {
|
|
16
|
-
// Sandbox agent - attach via docker exec
|
|
17
|
-
console.log(`Attaching to sandbox container ${localAgent.sandboxContainer}...`);
|
|
18
|
-
console.log(pc.dim("Detach with: Ctrl+B, D\n"));
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
execSync(`docker exec -it ${localAgent.sandboxContainer} agentmesh attach ${name}`, {
|
|
22
|
-
stdio: "inherit",
|
|
23
|
-
});
|
|
24
|
-
} catch {
|
|
25
|
-
// execSync throws on non-zero exit, but that's expected when detaching
|
|
26
|
-
}
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Host agent - attach via tmux
|
|
31
10
|
const sessionName = getSessionName(name);
|
|
32
11
|
|
|
33
12
|
if (!sessionExists(sessionName)) {
|
package/src/cli/nudge.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
1
|
import pc from "picocolors";
|
|
3
2
|
import { getAgentState, loadConfig, loadState } from "../config/loader.js";
|
|
4
3
|
import { registerAgent } from "../core/registry.js";
|
|
@@ -25,23 +24,6 @@ export async function nudge(name: string, message: string): Promise<void> {
|
|
|
25
24
|
// Check if this is a local agent
|
|
26
25
|
const localAgent = getAgentState(name);
|
|
27
26
|
|
|
28
|
-
// Sandbox agent - route nudge through docker exec
|
|
29
|
-
if (localAgent?.sandboxContainer) {
|
|
30
|
-
const result = spawnSync(
|
|
31
|
-
"docker",
|
|
32
|
-
["exec", localAgent.sandboxContainer, "agentmesh", "nudge", name, message],
|
|
33
|
-
{ encoding: "utf-8", stdio: "pipe" },
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
if (result.status === 0) {
|
|
37
|
-
console.log(pc.green(`Nudged "${name}" in sandbox.`));
|
|
38
|
-
} else {
|
|
39
|
-
console.log(pc.red(`Failed to nudge "${name}" in sandbox: ${result.stderr}`));
|
|
40
|
-
}
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Local agent with tmux session on host
|
|
45
27
|
if (localAgent && sessionExists(getSessionName(name))) {
|
|
46
28
|
// Local nudge via tmux send-keys
|
|
47
29
|
const formatted = `[AgentMesh] Nudge from CLI:
|
package/src/config/schema.ts
CHANGED
package/src/core/daemon.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { handleWebSocketEvent, injectRestoredContext, injectStartupMessage } fro
|
|
|
16
16
|
import { checkInbox, fetchAssignments, registerAgent, type ServerContext } from "./registry.js";
|
|
17
17
|
import { buildRunnerConfig, getRunnerDisplayName, type RunnerConfig } from "./runner.js";
|
|
18
18
|
import { DockerSandbox } from "./sandbox.js";
|
|
19
|
+
import { getLatestSessionId, snapshotSessionId, waitForNewSessionId } from "./session-id.js";
|
|
19
20
|
import {
|
|
20
21
|
captureSessionContext,
|
|
21
22
|
captureSessionOutput,
|
|
@@ -97,6 +98,9 @@ export class AgentDaemon {
|
|
|
97
98
|
private sandbox: DockerSandbox | null = null;
|
|
98
99
|
private healthCheckInterval: ReturnType<typeof setInterval> | null = null;
|
|
99
100
|
private serverContext: ServerContext | undefined;
|
|
101
|
+
// Session resume tracking
|
|
102
|
+
private _preStartSessionId: string | null | undefined;
|
|
103
|
+
private _attemptedResumeSessionId: string | undefined;
|
|
100
104
|
// Auto-restart tracking
|
|
101
105
|
private restartCount = 0;
|
|
102
106
|
private lastStableTime: Date | null = null;
|
|
@@ -231,6 +235,20 @@ export class AgentDaemon {
|
|
|
231
235
|
|
|
232
236
|
// Create tmux session if it doesn't exist
|
|
233
237
|
if (!sessionAlreadyExists) {
|
|
238
|
+
// Load saved context to check for OpenCode session ID (for native resume)
|
|
239
|
+
let savedSessionId: string | undefined;
|
|
240
|
+
if (this.shouldRestoreContext && this.agentId) {
|
|
241
|
+
const savedContext = loadContext(this.agentId);
|
|
242
|
+
savedSessionId = savedContext?.custom?.opencodeSessionId as string | undefined;
|
|
243
|
+
if (savedSessionId) {
|
|
244
|
+
console.log(`[CONTEXT] Found saved OpenCode session ID: ${savedSessionId}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Snapshot the latest session ID in logs BEFORE starting OpenCode.
|
|
249
|
+
// This lets us detect whether OpenCode actually resumed vs created a new session.
|
|
250
|
+
const preStartSessionId = snapshotSessionId(this.agentName);
|
|
251
|
+
|
|
234
252
|
console.log(`Creating tmux session: ${sessionName}`);
|
|
235
253
|
|
|
236
254
|
// Include runner env vars (e.g., OPENCODE_MODEL) at session creation
|
|
@@ -239,11 +257,16 @@ export class AgentDaemon {
|
|
|
239
257
|
this.agentConfig.command,
|
|
240
258
|
this.agentConfig.workdir,
|
|
241
259
|
this.runnerConfig.env, // Apply model env at process start
|
|
260
|
+
savedSessionId, // Resume OpenCode session if available
|
|
242
261
|
);
|
|
243
262
|
|
|
244
263
|
if (!created) {
|
|
245
264
|
throw new Error("Failed to create tmux session");
|
|
246
265
|
}
|
|
266
|
+
|
|
267
|
+
// Store pre-start snapshot for fallback detection later
|
|
268
|
+
this._preStartSessionId = preStartSessionId;
|
|
269
|
+
this._attemptedResumeSessionId = savedSessionId;
|
|
247
270
|
} else {
|
|
248
271
|
console.log(`Reconnecting to existing session: ${sessionName}`);
|
|
249
272
|
// Update environment for existing session
|
|
@@ -371,10 +394,61 @@ export class AgentDaemon {
|
|
|
371
394
|
console.log("Checking for previous context...");
|
|
372
395
|
const savedContext = loadContext(this.agentId);
|
|
373
396
|
if (savedContext) {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
397
|
+
if (this._attemptedResumeSessionId && !this.serveMode && !this.sandboxMode) {
|
|
398
|
+
// Native session resume was attempted — verify it worked.
|
|
399
|
+
// Wait for OpenCode to write a NEW session entry to logs.
|
|
400
|
+
// If resume succeeded, it reuses the session (no new entry).
|
|
401
|
+
// If resume failed, OpenCode creates a new session (new entry appears).
|
|
402
|
+
const newSessionId = await waitForNewSessionId(
|
|
403
|
+
this.agentName,
|
|
404
|
+
this._preStartSessionId ?? null,
|
|
405
|
+
15000,
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
if (!newSessionId) {
|
|
409
|
+
// No new session appeared in logs. Could mean:
|
|
410
|
+
// a) Resume succeeded (OpenCode reused session, no new "created" log)
|
|
411
|
+
// b) OpenCode is sitting at splash (session not found, no new session created)
|
|
412
|
+
const health = isSessionHealthy(this.agentName);
|
|
413
|
+
const currentSessionId = getLatestSessionId(this.agentName);
|
|
414
|
+
|
|
415
|
+
if (!health.healthy) {
|
|
416
|
+
// OpenCode died — clear stale session ID to prevent restart loop
|
|
417
|
+
console.log(`[CONTEXT] Fallback: OpenCode not healthy, injecting text summary.`);
|
|
418
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: undefined };
|
|
419
|
+
saveContext(savedContext);
|
|
420
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
421
|
+
} else if (currentSessionId === this._attemptedResumeSessionId) {
|
|
422
|
+
// The session ID we tried to resume is still the latest — resume worked
|
|
423
|
+
console.log(`[CONTEXT] Resumed OpenCode session ${this._attemptedResumeSessionId}`);
|
|
424
|
+
} else {
|
|
425
|
+
// Pane is alive but no matching session ID in logs — OpenCode is at splash
|
|
426
|
+
console.log(
|
|
427
|
+
`[CONTEXT] Fallback: session not found in OpenCode. Injecting text summary.`,
|
|
428
|
+
);
|
|
429
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: undefined };
|
|
430
|
+
saveContext(savedContext);
|
|
431
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
432
|
+
}
|
|
433
|
+
} else if (newSessionId === this._attemptedResumeSessionId) {
|
|
434
|
+
// OpenCode logged the same session ID — resume succeeded
|
|
435
|
+
console.log(`[CONTEXT] Resumed OpenCode session ${this._attemptedResumeSessionId}`);
|
|
436
|
+
} else {
|
|
437
|
+
// OpenCode created a different session — resume failed, fallback to text.
|
|
438
|
+
// Update saved context with new session ID to prevent restart loop.
|
|
439
|
+
console.log(
|
|
440
|
+
`[CONTEXT] Fallback: resume failed (expected ${this._attemptedResumeSessionId}, got ${newSessionId}). Injecting text summary.`,
|
|
441
|
+
);
|
|
442
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: newSessionId };
|
|
443
|
+
saveContext(savedContext);
|
|
444
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
445
|
+
}
|
|
446
|
+
} else {
|
|
447
|
+
// No session ID saved or non-tmux mode — use text injection
|
|
448
|
+
console.log(`Restoring context from ${savedContext.savedAt}`);
|
|
449
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
450
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
451
|
+
}
|
|
378
452
|
}
|
|
379
453
|
}
|
|
380
454
|
|
|
@@ -491,6 +565,11 @@ ${lastOutput}
|
|
|
491
565
|
|
|
492
566
|
fs.appendFileSync(logFile, crashLog);
|
|
493
567
|
|
|
568
|
+
// Save context (including session ID) before restart attempt
|
|
569
|
+
if (this.agentId) {
|
|
570
|
+
this.saveAgentContext();
|
|
571
|
+
}
|
|
572
|
+
|
|
494
573
|
// Check if we can restart
|
|
495
574
|
if (this.restartCount < MAX_RESTART_ATTEMPTS) {
|
|
496
575
|
this.restartCount++;
|
|
@@ -638,12 +717,25 @@ ${lastOutput}
|
|
|
638
717
|
sandboxContainer: containerName,
|
|
639
718
|
});
|
|
640
719
|
} else {
|
|
641
|
-
// Non-sandbox restart
|
|
720
|
+
// Non-sandbox restart — load saved session ID for native resume
|
|
721
|
+
let savedSessionId: string | undefined;
|
|
722
|
+
let savedContext = null;
|
|
723
|
+
if (this.agentId) {
|
|
724
|
+
savedContext = loadContext(this.agentId);
|
|
725
|
+
savedSessionId = savedContext?.custom?.opencodeSessionId as string | undefined;
|
|
726
|
+
if (savedSessionId) {
|
|
727
|
+
console.log(`[RESTART] Attempting to resume OpenCode session: ${savedSessionId}`);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
const preRestartSessionId = snapshotSessionId(this.agentName);
|
|
732
|
+
|
|
642
733
|
const created = createSession(
|
|
643
734
|
this.agentName,
|
|
644
735
|
this.agentConfig.command,
|
|
645
736
|
this.agentConfig.workdir,
|
|
646
737
|
this.runnerConfig.env,
|
|
738
|
+
savedSessionId,
|
|
647
739
|
);
|
|
648
740
|
|
|
649
741
|
if (!created) {
|
|
@@ -656,6 +748,39 @@ ${lastOutput}
|
|
|
656
748
|
AGENTMESH_AGENT_ID: this.agentId!,
|
|
657
749
|
...this.runnerConfig.env,
|
|
658
750
|
});
|
|
751
|
+
|
|
752
|
+
// Verify native resume and fallback if needed
|
|
753
|
+
if (savedSessionId && savedContext) {
|
|
754
|
+
const newSessionId = await waitForNewSessionId(this.agentName, preRestartSessionId, 15000);
|
|
755
|
+
|
|
756
|
+
if (!newSessionId) {
|
|
757
|
+
const health = isSessionHealthy(this.agentName);
|
|
758
|
+
const currentSessionId = getLatestSessionId(this.agentName);
|
|
759
|
+
|
|
760
|
+
if (!health.healthy) {
|
|
761
|
+
console.log(`[RESTART] Fallback: OpenCode not healthy, injecting text summary.`);
|
|
762
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: undefined };
|
|
763
|
+
saveContext(savedContext);
|
|
764
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
765
|
+
} else if (currentSessionId === savedSessionId) {
|
|
766
|
+
console.log(`[RESTART] Resumed OpenCode session ${savedSessionId}`);
|
|
767
|
+
} else {
|
|
768
|
+
console.log(`[RESTART] Fallback: session not found. Injecting text summary.`);
|
|
769
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: undefined };
|
|
770
|
+
saveContext(savedContext);
|
|
771
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
772
|
+
}
|
|
773
|
+
} else if (newSessionId === savedSessionId) {
|
|
774
|
+
console.log(`[RESTART] Resumed OpenCode session ${savedSessionId}`);
|
|
775
|
+
} else {
|
|
776
|
+
console.log(
|
|
777
|
+
`[RESTART] Fallback: resume failed (got ${newSessionId}). Injecting text summary.`,
|
|
778
|
+
);
|
|
779
|
+
savedContext.custom = { ...savedContext.custom, opencodeSessionId: newSessionId };
|
|
780
|
+
saveContext(savedContext);
|
|
781
|
+
injectRestoredContext(this.agentName, savedContext);
|
|
782
|
+
}
|
|
783
|
+
}
|
|
659
784
|
}
|
|
660
785
|
|
|
661
786
|
// Wait for session to be ready
|
|
@@ -792,6 +917,16 @@ ${lastOutput}
|
|
|
792
917
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
793
918
|
|
|
794
919
|
console.log(`opencode serve started on http://0.0.0.0:${this.servePort}`);
|
|
920
|
+
|
|
921
|
+
// Store saved session ID for integration service reuse
|
|
922
|
+
if (this.shouldRestoreContext && this.agentId) {
|
|
923
|
+
const savedContext = loadContext(this.agentId);
|
|
924
|
+
const savedSessionId = savedContext?.custom?.opencodeSessionId as string | undefined;
|
|
925
|
+
if (savedSessionId) {
|
|
926
|
+
console.log(`[SERVE] Saved OpenCode session available for reuse: ${savedSessionId}`);
|
|
927
|
+
updateAgentInState(this.agentName, { opencodeSessionId: savedSessionId });
|
|
928
|
+
}
|
|
929
|
+
}
|
|
795
930
|
}
|
|
796
931
|
|
|
797
932
|
/**
|
|
@@ -961,6 +1096,13 @@ Logs: docker logs ${containerName}
|
|
|
961
1096
|
};
|
|
962
1097
|
}
|
|
963
1098
|
|
|
1099
|
+
// Capture OpenCode session ID for native resume on restart
|
|
1100
|
+
const sessionId = getLatestSessionId(this.agentName);
|
|
1101
|
+
if (sessionId) {
|
|
1102
|
+
context.custom = { ...context.custom, opencodeSessionId: sessionId };
|
|
1103
|
+
console.log(`[CONTEXT] Captured OpenCode session ID: ${sessionId}`);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
964
1106
|
// Save updated context
|
|
965
1107
|
saveContext(context);
|
|
966
1108
|
console.log(`Context saved for agent ${this.agentName}`);
|
package/src/core/runner.ts
CHANGED
|
@@ -122,40 +122,17 @@ export function validateOpenCodeModel(model: string): { valid: boolean; error?:
|
|
|
122
122
|
|
|
123
123
|
// Common model aliases to their full OpenCode names
|
|
124
124
|
const MODEL_ALIASES: Record<string, string> = {
|
|
125
|
-
// Anthropic — Claude
|
|
126
125
|
"claude-sonnet-4": "anthropic/claude-sonnet-4-5",
|
|
127
|
-
"claude-sonnet-4-0": "anthropic/claude-sonnet-4-0",
|
|
128
126
|
"claude-sonnet-4-5": "anthropic/claude-sonnet-4-5",
|
|
129
|
-
"claude-sonnet-4-6": "anthropic/claude-sonnet-4-6",
|
|
130
127
|
"claude-opus-4": "anthropic/claude-opus-4-5",
|
|
131
|
-
"claude-opus-4-0": "anthropic/claude-opus-4-0",
|
|
132
|
-
"claude-opus-4-1": "anthropic/claude-opus-4-1",
|
|
133
128
|
"claude-opus-4-5": "anthropic/claude-opus-4-5",
|
|
134
|
-
"claude-opus-4-6": "anthropic/claude-opus-4-6",
|
|
135
129
|
"claude-haiku-4": "anthropic/claude-haiku-4-5",
|
|
136
130
|
"claude-haiku-4-5": "anthropic/claude-haiku-4-5",
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"gpt-5.2": "openai/gpt-5.2",
|
|
143
|
-
"gpt-5.3-codex": "openai/gpt-5.3-codex",
|
|
144
|
-
"gpt-5.2-codex": "openai/gpt-5.2-codex",
|
|
145
|
-
"gpt-5.1-codex": "openai/gpt-5.1-codex",
|
|
146
|
-
"gpt-5.1-codex-max": "openai/gpt-5.1-codex-max",
|
|
147
|
-
"gpt-5.1-codex-mini": "openai/gpt-5.1-codex-mini",
|
|
148
|
-
"gpt-5-codex": "openai/gpt-5-codex",
|
|
149
|
-
"codex-mini": "openai/codex-mini-latest",
|
|
150
|
-
codex: "openai/gpt-5.3-codex",
|
|
151
|
-
|
|
152
|
-
// xAI — Grok
|
|
153
|
-
"grok-4": "xai/grok-4",
|
|
154
|
-
"grok-4-fast": "xai/grok-4-fast",
|
|
155
|
-
"grok-3": "xai/grok-3",
|
|
156
|
-
"grok-3-fast": "xai/grok-3-fast",
|
|
157
|
-
"grok-3-mini": "xai/grok-3-mini",
|
|
158
|
-
"grok-code": "xai/grok-code-fast-1",
|
|
131
|
+
"gpt-4o": "openai/gpt-4o",
|
|
132
|
+
"gpt-4": "openai/gpt-4",
|
|
133
|
+
o3: "openai/o3",
|
|
134
|
+
"o3-mini": "openai/o3-mini",
|
|
135
|
+
codex: "openai/codex",
|
|
159
136
|
};
|
|
160
137
|
|
|
161
138
|
/**
|
package/src/core/sandbox.ts
CHANGED
|
@@ -225,11 +225,8 @@ export class DockerSandbox {
|
|
|
225
225
|
// Image and command
|
|
226
226
|
args.push(this.config.image);
|
|
227
227
|
|
|
228
|
-
// Command:
|
|
229
|
-
if (this.config.
|
|
230
|
-
// Custom command (e.g., agentmesh start inside container)
|
|
231
|
-
args.push(...this.config.command);
|
|
232
|
-
} else if (this.config.serveMode) {
|
|
228
|
+
// Command: either serve mode or keep container alive for tmux-style attach
|
|
229
|
+
if (this.config.serveMode) {
|
|
233
230
|
args.push(
|
|
234
231
|
"opencode",
|
|
235
232
|
"serve",
|