2025-12-14 22:34:55 +09:00
|
|
|
import type { PluginInput } from "@opencode-ai/plugin"
|
2025-12-23 10:45:24 +09:00
|
|
|
import { HOOK_NAME, NON_INTERACTIVE_ENV, SHELL_COMMAND_PATTERNS } from "./constants"
|
2025-12-14 22:34:55 +09:00
|
|
|
import { log } from "../../shared"
|
|
|
|
|
|
|
|
|
|
export * from "./constants"
|
2025-12-25 15:27:34 +09:00
|
|
|
export * from "./detector"
|
2025-12-14 22:34:55 +09:00
|
|
|
export * from "./types"
|
|
|
|
|
|
2025-12-23 10:45:24 +09:00
|
|
|
const BANNED_COMMAND_PATTERNS = SHELL_COMMAND_PATTERNS.banned
|
|
|
|
|
.filter((cmd) => !cmd.includes("("))
|
|
|
|
|
.map((cmd) => new RegExp(`\\b${cmd}\\b`))
|
|
|
|
|
|
|
|
|
|
function detectBannedCommand(command: string): string | undefined {
|
|
|
|
|
for (let i = 0; i < BANNED_COMMAND_PATTERNS.length; i++) {
|
|
|
|
|
if (BANNED_COMMAND_PATTERNS[i].test(command)) {
|
|
|
|
|
return SHELL_COMMAND_PATTERNS.banned[i]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-14 22:34:55 +09:00
|
|
|
export function createNonInteractiveEnvHook(_ctx: PluginInput) {
|
|
|
|
|
return {
|
|
|
|
|
"tool.execute.before": async (
|
|
|
|
|
input: { tool: string; sessionID: string; callID: string },
|
2025-12-23 10:45:24 +09:00
|
|
|
output: { args: Record<string, unknown>; message?: string }
|
2025-12-14 22:34:55 +09:00
|
|
|
): Promise<void> => {
|
|
|
|
|
if (input.tool.toLowerCase() !== "bash") {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const command = output.args.command as string | undefined
|
|
|
|
|
if (!command) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-15 08:54:33 +09:00
|
|
|
output.args.env = {
|
2026-01-02 16:03:48 +09:00
|
|
|
...process.env,
|
2025-12-15 08:54:33 +09:00
|
|
|
...(output.args.env as Record<string, string> | undefined),
|
|
|
|
|
...NON_INTERACTIVE_ENV,
|
|
|
|
|
}
|
2025-12-14 22:34:55 +09:00
|
|
|
|
2025-12-23 10:45:24 +09:00
|
|
|
const bannedCmd = detectBannedCommand(command)
|
|
|
|
|
if (bannedCmd) {
|
|
|
|
|
output.message = `⚠️ Warning: '${bannedCmd}' is an interactive command that may hang in non-interactive environments.`
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-15 08:54:33 +09:00
|
|
|
log(`[${HOOK_NAME}] Set non-interactive environment variables`, {
|
2025-12-14 22:34:55 +09:00
|
|
|
sessionID: input.sessionID,
|
2025-12-15 08:54:33 +09:00
|
|
|
env: NON_INTERACTIVE_ENV,
|
2025-12-14 22:34:55 +09:00
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|