@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 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.
@@ -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
+ }