iop/apps/node/internal/adapters/cli/command.go

61 lines
1.6 KiB
Go

package cli
import (
"context"
"fmt"
"os/exec"
)
func extractPrompt(input map[string]any) string {
if input == nil {
return ""
}
if v, ok := input["prompt"]; ok {
if s, ok := v.(string); ok {
return s
}
}
return fmt.Sprintf("%v", input)
}
func applyCmdWorkspace(cmd *exec.Cmd, workspace string) error {
dir, err := prepareWorkspaceDir(workspace)
if err != nil {
return err
}
if dir != "" {
cmd.Dir = dir
}
return nil
}
func applyCmdEnv(cmd *exec.Cmd, env []string) {
if len(env) > 0 {
cmd.Env = append(cmd.Environ(), env...)
}
}
// buildCmd applies workspace before env, preserving the pre-refactor
// dir-before-env order for the context one-shot lifecycle so cmd.Environ()
// picks up PWD=<workspace> when env overrides are present.
func buildCmd(ctx context.Context, command string, args []string, env []string, workspace string) (*exec.Cmd, error) {
cmd := exec.CommandContext(ctx, command, args...)
if err := applyCmdWorkspace(cmd, workspace); err != nil {
return nil, err
}
applyCmdEnv(cmd, env)
return cmd, nil
}
// buildCmdWithoutContext applies env before workspace, preserving the
// pre-refactor env-before-dir order for the codex app-server, opencode
// local server, and non-terminal persistent lifecycles so cmd.Environ()
// keeps the parent PWD instead of being overridden to match workspace.
func buildCmdWithoutContext(command string, args []string, env []string, workspace string) (*exec.Cmd, error) {
cmd := exec.Command(command, args...)
applyCmdEnv(cmd, env)
if err := applyCmdWorkspace(cmd, workspace); err != nil {
return nil, err
}
return cmd, nil
}