@made-by-moonlight/athene-plugin-agent-opencode 0.9.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 +22 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +391 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Composio, Inc.
|
|
4
|
+
Copyright (c) 2026 slievr (Athene fork)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resetOpenCodeSessionListCache, type Agent } from "@made-by-moonlight/athene-core";
|
|
2
|
+
export { resetOpenCodeSessionListCache };
|
|
3
|
+
export declare const manifest: {
|
|
4
|
+
name: string;
|
|
5
|
+
slot: "agent";
|
|
6
|
+
description: string;
|
|
7
|
+
version: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function create(): Agent;
|
|
11
|
+
export declare function detect(): boolean;
|
|
12
|
+
declare const _default: {
|
|
13
|
+
manifest: {
|
|
14
|
+
name: string;
|
|
15
|
+
slot: "agent";
|
|
16
|
+
description: string;
|
|
17
|
+
version: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
};
|
|
20
|
+
create: typeof create;
|
|
21
|
+
detect: typeof detect;
|
|
22
|
+
};
|
|
23
|
+
export default _default;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,6BAA6B,EAC7B,KAAK,KAAK,EAaX,MAAM,gCAAgC,CAAC;AA+BxC,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAsHzC,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAC;AAsQF,wBAAgB,MAAM,IAAI,KAAK,CAE9B;AAED,wBAAgB,MAAM,IAAI,OAAO,CAchC;;;;;;;;;;;;AAED,wBAA0E"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { DEFAULT_READY_THRESHOLD_MS, DEFAULT_ACTIVE_WINDOW_MS, shellEscape, readLastActivityEntry, checkActivityLogState, getActivityFallbackState, recordTerminalActivity, asValidOpenCodeSessionId, isWindows, PROCESS_PROBE_INDETERMINATE, getCachedOpenCodeSessionList, getOpenCodeChildEnv, ensureOpenCodeTmpDir, resetOpenCodeSessionListCache, } from "@made-by-moonlight/athene-core";
|
|
2
|
+
import { execFile, execFileSync } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
function parseUpdatedTimestamp(updated) {
|
|
6
|
+
if (typeof updated === "number") {
|
|
7
|
+
if (!Number.isFinite(updated))
|
|
8
|
+
return null;
|
|
9
|
+
const date = new Date(updated);
|
|
10
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
11
|
+
}
|
|
12
|
+
if (typeof updated !== "string")
|
|
13
|
+
return null;
|
|
14
|
+
const trimmed = updated.trim();
|
|
15
|
+
if (trimmed.length === 0)
|
|
16
|
+
return null;
|
|
17
|
+
if (/^\d+$/.test(trimmed)) {
|
|
18
|
+
const epochMs = Number(trimmed);
|
|
19
|
+
if (!Number.isFinite(epochMs))
|
|
20
|
+
return null;
|
|
21
|
+
const date = new Date(epochMs);
|
|
22
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
23
|
+
}
|
|
24
|
+
const parsedMs = Date.parse(trimmed);
|
|
25
|
+
if (!Number.isFinite(parsedMs))
|
|
26
|
+
return null;
|
|
27
|
+
return new Date(parsedMs);
|
|
28
|
+
}
|
|
29
|
+
// Re-export for backward compat — see @made-by-moonlight/athene-core/opencode-shared.
|
|
30
|
+
export { resetOpenCodeSessionListCache };
|
|
31
|
+
/**
|
|
32
|
+
* Parse JSON stream lines from `opencode run --format json` output.
|
|
33
|
+
* Each line is a JSON object. We look for objects containing a session_id field.
|
|
34
|
+
* The step_start event typically contains the session_id.
|
|
35
|
+
*/
|
|
36
|
+
function buildSessionIdCaptureScript() {
|
|
37
|
+
const script = `
|
|
38
|
+
let buffer = '';
|
|
39
|
+
let captured = null;
|
|
40
|
+
process.stdin.on('data', chunk => {
|
|
41
|
+
buffer += chunk;
|
|
42
|
+
const lines = buffer.split('\\n');
|
|
43
|
+
buffer = lines.pop() || '';
|
|
44
|
+
for (const line of lines) {
|
|
45
|
+
if (captured) continue;
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
if (!trimmed) continue;
|
|
48
|
+
try {
|
|
49
|
+
const obj = JSON.parse(trimmed);
|
|
50
|
+
const sid = (typeof obj.session_id === 'string' && obj.session_id) || (typeof obj.sessionID === 'string' && obj.sessionID);
|
|
51
|
+
if (sid && /^ses_[A-Za-z0-9_-]+$/.test(sid)) {
|
|
52
|
+
captured = sid;
|
|
53
|
+
}
|
|
54
|
+
} catch {}
|
|
55
|
+
}
|
|
56
|
+
}).on('end', () => {
|
|
57
|
+
if (buffer.trim()) {
|
|
58
|
+
try {
|
|
59
|
+
const obj = JSON.parse(buffer.trim());
|
|
60
|
+
const sid = (typeof obj.session_id === 'string' && obj.session_id) || (typeof obj.sessionID === 'string' && obj.sessionID);
|
|
61
|
+
if (sid && /^ses_[A-Za-z0-9_-]+$/.test(sid)) {
|
|
62
|
+
captured = sid;
|
|
63
|
+
}
|
|
64
|
+
} catch {}
|
|
65
|
+
}
|
|
66
|
+
if (captured) {
|
|
67
|
+
process.stdout.write(captured);
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
process.exit(1);
|
|
71
|
+
});
|
|
72
|
+
`.trim();
|
|
73
|
+
return script.replace(/\n/g, " ").replace(/\s+/g, " ");
|
|
74
|
+
}
|
|
75
|
+
function buildSessionLookupScript() {
|
|
76
|
+
const script = `
|
|
77
|
+
let input = '';
|
|
78
|
+
process.stdin.on('data', c => input += c).on('end', () => {
|
|
79
|
+
const title = process.argv[1];
|
|
80
|
+
let rows;
|
|
81
|
+
try { rows = JSON.parse(input); } catch { process.exit(1); }
|
|
82
|
+
if (!Array.isArray(rows)) process.exit(1);
|
|
83
|
+
const isValidId = id => /^ses_[A-Za-z0-9_-]+$/.test(id);
|
|
84
|
+
const timestamp = value => {
|
|
85
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value;
|
|
86
|
+
if (typeof value === 'string') {
|
|
87
|
+
const parsed = Date.parse(value);
|
|
88
|
+
return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;
|
|
89
|
+
}
|
|
90
|
+
return Number.NEGATIVE_INFINITY;
|
|
91
|
+
};
|
|
92
|
+
const matches = rows
|
|
93
|
+
.filter(r => r && r.title === title && typeof r.id === 'string' && isValidId(r.id))
|
|
94
|
+
.sort((a, b) => {
|
|
95
|
+
const ta = timestamp(a.updated);
|
|
96
|
+
const tb = timestamp(b.updated);
|
|
97
|
+
if (ta === tb) return 0;
|
|
98
|
+
return tb - ta;
|
|
99
|
+
});
|
|
100
|
+
if (matches.length === 0) process.exit(1);
|
|
101
|
+
process.stdout.write(matches[0].id);
|
|
102
|
+
});
|
|
103
|
+
`.trim();
|
|
104
|
+
return script.replace(/\n/g, " ").replace(/\s+/g, " ");
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// Session List Helpers
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* Query OpenCode's session list and find the matching session for this AO session.
|
|
111
|
+
* Tries metadata `opencodeSessionId` first, then falls back to title matching.
|
|
112
|
+
*/
|
|
113
|
+
async function findOpenCodeSession(session) {
|
|
114
|
+
try {
|
|
115
|
+
const sessions = await getCachedOpenCodeSessionList();
|
|
116
|
+
// Prefer exact ID match from metadata
|
|
117
|
+
if (session.metadata?.opencodeSessionId) {
|
|
118
|
+
const match = sessions.find((s) => s.id === session.metadata.opencodeSessionId);
|
|
119
|
+
if (match)
|
|
120
|
+
return match;
|
|
121
|
+
}
|
|
122
|
+
// Fallback: title match — pick the most recently updated session
|
|
123
|
+
// to avoid binding to a stale session when titles collide.
|
|
124
|
+
const titleMatches = sessions.filter((s) => s.title === `AO:${session.id}`);
|
|
125
|
+
if (titleMatches.length === 0)
|
|
126
|
+
return null;
|
|
127
|
+
if (titleMatches.length === 1)
|
|
128
|
+
return titleMatches[0];
|
|
129
|
+
return titleMatches.reduce((best, s) => {
|
|
130
|
+
const bestTs = parseUpdatedTimestamp(best.updated)?.getTime() ?? 0;
|
|
131
|
+
const sTs = parseUpdatedTimestamp(s.updated)?.getTime() ?? 0;
|
|
132
|
+
return sTs > bestTs ? s : best;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// =============================================================================
|
|
140
|
+
// Plugin Manifest
|
|
141
|
+
// =============================================================================
|
|
142
|
+
export const manifest = {
|
|
143
|
+
name: "opencode",
|
|
144
|
+
slot: "agent",
|
|
145
|
+
description: "Agent plugin: OpenCode",
|
|
146
|
+
version: "0.1.0",
|
|
147
|
+
displayName: "OpenCode",
|
|
148
|
+
};
|
|
149
|
+
// =============================================================================
|
|
150
|
+
// Agent Implementation
|
|
151
|
+
// =============================================================================
|
|
152
|
+
function createOpenCodeAgent() {
|
|
153
|
+
return {
|
|
154
|
+
name: "opencode",
|
|
155
|
+
processName: "opencode",
|
|
156
|
+
getLaunchCommand(config) {
|
|
157
|
+
const options = [];
|
|
158
|
+
const sharedOptions = [];
|
|
159
|
+
const agentConfig = config.projectConfig.agentConfig;
|
|
160
|
+
const existingSessionId = asValidOpenCodeSessionId(agentConfig?.opencodeSessionId);
|
|
161
|
+
if (existingSessionId) {
|
|
162
|
+
options.push("--session", shellEscape(existingSessionId));
|
|
163
|
+
}
|
|
164
|
+
const selectedAgentName = config.subagent;
|
|
165
|
+
if (selectedAgentName) {
|
|
166
|
+
sharedOptions.push("--agent", shellEscape(selectedAgentName));
|
|
167
|
+
}
|
|
168
|
+
const promptValue = config.prompt ? shellEscape(config.prompt) : undefined;
|
|
169
|
+
if (config.model) {
|
|
170
|
+
sharedOptions.push("--model", shellEscape(config.model));
|
|
171
|
+
}
|
|
172
|
+
if (!existingSessionId) {
|
|
173
|
+
const runOptions = [
|
|
174
|
+
"--format",
|
|
175
|
+
"json",
|
|
176
|
+
"--title",
|
|
177
|
+
shellEscape(`AO:${config.sessionId}`),
|
|
178
|
+
...sharedOptions,
|
|
179
|
+
];
|
|
180
|
+
const captureScript = buildSessionIdCaptureScript();
|
|
181
|
+
const fallbackScript = buildSessionLookupScript();
|
|
182
|
+
const runCommand = ["opencode", "run", ...runOptions, "--command", "true"].join(" ");
|
|
183
|
+
const resumeOptions = [...(promptValue ? ["--prompt", promptValue] : []), ...sharedOptions];
|
|
184
|
+
const resumeOptionsSuffix = resumeOptions.length > 0 ? ` ${resumeOptions.join(" ")}` : "";
|
|
185
|
+
const missingSessionError = shellEscape(`failed to discover OpenCode session ID for AO:${config.sessionId}`);
|
|
186
|
+
return [
|
|
187
|
+
`SES_ID=$(${runCommand} | node -e ${shellEscape(captureScript)})`,
|
|
188
|
+
`if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${shellEscape(fallbackScript)} ${shellEscape(`AO:${config.sessionId}`)}); fi`,
|
|
189
|
+
`[ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${resumeOptionsSuffix}; echo ${missingSessionError} >&2; exit 1`,
|
|
190
|
+
].join("; ");
|
|
191
|
+
}
|
|
192
|
+
if (promptValue) {
|
|
193
|
+
options.push("--prompt", promptValue);
|
|
194
|
+
}
|
|
195
|
+
options.push(...sharedOptions);
|
|
196
|
+
return ["opencode", ...options].join(" ");
|
|
197
|
+
},
|
|
198
|
+
getEnvironment(config) {
|
|
199
|
+
const env = {};
|
|
200
|
+
env["AO_SESSION_ID"] = config.sessionId;
|
|
201
|
+
// NOTE: AO_PROJECT_ID is the caller's responsibility (spawn.ts sets it)
|
|
202
|
+
if (config.issueId) {
|
|
203
|
+
env["AO_ISSUE_ID"] = config.issueId;
|
|
204
|
+
}
|
|
205
|
+
// Point Bun's embedded shared-library extraction at an AO-owned temp
|
|
206
|
+
// dir so the cli-side janitor only needs to sweep our own files
|
|
207
|
+
// (issue #1046). Setting all three keys covers POSIX (TMPDIR) and
|
|
208
|
+
// Windows fallbacks; opencode itself ships POSIX-only today.
|
|
209
|
+
const tmpDir = ensureOpenCodeTmpDir();
|
|
210
|
+
env["TMPDIR"] = tmpDir;
|
|
211
|
+
env["TMP"] = tmpDir;
|
|
212
|
+
env["TEMP"] = tmpDir;
|
|
213
|
+
// PATH and GH_PATH are injected by session-manager for all agents.
|
|
214
|
+
return env;
|
|
215
|
+
},
|
|
216
|
+
detectActivity(terminalOutput) {
|
|
217
|
+
if (!terminalOutput.trim())
|
|
218
|
+
return "idle";
|
|
219
|
+
const lines = terminalOutput.trim().split("\n");
|
|
220
|
+
const lastLine = lines[lines.length - 1]?.trim() ?? "";
|
|
221
|
+
// OpenCode's input prompt — agent is idle
|
|
222
|
+
if (/^[>$#]\s*$/.test(lastLine))
|
|
223
|
+
return "idle";
|
|
224
|
+
// Check the last few lines for permission/confirmation prompts
|
|
225
|
+
const tail = lines.slice(-5).join("\n");
|
|
226
|
+
if (/\(Y\)es.*\(N\)o/i.test(tail))
|
|
227
|
+
return "waiting_input";
|
|
228
|
+
if (/approval required/i.test(tail))
|
|
229
|
+
return "waiting_input";
|
|
230
|
+
if (/Do you want to proceed\?/i.test(tail))
|
|
231
|
+
return "waiting_input";
|
|
232
|
+
if (/Allow .+\?/i.test(tail))
|
|
233
|
+
return "waiting_input";
|
|
234
|
+
return "active";
|
|
235
|
+
},
|
|
236
|
+
async getActivityState(session, readyThresholdMs) {
|
|
237
|
+
const threshold = readyThresholdMs ?? DEFAULT_READY_THRESHOLD_MS;
|
|
238
|
+
const activeWindowMs = Math.min(DEFAULT_ACTIVE_WINDOW_MS, threshold);
|
|
239
|
+
// Check if process is running first
|
|
240
|
+
const exitedAt = new Date();
|
|
241
|
+
if (!session.runtimeHandle)
|
|
242
|
+
return { state: "exited", timestamp: exitedAt };
|
|
243
|
+
const running = await this.isProcessRunning(session.runtimeHandle);
|
|
244
|
+
if (running === PROCESS_PROBE_INDETERMINATE)
|
|
245
|
+
return null;
|
|
246
|
+
if (!running)
|
|
247
|
+
return { state: "exited", timestamp: exitedAt };
|
|
248
|
+
// 1. Check AO activity JSONL first (written by recordActivity from terminal output).
|
|
249
|
+
// This is the only source of waiting_input/blocked states for OpenCode.
|
|
250
|
+
let activityResult = null;
|
|
251
|
+
if (session.workspacePath) {
|
|
252
|
+
activityResult = await readLastActivityEntry(session.workspacePath);
|
|
253
|
+
const activityState = checkActivityLogState(activityResult);
|
|
254
|
+
if (activityState)
|
|
255
|
+
return activityState;
|
|
256
|
+
}
|
|
257
|
+
// 2. Fallback: query OpenCode's session list API for timestamp-based detection
|
|
258
|
+
const targetSession = await findOpenCodeSession(session);
|
|
259
|
+
if (targetSession) {
|
|
260
|
+
const lastActivity = parseUpdatedTimestamp(targetSession.updated);
|
|
261
|
+
if (lastActivity) {
|
|
262
|
+
const ageMs = Math.max(0, Date.now() - lastActivity.getTime());
|
|
263
|
+
if (ageMs <= activeWindowMs) {
|
|
264
|
+
return { state: "active", timestamp: lastActivity };
|
|
265
|
+
}
|
|
266
|
+
if (ageMs <= threshold) {
|
|
267
|
+
return { state: "ready", timestamp: lastActivity };
|
|
268
|
+
}
|
|
269
|
+
return { state: "idle", timestamp: lastActivity };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// 3. Fallback: use JSONL entry with age-based decay when session list is unavailable.
|
|
273
|
+
const fallback = getActivityFallbackState(activityResult, activeWindowMs, threshold);
|
|
274
|
+
if (fallback)
|
|
275
|
+
return fallback;
|
|
276
|
+
return null;
|
|
277
|
+
},
|
|
278
|
+
async recordActivity(session, terminalOutput) {
|
|
279
|
+
if (!session.workspacePath)
|
|
280
|
+
return;
|
|
281
|
+
await recordTerminalActivity(session.workspacePath, terminalOutput, (output) => this.detectActivity(output));
|
|
282
|
+
},
|
|
283
|
+
async isProcessRunning(handle) {
|
|
284
|
+
try {
|
|
285
|
+
if (handle.runtimeName === "tmux" && handle.id) {
|
|
286
|
+
// tmux and ps are Unix-only; guard before any tmux calls on Windows.
|
|
287
|
+
if (isWindows())
|
|
288
|
+
return false;
|
|
289
|
+
const { stdout: ttyOut } = await execFileAsync("tmux", ["list-panes", "-t", handle.id, "-F", "#{pane_tty}"], { timeout: 30_000 });
|
|
290
|
+
const ttys = ttyOut
|
|
291
|
+
.trim()
|
|
292
|
+
.split("\n")
|
|
293
|
+
.map((t) => t.trim())
|
|
294
|
+
.filter(Boolean);
|
|
295
|
+
if (ttys.length === 0)
|
|
296
|
+
return false;
|
|
297
|
+
const { stdout: psOut } = await execFileAsync("ps", ["-eo", "pid,tty,args"], {
|
|
298
|
+
timeout: 30_000,
|
|
299
|
+
});
|
|
300
|
+
if (!psOut)
|
|
301
|
+
return PROCESS_PROBE_INDETERMINATE;
|
|
302
|
+
const ttySet = new Set(ttys.map((t) => t.replace(/^\/dev\//, "")));
|
|
303
|
+
const processRe = /(?:^|\/)opencode(?:\s|$)/;
|
|
304
|
+
for (const line of psOut.split("\n")) {
|
|
305
|
+
const cols = line.trimStart().split(/\s+/);
|
|
306
|
+
if (cols.length < 3 || !ttySet.has(cols[1] ?? ""))
|
|
307
|
+
continue;
|
|
308
|
+
const args = cols.slice(2).join(" ");
|
|
309
|
+
if (processRe.test(args)) {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
const rawPid = handle.data["pid"];
|
|
316
|
+
const pid = typeof rawPid === "number" ? rawPid : Number(rawPid);
|
|
317
|
+
if (Number.isFinite(pid) && pid > 0) {
|
|
318
|
+
try {
|
|
319
|
+
process.kill(pid, 0);
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
if (err instanceof Error && "code" in err && err.code === "EPERM") {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return PROCESS_PROBE_INDETERMINATE;
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
async getSessionInfo(session) {
|
|
336
|
+
const targetSession = await findOpenCodeSession(session);
|
|
337
|
+
if (!targetSession)
|
|
338
|
+
return null;
|
|
339
|
+
return {
|
|
340
|
+
summary: targetSession.title ?? null,
|
|
341
|
+
summaryIsFallback: true,
|
|
342
|
+
agentSessionId: targetSession.id,
|
|
343
|
+
// OpenCode doesn't expose token/cost data in session list
|
|
344
|
+
};
|
|
345
|
+
},
|
|
346
|
+
async getRestoreCommand(session, project) {
|
|
347
|
+
// Try metadata first, then query OpenCode's session list
|
|
348
|
+
const sessionId = asValidOpenCodeSessionId(session.metadata?.opencodeSessionId) ??
|
|
349
|
+
(await findOpenCodeSession(session))?.id ??
|
|
350
|
+
null;
|
|
351
|
+
if (!sessionId)
|
|
352
|
+
return null;
|
|
353
|
+
const parts = ["opencode", "--session", shellEscape(sessionId)];
|
|
354
|
+
const agentConfig = project.agentConfig;
|
|
355
|
+
if (agentConfig?.model) {
|
|
356
|
+
parts.push("--model", shellEscape(agentConfig.model));
|
|
357
|
+
}
|
|
358
|
+
return parts.join(" ");
|
|
359
|
+
},
|
|
360
|
+
async setupWorkspaceHooks(_workspacePath, _config) {
|
|
361
|
+
// PATH wrappers are installed by session-manager for all agents.
|
|
362
|
+
},
|
|
363
|
+
async postLaunchSetup(_session) {
|
|
364
|
+
// PATH wrappers are re-ensured by session-manager.
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
// =============================================================================
|
|
369
|
+
// Plugin Export
|
|
370
|
+
// =============================================================================
|
|
371
|
+
export function create() {
|
|
372
|
+
return createOpenCodeAgent();
|
|
373
|
+
}
|
|
374
|
+
export function detect() {
|
|
375
|
+
try {
|
|
376
|
+
execFileSync("opencode", ["version"], {
|
|
377
|
+
stdio: "ignore",
|
|
378
|
+
// On Windows, execFileSync cannot resolve .cmd shim extensions without
|
|
379
|
+
// invoking the shell; windowsHide:true suppresses the conhost popup.
|
|
380
|
+
shell: isWindows(),
|
|
381
|
+
windowsHide: true,
|
|
382
|
+
env: getOpenCodeChildEnv(),
|
|
383
|
+
});
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
export default { manifest, create, detect };
|
|
391
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@made-by-moonlight/athene-plugin-agent-opencode",
|
|
3
|
+
"version": "0.9.1",
|
|
4
|
+
"description": "Agent plugin: OpenCode",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/slievr/Athene.git",
|
|
21
|
+
"directory": "packages/plugins/agent-opencode"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/slievr/Athene",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/slievr/Athene/issues"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20.0.0"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@made-by-moonlight/athene-core": "0.9.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^25.2.3",
|
|
35
|
+
"typescript": "^5.7.0",
|
|
36
|
+
"vitest": "^3.0.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"typecheck": "tsc --noEmit",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"clean": "rm -rf dist"
|
|
46
|
+
}
|
|
47
|
+
}
|