Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f8fcf0e
feat: 为bash工具接入安全执行器
Cai-Tang-www Apr 4, 2026
241c0e4
feat(context): 支持 reactive compact 模式
wynxing Apr 4, 2026
3bbe533
refactor(tui): componentize command menu/activity/filepicker/progress
creatang Apr 4, 2026
0362e8b
Merge remote-tracking branch 'upstream/main' into codex/issue-99-tui-…
creatang Apr 4, 2026
61fef7b
test(tui): raise patch coverage for componentized paths
creatang Apr 4, 2026
d4e63ca
Merge pull request #147 from Yumiue/new_Feat-manual
minorcell Apr 4, 2026
1e19e32
pref(provider):拆解切换模型逻辑到config层
phantom5099 Apr 4, 2026
dc772c7
Merge pull request #150 from phantom5099/main
minorcell Apr 4, 2026
e3c0e38
refactor: 拆分 context 构建与 compact 内部职责
wynxing Apr 4, 2026
678e3b0
Merge remote-tracking branch 'upstream/main' into codex/issue-99-tui-…
creatang Apr 4, 2026
9f3ae4f
pref(provider):增加强构造器
phantom5099 Apr 4, 2026
e3713aa
refactor: 拆分 context 构建与 compact 内部职责
wynxing Apr 4, 2026
6f0f2d0
优化 context 模块内部裁剪与压缩链路
wynxing Apr 5, 2026
555eb00
Merge branch 'new_Feat-manual' of https://github.com/Yumiue/neo-code …
wynxing Apr 5, 2026
287225c
fix: reject NUL byte paths in bash workdir resolver
Cai-Tang-www Apr 5, 2026
7491ff1
fix:修复合并时的错误文件
wynxing Apr 5, 2026
e2f8bfd
merge: sync P0-4 into main
Cai-Tang-www Apr 5, 2026
18dd5a1
test:补齐测试
wynxing Apr 5, 2026
a57b86f
test(runtime): remove implicit gemini env dependency
wynxing Apr 5, 2026
8c9906e
test(runtime): isolate provider envs in parallel tests
wynxing Apr 5, 2026
ec84cb9
feat(filesystem): unify security result filtering for file/grep/glob
Cai-Tang-www Apr 5, 2026
a244db6
feat(filesystem): unify security result filtering for file/grep/glob
Cai-Tang-www Apr 5, 2026
86a529f
feat(runtime): emit permission request/resolved events
Cai-Tang-www Apr 5, 2026
0df3b5b
Merge pull request #144 from creatang/codex/issue-99-tui-activity-scroll
minorcell Apr 5, 2026
89da0c4
Merge pull request #154 from Cai-Tang-www/codex/P0-4
minorcell Apr 5, 2026
2c96389
Merge pull request #157 from Cai-Tang-www/P0-6
minorcell Apr 5, 2026
8d6cecc
Merge pull request #159 from Cai-Tang-www/P0-7
minorcell Apr 5, 2026
8ce86fe
Merge pull request #155 from Yumiue/new_Feat-manual
minorcell Apr 5, 2026
53db590
Merge remote-tracking branch 'refs/remotes/upstream/main'
phantom5099 Apr 5, 2026
87e9752
pref(provider):去掉了provider为runtime迭代留下的兼容代码
phantom5099 Apr 5, 2026
7b80117
test(provider):补齐测试覆盖率
phantom5099 Apr 5, 2026
4627929
fix(provider):修复“显式报错”流事件处理导致卡死问题
phantom5099 Apr 5, 2026
f59759e
Merge pull request #153 from phantom5099/main
minorcell Apr 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions docs/context-compact.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# Context Compact

本文档说明 NeoCode 中 manual compact 的配置、执行链路和摘要约定。
本文档说明 NeoCode 中 context compact 的配置、执行链路和摘要约定。

## 概览

- 当前仅支持手动触发的 compact,不包含自动 compact。
- runtime 当前仅接入手动触发的 compact,不包含自动 compact。
- `internal/context/compact` 已支持 `manual` 与 `reactive` 两种 mode,供 runtime 后续在 provider 上下文过长错误场景接入调用。
- 用户通过 `/compact` 对当前会话执行一次上下文压缩。
- compact 前会先写入完整 transcript,随后生成并校验 compact summary,再回写会话消息。

Expand Down Expand Up @@ -39,6 +40,15 @@ context:
7. runner 校验摘要结构与长度,必要时截断。
8. compact 成功时回写会话消息并发出 `compact_done`;失败时发出 `compact_error`。

其中 `reactive` mode 在 context 包内与 `manual` 复用同一条压缩管线:

1. 先写 transcript。
2. 默认按 `keep_recent` 裁剪可归档历史。
3. 生成并校验 `[compact_summary]`。
4. 返回压缩后的消息与 transcript 元信息。

当前 runtime 主链尚未自动调用 `reactive` mode;后续接入时可继续复用现有 compact 事件,并通过 `trigger_mode=reactive` 区分。

## 摘要协议

compact summary 必须以如下结构返回:
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require (
github.com/aymerick/douceur v0.2.0 // indirect
github.com/charmbracelet/colorprofile v0.4.3 // indirect
github.com/charmbracelet/glamour v1.0.0 // indirect
github.com/charmbracelet/harmonica v0.2.0 // indirect
github.com/charmbracelet/x/ansi v0.11.6 // indirect
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect
Expand All @@ -26,6 +27,7 @@ require (
github.com/clipperhouse/stringish v0.1.1 // indirect
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex
github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
github.com/charmbracelet/glamour v1.0.0 h1:AWMLOVFHTsysl4WV8T8QgkQ0s/ZNZo7CiE4WKhk8l08=
github.com/charmbracelet/glamour v1.0.0/go.mod h1:DSdohgOBkMr2ZQNhw4LZxSGpx3SvpeujNoXrQyH2hxo=
github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE=
Expand All @@ -46,6 +48,8 @@ github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJ
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
Expand Down
7 changes: 3 additions & 4 deletions internal/app/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
agentcontext "neo-code/internal/context"
"neo-code/internal/provider/builtin"
providercatalog "neo-code/internal/provider/catalog"
providerselection "neo-code/internal/provider/selection"
agentruntime "neo-code/internal/runtime"
"neo-code/internal/security"
"neo-code/internal/tools"
Expand Down Expand Up @@ -38,8 +37,8 @@ func ensureConsoleUTF8() {
func NewProgram(ctx context.Context) (*tea.Program, error) {

ensureConsoleUTF8()
loader := config.NewLoader("", config.DefaultConfig())

loader := config.NewLoader("", config.DefaultConfig())
manager := config.NewManager(loader)
if _, err := manager.Load(ctx); err != nil {
return nil, err
Expand All @@ -50,7 +49,7 @@ func NewProgram(ctx context.Context) (*tea.Program, error) {
return nil, err
}
modelCatalogs := providercatalog.NewService(manager.BaseDir(), providerRegistry, nil)
providerSelection := providerselection.NewService(manager, providerRegistry, modelCatalogs)
providerSelection := config.NewSelectionService(manager, providerRegistry, providerRegistry, modelCatalogs)
if _, err := providerSelection.EnsureSelection(ctx); err != nil {
return nil, err
}
Expand Down
13 changes: 0 additions & 13 deletions internal/config/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -535,16 +535,3 @@ func containsProviderName(providers []ProviderConfig, name string) bool {
}
return false
}

func ContainsModelID(models []string, model string) bool {
target := NormalizeKey(model)
if target == "" {
return false
}
for _, candidate := range models {
if NormalizeKey(candidate) == target {
return true
}
}
return false
}
Loading
Loading