xg-cli 1.0__py3-none-any.whl

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.
Files changed (130) hide show
  1. xg/__init__.py +3 -0
  2. xg/__main__.py +3 -0
  3. xg/adaptive/__init__.py +27 -0
  4. xg/adaptive/calibrate.py +191 -0
  5. xg/adaptive/feedback.py +170 -0
  6. xg/adaptive/learned_rules.py +284 -0
  7. xg/adaptive/signals.py +125 -0
  8. xg/adaptive/store.py +164 -0
  9. xg/agent/__init__.py +0 -0
  10. xg/agent/plan.py +631 -0
  11. xg/agent/react.py +268 -0
  12. xg/agent/team.py +1793 -0
  13. xg/assets/router.lgb +0 -0
  14. xg/assets/router_semantics.json +21278 -0
  15. xg/assets/router_semantics.onnx +0 -0
  16. xg/cli/__init__.py +0 -0
  17. xg/cli/app.py +1372 -0
  18. xg/cli/commands.py +921 -0
  19. xg/cli/completion.py +740 -0
  20. xg/cli/help.py +185 -0
  21. xg/cli/train.py +200 -0
  22. xg/config/__init__.py +0 -0
  23. xg/config/env_writer.py +121 -0
  24. xg/config/manager.py +446 -0
  25. xg/config/mcp.py +229 -0
  26. xg/config/provider_service.py +267 -0
  27. xg/config/providers.py +46 -0
  28. xg/config/settings.py +258 -0
  29. xg/config/skills.py +100 -0
  30. xg/config/smart_router_service.py +121 -0
  31. xg/config/web.py +140 -0
  32. xg/input_history/__init__.py +7 -0
  33. xg/input_history/models.py +28 -0
  34. xg/input_history/persistence.py +126 -0
  35. xg/input_history/policy.py +39 -0
  36. xg/input_history/prompt_toolkit.py +36 -0
  37. xg/input_history/store.py +118 -0
  38. xg/llm/__init__.py +0 -0
  39. xg/llm/client.py +49 -0
  40. xg/llm/factory.py +40 -0
  41. xg/llm/openai_compat.py +275 -0
  42. xg/llm/types.py +98 -0
  43. xg/mcp/__init__.py +4 -0
  44. xg/mcp/http.py +192 -0
  45. xg/mcp/manager.py +726 -0
  46. xg/mcp/models.py +86 -0
  47. xg/mcp/protocol.py +62 -0
  48. xg/mcp/resources.py +72 -0
  49. xg/mcp/schema.py +137 -0
  50. xg/mcp/stdio.py +210 -0
  51. xg/mcp/transport.py +66 -0
  52. xg/memory/__init__.py +15 -0
  53. xg/memory/context.py +327 -0
  54. xg/memory/manager.py +111 -0
  55. xg/memory/models.py +41 -0
  56. xg/memory/project.py +187 -0
  57. xg/memory/store.py +144 -0
  58. xg/router/__init__.py +124 -0
  59. xg/router/features.py +66 -0
  60. xg/router/keywords.py +50 -0
  61. xg/router/ml_router.py +178 -0
  62. xg/router/model_tiers.py +73 -0
  63. xg/router/postprocess.py +167 -0
  64. xg/router/rule_router.py +77 -0
  65. xg/router/semantic.py +138 -0
  66. xg/safety/__init__.py +0 -0
  67. xg/safety/audit.py +96 -0
  68. xg/safety/guards.py +106 -0
  69. xg/safety/hitl.py +73 -0
  70. xg/skill/__init__.py +9 -0
  71. xg/skill/errors.py +45 -0
  72. xg/skill/loader.py +42 -0
  73. xg/skill/models.py +57 -0
  74. xg/skill/parser.py +93 -0
  75. xg/skill/policy.py +40 -0
  76. xg/skill/prompt.py +45 -0
  77. xg/skill/registry.py +169 -0
  78. xg/tool/__init__.py +0 -0
  79. xg/tool/builtin.py +356 -0
  80. xg/tool/registry.py +228 -0
  81. xg/tui/__init__.py +34 -0
  82. xg/tui/app.py +612 -0
  83. xg/tui/controller.py +1296 -0
  84. xg/tui/diagrams/__init__.py +22 -0
  85. xg/tui/diagrams/layout.py +110 -0
  86. xg/tui/diagrams/markdown.py +39 -0
  87. xg/tui/diagrams/model.py +36 -0
  88. xg/tui/diagrams/parser.py +119 -0
  89. xg/tui/diagrams/renderer.py +551 -0
  90. xg/tui/i18n.py +169 -0
  91. xg/tui/messages.py +45 -0
  92. xg/tui/plan_renderables.py +147 -0
  93. xg/tui/reducer.py +1029 -0
  94. xg/tui/renderables.py +252 -0
  95. xg/tui/state.py +240 -0
  96. xg/tui/theme.tcss +208 -0
  97. xg/tui/widgets/__init__.py +1 -0
  98. xg/tui/widgets/action_card.py +94 -0
  99. xg/tui/widgets/agent_group_card.py +39 -0
  100. xg/tui/widgets/approval_modal.py +59 -0
  101. xg/tui/widgets/collapsible_card.py +40 -0
  102. xg/tui/widgets/command_suggestions.py +128 -0
  103. xg/tui/widgets/composer.py +151 -0
  104. xg/tui/widgets/config_panel.py +198 -0
  105. xg/tui/widgets/confirm_modal.py +31 -0
  106. xg/tui/widgets/footer.py +9 -0
  107. xg/tui/widgets/header.py +118 -0
  108. xg/tui/widgets/inspector.py +378 -0
  109. xg/tui/widgets/plan_modal.py +53 -0
  110. xg/tui/widgets/provider_form.py +141 -0
  111. xg/tui/widgets/queue_status.py +30 -0
  112. xg/tui/widgets/smart_router_form.py +95 -0
  113. xg/tui/widgets/transcript.py +354 -0
  114. xg/tui/workers.py +14 -0
  115. xg/web/__init__.py +21 -0
  116. xg/web/errors.py +57 -0
  117. xg/web/extract.py +127 -0
  118. xg/web/fetch.py +106 -0
  119. xg/web/markdown.py +77 -0
  120. xg/web/models.py +91 -0
  121. xg/web/providers.py +79 -0
  122. xg/web/search.py +118 -0
  123. xg/web/searxng.py +27 -0
  124. xg/web/serpapi.py +29 -0
  125. xg/web/url_policy.py +110 -0
  126. xg/web/zhipu.py +27 -0
  127. xg_cli-1.0.dist-info/METADATA +284 -0
  128. xg_cli-1.0.dist-info/RECORD +130 -0
  129. xg_cli-1.0.dist-info/WHEEL +4 -0
  130. xg_cli-1.0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,284 @@
1
+ Metadata-Version: 2.5
2
+ Name: xg-cli
3
+ Version: 1.0
4
+ Summary: XG-CLI: a commercial-grade Python Agent CLI
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: httpx>=0.27.0
7
+ Requires-Dist: joblib>=1.3
8
+ Requires-Dist: lightgbm>=4.0
9
+ Requires-Dist: numpy>=1.26
10
+ Requires-Dist: onnxruntime>=1.17
11
+ Requires-Dist: prompt-toolkit>=3.0.43
12
+ Requires-Dist: python-dotenv>=1.0.1
13
+ Requires-Dist: rich>=13.7.0
14
+ Requires-Dist: scikit-learn>=1.4
15
+ Requires-Dist: textual>=0.70.0
16
+ Requires-Dist: tokenizers>=0.15
17
+ Provides-Extra: semantic
18
+ Requires-Dist: optimum[onnxruntime]>=1.16; extra == 'semantic'
19
+ Requires-Dist: safetensors>=0.4; extra == 'semantic'
20
+ Requires-Dist: torch>=2.2; extra == 'semantic'
21
+ Requires-Dist: transformers>=4.40; extra == 'semantic'
22
+ Description-Content-Type: text/markdown
23
+
24
+ # XG-CLI
25
+
26
+ Python Agent CLI 。终端交互的 Agent 命令行工具,支持 ReAct 直接执行、`/plan` 计划模式和 `/team` Multi-Agent 协作,内置文件读写、代码搜索与命令执行工具。
27
+
28
+
29
+ ## 快速开始
30
+
31
+ 要求:Python 3.11+,[uv](https://docs.astral.sh/uv/)。
32
+
33
+ ```bash
34
+ # 安装依赖
35
+ uv sync
36
+
37
+ # 配置 API(复制示例并填写)
38
+ cp .env.example .env
39
+
40
+ # 启动
41
+ uv run xg
42
+ ```
43
+
44
+ `.env` 最小配置(单 provider,openai 为默认 provider):
45
+
46
+ ```
47
+ XG_OPENAI_API_KEY=sk-xxx # 至少配置一个 provider 的专属 Key
48
+ XG_MODEL=gpt-4o-mini # 可选
49
+ ```
50
+
51
+ ## 多 provider
52
+
53
+ 内置 openai / deepseek / glm / kimi 四个 provider(均可走 OpenAI 兼容协议)。每个 provider 的 **URL 和 API Key 都能独立配置**,全部放 `.env`:
54
+
55
+ ```
56
+ XG_PROVIDER=deepseek # 激活哪个 provider
57
+ XG_OPENAI_API_BASE=https://api.openai.com/v1
58
+ XG_OPENAI_API_KEY=sk-xxx
59
+ XG_DEEPSEEK_API_BASE=https://api.deepseek.com/v1
60
+ XG_DEEPSEEK_API_KEY=sk-xxx
61
+ XG_GLM_API_BASE=https://open.bigmodel.cn/api/paas/v4
62
+ XG_GLM_API_KEY=sk-xxx
63
+ XG_KIMI_API_BASE=https://api.moonshot.cn/v1
64
+ XG_KIMI_API_KEY=sk-xxx
65
+ ```
66
+
67
+ Key 读取:每个 provider 必须配置自己的专属 `XG_<NAME>_API_KEY`(无通用兜底),占位值(`sk-xxx`)会被忽略。URL 优先级:专属 `XG_<NAME>_API_BASE` > 配置文件/内置预设(`XG_API_BASE` 仅对 openai 兼容生效)。
68
+
69
+ 启动后运行时切换(无需重启):
70
+
71
+ | 命令 | 行为 |
72
+ |------|------|
73
+ | `/model` | 列出所有 provider 与当前激活项 |
74
+ | `/model deepseek` | 切换到该 provider 的默认模型 |
75
+ | `/model glm/glm-4-plus` | 切换到指定模型 |
76
+ | `/model gpt-4o` | 当前 provider 内切换模型名 |
77
+
78
+ 切换结果持久化到 `~/.xg/config.json`,重启后仍生效。配置优先级:环境变量/.env > 项目级 `.xg/config.json` > 用户级 `~/.xg/config.json` > 默认值。
79
+
80
+ ## 使用
81
+
82
+ 启动后直接输入任务,Agent 会自动调用工具完成多步操作(读目录 → 找文件 → 改内容 → 执行命令验证等)。
83
+
84
+ 斜杠命令:
85
+
86
+ | 命令 | 说明 |
87
+ |------|------|
88
+ | `/plan <任务>` | 计划模式:先拆解为子任务 DAG,审阅后按轮执行(见下) |
89
+ | `/team <任务>` | Multi-Agent 模式:Supervisor 调度隔离 Worker,审查证据并定向修复(见下) |
90
+ | `/init` | 分析当前项目,预览并生成 `XG.md` 项目记忆(已有文件不覆盖) |
91
+ | `/save <内容>` | 显式保存一条当前项目长期记忆 |
92
+ | `/memory list\|search\|delete\|clear` | 管理当前项目的长期记忆 |
93
+ | `/model` | 切换 provider / 模型(见上) |
94
+ | `/config` | 显示当前生效配置(Key 脱敏) |
95
+ | `/config list` | provider 能力表 |
96
+ | `/config get <key>` | 查看配置项 |
97
+ | `/config set <key> <value>` | 设置并持久化到 `~/.xg/config.json` |
98
+ | `/mcp status` | 查看 MCP Server、工具和 resources 状态 |
99
+ | `/web status|providers|search|fetch` | 查看状态、搜索公开互联网或抓取公开网页 |
100
+ | `/mcp restart|logs|enable|disable|resources` | 管理 MCP Server |
101
+ | `/skill list` | 查看当前项目可用的 Skill 元信息 |
102
+ | `/skill load <name> [reference ...]` | 手动按需加载 Skill 和指定参考资料 |
103
+ | `/skill enable|disable <name>` | 启用或禁用 Skill |
104
+ | `/history status` | 查看当前项目输入历史状态 |
105
+ | `/history clear` | 清理当前项目输入历史 |
106
+ | `/hitl` | 查看 HITL 审批状态 |
107
+ | `/hitl on\|off` | 开启 / 关闭危险操作审批 |
108
+ | `/clear` | 清空当前对话上下文 |
109
+ | `/exit` | 退出 |
110
+
111
+ ## 计划模式
112
+
113
+ ReAct 之外的第二条执行路径。`/plan <任务>` 把多步任务先拆解为「子任务 + 依赖图」,经审阅后按依赖轮次执行:
114
+
115
+ 1. **拆解**:LLM 独立调用生成结构化 JSON(子任务 + 依赖),自动校验与修复(JSON 解析失败带错误重试上限 2 次;未知依赖/自依赖自动移除;环检测;超上限截断)
116
+ 2. **轮次生成**:Kahn 拓扑排序产出依赖轮次,无依赖子任务同轮并行
117
+ 3. **审阅**:渲染计划面板后交互决策——`Enter` 执行 / `d` 展开子任务详情 / `r` 输入补充要求重规划 / `ESC`(或 `c`)取消(不执行任何工具)
118
+ 4. **执行**:子任务以独立迷你 ReAct 循环执行(步数上限默认 10),依赖结果摘要注入下游上下文;子任务失败时错误注入依赖方让其自行调整,失败数超过上限(默认 3)终止剩余轮次
119
+ 5. **汇总**:`plan_done` / `plan_failed` 面板展示各子任务状态与结果
120
+
121
+ 子任务执行复用全部安全机制:并行工具、HITL 审批、策略层黑名单/路径越界拒绝、审计(含 `subtask_started` / `subtask_done` 事件)。
122
+
123
+ ## Multi-Agent Team 模式
124
+
125
+ `/team <任务>` 用于复杂任务。Planner 生成带角色、依赖、资源范围和验收标准的 DAG;用户确认后,Supervisor 调度隔离上下文的 Coder、Tester 等 Worker。Worker 产生的工具结果和最终报告会收集为进程内 Artifact,供 Reviewer 检查工具结果与验证证据;Artifact 不是文件快照,完整 diff/snapshot 审查属于后续增强。
126
+
127
+ 审查失败时只生成针对问题的 Repair 任务,默认最多修复 2 次;存在资源范围冲突的任务会自动串行化。所有 Worker 仍然经过统一的 HITL、PathGuard、CommandGuard、ToolRegistry 和 Audit 链路。简单任务不需要使用 `/team`,`/plan` 的行为保持兼容。
128
+
129
+ ## 安全机制
130
+
131
+ - **并行执行**:模型一轮返回多个工具调用时并行执行(默认 4 并发),结果按原始顺序回灌
132
+ - **HITL 审批**:危险操作(默认 `execute_command` 必审、`write_file` 确认)执行前弹审批:`Enter` 批准 / `a` 本会话全部放行 / `r` 拒绝 / `s` 跳过 / `e` 改参后执行
133
+ - **策略层**:路径越界(PathGuard,含 symlink 逃逸)与黑名单命令(CommandGuard)直接拒绝,**不可被审批绕过**
134
+ - **审计日志**:所有工具调用/审批/拒绝记录到 `.xg/audit.log`(JSONL,敏感字段脱敏)
135
+
136
+ 内置工具:`read_file` / `write_file` / `list_dir` / `glob_files` / `grep_code` / `execute_command` / `web_search` / `web_fetch` / `load_skill`(按配置启用)。
137
+
138
+ ## Web 只读联网能力
139
+
140
+ 提供 `web_search` 和 `web_fetch` 两个异步内置工具。搜索支持智谱、SerpAPI、SearXNG 三种 provider;抓取只允许公开 HTTP(S) 网页,逐跳校验 DNS 和重定向,拒绝 localhost、内网/保留 IP、非文本资源、超大响应和登录/动态页面。网页内容会标记为外部不可信资料,不会获得新的工具权限。
141
+
142
+ 默认不启用搜索 provider,但 XG 仍可启动;抓取不依赖搜索配置。可通过环境变量或 `.xg/web.json` 配置,常用变量见 `.env.example`。命令行中使用 `/web status`、`/web providers`、`/web search <query>` 和 `/web fetch <url>`。
143
+
144
+ ## Skill 技能系统
145
+
146
+ Skill 是可发现、按需加载的本地任务规范,不是脚本、插件或新的执行权限。XG 启动时只扫描 `SKILL.md` 的名称和描述并注入有限索引;Agent 或用户执行 `/skill load <name>` 后,才读取正文和明确指定的 `references/` 文件。Skill 中的文字仍是补充资料,不能覆盖系统提示、安全策略、HITL 或工具权限。
147
+
148
+ Skill 目录按优先级从低到高合并:内置 `xg/skills/`、用户级 `~/.xg/skills/`、项目级 `<project>/.xg/skills/`。同名 Skill 由高层完整覆盖。用户/项目启用状态保存在对应层的 `skills.json`,常用命令为 `/skill list`、`/skill load <name>`、`/skill enable <name>` 和 `/skill disable <name>`。默认的索引、正文和 reference 大小限制见 `.env.example`;`XG_SKILLS_ENABLED=off` 时不会注册 `load_skill`,其他工具仍可用。
149
+
150
+ ## 输入历史
151
+
152
+ 全屏 TUI 的 Composer 支持使用 `↑` / `↓` 浏览已提交的输入,找回后可以继续编辑再按 Enter 提交。命令提示展开时,上下键仍用于选择命令;计划审阅、审批和确认输入不会被历史导航覆盖。输入历史只保存用户输入,不保存模型回答、工具输出或 Agent 上下文。
153
+
154
+ 历史默认按项目隔离保存在用户目录 `~/.xg/input-history/`,敏感输入(如 API Key、密码、Bearer token、`/save` 和 `/config set`)不会写入磁盘。可使用 `/history status` 查看状态、`/history clear` 清理历史,或通过 `.env` 中的 `XG_INPUT_HISTORY_*` 变量关闭持久化、调整数量和大小限制。
155
+
156
+ ## MCP 外部能力
157
+
158
+ XG 可以通过 MCP 接入外部工具和 resources,支持本地 `stdio` 子进程与 `Streamable HTTP`。用户级配置位于 `~/.xg/mcp.json`,项目级配置位于 `.xg/mcp.json`;同名 Server 由项目配置覆盖,敏感值使用 `${VAR}` 从环境变量或 `.env` 展开。
159
+
160
+ ```json
161
+ {
162
+ "servers": {
163
+ "local_docs": {
164
+ "transport": "stdio",
165
+ "command": "python",
166
+ "args": ["-m", "my_docs_mcp"],
167
+ "env": {"DOCS_TOKEN": "${DOCS_TOKEN}"}
168
+ },
169
+ "remote": {
170
+ "transport": "streamable_http",
171
+ "url": "https://mcp.example.com/mcp",
172
+ "headers": {"Authorization": "Bearer ${MCP_TOKEN}"}
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ Server 工具会动态注册为 `mcp__{server}__{tool}`,默认经过 HITL 确认并写入 `.xg/audit.log`。resources 可由 Agent 通过虚拟 list/read 工具读取,也可以在输入中显式引用:
179
+
180
+ ```text
181
+ 根据 @local_docs:file:///specs/api.md 检查当前实现
182
+ ```
183
+
184
+ 常用管理命令:`/mcp status`、`/mcp restart <server>`、`/mcp logs <server>`、`/mcp enable <server>`、`/mcp disable <server>`、`/mcp resources [server]`。MCP Server 是外部代码/服务,只应启用可信配置;不要把真实 token 直接写入 `mcp.json`。
185
+
186
+ ## 记忆与上下文
187
+
188
+ - 项目根目录的 `XG.md`(共享)和 `XG.local.md`(本地可选)会自动注入每次任务;运行中修改后下一次顶层任务自动热加载。
189
+ - `/save <内容>` 将用户明确提供的内容保存到项目 `.xg/memory.db`,不会自动保存普通聊天;`/clear` 不会清除长期记忆。
190
+ - 长对话接近上下文预算时会自动压缩较旧的完整对话轮次,保留最近轮次和工具调用关系;无法安全压缩时才停止并提示。
191
+ - `.xg/memory.db` 是本地明文数据库,项目记忆会发送给当前 LLM provider。不要在 `XG.md` 或 `/save` 中放置 API Key、密码等敏感信息。
192
+
193
+ ## 全屏 TUI
194
+
195
+ `/plan` 生成的计划直接以内嵌 `PlanCard` 出现在对话流中,不打开新的审阅界面。审阅期间普通输入禁用;`Enter` 执行、`d` 展开或折叠任务详情、`r` 输入重规划要求、`Esc` 取消计划。
196
+
197
+ 使用 Textual 将 inline CLI 升级为全屏终端界面:
198
+
199
+ - Header:provider、model、上下文比例、HITL 和任务状态
200
+ - Transcript:流式 Markdown、工具调用卡片、错误和计划进度
201
+ - Composer:多行输入、命令补全、历史和快捷键
202
+ - Modal:HITL 审批、`/init` 与记忆清空确认;Plan 使用对话内嵌卡片审阅
203
+ - Inspector:Session、Plan、Memory、Safety 状态面板
204
+
205
+ 当前入口为 `xg` 默认全屏、`xg --inline` 保留兼容模式,并支持 `xg --tui` 强制全屏、`xg --no-tui` 兼容 inline。全屏 TUI 不改变 ReAct、Plan、Memory、ToolRegistry 或安全策略核心;非交互终端仍使用 inline fallback。
206
+
207
+ ## 配置项
208
+
209
+ | 环境变量 | 说明 |
210
+ |----------|------|
211
+ | `XG_PROVIDER` | 激活的 provider(openai / deepseek / glm / kimi 或自定义),优先于配置文件 |
212
+ | `XG_<NAME>_API_BASE` | 各 provider 专属 URL,如 `XG_DEEPSEEK_API_BASE` |
213
+ | `XG_<NAME>_API_KEY` | 各 provider 专属 Key(必配,无通用兜底),如 `XG_DEEPSEEK_API_KEY` |
214
+ | `XG_API_BASE` | 旧键兼容,仅对 openai 生效 |
215
+ | `XG_MODEL` | 默认模型(未配置 active_model 时生效) |
216
+ | `XG_CONTEXT_WINDOW` | 上下文窗口(token),覆盖 provider 能力声明 |
217
+ | `XG_CONTEXT_BUDGET_RATIO` | 自动压缩前的输入预算比例(默认 0.8,限制 0.5~0.9) |
218
+ | `XG_CONTEXT_KEEP_RECENT_TURNS` | 自动压缩保留的最近完整对话轮次(默认 4) |
219
+ | `XG_CONTEXT_SUMMARY_MAX_TOKENS` | 摘要输出动态预留上限(默认 4096) |
220
+ | `XG_MEMORY_PROMPT_MAX_CHARS` | 自动注入长期记忆的字符上限(默认 8000) |
221
+ | `XG_PROJECT_MEMORY_MAX_CHARS` | 单个项目记忆文件读取上限(默认 32000) |
222
+ | `XG_TOOL_STEPS` | 单轮工具调用步数上限(默认 20) |
223
+ | `XG_LLM_RETRY_ENABLED` | LLM 临时故障自动重试开关(on 默认) |
224
+ | `XG_LLM_MAX_RETRIES` | 单次 LLM 请求最大重试次数(默认 2) |
225
+ | `XG_LLM_RETRY_BASE_DELAY` | LLM 重试基础退避秒数(默认 1) |
226
+ | `XG_LLM_RETRY_MAX_DELAY` | LLM 重试最大单次等待秒数(默认 8) |
227
+ | `XG_LLM_RETRY_JITTER` | LLM 重试随机抖动比例(默认 0.25) |
228
+ | `XG_LLM_RETRY_TOTAL_TIMEOUT` | 单次 LLM 请求重试总等待上限秒数(默认 30) |
229
+ | `XG_LLM_RESPECT_RETRY_AFTER` | 是否遵循服务端 Retry-After(on 默认) |
230
+ | `XG_MAX_PARALLEL` | 并行工具执行并发数(默认 4) |
231
+ | `XG_TOOL_TIMEOUT` | 单工具执行超时秒数(默认 120) |
232
+ | `XG_HITL` | 危险操作审批开关(on 默认 / off 危险模式) |
233
+ | `XG_PLAN_MAX_SUBTASKS` | 计划模式子任务数上限(默认 12,超出截断) |
234
+ | `XG_PLAN_SUBTASK_STEPS` | 计划模式单个子任务最大工具步数(默认 10) |
235
+ | `XG_PLAN_MAX_FAILURES` | 计划级允许失败数(默认 3,超出终止剩余轮次) |
236
+ | `XG_TEAM_MAX_AGENTS` | `/team` 同时运行的 Agent 数量上限(默认 4) |
237
+ | `XG_TEAM_MAX_REPAIRS` | `/team` 单个任务的定向修复次数上限(默认 2) |
238
+ | `XG_TEAM_RESEARCHER_STEPS` | `/team` researcher 步数覆盖值(默认使用角色值 20) |
239
+ | `XG_TEAM_REVIEWER_STEPS` | `/team` reviewer 步数覆盖值(默认使用角色值 10) |
240
+ | `XG_TEAM_CODER_STEPS` | `/team` coder 步数覆盖值(默认使用角色值 12) |
241
+ | `XG_TEAM_TESTER_STEPS` | `/team` tester 步数覆盖值(默认使用角色值 12) |
242
+ | `XG_TEAM_REPAIRER_STEPS` | `/team` repairer 步数覆盖值(默认使用角色值 12) |
243
+ | `XG_TEAM_SYNTHESIZER_STEPS` | `/team` synthesizer 步数覆盖值(默认使用角色值 8) |
244
+ | `XG_TEAM_MAX_STEPS` | `/team` 单个 Agent 的步数硬上限(默认 40) |
245
+ | `XG_TEAM_RECOVERY_STEPS` | `/team` 只读任务恢复执行的步数(默认 10) |
246
+ | `XG_TEAM_MAX_RECOVERIES` | `/team` 只读任务自动恢复次数(默认 1) |
247
+ | `XG_TEAM_REVIEW` | `/team` 任务级证据审查开关(on 默认) |
248
+ | `XG_MCP_ENABLED` | MCP 总开关(on 默认) |
249
+ | `XG_MCP_STARTUP_TIMEOUT` | MCP Server 初始化超时秒数(默认 15) |
250
+ | `XG_MCP_REQUEST_TIMEOUT` | MCP 单请求超时秒数(默认 120) |
251
+ | `XG_MCP_MAX_SERVERS` | MCP Server 数量上限(默认 32) |
252
+ | `XG_MCP_MAX_TOOLS` | 每个 Server 工具数上限(默认 256) |
253
+ | `XG_MCP_MAX_RESOURCES` | 每个 Server resource 数上限(默认 512) |
254
+ | `XG_MCP_RESOURCE_MAX_CHARS` | 单 resource 文本上限(默认 32000) |
255
+ | `XG_WEB_ENABLED` | Web 工具总开关(默认 on) |
256
+ | `XG_WEB_SEARCH_PROVIDER` | 搜索 provider:none / zhipu / serpapi / searxng |
257
+ | `XG_WEB_TIMEOUT` | 搜索/抓取超时秒数(默认 15) |
258
+ | `XG_WEB_MAX_RESPONSE_BYTES` | 单网页响应字节上限(默认 2 MiB) |
259
+ | `XG_WEB_FETCH_MAX_CHARS` | 单网页正文字符上限(默认 32000) |
260
+ | `XG_WEB_MAX_REDIRECTS` | 最大重定向次数(默认 5) |
261
+ | `XG_WEB_RATE_LIMIT_PER_MINUTE` | 每类 Web 调用每分钟上限(默认 30) |
262
+ | `XG_SKILLS_ENABLED` | Skill 总开关(默认 on) |
263
+ | `XG_SKILLS_MAX_INDEX_ITEMS` | system prompt 最多展示的 Skill 数(默认 20) |
264
+ | `XG_SKILLS_MAX_INDEX_CHARS` | Skill 索引字符上限(默认 4096) |
265
+ | `XG_SKILLS_MAX_CHARS` | 单个 Skill 正文字符上限(默认 32000) |
266
+ | `XG_SKILLS_MAX_REFERENCE_CHARS` | 单个 reference 字符上限(默认 16000) |
267
+ | `XG_SKILLS_MAX_LOADED_CHARS` | 单次 Skill 加载总字符上限(默认 64000) |
268
+ | `XG_INPUT_HISTORY_ENABLED` | Composer 输入历史总开关(默认 on) |
269
+ | `XG_INPUT_HISTORY_PERSIST` | 是否持久化非敏感输入历史(默认 on) |
270
+ | `XG_INPUT_HISTORY_MAX_ENTRIES` | 每个项目保留的历史条数(默认 100) |
271
+ | `XG_INPUT_HISTORY_MAX_CHARS` | 单条历史输入字符上限(默认 8000) |
272
+ | `XG_INPUT_HISTORY_MAX_BYTES` | 单项目历史文件字节上限(默认 1 MiB) |
273
+
274
+ API Key 只从环境变量 / .env 读取,不写入配置文件;`/config` 显示时脱敏。
275
+
276
+ ## 开发
277
+
278
+ ```bash
279
+ uv run pytest -m "not slow" # 常规回归
280
+ uv run pytest # 全量测试
281
+ uv run xg # 手工验收
282
+ ```
283
+
284
+ 项目分层:`xg/agent`(ReAct 循环 + 计划模式)、`xg/llm`(客户端抽象 + OpenAI 兼容实现 + 工厂)、`xg/tool`(统一工具注册表 + 内置工具)、`xg/mcp`(协议、transport、动态工具和 resources)、`xg/skill`(Skill 发现、解析、按需加载与安全策略)、`xg/input_history`(输入历史、游标、持久化与隐私策略)、`xg/memory`(项目/长期记忆 + 上下文压缩)、`xg/tui`(Textual 全屏交互层)、`xg/cli`(入口与 inline fallback)、`xg/config`(provider/MCP/Web/Skill 配置与运行时快照)。
@@ -0,0 +1,130 @@
1
+ xg/__init__.py,sha256=oZd-FG6wL2qnuSk7LgNgmuAmMvVwHHGuXU9ixHNtJQI,72
2
+ xg/__main__.py,sha256=1F1NcatfhMp0dEdHFGIX5FtItVJK6WlMX95iyr8OdBs,36
3
+ xg/adaptive/__init__.py,sha256=9uQ8ZYzDmUjdoEf8gED7Blsj4t0hAtxWtyg5YM044pE,968
4
+ xg/adaptive/calibrate.py,sha256=-WvbwdB5qFvzCYKqfTgkocLHbFm00tsvVrC2qEuw96k,7266
5
+ xg/adaptive/feedback.py,sha256=44TlKxCelCS6Ydsug-kZig47o-boFVcgCcS27NYta_4,6040
6
+ xg/adaptive/learned_rules.py,sha256=ucrrdUJVVq_f4gnHdxVcJqtc3YSZq-uU7b_kO8yoRCc,10771
7
+ xg/adaptive/signals.py,sha256=-RH6TEyvThg37Sjn12rnjuhmeT8MQYsLdyO_HJBPrtE,4495
8
+ xg/adaptive/store.py,sha256=VB-101HZR2Ovjhj-AKPyf4oyCmW71R3L1AERDZSy1iE,5566
9
+ xg/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ xg/agent/plan.py,sha256=JwdVytj0bw8ok7l-NjUbVN1esVladRf5Sm8PD2mbPZQ,26952
11
+ xg/agent/react.py,sha256=4QDGYtFayoLfKDYeUkKMdBocoTTKyGmLStn_dJD057g,12578
12
+ xg/agent/team.py,sha256=yf6PItJLd8Lxxa7_FbBF_6yeFCnNn2d6gF4kWUSWNCY,85740
13
+ xg/assets/router.lgb,sha256=jbj9GktuHxz3FjERigoQIxSQDjW25F8sJFkXnuxhXEE,36063
14
+ xg/assets/router_semantics.json,sha256=SM6l1EQkkSpv0epke_T-ULVauLHlh5wydfgOM56PriY,439125
15
+ xg/assets/router_semantics.onnx,sha256=h4R3k_rIZtZbGc7i5zprKiRGoSYqsJEbHb-bPpOZ750,23902398
16
+ xg/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ xg/cli/app.py,sha256=UaJq7a2ZofPoMHIpMR-263KiG8GV1IMzIBj57BDieKk,60830
18
+ xg/cli/commands.py,sha256=dfw7oVUH_XpVAkpK0LOEsLvddNJ8xI3o8Bf8O4m2kOw,40389
19
+ xg/cli/completion.py,sha256=_0aBCC2ALXmynJcOJxMpBmzqWJskEf22P8zCbaOU5C8,27586
20
+ xg/cli/help.py,sha256=BkilXpngE3LlVQdoGkdU3o1VbufhjYo2aBodZ8czEP0,5984
21
+ xg/cli/train.py,sha256=7juE3v-IdWnpqgF1Z5pwScIUjaQfkuWmUkMSxbdFltw,7117
22
+ xg/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ xg/config/env_writer.py,sha256=KjoEPe5DV2zdHytVl1Wd1v2fNFx9rQBL9DBOLIsLycc,4588
24
+ xg/config/manager.py,sha256=kdLhV4O60HnojXzIac3O1-h9ZUokd3UeWkqFxR7A6Ks,17703
25
+ xg/config/mcp.py,sha256=DKuxoCTGrQvkYTxPybtO-xs1UK3fV4_fiVL6NP3_ZuY,9959
26
+ xg/config/provider_service.py,sha256=CHmIK5b3aWQ0fX8fFlPpWR7PyONKLW7ug-umaRkfzKc,12031
27
+ xg/config/providers.py,sha256=z4pYAccQ-pUkfPHR2I20Xfoq9o4jppfGcaJr2QmPdwE,1840
28
+ xg/config/settings.py,sha256=6gQ3-FXsG4l2C2IRZ90WvmN2WHfOqiPwC7vEIE5m-WQ,13403
29
+ xg/config/skills.py,sha256=wx97NPCU3gjvifj4oI1efAhLAVozxhvPkT_S1w9NggE,4333
30
+ xg/config/smart_router_service.py,sha256=Fsd6vYuzR-UNi-ZQpL3g_CXrAhrV4IYp977EVt33bFQ,4670
31
+ xg/config/web.py,sha256=elEB20iFmv3TXV2dW1goT9zRMUtY79gxvn9DgrOMFSU,6687
32
+ xg/input_history/__init__.py,sha256=CA8HL2mRrAx8E7agLU_KdA7REjrpxdfSX6RzS6DPo7A,365
33
+ xg/input_history/models.py,sha256=bcpj9VS9zjM-DrFco6wthmVHiVGUQgJXZCCtxjbZWSg,542
34
+ xg/input_history/persistence.py,sha256=RuOa0kl9GoPq3yJvPbHglfB_aAfvSEIH-70-EYvN9yM,4618
35
+ xg/input_history/policy.py,sha256=WDsxZI8z5DSlpPxWvXtTgJhyjOas9RNj1HjZD9lo9eo,1359
36
+ xg/input_history/prompt_toolkit.py,sha256=SK3cNBW1rbuEapu9sVrs9dK88rNGefoEF0P086ri8so,1257
37
+ xg/input_history/store.py,sha256=lFvMlSZGpqMMbte1d4pEw0VfIp3p6C9kS5lPnTY8p_o,4880
38
+ xg/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ xg/llm/client.py,sha256=g8_c0dwy7w80KzZPYzJYvkp0iZFYeV7c1dqJiNndY-Q,1522
40
+ xg/llm/factory.py,sha256=6X5kY7vd26b_72no_EXNm0F2qp4CoBvceo8m-mUgBVo,1241
41
+ xg/llm/openai_compat.py,sha256=vfj7NMBZGCg1A27OO2VBfNtZMMla7BECgDd-B1gScWw,11358
42
+ xg/llm/types.py,sha256=Tij4cGMZOajXzLOgMt5ek2-AQJ1dqhH0s8k9Ebw6K0Q,2843
43
+ xg/mcp/__init__.py,sha256=LRjPh1PobrCovAeVTF8YPai0MT0BlN5dVaVJyWUOeN0,217
44
+ xg/mcp/http.py,sha256=53hdEPsxjypa5nNxkTz0Ih_C5TY-2Dpcwros_3aIJNM,8652
45
+ xg/mcp/manager.py,sha256=stRJhZtIrl8d4kXEHDcNVcYrCyiOvyDn-q-PD2XTlWM,31600
46
+ xg/mcp/models.py,sha256=3cKRLUYkwaitr7esT-57i3-fsM2Q7mUeqnwSpletS9Y,2071
47
+ xg/mcp/protocol.py,sha256=voaXTXVV42R10nQwvx4_4Fs3APZ2nwY13i5funketOw,1923
48
+ xg/mcp/resources.py,sha256=SCGjn-NMPGn9rF-rGvOiNzkiwexwbkMVMVDBTnlSMi0,2247
49
+ xg/mcp/schema.py,sha256=GHtM8w83sQGdEgqT0VHM4p-JvDEuxr2EAbAJ4hGJers,6186
50
+ xg/mcp/stdio.py,sha256=2htSqB26fy_dByb6vLpFqIANEkUq6mUGNRwaPYSpr-w,9327
51
+ xg/mcp/transport.py,sha256=n6SPYwWKS7S395IzK-FGMAaxM-xz7JKGWASR4o2Kb7U,2243
52
+ xg/memory/__init__.py,sha256=rJ_GqJs1ifHwfVnEcdOA6QDGQgUsX_9AEgRkkCxyzyg,436
53
+ xg/memory/context.py,sha256=recBybTuBvejae0qxRgrL1LS7gvHy5Y_LquyLja4Kyg,13435
54
+ xg/memory/manager.py,sha256=dwg96TDhmowT68CC6h6faSZdv8HEg7XtHzIUY4mB6t4,3868
55
+ xg/memory/models.py,sha256=3uOcKNfHs_TyxwFf2EXpqjtAtmRAfG1UmOWi0RGB0BM,890
56
+ xg/memory/project.py,sha256=4hzjIEQo9kRJ95mkAuIQ8tKVzfJWF2nGyVlGtX7UVZ0,6908
57
+ xg/memory/store.py,sha256=5-E0Vti1mQ6wsbGCYR86psXqduxQTRNnxI81hK8n2GM,5436
58
+ xg/router/__init__.py,sha256=gbSVFuLT1PhhZf3EwxJk5I72k22-RxmXQCk9UNpQOn4,4729
59
+ xg/router/features.py,sha256=zhwRabEI2IsFu2CcYYDuctpoaNHMt-qF_topc1Ie_gY,2446
60
+ xg/router/keywords.py,sha256=PrdGu7NKJM_AAxhryF8SX89KBHzqgBWJAyNnhyTT0GI,2492
61
+ xg/router/ml_router.py,sha256=YoOi84OSgBMu7RJvzk-YlOkzkBHlcdlcWIZr-IlO3v0,7516
62
+ xg/router/model_tiers.py,sha256=K7Ivabg9uc4OUPzJbRR_dLLzdT7BXuNkD1Vdto7H5eM,3126
63
+ xg/router/postprocess.py,sha256=sspzlOI1cEidtmEq6p7xuAKXa6VgqqrKEz6234unuZU,7092
64
+ xg/router/rule_router.py,sha256=-DCGIcre2UM2kLQ41BnO4oSkoRYwewUmoh7Di2D943Y,3351
65
+ xg/router/semantic.py,sha256=WAzPF8mjBN4zQQv3FMzJ02IxXmsm3hJQ56C0Ww99nN0,5393
66
+ xg/safety/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ xg/safety/audit.py,sha256=yl46ZrFcNqi_2gTFYXqW2U9iN10Nxglz5_j-nxsvlB4,3592
68
+ xg/safety/guards.py,sha256=0kV72JbpPMhFuzEJO2WB9XIxV71PaviUsCuvDAG94fA,3403
69
+ xg/safety/hitl.py,sha256=IYT3J7YJU79wAnwjUYaGZHc0gVQo4nm8KTfX2zPb9gM,2511
70
+ xg/skill/__init__.py,sha256=qmEajlwfRgyMOkrpC1ZK0qWjsOBOhGqWJ729MnM3q8c,320
71
+ xg/skill/errors.py,sha256=LN6bs4eLvM3nC6uz23392dEJLB-2mQFigL5c351CMZk,1226
72
+ xg/skill/loader.py,sha256=f2NQsA7h-gB2FjgxABiBK5h898sDujKwnAU31DsRMrk,1857
73
+ xg/skill/models.py,sha256=t1uaSrnLcRCGn9UrtdRR-DZlIZWZQkbNoRz4CAxBr9s,1155
74
+ xg/skill/parser.py,sha256=cmk-Nztq49UWbwH79iaR7Ov1ZWDvIyurt3VLeUoyPiE,3806
75
+ xg/skill/policy.py,sha256=Dlrf1hafNp63CPqQSwCAxELePzRweovU1oQNbb0cX-0,1678
76
+ xg/skill/prompt.py,sha256=AVH8mKgm-NvOGRv0b1lZZojFtt3PaIEsmIlBLmTTmdE,1622
77
+ xg/skill/registry.py,sha256=aPlPbZaW66Gm_7vGc8IeZbk_wHj8YqKqHmdpfWg-0r0,8486
78
+ xg/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ xg/tool/builtin.py,sha256=P5dIA-7vISLx-zvcMdbZax9I4ttOBnO9TYlm2Pe-FFc,15556
80
+ xg/tool/registry.py,sha256=j3W7OnEYOG1352lfrRkcMrpamS2p6rKFPPEhWXY0Yw8,8918
81
+ xg/tui/__init__.py,sha256=44lZOo9Lmc-RhhW__utArkB3zpozc6j5180cGCvDXbc,830
82
+ xg/tui/app.py,sha256=wq8ioj-Ev7GhJFBnvviVXSAgJ4DpI9wf-z2h33kV4O4,26370
83
+ xg/tui/controller.py,sha256=lPmHCsSuvd4Hz5MOLo5PfFd6y7oNzfhjckEXbt4sEI0,58000
84
+ xg/tui/i18n.py,sha256=XTrUwEtMQZidEghPXRS_mbc6YvoKtWPFvX1FieqZrKo,6444
85
+ xg/tui/messages.py,sha256=03pbOTujtpXTWLdq5dVu_njtB_pzXeA-fBiFESfcmZA,1245
86
+ xg/tui/plan_renderables.py,sha256=e5O1OA-DosYkGxi5mC_tTprpHaDTCLDKB8EmdmgTjGA,6276
87
+ xg/tui/reducer.py,sha256=4Ww6e-iCD4cLqHeMf5__EpL3tJlXj_suBp1w8M81Fig,43082
88
+ xg/tui/renderables.py,sha256=Sr8xgfPO9kpmU2NtKLy6ulP2XBKb_H2JyPZWp5nrPGE,10720
89
+ xg/tui/state.py,sha256=Bn4HKU7wAhJkvRKqDLPw-nknIvUghCMi3BIFjA04QfE,6774
90
+ xg/tui/theme.tcss,sha256=gdC3akvQGGvCrjn1T5RVoLtFen-kd7Up5l5eNqJPeYc,3098
91
+ xg/tui/workers.py,sha256=jipEWaPYj2LWS-00FgTEp_4UTvMmQwW7Ub_J391e6QE,389
92
+ xg/tui/diagrams/__init__.py,sha256=dKnsq-ucVrhXPw3t3d6Jq85m3aNs5YyUmORtsOxleAQ,722
93
+ xg/tui/diagrams/layout.py,sha256=znrkgr0_mfZlEz1OY536XcYWHOISkHdrsiFAKc47X70,4164
94
+ xg/tui/diagrams/markdown.py,sha256=tZVZ6SXJKOzk9Ujuuv2jZTP11f3IhN9nJyysNsJgBtg,1198
95
+ xg/tui/diagrams/model.py,sha256=pSBEeda84NkgwCnxCF9KHgrd_a7cLTkKPgSk_f2EhvU,829
96
+ xg/tui/diagrams/parser.py,sha256=NWQeZ-iURd2DYTX7g1LMpY7xtAnBQeh1Sma0ekxhP7s,5395
97
+ xg/tui/diagrams/renderer.py,sha256=e-AjKens48nQ3tJjDz-HPnLul4BQTIkEfoq4UPR7c-o,21695
98
+ xg/tui/widgets/__init__.py,sha256=6aHLBRv4txEcBiPuCdIKA0enVImcZAt61XT6p5tnSAY,38
99
+ xg/tui/widgets/action_card.py,sha256=TBb2qPj1BIL-rtcGfKgNRCW30UX_LSNKUtamK_87B-A,4042
100
+ xg/tui/widgets/agent_group_card.py,sha256=rHSdPY5FE81YrEL27S8Z5VKoUsCxjGsDlRxwyISdppw,1156
101
+ xg/tui/widgets/approval_modal.py,sha256=WcNecufcwK3IU5LJ3q9wp1TvYkAVtyASZudqgCzK0uQ,2139
102
+ xg/tui/widgets/collapsible_card.py,sha256=dqx8kkUdipCzEmAcLU73b2lGUfilZIIrxC4KCiHbnc0,1080
103
+ xg/tui/widgets/command_suggestions.py,sha256=72jKZ8CU6Xc7A2spTL9IWyno7y7MCEQChM9c1iCijBQ,4883
104
+ xg/tui/widgets/composer.py,sha256=rpueTL_msAnADhvJHO_-xeJonGj6DcMLo_SjnXEy_D0,5710
105
+ xg/tui/widgets/config_panel.py,sha256=Vw6kR3_2mlQ2gNiQgJpB_mKs3tabgrFmGMlEsqAA6Xg,8620
106
+ xg/tui/widgets/confirm_modal.py,sha256=9Vrfi_keKkho3IegrC3CKieD6Z5u0rYehrpnWUbCJ-g,1056
107
+ xg/tui/widgets/footer.py,sha256=RL1wn_UffhLaAIpbuJtSWKEGeyAHl-xjsFGdV-TFMgE,304
108
+ xg/tui/widgets/header.py,sha256=g3XpIHNG5EL6VibQ2dAJmL0l2i90u-fN1iP4dTvJa-I,4974
109
+ xg/tui/widgets/inspector.py,sha256=4OA9nrZvAgoKP7WsMFghPwF0aYspFu9r9ZyQabP6Vao,17709
110
+ xg/tui/widgets/plan_modal.py,sha256=m2n2QXAPSJSajQCDT65ThSJZLu5e1SE1eo-7r3oEWtQ,2112
111
+ xg/tui/widgets/provider_form.py,sha256=HBKqJEAsgPbyZzMEQlGCy-eiLJWmBktkNrr_5xDf584,6744
112
+ xg/tui/widgets/queue_status.py,sha256=KZlKlB32B5qkMceDpypVSC5crAlcvE6LFpLlrBClzSI,985
113
+ xg/tui/widgets/smart_router_form.py,sha256=2xclorypn1teUKJhOPECd2c8knAqeGbGd76DTweKOvY,3954
114
+ xg/tui/widgets/transcript.py,sha256=OwpVQrWqv4EV4XfqsyKHqHufT7056IWGYLSvrao_yGI,15160
115
+ xg/web/__init__.py,sha256=AGisXtBAgyzTYqQukrNRUMuNmiHINqlpTzT_P-1maJk,571
116
+ xg/web/errors.py,sha256=qAZQonRD41S5QLmGRd3D_r-fqenpvAVeUh9A5EIu-7s,1565
117
+ xg/web/extract.py,sha256=la34spTbdPcrLzqVg-e-NLP_b9mysVsGDJdwKF9njhw,4275
118
+ xg/web/fetch.py,sha256=7x7j9t8j-Oi9A-yazlWDvgteWOONWyjOvVVJRK-QPyA,6344
119
+ xg/web/markdown.py,sha256=e9lifB8lNOYAjpZOyWpz1deHpuWx7jODvumswt8YmHw,3117
120
+ xg/web/models.py,sha256=v9qkkzN9P2bzwT_9WXDFXbfcVH2Zo5Xs2d-CNSj8v3o,2129
121
+ xg/web/providers.py,sha256=HQiawFqzADaalLu5P--HnX0jjJ_9VuvswSEkgE2D6ss,3557
122
+ xg/web/search.py,sha256=BgqSjRyCwTwzbgFBOouNe4PFzID41b9bM1mEj03G6xQ,5772
123
+ xg/web/searxng.py,sha256=_5Rnmqydzs8IVNqfuIaiJGfb2HeU13HEuQG6ZUN1zqQ,1158
124
+ xg/web/serpapi.py,sha256=aNnybkjjUw7wicceiQsJEaq8eWZYcjWjZ1degwFukI0,1394
125
+ xg/web/url_policy.py,sha256=XFKLAH4YFL0SyuD5KPssqeo8clG5y3GS25jdOiH92xM,4501
126
+ xg/web/zhipu.py,sha256=tAxvCRP1Vi34RnrJQmp9RtP6l9e9OKN8DZJ2eewWoQ4,1330
127
+ xg_cli-1.0.dist-info/METADATA,sha256=UNQNbANeV44T2Pi4DfkBhEM49Lfez_AAYanUcQrfIK4,18083
128
+ xg_cli-1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
129
+ xg_cli-1.0.dist-info/entry_points.txt,sha256=LO-MWvPJ4riLq8WkyhbFrkvJg0ERnz9W3eNqvHwtAwc,39
130
+ xg_cli-1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ xg = xg.cli.app:main