Implement all 5 CLI extension options for external orchestration: - --port <port>: Start server on port, or attach if port occupied - --attach <url>: Connect to existing opencode server - --session-id <id>: Resume existing session instead of creating new - --on-complete <command>: Execute shell command with env vars on completion - --json: Output structured RunResult JSON to stdout Refactor runner.ts into focused modules: - agent-resolver.ts: Agent resolution logic - server-connection.ts: Server connection management - session-resolver.ts: Session create/resume with retry - json-output.ts: Stdout redirect + JSON emission - on-complete-hook.ts: Shell command execution with env vars Fixes #1586
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import pc from "picocolors"
|
|
|
|
export async function executeOnCompleteHook(options: {
|
|
command: string
|
|
sessionId: string
|
|
exitCode: number
|
|
durationMs: number
|
|
messageCount: number
|
|
}): Promise<void> {
|
|
const { command, sessionId, exitCode, durationMs, messageCount } = options
|
|
|
|
const trimmedCommand = command.trim()
|
|
if (!trimmedCommand) {
|
|
return
|
|
}
|
|
|
|
console.error(pc.dim(`Running on-complete hook: ${trimmedCommand}`))
|
|
|
|
try {
|
|
const proc = Bun.spawn(["sh", "-c", trimmedCommand], {
|
|
env: {
|
|
...process.env,
|
|
SESSION_ID: sessionId,
|
|
EXIT_CODE: String(exitCode),
|
|
DURATION_MS: String(durationMs),
|
|
MESSAGE_COUNT: String(messageCount),
|
|
},
|
|
stdout: "inherit",
|
|
stderr: "inherit",
|
|
})
|
|
|
|
const hookExitCode = await proc.exited
|
|
|
|
if (hookExitCode !== 0) {
|
|
console.error(
|
|
pc.yellow(`Warning: on-complete hook exited with code ${hookExitCode}`)
|
|
)
|
|
}
|
|
} catch (error) {
|
|
console.error(pc.yellow(`Warning: Failed to execute on-complete hook: ${error instanceof Error ? error.message : String(error)}`))
|
|
}
|
|
}
|