feat: Ollama/gemma4 compat — /init flow, stream filter, safety fixes
provider/openai: - Fix doubled tool call args (argsComplete flag): Ollama sends complete args in the first streaming chunk then repeats them as delta, causing doubled JSON and 400 errors in elfs - Handle fs: prefix (gemma4 uses fs:grep instead of fs.grep) - Add Reasoning field support for Ollama thinking output cmd/gnoma: - Early TTY detection so logger is created with correct destination before any component gets a reference to it (fixes slog WARN bleed into TUI textarea) permission: - Exempt spawn_elfs and agent tools from safety scanner: elf prompt text may legitimately mention .env/.ssh/credentials patterns and should not be blocked tui/app: - /init retry chain: no-tool-calls → spawn_elfs nudge → write nudge (ask for plain text output) → TUI fallback write from streamBuf - looksLikeAgentsMD + extractMarkdownDoc: validate and clean fallback content before writing (reject refusals, strip narrative preambles) - Collapse thinking output to 3 lines; ctrl+o to expand (live stream and committed messages) - Stream-level filter for model pseudo-tool-call blocks: suppresses <<tool_code>>...</tool_code>> and <<function_call>>...<tool_call|> from entering streamBuf across chunk boundaries - sanitizeAssistantText regex covers both block formats - Reset streamFilterClose at every turn start
This commit is contained in:
@@ -45,6 +45,11 @@ type Turn struct {
|
||||
Rounds int // number of API round-trips
|
||||
}
|
||||
|
||||
// TurnOptions carries per-turn overrides that apply for a single Submit call.
|
||||
type TurnOptions struct {
|
||||
ToolChoice provider.ToolChoiceMode // "" = use provider default
|
||||
}
|
||||
|
||||
// Engine orchestrates the conversation.
|
||||
type Engine struct {
|
||||
cfg Config
|
||||
@@ -59,6 +64,9 @@ type Engine struct {
|
||||
// Deferred tool loading: tools with ShouldDefer() are excluded until
|
||||
// the model requests them. Activated on first use.
|
||||
activatedTools map[string]bool
|
||||
|
||||
// Per-turn options, set for the duration of SubmitWithOptions.
|
||||
turnOpts TurnOptions
|
||||
}
|
||||
|
||||
// New creates an engine.
|
||||
@@ -124,6 +132,9 @@ func (e *Engine) ContextWindow() *gnomactx.Window {
|
||||
// the model should see as context in subsequent turns.
|
||||
func (e *Engine) InjectMessage(msg message.Message) {
|
||||
e.history = append(e.history, msg)
|
||||
if e.cfg.Context != nil {
|
||||
e.cfg.Context.AppendMessage(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// Usage returns cumulative token usage.
|
||||
@@ -145,4 +156,8 @@ func (e *Engine) SetModel(model string) {
|
||||
func (e *Engine) Reset() {
|
||||
e.history = nil
|
||||
e.usage = message.Usage{}
|
||||
if e.cfg.Context != nil {
|
||||
e.cfg.Context.Reset()
|
||||
}
|
||||
e.activatedTools = make(map[string]bool)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user