lcode-agent 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .lcode/
5
+ .env
6
+ secrets.json
7
+ _tmp_*.py
8
+ .idea/
9
+ dist/
@@ -0,0 +1,123 @@
1
+ Metadata-Version: 2.5
2
+ Name: lcode-agent
3
+ Version: 0.1.0
4
+ Summary: 一个基于 Textual 的终端 TUI 编码 agent
5
+ License: MIT
6
+ Requires-Python: >=3.14
7
+ Requires-Dist: aiohttp>=3.11.0
8
+ Requires-Dist: textual>=8.2.8
9
+ Description-Content-Type: text/markdown
10
+
11
+ # Lcode-agent
12
+
13
+ 一个基于 [Textual](https://textual.textualize.io/) 的终端 TUI 编码 agent。打字进去,它读你的项目、改文件、跑命令、联网查资料,全程在终端里完成。
14
+
15
+ ## 特性
16
+
17
+ - **流式对话**:思考过程默认折叠、正文 Markdown 渲染;等待/思考/跑工具状态栏实时反馈,随时 Esc 打断
18
+ - **内置工具**:`read_file` / `write` / `search_replace`(带 diff 高亮)/ `list_dir` / `grep`(自动用 ripgrep 加速)/ `run_terminal_command`(输出实时刷进卡片)/ `todo_write`(待办面板)/ `web_search` / `web_fetch`
19
+ - **上下文管理**:达到模型窗口阈值自动把旧对话压成摘要(`/zip` 可手动触发),只读工具的大结果进上下文前自动截短,底部栏实时显示占用
20
+ - **会话管理**:多窗口会话、自动快照、`/history` 回退到任意一问之前的代码和对话
21
+ - **多模型**:`models` 列表 + `/model` 弹窗切换(Ctrl+M),推理模型还能选 `reasoning_effort`(default/low/medium/high),从 `/models` 元数据自动识别支持的等级
22
+ - **省 token 可见**:底部栏显示缓存命中百分比、估算费用(配置单价后)、上下文占用
23
+ - **稳定发送**:请求失败自动重试 10 次,输入框上方红字显示错误和 `重试 n/10`;服务端不认的参数(如 `reasoning_effort`)自动降级重发
24
+ - **多模态**:`/img` 附加图片随消息发送
25
+ - **数据安全**:改文件前自动快照,回退可还原;会话/检查点/快照全部落盘 SQLite
26
+
27
+ ## 运行
28
+
29
+ 需要 Python 3.14+ 和 [uv](https://docs.astral.sh/uv/):
30
+
31
+ ```bash
32
+ uv run lcode
33
+ ```
34
+
35
+ 等价方式:`uv run python -m lcode`。开发模式(带 dev console):
36
+
37
+ ```bash
38
+ uv run textual run
39
+ ```
40
+
41
+ ## 配置
42
+
43
+ 所有配置集中在一个文件:`~/.lcode/config.json`(首次启动自动生成完整模板,缺的键自动补全)。
44
+
45
+ ```jsonc
46
+ {
47
+ // 接口地址(OpenAI 兼容,填到 /v1 为止)
48
+ "url": "https://api.example.com/v1",
49
+ // 协议类型:"completions"(/chat/completions)或 "responses"(/responses),失败会自动互为备用
50
+ "requestType": "responses",
51
+ // 当前模型;models 是可切换列表(/model 弹窗里显示的就是它)
52
+ "model": "deepseek-v4-pro-0813",
53
+ "models": ["deepseek-v4-pro-0813", "deepseek-v4-flash"],
54
+ // 密钥;也可以用环境变量 LCODE_API_KEY(优先级更高)
55
+ "apiKey": "sk-xxx",
56
+ // 单次回答输出上限 / 请求超时秒数
57
+ "maxTokens": 4096,
58
+ "timeoutSeconds": 180,
59
+ // 上下文用到模型窗口的百分比时自动压缩
60
+ "autoCompactPercent": 85,
61
+ // 推理等级:"" 为不发送参数;也可在应用里 /effort 切换
62
+ "reasoningEffort": "",
63
+ // 权限模式:ask 敏感操作先确认 / pass 全自动(Shift+Tab 可切换)
64
+ "permissionMode": "ask",
65
+ // 每百万 token 单价(美元),配了才会在底部栏显示估算费用
66
+ "pricing": { "input": 0.3, "output": 1.2, "cacheRead": 0.03 }
67
+ }
68
+ ```
69
+
70
+ 不需要的键可以删掉,程序会按出厂默认(`src/lcode/default_config.json`)补全;模型相关的改动也可以不编辑文件,直接在应用里 `/model` 切换。
71
+
72
+ ## 快捷键
73
+
74
+ | 按键 | 作用 |
75
+ | --- | --- |
76
+ | `Enter` | 发送消息 / 确认弹层选择 |
77
+ | `Esc` | 打断生成 / 关闭弹层 / 再按返回上级 |
78
+ | `Ctrl+C` | 生成中打断;空闲时退出 |
79
+ | `Ctrl+M` | 弹出模型选择器 |
80
+ | `Shift+Tab` | 切换 ask / pass 权限模式 |
81
+ | `Tab` | 补全命令 / `@` 文件路径 |
82
+ | `↑` / `↓` | 移动弹层选项、翻输入历史 |
83
+ | `Ctrl+Q` | 退出 |
84
+
85
+ 输入 `@` 会弹出项目文件补全;点击头部灯笼有彩蛋。
86
+
87
+ ## 斜杠命令
88
+
89
+ | 命令 | 作用 |
90
+ | --- | --- |
91
+ | `/new` | 新开一个对话窗口,当前会话收进栈 |
92
+ | `/changewin` | 切换历史窗口(可跟 id 前缀) |
93
+ | `/zip` | 手动压缩上下文,可加保留提示,如 `/zip 保留工具调用细节` |
94
+ | `/history` | 回退到某次提问前的代码和对话 |
95
+ | `/model` | 弹出模型列表切换;`/model 2` 按序号、`/model <id>` 直接切 |
96
+ | `/effort` | 推理等级;`/effort low\|medium\|high\|default` |
97
+ | `/rename` | 给当前窗口改名 |
98
+ | `/delwin` | 删除一个历史窗口 |
99
+ | `/export` | 当前窗口导出成 Markdown |
100
+ | `/img` | 附加图片随下一条消息发送,可多次叠加 |
101
+ | `/ask` `/pass` | 切换权限模式 |
102
+
103
+ ## 数据存在哪
104
+
105
+ - `~/.lcode/config.json` —— 全部配置(模型、密钥、权限模式)
106
+ - `~/.lcode/lcode.db` —— 会话消息、压缩摘要、检查点与文件快照(SQLite,WAL 模式)
107
+ - 导出的 Markdown 和回退还原的项目文件在项目目录内
108
+
109
+ ## 代码结构
110
+
111
+ 标准 src 布局,发布到 PyPI 后用户 `uv tool install lcode-agent` 即得 `lcode` 命令。
112
+
113
+ ```
114
+ src/lcode/
115
+ app.py TUI:气泡、工具卡片、弹层、底部栏、渲染与交互
116
+ protocol.py OpenAI 兼容协议:流式、工具调用、用量、重试降级
117
+ tools.py 内置工具实现与参数解析
118
+ store.py SQLite 存储:消息、摘要、检查点、快照、用量
119
+ compress.py 上下文自动压缩
120
+ settings.py 配置读写与迁移(统一到 ~/.lcode/config.json)
121
+ default_config.json 出厂默认配置(随包分发)
122
+ __main__.py python -m lcode 入口
123
+ ```
@@ -0,0 +1,113 @@
1
+ # Lcode-agent
2
+
3
+ 一个基于 [Textual](https://textual.textualize.io/) 的终端 TUI 编码 agent。打字进去,它读你的项目、改文件、跑命令、联网查资料,全程在终端里完成。
4
+
5
+ ## 特性
6
+
7
+ - **流式对话**:思考过程默认折叠、正文 Markdown 渲染;等待/思考/跑工具状态栏实时反馈,随时 Esc 打断
8
+ - **内置工具**:`read_file` / `write` / `search_replace`(带 diff 高亮)/ `list_dir` / `grep`(自动用 ripgrep 加速)/ `run_terminal_command`(输出实时刷进卡片)/ `todo_write`(待办面板)/ `web_search` / `web_fetch`
9
+ - **上下文管理**:达到模型窗口阈值自动把旧对话压成摘要(`/zip` 可手动触发),只读工具的大结果进上下文前自动截短,底部栏实时显示占用
10
+ - **会话管理**:多窗口会话、自动快照、`/history` 回退到任意一问之前的代码和对话
11
+ - **多模型**:`models` 列表 + `/model` 弹窗切换(Ctrl+M),推理模型还能选 `reasoning_effort`(default/low/medium/high),从 `/models` 元数据自动识别支持的等级
12
+ - **省 token 可见**:底部栏显示缓存命中百分比、估算费用(配置单价后)、上下文占用
13
+ - **稳定发送**:请求失败自动重试 10 次,输入框上方红字显示错误和 `重试 n/10`;服务端不认的参数(如 `reasoning_effort`)自动降级重发
14
+ - **多模态**:`/img` 附加图片随消息发送
15
+ - **数据安全**:改文件前自动快照,回退可还原;会话/检查点/快照全部落盘 SQLite
16
+
17
+ ## 运行
18
+
19
+ 需要 Python 3.14+ 和 [uv](https://docs.astral.sh/uv/):
20
+
21
+ ```bash
22
+ uv run lcode
23
+ ```
24
+
25
+ 等价方式:`uv run python -m lcode`。开发模式(带 dev console):
26
+
27
+ ```bash
28
+ uv run textual run
29
+ ```
30
+
31
+ ## 配置
32
+
33
+ 所有配置集中在一个文件:`~/.lcode/config.json`(首次启动自动生成完整模板,缺的键自动补全)。
34
+
35
+ ```jsonc
36
+ {
37
+ // 接口地址(OpenAI 兼容,填到 /v1 为止)
38
+ "url": "https://api.example.com/v1",
39
+ // 协议类型:"completions"(/chat/completions)或 "responses"(/responses),失败会自动互为备用
40
+ "requestType": "responses",
41
+ // 当前模型;models 是可切换列表(/model 弹窗里显示的就是它)
42
+ "model": "deepseek-v4-pro-0813",
43
+ "models": ["deepseek-v4-pro-0813", "deepseek-v4-flash"],
44
+ // 密钥;也可以用环境变量 LCODE_API_KEY(优先级更高)
45
+ "apiKey": "sk-xxx",
46
+ // 单次回答输出上限 / 请求超时秒数
47
+ "maxTokens": 4096,
48
+ "timeoutSeconds": 180,
49
+ // 上下文用到模型窗口的百分比时自动压缩
50
+ "autoCompactPercent": 85,
51
+ // 推理等级:"" 为不发送参数;也可在应用里 /effort 切换
52
+ "reasoningEffort": "",
53
+ // 权限模式:ask 敏感操作先确认 / pass 全自动(Shift+Tab 可切换)
54
+ "permissionMode": "ask",
55
+ // 每百万 token 单价(美元),配了才会在底部栏显示估算费用
56
+ "pricing": { "input": 0.3, "output": 1.2, "cacheRead": 0.03 }
57
+ }
58
+ ```
59
+
60
+ 不需要的键可以删掉,程序会按出厂默认(`src/lcode/default_config.json`)补全;模型相关的改动也可以不编辑文件,直接在应用里 `/model` 切换。
61
+
62
+ ## 快捷键
63
+
64
+ | 按键 | 作用 |
65
+ | --- | --- |
66
+ | `Enter` | 发送消息 / 确认弹层选择 |
67
+ | `Esc` | 打断生成 / 关闭弹层 / 再按返回上级 |
68
+ | `Ctrl+C` | 生成中打断;空闲时退出 |
69
+ | `Ctrl+M` | 弹出模型选择器 |
70
+ | `Shift+Tab` | 切换 ask / pass 权限模式 |
71
+ | `Tab` | 补全命令 / `@` 文件路径 |
72
+ | `↑` / `↓` | 移动弹层选项、翻输入历史 |
73
+ | `Ctrl+Q` | 退出 |
74
+
75
+ 输入 `@` 会弹出项目文件补全;点击头部灯笼有彩蛋。
76
+
77
+ ## 斜杠命令
78
+
79
+ | 命令 | 作用 |
80
+ | --- | --- |
81
+ | `/new` | 新开一个对话窗口,当前会话收进栈 |
82
+ | `/changewin` | 切换历史窗口(可跟 id 前缀) |
83
+ | `/zip` | 手动压缩上下文,可加保留提示,如 `/zip 保留工具调用细节` |
84
+ | `/history` | 回退到某次提问前的代码和对话 |
85
+ | `/model` | 弹出模型列表切换;`/model 2` 按序号、`/model <id>` 直接切 |
86
+ | `/effort` | 推理等级;`/effort low\|medium\|high\|default` |
87
+ | `/rename` | 给当前窗口改名 |
88
+ | `/delwin` | 删除一个历史窗口 |
89
+ | `/export` | 当前窗口导出成 Markdown |
90
+ | `/img` | 附加图片随下一条消息发送,可多次叠加 |
91
+ | `/ask` `/pass` | 切换权限模式 |
92
+
93
+ ## 数据存在哪
94
+
95
+ - `~/.lcode/config.json` —— 全部配置(模型、密钥、权限模式)
96
+ - `~/.lcode/lcode.db` —— 会话消息、压缩摘要、检查点与文件快照(SQLite,WAL 模式)
97
+ - 导出的 Markdown 和回退还原的项目文件在项目目录内
98
+
99
+ ## 代码结构
100
+
101
+ 标准 src 布局,发布到 PyPI 后用户 `uv tool install lcode-agent` 即得 `lcode` 命令。
102
+
103
+ ```
104
+ src/lcode/
105
+ app.py TUI:气泡、工具卡片、弹层、底部栏、渲染与交互
106
+ protocol.py OpenAI 兼容协议:流式、工具调用、用量、重试降级
107
+ tools.py 内置工具实现与参数解析
108
+ store.py SQLite 存储:消息、摘要、检查点、快照、用量
109
+ compress.py 上下文自动压缩
110
+ settings.py 配置读写与迁移(统一到 ~/.lcode/config.json)
111
+ default_config.json 出厂默认配置(随包分发)
112
+ __main__.py python -m lcode 入口
113
+ ```
@@ -0,0 +1,29 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "lcode-agent"
7
+ version = "0.1.0"
8
+ description = "一个基于 Textual 的终端 TUI 编码 agent"
9
+ readme = "README.md"
10
+ requires-python = ">=3.14"
11
+ license = { text = "MIT" }
12
+ dependencies = [
13
+ "aiohttp>=3.11.0",
14
+ "textual>=8.2.8",
15
+ ]
16
+
17
+ [project.scripts]
18
+ lcode = "lcode.app:main"
19
+
20
+ [dependency-groups]
21
+ dev = [
22
+ "textual-dev>=1.8.0",
23
+ ]
24
+
25
+ [tool.hatch.build.targets.wheel]
26
+ packages = ["src/lcode"]
27
+
28
+ [tool.hatch.build.targets.sdist]
29
+ include = ["src/lcode", "README.md"]
@@ -0,0 +1,3 @@
1
+ """Lcode:终端 TUI 编码 agent。"""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,3 @@
1
+ from lcode.app import main
2
+
3
+ main()