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.
Files changed (139) hide show
  1. package/README.md +121 -2
  2. package/dist/{auto-update-checker-SCZAPT6L.js → auto-update-checker-FE7T2BSB.js} +1 -1
  3. package/dist/{chunk-YPQZVQVM.js → chunk-4DUKC3QP.js} +3 -1
  4. package/dist/{chunk-VGS3BNP5.js → chunk-4QO2HAQQ.js} +12 -7
  5. package/dist/cli.js +32 -9
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.js +375 -151
  8. package/dist/witty-diagnosis-agent.schema.json +11 -0
  9. package/package.json +4 -1
  10. package/skills/X-diagnosis-io/SKILL.md +124 -0
  11. package/skills/X-diagnosis-io/references/xdiagnosis_reference.md +96 -0
  12. package/skills/X-diagnosis-io/scripts/show_location_index.sh +50 -0
  13. package/skills/X-diagnosis-network-analysis/SKILL.md +63 -114
  14. package/skills/X-diagnosis-network-analysis/references/xdiagnosis_reference.md +68 -228
  15. package/skills/X-diagnosis-network-analysis/scripts/show_location_index.sh +86 -0
  16. package/skills/fault-rca-report-generation/SKILL.md +56 -15
  17. package/skills/fd-leak-diagnosis/SKILL.md +318 -0
  18. package/skills/fd-leak-diagnosis/references/fd_diagnosis_commands.md +250 -0
  19. package/skills/fd-leak-diagnosis/references/fd_leak_patterns.md +155 -0
  20. package/skills/fd-leak-diagnosis/references/kernel_fd_params.md +182 -0
  21. package/skills/fd-leak-diagnosis/scripts/01_baseline_info.sh +208 -0
  22. package/skills/fd-leak-diagnosis/scripts/branch_A_system_fd.sh +101 -0
  23. package/skills/fd-leak-diagnosis/scripts/branch_B_process_fd.sh +114 -0
  24. package/skills/fd-leak-diagnosis/scripts/branch_C_close_wait.sh +107 -0
  25. package/skills/fd-leak-diagnosis/scripts/branch_D_epoll.sh +104 -0
  26. package/skills/fd-leak-diagnosis/scripts/branch_E_inotify.sh +110 -0
  27. package/skills/fd-leak-diagnosis/scripts/branch_F_syscall.sh +111 -0
  28. package/skills/fd-leak-diagnosis/scripts/branch_G_deleted_file.sh +94 -0
  29. package/skills/fd-leak-diagnosis/scripts/branch_H_mixed.sh +136 -0
  30. package/skills/linux-oom-analyzer/scripts/collect_basic_info.sh +1 -1
  31. package/skills/offline-disk-fault-diagnosis/SKILL.md +171 -54
  32. package/skills/offline-disk-fault-diagnosis/references/disk_health_rules.md +89 -0
  33. package/skills/offline-disk-fault-diagnosis/scripts/diagnose_health_rules.py +1445 -0
  34. package/skills/offline-disk-fault-diagnosis/scripts/diagnose_summary.py +7 -0
  35. package/skills/overlayfs-diagnosis/SKILL.md +383 -0
  36. package/skills/overlayfs-diagnosis/references/diagnosis_patterns.md +399 -0
  37. package/skills/overlayfs-diagnosis/references/docker_overlay2.md +257 -0
  38. package/skills/overlayfs-diagnosis/references/overlayfs_basics.md +268 -0
  39. package/skills/overlayfs-diagnosis/scripts/01_baseline_info.sh +274 -0
  40. package/skills/overlayfs-diagnosis/scripts/branch_A_config_error.sh +176 -0
  41. package/skills/overlayfs-diagnosis/scripts/branch_B_fs_incompatible.sh +140 -0
  42. package/skills/overlayfs-diagnosis/scripts/branch_C_cross_device.sh +141 -0
  43. package/skills/overlayfs-diagnosis/scripts/branch_D_opaque_whiteout.sh +161 -0
  44. package/skills/overlayfs-diagnosis/scripts/branch_E_copyup_perf.sh +163 -0
  45. package/skills/overlayfs-diagnosis/scripts/branch_F_inotify.sh +182 -0
  46. package/skills/overlayfs-diagnosis/scripts/branch_G_docker_inode_exhaust.sh +139 -0
  47. package/skills/overlayfs-diagnosis/scripts/branch_H_docker_diff_bloat.sh +163 -0
  48. package/skills/overlayfs-diagnosis/scripts/branch_I_redirect_metacopy.sh +180 -0
  49. package/skills/overlayfs-diagnosis/scripts/branch_J_permission.sh +175 -0
  50. package/skills/overlayfs-diagnosis/scripts/branch_K_readdir_perf.sh +188 -0
  51. package/skills/overlayfs-diagnosis/scripts/branch_Z_general.sh +172 -0
  52. package/skills/skill-openeuler-info/SKILL.md +87 -0
  53. package/skills/skill-openeuler-info/scripts/check_system_info.sh +170 -0
  54. package/skills/strace-syscall-diagnosis/SKILL.md +377 -0
  55. package/skills/strace-syscall-diagnosis/references/analysis_patterns.md +444 -0
  56. package/skills/strace-syscall-diagnosis/references/strace_commands.md +143 -0
  57. package/skills/strace-syscall-diagnosis/references/syscall_reference.md +187 -0
  58. package/skills/strace-syscall-diagnosis/scripts/01_baseline_info.sh +275 -0
  59. package/skills/strace-syscall-diagnosis/scripts/branch_A_syscall_error.sh +160 -0
  60. package/skills/strace-syscall-diagnosis/scripts/branch_B_slow_syscall.sh +176 -0
  61. package/skills/strace-syscall-diagnosis/scripts/branch_C_library_trace.sh +164 -0
  62. package/skills/strace-syscall-diagnosis/scripts/branch_D_fd_leak.sh +156 -0
  63. package/skills/strace-syscall-diagnosis/scripts/branch_E_network_syscall.sh +137 -0
  64. package/skills/strace-syscall-diagnosis/scripts/branch_F_signal_interrupt.sh +135 -0
  65. package/skills/strace-syscall-diagnosis/scripts/branch_G_lifecycle.sh +168 -0
  66. package/skills/strace-syscall-diagnosis/scripts/check_syscall.sh +108 -0
  67. package/skills/swap-thrashing-diagnosis/SKILL.md +370 -0
  68. package/skills/swap-thrashing-diagnosis/references/analysis_patterns.md +433 -0
  69. package/skills/swap-thrashing-diagnosis/references/kernel_swap_params.md +259 -0
  70. package/skills/swap-thrashing-diagnosis/references/swap_commands.md +171 -0
  71. package/skills/swap-thrashing-diagnosis/scripts/01_baseline_info.sh +429 -0
  72. package/skills/swap-thrashing-diagnosis/scripts/02_diagnosis.sh +109 -0
  73. package/skills/swap-thrashing-diagnosis/scripts/branch_A_swap_exhaustion.sh +228 -0
  74. package/skills/swap-thrashing-diagnosis/scripts/branch_B_thrashing.sh +303 -0
  75. package/skills/swap-thrashing-diagnosis/scripts/branch_C_swappiness.sh +159 -0
  76. package/skills/swap-thrashing-diagnosis/scripts/branch_D_swap_corruption.sh +171 -0
  77. package/skills/swap-thrashing-diagnosis/scripts/branch_E_ssd_wear.sh +159 -0
  78. package/skills/swap-thrashing-diagnosis/scripts/branch_F_kswapd_high.sh +185 -0
  79. package/skills/swap-thrashing-diagnosis/scripts/branch_G_zswap_zram.sh +244 -0
  80. package/skills/swap-thrashing-diagnosis/scripts/check_thrashing.sh +175 -0
  81. package/skills/unix-socket-pipe-diagnosis/SKILL.md +350 -0
  82. package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_commands.md +566 -0
  83. package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_params.md +183 -0
  84. package/skills/unix-socket-pipe-diagnosis/references/unix_socket_pipe_patterns.md +162 -0
  85. package/skills/unix-socket-pipe-diagnosis/scripts/01_baseline_info.sh +191 -0
  86. package/skills/unix-socket-pipe-diagnosis/scripts/branch_A_uds_backlog.sh +94 -0
  87. package/skills/unix-socket-pipe-diagnosis/scripts/branch_B_abstract_conflict.sh +121 -0
  88. package/skills/unix-socket-pipe-diagnosis/scripts/branch_C_passcred.sh +119 -0
  89. package/skills/unix-socket-pipe-diagnosis/scripts/branch_D_socket_perms.sh +128 -0
  90. package/skills/unix-socket-pipe-diagnosis/scripts/branch_E_pipe_buf.sh +150 -0
  91. package/skills/unix-socket-pipe-diagnosis/scripts/branch_F_sigpipe.sh +170 -0
  92. package/skills/unix-socket-pipe-diagnosis/scripts/branch_G_socketpair.sh +196 -0
  93. package/skills/vmcore-analysis/SKILL.md +229 -984
  94. package/skills/vmcore-analysis/references/crash_commands.md +113 -374
  95. package/skills/vmcore-analysis/references/hardware_analysis.md +162 -0
  96. package/skills/vmcore-analysis/references/src_analysis_patterns.md +322 -0
  97. package/skills/vmcore-analysis/scripts/01_baseline_info.sh +279 -0
  98. package/skills/vmcore-analysis/scripts/branch_A_null_ptr.sh +306 -0
  99. package/skills/vmcore-analysis/scripts/branch_B_oob.sh +60 -0
  100. package/skills/vmcore-analysis/scripts/branch_C_uaf.sh +248 -0
  101. package/skills/vmcore-analysis/scripts/branch_D_stack_overflow.sh +60 -0
  102. package/skills/vmcore-analysis/scripts/branch_E_mce.sh +60 -0
  103. package/skills/vmcore-analysis/scripts/branch_F_memory_ue.sh +60 -0
  104. package/skills/vmcore-analysis/scripts/branch_G_deadlock.sh +202 -0
  105. package/skills/vmcore-analysis/scripts/branch_H_soft_lockup.sh +60 -0
  106. package/skills/vmcore-analysis/scripts/branch_I_hard_lockup.sh +60 -0
  107. package/skills/vmcore-analysis/scripts/branch_J_bug_trigger.sh +60 -0
  108. package/skills/vmcore-analysis/scripts/branch_K_oom.sh +60 -0
  109. package/skills/vmcore-analysis/scripts/branch_L_atomic_sleep.sh +60 -0
  110. package/skills/vmcore-analysis/scripts/branch_M_rcu_stall.sh +60 -0
  111. package/skills/vmcore-analysis/scripts/branch_N_fs_corruption.sh +60 -0
  112. package/skills/vmcore-analysis/scripts/branch_O_network.sh +60 -0
  113. package/skills/vmcore-analysis/scripts/branch_P_storage_io.sh +60 -0
  114. package/skills/vmcore-analysis/scripts/branch_Q_kvm.sh +60 -0
  115. package/skills/vmcore-analysis/scripts/branch_R_acpi.sh +60 -0
  116. package/skills/vmcore-analysis/scripts/branch_S_hotplug.sh +60 -0
  117. package/skills/vmcore-analysis/scripts/branch_T_driver.sh +60 -0
  118. package/skills/vmcore-analysis/scripts/branch_U_smep_smap.sh +60 -0
  119. package/skills/vmcore-analysis/scripts/branch_V_bit_flip.sh +133 -0
  120. package/skills/vmcore-analysis/scripts/check_bitflip.sh +221 -0
  121. package/skills/X-diagnosis-network-analysis/references/fault_patterns.md +0 -95
  122. package/skills/X-diagnosis-network-analysis/scripts/arp_check.sh +0 -61
  123. package/skills/X-diagnosis-network-analysis/scripts/kernel_drop_counters.sh +0 -70
  124. package/skills/X-diagnosis-network-analysis/scripts/net_baseline.sh +0 -76
  125. package/skills/X-diagnosis-network-analysis/scripts/port_listen_check.sh +0 -67
  126. package/skills/X-diagnosis-network-analysis/scripts/tcp_state_summary.sh +0 -65
  127. package/skills/vmcore-analysis/references/USAGE_EXAMPLES.md +0 -131
  128. package/skills/vmcore-analysis/references/analysis_patterns.md +0 -506
  129. package/skills/vmcore-analysis/references/root_cause_analysis.md +0 -739
  130. package/skills/vmcore-analysis/references/source_code_structure.md +0 -317
  131. package/skills/vmcore-analysis/references/struct_analysis.md +0 -140
  132. package/skills/vmcore-analysis/references/troubleshooting.md +0 -531
  133. package/skills/vmcore-analysis/scripts/analyze_struct.py +0 -156
  134. package/skills/vmcore-analysis/scripts/check_environment.sh +0 -104
  135. package/skills/vmcore-analysis/scripts/crash_config.sh +0 -156
  136. package/skills/vmcore-analysis/scripts/crash_wrapper.sh +0 -73
  137. package/skills/vmcore-analysis/scripts/evidence_chain.sh +0 -309
  138. package/skills/vmcore-analysis/scripts/quick_report.sh +0 -97
  139. 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 (>=18.0.0)
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.html);支持的诊断能力与功能说明详见[功能列表](docs/reference/features.html)。
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) 文件。
@@ -7,7 +7,7 @@ import {
7
7
  isDistTag,
8
8
  isPrereleaseOrDistTag,
9
9
  isPrereleaseVersion
10
- } from "./chunk-VGS3BNP5.js";
10
+ } from "./chunk-4QO2HAQQ.js";
11
11
  import "./chunk-YVNTYBPS.js";
12
12
  export {
13
13
  checkForUpdate,
@@ -8,7 +8,7 @@ import {
8
8
  migrateConfigFile,
9
9
  parseFrontmatter,
10
10
  parseJsonc
11
- } from "./chunk-VGS3BNP5.js";
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(newConfig, existing);
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
- return { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding };
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-YPQZVQVM.js";
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-VGS3BNP5.js";
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.3.1-beta",
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-SCZAPT6L.js");
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>>;