remove agent/complete.go — completions now go through /generate

- Delete agent/complete.go (110 lines)
- The kate plugin builds the completion prompt inline and calls
  ollie-9p rdwr generate instead of ollie-9p rdwr complete
This commit is contained in:
Levi Neely 2026-08-07 07:38:09 +02:00
parent 1eacb4f42d
commit 8e68313142
1 changed files with 0 additions and 110 deletions

View File

@ -1,110 +0,0 @@
package agent
import (
"context"
"fmt"
"os"
"strings"
"ollie/backend"
"ollie/paths"
)
// Complete performs a stateless one-shot code completion.
//
// TRANSITIONAL: This is an ephemeral agent — no history, no lifecycle, just
// prompt→completion. The intent is to unify this with the Agent struct such
// that one composes the other (a full Agent IS-A one-shot with state layered on).
func Complete(cwd, filePath, prefix, suffix, extraContext string) (string, error) {
if cwd == "" {
cwd, _ = os.Getwd()
}
cwd = paths.ExpandHome(os.ExpandEnv(cwd))
model := os.Getenv("OLLIE_COMPLETE_MODEL")
backendName := os.Getenv("OLLIE_COMPLETE_BACKEND")
if model == "" || backendName == "" {
cfg := loadModelsConfig()
if model == "" && cfg.Completion.Model != "" {
model = cfg.Completion.Model
}
if backendName == "" && cfg.Completion.Backend != "" {
backendName = cfg.Completion.Backend
}
}
if model == "" || backendName == "" {
return "", fmt.Errorf("OLLIE_COMPLETE_MODEL and OLLIE_COMPLETE_BACKEND must be set (or configured in models.yaml)")
}
const prefixMax = 12000
const suffixMax = 1000
if len(prefix) > prefixMax {
prefix = prefix[len(prefix)-prefixMax:]
}
if len(suffix) > suffixMax {
suffix = suffix[:suffixMax]
}
fileHint := ""
if filePath != "" {
fileHint = " in " + filePath
}
contextBlock := ""
if extraContext != "" {
contextBlock = "\n" + extraContext
}
prompt := fmt.Sprintf(`Implement the code at the cursor%s. The prefix ends at the point where new code is needed. Write the implementation — do not echo stubs, TODOs, or placeholder returns from the prefix. Output ONLY raw code. No reasoning, no shell commands, no explanations, no markdown fences, no backticks, no preamble. Your entire response must be valid code that can be inserted directly into the file.
%s
<prefix>
%s
</prefix>
<suffix>
%s
</suffix>`, fileHint, contextBlock, prefix, suffix)
result, err := backend.Generate(context.Background(), backend.GenerateRequest{
Prompt: prompt,
Backend: backendName,
Model: model,
})
if err != nil {
return "", err
}
result = stripCompletionNoise(result)
result = stripPrefixEcho(prefix, result)
return result, nil
}
func stripCompletionNoise(s string) string {
var lines []string
for _, line := range strings.Split(s, "\n") {
trimmed := strings.TrimSpace(line)
if strings.HasPrefix(trimmed, "```") {
continue
}
if trimmed == "<prefix>" || trimmed == "</prefix>" ||
trimmed == "<suffix>" || trimmed == "</suffix>" {
continue
}
if strings.HasPrefix(trimmed, ":: ") {
continue
}
lines = append(lines, line)
}
return strings.Join(lines, "\n")
}
func stripPrefixEcho(prefix, result string) string {
tailMax := 200
if len(prefix) < tailMax {
tailMax = len(prefix)
}
for i := tailMax; i > 0; i-- {
tail := prefix[len(prefix)-i:]
if strings.HasPrefix(result, tail) {
return result[len(tail):]
}
}
return result
}