witty-diagnosis-agent 0.3.1-beta → 0.5.0-beta
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.
- package/README.md +121 -2
- package/dist/{auto-update-checker-SCZAPT6L.js → auto-update-checker-FE7T2BSB.js} +1 -1
- package/dist/{chunk-YPQZVQVM.js → chunk-4DUKC3QP.js} +3 -1
- package/dist/{chunk-VGS3BNP5.js → chunk-4QO2HAQQ.js} +12 -7
- package/dist/cli.js +32 -9
- package/dist/index.d.ts +4 -0
- package/dist/index.js +375 -151
- package/dist/witty-diagnosis-agent.schema.json +11 -0
- package/package.json +4 -1
- package/skills/X-diagnosis-io/SKILL.md +124 -0
- package/skills/X-diagnosis-io/references/xdiagnosis_reference.md +96 -0
- package/skills/X-diagnosis-io/scripts/show_location_index.sh +50 -0
- package/skills/X-diagnosis-network-analysis/SKILL.md +63 -114
- package/skills/X-diagnosis-network-analysis/references/xdiagnosis_reference.md +68 -228
- package/skills/X-diagnosis-network-analysis/scripts/show_location_index.sh +86 -0
- package/skills/fault-rca-report-generation/SKILL.md +56 -15
- package/skills/fd-leak-diagnosis/SKILL.md +318 -0
- package/skills/fd-leak-diagnosis/references/fd_diagnosis_commands.md +250 -0
- package/skills/fd-leak-diagnosis/references/fd_leak_patterns.md +155 -0
- package/skills/fd-leak-diagnosis/references/kernel_fd_params.md +182 -0
- package/skills/fd-leak-diagnosis/scripts/01_baseline_info.sh +208 -0
- package/skills/fd-leak-diagnosis/scripts/branch_A_system_fd.sh +101 -0
- package/skills/fd-leak-diagnosis/scripts/branch_B_process_fd.sh +114 -0
- package/skills/fd-leak-diagnosis/scripts/branch_C_close_wait.sh +107 -0
- package/skills/fd-leak-diagnosis/scripts/branch_D_epoll.sh +104 -0
- package/skills/fd-leak-diagnosis/scripts/branch_E_inotify.sh +110 -0
- package/skills/fd-leak-diagnosis/scripts/branch_F_syscall.sh +111 -0
- package/skills/fd-leak-diagnosis/scripts/branch_G_deleted_file.sh +94 -0
- package/skills/fd-leak-diagnosis/scripts/branch_H_mixed.sh +136 -0
- package/skills/linux-oom-analyzer/scripts/collect_basic_info.sh +1 -1
- package/skills/offline-disk-fault-diagnosis/SKILL.md +171 -54
- package/skills/offline-disk-fault-diagnosis/references/disk_health_rules.md +89 -0
- package/skills/offline-disk-fault-diagnosis/scripts/diagnose_health_rules.py +1445 -0
- package/skills/offline-disk-fault-diagnosis/scripts/diagnose_summary.py +7 -0
- package/skills/overlayfs-diagnosis/SKILL.md +383 -0
- package/skills/overlayfs-diagnosis/references/diagnosis_patterns.md +399 -0
- package/skills/overlayfs-diagnosis/references/docker_overlay2.md +257 -0
- package/skills/overlayfs-diagnosis/references/overlayfs_basics.md +268 -0
- package/skills/overlayfs-diagnosis/scripts/01_baseline_info.sh +274 -0
- package/skills/overlayfs-diagnosis/scripts/branch_A_config_error.sh +176 -0
- package/skills/overlayfs-diagnosis/scripts/branch_B_fs_incompatible.sh +140 -0
- package/skills/overlayfs-diagnosis/scripts/branch_C_cross_device.sh +141 -0
- package/skills/overlayfs-diagnosis/scripts/branch_D_opaque_whiteout.sh +161 -0
- package/skills/overlayfs-diagnosis/scripts/branch_E_copyup_perf.sh +163 -0
- package/skills/overlayfs-diagnosis/scripts/branch_F_inotify.sh +182 -0
- package/skills/overlayfs-diagnosis/scripts/branch_G_docker_inode_exhaust.sh +139 -0
- package/skills/overlayfs-diagnosis/scripts/branch_H_docker_diff_bloat.sh +163 -0
- package/skills/overlayfs-diagnosis/scripts/branch_I_redirect_metacopy.sh +180 -0
- package/skills/overlayfs-diagnosis/scripts/branch_J_permission.sh +175 -0
- package/skills/overlayfs-diagnosis/scripts/branch_K_readdir_perf.sh +188 -0
- package/skills/overlayfs-diagnosis/scripts/branch_Z_general.sh +172 -0
- package/skills/skill-openeuler-info/SKILL.md +87 -0
- package/skills/skill-openeuler-info/scripts/check_system_info.sh +170 -0
- package/skills/strace-syscall-diagnosis/SKILL.md +377 -0
- package/skills/strace-syscall-diagnosis/references/analysis_patterns.md +444 -0
- package/skills/strace-syscall-diagnosis/references/strace_commands.md +143 -0
- package/skills/strace-syscall-diagnosis/references/syscall_reference.md +187 -0
- package/skills/strace-syscall-diagnosis/scripts/01_baseline_info.sh +275 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_A_syscall_error.sh +160 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_B_slow_syscall.sh +176 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_C_library_trace.sh +164 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_D_fd_leak.sh +156 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_E_network_syscall.sh +137 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_F_signal_interrupt.sh +135 -0
- package/skills/strace-syscall-diagnosis/scripts/branch_G_lifecycle.sh +168 -0
- package/skills/strace-syscall-diagnosis/scripts/check_syscall.sh +108 -0
- package/skills/swap-thrashing-diagnosis/SKILL.md +370 -0
- package/skills/swap-thrashing-diagnosis/references/analysis_patterns.md +433 -0
- package/skills/swap-thrashing-diagnosis/references/kernel_swap_params.md +259 -0
- package/skills/swap-thrashing-diagnosis/references/swap_commands.md +171 -0
- package/skills/swap-thrashing-diagnosis/scripts/01_baseline_info.sh +429 -0
- package/skills/swap-thrashing-diagnosis/scripts/02_diagnosis.sh +109 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_A_swap_exhaustion.sh +228 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_B_thrashing.sh +303 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_C_swappiness.sh +159 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_D_swap_corruption.sh +171 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_E_ssd_wear.sh +159 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_F_kswapd_high.sh +185 -0
- package/skills/swap-thrashing-diagnosis/scripts/branch_G_zswap_zram.sh +244 -0
- package/skills/swap-thrashing-diagnosis/scripts/check_thrashing.sh +175 -0
- package/skills/unix-socket-pipe-diagnosis/SKILL.md +350 -0
- package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_commands.md +566 -0
- package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_params.md +183 -0
- package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_patterns.md +162 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/01_baseline_info.sh +191 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_A_uds_backlog.sh +94 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_B_abstract_conflict.sh +121 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_C_passcred.sh +119 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_D_socket_perms.sh +128 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_E_pipe_buf.sh +150 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_F_sigpipe.sh +170 -0
- package/skills/unix-socket-pipe-diagnosis/scripts/branch_G_socketpair.sh +196 -0
- package/skills/vmcore-analysis/SKILL.md +229 -984
- package/skills/vmcore-analysis/references/crash_commands.md +113 -374
- package/skills/vmcore-analysis/references/hardware_analysis.md +162 -0
- package/skills/vmcore-analysis/references/src_analysis_patterns.md +322 -0
- package/skills/vmcore-analysis/scripts/01_baseline_info.sh +279 -0
- package/skills/vmcore-analysis/scripts/branch_A_null_ptr.sh +306 -0
- package/skills/vmcore-analysis/scripts/branch_B_oob.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_C_uaf.sh +248 -0
- package/skills/vmcore-analysis/scripts/branch_D_stack_overflow.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_E_mce.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_F_memory_ue.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_G_deadlock.sh +202 -0
- package/skills/vmcore-analysis/scripts/branch_H_soft_lockup.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_I_hard_lockup.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_J_bug_trigger.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_K_oom.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_L_atomic_sleep.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_M_rcu_stall.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_N_fs_corruption.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_O_network.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_P_storage_io.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_Q_kvm.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_R_acpi.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_S_hotplug.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_T_driver.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_U_smep_smap.sh +60 -0
- package/skills/vmcore-analysis/scripts/branch_V_bit_flip.sh +133 -0
- package/skills/vmcore-analysis/scripts/check_bitflip.sh +221 -0
- package/skills/X-diagnosis-network-analysis/references/fault_patterns.md +0 -95
- package/skills/X-diagnosis-network-analysis/scripts/arp_check.sh +0 -61
- package/skills/X-diagnosis-network-analysis/scripts/kernel_drop_counters.sh +0 -70
- package/skills/X-diagnosis-network-analysis/scripts/net_baseline.sh +0 -76
- package/skills/X-diagnosis-network-analysis/scripts/port_listen_check.sh +0 -67
- package/skills/X-diagnosis-network-analysis/scripts/tcp_state_summary.sh +0 -65
- package/skills/vmcore-analysis/references/USAGE_EXAMPLES.md +0 -131
- package/skills/vmcore-analysis/references/analysis_patterns.md +0 -506
- package/skills/vmcore-analysis/references/root_cause_analysis.md +0 -739
- package/skills/vmcore-analysis/references/source_code_structure.md +0 -317
- package/skills/vmcore-analysis/references/struct_analysis.md +0 -140
- package/skills/vmcore-analysis/references/troubleshooting.md +0 -531
- package/skills/vmcore-analysis/scripts/analyze_struct.py +0 -156
- package/skills/vmcore-analysis/scripts/check_environment.sh +0 -104
- package/skills/vmcore-analysis/scripts/crash_config.sh +0 -156
- package/skills/vmcore-analysis/scripts/crash_wrapper.sh +0 -73
- package/skills/vmcore-analysis/scripts/evidence_chain.sh +0 -309
- package/skills/vmcore-analysis/scripts/quick_report.sh +0 -97
- package/skills/vmcore-analysis/scripts/rca_wizard.sh +0 -288
package/README.md
CHANGED
|
@@ -9,6 +9,10 @@ Witty 智能诊断 Agent 基于「假设-验证」(Hypothetico-Deductive)故
|
|
|
9
9
|
- **端到端闭环自愈**:涵盖“现象分析、根因定界、生成报告、执行修复”全链路,提供一站式自动化运维。
|
|
10
10
|
- **严格的安全管控**:诊断排查阶段严格只读,仅修复阶段按需赋予操作权限,且变更必经用户审批确认。
|
|
11
11
|
|
|
12
|
+
<div align="center">
|
|
13
|
+
<img src="docs/assets/sys_crash_diag.gif" alt="系统宕机故障诊断" />
|
|
14
|
+
</div>
|
|
15
|
+
|
|
12
16
|
### 架构与核心能力
|
|
13
17
|
|
|
14
18
|
Witty 智能诊断 Agent 采用“Agent-Skill-工具-知识”四层解耦架构,兼具高灵活性与可扩展性。
|
|
@@ -43,11 +47,13 @@ Witty 智能诊断 Agent 采用“Agent-Skill-工具-知识”四层解耦架构
|
|
|
43
47
|
|
|
44
48
|
> 💡 **更多基于 OS 全栈(硬件层 -> 内核层 -> 系统服务层)的诊断能力持续演进中...**
|
|
45
49
|
|
|
50
|
+
---
|
|
51
|
+
|
|
46
52
|
### 快速开始
|
|
47
53
|
|
|
48
54
|
#### 环境要求
|
|
49
55
|
|
|
50
|
-
- 运行环境:Node.js (>=
|
|
56
|
+
- 运行环境:Node.js (>=20.0.0)
|
|
51
57
|
- 依赖工具:已安装[OpenCode](https://opencode.ai/)
|
|
52
58
|
- 依赖工具:已安装 [Ansible](https://docs.ansible.com/ansible/latest/installation_guide/)(`ansible` 命令须在系统 PATH 中可用,可通过 `ansible --version` 提前验证)
|
|
53
59
|
|
|
@@ -74,6 +80,8 @@ cd witty-diagnosis-agent
|
|
|
74
80
|
bash install.sh
|
|
75
81
|
```
|
|
76
82
|
|
|
83
|
+
---
|
|
84
|
+
|
|
77
85
|
### 如何使用
|
|
78
86
|
|
|
79
87
|
1. 启动 \*\*OpenCode \*\*。
|
|
@@ -96,7 +104,116 @@ bash install.sh
|
|
|
96
104
|
|
|
97
105
|
<img src="docs/assets/guide_auto_diag_report.png" alt="诊断报告" width="800" />
|
|
98
106
|
|
|
99
|
-
如需了解更多操作细节,可查阅[用户手册](docs/guide/MANUAL.
|
|
107
|
+
如需了解更多操作细节,可查阅[用户手册](docs/guide/MANUAL.md);支持的诊断能力与功能说明详见[功能列表](docs/reference/features.md)。
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### 进程 CORE 故障诊断示例
|
|
112
|
+
|
|
113
|
+
本节以 WSL2 Ubuntu 系统为例,演示如何使用 Witty 智能诊断 Agent 分析进程 Core Dump 文件。本示例仅用于演示和体验智能诊断 Agent 的分析过程和输出报告。由于示例代码非常简单(空指针解引用),直接使用原生 OpenCode 或任何调试工具也能定位出根因。对于更复杂的生产环境故障,智能诊断 Agent 的系统化排查能力将展现更大优势。
|
|
114
|
+
|
|
115
|
+
#### 1. 修改系统配置以获得进程 Core Dump 文件
|
|
116
|
+
|
|
117
|
+
默认情况下,Linux 系统可能禁用了进程 core dump 功能。请使用 root 用户执行以下步骤启用:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 查看当前 core dump 配置(0 表示禁用)
|
|
121
|
+
ulimit -c
|
|
122
|
+
|
|
123
|
+
# 临时启用 core dump(不限制文件大小)
|
|
124
|
+
ulimit -c unlimited
|
|
125
|
+
|
|
126
|
+
# 永久启用:在 /etc/security/limits.conf 末尾添加
|
|
127
|
+
echo "* soft core unlimited" >> /etc/security/limits.conf
|
|
128
|
+
echo "* hard core unlimited" >> /etc/security/limits.conf
|
|
129
|
+
|
|
130
|
+
# 停用 apport(否则会拦截并吃掉 core 文件)
|
|
131
|
+
sudo service apport stop
|
|
132
|
+
sudo systemctl disable apport
|
|
133
|
+
|
|
134
|
+
# 设置 core dump 文件存放路径和命名格式(当前目录)
|
|
135
|
+
sudo sysctl -w kernel.core_pattern=core.%e.%p
|
|
136
|
+
|
|
137
|
+
# 验证配置
|
|
138
|
+
ulimit -c
|
|
139
|
+
cat /proc/sys/kernel/core_pattern
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
> **说明**:`%e` 为进程名,`%p` 为进程 PID。core 文件将保存在当前工作目录。
|
|
143
|
+
|
|
144
|
+
#### 2. 开发会产生 Core Dump 的示例 C 代码
|
|
145
|
+
|
|
146
|
+
创建 `crash_demo.c` 文件:
|
|
147
|
+
|
|
148
|
+
```c
|
|
149
|
+
#include <stdio.h>
|
|
150
|
+
#include <stdlib.h>
|
|
151
|
+
|
|
152
|
+
void trigger_segfault() {
|
|
153
|
+
int *ptr = NULL;
|
|
154
|
+
*ptr = 42;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
int main() {
|
|
158
|
+
printf("Starting crash demo...\n");
|
|
159
|
+
trigger_segfault();
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**安装编译工具和 GDB**:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
sudo apt update && sudo apt install -y gcc gdb
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**编译(禁用优化,开启调试符号)**:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
gcc -g -O0 -o crash_demo crash_demo.c
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**运行**:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
./crash_demo
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
执行后将触发段错误并产生 core dump 文件:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
Starting crash demo...
|
|
186
|
+
Segmentation fault (core dumped)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**查看生成的 core 文件**:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
ls -la ./core.*
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### 3. 在 WSL 中启动 OpenCode 并使用智能诊断 Agent 分析
|
|
196
|
+
|
|
197
|
+
**启动 OpenCode**:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
opencode
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**加载 Xuanyuan Agent**:执行 `/agents` 命令,选择 `Xuanyuan` Agent。
|
|
204
|
+
|
|
205
|
+
**输入问题描述**:
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
分析/tmp/test目录下的core文件根因。
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
> **提示**:将 `/tmp/test` 替换为示例 C 代码所在的实际目录路径。
|
|
212
|
+
|
|
213
|
+
系统将自动执行智能诊断流程,分析进程崩溃原因并输出诊断报告。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
100
217
|
|
|
101
218
|
### 如何贡献
|
|
102
219
|
|
|
@@ -111,6 +228,8 @@ bash install.sh
|
|
|
111
228
|
- 提交 [issue](https://atomgit.com/openeuler/witty-diagnosis-agent/issues)
|
|
112
229
|
- 发送邮件至 <intelligence@openeuler.org>
|
|
113
230
|
|
|
231
|
+
---
|
|
232
|
+
|
|
114
233
|
### License
|
|
115
234
|
|
|
116
235
|
本项目中部分代码基于 `oh-my-openagent` 修改,这部分代码遵循 **Sustainable Use License Version 1.0**。其他原创及贡献部分代码协议以最终发布版本为准。详情请参阅项目根目录下的 [LICENSE](./LICENSE) 文件。
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
migrateConfigFile,
|
|
9
9
|
parseFrontmatter,
|
|
10
10
|
parseJsonc
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-4QO2HAQQ.js";
|
|
12
12
|
import {
|
|
13
13
|
__require,
|
|
14
14
|
log
|
|
@@ -505,6 +505,8 @@ var WebsearchConfigSchema = z24.object({
|
|
|
505
505
|
// src/config/schema/witty-diagnosis-agent-config.ts
|
|
506
506
|
var WittyDiagnosisAgentConfigSchema = z25.object({
|
|
507
507
|
$schema: z25.string().optional(),
|
|
508
|
+
/** Global output language for reasoning, interactions, and reports (default: "zh") */
|
|
509
|
+
output_language: z25.enum(["zh", "en"]).default("zh"),
|
|
508
510
|
/** Enable new task system (default: false) */
|
|
509
511
|
new_task_system_enabled: z25.boolean().optional(),
|
|
510
512
|
/** Default agent name for `witty-diagnosis-agent run` (env: OPENCODE_DEFAULT_AGENT) */
|
|
@@ -4518,6 +4518,7 @@ function generateModelConfig(config) {
|
|
|
4518
4518
|
if (!hasAnyProvider) {
|
|
4519
4519
|
return {
|
|
4520
4520
|
$schema: SCHEMA_URL,
|
|
4521
|
+
output_language: config.outputLanguage ?? "zh",
|
|
4521
4522
|
agents: Object.fromEntries(
|
|
4522
4523
|
Object.entries(CLI_AGENT_MODEL_REQUIREMENTS).filter(([role, req]) => !(role === "sisyphus" && req.requiresAnyModel)).map(([role]) => [role, { model: ULTIMATE_FALLBACK }])
|
|
4523
4524
|
),
|
|
@@ -4583,6 +4584,7 @@ function generateModelConfig(config) {
|
|
|
4583
4584
|
}
|
|
4584
4585
|
return {
|
|
4585
4586
|
$schema: SCHEMA_URL,
|
|
4587
|
+
output_language: config.outputLanguage ?? "zh",
|
|
4586
4588
|
agents,
|
|
4587
4589
|
categories
|
|
4588
4590
|
};
|
|
@@ -4645,7 +4647,7 @@ function writeWittyConfig(installConfig) {
|
|
|
4645
4647
|
writeFileSync6(wittyConfigPath, JSON.stringify(newConfig, null, 2) + "\n");
|
|
4646
4648
|
return { success: true, configPath: wittyConfigPath };
|
|
4647
4649
|
}
|
|
4648
|
-
const merged = deepMergeRecord(
|
|
4650
|
+
const merged = deepMergeRecord(existing, newConfig);
|
|
4649
4651
|
writeFileSync6(wittyConfigPath, JSON.stringify(merged, null, 2) + "\n");
|
|
4650
4652
|
} catch (parseErr) {
|
|
4651
4653
|
if (parseErr instanceof SyntaxError) {
|
|
@@ -4955,22 +4957,23 @@ import { existsSync as existsSync21, readFileSync as readFileSync19 } from "fs";
|
|
|
4955
4957
|
function detectProvidersFromWittyConfig() {
|
|
4956
4958
|
const wittyConfigPath = getWittyConfigPath();
|
|
4957
4959
|
if (!existsSync21(wittyConfigPath)) {
|
|
4958
|
-
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
4960
|
+
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false, outputLanguage: "zh" };
|
|
4959
4961
|
}
|
|
4960
4962
|
try {
|
|
4961
4963
|
const content = readFileSync19(wittyConfigPath, "utf-8");
|
|
4962
4964
|
const wittyConfig = parseJsonc(content);
|
|
4963
4965
|
if (!wittyConfig || typeof wittyConfig !== "object") {
|
|
4964
|
-
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
4966
|
+
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false, outputLanguage: "zh" };
|
|
4965
4967
|
}
|
|
4966
4968
|
const configStr = JSON.stringify(wittyConfig);
|
|
4967
4969
|
const hasOpenAI = configStr.includes('"openai/');
|
|
4968
4970
|
const hasOpencodeZen = configStr.includes('"opencode/');
|
|
4969
4971
|
const hasZaiCodingPlan = configStr.includes('"zai-coding-plan/');
|
|
4970
4972
|
const hasKimiForCoding = configStr.includes('"kimi-for-coding/');
|
|
4971
|
-
|
|
4973
|
+
const outputLanguage = wittyConfig.output_language ?? "zh";
|
|
4974
|
+
return { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding, outputLanguage };
|
|
4972
4975
|
} catch {
|
|
4973
|
-
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false };
|
|
4976
|
+
return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false, outputLanguage: "zh" };
|
|
4974
4977
|
}
|
|
4975
4978
|
}
|
|
4976
4979
|
function detectCurrentConfig() {
|
|
@@ -4983,7 +4986,8 @@ function detectCurrentConfig() {
|
|
|
4983
4986
|
hasCopilot: false,
|
|
4984
4987
|
hasOpencodeZen: true,
|
|
4985
4988
|
hasZaiCodingPlan: false,
|
|
4986
|
-
hasKimiForCoding: false
|
|
4989
|
+
hasKimiForCoding: false,
|
|
4990
|
+
outputLanguage: "zh"
|
|
4987
4991
|
};
|
|
4988
4992
|
const { format, path: path9 } = detectConfigFormat();
|
|
4989
4993
|
if (format === "none") {
|
|
@@ -5000,11 +5004,12 @@ function detectCurrentConfig() {
|
|
|
5000
5004
|
return result;
|
|
5001
5005
|
}
|
|
5002
5006
|
result.hasGemini = plugins.some((p) => p.startsWith("opencode-antigravity-auth"));
|
|
5003
|
-
const { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding } = detectProvidersFromWittyConfig();
|
|
5007
|
+
const { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding, outputLanguage } = detectProvidersFromWittyConfig();
|
|
5004
5008
|
result.hasOpenAI = hasOpenAI;
|
|
5005
5009
|
result.hasOpencodeZen = hasOpencodeZen;
|
|
5006
5010
|
result.hasZaiCodingPlan = hasZaiCodingPlan;
|
|
5007
5011
|
result.hasKimiForCoding = hasKimiForCoding;
|
|
5012
|
+
result.outputLanguage = outputLanguage;
|
|
5008
5013
|
return result;
|
|
5009
5014
|
}
|
|
5010
5015
|
|
package/dist/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
readBoulderState,
|
|
14
14
|
readContinuationMarker,
|
|
15
15
|
readState
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-4DUKC3QP.js";
|
|
17
17
|
import {
|
|
18
18
|
AGENT_MODEL_REQUIREMENTS,
|
|
19
19
|
CATEGORY_MODEL_REQUIREMENTS,
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
parseJsonc,
|
|
43
43
|
spawnWithWindowsHide,
|
|
44
44
|
writeWittyConfig
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-4QO2HAQQ.js";
|
|
46
46
|
import "./chunk-YVNTYBPS.js";
|
|
47
47
|
|
|
48
48
|
// src/cli/cli-program.ts
|
|
@@ -51,7 +51,7 @@ import { Command as Command2 } from "commander";
|
|
|
51
51
|
// package.json
|
|
52
52
|
var package_default = {
|
|
53
53
|
name: "witty-diagnosis-agent",
|
|
54
|
-
version: "0.
|
|
54
|
+
version: "0.5.0-beta",
|
|
55
55
|
description: "Witty Diagnosis Agent - OpenCode Plugin",
|
|
56
56
|
keywords: [
|
|
57
57
|
"witty-diagnosis-agent"
|
|
@@ -62,6 +62,9 @@ var package_default = {
|
|
|
62
62
|
},
|
|
63
63
|
license: "MIT",
|
|
64
64
|
author: "witty-diagnosis-agent",
|
|
65
|
+
engines: {
|
|
66
|
+
node: ">=20.0.0"
|
|
67
|
+
},
|
|
65
68
|
type: "module",
|
|
66
69
|
main: "dist/index.js",
|
|
67
70
|
exports: {
|
|
@@ -240,6 +243,9 @@ function validateNonTuiArgs(args) {
|
|
|
240
243
|
if (args.kimiForCoding !== void 0 && !["no", "yes"].includes(args.kimiForCoding)) {
|
|
241
244
|
errors.push(`Invalid --kimi-for-coding value: ${args.kimiForCoding} (expected: no, yes)`);
|
|
242
245
|
}
|
|
246
|
+
if (args.outputLanguage !== void 0 && !["zh", "en"].includes(args.outputLanguage)) {
|
|
247
|
+
errors.push(`Invalid --output-language value: ${args.outputLanguage} (expected: zh, en)`);
|
|
248
|
+
}
|
|
243
249
|
return { valid: errors.length === 0, errors };
|
|
244
250
|
}
|
|
245
251
|
function argsToConfig(args) {
|
|
@@ -251,7 +257,8 @@ function argsToConfig(args) {
|
|
|
251
257
|
hasCopilot: args.copilot === "yes",
|
|
252
258
|
hasOpencodeZen: args.opencodeZen === "yes",
|
|
253
259
|
hasZaiCodingPlan: args.zaiCodingPlan === "yes",
|
|
254
|
-
hasKimiForCoding: args.kimiForCoding === "yes"
|
|
260
|
+
hasKimiForCoding: args.kimiForCoding === "yes",
|
|
261
|
+
outputLanguage: args.outputLanguage ?? "zh"
|
|
255
262
|
};
|
|
256
263
|
}
|
|
257
264
|
function detectedToInitialValues(detected) {
|
|
@@ -266,7 +273,8 @@ function detectedToInitialValues(detected) {
|
|
|
266
273
|
copilot: detected.hasCopilot ? "yes" : "no",
|
|
267
274
|
opencodeZen: detected.hasOpencodeZen ? "yes" : "no",
|
|
268
275
|
zaiCodingPlan: detected.hasZaiCodingPlan ? "yes" : "no",
|
|
269
|
-
kimiForCoding: detected.hasKimiForCoding ? "yes" : "no"
|
|
276
|
+
kimiForCoding: detected.hasKimiForCoding ? "yes" : "no",
|
|
277
|
+
outputLanguage: detected.outputLanguage ?? "zh"
|
|
270
278
|
};
|
|
271
279
|
}
|
|
272
280
|
async function checkAnsibleInstalled() {
|
|
@@ -453,8 +461,21 @@ import * as p from "@clack/prompts";
|
|
|
453
461
|
import color3 from "picocolors";
|
|
454
462
|
|
|
455
463
|
// src/cli/tui-install-prompts.ts
|
|
464
|
+
import { select, isCancel } from "@clack/prompts";
|
|
456
465
|
async function promptInstallConfig(detected) {
|
|
457
466
|
const initial = detectedToInitialValues(detected);
|
|
467
|
+
const languageResult = await select({
|
|
468
|
+
message: "Select output language for Witty Diagnosis Agent / \u9009\u62E9 Witty Diagnosis Agent \u7684\u8F93\u51FA\u8BED\u8A00\n (This affects all agents' reasoning, response, and report / \u5F71\u54CD\u6240\u6709 Agent \u7684\u601D\u8003\u3001\u56DE\u590D\u548C\u751F\u6210\u7684\u62A5\u544A)",
|
|
469
|
+
options: [
|
|
470
|
+
{ value: "zh", label: "\u7B80\u4F53\u4E2D\u6587 (zh)" },
|
|
471
|
+
{ value: "en", label: "English (en)" }
|
|
472
|
+
],
|
|
473
|
+
initialValue: initial.outputLanguage ?? "zh"
|
|
474
|
+
});
|
|
475
|
+
if (isCancel(languageResult)) {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
const outputLanguage = languageResult;
|
|
458
479
|
const claude = initial.claude ?? "no";
|
|
459
480
|
const openai = initial.openai ?? "no";
|
|
460
481
|
const gemini = initial.gemini ?? "no";
|
|
@@ -470,7 +491,8 @@ async function promptInstallConfig(detected) {
|
|
|
470
491
|
hasCopilot: copilot === "yes",
|
|
471
492
|
hasOpencodeZen: opencodeZen === "yes",
|
|
472
493
|
hasZaiCodingPlan: zaiCodingPlan === "yes",
|
|
473
|
-
hasKimiForCoding: kimiForCoding === "yes"
|
|
494
|
+
hasKimiForCoding: kimiForCoding === "yes",
|
|
495
|
+
outputLanguage
|
|
474
496
|
};
|
|
475
497
|
}
|
|
476
498
|
|
|
@@ -2191,7 +2213,7 @@ async function getLocalVersion(options = {}) {
|
|
|
2191
2213
|
console.log(options.json ? formatJsonOutput(info2) : formatVersionOutput(info2));
|
|
2192
2214
|
return 1;
|
|
2193
2215
|
}
|
|
2194
|
-
const { extractChannel: extractChannel2 } = await import("./auto-update-checker-
|
|
2216
|
+
const { extractChannel: extractChannel2 } = await import("./auto-update-checker-FE7T2BSB.js");
|
|
2195
2217
|
const channel = extractChannel2(pluginInfo?.pinnedVersion ?? currentVersion);
|
|
2196
2218
|
const latestVersion = await getLatestVersion(channel);
|
|
2197
2219
|
if (!latestVersion) {
|
|
@@ -3705,11 +3727,11 @@ function createMcpOAuthCommand() {
|
|
|
3705
3727
|
var VERSION2 = package_default.version;
|
|
3706
3728
|
var program = new Command2();
|
|
3707
3729
|
program.name("witty-diagnosis-agent").description("The ultimate OpenCode plugin - multi-model orchestration, LSP tools, and more").version(VERSION2, "-v, --version", "Show version number").enablePositionalOptions();
|
|
3708
|
-
program.command("install").description("Install and configure witty-diagnosis-agent with interactive setup").option("--no-tui", "Run in non-interactive mode (requires all options)").option("--claude <value>", "Claude subscription: no, yes, max20").option("--openai <value>", "OpenAI/ChatGPT subscription: no, yes (default: no)").option("--gemini <value>", "Gemini integration: no, yes").option("--copilot <value>", "GitHub Copilot subscription: no, yes").option("--opencode-zen <value>", "OpenCode Zen access: no, yes (default: no)").option("--zai-coding-plan <value>", "Z.ai Coding Plan subscription: no, yes (default: no)").option("--kimi-for-coding <value>", "Kimi For Coding subscription: no, yes (default: no)").option("--skip-auth", "Skip authentication setup hints").addHelpText("after", `
|
|
3730
|
+
program.command("install").description("Install and configure witty-diagnosis-agent with interactive setup").option("--no-tui", "Run in non-interactive mode (requires all options)").option("--claude <value>", "Claude subscription: no, yes, max20").option("--openai <value>", "OpenAI/ChatGPT subscription: no, yes (default: no)").option("--gemini <value>", "Gemini integration: no, yes").option("--copilot <value>", "GitHub Copilot subscription: no, yes").option("--opencode-zen <value>", "OpenCode Zen access: no, yes (default: no)").option("--zai-coding-plan <value>", "Z.ai Coding Plan subscription: no, yes (default: no)").option("--kimi-for-coding <value>", "Kimi For Coding subscription: no, yes (default: no)").option("--output-language <value>", "Output language for agents: zh, en (default: zh)").option("--skip-auth", "Skip authentication setup hints").addHelpText("after", `
|
|
3709
3731
|
Examples:
|
|
3710
3732
|
$ npx witty-diagnosis-agent install
|
|
3711
3733
|
$ npx witty-diagnosis-agent install --no-tui --claude=max20 --openai=yes --gemini=yes --copilot=no
|
|
3712
|
-
$ npx witty-diagnosis-agent install --no-tui --claude=no --gemini=no --copilot=yes --opencode-zen=yes
|
|
3734
|
+
$ npx witty-diagnosis-agent install --no-tui --claude=no --gemini=no --copilot=yes --opencode-zen=yes --output-language=en
|
|
3713
3735
|
|
|
3714
3736
|
Model Providers (Priority: Native > Copilot > OpenCode Zen > Z.ai > Kimi):
|
|
3715
3737
|
Claude Native anthropic/ models (Opus, Sonnet, Haiku)
|
|
@@ -3729,6 +3751,7 @@ Model Providers (Priority: Native > Copilot > OpenCode Zen > Z.ai > Kimi):
|
|
|
3729
3751
|
opencodeZen: options.opencodeZen,
|
|
3730
3752
|
zaiCodingPlan: options.zaiCodingPlan,
|
|
3731
3753
|
kimiForCoding: options.kimiForCoding,
|
|
3754
|
+
outputLanguage: options.outputLanguage,
|
|
3732
3755
|
skipAuth: options.skipAuth ?? false
|
|
3733
3756
|
};
|
|
3734
3757
|
const exitCode = await install(args);
|
package/dist/index.d.ts
CHANGED
|
@@ -1093,6 +1093,10 @@ type HookName = z.infer<typeof HookNameSchema>;
|
|
|
1093
1093
|
|
|
1094
1094
|
declare const WittyDiagnosisAgentConfigSchema: z.ZodObject<{
|
|
1095
1095
|
$schema: z.ZodOptional<z.ZodString>;
|
|
1096
|
+
output_language: z.ZodDefault<z.ZodEnum<{
|
|
1097
|
+
zh: "zh";
|
|
1098
|
+
en: "en";
|
|
1099
|
+
}>>;
|
|
1096
1100
|
new_task_system_enabled: z.ZodOptional<z.ZodBoolean>;
|
|
1097
1101
|
default_run_agent: z.ZodOptional<z.ZodString>;
|
|
1098
1102
|
disabled_mcps: z.ZodOptional<z.ZodArray<z.ZodString>>;
|