feat: M1-M7 gap audit phase 3 — context prefix, deferred tools, compact hooks

Gap 11 (M6): Fixed context prefix
- Window.PrefixMessages stores immutable docs (CLAUDE.md, .gnoma/GNOMA.md)
- Prefix stripped before compaction, prepended after — survives all compaction
- AllMessages() returns prefix + history for provider requests
- main.go loads CLAUDE.md and .gnoma/GNOMA.md at startup as prefix

Gap 12 (M6): Deferred tool loading
- DeferrableTool optional interface: ShouldDefer() bool
- buildRequest() skips deferred tools until activated
- Tools auto-activate on first model request (activatedTools map)
- agent + spawn_elfs marked as deferrable (large schemas, rarely needed early)
- Saves ~800 tokens per deferred tool per request

Gap 13 (M6): Pre/post compact hooks
- OnPreCompact/OnPostCompact callbacks in WindowConfig
- Called in doCompact() (shared by CompactIfNeeded + ForceCompact)
- M8 hooks system will extend these to full protocol
This commit is contained in:
2026-04-04 20:46:50 +02:00
parent 509c897847
commit 14b88cadcc
7 changed files with 121 additions and 61 deletions

View File

@@ -55,6 +55,10 @@ type Engine struct {
// Cached model capabilities, resolved lazily
modelCaps *provider.Capabilities
modelCapsFor string // model ID the cached caps are for
// Deferred tool loading: tools with ShouldDefer() are excluded until
// the model requests them. Activated on first use.
activatedTools map[string]bool
}
// New creates an engine.
@@ -67,8 +71,9 @@ func New(cfg Config) (*Engine, error) {
logger = slog.Default()
}
return &Engine{
cfg: cfg,
logger: logger,
cfg: cfg,
logger: logger,
activatedTools: make(map[string]bool),
}, nil
}