@anh3d0nic/qwen-code-termux-ice 14.0.0 → 16.0.0

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 (1968) hide show
  1. package/bin/api-setup-launcher.js +14 -0
  2. package/bin/qwen-ice +350 -0
  3. package/bin/qwen-ice-api-setup +340 -0
  4. package/bin/qwen-ice-launcher.js +14 -0
  5. package/core/ice-v16.js +1202 -0
  6. package/core/install.js +179 -0
  7. package/core/uninstall.js +66 -0
  8. package/package.json +49 -10
  9. package/.allstar/branch_protection.yaml +0 -1
  10. package/.aoneci/workflows/ci.yml +0 -69
  11. package/.dockerignore +0 -10
  12. package/.editorconfig +0 -13
  13. package/.gcp/Dockerfile.gemini-code-builder +0 -89
  14. package/.gcp/release-docker.yml +0 -71
  15. package/.gitattributes +0 -24
  16. package/.github/CODEOWNERS +0 -3
  17. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -58
  18. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -35
  19. package/.github/actions/post-coverage-comment/action.yml +0 -114
  20. package/.github/dependabot.yml +0 -35
  21. package/.github/pull_request_template.md +0 -41
  22. package/.github/scripts/pr-triage.sh +0 -144
  23. package/.github/workflows/build-and-publish-image.yml +0 -109
  24. package/.github/workflows/check-issue-completeness.yml +0 -201
  25. package/.github/workflows/ci.yml +0 -239
  26. package/.github/workflows/community-report.yml +0 -197
  27. package/.github/workflows/docs-page-action.yml +0 -50
  28. package/.github/workflows/e2e.yml +0 -111
  29. package/.github/workflows/eval.yml +0 -29
  30. package/.github/workflows/gemini-automated-issue-dedup.yml +0 -262
  31. package/.github/workflows/gemini-scheduled-issue-dedup.yml +0 -116
  32. package/.github/workflows/gemini-scheduled-pr-triage.yml +0 -30
  33. package/.github/workflows/gemini-self-assign-issue.yml +0 -99
  34. package/.github/workflows/no-response.yml +0 -33
  35. package/.github/workflows/qwen-automated-issue-triage.yml +0 -203
  36. package/.github/workflows/qwen-code-pr-review.yml +0 -190
  37. package/.github/workflows/qwen-scheduled-issue-triage.yml +0 -213
  38. package/.github/workflows/release-sdk.yml +0 -420
  39. package/.github/workflows/release-vscode-companion.yml +0 -359
  40. package/.github/workflows/release.yml +0 -236
  41. package/.github/workflows/stale.yml +0 -39
  42. package/.github/workflows/terminal-bench.yml +0 -96
  43. package/.husky/pre-commit +0 -9
  44. package/.nvmrc +0 -1
  45. package/.prettierignore +0 -22
  46. package/.prettierrc.json +0 -7
  47. package/.qwen/commands/qc/code-review.md +0 -25
  48. package/.qwen/commands/qc/commit.md +0 -70
  49. package/.qwen/commands/qc/create-issue.md +0 -42
  50. package/.qwen/commands/qc/create-pr.md +0 -34
  51. package/.qwen/ice-auto-load.sh +0 -39
  52. package/.qwen/ice.py +0 -822
  53. package/.qwen/qwen.md +0 -70
  54. package/.qwen/skills/pr-review/SKILL.md +0 -104
  55. package/.qwen/skills/terminal-capture/SKILL.md +0 -241
  56. package/.termux-backup/esbuild.config.js +0 -77
  57. package/.termux-backup/package.json.backup +0 -135
  58. package/.termux-backup/patches-README.md +0 -231
  59. package/.termux-backup/postinstall.cjs +0 -14
  60. package/.termux-backup/prepare-termux.cjs +0 -33
  61. package/.termux-backup/termux-runtime.ts +0 -50
  62. package/.vscode/extensions.json +0 -7
  63. package/.vscode/launch.json +0 -165
  64. package/.vscode/settings.json +0 -17
  65. package/.vscode/tasks.json +0 -41
  66. package/.yamllint.yml +0 -90
  67. package/CHANGELOG.md +0 -77
  68. package/CONTRIBUTING.md +0 -303
  69. package/Dockerfile +0 -73
  70. package/Makefile +0 -59
  71. package/SECURITY.md +0 -9
  72. package/docs/_meta.ts +0 -14
  73. package/docs/developers/BUILDING.md +0 -145
  74. package/docs/developers/_meta.ts +0 -25
  75. package/docs/developers/architecture.md +0 -95
  76. package/docs/developers/contributing.md +0 -303
  77. package/docs/developers/development/_meta.ts +0 -9
  78. package/docs/developers/development/deployment.md +0 -117
  79. package/docs/developers/development/integration-tests.md +0 -137
  80. package/docs/developers/development/issue-and-pr-automation.md +0 -84
  81. package/docs/developers/development/npm.md +0 -258
  82. package/docs/developers/development/telemetry.md +0 -297
  83. package/docs/developers/examples/proxy-script.md +0 -81
  84. package/docs/developers/roadmap.md +0 -82
  85. package/docs/developers/sdk-java.md +0 -311
  86. package/docs/developers/sdk-typescript.md +0 -375
  87. package/docs/developers/tools/_meta.ts +0 -14
  88. package/docs/developers/tools/exit-plan-mode.md +0 -149
  89. package/docs/developers/tools/file-system.md +0 -167
  90. package/docs/developers/tools/introduction.md +0 -62
  91. package/docs/developers/tools/mcp-server.md +0 -873
  92. package/docs/developers/tools/memory.md +0 -44
  93. package/docs/developers/tools/multi-file.md +0 -69
  94. package/docs/developers/tools/sandbox.md +0 -91
  95. package/docs/developers/tools/shell.md +0 -259
  96. package/docs/developers/tools/task.md +0 -145
  97. package/docs/developers/tools/todo-write.md +0 -63
  98. package/docs/developers/tools/web-fetch.md +0 -54
  99. package/docs/developers/tools/web-search.md +0 -186
  100. package/docs/index.md +0 -25
  101. package/docs/users/_meta.ts +0 -30
  102. package/docs/users/common-workflow.md +0 -571
  103. package/docs/users/configuration/_meta.ts +0 -10
  104. package/docs/users/configuration/auth.md +0 -297
  105. package/docs/users/configuration/memory.md +0 -0
  106. package/docs/users/configuration/model-providers.md +0 -506
  107. package/docs/users/configuration/qwen-ignore.md +0 -55
  108. package/docs/users/configuration/settings.md +0 -563
  109. package/docs/users/configuration/themes.md +0 -160
  110. package/docs/users/configuration/trusted-folders.md +0 -61
  111. package/docs/users/configuration.md +0 -73
  112. package/docs/users/extension/_meta.ts +0 -9
  113. package/docs/users/extension/extension-releasing.md +0 -121
  114. package/docs/users/extension/getting-started-extensions.md +0 -299
  115. package/docs/users/extension/introduction.md +0 -303
  116. package/docs/users/features/_meta.ts +0 -15
  117. package/docs/users/features/approval-mode.md +0 -263
  118. package/docs/users/features/checkpointing.md +0 -77
  119. package/docs/users/features/commands.md +0 -295
  120. package/docs/users/features/headless.md +0 -282
  121. package/docs/users/features/language.md +0 -139
  122. package/docs/users/features/lsp.md +0 -374
  123. package/docs/users/features/mcp.md +0 -281
  124. package/docs/users/features/sandbox.md +0 -218
  125. package/docs/users/features/skills.md +0 -289
  126. package/docs/users/features/sub-agents.md +0 -504
  127. package/docs/users/features/token-caching.md +0 -29
  128. package/docs/users/ide-integration/_meta.ts +0 -4
  129. package/docs/users/ide-integration/ide-companion-spec.md +0 -182
  130. package/docs/users/ide-integration/ide-integration.md +0 -144
  131. package/docs/users/integration-github-action.md +0 -241
  132. package/docs/users/integration-jetbrains.md +0 -57
  133. package/docs/users/integration-vscode.md +0 -39
  134. package/docs/users/integration-zed.md +0 -54
  135. package/docs/users/overview.md +0 -64
  136. package/docs/users/quickstart.md +0 -271
  137. package/docs/users/reference/_meta.ts +0 -3
  138. package/docs/users/reference/keyboard-shortcuts.md +0 -72
  139. package/docs/users/support/Uninstall.md +0 -42
  140. package/docs/users/support/_meta.ts +0 -6
  141. package/docs/users/support/tos-privacy.md +0 -112
  142. package/docs/users/support/troubleshooting.md +0 -123
  143. package/docs-site/README.md +0 -54
  144. package/docs-site/mdx-components.js +0 -12
  145. package/docs-site/next-env.d.ts +0 -6
  146. package/docs-site/next.config.mjs +0 -5
  147. package/docs-site/package.json +0 -22
  148. package/docs-site/src/app/[[...mdxPath]]/page.jsx +0 -27
  149. package/docs-site/src/app/layout.jsx +0 -55
  150. package/esbuild.config.js +0 -80
  151. package/eslint-rules/no-relative-cross-package-imports.js +0 -159
  152. package/eslint.config.js +0 -327
  153. package/hello/QWEN.md +0 -8
  154. package/hello/qwen-extension.json +0 -5
  155. package/integration-tests/acp-integration.test.ts +0 -1003
  156. package/integration-tests/concurrent-runner/README.md +0 -139
  157. package/integration-tests/concurrent-runner/config.example.json +0 -39
  158. package/integration-tests/concurrent-runner/examples/toy-config.json +0 -27
  159. package/integration-tests/concurrent-runner/examples/toy-project/package.json +0 -11
  160. package/integration-tests/concurrent-runner/export-html-from-chatrecord-jsonl.js +0 -973
  161. package/integration-tests/concurrent-runner/render-chat-temp.html +0 -291
  162. package/integration-tests/concurrent-runner/requirements.txt +0 -2
  163. package/integration-tests/concurrent-runner/runner.py +0 -1083
  164. package/integration-tests/context-compress-interactive.test.ts +0 -108
  165. package/integration-tests/ctrl-c-exit.test.ts +0 -76
  166. package/integration-tests/edit.test.ts +0 -185
  167. package/integration-tests/extensions-install.test.ts +0 -52
  168. package/integration-tests/file-system-interactive.test.ts +0 -83
  169. package/integration-tests/file-system.test.ts +0 -247
  170. package/integration-tests/fixtures/settings-migration/workspaces.json +0 -189
  171. package/integration-tests/globalSetup.ts +0 -136
  172. package/integration-tests/hook-integration/hooks.test.ts +0 -1995
  173. package/integration-tests/json-output.test.ts +0 -310
  174. package/integration-tests/list_directory.test.ts +0 -66
  175. package/integration-tests/mcp_server_cyclic_schema.test.ts +0 -207
  176. package/integration-tests/mixed-input-crash.test.ts +0 -62
  177. package/integration-tests/read_many_files.test.ts +0 -47
  178. package/integration-tests/run_shell_command.test.ts +0 -130
  179. package/integration-tests/save_memory.test.ts +0 -47
  180. package/integration-tests/sdk-typescript/abort-and-lifecycle.test.ts +0 -657
  181. package/integration-tests/sdk-typescript/configuration-options.test.ts +0 -636
  182. package/integration-tests/sdk-typescript/mcp-server.test.ts +0 -581
  183. package/integration-tests/sdk-typescript/multi-turn.test.ts +0 -610
  184. package/integration-tests/sdk-typescript/permission-control.test.ts +0 -1272
  185. package/integration-tests/sdk-typescript/sdk-mcp-server.test.ts +0 -467
  186. package/integration-tests/sdk-typescript/session-id.test.ts +0 -582
  187. package/integration-tests/sdk-typescript/single-turn.test.ts +0 -528
  188. package/integration-tests/sdk-typescript/subagents.test.ts +0 -570
  189. package/integration-tests/sdk-typescript/system-control.test.ts +0 -426
  190. package/integration-tests/sdk-typescript/test-helper.ts +0 -1012
  191. package/integration-tests/sdk-typescript/tool-control.test.ts +0 -984
  192. package/integration-tests/settings-migration.test.ts +0 -627
  193. package/integration-tests/simple-mcp-server.test.ts +0 -231
  194. package/integration-tests/stdin-context.test.ts +0 -97
  195. package/integration-tests/telemetry.test.ts +0 -26
  196. package/integration-tests/terminal-bench/ci-tasks/hello-world/Dockerfile +0 -2
  197. package/integration-tests/terminal-bench/ci-tasks/hello-world/docker-compose.yaml +0 -12
  198. package/integration-tests/terminal-bench/ci-tasks/hello-world/run-tests.sh +0 -4
  199. package/integration-tests/terminal-bench/ci-tasks/hello-world/solution.sh +0 -4
  200. package/integration-tests/terminal-bench/ci-tasks/hello-world/task.yaml +0 -15
  201. package/integration-tests/terminal-bench/ci-tasks/hello-world/tests/run-uv-pytest.sh +0 -3
  202. package/integration-tests/terminal-bench/ci-tasks/hello-world/tests/setup-uv-pytest.sh +0 -19
  203. package/integration-tests/terminal-bench/ci-tasks/hello-world/tests/test_outputs.py +0 -19
  204. package/integration-tests/terminal-bench/ci-tasks/swe-bench-astropy-1/Dockerfile +0 -34
  205. package/integration-tests/terminal-bench/ci-tasks/swe-bench-astropy-1/docker-compose.yaml +0 -12
  206. package/integration-tests/terminal-bench/ci-tasks/swe-bench-astropy-1/run-tests.sh +0 -52
  207. package/integration-tests/terminal-bench/ci-tasks/swe-bench-astropy-1/solution.sh +0 -26
  208. package/integration-tests/terminal-bench/ci-tasks/swe-bench-astropy-1/task.yaml +0 -55
  209. package/integration-tests/terminal-bench/qwen-code-setup.sh.j2 +0 -15
  210. package/integration-tests/terminal-bench/qwen_code.py +0 -70
  211. package/integration-tests/terminal-bench/terminal-bench.test.ts +0 -328
  212. package/integration-tests/terminal-capture/motivation.md +0 -127
  213. package/integration-tests/terminal-capture/package.json +0 -18
  214. package/integration-tests/terminal-capture/run.ts +0 -105
  215. package/integration-tests/terminal-capture/scenario-runner.ts +0 -429
  216. package/integration-tests/terminal-capture/scenarios/about.ts +0 -8
  217. package/integration-tests/terminal-capture/scenarios/all.ts +0 -46
  218. package/integration-tests/terminal-capture/scenarios/message-components.ts +0 -32
  219. package/integration-tests/terminal-capture/scenarios/progress.sh +0 -16
  220. package/integration-tests/terminal-capture/scenarios/qc-code-review.ts +0 -17
  221. package/integration-tests/terminal-capture/scenarios/streaming-insight.ts +0 -23
  222. package/integration-tests/terminal-capture/scenarios/streaming-shell.ts +0 -24
  223. package/integration-tests/terminal-capture/terminal-capture.ts +0 -856
  224. package/integration-tests/test-helper.ts +0 -863
  225. package/integration-tests/test-mcp-server.ts +0 -64
  226. package/integration-tests/todo_write.test.ts +0 -69
  227. package/integration-tests/tsconfig.json +0 -13
  228. package/integration-tests/utf-bom-encoding.test.ts +0 -218
  229. package/integration-tests/vitest.config.ts +0 -40
  230. package/integration-tests/vitest.terminal-bench.config.ts +0 -21
  231. package/integration-tests/web_search.test.ts +0 -122
  232. package/integration-tests/write_file.test.ts +0 -69
  233. package/packages/cli/index.ts +0 -30
  234. package/packages/cli/package.json +0 -112
  235. package/packages/cli/src/acp-integration/acpAgent.ts +0 -600
  236. package/packages/cli/src/acp-integration/authMethods.ts +0 -51
  237. package/packages/cli/src/acp-integration/errorCodes.ts +0 -25
  238. package/packages/cli/src/acp-integration/service/filesystem.test.ts +0 -182
  239. package/packages/cli/src/acp-integration/service/filesystem.ts +0 -108
  240. package/packages/cli/src/acp-integration/session/HistoryReplayer.test.ts +0 -477
  241. package/packages/cli/src/acp-integration/session/HistoryReplayer.ts +0 -234
  242. package/packages/cli/src/acp-integration/session/Session.test.ts +0 -245
  243. package/packages/cli/src/acp-integration/session/Session.ts +0 -1068
  244. package/packages/cli/src/acp-integration/session/SubAgentTracker.test.ts +0 -725
  245. package/packages/cli/src/acp-integration/session/SubAgentTracker.ts +0 -390
  246. package/packages/cli/src/acp-integration/session/emitters/BaseEmitter.ts +0 -52
  247. package/packages/cli/src/acp-integration/session/emitters/MessageEmitter.test.ts +0 -206
  248. package/packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts +0 -124
  249. package/packages/cli/src/acp-integration/session/emitters/PlanEmitter.test.ts +0 -228
  250. package/packages/cli/src/acp-integration/session/emitters/PlanEmitter.ts +0 -96
  251. package/packages/cli/src/acp-integration/session/emitters/ToolCallEmitter.test.ts +0 -677
  252. package/packages/cli/src/acp-integration/session/emitters/ToolCallEmitter.ts +0 -328
  253. package/packages/cli/src/acp-integration/session/emitters/index.ts +0 -10
  254. package/packages/cli/src/acp-integration/session/index.ts +0 -40
  255. package/packages/cli/src/acp-integration/session/types.ts +0 -102
  256. package/packages/cli/src/commands/extensions/consent.test.ts +0 -327
  257. package/packages/cli/src/commands/extensions/consent.ts +0 -269
  258. package/packages/cli/src/commands/extensions/disable.test.ts +0 -145
  259. package/packages/cli/src/commands/extensions/disable.ts +0 -77
  260. package/packages/cli/src/commands/extensions/enable.test.ts +0 -133
  261. package/packages/cli/src/commands/extensions/enable.ts +0 -89
  262. package/packages/cli/src/commands/extensions/examples/agent/agents/diary.md +0 -87
  263. package/packages/cli/src/commands/extensions/examples/agent/qwen-extension.json +0 -4
  264. package/packages/cli/src/commands/extensions/examples/commands/commands/fs/grep-code.md +0 -3
  265. package/packages/cli/src/commands/extensions/examples/commands/qwen-extension.json +0 -4
  266. package/packages/cli/src/commands/extensions/examples/context/QWEN.md +0 -8
  267. package/packages/cli/src/commands/extensions/examples/context/qwen-extension.json +0 -4
  268. package/packages/cli/src/commands/extensions/examples/mcp-server/example.ts +0 -60
  269. package/packages/cli/src/commands/extensions/examples/mcp-server/package.json +0 -18
  270. package/packages/cli/src/commands/extensions/examples/mcp-server/qwen-extension.json +0 -11
  271. package/packages/cli/src/commands/extensions/examples/mcp-server/tsconfig.json +0 -13
  272. package/packages/cli/src/commands/extensions/examples/skills/qwen-extension.json +0 -4
  273. package/packages/cli/src/commands/extensions/examples/skills/skills/synonyms/SKILL.md +0 -48
  274. package/packages/cli/src/commands/extensions/install.test.ts +0 -228
  275. package/packages/cli/src/commands/extensions/install.ts +0 -131
  276. package/packages/cli/src/commands/extensions/link.test.ts +0 -99
  277. package/packages/cli/src/commands/extensions/link.ts +0 -66
  278. package/packages/cli/src/commands/extensions/list.test.ts +0 -103
  279. package/packages/cli/src/commands/extensions/list.ts +0 -42
  280. package/packages/cli/src/commands/extensions/new.test.ts +0 -91
  281. package/packages/cli/src/commands/extensions/new.ts +0 -110
  282. package/packages/cli/src/commands/extensions/settings.test.ts +0 -345
  283. package/packages/cli/src/commands/extensions/settings.ts +0 -152
  284. package/packages/cli/src/commands/extensions/uninstall.test.ts +0 -21
  285. package/packages/cli/src/commands/extensions/uninstall.ts +0 -71
  286. package/packages/cli/src/commands/extensions/update.test.ts +0 -260
  287. package/packages/cli/src/commands/extensions/update.ts +0 -155
  288. package/packages/cli/src/commands/extensions/utils.test.ts +0 -138
  289. package/packages/cli/src/commands/extensions/utils.ts +0 -98
  290. package/packages/cli/src/commands/extensions.test.tsx +0 -106
  291. package/packages/cli/src/commands/extensions.tsx +0 -38
  292. package/packages/cli/src/commands/hooks/disable.ts +0 -78
  293. package/packages/cli/src/commands/hooks/enable.ts +0 -78
  294. package/packages/cli/src/commands/hooks.tsx +0 -25
  295. package/packages/cli/src/commands/mcp/add.test.ts +0 -371
  296. package/packages/cli/src/commands/mcp/add.ts +0 -247
  297. package/packages/cli/src/commands/mcp/list.test.ts +0 -189
  298. package/packages/cli/src/commands/mcp/list.ts +0 -148
  299. package/packages/cli/src/commands/mcp/remove.test.ts +0 -115
  300. package/packages/cli/src/commands/mcp/remove.ts +0 -70
  301. package/packages/cli/src/commands/mcp.test.ts +0 -55
  302. package/packages/cli/src/commands/mcp.ts +0 -27
  303. package/packages/cli/src/config/auth.test.ts +0 -230
  304. package/packages/cli/src/config/auth.ts +0 -223
  305. package/packages/cli/src/config/config.integration.test.ts +0 -417
  306. package/packages/cli/src/config/config.test.ts +0 -2402
  307. package/packages/cli/src/config/config.ts +0 -1089
  308. package/packages/cli/src/config/keyBindings.test.ts +0 -59
  309. package/packages/cli/src/config/keyBindings.ts +0 -186
  310. package/packages/cli/src/config/migration/index.test.ts +0 -383
  311. package/packages/cli/src/config/migration/index.ts +0 -106
  312. package/packages/cli/src/config/migration/scheduler.test.ts +0 -164
  313. package/packages/cli/src/config/migration/scheduler.ts +0 -115
  314. package/packages/cli/src/config/migration/types.ts +0 -58
  315. package/packages/cli/src/config/migration/versions/v1-to-v2-shared.ts +0 -180
  316. package/packages/cli/src/config/migration/versions/v1-to-v2.test.ts +0 -277
  317. package/packages/cli/src/config/migration/versions/v1-to-v2.ts +0 -267
  318. package/packages/cli/src/config/migration/versions/v2-to-v3.test.ts +0 -598
  319. package/packages/cli/src/config/migration/versions/v2-to-v3.ts +0 -222
  320. package/packages/cli/src/config/modelProvidersScope.test.ts +0 -87
  321. package/packages/cli/src/config/modelProvidersScope.ts +0 -48
  322. package/packages/cli/src/config/sandboxConfig.ts +0 -105
  323. package/packages/cli/src/config/settings.test.ts +0 -2786
  324. package/packages/cli/src/config/settings.ts +0 -740
  325. package/packages/cli/src/config/settingsSchema.test.ts +0 -312
  326. package/packages/cli/src/config/settingsSchema.ts +0 -1277
  327. package/packages/cli/src/config/trustedFolders.test.ts +0 -429
  328. package/packages/cli/src/config/trustedFolders.ts +0 -239
  329. package/packages/cli/src/config/webSearch.ts +0 -121
  330. package/packages/cli/src/constants/codingPlan.ts +0 -321
  331. package/packages/cli/src/core/auth.ts +0 -48
  332. package/packages/cli/src/core/initializer.ts +0 -74
  333. package/packages/cli/src/core/theme.ts +0 -24
  334. package/packages/cli/src/gemini.test.tsx +0 -691
  335. package/packages/cli/src/gemini.tsx +0 -512
  336. package/packages/cli/src/i18n/index.ts +0 -257
  337. package/packages/cli/src/i18n/languages.ts +0 -98
  338. package/packages/cli/src/i18n/locales/de.js +0 -1613
  339. package/packages/cli/src/i18n/locales/en.js +0 -1665
  340. package/packages/cli/src/i18n/locales/ja.js +0 -1117
  341. package/packages/cli/src/i18n/locales/pt.js +0 -1608
  342. package/packages/cli/src/i18n/locales/ru.js +0 -1620
  343. package/packages/cli/src/i18n/locales/zh.js +0 -1485
  344. package/packages/cli/src/nonInteractive/control/ControlContext.ts +0 -79
  345. package/packages/cli/src/nonInteractive/control/ControlDispatcher.test.ts +0 -1010
  346. package/packages/cli/src/nonInteractive/control/ControlDispatcher.ts +0 -432
  347. package/packages/cli/src/nonInteractive/control/ControlService.ts +0 -179
  348. package/packages/cli/src/nonInteractive/control/controllers/baseController.ts +0 -226
  349. package/packages/cli/src/nonInteractive/control/controllers/hookController.ts +0 -56
  350. package/packages/cli/src/nonInteractive/control/controllers/permissionController.ts +0 -495
  351. package/packages/cli/src/nonInteractive/control/controllers/sdkMcpController.ts +0 -134
  352. package/packages/cli/src/nonInteractive/control/controllers/systemController.ts +0 -419
  353. package/packages/cli/src/nonInteractive/control/types/serviceAPIs.ts +0 -117
  354. package/packages/cli/src/nonInteractive/io/BaseJsonOutputAdapter.test.ts +0 -1652
  355. package/packages/cli/src/nonInteractive/io/BaseJsonOutputAdapter.ts +0 -1339
  356. package/packages/cli/src/nonInteractive/io/JsonOutputAdapter.test.ts +0 -865
  357. package/packages/cli/src/nonInteractive/io/JsonOutputAdapter.ts +0 -89
  358. package/packages/cli/src/nonInteractive/io/StreamJsonInputReader.test.ts +0 -215
  359. package/packages/cli/src/nonInteractive/io/StreamJsonInputReader.ts +0 -73
  360. package/packages/cli/src/nonInteractive/io/StreamJsonOutputAdapter.test.ts +0 -1168
  361. package/packages/cli/src/nonInteractive/io/StreamJsonOutputAdapter.ts +0 -330
  362. package/packages/cli/src/nonInteractive/session.test.ts +0 -577
  363. package/packages/cli/src/nonInteractive/session.ts +0 -626
  364. package/packages/cli/src/nonInteractive/types.ts +0 -578
  365. package/packages/cli/src/nonInteractiveCli.test.ts +0 -1814
  366. package/packages/cli/src/nonInteractiveCli.ts +0 -420
  367. package/packages/cli/src/nonInteractiveCliCommands.test.ts +0 -242
  368. package/packages/cli/src/nonInteractiveCliCommands.ts +0 -386
  369. package/packages/cli/src/patches/is-in-ci.ts +0 -17
  370. package/packages/cli/src/patches/termux-runtime.ts +0 -50
  371. package/packages/cli/src/services/BuiltinCommandLoader.test.ts +0 -187
  372. package/packages/cli/src/services/BuiltinCommandLoader.ts +0 -101
  373. package/packages/cli/src/services/CommandService.test.ts +0 -348
  374. package/packages/cli/src/services/CommandService.ts +0 -106
  375. package/packages/cli/src/services/FileCommandLoader-extension.test.ts +0 -343
  376. package/packages/cli/src/services/FileCommandLoader-markdown.test.ts +0 -141
  377. package/packages/cli/src/services/FileCommandLoader.test.ts +0 -1254
  378. package/packages/cli/src/services/FileCommandLoader.ts +0 -363
  379. package/packages/cli/src/services/McpPromptLoader.test.ts +0 -399
  380. package/packages/cli/src/services/McpPromptLoader.ts +0 -305
  381. package/packages/cli/src/services/command-factory.ts +0 -157
  382. package/packages/cli/src/services/command-migration-tool.test.ts +0 -254
  383. package/packages/cli/src/services/command-migration-tool.ts +0 -173
  384. package/packages/cli/src/services/insight/generators/DataProcessor.test.ts +0 -1217
  385. package/packages/cli/src/services/insight/generators/DataProcessor.ts +0 -1131
  386. package/packages/cli/src/services/insight/generators/StaticInsightGenerator.ts +0 -93
  387. package/packages/cli/src/services/insight/generators/TemplateRenderer.ts +0 -52
  388. package/packages/cli/src/services/insight/types/QualitativeInsightTypes.ts +0 -82
  389. package/packages/cli/src/services/insight/types/StaticInsightTypes.ts +0 -90
  390. package/packages/cli/src/services/markdown-command-parser.test.ts +0 -189
  391. package/packages/cli/src/services/markdown-command-parser.ts +0 -69
  392. package/packages/cli/src/services/prompt-processors/argumentProcessor.test.ts +0 -43
  393. package/packages/cli/src/services/prompt-processors/argumentProcessor.ts +0 -27
  394. package/packages/cli/src/services/prompt-processors/atFileProcessor.test.ts +0 -221
  395. package/packages/cli/src/services/prompt-processors/atFileProcessor.ts +0 -99
  396. package/packages/cli/src/services/prompt-processors/injectionParser.test.ts +0 -223
  397. package/packages/cli/src/services/prompt-processors/injectionParser.ts +0 -89
  398. package/packages/cli/src/services/prompt-processors/shellProcessor.test.ts +0 -741
  399. package/packages/cli/src/services/prompt-processors/shellProcessor.ts +0 -233
  400. package/packages/cli/src/services/prompt-processors/types.ts +0 -54
  401. package/packages/cli/src/services/test-commands/example.md +0 -5
  402. package/packages/cli/src/services/types.ts +0 -24
  403. package/packages/cli/src/test-utils/customMatchers.ts +0 -66
  404. package/packages/cli/src/test-utils/mockCommandContext.test.ts +0 -62
  405. package/packages/cli/src/test-utils/mockCommandContext.ts +0 -119
  406. package/packages/cli/src/test-utils/render.tsx +0 -47
  407. package/packages/cli/src/types/qrcode-terminal.d.ts +0 -9
  408. package/packages/cli/src/types/web-templates.d.ts +0 -8
  409. package/packages/cli/src/ui/App.test.tsx +0 -160
  410. package/packages/cli/src/ui/App.tsx +0 -27
  411. package/packages/cli/src/ui/AppContainer.test.tsx +0 -1124
  412. package/packages/cli/src/ui/AppContainer.tsx +0 -1647
  413. package/packages/cli/src/ui/CommandFormatMigrationNudge.tsx +0 -94
  414. package/packages/cli/src/ui/FeedbackDialog.tsx +0 -75
  415. package/packages/cli/src/ui/IdeIntegrationNudge.tsx +0 -103
  416. package/packages/cli/src/ui/auth/AuthDialog.test.tsx +0 -558
  417. package/packages/cli/src/ui/auth/AuthDialog.tsx +0 -396
  418. package/packages/cli/src/ui/auth/AuthInProgress.tsx +0 -64
  419. package/packages/cli/src/ui/auth/useAuth.ts +0 -478
  420. package/packages/cli/src/ui/colors.ts +0 -62
  421. package/packages/cli/src/ui/commands/aboutCommand.test.ts +0 -283
  422. package/packages/cli/src/ui/commands/aboutCommand.ts +0 -30
  423. package/packages/cli/src/ui/commands/agentsCommand.ts +0 -44
  424. package/packages/cli/src/ui/commands/approvalModeCommand.test.ts +0 -175
  425. package/packages/cli/src/ui/commands/approvalModeCommand.ts +0 -83
  426. package/packages/cli/src/ui/commands/authCommand.test.ts +0 -38
  427. package/packages/cli/src/ui/commands/authCommand.ts +0 -22
  428. package/packages/cli/src/ui/commands/bugCommand.test.ts +0 -166
  429. package/packages/cli/src/ui/commands/bugCommand.ts +0 -68
  430. package/packages/cli/src/ui/commands/clearCommand.test.ts +0 -100
  431. package/packages/cli/src/ui/commands/clearCommand.ts +0 -49
  432. package/packages/cli/src/ui/commands/compressCommand.test.ts +0 -134
  433. package/packages/cli/src/ui/commands/compressCommand.ts +0 -175
  434. package/packages/cli/src/ui/commands/copyCommand.test.ts +0 -304
  435. package/packages/cli/src/ui/commands/copyCommand.ts +0 -67
  436. package/packages/cli/src/ui/commands/directoryCommand.test.tsx +0 -183
  437. package/packages/cli/src/ui/commands/directoryCommand.tsx +0 -207
  438. package/packages/cli/src/ui/commands/docsCommand.test.ts +0 -99
  439. package/packages/cli/src/ui/commands/docsCommand.ts +0 -53
  440. package/packages/cli/src/ui/commands/editorCommand.test.ts +0 -30
  441. package/packages/cli/src/ui/commands/editorCommand.ts +0 -24
  442. package/packages/cli/src/ui/commands/exportCommand.test.ts +0 -383
  443. package/packages/cli/src/ui/commands/exportCommand.ts +0 -347
  444. package/packages/cli/src/ui/commands/extensionsCommand.test.ts +0 -213
  445. package/packages/cli/src/ui/commands/extensionsCommand.ts +0 -255
  446. package/packages/cli/src/ui/commands/helpCommand.test.ts +0 -52
  447. package/packages/cli/src/ui/commands/helpCommand.ts +0 -27
  448. package/packages/cli/src/ui/commands/hooksCommand.ts +0 -322
  449. package/packages/cli/src/ui/commands/ideCommand.test.ts +0 -264
  450. package/packages/cli/src/ui/commands/ideCommand.ts +0 -335
  451. package/packages/cli/src/ui/commands/initCommand.test.ts +0 -169
  452. package/packages/cli/src/ui/commands/initCommand.ts +0 -134
  453. package/packages/cli/src/ui/commands/insightCommand.ts +0 -132
  454. package/packages/cli/src/ui/commands/languageCommand.test.ts +0 -848
  455. package/packages/cli/src/ui/commands/languageCommand.ts +0 -374
  456. package/packages/cli/src/ui/commands/mcpCommand.test.ts +0 -153
  457. package/packages/cli/src/ui/commands/mcpCommand.ts +0 -21
  458. package/packages/cli/src/ui/commands/memoryCommand.test.ts +0 -411
  459. package/packages/cli/src/ui/commands/memoryCommand.ts +0 -347
  460. package/packages/cli/src/ui/commands/modelCommand.test.ts +0 -140
  461. package/packages/cli/src/ui/commands/modelCommand.ts +0 -59
  462. package/packages/cli/src/ui/commands/permissionsCommand.test.ts +0 -35
  463. package/packages/cli/src/ui/commands/permissionsCommand.ts +0 -21
  464. package/packages/cli/src/ui/commands/quitCommand.test.ts +0 -55
  465. package/packages/cli/src/ui/commands/quitCommand.ts +0 -39
  466. package/packages/cli/src/ui/commands/restoreCommand.test.ts +0 -255
  467. package/packages/cli/src/ui/commands/restoreCommand.ts +0 -153
  468. package/packages/cli/src/ui/commands/resumeCommand.test.ts +0 -38
  469. package/packages/cli/src/ui/commands/resumeCommand.ts +0 -21
  470. package/packages/cli/src/ui/commands/settingsCommand.test.ts +0 -36
  471. package/packages/cli/src/ui/commands/settingsCommand.ts +0 -21
  472. package/packages/cli/src/ui/commands/setupGithubCommand.test.ts +0 -231
  473. package/packages/cli/src/ui/commands/setupGithubCommand.ts +0 -225
  474. package/packages/cli/src/ui/commands/skillsCommand.ts +0 -135
  475. package/packages/cli/src/ui/commands/statsCommand.test.ts +0 -78
  476. package/packages/cli/src/ui/commands/statsCommand.ts +0 -78
  477. package/packages/cli/src/ui/commands/summaryCommand.ts +0 -323
  478. package/packages/cli/src/ui/commands/terminalSetupCommand.test.ts +0 -85
  479. package/packages/cli/src/ui/commands/terminalSetupCommand.ts +0 -53
  480. package/packages/cli/src/ui/commands/themeCommand.test.ts +0 -38
  481. package/packages/cli/src/ui/commands/themeCommand.ts +0 -21
  482. package/packages/cli/src/ui/commands/toolsCommand.test.ts +0 -114
  483. package/packages/cli/src/ui/commands/toolsCommand.ts +0 -58
  484. package/packages/cli/src/ui/commands/types.ts +0 -254
  485. package/packages/cli/src/ui/commands/vimCommand.ts +0 -29
  486. package/packages/cli/src/ui/components/AboutBox.tsx +0 -52
  487. package/packages/cli/src/ui/components/AnsiOutput.test.tsx +0 -106
  488. package/packages/cli/src/ui/components/AnsiOutput.tsx +0 -50
  489. package/packages/cli/src/ui/components/ApiKeyInput.tsx +0 -95
  490. package/packages/cli/src/ui/components/AppHeader.test.tsx +0 -94
  491. package/packages/cli/src/ui/components/AppHeader.tsx +0 -76
  492. package/packages/cli/src/ui/components/ApprovalModeDialog.tsx +0 -182
  493. package/packages/cli/src/ui/components/AsciiArt.ts +0 -14
  494. package/packages/cli/src/ui/components/AutoAcceptIndicator.tsx +0 -58
  495. package/packages/cli/src/ui/components/Composer.test.tsx +0 -347
  496. package/packages/cli/src/ui/components/Composer.tsx +0 -116
  497. package/packages/cli/src/ui/components/ConfigInitDisplay.tsx +0 -56
  498. package/packages/cli/src/ui/components/ConsentPrompt.test.tsx +0 -119
  499. package/packages/cli/src/ui/components/ConsentPrompt.tsx +0 -51
  500. package/packages/cli/src/ui/components/ContextSummaryDisplay.test.tsx +0 -85
  501. package/packages/cli/src/ui/components/ContextSummaryDisplay.tsx +0 -143
  502. package/packages/cli/src/ui/components/ContextUsageDisplay.tsx +0 -34
  503. package/packages/cli/src/ui/components/DebugModeNotification.tsx +0 -39
  504. package/packages/cli/src/ui/components/DebugProfiler.tsx +0 -36
  505. package/packages/cli/src/ui/components/DialogManager.tsx +0 -321
  506. package/packages/cli/src/ui/components/EditorSettingsDialog.tsx +0 -195
  507. package/packages/cli/src/ui/components/ExitWarning.tsx +0 -29
  508. package/packages/cli/src/ui/components/FolderTrustDialog.test.tsx +0 -129
  509. package/packages/cli/src/ui/components/FolderTrustDialog.tsx +0 -110
  510. package/packages/cli/src/ui/components/Footer.test.tsx +0 -98
  511. package/packages/cli/src/ui/components/Footer.tsx +0 -124
  512. package/packages/cli/src/ui/components/GeminiRespondingSpinner.tsx +0 -67
  513. package/packages/cli/src/ui/components/Header.test.tsx +0 -84
  514. package/packages/cli/src/ui/components/Header.tsx +0 -158
  515. package/packages/cli/src/ui/components/Help.test.tsx +0 -83
  516. package/packages/cli/src/ui/components/Help.tsx +0 -188
  517. package/packages/cli/src/ui/components/HistoryItemDisplay.test.tsx +0 -287
  518. package/packages/cli/src/ui/components/HistoryItemDisplay.tsx +0 -202
  519. package/packages/cli/src/ui/components/IdeTrustChangeDialog.test.tsx +0 -85
  520. package/packages/cli/src/ui/components/IdeTrustChangeDialog.tsx +0 -50
  521. package/packages/cli/src/ui/components/InputPrompt.test.tsx +0 -2579
  522. package/packages/cli/src/ui/components/InputPrompt.tsx +0 -1203
  523. package/packages/cli/src/ui/components/KeyboardShortcuts.tsx +0 -124
  524. package/packages/cli/src/ui/components/LoadingIndicator.test.tsx +0 -311
  525. package/packages/cli/src/ui/components/LoadingIndicator.tsx +0 -90
  526. package/packages/cli/src/ui/components/LoopDetectionConfirmation.test.tsx +0 -39
  527. package/packages/cli/src/ui/components/LoopDetectionConfirmation.tsx +0 -97
  528. package/packages/cli/src/ui/components/MainContent.tsx +0 -80
  529. package/packages/cli/src/ui/components/MemoryUsageDisplay.tsx +0 -41
  530. package/packages/cli/src/ui/components/ModelDialog.test.tsx +0 -399
  531. package/packages/cli/src/ui/components/ModelDialog.tsx +0 -460
  532. package/packages/cli/src/ui/components/ModelStatsDisplay.test.tsx +0 -252
  533. package/packages/cli/src/ui/components/ModelStatsDisplay.tsx +0 -217
  534. package/packages/cli/src/ui/components/Notifications.tsx +0 -58
  535. package/packages/cli/src/ui/components/PermissionsModifyTrustDialog.test.tsx +0 -199
  536. package/packages/cli/src/ui/components/PermissionsModifyTrustDialog.tsx +0 -125
  537. package/packages/cli/src/ui/components/PlanSummaryDisplay.tsx +0 -41
  538. package/packages/cli/src/ui/components/PluginChoicePrompt.test.tsx +0 -243
  539. package/packages/cli/src/ui/components/PluginChoicePrompt.tsx +0 -195
  540. package/packages/cli/src/ui/components/PrepareLabel.test.tsx +0 -123
  541. package/packages/cli/src/ui/components/PrepareLabel.tsx +0 -116
  542. package/packages/cli/src/ui/components/QueuedMessageDisplay.test.tsx +0 -76
  543. package/packages/cli/src/ui/components/QueuedMessageDisplay.tsx +0 -47
  544. package/packages/cli/src/ui/components/QuittingDisplay.tsx +0 -39
  545. package/packages/cli/src/ui/components/QwenOAuthProgress.test.tsx +0 -611
  546. package/packages/cli/src/ui/components/QwenOAuthProgress.tsx +0 -316
  547. package/packages/cli/src/ui/components/SessionPicker.tsx +0 -251
  548. package/packages/cli/src/ui/components/SessionSummaryDisplay.test.tsx +0 -154
  549. package/packages/cli/src/ui/components/SessionSummaryDisplay.tsx +0 -51
  550. package/packages/cli/src/ui/components/SettingInputPrompt.test.tsx +0 -133
  551. package/packages/cli/src/ui/components/SettingInputPrompt.tsx +0 -157
  552. package/packages/cli/src/ui/components/SettingsDialog.test.tsx +0 -1638
  553. package/packages/cli/src/ui/components/SettingsDialog.tsx +0 -900
  554. package/packages/cli/src/ui/components/ShellConfirmationDialog.test.tsx +0 -53
  555. package/packages/cli/src/ui/components/ShellConfirmationDialog.tsx +0 -109
  556. package/packages/cli/src/ui/components/ShellInputPrompt.tsx +0 -57
  557. package/packages/cli/src/ui/components/ShellModeIndicator.tsx +0 -18
  558. package/packages/cli/src/ui/components/ShowMoreLines.tsx +0 -40
  559. package/packages/cli/src/ui/components/StandaloneSessionPicker.test.tsx +0 -624
  560. package/packages/cli/src/ui/components/StandaloneSessionPicker.tsx +0 -129
  561. package/packages/cli/src/ui/components/StatsDisplay.test.tsx +0 -401
  562. package/packages/cli/src/ui/components/StatsDisplay.tsx +0 -298
  563. package/packages/cli/src/ui/components/SuggestionsDisplay.tsx +0 -131
  564. package/packages/cli/src/ui/components/ThemeDialog.test.tsx +0 -108
  565. package/packages/cli/src/ui/components/ThemeDialog.tsx +0 -287
  566. package/packages/cli/src/ui/components/Tips.test.ts +0 -62
  567. package/packages/cli/src/ui/components/Tips.tsx +0 -62
  568. package/packages/cli/src/ui/components/TodoDisplay.test.tsx +0 -98
  569. package/packages/cli/src/ui/components/TodoDisplay.tsx +0 -72
  570. package/packages/cli/src/ui/components/ToolStatsDisplay.test.tsx +0 -180
  571. package/packages/cli/src/ui/components/ToolStatsDisplay.tsx +0 -234
  572. package/packages/cli/src/ui/components/UpdateNotification.tsx +0 -23
  573. package/packages/cli/src/ui/components/WelcomeBackDialog.tsx +0 -134
  574. package/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap +0 -5
  575. package/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap +0 -139
  576. package/packages/cli/src/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap +0 -24
  577. package/packages/cli/src/ui/components/__snapshots__/InputPrompt.test.tsx.snap +0 -57
  578. package/packages/cli/src/ui/components/__snapshots__/LoadingIndicator.test.tsx.snap +0 -6
  579. package/packages/cli/src/ui/components/__snapshots__/LoopDetectionConfirmation.test.tsx.snap +0 -16
  580. package/packages/cli/src/ui/components/__snapshots__/ModelStatsDisplay.test.tsx.snap +0 -121
  581. package/packages/cli/src/ui/components/__snapshots__/PrepareLabel.test.tsx.snap +0 -25
  582. package/packages/cli/src/ui/components/__snapshots__/SessionSummaryDisplay.test.tsx.snap +0 -32
  583. package/packages/cli/src/ui/components/__snapshots__/SettingsDialog.test.tsx.snap +0 -211
  584. package/packages/cli/src/ui/components/__snapshots__/ShellConfirmationDialog.test.tsx.snap +0 -21
  585. package/packages/cli/src/ui/components/__snapshots__/StatsDisplay.test.tsx.snap +0 -264
  586. package/packages/cli/src/ui/components/__snapshots__/ThemeDialog.test.tsx.snap +0 -38
  587. package/packages/cli/src/ui/components/__snapshots__/ToolStatsDisplay.test.tsx.snap +0 -91
  588. package/packages/cli/src/ui/components/extensions/ExtensionsManagerDialog.test.tsx +0 -153
  589. package/packages/cli/src/ui/components/extensions/ExtensionsManagerDialog.tsx +0 -530
  590. package/packages/cli/src/ui/components/extensions/__snapshots__/ExtensionsManagerDialog.test.tsx.snap +0 -45
  591. package/packages/cli/src/ui/components/extensions/index.ts +0 -9
  592. package/packages/cli/src/ui/components/extensions/steps/ActionSelectionStep.test.tsx +0 -109
  593. package/packages/cli/src/ui/components/extensions/steps/ActionSelectionStep.tsx +0 -102
  594. package/packages/cli/src/ui/components/extensions/steps/ExtensionDetailStep.tsx +0 -128
  595. package/packages/cli/src/ui/components/extensions/steps/ExtensionListStep.test.tsx +0 -134
  596. package/packages/cli/src/ui/components/extensions/steps/ExtensionListStep.tsx +0 -177
  597. package/packages/cli/src/ui/components/extensions/steps/ScopeSelectStep.tsx +0 -70
  598. package/packages/cli/src/ui/components/extensions/steps/UninstallConfirmStep.tsx +0 -65
  599. package/packages/cli/src/ui/components/extensions/steps/__snapshots__/ActionSelectionStep.test.tsx.snap +0 -33
  600. package/packages/cli/src/ui/components/extensions/steps/__snapshots__/ExtensionListStep.test.tsx.snap +0 -32
  601. package/packages/cli/src/ui/components/extensions/steps/index.ts +0 -11
  602. package/packages/cli/src/ui/components/extensions/types.ts +0 -89
  603. package/packages/cli/src/ui/components/mcp/MCPManagementDialog.tsx +0 -680
  604. package/packages/cli/src/ui/components/mcp/constants.ts +0 -47
  605. package/packages/cli/src/ui/components/mcp/index.ts +0 -30
  606. package/packages/cli/src/ui/components/mcp/steps/AuthenticateStep.tsx +0 -164
  607. package/packages/cli/src/ui/components/mcp/steps/DisableScopeSelectStep.tsx +0 -88
  608. package/packages/cli/src/ui/components/mcp/steps/ServerDetailStep.tsx +0 -233
  609. package/packages/cli/src/ui/components/mcp/steps/ServerListStep.tsx +0 -176
  610. package/packages/cli/src/ui/components/mcp/steps/ToolDetailStep.tsx +0 -139
  611. package/packages/cli/src/ui/components/mcp/steps/ToolListStep.tsx +0 -146
  612. package/packages/cli/src/ui/components/mcp/types.ts +0 -195
  613. package/packages/cli/src/ui/components/mcp/utils.test.ts +0 -159
  614. package/packages/cli/src/ui/components/mcp/utils.ts +0 -129
  615. package/packages/cli/src/ui/components/messages/AskUserQuestionDialog.test.tsx +0 -883
  616. package/packages/cli/src/ui/components/messages/AskUserQuestionDialog.tsx +0 -572
  617. package/packages/cli/src/ui/components/messages/CompressionMessage.test.tsx +0 -198
  618. package/packages/cli/src/ui/components/messages/CompressionMessage.tsx +0 -90
  619. package/packages/cli/src/ui/components/messages/ConversationMessages.tsx +0 -261
  620. package/packages/cli/src/ui/components/messages/DiffRenderer.test.tsx +0 -479
  621. package/packages/cli/src/ui/components/messages/DiffRenderer.tsx +0 -380
  622. package/packages/cli/src/ui/components/messages/InsightProgressMessage.tsx +0 -59
  623. package/packages/cli/src/ui/components/messages/StatusMessages.tsx +0 -105
  624. package/packages/cli/src/ui/components/messages/SummaryMessage.tsx +0 -59
  625. package/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx +0 -250
  626. package/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx +0 -437
  627. package/packages/cli/src/ui/components/messages/ToolGroupMessage.test.tsx +0 -360
  628. package/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx +0 -151
  629. package/packages/cli/src/ui/components/messages/ToolMessage.test.tsx +0 -303
  630. package/packages/cli/src/ui/components/messages/ToolMessage.tsx +0 -498
  631. package/packages/cli/src/ui/components/messages/__snapshots__/ToolGroupMessage.test.tsx.snap +0 -108
  632. package/packages/cli/src/ui/components/shared/BaseSelectionList.test.tsx +0 -534
  633. package/packages/cli/src/ui/components/shared/BaseSelectionList.tsx +0 -182
  634. package/packages/cli/src/ui/components/shared/DescriptiveRadioButtonSelect.test.tsx +0 -97
  635. package/packages/cli/src/ui/components/shared/DescriptiveRadioButtonSelect.tsx +0 -74
  636. package/packages/cli/src/ui/components/shared/EnumSelector.test.tsx +0 -152
  637. package/packages/cli/src/ui/components/shared/EnumSelector.tsx +0 -87
  638. package/packages/cli/src/ui/components/shared/MaxSizedBox.test.tsx +0 -425
  639. package/packages/cli/src/ui/components/shared/MaxSizedBox.tsx +0 -628
  640. package/packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx +0 -198
  641. package/packages/cli/src/ui/components/shared/RadioButtonSelect.tsx +0 -91
  642. package/packages/cli/src/ui/components/shared/ScopeSelector.tsx +0 -59
  643. package/packages/cli/src/ui/components/shared/TextInput.tsx +0 -197
  644. package/packages/cli/src/ui/components/shared/__snapshots__/DescriptiveRadioButtonSelect.test.tsx.snap +0 -21
  645. package/packages/cli/src/ui/components/shared/__snapshots__/EnumSelector.test.tsx.snap +0 -9
  646. package/packages/cli/src/ui/components/shared/text-buffer.test.ts +0 -1951
  647. package/packages/cli/src/ui/components/shared/text-buffer.ts +0 -2371
  648. package/packages/cli/src/ui/components/shared/vim-buffer-actions.test.ts +0 -1119
  649. package/packages/cli/src/ui/components/shared/vim-buffer-actions.ts +0 -813
  650. package/packages/cli/src/ui/components/subagents/constants.ts +0 -71
  651. package/packages/cli/src/ui/components/subagents/create/AgentCreationWizard.tsx +0 -299
  652. package/packages/cli/src/ui/components/subagents/create/ColorSelector.tsx +0 -85
  653. package/packages/cli/src/ui/components/subagents/create/CreationSummary.tsx +0 -331
  654. package/packages/cli/src/ui/components/subagents/create/DescriptionInput.tsx +0 -177
  655. package/packages/cli/src/ui/components/subagents/create/GenerationMethodSelector.tsx +0 -63
  656. package/packages/cli/src/ui/components/subagents/create/LocationSelector.tsx +0 -58
  657. package/packages/cli/src/ui/components/subagents/create/TextEntryStep.tsx +0 -78
  658. package/packages/cli/src/ui/components/subagents/create/ToolSelector.tsx +0 -253
  659. package/packages/cli/src/ui/components/subagents/index.ts +0 -14
  660. package/packages/cli/src/ui/components/subagents/manage/ActionSelectionStep.tsx +0 -103
  661. package/packages/cli/src/ui/components/subagents/manage/AgentDeleteStep.tsx +0 -62
  662. package/packages/cli/src/ui/components/subagents/manage/AgentEditStep.tsx +0 -124
  663. package/packages/cli/src/ui/components/subagents/manage/AgentSelectionStep.tsx +0 -449
  664. package/packages/cli/src/ui/components/subagents/manage/AgentViewerStep.tsx +0 -66
  665. package/packages/cli/src/ui/components/subagents/manage/AgentsManagerDialog.tsx +0 -341
  666. package/packages/cli/src/ui/components/subagents/reducers.tsx +0 -190
  667. package/packages/cli/src/ui/components/subagents/runtime/AgentExecutionDisplay.tsx +0 -550
  668. package/packages/cli/src/ui/components/subagents/types.ts +0 -133
  669. package/packages/cli/src/ui/components/subagents/utils.ts +0 -102
  670. package/packages/cli/src/ui/components/views/ExtensionsList.test.tsx +0 -100
  671. package/packages/cli/src/ui/components/views/ExtensionsList.tsx +0 -80
  672. package/packages/cli/src/ui/components/views/McpStatus.test.tsx +0 -163
  673. package/packages/cli/src/ui/components/views/McpStatus.tsx +0 -298
  674. package/packages/cli/src/ui/components/views/SkillsList.tsx +0 -36
  675. package/packages/cli/src/ui/components/views/ToolsList.test.tsx +0 -58
  676. package/packages/cli/src/ui/components/views/ToolsList.tsx +0 -53
  677. package/packages/cli/src/ui/components/views/__snapshots__/McpStatus.test.tsx.snap +0 -166
  678. package/packages/cli/src/ui/components/views/__snapshots__/ToolsList.test.tsx.snap +0 -29
  679. package/packages/cli/src/ui/constants.ts +0 -29
  680. package/packages/cli/src/ui/contexts/AppContext.tsx +0 -22
  681. package/packages/cli/src/ui/contexts/ConfigContext.tsx +0 -18
  682. package/packages/cli/src/ui/contexts/KeypressContext.test.tsx +0 -1756
  683. package/packages/cli/src/ui/contexts/KeypressContext.tsx +0 -932
  684. package/packages/cli/src/ui/contexts/OverflowContext.tsx +0 -88
  685. package/packages/cli/src/ui/contexts/SessionContext.test.tsx +0 -221
  686. package/packages/cli/src/ui/contexts/SessionContext.tsx +0 -281
  687. package/packages/cli/src/ui/contexts/SettingsContext.tsx +0 -20
  688. package/packages/cli/src/ui/contexts/ShellFocusContext.tsx +0 -11
  689. package/packages/cli/src/ui/contexts/StreamingContext.tsx +0 -22
  690. package/packages/cli/src/ui/contexts/UIActionsContext.tsx +0 -100
  691. package/packages/cli/src/ui/contexts/UIStateContext.tsx +0 -144
  692. package/packages/cli/src/ui/contexts/VimModeContext.tsx +0 -80
  693. package/packages/cli/src/ui/editors/editorSettingsManager.ts +0 -67
  694. package/packages/cli/src/ui/hooks/atCommandProcessor.test.ts +0 -1136
  695. package/packages/cli/src/ui/hooks/atCommandProcessor.ts +0 -434
  696. package/packages/cli/src/ui/hooks/keyToAnsi.ts +0 -77
  697. package/packages/cli/src/ui/hooks/shellCommandProcessor.test.ts +0 -723
  698. package/packages/cli/src/ui/hooks/shellCommandProcessor.ts +0 -382
  699. package/packages/cli/src/ui/hooks/slashCommandProcessor.test.ts +0 -1083
  700. package/packages/cli/src/ui/hooks/slashCommandProcessor.ts +0 -714
  701. package/packages/cli/src/ui/hooks/useAgentsManagerDialog.ts +0 -32
  702. package/packages/cli/src/ui/hooks/useApprovalModeCommand.ts +0 -57
  703. package/packages/cli/src/ui/hooks/useAtCompletion.test.ts +0 -508
  704. package/packages/cli/src/ui/hooks/useAtCompletion.ts +0 -239
  705. package/packages/cli/src/ui/hooks/useAttentionNotifications.test.ts +0 -199
  706. package/packages/cli/src/ui/hooks/useAttentionNotifications.ts +0 -71
  707. package/packages/cli/src/ui/hooks/useAutoAcceptIndicator.test.ts +0 -561
  708. package/packages/cli/src/ui/hooks/useAutoAcceptIndicator.ts +0 -85
  709. package/packages/cli/src/ui/hooks/useBracketedPaste.ts +0 -37
  710. package/packages/cli/src/ui/hooks/useCodingPlanUpdates.test.ts +0 -658
  711. package/packages/cli/src/ui/hooks/useCodingPlanUpdates.ts +0 -233
  712. package/packages/cli/src/ui/hooks/useCommandCompletion.test.ts +0 -517
  713. package/packages/cli/src/ui/hooks/useCommandCompletion.tsx +0 -243
  714. package/packages/cli/src/ui/hooks/useCommandMigration.ts +0 -51
  715. package/packages/cli/src/ui/hooks/useCompletion.ts +0 -126
  716. package/packages/cli/src/ui/hooks/useDialogClose.ts +0 -103
  717. package/packages/cli/src/ui/hooks/useEditorSettings.test.ts +0 -284
  718. package/packages/cli/src/ui/hooks/useEditorSettings.ts +0 -75
  719. package/packages/cli/src/ui/hooks/useExtensionUpdates.test.ts +0 -608
  720. package/packages/cli/src/ui/hooks/useExtensionUpdates.ts +0 -340
  721. package/packages/cli/src/ui/hooks/useExtensionsManagerDialog.ts +0 -33
  722. package/packages/cli/src/ui/hooks/useFeedbackDialog.ts +0 -206
  723. package/packages/cli/src/ui/hooks/useFocus.test.ts +0 -145
  724. package/packages/cli/src/ui/hooks/useFocus.ts +0 -62
  725. package/packages/cli/src/ui/hooks/useFolderTrust.test.ts +0 -211
  726. package/packages/cli/src/ui/hooks/useFolderTrust.ts +0 -80
  727. package/packages/cli/src/ui/hooks/useGeminiStream.test.tsx +0 -2946
  728. package/packages/cli/src/ui/hooks/useGeminiStream.ts +0 -1625
  729. package/packages/cli/src/ui/hooks/useGitBranchName.test.ts +0 -238
  730. package/packages/cli/src/ui/hooks/useGitBranchName.ts +0 -78
  731. package/packages/cli/src/ui/hooks/useHistoryManager.test.ts +0 -202
  732. package/packages/cli/src/ui/hooks/useHistoryManager.ts +0 -111
  733. package/packages/cli/src/ui/hooks/useIdeTrustListener.test.ts +0 -226
  734. package/packages/cli/src/ui/hooks/useIdeTrustListener.ts +0 -90
  735. package/packages/cli/src/ui/hooks/useInitializationAuthError.ts +0 -47
  736. package/packages/cli/src/ui/hooks/useInputHistory.test.ts +0 -261
  737. package/packages/cli/src/ui/hooks/useInputHistory.ts +0 -111
  738. package/packages/cli/src/ui/hooks/useInputHistoryStore.test.ts +0 -293
  739. package/packages/cli/src/ui/hooks/useInputHistoryStore.ts +0 -118
  740. package/packages/cli/src/ui/hooks/useKeypress.test.ts +0 -314
  741. package/packages/cli/src/ui/hooks/useKeypress.ts +0 -36
  742. package/packages/cli/src/ui/hooks/useKittyKeyboardProtocol.ts +0 -31
  743. package/packages/cli/src/ui/hooks/useLaunchEditor.ts +0 -125
  744. package/packages/cli/src/ui/hooks/useLoadingIndicator.test.ts +0 -136
  745. package/packages/cli/src/ui/hooks/useLoadingIndicator.ts +0 -61
  746. package/packages/cli/src/ui/hooks/useLogger.ts +0 -37
  747. package/packages/cli/src/ui/hooks/useMcpDialog.ts +0 -31
  748. package/packages/cli/src/ui/hooks/useMemoryMonitor.test.ts +0 -71
  749. package/packages/cli/src/ui/hooks/useMemoryMonitor.ts +0 -41
  750. package/packages/cli/src/ui/hooks/useMessageQueue.test.ts +0 -235
  751. package/packages/cli/src/ui/hooks/useMessageQueue.ts +0 -75
  752. package/packages/cli/src/ui/hooks/useModelCommand.test.ts +0 -42
  753. package/packages/cli/src/ui/hooks/useModelCommand.ts +0 -31
  754. package/packages/cli/src/ui/hooks/usePermissionsModifyTrust.test.ts +0 -263
  755. package/packages/cli/src/ui/hooks/usePermissionsModifyTrust.ts +0 -128
  756. package/packages/cli/src/ui/hooks/usePhraseCycler.test.ts +0 -192
  757. package/packages/cli/src/ui/hooks/usePhraseCycler.ts +0 -82
  758. package/packages/cli/src/ui/hooks/useQwenAuth.test.ts +0 -425
  759. package/packages/cli/src/ui/hooks/useQwenAuth.ts +0 -108
  760. package/packages/cli/src/ui/hooks/useReactToolScheduler.ts +0 -315
  761. package/packages/cli/src/ui/hooks/useRefreshMemoryCommand.ts +0 -7
  762. package/packages/cli/src/ui/hooks/useResumeCommand.test.ts +0 -190
  763. package/packages/cli/src/ui/hooks/useResumeCommand.ts +0 -82
  764. package/packages/cli/src/ui/hooks/useReverseSearchCompletion.test.tsx +0 -260
  765. package/packages/cli/src/ui/hooks/useReverseSearchCompletion.tsx +0 -155
  766. package/packages/cli/src/ui/hooks/useSelectionList.test.ts +0 -980
  767. package/packages/cli/src/ui/hooks/useSelectionList.ts +0 -376
  768. package/packages/cli/src/ui/hooks/useSessionPicker.ts +0 -279
  769. package/packages/cli/src/ui/hooks/useSettingsCommand.ts +0 -25
  770. package/packages/cli/src/ui/hooks/useShellHistory.test.ts +0 -257
  771. package/packages/cli/src/ui/hooks/useShellHistory.ts +0 -143
  772. package/packages/cli/src/ui/hooks/useShowMemoryCommand.ts +0 -73
  773. package/packages/cli/src/ui/hooks/useSlashCompletion.test.ts +0 -897
  774. package/packages/cli/src/ui/hooks/useSlashCompletion.ts +0 -555
  775. package/packages/cli/src/ui/hooks/useStateAndRef.ts +0 -36
  776. package/packages/cli/src/ui/hooks/useSubagentCreateDialog.ts +0 -26
  777. package/packages/cli/src/ui/hooks/useTerminalSize.ts +0 -34
  778. package/packages/cli/src/ui/hooks/useThemeCommand.ts +0 -112
  779. package/packages/cli/src/ui/hooks/useTimer.test.ts +0 -120
  780. package/packages/cli/src/ui/hooks/useTimer.ts +0 -65
  781. package/packages/cli/src/ui/hooks/useTomlMigration.ts +0 -0
  782. package/packages/cli/src/ui/hooks/useToolScheduler.test.ts +0 -781
  783. package/packages/cli/src/ui/hooks/useWelcomeBack.ts +0 -119
  784. package/packages/cli/src/ui/hooks/vim.test.ts +0 -1691
  785. package/packages/cli/src/ui/hooks/vim.ts +0 -790
  786. package/packages/cli/src/ui/keyMatchers.test.ts +0 -375
  787. package/packages/cli/src/ui/keyMatchers.ts +0 -105
  788. package/packages/cli/src/ui/layouts/DefaultAppLayout.tsx +0 -40
  789. package/packages/cli/src/ui/layouts/ScreenReaderAppLayout.tsx +0 -41
  790. package/packages/cli/src/ui/models/availableModels.test.ts +0 -186
  791. package/packages/cli/src/ui/models/availableModels.ts +0 -129
  792. package/packages/cli/src/ui/noninteractive/nonInteractiveUi.ts +0 -30
  793. package/packages/cli/src/ui/semantic-colors.ts +0 -26
  794. package/packages/cli/src/ui/state/extensions.ts +0 -90
  795. package/packages/cli/src/ui/textConstants.ts +0 -13
  796. package/packages/cli/src/ui/themes/ansi-light.ts +0 -152
  797. package/packages/cli/src/ui/themes/ansi.ts +0 -161
  798. package/packages/cli/src/ui/themes/atom-one-dark.ts +0 -147
  799. package/packages/cli/src/ui/themes/ayu-light.ts +0 -139
  800. package/packages/cli/src/ui/themes/ayu.ts +0 -113
  801. package/packages/cli/src/ui/themes/color-utils.test.ts +0 -221
  802. package/packages/cli/src/ui/themes/color-utils.ts +0 -235
  803. package/packages/cli/src/ui/themes/default-light.ts +0 -106
  804. package/packages/cli/src/ui/themes/default.ts +0 -149
  805. package/packages/cli/src/ui/themes/dracula.ts +0 -124
  806. package/packages/cli/src/ui/themes/github-dark.ts +0 -147
  807. package/packages/cli/src/ui/themes/github-light.ts +0 -149
  808. package/packages/cli/src/ui/themes/googlecode.ts +0 -146
  809. package/packages/cli/src/ui/themes/no-color.ts +0 -131
  810. package/packages/cli/src/ui/themes/qwen-dark.ts +0 -115
  811. package/packages/cli/src/ui/themes/qwen-light.ts +0 -141
  812. package/packages/cli/src/ui/themes/semantic-tokens.ts +0 -140
  813. package/packages/cli/src/ui/themes/shades-of-purple.ts +0 -352
  814. package/packages/cli/src/ui/themes/theme-manager.test.ts +0 -173
  815. package/packages/cli/src/ui/themes/theme-manager.ts +0 -344
  816. package/packages/cli/src/ui/themes/theme.test.ts +0 -97
  817. package/packages/cli/src/ui/themes/theme.ts +0 -505
  818. package/packages/cli/src/ui/themes/xcode.ts +0 -154
  819. package/packages/cli/src/ui/types.ts +0 -463
  820. package/packages/cli/src/ui/utils/CodeColorizer.tsx +0 -224
  821. package/packages/cli/src/ui/utils/InlineMarkdownRenderer.tsx +0 -180
  822. package/packages/cli/src/ui/utils/MarkdownDisplay.test.tsx +0 -236
  823. package/packages/cli/src/ui/utils/MarkdownDisplay.tsx +0 -423
  824. package/packages/cli/src/ui/utils/TableRenderer.tsx +0 -158
  825. package/packages/cli/src/ui/utils/__snapshots__/MarkdownDisplay.test.tsx.snap +0 -187
  826. package/packages/cli/src/ui/utils/clipboardUtils.test.ts +0 -136
  827. package/packages/cli/src/ui/utils/clipboardUtils.ts +0 -153
  828. package/packages/cli/src/ui/utils/commandUtils.test.ts +0 -489
  829. package/packages/cli/src/ui/utils/commandUtils.ts +0 -174
  830. package/packages/cli/src/ui/utils/computeStats.test.ts +0 -295
  831. package/packages/cli/src/ui/utils/computeStats.ts +0 -86
  832. package/packages/cli/src/ui/utils/displayUtils.test.ts +0 -83
  833. package/packages/cli/src/ui/utils/displayUtils.ts +0 -35
  834. package/packages/cli/src/ui/utils/export/collect.ts +0 -266
  835. package/packages/cli/src/ui/utils/export/formatters/html.ts +0 -83
  836. package/packages/cli/src/ui/utils/export/formatters/json.ts +0 -15
  837. package/packages/cli/src/ui/utils/export/formatters/jsonl.ts +0 -31
  838. package/packages/cli/src/ui/utils/export/formatters/markdown.ts +0 -225
  839. package/packages/cli/src/ui/utils/export/index.ts +0 -18
  840. package/packages/cli/src/ui/utils/export/normalize.ts +0 -324
  841. package/packages/cli/src/ui/utils/export/types.ts +0 -54
  842. package/packages/cli/src/ui/utils/export/utils.ts +0 -13
  843. package/packages/cli/src/ui/utils/formatters.test.ts +0 -157
  844. package/packages/cli/src/ui/utils/formatters.ts +0 -97
  845. package/packages/cli/src/ui/utils/highlight.test.ts +0 -136
  846. package/packages/cli/src/ui/utils/highlight.ts +0 -103
  847. package/packages/cli/src/ui/utils/isNarrowWidth.ts +0 -9
  848. package/packages/cli/src/ui/utils/kittyProtocolDetector.ts +0 -116
  849. package/packages/cli/src/ui/utils/markdownUtilities.test.ts +0 -50
  850. package/packages/cli/src/ui/utils/markdownUtilities.ts +0 -125
  851. package/packages/cli/src/ui/utils/platformConstants.ts +0 -87
  852. package/packages/cli/src/ui/utils/resumeHistoryUtils.test.ts +0 -289
  853. package/packages/cli/src/ui/utils/resumeHistoryUtils.ts +0 -455
  854. package/packages/cli/src/ui/utils/sessionPickerUtils.test.ts +0 -45
  855. package/packages/cli/src/ui/utils/sessionPickerUtils.ts +0 -59
  856. package/packages/cli/src/ui/utils/terminalSetup.ts +0 -393
  857. package/packages/cli/src/ui/utils/textUtils.test.ts +0 -170
  858. package/packages/cli/src/ui/utils/textUtils.ts +0 -216
  859. package/packages/cli/src/ui/utils/updateCheck.test.ts +0 -163
  860. package/packages/cli/src/ui/utils/updateCheck.ts +0 -104
  861. package/packages/cli/src/utils/acpModelUtils.test.ts +0 -42
  862. package/packages/cli/src/utils/acpModelUtils.ts +0 -61
  863. package/packages/cli/src/utils/attentionNotification.test.ts +0 -72
  864. package/packages/cli/src/utils/attentionNotification.ts +0 -51
  865. package/packages/cli/src/utils/checks.ts +0 -28
  866. package/packages/cli/src/utils/cleanup.test.ts +0 -68
  867. package/packages/cli/src/utils/cleanup.ts +0 -37
  868. package/packages/cli/src/utils/commands.test.ts +0 -140
  869. package/packages/cli/src/utils/commands.ts +0 -71
  870. package/packages/cli/src/utils/commentJson.test.ts +0 -186
  871. package/packages/cli/src/utils/commentJson.ts +0 -70
  872. package/packages/cli/src/utils/deepMerge.test.ts +0 -163
  873. package/packages/cli/src/utils/deepMerge.ts +0 -90
  874. package/packages/cli/src/utils/dialogScopeUtils.ts +0 -69
  875. package/packages/cli/src/utils/envVarResolver.test.ts +0 -297
  876. package/packages/cli/src/utils/envVarResolver.ts +0 -126
  877. package/packages/cli/src/utils/errors.test.ts +0 -681
  878. package/packages/cli/src/utils/errors.ts +0 -197
  879. package/packages/cli/src/utils/events.ts +0 -15
  880. package/packages/cli/src/utils/gitUtils.test.ts +0 -248
  881. package/packages/cli/src/utils/gitUtils.ts +0 -143
  882. package/packages/cli/src/utils/handleAutoUpdate.test.ts +0 -274
  883. package/packages/cli/src/utils/handleAutoUpdate.ts +0 -152
  884. package/packages/cli/src/utils/installationInfo.test.ts +0 -325
  885. package/packages/cli/src/utils/installationInfo.ts +0 -181
  886. package/packages/cli/src/utils/languageUtils.test.ts +0 -478
  887. package/packages/cli/src/utils/languageUtils.ts +0 -191
  888. package/packages/cli/src/utils/math.ts +0 -15
  889. package/packages/cli/src/utils/modelConfigUtils.test.ts +0 -727
  890. package/packages/cli/src/utils/modelConfigUtils.ts +0 -159
  891. package/packages/cli/src/utils/nonInteractiveHelpers.test.ts +0 -1297
  892. package/packages/cli/src/utils/nonInteractiveHelpers.ts +0 -666
  893. package/packages/cli/src/utils/package.ts +0 -38
  894. package/packages/cli/src/utils/processUtils.test.ts +0 -22
  895. package/packages/cli/src/utils/processUtils.ts +0 -20
  896. package/packages/cli/src/utils/readStdin.test.ts +0 -112
  897. package/packages/cli/src/utils/readStdin.ts +0 -70
  898. package/packages/cli/src/utils/relaunch.test.ts +0 -335
  899. package/packages/cli/src/utils/relaunch.ts +0 -70
  900. package/packages/cli/src/utils/resolvePath.ts +0 -21
  901. package/packages/cli/src/utils/sandbox-macos-permissive-closed.sb +0 -32
  902. package/packages/cli/src/utils/sandbox-macos-permissive-open.sb +0 -25
  903. package/packages/cli/src/utils/sandbox-macos-permissive-proxied.sb +0 -37
  904. package/packages/cli/src/utils/sandbox-macos-restrictive-closed.sb +0 -93
  905. package/packages/cli/src/utils/sandbox-macos-restrictive-open.sb +0 -96
  906. package/packages/cli/src/utils/sandbox-macos-restrictive-proxied.sb +0 -98
  907. package/packages/cli/src/utils/sandbox.ts +0 -984
  908. package/packages/cli/src/utils/settingsUtils.test.ts +0 -1154
  909. package/packages/cli/src/utils/settingsUtils.ts +0 -646
  910. package/packages/cli/src/utils/spawnWrapper.ts +0 -9
  911. package/packages/cli/src/utils/startupWarnings.test.ts +0 -76
  912. package/packages/cli/src/utils/startupWarnings.ts +0 -40
  913. package/packages/cli/src/utils/stdioHelpers.ts +0 -41
  914. package/packages/cli/src/utils/systemInfo.test.ts +0 -337
  915. package/packages/cli/src/utils/systemInfo.ts +0 -181
  916. package/packages/cli/src/utils/systemInfoFields.test.ts +0 -79
  917. package/packages/cli/src/utils/systemInfoFields.ts +0 -143
  918. package/packages/cli/src/utils/updateEventEmitter.ts +0 -13
  919. package/packages/cli/src/utils/userStartupWarnings.test.ts +0 -112
  920. package/packages/cli/src/utils/userStartupWarnings.ts +0 -96
  921. package/packages/cli/src/utils/version.ts +0 -12
  922. package/packages/cli/src/utils/windowTitle.test.ts +0 -59
  923. package/packages/cli/src/utils/windowTitle.ts +0 -22
  924. package/packages/cli/src/utils/writeWithBackup.test.ts +0 -232
  925. package/packages/cli/src/utils/writeWithBackup.ts +0 -169
  926. package/packages/cli/src/validateNonInterActiveAuth.test.ts +0 -557
  927. package/packages/cli/src/validateNonInterActiveAuth.ts +0 -83
  928. package/packages/cli/test-setup.ts +0 -12
  929. package/packages/cli/tsconfig.json +0 -30
  930. package/packages/cli/vitest.config.ts +0 -57
  931. package/packages/core/index.ts +0 -7
  932. package/packages/core/package.json +0 -96
  933. package/packages/core/scripts/postinstall.js +0 -179
  934. package/packages/core/scripts/postinstall.js.backup +0 -1
  935. package/packages/core/src/__mocks__/fs/promises.ts +0 -48
  936. package/packages/core/src/config/config.test.ts +0 -1501
  937. package/packages/core/src/config/config.ts +0 -1916
  938. package/packages/core/src/config/constants.ts +0 -22
  939. package/packages/core/src/config/models.ts +0 -10
  940. package/packages/core/src/config/storage.test.ts +0 -42
  941. package/packages/core/src/config/storage.ts +0 -143
  942. package/packages/core/src/confirmation-bus/message-bus.ts +0 -125
  943. package/packages/core/src/confirmation-bus/types.ts +0 -128
  944. package/packages/core/src/core/__snapshots__/prompts.test.ts.snap +0 -3490
  945. package/packages/core/src/core/__tests__/openaiTimeoutHandling.test.ts +0 -386
  946. package/packages/core/src/core/__tests__/orphanedToolCallsTest.ts +0 -125
  947. package/packages/core/src/core/anthropicContentGenerator/anthropicContentGenerator.test.ts +0 -524
  948. package/packages/core/src/core/anthropicContentGenerator/anthropicContentGenerator.ts +0 -514
  949. package/packages/core/src/core/anthropicContentGenerator/converter.test.ts +0 -946
  950. package/packages/core/src/core/anthropicContentGenerator/converter.ts +0 -581
  951. package/packages/core/src/core/anthropicContentGenerator/index.ts +0 -21
  952. package/packages/core/src/core/baseLlmClient.test.ts +0 -447
  953. package/packages/core/src/core/baseLlmClient.ts +0 -191
  954. package/packages/core/src/core/client.test.ts +0 -2368
  955. package/packages/core/src/core/client.ts +0 -785
  956. package/packages/core/src/core/contentGenerator.test.ts +0 -113
  957. package/packages/core/src/core/contentGenerator.ts +0 -357
  958. package/packages/core/src/core/coreToolScheduler.test.ts +0 -2814
  959. package/packages/core/src/core/coreToolScheduler.ts +0 -1406
  960. package/packages/core/src/core/geminiChat.test.ts +0 -1721
  961. package/packages/core/src/core/geminiChat.ts +0 -746
  962. package/packages/core/src/core/geminiContentGenerator/geminiContentGenerator.test.ts +0 -371
  963. package/packages/core/src/core/geminiContentGenerator/geminiContentGenerator.ts +0 -303
  964. package/packages/core/src/core/geminiContentGenerator/index.test.ts +0 -41
  965. package/packages/core/src/core/geminiContentGenerator/index.ts +0 -53
  966. package/packages/core/src/core/geminiRequest.test.ts +0 -85
  967. package/packages/core/src/core/geminiRequest.ts +0 -19
  968. package/packages/core/src/core/logger.test.ts +0 -704
  969. package/packages/core/src/core/logger.ts +0 -462
  970. package/packages/core/src/core/loggingContentGenerator/index.ts +0 -7
  971. package/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.test.ts +0 -397
  972. package/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.ts +0 -510
  973. package/packages/core/src/core/modalityDefaults.test.ts +0 -213
  974. package/packages/core/src/core/modalityDefaults.ts +0 -94
  975. package/packages/core/src/core/nonInteractiveToolExecutor.test.ts +0 -373
  976. package/packages/core/src/core/nonInteractiveToolExecutor.ts +0 -52
  977. package/packages/core/src/core/openaiContentGenerator/constants.ts +0 -8
  978. package/packages/core/src/core/openaiContentGenerator/converter.test.ts +0 -2361
  979. package/packages/core/src/core/openaiContentGenerator/converter.ts +0 -1359
  980. package/packages/core/src/core/openaiContentGenerator/errorHandler.test.ts +0 -355
  981. package/packages/core/src/core/openaiContentGenerator/errorHandler.ts +0 -140
  982. package/packages/core/src/core/openaiContentGenerator/index.ts +0 -94
  983. package/packages/core/src/core/openaiContentGenerator/openaiContentGenerator.test.ts +0 -405
  984. package/packages/core/src/core/openaiContentGenerator/openaiContentGenerator.ts +0 -168
  985. package/packages/core/src/core/openaiContentGenerator/pipeline.test.ts +0 -1475
  986. package/packages/core/src/core/openaiContentGenerator/pipeline.ts +0 -490
  987. package/packages/core/src/core/openaiContentGenerator/provider/README.md +0 -61
  988. package/packages/core/src/core/openaiContentGenerator/provider/dashscope.test.ts +0 -1014
  989. package/packages/core/src/core/openaiContentGenerator/provider/dashscope.ts +0 -365
  990. package/packages/core/src/core/openaiContentGenerator/provider/deepseek.test.ts +0 -68
  991. package/packages/core/src/core/openaiContentGenerator/provider/deepseek.ts +0 -33
  992. package/packages/core/src/core/openaiContentGenerator/provider/default.test.ts +0 -308
  993. package/packages/core/src/core/openaiContentGenerator/provider/default.ts +0 -78
  994. package/packages/core/src/core/openaiContentGenerator/provider/index.ts +0 -11
  995. package/packages/core/src/core/openaiContentGenerator/provider/modelscope.test.ts +0 -96
  996. package/packages/core/src/core/openaiContentGenerator/provider/modelscope.ts +0 -32
  997. package/packages/core/src/core/openaiContentGenerator/provider/openrouter.test.ts +0 -221
  998. package/packages/core/src/core/openaiContentGenerator/provider/openrouter.ts +0 -31
  999. package/packages/core/src/core/openaiContentGenerator/provider/types.ts +0 -35
  1000. package/packages/core/src/core/openaiContentGenerator/streamingToolCallParser.test.ts +0 -864
  1001. package/packages/core/src/core/openaiContentGenerator/streamingToolCallParser.ts +0 -442
  1002. package/packages/core/src/core/prompts.test.ts +0 -617
  1003. package/packages/core/src/core/prompts.ts +0 -1064
  1004. package/packages/core/src/core/tokenLimits.test.ts +0 -331
  1005. package/packages/core/src/core/tokenLimits.ts +0 -216
  1006. package/packages/core/src/core/turn.test.ts +0 -1013
  1007. package/packages/core/src/core/turn.ts +0 -418
  1008. package/packages/core/src/extension/claude-converter.test.ts +0 -436
  1009. package/packages/core/src/extension/claude-converter.ts +0 -776
  1010. package/packages/core/src/extension/extensionManager.test.ts +0 -760
  1011. package/packages/core/src/extension/extensionManager.ts +0 -1290
  1012. package/packages/core/src/extension/extensionSettings.test.ts +0 -730
  1013. package/packages/core/src/extension/extensionSettings.ts +0 -319
  1014. package/packages/core/src/extension/gemini-converter.test.ts +0 -177
  1015. package/packages/core/src/extension/gemini-converter.ts +0 -234
  1016. package/packages/core/src/extension/github.test.ts +0 -485
  1017. package/packages/core/src/extension/github.ts +0 -457
  1018. package/packages/core/src/extension/index.ts +0 -6
  1019. package/packages/core/src/extension/marketplace.test.ts +0 -282
  1020. package/packages/core/src/extension/marketplace.ts +0 -279
  1021. package/packages/core/src/extension/override.test.ts +0 -110
  1022. package/packages/core/src/extension/override.ts +0 -102
  1023. package/packages/core/src/extension/settings.test.ts +0 -138
  1024. package/packages/core/src/extension/settings.ts +0 -149
  1025. package/packages/core/src/extension/storage.test.ts +0 -100
  1026. package/packages/core/src/extension/storage.ts +0 -50
  1027. package/packages/core/src/extension/variableSchema.ts +0 -43
  1028. package/packages/core/src/extension/variables.test.ts +0 -18
  1029. package/packages/core/src/extension/variables.ts +0 -72
  1030. package/packages/core/src/hooks/hookAggregator.test.ts +0 -618
  1031. package/packages/core/src/hooks/hookAggregator.ts +0 -369
  1032. package/packages/core/src/hooks/hookEventHandler.test.ts +0 -278
  1033. package/packages/core/src/hooks/hookEventHandler.ts +0 -192
  1034. package/packages/core/src/hooks/hookPlanner.test.ts +0 -366
  1035. package/packages/core/src/hooks/hookPlanner.ts +0 -146
  1036. package/packages/core/src/hooks/hookRegistry.test.ts +0 -636
  1037. package/packages/core/src/hooks/hookRegistry.ts +0 -353
  1038. package/packages/core/src/hooks/hookRunner.test.ts +0 -684
  1039. package/packages/core/src/hooks/hookRunner.ts +0 -427
  1040. package/packages/core/src/hooks/hookSystem.test.ts +0 -328
  1041. package/packages/core/src/hooks/hookSystem.ts +0 -103
  1042. package/packages/core/src/hooks/index.ts +0 -22
  1043. package/packages/core/src/hooks/trustedHooks.ts +0 -118
  1044. package/packages/core/src/hooks/types.ts +0 -678
  1045. package/packages/core/src/ide/constants.ts +0 -10
  1046. package/packages/core/src/ide/detect-ide.test.ts +0 -137
  1047. package/packages/core/src/ide/detect-ide.ts +0 -93
  1048. package/packages/core/src/ide/ide-client.test.ts +0 -764
  1049. package/packages/core/src/ide/ide-client.ts +0 -983
  1050. package/packages/core/src/ide/ide-installer.test.ts +0 -178
  1051. package/packages/core/src/ide/ide-installer.ts +0 -162
  1052. package/packages/core/src/ide/ideContext.test.ts +0 -453
  1053. package/packages/core/src/ide/ideContext.ts +0 -124
  1054. package/packages/core/src/ide/process-utils.test.ts +0 -158
  1055. package/packages/core/src/ide/process-utils.ts +0 -219
  1056. package/packages/core/src/ide/types.ts +0 -148
  1057. package/packages/core/src/index.test.ts +0 -13
  1058. package/packages/core/src/index.ts +0 -309
  1059. package/packages/core/src/lsp/LspConfigLoader.test.ts +0 -90
  1060. package/packages/core/src/lsp/LspConfigLoader.ts +0 -500
  1061. package/packages/core/src/lsp/LspConnectionFactory.ts +0 -395
  1062. package/packages/core/src/lsp/LspLanguageDetector.ts +0 -226
  1063. package/packages/core/src/lsp/LspResponseNormalizer.ts +0 -917
  1064. package/packages/core/src/lsp/LspServerManager.ts +0 -720
  1065. package/packages/core/src/lsp/NativeLspClient.ts +0 -259
  1066. package/packages/core/src/lsp/NativeLspService.integration.test.ts +0 -769
  1067. package/packages/core/src/lsp/NativeLspService.test.ts +0 -132
  1068. package/packages/core/src/lsp/NativeLspService.ts +0 -894
  1069. package/packages/core/src/lsp/constants.ts +0 -101
  1070. package/packages/core/src/lsp/types.ts +0 -523
  1071. package/packages/core/src/mcp/constants.ts +0 -27
  1072. package/packages/core/src/mcp/google-auth-provider.test.ts +0 -112
  1073. package/packages/core/src/mcp/google-auth-provider.ts +0 -103
  1074. package/packages/core/src/mcp/oauth-provider.test.ts +0 -1275
  1075. package/packages/core/src/mcp/oauth-provider.ts +0 -910
  1076. package/packages/core/src/mcp/oauth-token-storage.test.ts +0 -459
  1077. package/packages/core/src/mcp/oauth-token-storage.ts +0 -228
  1078. package/packages/core/src/mcp/oauth-utils.test.ts +0 -345
  1079. package/packages/core/src/mcp/oauth-utils.ts +0 -379
  1080. package/packages/core/src/mcp/sa-impersonation-provider.test.ts +0 -153
  1081. package/packages/core/src/mcp/sa-impersonation-provider.ts +0 -177
  1082. package/packages/core/src/mcp/token-storage/base-token-storage.test.ts +0 -208
  1083. package/packages/core/src/mcp/token-storage/base-token-storage.ts +0 -49
  1084. package/packages/core/src/mcp/token-storage/file-token-storage.test.ts +0 -323
  1085. package/packages/core/src/mcp/token-storage/file-token-storage.ts +0 -184
  1086. package/packages/core/src/mcp/token-storage/hybrid-token-storage.test.ts +0 -274
  1087. package/packages/core/src/mcp/token-storage/hybrid-token-storage.ts +0 -97
  1088. package/packages/core/src/mcp/token-storage/index.ts +0 -14
  1089. package/packages/core/src/mcp/token-storage/keychain-token-storage.test.ts +0 -352
  1090. package/packages/core/src/mcp/token-storage/keychain-token-storage.ts +0 -315
  1091. package/packages/core/src/mcp/token-storage/types.ts +0 -42
  1092. package/packages/core/src/mocks/msw.ts +0 -9
  1093. package/packages/core/src/models/constants.ts +0 -117
  1094. package/packages/core/src/models/index.ts +0 -45
  1095. package/packages/core/src/models/modelConfigErrors.ts +0 -125
  1096. package/packages/core/src/models/modelConfigResolver.test.ts +0 -351
  1097. package/packages/core/src/models/modelConfigResolver.ts +0 -369
  1098. package/packages/core/src/models/modelRegistry.test.ts +0 -533
  1099. package/packages/core/src/models/modelRegistry.ts +0 -234
  1100. package/packages/core/src/models/modelsConfig.test.ts +0 -1509
  1101. package/packages/core/src/models/modelsConfig.ts +0 -1201
  1102. package/packages/core/src/models/types.ts +0 -150
  1103. package/packages/core/src/output/json-formatter.test.ts +0 -301
  1104. package/packages/core/src/output/json-formatter.ts +0 -39
  1105. package/packages/core/src/output/types.ts +0 -30
  1106. package/packages/core/src/prompts/mcp-prompts.ts +0 -19
  1107. package/packages/core/src/prompts/prompt-registry.ts +0 -77
  1108. package/packages/core/src/qwen/qwenContentGenerator.test.ts +0 -1698
  1109. package/packages/core/src/qwen/qwenContentGenerator.ts +0 -252
  1110. package/packages/core/src/qwen/qwenOAuth2.test.ts +0 -2187
  1111. package/packages/core/src/qwen/qwenOAuth2.ts +0 -1017
  1112. package/packages/core/src/qwen/sharedTokenManager.test.ts +0 -937
  1113. package/packages/core/src/qwen/sharedTokenManager.ts +0 -887
  1114. package/packages/core/src/services/chatCompressionService.test.ts +0 -484
  1115. package/packages/core/src/services/chatCompressionService.ts +0 -274
  1116. package/packages/core/src/services/chatRecordingService.test.ts +0 -356
  1117. package/packages/core/src/services/chatRecordingService.ts +0 -448
  1118. package/packages/core/src/services/fileDiscoveryService.test.ts +0 -211
  1119. package/packages/core/src/services/fileDiscoveryService.ts +0 -142
  1120. package/packages/core/src/services/fileSystemService.test.ts +0 -297
  1121. package/packages/core/src/services/fileSystemService.ts +0 -234
  1122. package/packages/core/src/services/gitService.test.ts +0 -231
  1123. package/packages/core/src/services/gitService.ts +0 -121
  1124. package/packages/core/src/services/loopDetectionService.test.ts +0 -622
  1125. package/packages/core/src/services/loopDetectionService.ts +0 -316
  1126. package/packages/core/src/services/sessionService.test.ts +0 -721
  1127. package/packages/core/src/services/sessionService.ts +0 -706
  1128. package/packages/core/src/services/shellExecutionService.test.ts +0 -999
  1129. package/packages/core/src/services/shellExecutionService.ts +0 -799
  1130. package/packages/core/src/skills/index.ts +0 -31
  1131. package/packages/core/src/skills/skill-load.test.ts +0 -303
  1132. package/packages/core/src/skills/skill-load.ts +0 -173
  1133. package/packages/core/src/skills/skill-manager.test.ts +0 -692
  1134. package/packages/core/src/skills/skill-manager.ts +0 -652
  1135. package/packages/core/src/skills/types.ts +0 -111
  1136. package/packages/core/src/subagents/builtin-agents.test.ts +0 -95
  1137. package/packages/core/src/subagents/builtin-agents.ts +0 -95
  1138. package/packages/core/src/subagents/index.ts +0 -75
  1139. package/packages/core/src/subagents/subagent-events.ts +0 -145
  1140. package/packages/core/src/subagents/subagent-hooks.ts +0 -33
  1141. package/packages/core/src/subagents/subagent-manager.test.ts +0 -1152
  1142. package/packages/core/src/subagents/subagent-manager.ts +0 -978
  1143. package/packages/core/src/subagents/subagent-statistics.test.ts +0 -318
  1144. package/packages/core/src/subagents/subagent-statistics.ts +0 -275
  1145. package/packages/core/src/subagents/subagent.test.ts +0 -1196
  1146. package/packages/core/src/subagents/subagent.ts +0 -1010
  1147. package/packages/core/src/subagents/types.test.ts +0 -40
  1148. package/packages/core/src/subagents/types.ts +0 -272
  1149. package/packages/core/src/subagents/validation.test.ts +0 -426
  1150. package/packages/core/src/subagents/validation.ts +0 -354
  1151. package/packages/core/src/telemetry/config.test.ts +0 -155
  1152. package/packages/core/src/telemetry/config.ts +0 -118
  1153. package/packages/core/src/telemetry/constants.ts +0 -45
  1154. package/packages/core/src/telemetry/file-exporters.ts +0 -93
  1155. package/packages/core/src/telemetry/index.ts +0 -108
  1156. package/packages/core/src/telemetry/integration.test.circular.ts +0 -111
  1157. package/packages/core/src/telemetry/loggers.test.circular.ts +0 -128
  1158. package/packages/core/src/telemetry/loggers.test.ts +0 -1284
  1159. package/packages/core/src/telemetry/loggers.ts +0 -948
  1160. package/packages/core/src/telemetry/metrics.test.ts +0 -899
  1161. package/packages/core/src/telemetry/metrics.ts +0 -749
  1162. package/packages/core/src/telemetry/qwen-logger/event-types.ts +0 -102
  1163. package/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts +0 -515
  1164. package/packages/core/src/telemetry/qwen-logger/qwen-logger.ts +0 -988
  1165. package/packages/core/src/telemetry/sdk.test.ts +0 -148
  1166. package/packages/core/src/telemetry/sdk.ts +0 -195
  1167. package/packages/core/src/telemetry/telemetry-utils.test.ts +0 -46
  1168. package/packages/core/src/telemetry/telemetry-utils.ts +0 -17
  1169. package/packages/core/src/telemetry/telemetry.test.ts +0 -63
  1170. package/packages/core/src/telemetry/tool-call-decision.ts +0 -32
  1171. package/packages/core/src/telemetry/types.ts +0 -874
  1172. package/packages/core/src/telemetry/uiTelemetry.test.ts +0 -766
  1173. package/packages/core/src/telemetry/uiTelemetry.ts +0 -253
  1174. package/packages/core/src/test-utils/config.ts +0 -36
  1175. package/packages/core/src/test-utils/index.ts +0 -7
  1176. package/packages/core/src/test-utils/mock-tool.ts +0 -218
  1177. package/packages/core/src/test-utils/mockWorkspaceContext.ts +0 -33
  1178. package/packages/core/src/tools/__snapshots__/shell.test.ts.snap +0 -98
  1179. package/packages/core/src/tools/askUserQuestion.test.ts +0 -260
  1180. package/packages/core/src/tools/askUserQuestion.ts +0 -352
  1181. package/packages/core/src/tools/diffOptions.test.ts +0 -165
  1182. package/packages/core/src/tools/diffOptions.ts +0 -73
  1183. package/packages/core/src/tools/edit.test.ts +0 -933
  1184. package/packages/core/src/tools/edit.ts +0 -622
  1185. package/packages/core/src/tools/exitPlanMode.test.ts +0 -241
  1186. package/packages/core/src/tools/exitPlanMode.ts +0 -200
  1187. package/packages/core/src/tools/glob.test.ts +0 -650
  1188. package/packages/core/src/tools/glob.ts +0 -296
  1189. package/packages/core/src/tools/grep.test.ts +0 -484
  1190. package/packages/core/src/tools/grep.ts +0 -570
  1191. package/packages/core/src/tools/ls.test.ts +0 -325
  1192. package/packages/core/src/tools/ls.ts +0 -339
  1193. package/packages/core/src/tools/lsp.test.ts +0 -1233
  1194. package/packages/core/src/tools/lsp.ts +0 -1218
  1195. package/packages/core/src/tools/mcp-client-manager.test.ts +0 -257
  1196. package/packages/core/src/tools/mcp-client-manager.ts +0 -532
  1197. package/packages/core/src/tools/mcp-client.test.ts +0 -424
  1198. package/packages/core/src/tools/mcp-client.ts +0 -1450
  1199. package/packages/core/src/tools/mcp-tool.test.ts +0 -1119
  1200. package/packages/core/src/tools/mcp-tool.ts +0 -580
  1201. package/packages/core/src/tools/memoryTool.test.ts +0 -603
  1202. package/packages/core/src/tools/memoryTool.ts +0 -542
  1203. package/packages/core/src/tools/modifiable-tool.test.ts +0 -347
  1204. package/packages/core/src/tools/modifiable-tool.ts +0 -178
  1205. package/packages/core/src/tools/read-file.test.ts +0 -468
  1206. package/packages/core/src/tools/read-file.ts +0 -226
  1207. package/packages/core/src/tools/ripGrep.test.ts +0 -727
  1208. package/packages/core/src/tools/ripGrep.ts +0 -334
  1209. package/packages/core/src/tools/sdk-control-client-transport.ts +0 -145
  1210. package/packages/core/src/tools/shell.test.ts +0 -1277
  1211. package/packages/core/src/tools/shell.ts +0 -651
  1212. package/packages/core/src/tools/skill.test.ts +0 -436
  1213. package/packages/core/src/tools/skill.ts +0 -275
  1214. package/packages/core/src/tools/task.test.ts +0 -538
  1215. package/packages/core/src/tools/task.ts +0 -570
  1216. package/packages/core/src/tools/todoWrite.test.ts +0 -304
  1217. package/packages/core/src/tools/todoWrite.ts +0 -482
  1218. package/packages/core/src/tools/tool-error.ts +0 -72
  1219. package/packages/core/src/tools/tool-names.ts +0 -69
  1220. package/packages/core/src/tools/tool-registry.test.ts +0 -432
  1221. package/packages/core/src/tools/tool-registry.ts +0 -525
  1222. package/packages/core/src/tools/tools.test.ts +0 -230
  1223. package/packages/core/src/tools/tools.ts +0 -662
  1224. package/packages/core/src/tools/web-fetch.test.ts +0 -169
  1225. package/packages/core/src/tools/web-fetch.ts +0 -256
  1226. package/packages/core/src/tools/web-search/base-provider.ts +0 -58
  1227. package/packages/core/src/tools/web-search/index.test.ts +0 -312
  1228. package/packages/core/src/tools/web-search/index.ts +0 -344
  1229. package/packages/core/src/tools/web-search/providers/dashscope-provider.ts +0 -199
  1230. package/packages/core/src/tools/web-search/providers/google-provider.ts +0 -91
  1231. package/packages/core/src/tools/web-search/providers/tavily-provider.ts +0 -84
  1232. package/packages/core/src/tools/web-search/types.ts +0 -156
  1233. package/packages/core/src/tools/web-search/utils.ts +0 -42
  1234. package/packages/core/src/tools/write-file.test.ts +0 -861
  1235. package/packages/core/src/tools/write-file.ts +0 -491
  1236. package/packages/core/src/types/memfs.d.ts +0 -9
  1237. package/packages/core/src/types/mock-fs.d.ts +0 -25
  1238. package/packages/core/src/types/qrcode-terminal.d.ts +0 -6
  1239. package/packages/core/src/types/uuid.d.ts +0 -12
  1240. package/packages/core/src/types/vitest.d.ts +0 -33
  1241. package/packages/core/src/utils/LruCache.ts +0 -41
  1242. package/packages/core/src/utils/browser.ts +0 -56
  1243. package/packages/core/src/utils/configResolver.test.ts +0 -141
  1244. package/packages/core/src/utils/configResolver.ts +0 -222
  1245. package/packages/core/src/utils/debugLogger.test.ts +0 -268
  1246. package/packages/core/src/utils/debugLogger.ts +0 -195
  1247. package/packages/core/src/utils/editHelper.test.ts +0 -210
  1248. package/packages/core/src/utils/editHelper.ts +0 -478
  1249. package/packages/core/src/utils/editor.test.ts +0 -546
  1250. package/packages/core/src/utils/editor.ts +0 -226
  1251. package/packages/core/src/utils/envVarResolver.test.ts +0 -297
  1252. package/packages/core/src/utils/envVarResolver.ts +0 -126
  1253. package/packages/core/src/utils/environmentContext.test.ts +0 -225
  1254. package/packages/core/src/utils/environmentContext.ts +0 -94
  1255. package/packages/core/src/utils/errorParsing.test.ts +0 -118
  1256. package/packages/core/src/utils/errorParsing.ts +0 -84
  1257. package/packages/core/src/utils/errorReporting.test.ts +0 -128
  1258. package/packages/core/src/utils/errorReporting.ts +0 -80
  1259. package/packages/core/src/utils/errors.test.ts +0 -91
  1260. package/packages/core/src/utils/errors.ts +0 -134
  1261. package/packages/core/src/utils/fetch.test.ts +0 -52
  1262. package/packages/core/src/utils/fetch.ts +0 -192
  1263. package/packages/core/src/utils/fileUtils.test.ts +0 -1126
  1264. package/packages/core/src/utils/fileUtils.ts +0 -692
  1265. package/packages/core/src/utils/filesearch/crawlCache.test.ts +0 -123
  1266. package/packages/core/src/utils/filesearch/crawlCache.ts +0 -69
  1267. package/packages/core/src/utils/filesearch/crawler.test.ts +0 -577
  1268. package/packages/core/src/utils/filesearch/crawler.ts +0 -85
  1269. package/packages/core/src/utils/filesearch/fileSearch.test.ts +0 -772
  1270. package/packages/core/src/utils/filesearch/fileSearch.ts +0 -250
  1271. package/packages/core/src/utils/filesearch/ignore.test.ts +0 -163
  1272. package/packages/core/src/utils/filesearch/ignore.ts +0 -131
  1273. package/packages/core/src/utils/filesearch/result-cache.test.ts +0 -55
  1274. package/packages/core/src/utils/filesearch/result-cache.ts +0 -67
  1275. package/packages/core/src/utils/formatters.ts +0 -16
  1276. package/packages/core/src/utils/generateContentResponseUtilities.test.ts +0 -283
  1277. package/packages/core/src/utils/generateContentResponseUtilities.ts +0 -127
  1278. package/packages/core/src/utils/getFolderStructure.test.ts +0 -340
  1279. package/packages/core/src/utils/getFolderStructure.ts +0 -336
  1280. package/packages/core/src/utils/getPty.ts +0 -9
  1281. package/packages/core/src/utils/gitIgnoreParser.test.ts +0 -237
  1282. package/packages/core/src/utils/gitIgnoreParser.ts +0 -189
  1283. package/packages/core/src/utils/gitUtils.ts +0 -90
  1284. package/packages/core/src/utils/iconvHelper.ts +0 -65
  1285. package/packages/core/src/utils/ignorePatterns.test.ts +0 -324
  1286. package/packages/core/src/utils/ignorePatterns.ts +0 -278
  1287. package/packages/core/src/utils/installationManager.test.ts +0 -99
  1288. package/packages/core/src/utils/installationManager.ts +0 -61
  1289. package/packages/core/src/utils/jsonl-utils.ts +0 -196
  1290. package/packages/core/src/utils/language-detection.ts +0 -103
  1291. package/packages/core/src/utils/memoryDiscovery.test.ts +0 -432
  1292. package/packages/core/src/utils/memoryDiscovery.ts +0 -357
  1293. package/packages/core/src/utils/memoryImportProcessor.test.ts +0 -933
  1294. package/packages/core/src/utils/memoryImportProcessor.ts +0 -417
  1295. package/packages/core/src/utils/messageInspectors.ts +0 -23
  1296. package/packages/core/src/utils/nextSpeakerChecker.test.ts +0 -273
  1297. package/packages/core/src/utils/nextSpeakerChecker.ts +0 -138
  1298. package/packages/core/src/utils/openaiLogger.test.ts +0 -390
  1299. package/packages/core/src/utils/openaiLogger.ts +0 -151
  1300. package/packages/core/src/utils/partUtils.test.ts +0 -301
  1301. package/packages/core/src/utils/partUtils.ts +0 -169
  1302. package/packages/core/src/utils/pathReader.test.ts +0 -411
  1303. package/packages/core/src/utils/pathReader.ts +0 -110
  1304. package/packages/core/src/utils/paths.test.ts +0 -850
  1305. package/packages/core/src/utils/paths.ts +0 -332
  1306. package/packages/core/src/utils/projectSummary.ts +0 -119
  1307. package/packages/core/src/utils/promptIdContext.ts +0 -9
  1308. package/packages/core/src/utils/quotaErrorDetection.test.ts +0 -134
  1309. package/packages/core/src/utils/quotaErrorDetection.ts +0 -126
  1310. package/packages/core/src/utils/qwenIgnoreParser.test.ts +0 -68
  1311. package/packages/core/src/utils/qwenIgnoreParser.ts +0 -81
  1312. package/packages/core/src/utils/rateLimit.test.ts +0 -102
  1313. package/packages/core/src/utils/rateLimit.ts +0 -84
  1314. package/packages/core/src/utils/readManyFiles.test.ts +0 -298
  1315. package/packages/core/src/utils/readManyFiles.ts +0 -210
  1316. package/packages/core/src/utils/request-tokenizer/imageTokenizer.test.ts +0 -157
  1317. package/packages/core/src/utils/request-tokenizer/imageTokenizer.ts +0 -508
  1318. package/packages/core/src/utils/request-tokenizer/index.ts +0 -11
  1319. package/packages/core/src/utils/request-tokenizer/requestTokenizer.test.ts +0 -271
  1320. package/packages/core/src/utils/request-tokenizer/requestTokenizer.ts +0 -330
  1321. package/packages/core/src/utils/request-tokenizer/supportedImageFormats.ts +0 -56
  1322. package/packages/core/src/utils/request-tokenizer/textTokenizer.test.ts +0 -279
  1323. package/packages/core/src/utils/request-tokenizer/textTokenizer.ts +0 -58
  1324. package/packages/core/src/utils/request-tokenizer/types.ts +0 -36
  1325. package/packages/core/src/utils/retry.test.ts +0 -534
  1326. package/packages/core/src/utils/retry.ts +0 -246
  1327. package/packages/core/src/utils/ripgrepUtils.test.ts +0 -135
  1328. package/packages/core/src/utils/ripgrepUtils.ts +0 -322
  1329. package/packages/core/src/utils/runtimeFetchOptions.test.ts +0 -95
  1330. package/packages/core/src/utils/runtimeFetchOptions.ts +0 -153
  1331. package/packages/core/src/utils/safeJsonParse.test.ts +0 -149
  1332. package/packages/core/src/utils/safeJsonParse.ts +0 -48
  1333. package/packages/core/src/utils/safeJsonStringify.test.ts +0 -73
  1334. package/packages/core/src/utils/safeJsonStringify.ts +0 -32
  1335. package/packages/core/src/utils/schemaConverter.test.ts +0 -118
  1336. package/packages/core/src/utils/schemaConverter.ts +0 -135
  1337. package/packages/core/src/utils/schemaValidator.test.ts +0 -297
  1338. package/packages/core/src/utils/schemaValidator.ts +0 -140
  1339. package/packages/core/src/utils/secure-browser-launcher.test.ts +0 -242
  1340. package/packages/core/src/utils/secure-browser-launcher.ts +0 -191
  1341. package/packages/core/src/utils/shell-utils.test.ts +0 -609
  1342. package/packages/core/src/utils/shell-utils.ts +0 -915
  1343. package/packages/core/src/utils/shellReadOnlyChecker.test.ts +0 -234
  1344. package/packages/core/src/utils/shellReadOnlyChecker.ts +0 -353
  1345. package/packages/core/src/utils/subagentGenerator.test.ts +0 -217
  1346. package/packages/core/src/utils/subagentGenerator.ts +0 -146
  1347. package/packages/core/src/utils/summarizer.test.ts +0 -202
  1348. package/packages/core/src/utils/summarizer.ts +0 -99
  1349. package/packages/core/src/utils/symlink.ts +0 -60
  1350. package/packages/core/src/utils/systemEncoding.test.ts +0 -478
  1351. package/packages/core/src/utils/systemEncoding.ts +0 -178
  1352. package/packages/core/src/utils/terminalSerializer.test.ts +0 -197
  1353. package/packages/core/src/utils/terminalSerializer.ts +0 -476
  1354. package/packages/core/src/utils/testUtils.ts +0 -87
  1355. package/packages/core/src/utils/textUtils.test.ts +0 -119
  1356. package/packages/core/src/utils/textUtils.ts +0 -75
  1357. package/packages/core/src/utils/thoughtUtils.test.ts +0 -80
  1358. package/packages/core/src/utils/thoughtUtils.ts +0 -76
  1359. package/packages/core/src/utils/toml-to-markdown-converter.test.ts +0 -103
  1360. package/packages/core/src/utils/toml-to-markdown-converter.ts +0 -74
  1361. package/packages/core/src/utils/tool-utils.test.ts +0 -159
  1362. package/packages/core/src/utils/tool-utils.ts +0 -181
  1363. package/packages/core/src/utils/workspaceContext.test.ts +0 -414
  1364. package/packages/core/src/utils/workspaceContext.ts +0 -202
  1365. package/packages/core/src/utils/yaml-parser.test.ts +0 -193
  1366. package/packages/core/src/utils/yaml-parser.ts +0 -192
  1367. package/packages/core/test-setup.ts +0 -27
  1368. package/packages/core/tsconfig.json +0 -26
  1369. package/packages/core/vendor/ripgrep/COPYING +0 -3
  1370. package/packages/core/vendor/ripgrep/arm64-darwin/rg +0 -0
  1371. package/packages/core/vendor/ripgrep/arm64-linux/rg +0 -0
  1372. package/packages/core/vendor/ripgrep/x64-darwin/rg +0 -0
  1373. package/packages/core/vendor/ripgrep/x64-linux/rg +0 -0
  1374. package/packages/core/vendor/ripgrep/x64-win32/rg.exe +0 -0
  1375. package/packages/core/vitest.config.ts +0 -38
  1376. package/packages/ice-v43/package.json +0 -35
  1377. package/packages/ice-v43/src/agent-crews.ts +0 -189
  1378. package/packages/ice-v43/src/cli.ts +0 -96
  1379. package/packages/ice-v43/src/d20-learner.ts +0 -161
  1380. package/packages/ice-v43/src/engine.ts +0 -219
  1381. package/packages/ice-v43/src/index.ts +0 -40
  1382. package/packages/ice-v43/src/intent-decoder.ts +0 -200
  1383. package/packages/ice-v43/src/multi-provider-client.ts +0 -200
  1384. package/packages/ice-v43/src/reasoning/chain-of-thought.ts +0 -166
  1385. package/packages/ice-v43/src/reasoning/index.ts +0 -16
  1386. package/packages/ice-v43/src/reasoning/self-reflection.ts +0 -160
  1387. package/packages/ice-v43/src/reasoning/socratic-reviewer.ts +0 -167
  1388. package/packages/ice-v43/src/reasoning/tree-of-thoughts.ts +0 -212
  1389. package/packages/ice-v43/src/reasoning/types.ts +0 -40
  1390. package/packages/ice-v43/src/status-cli.ts +0 -77
  1391. package/packages/ice-v43/src/types.ts +0 -81
  1392. package/packages/ice-v43/tsconfig.json +0 -25
  1393. package/packages/sdk-java/client/.editorconfig +0 -24
  1394. package/packages/sdk-java/client/QWEN.md +0 -106
  1395. package/packages/sdk-java/client/README.md +0 -178
  1396. package/packages/sdk-java/client/checkstyle.xml +0 -131
  1397. package/packages/sdk-java/client/pom.xml +0 -206
  1398. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/AcpClient.java +0 -174
  1399. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/notification/AgentNotification.java +0 -12
  1400. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/notification/SessionNotification.java +0 -42
  1401. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/AuthenticateRequest.java +0 -31
  1402. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/ReadTextFileRequest.java +0 -58
  1403. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/RequestPermissionRequest.java +0 -53
  1404. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/WriteTextFileRequest.java +0 -49
  1405. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/terminal/CreateTerminalRequest.java +0 -79
  1406. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/terminal/KillTerminalCommandRequest.java +0 -40
  1407. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/terminal/ReleaseTerminalRequest.java +0 -40
  1408. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/terminal/TerminalOutputRequest.java +0 -40
  1409. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/request/terminal/WaitForTerminalExitRequest.java +0 -40
  1410. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/AuthenticateResponse.java +0 -11
  1411. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/InitializeResponse.java +0 -101
  1412. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/LoadSessionResponse.java +0 -21
  1413. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/NewSessionResponse.java +0 -30
  1414. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/PromptResponse.java +0 -21
  1415. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/agent/response/SetSessionModeResponse.java +0 -11
  1416. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/notification/CancelNotification.java +0 -33
  1417. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/notification/ClientNotification.java +0 -13
  1418. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/request/InitializeRequest.java +0 -102
  1419. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/request/LoadSessionRequest.java +0 -54
  1420. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/request/NewSessionRequest.java +0 -46
  1421. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/request/PromptRequest.java +0 -50
  1422. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/request/SetSessionModeRequest.java +0 -40
  1423. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/ReadTextFileResponse.java +0 -33
  1424. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/RequestPermissionResponse.java +0 -40
  1425. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/WriteTextFileResponse.java +0 -11
  1426. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/terminal/CreateTerminalResponse.java +0 -20
  1427. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/terminal/KillTerminalCommandResponse.java +0 -11
  1428. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/terminal/ReleaseTerminalResponse.java +0 -11
  1429. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/terminal/TerminalOutputResponse.java +0 -60
  1430. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/client/response/terminal/WaitForTerminalExitResponse.java +0 -29
  1431. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/agent/AgentCapabilities.java +0 -189
  1432. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/agent/AgentInfo.java +0 -68
  1433. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/agent/AuthMethod.java +0 -68
  1434. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/client/ClientCapabilities.java +0 -120
  1435. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/client/ClientInfo.java +0 -68
  1436. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/Diff.java +0 -34
  1437. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/ToolCallContent.java +0 -44
  1438. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/Annotations.java +0 -53
  1439. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/AudioContent.java +0 -40
  1440. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/ContentBlock.java +0 -18
  1441. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/ImageContent.java +0 -49
  1442. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/ResourceLink.java +0 -76
  1443. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/block/TextContent.java +0 -36
  1444. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/embedded/BlobResourceContents.java +0 -13
  1445. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/embedded/EmbeddedResource.java +0 -32
  1446. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/embedded/ResourceContent.java +0 -26
  1447. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/embedded/ResourceContentDeserializer.java +0 -24
  1448. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/content/embedded/TextResourceContents.java +0 -13
  1449. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/mcp/HttpHeader.java +0 -25
  1450. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/mcp/McpServer.java +0 -75
  1451. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/permission/PermissionOption.java +0 -34
  1452. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/permission/PermissionOptionKind.java +0 -17
  1453. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/permission/PermissionOutcomeKind.java +0 -10
  1454. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/permission/RequestPermissionOutcome.java +0 -34
  1455. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/plan/Plan.java +0 -18
  1456. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/plan/PlanEntry.java +0 -34
  1457. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/plan/PlanEntryPriority.java +0 -14
  1458. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/plan/PlanEntryStatus.java +0 -14
  1459. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/SessionMode.java +0 -34
  1460. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/SessionModeState.java +0 -27
  1461. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/StopReason.java +0 -20
  1462. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/AgentMessageChunkSessionUpdate.java +0 -21
  1463. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/AvailableCommand.java +0 -34
  1464. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/AvailableCommandsUpdateSessionUpdate.java +0 -22
  1465. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/CurrentModeUpdateSessionUpdate.java +0 -20
  1466. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/PlanSessionUpdate.java +0 -23
  1467. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/SessionUpdate.java +0 -23
  1468. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/ToolCallSessionUpdate.java +0 -11
  1469. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/ToolCallUpdateSessionUpdate.java +0 -11
  1470. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/session/update/UnstructuredCommandInput.java +0 -16
  1471. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/terminal/EnvVariable.java +0 -25
  1472. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/tool/ToolCallLocation.java +0 -25
  1473. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/tool/ToolCallStatus.java +0 -17
  1474. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/tool/ToolCallUpdate.java +0 -82
  1475. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/domain/tool/ToolKind.java +0 -35
  1476. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/Error.java +0 -181
  1477. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/ExtNotification.java +0 -4
  1478. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/ExtRequest.java +0 -4
  1479. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/ExtResponse.java +0 -5
  1480. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/Message.java +0 -22
  1481. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/Meta.java +0 -48
  1482. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/MethodMessage.java +0 -72
  1483. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/Request.java +0 -10
  1484. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/jsonrpc/Response.java +0 -35
  1485. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/protocol/schema.json +0 -3105
  1486. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/Session.java +0 -312
  1487. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/AgentEventConsumer.java +0 -118
  1488. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/ContentEventConsumer.java +0 -110
  1489. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/ContentEventSimpleConsumer.java +0 -84
  1490. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/FileEventConsumer.java +0 -53
  1491. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/FileEventSimpleConsumer.java +0 -168
  1492. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/PermissionEventConsumer.java +0 -34
  1493. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/PromptEndEventConsumer.java +0 -29
  1494. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/TerminalEventConsumer.java +0 -110
  1495. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/event/consumer/exception/EventConsumeException.java +0 -89
  1496. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/exception/SessionLoadException.java +0 -65
  1497. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/session/exception/SessionNewException.java +0 -73
  1498. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/transport/Transport.java +0 -74
  1499. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/transport/process/ProcessTransport.java +0 -228
  1500. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/transport/process/ProcessTransportOptions.java +0 -122
  1501. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/utils/AgentInitializeException.java +0 -73
  1502. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/utils/MyConcurrentUtils.java +0 -83
  1503. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/utils/ThreadPoolConfig.java +0 -77
  1504. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/utils/Timeout.java +0 -72
  1505. package/packages/sdk-java/client/src/main/java/com/alibaba/acp/sdk/utils/TransportUtils.java +0 -38
  1506. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/PermissionOptionKindTest.java +0 -31
  1507. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/PlanEntryPriorityTest.java +0 -27
  1508. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/PlanEntryStatusTest.java +0 -27
  1509. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/StopReasonTest.java +0 -35
  1510. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/ToolCallStatusTest.java +0 -31
  1511. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/protocol/client/session/ToolKindTest.java +0 -55
  1512. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/session/SessionTest.java +0 -128
  1513. package/packages/sdk-java/client/src/test/java/com/alibaba/acp/sdk/test/EnumTest.java +0 -22
  1514. package/packages/sdk-java/client/src/test/resources/schema/schema.json +0 -3105
  1515. package/packages/sdk-java/qwencode/.editorconfig +0 -24
  1516. package/packages/sdk-java/qwencode/LICENSE +0 -201
  1517. package/packages/sdk-java/qwencode/QWEN.md +0 -377
  1518. package/packages/sdk-java/qwencode/README.md +0 -307
  1519. package/packages/sdk-java/qwencode/RELEASE.md +0 -150
  1520. package/packages/sdk-java/qwencode/checkstyle.xml +0 -131
  1521. package/packages/sdk-java/qwencode/pom.xml +0 -193
  1522. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/QwenCodeCli.java +0 -142
  1523. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/AssistantContent.java +0 -95
  1524. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/AssistantUsage.java +0 -76
  1525. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/CLIPermissionDenial.java +0 -83
  1526. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/Capabilities.java +0 -131
  1527. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/ExtendedUsage.java +0 -147
  1528. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/InitializeConfig.java +0 -98
  1529. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/ModelUsage.java +0 -142
  1530. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/PermissionMode.java +0 -56
  1531. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/Usage.java +0 -137
  1532. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/behavior/Allow.java +0 -46
  1533. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/behavior/Behavior.java +0 -62
  1534. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/data/behavior/Deny.java +0 -45
  1535. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/Message.java +0 -23
  1536. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/MessageBase.java +0 -64
  1537. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/SDKResultMessage.java +0 -332
  1538. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/SDKSystemMessage.java +0 -486
  1539. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/SDKUserMessage.java +0 -196
  1540. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/APIAssistantMessage.java +0 -172
  1541. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/SDKAssistantMessage.java +0 -121
  1542. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/SDKPartialAssistantMessage.java +0 -116
  1543. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/Annotation.java +0 -59
  1544. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/ContentBlock.java +0 -87
  1545. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/TextBlock.java +0 -42
  1546. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/ThinkingBlock.java +0 -64
  1547. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/ToolResultBlock.java +0 -92
  1548. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/block/ToolUseBlock.java +0 -122
  1549. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/ContentBlockDeltaEvent.java +0 -224
  1550. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/ContentBlockStartEvent.java +0 -25
  1551. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/ContentBlockStopEvent.java +0 -35
  1552. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/MessageStartStreamEvent.java +0 -107
  1553. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/MessageStopStreamEvent.java +0 -13
  1554. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/assistant/event/StreamEvent.java +0 -37
  1555. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/CLIControlRequest.java +0 -90
  1556. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/CLIControlResponse.java +0 -138
  1557. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlInitializeRequest.java +0 -45
  1558. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlInitializeResponse.java +0 -41
  1559. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlInterruptRequest.java +0 -17
  1560. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlPermissionRequest.java +0 -235
  1561. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlPermissionResponse.java +0 -45
  1562. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlSetModelRequest.java +0 -40
  1563. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlSetModelResponse.java +0 -54
  1564. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/CLIControlSetPermissionModeRequest.java +0 -40
  1565. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/ControlRequestPayload.java +0 -26
  1566. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/message/control/payload/ControlResponsePayload.java +0 -26
  1567. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/protocol/protocol.ts +0 -594
  1568. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/Session.java +0 -302
  1569. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/event/consumers/AssistantContentConsumers.java +0 -159
  1570. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/event/consumers/AssistantContentSimpleConsumers.java +0 -193
  1571. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/event/consumers/SessionEventConsumers.java +0 -158
  1572. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/event/consumers/SessionEventSimpleConsumers.java +0 -339
  1573. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/exception/SessionControlException.java +0 -55
  1574. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/session/exception/SessionSendPromptException.java +0 -55
  1575. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/Transport.java +0 -78
  1576. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/TransportOptions.java +0 -386
  1577. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransport.java +0 -224
  1578. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/TransportOptionsAdapter.java +0 -153
  1579. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/utils/MyConcurrentUtils.java +0 -94
  1580. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/utils/ThreadPoolConfig.java +0 -64
  1581. package/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/utils/Timeout.java +0 -68
  1582. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/QwenCodeCliTest.java +0 -29
  1583. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/example/QuickStartExample.java +0 -109
  1584. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/example/SessionExample.java +0 -256
  1585. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/example/ThreadPoolConfigurationExample.java +0 -50
  1586. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/session/SessionTest.java +0 -185
  1587. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/PermissionModeTest.java +0 -19
  1588. package/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransportTest.java +0 -87
  1589. package/packages/sdk-typescript/README.md +0 -395
  1590. package/packages/sdk-typescript/package.json +0 -75
  1591. package/packages/sdk-typescript/scripts/build.js +0 -93
  1592. package/packages/sdk-typescript/scripts/bundle-cli-from-npm.js +0 -88
  1593. package/packages/sdk-typescript/scripts/bundle-cli.js +0 -83
  1594. package/packages/sdk-typescript/scripts/get-release-version.js +0 -363
  1595. package/packages/sdk-typescript/src/index.ts +0 -64
  1596. package/packages/sdk-typescript/src/mcp/SdkControlServerTransport.ts +0 -105
  1597. package/packages/sdk-typescript/src/mcp/createSdkMcpServer.ts +0 -107
  1598. package/packages/sdk-typescript/src/mcp/formatters.ts +0 -194
  1599. package/packages/sdk-typescript/src/mcp/tool.ts +0 -90
  1600. package/packages/sdk-typescript/src/query/Query.ts +0 -937
  1601. package/packages/sdk-typescript/src/query/createQuery.ts +0 -140
  1602. package/packages/sdk-typescript/src/transport/ProcessTransport.ts +0 -474
  1603. package/packages/sdk-typescript/src/transport/Transport.ts +0 -22
  1604. package/packages/sdk-typescript/src/types/errors.ts +0 -17
  1605. package/packages/sdk-typescript/src/types/protocol.ts +0 -605
  1606. package/packages/sdk-typescript/src/types/queryOptionsSchema.ts +0 -173
  1607. package/packages/sdk-typescript/src/types/types.ts +0 -477
  1608. package/packages/sdk-typescript/src/utils/Stream.ts +0 -79
  1609. package/packages/sdk-typescript/src/utils/cliPath.ts +0 -364
  1610. package/packages/sdk-typescript/src/utils/jsonLines.ts +0 -65
  1611. package/packages/sdk-typescript/src/utils/logger.ts +0 -147
  1612. package/packages/sdk-typescript/src/utils/validation.ts +0 -33
  1613. package/packages/sdk-typescript/test/unit/ProcessTransport.test.ts +0 -1754
  1614. package/packages/sdk-typescript/test/unit/Query.test.ts +0 -1433
  1615. package/packages/sdk-typescript/test/unit/Stream.test.ts +0 -255
  1616. package/packages/sdk-typescript/test/unit/cliPath.test.ts +0 -423
  1617. package/packages/sdk-typescript/test/unit/createSdkMcpServer.test.ts +0 -386
  1618. package/packages/sdk-typescript/tsconfig.build.json +0 -15
  1619. package/packages/sdk-typescript/tsconfig.json +0 -41
  1620. package/packages/sdk-typescript/vitest.config.ts +0 -47
  1621. package/packages/test-utils/index.ts +0 -7
  1622. package/packages/test-utils/package.json +0 -18
  1623. package/packages/test-utils/src/file-system-test-helpers.ts +0 -98
  1624. package/packages/test-utils/src/index.ts +0 -7
  1625. package/packages/test-utils/tsconfig.json +0 -11
  1626. package/packages/test-utils/vitest.config.ts +0 -23
  1627. package/packages/vscode-ide-companion/.vscode/launch.json +0 -13
  1628. package/packages/vscode-ide-companion/.vscode/tasks.json +0 -18
  1629. package/packages/vscode-ide-companion/.vscodeignore +0 -10
  1630. package/packages/vscode-ide-companion/LICENSE +0 -202
  1631. package/packages/vscode-ide-companion/NOTICES.txt +0 -2553
  1632. package/packages/vscode-ide-companion/README.md +0 -70
  1633. package/packages/vscode-ide-companion/assets/icon.png +0 -0
  1634. package/packages/vscode-ide-companion/development.md +0 -24
  1635. package/packages/vscode-ide-companion/esbuild.js +0 -197
  1636. package/packages/vscode-ide-companion/eslint.config.mjs +0 -75
  1637. package/packages/vscode-ide-companion/package.json +0 -172
  1638. package/packages/vscode-ide-companion/postcss.config.js +0 -13
  1639. package/packages/vscode-ide-companion/schemas/settings.schema.json +0 -622
  1640. package/packages/vscode-ide-companion/scripts/copy-bundled-cli.js +0 -67
  1641. package/packages/vscode-ide-companion/scripts/generate-notices.js +0 -160
  1642. package/packages/vscode-ide-companion/scripts/prepackage.js +0 -252
  1643. package/packages/vscode-ide-companion/src/commands/index.ts +0 -86
  1644. package/packages/vscode-ide-companion/src/constants/acpSchema.ts +0 -35
  1645. package/packages/vscode-ide-companion/src/constants/loadingMessages.ts +0 -146
  1646. package/packages/vscode-ide-companion/src/diff-manager.ts +0 -433
  1647. package/packages/vscode-ide-companion/src/extension.test.ts +0 -298
  1648. package/packages/vscode-ide-companion/src/extension.ts +0 -380
  1649. package/packages/vscode-ide-companion/src/ide-server.test.ts +0 -536
  1650. package/packages/vscode-ide-companion/src/ide-server.ts +0 -477
  1651. package/packages/vscode-ide-companion/src/open-files-manager.test.ts +0 -441
  1652. package/packages/vscode-ide-companion/src/open-files-manager.ts +0 -215
  1653. package/packages/vscode-ide-companion/src/services/acpConnection.ts +0 -532
  1654. package/packages/vscode-ide-companion/src/services/acpFileHandler.test.ts +0 -131
  1655. package/packages/vscode-ide-companion/src/services/acpFileHandler.ts +0 -117
  1656. package/packages/vscode-ide-companion/src/services/conversationStore.ts +0 -83
  1657. package/packages/vscode-ide-companion/src/services/open-files-manager/constants.ts +0 -8
  1658. package/packages/vscode-ide-companion/src/services/open-files-manager/notebook-handler.ts +0 -119
  1659. package/packages/vscode-ide-companion/src/services/open-files-manager/text-handler.ts +0 -61
  1660. package/packages/vscode-ide-companion/src/services/open-files-manager/utils.ts +0 -101
  1661. package/packages/vscode-ide-companion/src/services/qwenAgentManager.ts +0 -1495
  1662. package/packages/vscode-ide-companion/src/services/qwenConnectionHandler.ts +0 -237
  1663. package/packages/vscode-ide-companion/src/services/qwenSessionManager.ts +0 -151
  1664. package/packages/vscode-ide-companion/src/services/qwenSessionReader.ts +0 -353
  1665. package/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.test.ts +0 -358
  1666. package/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.ts +0 -274
  1667. package/packages/vscode-ide-companion/src/services/readonlyFileSystemProvider.ts +0 -204
  1668. package/packages/vscode-ide-companion/src/types/acpTypes.ts +0 -68
  1669. package/packages/vscode-ide-companion/src/types/approvalModeTypes.ts +0 -79
  1670. package/packages/vscode-ide-companion/src/types/approvalModeValueTypes.ts +0 -11
  1671. package/packages/vscode-ide-companion/src/types/chatTypes.ts +0 -113
  1672. package/packages/vscode-ide-companion/src/types/completionItemTypes.ts +0 -7
  1673. package/packages/vscode-ide-companion/src/types/connectionTypes.ts +0 -43
  1674. package/packages/vscode-ide-companion/src/types/webviewMessageTypes.ts +0 -25
  1675. package/packages/vscode-ide-companion/src/utils/acpModelInfo.test.ts +0 -208
  1676. package/packages/vscode-ide-companion/src/utils/acpModelInfo.ts +0 -288
  1677. package/packages/vscode-ide-companion/src/utils/authErrors.ts +0 -36
  1678. package/packages/vscode-ide-companion/src/utils/authNotificationHandler.ts +0 -50
  1679. package/packages/vscode-ide-companion/src/utils/editorGroupUtils.ts +0 -162
  1680. package/packages/vscode-ide-companion/src/utils/logger.ts +0 -18
  1681. package/packages/vscode-ide-companion/src/utils/platform.ts +0 -8
  1682. package/packages/vscode-ide-companion/src/webview/App.tsx +0 -1060
  1683. package/packages/vscode-ide-companion/src/webview/MessageHandler.ts +0 -89
  1684. package/packages/vscode-ide-companion/src/webview/PanelManager.ts +0 -385
  1685. package/packages/vscode-ide-companion/src/webview/WebViewContent.ts +0 -50
  1686. package/packages/vscode-ide-companion/src/webview/WebViewProvider.ts +0 -1450
  1687. package/packages/vscode-ide-companion/src/webview/components/layout/InputForm.tsx +0 -88
  1688. package/packages/vscode-ide-companion/src/webview/components/layout/ModelSelector.tsx +0 -197
  1689. package/packages/vscode-ide-companion/src/webview/components/layout/Onboarding.tsx +0 -26
  1690. package/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/ToolCall.tsx +0 -29
  1691. package/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/index.tsx +0 -101
  1692. package/packages/vscode-ide-companion/src/webview/context/VSCodePlatformProvider.tsx +0 -171
  1693. package/packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts +0 -83
  1694. package/packages/vscode-ide-companion/src/webview/handlers/BaseMessageHandler.ts +0 -58
  1695. package/packages/vscode-ide-companion/src/webview/handlers/EditorMessageHandler.ts +0 -111
  1696. package/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.test.ts +0 -118
  1697. package/packages/vscode-ide-companion/src/webview/handlers/FileMessageHandler.ts +0 -565
  1698. package/packages/vscode-ide-companion/src/webview/handlers/MessageRouter.ts +0 -175
  1699. package/packages/vscode-ide-companion/src/webview/handlers/SessionMessageHandler.ts +0 -994
  1700. package/packages/vscode-ide-companion/src/webview/hooks/file/useFileContext.ts +0 -189
  1701. package/packages/vscode-ide-companion/src/webview/hooks/message/useMessageHandling.ts +0 -182
  1702. package/packages/vscode-ide-companion/src/webview/hooks/session/useSessionManagement.ts +0 -127
  1703. package/packages/vscode-ide-companion/src/webview/hooks/useCompletionTrigger.ts +0 -357
  1704. package/packages/vscode-ide-companion/src/webview/hooks/useMessageSubmit.ts +0 -171
  1705. package/packages/vscode-ide-companion/src/webview/hooks/useToolCalls.ts +0 -271
  1706. package/packages/vscode-ide-companion/src/webview/hooks/useVSCode.ts +0 -54
  1707. package/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts +0 -988
  1708. package/packages/vscode-ide-companion/src/webview/index.tsx +0 -28
  1709. package/packages/vscode-ide-companion/src/webview/styles/App.css +0 -175
  1710. package/packages/vscode-ide-companion/src/webview/styles/tailwind.css +0 -27
  1711. package/packages/vscode-ide-companion/src/webview/utils/diffStats.ts +0 -160
  1712. package/packages/vscode-ide-companion/src/webview/utils/diffUtils.ts +0 -49
  1713. package/packages/vscode-ide-companion/src/webview/utils/resourceUrl.ts +0 -115
  1714. package/packages/vscode-ide-companion/src/webview/utils/sessionGrouping.ts +0 -10
  1715. package/packages/vscode-ide-companion/src/webview/utils/utils.test.ts +0 -134
  1716. package/packages/vscode-ide-companion/src/webview/utils/utils.ts +0 -26
  1717. package/packages/vscode-ide-companion/src/webview/utils/webviewUtils.ts +0 -31
  1718. package/packages/vscode-ide-companion/tailwind.config.js +0 -74
  1719. package/packages/vscode-ide-companion/tsconfig.json +0 -17
  1720. package/packages/vscode-ide-companion/vitest.config.ts +0 -15
  1721. package/packages/web-templates/build.mjs +0 -57
  1722. package/packages/web-templates/package.json +0 -6
  1723. package/packages/web-templates/src/export-html/build.mjs +0 -87
  1724. package/packages/web-templates/src/export-html/esbuild.config.mjs +0 -35
  1725. package/packages/web-templates/src/export-html/package.json +0 -14
  1726. package/packages/web-templates/src/export-html/src/components/TempFileModal.css +0 -70
  1727. package/packages/web-templates/src/export-html/src/components/TempFileModal.tsx +0 -65
  1728. package/packages/web-templates/src/export-html/src/favicon.svg +0 -6
  1729. package/packages/web-templates/src/export-html/src/index.html +0 -59
  1730. package/packages/web-templates/src/export-html/src/main.tsx +0 -186
  1731. package/packages/web-templates/src/export-html/src/styles.css +0 -203
  1732. package/packages/web-templates/src/export-html/src/types.d.ts +0 -9
  1733. package/packages/web-templates/src/export-html/tsconfig.json +0 -15
  1734. package/packages/web-templates/src/index.ts +0 -9
  1735. package/packages/web-templates/src/insight/build.mjs +0 -57
  1736. package/packages/web-templates/src/insight/index.html +0 -17
  1737. package/packages/web-templates/src/insight/package.json +0 -9
  1738. package/packages/web-templates/src/insight/postcss.config.js +0 -5
  1739. package/packages/web-templates/src/insight/src/App.tsx +0 -287
  1740. package/packages/web-templates/src/insight/src/Charts.tsx +0 -300
  1741. package/packages/web-templates/src/insight/src/Components.tsx +0 -45
  1742. package/packages/web-templates/src/insight/src/Header.tsx +0 -79
  1743. package/packages/web-templates/src/insight/src/Qualitative.tsx +0 -718
  1744. package/packages/web-templates/src/insight/src/ShareCard.tsx +0 -598
  1745. package/packages/web-templates/src/insight/src/dev.tsx +0 -363
  1746. package/packages/web-templates/src/insight/src/styles.css +0 -1290
  1747. package/packages/web-templates/src/insight/src/types.ts +0 -15
  1748. package/packages/web-templates/src/insight/tailwind.config.js +0 -8
  1749. package/packages/web-templates/src/insight/tsconfig.json +0 -15
  1750. package/packages/web-templates/src/insight/vite.config.mjs +0 -39
  1751. package/packages/web-templates/tsconfig.json +0 -12
  1752. package/packages/webui/.storybook/main.ts +0 -44
  1753. package/packages/webui/.storybook/preview.css +0 -54
  1754. package/packages/webui/.storybook/preview.ts +0 -67
  1755. package/packages/webui/README.md +0 -347
  1756. package/packages/webui/docs/WEBUI_MIGRATION_PLAN_EN.md +0 -428
  1757. package/packages/webui/examples/README.md +0 -8
  1758. package/packages/webui/examples/cdn-usage-demo.html +0 -161
  1759. package/packages/webui/examples/complex-chat-demo.html +0 -428
  1760. package/packages/webui/package.json +0 -80
  1761. package/packages/webui/postcss.config.cjs +0 -13
  1762. package/packages/webui/scripts/add-license-header.sh +0 -48
  1763. package/packages/webui/src/adapters/ACPAdapter.ts +0 -109
  1764. package/packages/webui/src/adapters/JSONLAdapter.ts +0 -126
  1765. package/packages/webui/src/adapters/index.ts +0 -28
  1766. package/packages/webui/src/adapters/types.ts +0 -82
  1767. package/packages/webui/src/components/ChatViewer/ChatViewer.css +0 -192
  1768. package/packages/webui/src/components/ChatViewer/ChatViewer.stories.tsx +0 -1650
  1769. package/packages/webui/src/components/ChatViewer/ChatViewer.tsx +0 -424
  1770. package/packages/webui/src/components/ChatViewer/index.ts +0 -16
  1771. package/packages/webui/src/components/PermissionDrawer.css +0 -249
  1772. package/packages/webui/src/components/PermissionDrawer.stories.tsx +0 -81
  1773. package/packages/webui/src/components/PermissionDrawer.tsx +0 -259
  1774. package/packages/webui/src/components/WebviewContainer.tsx +0 -17
  1775. package/packages/webui/src/components/icons/CloseIcon.tsx +0 -36
  1776. package/packages/webui/src/components/icons/EditIcons.tsx +0 -389
  1777. package/packages/webui/src/components/icons/FileIcons.tsx +0 -99
  1778. package/packages/webui/src/components/icons/Icon.tsx +0 -41
  1779. package/packages/webui/src/components/icons/NavigationIcons.tsx +0 -270
  1780. package/packages/webui/src/components/icons/SendIcon.tsx +0 -36
  1781. package/packages/webui/src/components/icons/SpecialIcons.tsx +0 -79
  1782. package/packages/webui/src/components/icons/StatusIcons.tsx +0 -235
  1783. package/packages/webui/src/components/icons/StopIcon.tsx +0 -29
  1784. package/packages/webui/src/components/icons/index.ts +0 -60
  1785. package/packages/webui/src/components/icons/types.ts +0 -22
  1786. package/packages/webui/src/components/layout/ChatHeader.stories.tsx +0 -66
  1787. package/packages/webui/src/components/layout/ChatHeader.tsx +0 -77
  1788. package/packages/webui/src/components/layout/CompletionMenu.stories.tsx +0 -129
  1789. package/packages/webui/src/components/layout/CompletionMenu.tsx +0 -280
  1790. package/packages/webui/src/components/layout/Container.tsx +0 -18
  1791. package/packages/webui/src/components/layout/ContextIndicator.stories.tsx +0 -85
  1792. package/packages/webui/src/components/layout/ContextIndicator.tsx +0 -129
  1793. package/packages/webui/src/components/layout/EmptyState.stories.tsx +0 -100
  1794. package/packages/webui/src/components/layout/EmptyState.tsx +0 -99
  1795. package/packages/webui/src/components/layout/FileLink.tsx +0 -189
  1796. package/packages/webui/src/components/layout/Footer.tsx +0 -11
  1797. package/packages/webui/src/components/layout/Header.tsx +0 -11
  1798. package/packages/webui/src/components/layout/InputForm.stories.tsx +0 -205
  1799. package/packages/webui/src/components/layout/InputForm.tsx +0 -367
  1800. package/packages/webui/src/components/layout/Main.tsx +0 -11
  1801. package/packages/webui/src/components/layout/Onboarding.stories.tsx +0 -69
  1802. package/packages/webui/src/components/layout/Onboarding.tsx +0 -70
  1803. package/packages/webui/src/components/layout/SessionSelector.stories.tsx +0 -154
  1804. package/packages/webui/src/components/layout/SessionSelector.tsx +0 -194
  1805. package/packages/webui/src/components/layout/Sidebar.tsx +0 -11
  1806. package/packages/webui/src/components/messages/AskUserQuestionDialog.tsx +0 -525
  1807. package/packages/webui/src/components/messages/Assistant/AssistantMessage.css +0 -104
  1808. package/packages/webui/src/components/messages/Assistant/AssistantMessage.stories.tsx +0 -207
  1809. package/packages/webui/src/components/messages/Assistant/AssistantMessage.tsx +0 -99
  1810. package/packages/webui/src/components/messages/Assistant/index.ts +0 -11
  1811. package/packages/webui/src/components/messages/CollapsibleFileContent.tsx +0 -264
  1812. package/packages/webui/src/components/messages/MarkdownRenderer/MarkdownRenderer.css +0 -222
  1813. package/packages/webui/src/components/messages/MarkdownRenderer/MarkdownRenderer.tsx +0 -360
  1814. package/packages/webui/src/components/messages/MarkdownRenderer/index.ts +0 -8
  1815. package/packages/webui/src/components/messages/Message.tsx +0 -45
  1816. package/packages/webui/src/components/messages/MessageContent.tsx +0 -31
  1817. package/packages/webui/src/components/messages/MessageInput.tsx +0 -11
  1818. package/packages/webui/src/components/messages/MessageList.tsx +0 -11
  1819. package/packages/webui/src/components/messages/ThinkingMessage.css +0 -150
  1820. package/packages/webui/src/components/messages/ThinkingMessage.stories.tsx +0 -141
  1821. package/packages/webui/src/components/messages/ThinkingMessage.tsx +0 -83
  1822. package/packages/webui/src/components/messages/UserMessage.stories.tsx +0 -121
  1823. package/packages/webui/src/components/messages/UserMessage.tsx +0 -91
  1824. package/packages/webui/src/components/messages/Waiting/InterruptedMessage.tsx +0 -22
  1825. package/packages/webui/src/components/messages/Waiting/WaitingMessage.tsx +0 -83
  1826. package/packages/webui/src/components/toolcalls/CheckboxDisplay.stories.tsx +0 -63
  1827. package/packages/webui/src/components/toolcalls/CheckboxDisplay.tsx +0 -79
  1828. package/packages/webui/src/components/toolcalls/EditToolCall.stories.tsx +0 -92
  1829. package/packages/webui/src/components/toolcalls/EditToolCall.tsx +0 -216
  1830. package/packages/webui/src/components/toolcalls/GenericToolCall.stories.tsx +0 -102
  1831. package/packages/webui/src/components/toolcalls/GenericToolCall.tsx +0 -148
  1832. package/packages/webui/src/components/toolcalls/ReadToolCall.stories.tsx +0 -171
  1833. package/packages/webui/src/components/toolcalls/ReadToolCall.tsx +0 -338
  1834. package/packages/webui/src/components/toolcalls/SaveMemoryToolCall.tsx +0 -69
  1835. package/packages/webui/src/components/toolcalls/SearchToolCall.stories.tsx +0 -85
  1836. package/packages/webui/src/components/toolcalls/SearchToolCall.tsx +0 -210
  1837. package/packages/webui/src/components/toolcalls/ShellToolCall.css +0 -190
  1838. package/packages/webui/src/components/toolcalls/ShellToolCall.stories.tsx +0 -183
  1839. package/packages/webui/src/components/toolcalls/ShellToolCall.tsx +0 -297
  1840. package/packages/webui/src/components/toolcalls/ThinkToolCall.stories.tsx +0 -98
  1841. package/packages/webui/src/components/toolcalls/ThinkToolCall.tsx +0 -86
  1842. package/packages/webui/src/components/toolcalls/UpdatedPlanToolCall.stories.tsx +0 -100
  1843. package/packages/webui/src/components/toolcalls/UpdatedPlanToolCall.tsx +0 -188
  1844. package/packages/webui/src/components/toolcalls/WebFetchToolCall.tsx +0 -195
  1845. package/packages/webui/src/components/toolcalls/WriteToolCall.stories.tsx +0 -68
  1846. package/packages/webui/src/components/toolcalls/WriteToolCall.tsx +0 -132
  1847. package/packages/webui/src/components/toolcalls/index.ts +0 -22
  1848. package/packages/webui/src/components/toolcalls/shared/CodeBlock.stories.tsx +0 -52
  1849. package/packages/webui/src/components/toolcalls/shared/CopyButton.stories.tsx +0 -54
  1850. package/packages/webui/src/components/toolcalls/shared/LayoutComponents.css +0 -207
  1851. package/packages/webui/src/components/toolcalls/shared/LayoutComponents.tsx +0 -188
  1852. package/packages/webui/src/components/toolcalls/shared/LocationsList.stories.tsx +0 -45
  1853. package/packages/webui/src/components/toolcalls/shared/StatusIndicator.stories.tsx +0 -51
  1854. package/packages/webui/src/components/toolcalls/shared/ToolCallCard.stories.tsx +0 -80
  1855. package/packages/webui/src/components/toolcalls/shared/ToolCallContainer.stories.tsx +0 -79
  1856. package/packages/webui/src/components/toolcalls/shared/copyUtils.tsx +0 -99
  1857. package/packages/webui/src/components/toolcalls/shared/index.ts +0 -43
  1858. package/packages/webui/src/components/toolcalls/shared/types.ts +0 -95
  1859. package/packages/webui/src/components/toolcalls/shared/utils.ts +0 -284
  1860. package/packages/webui/src/components/ui/Button.stories.tsx +0 -83
  1861. package/packages/webui/src/components/ui/Button.tsx +0 -143
  1862. package/packages/webui/src/components/ui/Input.tsx +0 -149
  1863. package/packages/webui/src/components/ui/Tooltip.stories.tsx +0 -68
  1864. package/packages/webui/src/components/ui/Tooltip.tsx +0 -73
  1865. package/packages/webui/src/context/PlatformContext.tsx +0 -104
  1866. package/packages/webui/src/hooks/useLocalStorage.ts +0 -33
  1867. package/packages/webui/src/hooks/useTheme.ts +0 -35
  1868. package/packages/webui/src/index.ts +0 -256
  1869. package/packages/webui/src/styles/components.css +0 -524
  1870. package/packages/webui/src/styles/timeline.css +0 -69
  1871. package/packages/webui/src/styles/variables.css +0 -197
  1872. package/packages/webui/src/types/chat.ts +0 -28
  1873. package/packages/webui/src/types/completion.ts +0 -42
  1874. package/packages/webui/src/types/messages.ts +0 -13
  1875. package/packages/webui/src/types/theme.ts +0 -7
  1876. package/packages/webui/src/types/toolCall.ts +0 -48
  1877. package/packages/webui/src/utils/sessionGrouping.ts +0 -126
  1878. package/packages/webui/tailwind.config.cjs +0 -11
  1879. package/packages/webui/tailwind.preset.cjs +0 -90
  1880. package/packages/webui/tsconfig.json +0 -21
  1881. package/packages/webui/vite.config.ts +0 -59
  1882. package/packages/zed-extension/LICENSE +0 -22
  1883. package/packages/zed-extension/README.md +0 -126
  1884. package/packages/zed-extension/extension.toml +0 -32
  1885. package/packages/zed-extension/qwen-code.svg +0 -1
  1886. package/patches/README.md +0 -293
  1887. package/pyproject.toml +0 -54
  1888. package/requirements.txt +0 -10
  1889. package/scripts/build.js +0 -88
  1890. package/scripts/build_package.js +0 -37
  1891. package/scripts/build_sandbox.js +0 -174
  1892. package/scripts/build_vscode_companion.js +0 -30
  1893. package/scripts/check-build-status.js +0 -148
  1894. package/scripts/check-i18n.ts +0 -462
  1895. package/scripts/check-lockfile.js +0 -74
  1896. package/scripts/clean.js +0 -59
  1897. package/scripts/copy_bundle_assets.js +0 -90
  1898. package/scripts/copy_files.js +0 -86
  1899. package/scripts/create_alias.sh +0 -39
  1900. package/scripts/dev.js +0 -109
  1901. package/scripts/esbuild-shims.js +0 -29
  1902. package/scripts/generate-git-commit-info.js +0 -71
  1903. package/scripts/generate-settings-schema.ts +0 -146
  1904. package/scripts/get-release-version.js +0 -411
  1905. package/scripts/ice-mobile.js +0 -5
  1906. package/scripts/ice-session.js +0 -6
  1907. package/scripts/ice-skills.js +0 -31
  1908. package/scripts/ice-teams.js +0 -34
  1909. package/scripts/ice-v10.js +0 -276
  1910. package/scripts/ice-v11.js +0 -276
  1911. package/scripts/ice-v12.js +0 -383
  1912. package/scripts/ice-v13.js +0 -383
  1913. package/scripts/ice-v14.js +0 -568
  1914. package/scripts/ice-v2.js +0 -26
  1915. package/scripts/ice-v3-core.js +0 -261
  1916. package/scripts/ice-v3.js +0 -46
  1917. package/scripts/ice-v4.js +0 -657
  1918. package/scripts/ice-v5.js +0 -371
  1919. package/scripts/ice-v6.js +0 -305
  1920. package/scripts/ice-v7.js +0 -291
  1921. package/scripts/ice-v8.js +0 -550
  1922. package/scripts/ice-v9.js +0 -546
  1923. package/scripts/install-ice.sh +0 -70
  1924. package/scripts/install.sh +0 -136
  1925. package/scripts/installation/INSTALLATION_GUIDE.md +0 -250
  1926. package/scripts/installation/install-qwen-with-source.bat +0 -302
  1927. package/scripts/installation/install-qwen-with-source.sh +0 -570
  1928. package/scripts/lint.js +0 -205
  1929. package/scripts/local_telemetry.js +0 -219
  1930. package/scripts/postinstall.cjs +0 -14
  1931. package/scripts/pre-commit.js +0 -22
  1932. package/scripts/prepare-package.js +0 -186
  1933. package/scripts/prepare-termux.cjs +0 -26
  1934. package/scripts/sandbox_command.js +0 -128
  1935. package/scripts/start.js +0 -86
  1936. package/scripts/telemetry.js +0 -85
  1937. package/scripts/telemetry_gcp.js +0 -188
  1938. package/scripts/telemetry_utils.js +0 -450
  1939. package/scripts/test-v10.js +0 -18
  1940. package/scripts/test-v11.js +0 -18
  1941. package/scripts/test-v12.js +0 -18
  1942. package/scripts/test-v13.js +0 -18
  1943. package/scripts/test-v14.js +0 -18
  1944. package/scripts/test-v3.js +0 -47
  1945. package/scripts/test-v4.js +0 -47
  1946. package/scripts/test-v6.js +0 -59
  1947. package/scripts/test-v8.js +0 -42
  1948. package/scripts/test-v9.js +0 -18
  1949. package/scripts/test-windows-paths.js +0 -51
  1950. package/scripts/tests/get-release-version.test.js +0 -186
  1951. package/scripts/tests/test-setup.ts +0 -12
  1952. package/scripts/tests/vitest.config.ts +0 -26
  1953. package/scripts/unused-keys-only-in-locales.json +0 -62
  1954. package/scripts/version.js +0 -112
  1955. package/test-reports/0.10.3-termux/README.md +0 -213
  1956. package/test-reports/0.10.3-termux/TEST-REPORT-2026-02-17.md +0 -114
  1957. package/test-reports/0.11.0-termux/TEST-REPORT-2026-03-01.md +0 -104
  1958. package/test-reports/0.11.3-termux/TEST-REPORT-2026-03-07.md +0 -156
  1959. package/test-reports/0.12.0-termux/CHECKLIST-MANUALE.md +0 -217
  1960. package/test-reports/0.12.0-termux/TEST-REPORT-2026-03-09.md +0 -225
  1961. package/test-reports/README.md +0 -60
  1962. package/test-reports/suites/README.md +0 -22
  1963. package/test-reports/suites/basic-smoke.md +0 -162
  1964. package/test-reports/suites/latest/termux.md +0 -202
  1965. package/test-reports/suites/qwen-test-suite.md +0 -200
  1966. package/test-reports/suites/termux-runtime.md +0 -201
  1967. package/tsconfig.json +0 -32
  1968. package/vitest.config.ts +0 -14
@@ -1,2786 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- /// <reference types="vitest/globals" />
8
-
9
- // Mock 'os' first.
10
- import * as osActual from 'node:os'; // Import for type info for the mock factory
11
-
12
- vi.mock('os', async (importOriginal) => {
13
- const actualOs = await importOriginal<typeof osActual>();
14
- return {
15
- ...actualOs,
16
- homedir: vi.fn(() => '/mock/home/user'),
17
- platform: vi.fn(() => 'linux'),
18
- };
19
- });
20
-
21
- // Mock trustedFolders
22
- vi.mock('./trustedFolders.js', () => ({
23
- isWorkspaceTrusted: vi
24
- .fn()
25
- .mockReturnValue({ isTrusted: true, source: 'file' }),
26
- }));
27
-
28
- // NOW import everything else, including the (now effectively re-exported) settings.js
29
- import path, * as pathActual from 'node:path'; // Restored for MOCK_WORKSPACE_SETTINGS_PATH
30
- import {
31
- describe,
32
- it,
33
- expect,
34
- vi,
35
- beforeEach,
36
- afterEach,
37
- type Mocked,
38
- type Mock,
39
- } from 'vitest';
40
- import * as fs from 'node:fs'; // fs will be mocked separately
41
- import stripJsonComments from 'strip-json-comments'; // Will be mocked separately
42
- import { isWorkspaceTrusted } from './trustedFolders.js';
43
-
44
- // These imports will get the versions from the vi.mock('./settings.js', ...) factory.
45
- import {
46
- getSettingsWarnings,
47
- loadSettings,
48
- USER_SETTINGS_PATH, // This IS the mocked path.
49
- getSystemSettingsPath,
50
- getSystemDefaultsPath,
51
- SETTINGS_DIRECTORY_NAME, // This is from the original module, but used by the mock.
52
- type Settings,
53
- loadEnvironment,
54
- SETTINGS_VERSION,
55
- SETTINGS_VERSION_KEY,
56
- } from './settings.js';
57
- import { needsMigration } from './migration/index.js';
58
- import { FatalConfigError, QWEN_DIR } from '@mmmbuto/qwen-code-termux-core';
59
-
60
- const MOCK_WORKSPACE_DIR = '/mock/workspace';
61
- // Use the (mocked) SETTINGS_DIRECTORY_NAME for consistency
62
- const MOCK_WORKSPACE_SETTINGS_PATH = pathActual.join(
63
- MOCK_WORKSPACE_DIR,
64
- SETTINGS_DIRECTORY_NAME,
65
- 'settings.json',
66
- );
67
-
68
- // A more flexible type for test data that allows arbitrary properties.
69
- type TestSettings = Settings & {
70
- [key: string]: unknown;
71
- nested?: { [key: string]: unknown };
72
- nestedObj?: { [key: string]: unknown };
73
- };
74
-
75
- vi.mock('node:fs', async (importOriginal) => {
76
- // Get all the functions from the real 'fs' module
77
- const actualFs = await importOriginal<typeof fs>();
78
-
79
- return {
80
- ...actualFs, // Keep all the real functions
81
- // Now, just override the ones we need for the test
82
- existsSync: vi.fn(),
83
- readFileSync: vi.fn(),
84
- writeFileSync: vi.fn(),
85
- renameSync: vi.fn(),
86
- mkdirSync: vi.fn(),
87
- realpathSync: (p: string) => p,
88
- };
89
- });
90
-
91
- // Also mock 'fs' for compatibility
92
- vi.mock('fs', async (importOriginal) => {
93
- // Get all the functions from the real 'fs' module
94
- const actualFs = await importOriginal<typeof fs>();
95
-
96
- return {
97
- ...actualFs, // Keep all the real functions
98
- // Now, just override the ones we need for the test
99
- existsSync: vi.fn(),
100
- readFileSync: vi.fn(),
101
- writeFileSync: vi.fn(),
102
- renameSync: vi.fn(),
103
- mkdirSync: vi.fn(),
104
- realpathSync: (p: string) => p,
105
- };
106
- });
107
-
108
- vi.mock('./extension.js', () => ({
109
- disableExtension: vi.fn(),
110
- }));
111
-
112
- vi.mock('strip-json-comments', () => ({
113
- default: vi.fn((content) => content),
114
- }));
115
-
116
- describe('Settings Loading and Merging', () => {
117
- let mockFsExistsSync: Mocked<typeof fs.existsSync>;
118
- let mockStripJsonComments: Mocked<typeof stripJsonComments>;
119
- let mockFsMkdirSync: Mocked<typeof fs.mkdirSync>;
120
-
121
- beforeEach(() => {
122
- vi.resetAllMocks();
123
-
124
- mockFsExistsSync = vi.mocked(fs.existsSync);
125
- mockFsMkdirSync = vi.mocked(fs.mkdirSync);
126
- mockStripJsonComments = vi.mocked(stripJsonComments);
127
-
128
- vi.mocked(osActual.homedir).mockReturnValue('/mock/home/user');
129
- (mockStripJsonComments as unknown as Mock).mockImplementation(
130
- (jsonString: string) => jsonString,
131
- );
132
- (mockFsExistsSync as Mock).mockReturnValue(false);
133
- (fs.readFileSync as Mock).mockReturnValue('{}'); // Return valid empty JSON
134
- (mockFsMkdirSync as Mock).mockImplementation(() => undefined);
135
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
136
- isTrusted: true,
137
- source: 'file',
138
- });
139
- });
140
-
141
- afterEach(() => {
142
- vi.restoreAllMocks();
143
- });
144
-
145
- describe('loadSettings', () => {
146
- it('should load empty settings if no files exist', () => {
147
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
148
- expect(settings.system.settings).toEqual({});
149
- expect(settings.user.settings).toEqual({});
150
- expect(settings.workspace.settings).toEqual({});
151
- expect(settings.merged).toEqual({});
152
- });
153
-
154
- it('should load system settings if only system file exists', () => {
155
- (mockFsExistsSync as Mock).mockImplementation(
156
- (p: fs.PathLike) => p === getSystemSettingsPath(),
157
- );
158
- const systemSettingsContent = {
159
- ui: {
160
- theme: 'system-default',
161
- },
162
- tools: {
163
- sandbox: false,
164
- },
165
- };
166
- (fs.readFileSync as Mock).mockImplementation(
167
- (p: fs.PathOrFileDescriptor) => {
168
- if (p === getSystemSettingsPath())
169
- return JSON.stringify(systemSettingsContent);
170
- return '{}';
171
- },
172
- );
173
-
174
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
175
-
176
- expect(fs.readFileSync).toHaveBeenCalledWith(
177
- getSystemSettingsPath(),
178
- 'utf-8',
179
- );
180
- expect(settings.system.settings).toEqual({
181
- ...systemSettingsContent,
182
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
183
- });
184
- expect(settings.user.settings).toEqual({});
185
- expect(settings.workspace.settings).toEqual({});
186
- expect(settings.merged).toEqual({
187
- ...systemSettingsContent,
188
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
189
- });
190
- });
191
-
192
- it('should load user settings if only user file exists', () => {
193
- const expectedUserSettingsPath = USER_SETTINGS_PATH; // Use the path actually resolved by the (mocked) module
194
-
195
- (mockFsExistsSync as Mock).mockImplementation(
196
- (p: fs.PathLike) => p === expectedUserSettingsPath,
197
- );
198
- const userSettingsContent = {
199
- ui: {
200
- theme: 'dark',
201
- },
202
- context: {
203
- fileName: 'USER_CONTEXT.md',
204
- },
205
- };
206
- (fs.readFileSync as Mock).mockImplementation(
207
- (p: fs.PathOrFileDescriptor) => {
208
- if (p === expectedUserSettingsPath)
209
- return JSON.stringify(userSettingsContent);
210
- return '{}';
211
- },
212
- );
213
-
214
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
215
-
216
- expect(fs.readFileSync).toHaveBeenCalledWith(
217
- expectedUserSettingsPath,
218
- 'utf-8',
219
- );
220
- expect(settings.user.settings).toEqual({
221
- ...userSettingsContent,
222
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
223
- });
224
- expect(settings.workspace.settings).toEqual({});
225
- expect(settings.merged).toEqual({
226
- ...userSettingsContent,
227
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
228
- });
229
- });
230
-
231
- it('should load workspace settings if only workspace file exists', () => {
232
- (mockFsExistsSync as Mock).mockImplementation(
233
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
234
- );
235
- const workspaceSettingsContent = {
236
- tools: {
237
- sandbox: true,
238
- },
239
- context: {
240
- fileName: 'WORKSPACE_CONTEXT.md',
241
- },
242
- };
243
- (fs.readFileSync as Mock).mockImplementation(
244
- (p: fs.PathOrFileDescriptor) => {
245
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
246
- return JSON.stringify(workspaceSettingsContent);
247
- return '';
248
- },
249
- );
250
-
251
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
252
-
253
- expect(fs.readFileSync).toHaveBeenCalledWith(
254
- MOCK_WORKSPACE_SETTINGS_PATH,
255
- 'utf-8',
256
- );
257
- expect(settings.user.settings).toEqual({});
258
- expect(settings.workspace.settings).toEqual({
259
- ...workspaceSettingsContent,
260
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
261
- });
262
- expect(settings.merged).toEqual({
263
- ...workspaceSettingsContent,
264
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
265
- });
266
- });
267
-
268
- it('should merge system, user and workspace settings, with system taking precedence over workspace, and workspace over user', () => {
269
- (mockFsExistsSync as Mock).mockImplementation(
270
- (p: fs.PathLike) =>
271
- p === getSystemSettingsPath() ||
272
- p === USER_SETTINGS_PATH ||
273
- p === MOCK_WORKSPACE_SETTINGS_PATH,
274
- );
275
- const systemSettingsContent = {
276
- ui: {
277
- theme: 'system-theme',
278
- },
279
- tools: {
280
- sandbox: false,
281
- },
282
- mcp: {
283
- allowed: ['server1', 'server2'],
284
- },
285
- telemetry: { enabled: false },
286
- };
287
- const userSettingsContent = {
288
- ui: {
289
- theme: 'dark',
290
- },
291
- tools: {
292
- sandbox: true,
293
- },
294
- context: {
295
- fileName: 'USER_CONTEXT.md',
296
- },
297
- };
298
- const workspaceSettingsContent = {
299
- tools: {
300
- sandbox: false,
301
- core: ['tool1'],
302
- },
303
- context: {
304
- fileName: 'WORKSPACE_CONTEXT.md',
305
- },
306
- mcp: {
307
- allowed: ['server1', 'server2', 'server3'],
308
- },
309
- };
310
-
311
- (fs.readFileSync as Mock).mockImplementation(
312
- (p: fs.PathOrFileDescriptor) => {
313
- if (p === getSystemSettingsPath())
314
- return JSON.stringify(systemSettingsContent);
315
- if (p === USER_SETTINGS_PATH)
316
- return JSON.stringify(userSettingsContent);
317
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
318
- return JSON.stringify(workspaceSettingsContent);
319
- return '';
320
- },
321
- );
322
-
323
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
324
-
325
- expect(settings.system.settings).toEqual({
326
- ...systemSettingsContent,
327
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
328
- });
329
- expect(settings.user.settings).toEqual({
330
- ...userSettingsContent,
331
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
332
- });
333
- expect(settings.workspace.settings).toEqual({
334
- ...workspaceSettingsContent,
335
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
336
- });
337
- expect(settings.merged).toEqual({
338
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
339
- ui: {
340
- theme: 'system-theme',
341
- },
342
- tools: {
343
- sandbox: false,
344
- core: ['tool1'],
345
- },
346
- telemetry: { enabled: false },
347
- context: {
348
- fileName: 'WORKSPACE_CONTEXT.md',
349
- },
350
- mcp: {
351
- allowed: ['server1', 'server2'],
352
- },
353
- });
354
- });
355
-
356
- it('should correctly migrate a complex legacy (v1) settings file', () => {
357
- (mockFsExistsSync as Mock).mockImplementation(
358
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
359
- );
360
- const legacySettingsContent = {
361
- theme: 'legacy-dark',
362
- vimMode: true,
363
- contextFileName: 'LEGACY_CONTEXT.md',
364
- model: 'gemini-pro',
365
- mcpServers: {
366
- 'legacy-server-1': {
367
- command: 'npm',
368
- args: ['run', 'start:server1'],
369
- description: 'Legacy Server 1',
370
- },
371
- 'legacy-server-2': {
372
- command: 'node',
373
- args: ['server2.js'],
374
- description: 'Legacy Server 2',
375
- },
376
- },
377
- allowMCPServers: ['legacy-server-1'],
378
- someUnrecognizedSetting: 'should-be-preserved',
379
- };
380
-
381
- (fs.readFileSync as Mock).mockImplementation(
382
- (p: fs.PathOrFileDescriptor) => {
383
- if (p === USER_SETTINGS_PATH)
384
- return JSON.stringify(legacySettingsContent);
385
- return '{}';
386
- },
387
- );
388
-
389
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
390
-
391
- expect(settings.merged).toEqual({
392
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
393
- ui: {
394
- theme: 'legacy-dark',
395
- },
396
- general: {
397
- vimMode: true,
398
- },
399
- context: {
400
- fileName: 'LEGACY_CONTEXT.md',
401
- },
402
- model: {
403
- name: 'gemini-pro',
404
- },
405
- mcpServers: {
406
- 'legacy-server-1': {
407
- command: 'npm',
408
- args: ['run', 'start:server1'],
409
- description: 'Legacy Server 1',
410
- },
411
- 'legacy-server-2': {
412
- command: 'node',
413
- args: ['server2.js'],
414
- description: 'Legacy Server 2',
415
- },
416
- },
417
- mcp: {
418
- allowed: ['legacy-server-1'],
419
- },
420
- someUnrecognizedSetting: 'should-be-preserved',
421
- });
422
- });
423
-
424
- it('should warn about ignored legacy keys in a v2 settings file', () => {
425
- (mockFsExistsSync as Mock).mockImplementation(
426
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
427
- );
428
- const userSettingsContent = {
429
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
430
- usageStatisticsEnabled: false,
431
- };
432
- (fs.readFileSync as Mock).mockImplementation(
433
- (p: fs.PathOrFileDescriptor) => {
434
- if (p === USER_SETTINGS_PATH)
435
- return JSON.stringify(userSettingsContent);
436
- return '{}';
437
- },
438
- );
439
-
440
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
441
-
442
- expect(getSettingsWarnings(settings)).toEqual(
443
- expect.arrayContaining([
444
- expect.stringContaining(
445
- "Legacy setting 'usageStatisticsEnabled' will be ignored",
446
- ),
447
- ]),
448
- );
449
- expect(getSettingsWarnings(settings)).toEqual(
450
- expect.arrayContaining([
451
- expect.stringContaining("'privacy.usageStatisticsEnabled'"),
452
- ]),
453
- );
454
- });
455
-
456
- it('should silently ignore unknown top-level keys in a v2 settings file', () => {
457
- (mockFsExistsSync as Mock).mockImplementation(
458
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
459
- );
460
- const userSettingsContent = {
461
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
462
- someUnknownKey: 'value',
463
- };
464
- (fs.readFileSync as Mock).mockImplementation(
465
- (p: fs.PathOrFileDescriptor) => {
466
- if (p === USER_SETTINGS_PATH)
467
- return JSON.stringify(userSettingsContent);
468
- return '{}';
469
- },
470
- );
471
-
472
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
473
-
474
- expect(getSettingsWarnings(settings)).toEqual([]);
475
- });
476
-
477
- it('should not warn for valid v2 container keys', () => {
478
- (mockFsExistsSync as Mock).mockImplementation(
479
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
480
- );
481
- const userSettingsContent = {
482
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
483
- model: { name: 'qwen-coder' },
484
- };
485
- (fs.readFileSync as Mock).mockImplementation(
486
- (p: fs.PathOrFileDescriptor) => {
487
- if (p === USER_SETTINGS_PATH)
488
- return JSON.stringify(userSettingsContent);
489
- return '{}';
490
- },
491
- );
492
-
493
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
494
-
495
- expect(getSettingsWarnings(settings)).toEqual([]);
496
- });
497
-
498
- it('should rewrite allowedTools to tools.allowed during migration', () => {
499
- (mockFsExistsSync as Mock).mockImplementation(
500
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
501
- );
502
- const legacySettingsContent = {
503
- allowedTools: ['fs', 'shell'],
504
- };
505
- (fs.readFileSync as Mock).mockImplementation(
506
- (p: fs.PathOrFileDescriptor) => {
507
- if (p === USER_SETTINGS_PATH)
508
- return JSON.stringify(legacySettingsContent);
509
- return '{}';
510
- },
511
- );
512
-
513
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
514
-
515
- expect(settings.merged.tools?.allowed).toEqual(['fs', 'shell']);
516
- expect((settings.merged as TestSettings)['allowedTools']).toBeUndefined();
517
- });
518
-
519
- it('should add version field to migrated settings file', () => {
520
- (mockFsExistsSync as Mock).mockImplementation(
521
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
522
- );
523
- const legacySettingsContent = {
524
- theme: 'dark',
525
- model: 'qwen-coder',
526
- };
527
- (fs.readFileSync as Mock).mockImplementation(
528
- (p: fs.PathOrFileDescriptor) => {
529
- if (p === USER_SETTINGS_PATH)
530
- return JSON.stringify(legacySettingsContent);
531
- return '{}';
532
- },
533
- );
534
-
535
- loadSettings(MOCK_WORKSPACE_DIR);
536
-
537
- // Verify that fs.writeFileSync was called with migrated settings including version
538
- expect(fs.writeFileSync).toHaveBeenCalled();
539
- const writeCall = (fs.writeFileSync as Mock).mock.calls[0];
540
- const writtenContent = JSON.parse(writeCall[1] as string);
541
- expect(writtenContent[SETTINGS_VERSION_KEY]).toBe(SETTINGS_VERSION);
542
- });
543
-
544
- it('should not re-migrate settings that have version field', () => {
545
- (mockFsExistsSync as Mock).mockImplementation(
546
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
547
- );
548
- const migratedSettingsContent = {
549
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
550
- ui: {
551
- theme: 'dark',
552
- },
553
- model: {
554
- name: 'qwen-coder',
555
- },
556
- };
557
- (fs.readFileSync as Mock).mockImplementation(
558
- (p: fs.PathOrFileDescriptor) => {
559
- if (p === USER_SETTINGS_PATH)
560
- return JSON.stringify(migratedSettingsContent);
561
- return '{}';
562
- },
563
- );
564
-
565
- loadSettings(MOCK_WORKSPACE_DIR);
566
-
567
- // Verify that fs.renameSync and fs.writeFileSync were NOT called
568
- // (because no migration was needed)
569
- expect(fs.renameSync).not.toHaveBeenCalled();
570
- expect(fs.writeFileSync).not.toHaveBeenCalled();
571
- });
572
-
573
- it('should add version field to V2 settings without version and write to disk', () => {
574
- (mockFsExistsSync as Mock).mockImplementation(
575
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
576
- );
577
- // V2 format but no version field
578
- const v2SettingsWithoutVersion = {
579
- ui: {
580
- theme: 'dark',
581
- },
582
- model: {
583
- name: 'qwen-coder',
584
- },
585
- };
586
- (fs.readFileSync as Mock).mockImplementation(
587
- (p: fs.PathOrFileDescriptor) => {
588
- if (p === USER_SETTINGS_PATH)
589
- return JSON.stringify(v2SettingsWithoutVersion);
590
- return '{}';
591
- },
592
- );
593
-
594
- loadSettings(MOCK_WORKSPACE_DIR);
595
-
596
- // Version normalization now uses writeWithBackupSync (temp write + rename)
597
- // Verify that writeFileSync was called with the temp file path
598
- const writeCall = (fs.writeFileSync as Mock).mock.calls.find(
599
- (call: unknown[]) => call[0] === `${USER_SETTINGS_PATH}.tmp`,
600
- );
601
- expect(writeCall).toBeDefined();
602
- if (!writeCall) {
603
- throw new Error('Expected temp write call for version normalization');
604
- }
605
- const writtenContent = JSON.parse(writeCall[1] as string);
606
-
607
- expect(writtenContent[SETTINGS_VERSION_KEY]).toBe(SETTINGS_VERSION);
608
- expect(writtenContent.ui?.theme).toBe('dark');
609
- expect(writtenContent.model?.name).toBe('qwen-coder');
610
- // Verify writeWithBackupSync was called by checking temp file write
611
- expect(fs.writeFileSync).toHaveBeenCalled();
612
- });
613
-
614
- it('should correctly handle partially migrated settings without version field', () => {
615
- (mockFsExistsSync as Mock).mockImplementation(
616
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
617
- );
618
- // Edge case: model already in V2 format (object), but autoAccept in V1 format
619
- const partiallyMigratedContent = {
620
- model: {
621
- name: 'qwen-coder',
622
- },
623
- autoAccept: false, // V1 key
624
- };
625
- (fs.readFileSync as Mock).mockImplementation(
626
- (p: fs.PathOrFileDescriptor) => {
627
- if (p === USER_SETTINGS_PATH)
628
- return JSON.stringify(partiallyMigratedContent);
629
- return '{}';
630
- },
631
- );
632
-
633
- loadSettings(MOCK_WORKSPACE_DIR);
634
-
635
- // Verify that the migrated settings preserve the model object correctly
636
- expect(fs.writeFileSync).toHaveBeenCalled();
637
- const writeCall = (fs.writeFileSync as Mock).mock.calls[0];
638
- const writtenContent = JSON.parse(writeCall[1] as string);
639
-
640
- // Model should remain as an object, not double-nested
641
- expect(writtenContent.model).toEqual({ name: 'qwen-coder' });
642
- // autoAccept should be migrated to tools.autoAccept
643
- expect(writtenContent.tools?.autoAccept).toBe(false);
644
- // Version field should be added
645
- expect(writtenContent[SETTINGS_VERSION_KEY]).toBe(SETTINGS_VERSION);
646
- });
647
-
648
- it('should consolidate disableAutoUpdate and disableUpdateNag - both false means enableAutoUpdate is true', () => {
649
- (mockFsExistsSync as Mock).mockImplementation(
650
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
651
- );
652
- // V1 settings with both disable* settings as false
653
- const legacySettingsContent = {
654
- disableAutoUpdate: false,
655
- disableUpdateNag: false,
656
- };
657
- (fs.readFileSync as Mock).mockImplementation(
658
- (p: fs.PathOrFileDescriptor) => {
659
- if (p === USER_SETTINGS_PATH)
660
- return JSON.stringify(legacySettingsContent);
661
- return '{}';
662
- },
663
- );
664
-
665
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
666
-
667
- // Both are false, so enableAutoUpdate should be true
668
- expect(settings.merged.general?.enableAutoUpdate).toBe(true);
669
- });
670
-
671
- it('should consolidate disableAutoUpdate and disableUpdateNag - any true means enableAutoUpdate is false', () => {
672
- (mockFsExistsSync as Mock).mockImplementation(
673
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
674
- );
675
- // V1 settings with disableAutoUpdate=false but disableUpdateNag=true
676
- const legacySettingsContent = {
677
- disableAutoUpdate: false,
678
- disableUpdateNag: true,
679
- };
680
- (fs.readFileSync as Mock).mockImplementation(
681
- (p: fs.PathOrFileDescriptor) => {
682
- if (p === USER_SETTINGS_PATH)
683
- return JSON.stringify(legacySettingsContent);
684
- return '{}';
685
- },
686
- );
687
-
688
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
689
-
690
- // disableUpdateNag is true, so enableAutoUpdate should be false
691
- expect(settings.merged.general?.enableAutoUpdate).toBe(false);
692
- });
693
-
694
- it('should consolidate disableAutoUpdate and disableUpdateNag - disableAutoUpdate=true takes precedence', () => {
695
- (mockFsExistsSync as Mock).mockImplementation(
696
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
697
- );
698
- // V1 settings with disableAutoUpdate=true
699
- const legacySettingsContent = {
700
- disableAutoUpdate: true,
701
- disableUpdateNag: false,
702
- };
703
- (fs.readFileSync as Mock).mockImplementation(
704
- (p: fs.PathOrFileDescriptor) => {
705
- if (p === USER_SETTINGS_PATH)
706
- return JSON.stringify(legacySettingsContent);
707
- return '{}';
708
- },
709
- );
710
-
711
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
712
-
713
- // disableAutoUpdate is true, so enableAutoUpdate should be false
714
- expect(settings.merged.general?.enableAutoUpdate).toBe(false);
715
- });
716
-
717
- it('should bump version to 3 even when V2 settings already have V3-compatible content', () => {
718
- (mockFsExistsSync as Mock).mockImplementation(
719
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
720
- );
721
- // V2 settings that already have V3-compatible keys (no migration needed)
722
- const v2SettingsWithV3Content = {
723
- $version: 2,
724
- general: {
725
- enableAutoUpdate: true,
726
- },
727
- };
728
- (fs.readFileSync as Mock).mockImplementation(
729
- (p: fs.PathOrFileDescriptor) => {
730
- if (p === USER_SETTINGS_PATH)
731
- return JSON.stringify(v2SettingsWithV3Content);
732
- return '{}';
733
- },
734
- );
735
-
736
- loadSettings(MOCK_WORKSPACE_DIR);
737
-
738
- // Version should be bumped to 3 even though no keys needed migration
739
- // writeWithBackupSync writes to a temp file first, then renames
740
- const writeCall = (fs.writeFileSync as Mock).mock.calls.find(
741
- (call: unknown[]) => call[0] === `${USER_SETTINGS_PATH}.tmp`,
742
- );
743
- expect(writeCall).toBeDefined();
744
- if (!writeCall) {
745
- throw new Error('Expected temp write call for V2->V3 version bump');
746
- }
747
- const writtenContent = JSON.parse(writeCall[1] as string);
748
- expect(writtenContent.$version).toBe(SETTINGS_VERSION);
749
- });
750
-
751
- it('should normalize invalid version metadata when no migration is applicable', () => {
752
- (mockFsExistsSync as Mock).mockImplementation(
753
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
754
- );
755
- const invalidVersionSettings = {
756
- $version: 'invalid-version',
757
- general: {
758
- enableAutoUpdate: true,
759
- },
760
- };
761
- (fs.readFileSync as Mock).mockImplementation(
762
- (p: fs.PathOrFileDescriptor) => {
763
- if (p === USER_SETTINGS_PATH)
764
- return JSON.stringify(invalidVersionSettings);
765
- return '{}';
766
- },
767
- );
768
-
769
- loadSettings(MOCK_WORKSPACE_DIR);
770
-
771
- const writeCall = (fs.writeFileSync as Mock).mock.calls.find(
772
- (call: unknown[]) => call[0] === `${USER_SETTINGS_PATH}.tmp`,
773
- );
774
- expect(writeCall).toBeDefined();
775
- if (!writeCall) {
776
- throw new Error(
777
- 'Expected temp write call for invalid version normalization',
778
- );
779
- }
780
- const writtenContent = JSON.parse(writeCall[1] as string);
781
- expect(writtenContent.$version).toBe(SETTINGS_VERSION);
782
- expect(writtenContent.general?.enableAutoUpdate).toBe(true);
783
- });
784
-
785
- it('should normalize legacy numeric version when no migration can execute', () => {
786
- (mockFsExistsSync as Mock).mockImplementation(
787
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
788
- );
789
- const staleVersionSettings = {
790
- $version: 1,
791
- // No V1/V2 indicators recognized by migrations
792
- customOnlyKey: 'value',
793
- };
794
- (fs.readFileSync as Mock).mockImplementation(
795
- (p: fs.PathOrFileDescriptor) => {
796
- if (p === USER_SETTINGS_PATH)
797
- return JSON.stringify(staleVersionSettings);
798
- return '{}';
799
- },
800
- );
801
-
802
- loadSettings(MOCK_WORKSPACE_DIR);
803
-
804
- const writeCall = (fs.writeFileSync as Mock).mock.calls.find(
805
- (call: unknown[]) => call[0] === `${USER_SETTINGS_PATH}.tmp`,
806
- );
807
- expect(writeCall).toBeDefined();
808
- if (!writeCall) {
809
- throw new Error(
810
- 'Expected temp write call for stale version normalization',
811
- );
812
- }
813
- const writtenContent = JSON.parse(writeCall[1] as string);
814
- expect(writtenContent.$version).toBe(SETTINGS_VERSION);
815
- expect(writtenContent.customOnlyKey).toBe('value');
816
- });
817
-
818
- it('should correctly merge and migrate legacy array properties from multiple scopes', () => {
819
- (mockFsExistsSync as Mock).mockReturnValue(true);
820
- const legacyUserSettings = {
821
- includeDirectories: ['/user/dir'],
822
- excludeTools: ['user-tool'],
823
- excludedProjectEnvVars: ['USER_VAR'],
824
- };
825
- const legacyWorkspaceSettings = {
826
- includeDirectories: ['/workspace/dir'],
827
- excludeTools: ['workspace-tool'],
828
- excludedProjectEnvVars: ['WORKSPACE_VAR', 'USER_VAR'],
829
- };
830
-
831
- (fs.readFileSync as Mock).mockImplementation(
832
- (p: fs.PathOrFileDescriptor) => {
833
- if (p === USER_SETTINGS_PATH)
834
- return JSON.stringify(legacyUserSettings);
835
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
836
- return JSON.stringify(legacyWorkspaceSettings);
837
- return '{}';
838
- },
839
- );
840
-
841
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
842
-
843
- // Verify includeDirectories are concatenated
844
- expect(settings.merged.context?.includeDirectories).toEqual([
845
- '/user/dir',
846
- '/workspace/dir',
847
- ]);
848
-
849
- // Verify excludeTools are concatenated and de-duped
850
- expect(settings.merged.tools?.exclude).toEqual([
851
- 'user-tool',
852
- 'workspace-tool',
853
- ]);
854
-
855
- // Verify excludedProjectEnvVars are concatenated and de-duped
856
- expect(settings.merged.advanced?.excludedEnvVars).toEqual(
857
- expect.arrayContaining(['USER_VAR', 'WORKSPACE_VAR']),
858
- );
859
- expect(settings.merged.advanced?.excludedEnvVars).toHaveLength(2);
860
- });
861
-
862
- it('should merge all settings files with the correct precedence', () => {
863
- (mockFsExistsSync as Mock).mockReturnValue(true);
864
- const systemDefaultsContent = {
865
- ui: {
866
- theme: 'default-theme',
867
- },
868
- tools: {
869
- sandbox: true,
870
- },
871
- telemetry: true,
872
- context: {
873
- includeDirectories: ['/system/defaults/dir'],
874
- },
875
- };
876
- const userSettingsContent = {
877
- ui: {
878
- theme: 'user-theme',
879
- },
880
- context: {
881
- fileName: 'USER_CONTEXT.md',
882
- includeDirectories: ['/user/dir1', '/user/dir2'],
883
- },
884
- };
885
- const workspaceSettingsContent = {
886
- tools: {
887
- sandbox: false,
888
- },
889
- context: {
890
- fileName: 'WORKSPACE_CONTEXT.md',
891
- includeDirectories: ['/workspace/dir'],
892
- },
893
- };
894
- const systemSettingsContent = {
895
- ui: {
896
- theme: 'system-theme',
897
- },
898
- telemetry: false,
899
- context: {
900
- includeDirectories: ['/system/dir'],
901
- },
902
- };
903
-
904
- (fs.readFileSync as Mock).mockImplementation(
905
- (p: fs.PathOrFileDescriptor) => {
906
- if (p === getSystemDefaultsPath())
907
- return JSON.stringify(systemDefaultsContent);
908
- if (p === getSystemSettingsPath())
909
- return JSON.stringify(systemSettingsContent);
910
- if (p === USER_SETTINGS_PATH)
911
- return JSON.stringify(userSettingsContent);
912
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
913
- return JSON.stringify(workspaceSettingsContent);
914
- return '';
915
- },
916
- );
917
-
918
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
919
-
920
- expect(settings.systemDefaults.settings).toEqual({
921
- ...systemDefaultsContent,
922
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
923
- });
924
- expect(settings.system.settings).toEqual({
925
- ...systemSettingsContent,
926
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
927
- });
928
- expect(settings.user.settings).toEqual({
929
- ...userSettingsContent,
930
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
931
- });
932
- expect(settings.workspace.settings).toEqual({
933
- ...workspaceSettingsContent,
934
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
935
- });
936
- expect(settings.merged).toEqual({
937
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
938
- context: {
939
- fileName: 'WORKSPACE_CONTEXT.md',
940
- includeDirectories: [
941
- '/system/defaults/dir',
942
- '/user/dir1',
943
- '/user/dir2',
944
- '/workspace/dir',
945
- '/system/dir',
946
- ],
947
- },
948
- telemetry: false,
949
- tools: {
950
- sandbox: false,
951
- },
952
- ui: {
953
- theme: 'system-theme',
954
- },
955
- });
956
- });
957
-
958
- it('should use folderTrust from workspace settings when trusted', () => {
959
- (mockFsExistsSync as Mock).mockReturnValue(true);
960
- const userSettingsContent = {
961
- security: {
962
- folderTrust: {
963
- enabled: true,
964
- },
965
- },
966
- };
967
- const workspaceSettingsContent = {
968
- security: {
969
- folderTrust: {
970
- enabled: false, // This should be used
971
- },
972
- },
973
- };
974
- const systemSettingsContent = {
975
- // No folderTrust here
976
- };
977
-
978
- (fs.readFileSync as Mock).mockImplementation(
979
- (p: fs.PathOrFileDescriptor) => {
980
- if (p === getSystemSettingsPath())
981
- return JSON.stringify(systemSettingsContent);
982
- if (p === USER_SETTINGS_PATH)
983
- return JSON.stringify(userSettingsContent);
984
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
985
- return JSON.stringify(workspaceSettingsContent);
986
- return '{}';
987
- },
988
- );
989
-
990
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
991
- expect(settings.merged.security?.folderTrust?.enabled).toBe(false); // Workspace setting should be used
992
- });
993
-
994
- it('should use system folderTrust over user setting', () => {
995
- (mockFsExistsSync as Mock).mockReturnValue(true);
996
- const userSettingsContent = {
997
- security: {
998
- folderTrust: {
999
- enabled: false,
1000
- },
1001
- },
1002
- };
1003
- const workspaceSettingsContent = {
1004
- security: {
1005
- folderTrust: {
1006
- enabled: true, // This should be ignored
1007
- },
1008
- },
1009
- };
1010
- const systemSettingsContent = {
1011
- security: {
1012
- folderTrust: {
1013
- enabled: true,
1014
- },
1015
- },
1016
- };
1017
-
1018
- (fs.readFileSync as Mock).mockImplementation(
1019
- (p: fs.PathOrFileDescriptor) => {
1020
- if (p === getSystemSettingsPath())
1021
- return JSON.stringify(systemSettingsContent);
1022
- if (p === USER_SETTINGS_PATH)
1023
- return JSON.stringify(userSettingsContent);
1024
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1025
- return JSON.stringify(workspaceSettingsContent);
1026
- return '{}';
1027
- },
1028
- );
1029
-
1030
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1031
- expect(settings.merged.security?.folderTrust?.enabled).toBe(true); // System setting should be used
1032
- });
1033
-
1034
- it('should handle contextFileName correctly when only in user settings', () => {
1035
- (mockFsExistsSync as Mock).mockImplementation(
1036
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1037
- );
1038
- const userSettingsContent = { context: { fileName: 'CUSTOM.md' } };
1039
- (fs.readFileSync as Mock).mockImplementation(
1040
- (p: fs.PathOrFileDescriptor) => {
1041
- if (p === USER_SETTINGS_PATH)
1042
- return JSON.stringify(userSettingsContent);
1043
- return '';
1044
- },
1045
- );
1046
-
1047
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1048
- expect(settings.merged.context?.fileName).toBe('CUSTOM.md');
1049
- });
1050
-
1051
- it('should handle contextFileName correctly when only in workspace settings', () => {
1052
- (mockFsExistsSync as Mock).mockImplementation(
1053
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
1054
- );
1055
- const workspaceSettingsContent = {
1056
- context: { fileName: 'PROJECT_SPECIFIC.md' },
1057
- };
1058
- (fs.readFileSync as Mock).mockImplementation(
1059
- (p: fs.PathOrFileDescriptor) => {
1060
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1061
- return JSON.stringify(workspaceSettingsContent);
1062
- return '';
1063
- },
1064
- );
1065
-
1066
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1067
- expect(settings.merged.context?.fileName).toBe('PROJECT_SPECIFIC.md');
1068
- });
1069
-
1070
- it('should handle excludedProjectEnvVars correctly when only in user settings', () => {
1071
- (mockFsExistsSync as Mock).mockImplementation(
1072
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1073
- );
1074
- const userSettingsContent = {
1075
- general: {},
1076
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'] },
1077
- };
1078
- (fs.readFileSync as Mock).mockImplementation(
1079
- (p: fs.PathOrFileDescriptor) => {
1080
- if (p === USER_SETTINGS_PATH)
1081
- return JSON.stringify(userSettingsContent);
1082
- return '';
1083
- },
1084
- );
1085
-
1086
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1087
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1088
- 'DEBUG',
1089
- 'NODE_ENV',
1090
- 'CUSTOM_VAR',
1091
- ]);
1092
- });
1093
-
1094
- it('should handle excludedProjectEnvVars correctly when only in workspace settings', () => {
1095
- (mockFsExistsSync as Mock).mockImplementation(
1096
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
1097
- );
1098
- const workspaceSettingsContent = {
1099
- general: {},
1100
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
1101
- };
1102
- (fs.readFileSync as Mock).mockImplementation(
1103
- (p: fs.PathOrFileDescriptor) => {
1104
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1105
- return JSON.stringify(workspaceSettingsContent);
1106
- return '';
1107
- },
1108
- );
1109
-
1110
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1111
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1112
- 'WORKSPACE_DEBUG',
1113
- 'WORKSPACE_VAR',
1114
- ]);
1115
- });
1116
-
1117
- it('should merge excludedProjectEnvVars with workspace taking precedence over user', () => {
1118
- (mockFsExistsSync as Mock).mockImplementation(
1119
- (p: fs.PathLike) =>
1120
- p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH,
1121
- );
1122
- const userSettingsContent = {
1123
- general: {},
1124
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'] },
1125
- };
1126
- const workspaceSettingsContent = {
1127
- general: {},
1128
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
1129
- };
1130
-
1131
- (fs.readFileSync as Mock).mockImplementation(
1132
- (p: fs.PathOrFileDescriptor) => {
1133
- if (p === USER_SETTINGS_PATH)
1134
- return JSON.stringify(userSettingsContent);
1135
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1136
- return JSON.stringify(workspaceSettingsContent);
1137
- return '';
1138
- },
1139
- );
1140
-
1141
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1142
-
1143
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
1144
- 'DEBUG',
1145
- 'NODE_ENV',
1146
- 'USER_VAR',
1147
- ]);
1148
- expect(settings.workspace.settings.advanced?.excludedEnvVars).toEqual([
1149
- 'WORKSPACE_DEBUG',
1150
- 'WORKSPACE_VAR',
1151
- ]);
1152
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
1153
- 'DEBUG',
1154
- 'NODE_ENV',
1155
- 'USER_VAR',
1156
- 'WORKSPACE_DEBUG',
1157
- 'WORKSPACE_VAR',
1158
- ]);
1159
- });
1160
-
1161
- it('should default contextFileName to undefined if not in any settings file', () => {
1162
- (mockFsExistsSync as Mock).mockImplementation(
1163
- (p: fs.PathLike) =>
1164
- p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH,
1165
- );
1166
- const userSettingsContent = { ui: { theme: 'dark' } };
1167
- const workspaceSettingsContent = { tools: { sandbox: true } };
1168
- (fs.readFileSync as Mock).mockImplementation(
1169
- (p: fs.PathOrFileDescriptor) => {
1170
- if (p === USER_SETTINGS_PATH)
1171
- return JSON.stringify(userSettingsContent);
1172
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1173
- return JSON.stringify(workspaceSettingsContent);
1174
- return '';
1175
- },
1176
- );
1177
-
1178
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1179
- expect(settings.merged.context?.fileName).toBeUndefined();
1180
- });
1181
-
1182
- it('should load telemetry setting from user settings', () => {
1183
- (mockFsExistsSync as Mock).mockImplementation(
1184
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1185
- );
1186
- const userSettingsContent = { telemetry: { enabled: true } };
1187
- (fs.readFileSync as Mock).mockImplementation(
1188
- (p: fs.PathOrFileDescriptor) => {
1189
- if (p === USER_SETTINGS_PATH)
1190
- return JSON.stringify(userSettingsContent);
1191
- return '{}';
1192
- },
1193
- );
1194
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1195
- expect(settings.merged.telemetry?.enabled).toBe(true);
1196
- });
1197
-
1198
- it('should load telemetry setting from workspace settings', () => {
1199
- (mockFsExistsSync as Mock).mockImplementation(
1200
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
1201
- );
1202
- const workspaceSettingsContent = { telemetry: { enabled: false } };
1203
- (fs.readFileSync as Mock).mockImplementation(
1204
- (p: fs.PathOrFileDescriptor) => {
1205
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1206
- return JSON.stringify(workspaceSettingsContent);
1207
- return '{}';
1208
- },
1209
- );
1210
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1211
- expect(settings.merged.telemetry?.enabled).toBe(false);
1212
- });
1213
-
1214
- it('should prioritize workspace telemetry setting over user setting', () => {
1215
- (mockFsExistsSync as Mock).mockReturnValue(true);
1216
- const userSettingsContent = { telemetry: { enabled: true } };
1217
- const workspaceSettingsContent = { telemetry: { enabled: false } };
1218
- (fs.readFileSync as Mock).mockImplementation(
1219
- (p: fs.PathOrFileDescriptor) => {
1220
- if (p === USER_SETTINGS_PATH)
1221
- return JSON.stringify(userSettingsContent);
1222
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1223
- return JSON.stringify(workspaceSettingsContent);
1224
- return '{}';
1225
- },
1226
- );
1227
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1228
- expect(settings.merged.telemetry?.enabled).toBe(false);
1229
- });
1230
-
1231
- it('should have telemetry as undefined if not in any settings file', () => {
1232
- (mockFsExistsSync as Mock).mockReturnValue(false); // No settings files exist
1233
- (fs.readFileSync as Mock).mockReturnValue('{}');
1234
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1235
- expect(settings.merged.telemetry).toBeUndefined();
1236
- expect(settings.merged.ui).toBeUndefined();
1237
- expect(settings.merged.mcpServers).toBeUndefined();
1238
- });
1239
-
1240
- it('should merge MCP servers correctly, with workspace taking precedence', () => {
1241
- (mockFsExistsSync as Mock).mockImplementation(
1242
- (p: fs.PathLike) =>
1243
- p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH,
1244
- );
1245
- const userSettingsContent = {
1246
- mcpServers: {
1247
- 'user-server': {
1248
- command: 'user-command',
1249
- args: ['--user-arg'],
1250
- description: 'User MCP server',
1251
- },
1252
- 'shared-server': {
1253
- command: 'user-shared-command',
1254
- description: 'User shared server config',
1255
- },
1256
- },
1257
- };
1258
- const workspaceSettingsContent = {
1259
- mcpServers: {
1260
- 'workspace-server': {
1261
- command: 'workspace-command',
1262
- args: ['--workspace-arg'],
1263
- description: 'Workspace MCP server',
1264
- },
1265
- 'shared-server': {
1266
- command: 'workspace-shared-command',
1267
- description: 'Workspace shared server config',
1268
- },
1269
- },
1270
- };
1271
-
1272
- (fs.readFileSync as Mock).mockImplementation(
1273
- (p: fs.PathOrFileDescriptor) => {
1274
- if (p === USER_SETTINGS_PATH)
1275
- return JSON.stringify(userSettingsContent);
1276
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1277
- return JSON.stringify(workspaceSettingsContent);
1278
- return '';
1279
- },
1280
- );
1281
-
1282
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1283
-
1284
- expect(settings.user.settings).toEqual({
1285
- ...userSettingsContent,
1286
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
1287
- });
1288
- expect(settings.workspace.settings).toEqual({
1289
- ...workspaceSettingsContent,
1290
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
1291
- });
1292
- expect(settings.merged.mcpServers).toEqual({
1293
- 'user-server': {
1294
- command: 'user-command',
1295
- args: ['--user-arg'],
1296
- description: 'User MCP server',
1297
- },
1298
- 'workspace-server': {
1299
- command: 'workspace-command',
1300
- args: ['--workspace-arg'],
1301
- description: 'Workspace MCP server',
1302
- },
1303
- 'shared-server': {
1304
- command: 'workspace-shared-command',
1305
- description: 'Workspace shared server config',
1306
- },
1307
- });
1308
- });
1309
-
1310
- it('should handle MCP servers when only in user settings', () => {
1311
- (mockFsExistsSync as Mock).mockImplementation(
1312
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1313
- );
1314
- const userSettingsContent = {
1315
- mcpServers: {
1316
- 'user-only-server': {
1317
- command: 'user-only-command',
1318
- description: 'User only server',
1319
- },
1320
- },
1321
- };
1322
- (fs.readFileSync as Mock).mockImplementation(
1323
- (p: fs.PathOrFileDescriptor) => {
1324
- if (p === USER_SETTINGS_PATH)
1325
- return JSON.stringify(userSettingsContent);
1326
- return '';
1327
- },
1328
- );
1329
-
1330
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1331
- expect(settings.merged.mcpServers).toEqual({
1332
- 'user-only-server': {
1333
- command: 'user-only-command',
1334
- description: 'User only server',
1335
- },
1336
- });
1337
- });
1338
-
1339
- it('should handle MCP servers when only in workspace settings', () => {
1340
- (mockFsExistsSync as Mock).mockImplementation(
1341
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
1342
- );
1343
- const workspaceSettingsContent = {
1344
- mcpServers: {
1345
- 'workspace-only-server': {
1346
- command: 'workspace-only-command',
1347
- description: 'Workspace only server',
1348
- },
1349
- },
1350
- };
1351
- (fs.readFileSync as Mock).mockImplementation(
1352
- (p: fs.PathOrFileDescriptor) => {
1353
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1354
- return JSON.stringify(workspaceSettingsContent);
1355
- return '';
1356
- },
1357
- );
1358
-
1359
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1360
- expect(settings.merged.mcpServers).toEqual({
1361
- 'workspace-only-server': {
1362
- command: 'workspace-only-command',
1363
- description: 'Workspace only server',
1364
- },
1365
- });
1366
- });
1367
-
1368
- it('should have mcpServers as undefined if not in any settings file', () => {
1369
- (mockFsExistsSync as Mock).mockReturnValue(false); // No settings files exist
1370
- (fs.readFileSync as Mock).mockReturnValue('{}');
1371
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1372
- expect(settings.merged.mcpServers).toBeUndefined();
1373
- });
1374
-
1375
- it('should merge MCP servers from system, user, and workspace with system taking precedence', () => {
1376
- (mockFsExistsSync as Mock).mockReturnValue(true);
1377
- const systemSettingsContent = {
1378
- mcpServers: {
1379
- 'shared-server': {
1380
- command: 'system-command',
1381
- args: ['--system-arg'],
1382
- },
1383
- 'system-only-server': {
1384
- command: 'system-only-command',
1385
- },
1386
- },
1387
- };
1388
- const userSettingsContent = {
1389
- mcpServers: {
1390
- 'user-server': {
1391
- command: 'user-command',
1392
- },
1393
- 'shared-server': {
1394
- command: 'user-command',
1395
- description: 'from user',
1396
- },
1397
- },
1398
- };
1399
- const workspaceSettingsContent = {
1400
- mcpServers: {
1401
- 'workspace-server': {
1402
- command: 'workspace-command',
1403
- },
1404
- 'shared-server': {
1405
- command: 'workspace-command',
1406
- args: ['--workspace-arg'],
1407
- },
1408
- },
1409
- };
1410
-
1411
- (fs.readFileSync as Mock).mockImplementation(
1412
- (p: fs.PathOrFileDescriptor) => {
1413
- if (p === getSystemSettingsPath())
1414
- return JSON.stringify(systemSettingsContent);
1415
- if (p === USER_SETTINGS_PATH)
1416
- return JSON.stringify(userSettingsContent);
1417
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1418
- return JSON.stringify(workspaceSettingsContent);
1419
- return '{}';
1420
- },
1421
- );
1422
-
1423
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1424
-
1425
- expect(settings.merged.mcpServers).toEqual({
1426
- 'user-server': {
1427
- command: 'user-command',
1428
- },
1429
- 'workspace-server': {
1430
- command: 'workspace-command',
1431
- },
1432
- 'system-only-server': {
1433
- command: 'system-only-command',
1434
- },
1435
- 'shared-server': {
1436
- command: 'system-command',
1437
- args: ['--system-arg'],
1438
- },
1439
- });
1440
- });
1441
-
1442
- it('should merge mcp allowed/excluded lists with system taking precedence over workspace', () => {
1443
- (mockFsExistsSync as Mock).mockReturnValue(true);
1444
- const systemSettingsContent = {
1445
- mcp: {
1446
- allowed: ['system-allowed'],
1447
- },
1448
- };
1449
- const userSettingsContent = {
1450
- mcp: {
1451
- allowed: ['user-allowed'],
1452
- excluded: ['user-excluded'],
1453
- },
1454
- };
1455
- const workspaceSettingsContent = {
1456
- mcp: {
1457
- allowed: ['workspace-allowed'],
1458
- excluded: ['workspace-excluded'],
1459
- },
1460
- };
1461
-
1462
- (fs.readFileSync as Mock).mockImplementation(
1463
- (p: fs.PathOrFileDescriptor) => {
1464
- if (p === getSystemSettingsPath())
1465
- return JSON.stringify(systemSettingsContent);
1466
- if (p === USER_SETTINGS_PATH)
1467
- return JSON.stringify(userSettingsContent);
1468
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1469
- return JSON.stringify(workspaceSettingsContent);
1470
- return '{}';
1471
- },
1472
- );
1473
-
1474
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1475
-
1476
- expect(settings.merged.mcp).toEqual({
1477
- allowed: ['system-allowed'],
1478
- excluded: ['workspace-excluded'],
1479
- });
1480
- });
1481
-
1482
- it('should merge chatCompression settings, with workspace taking precedence', () => {
1483
- (mockFsExistsSync as Mock).mockReturnValue(true);
1484
- const userSettingsContent = {
1485
- general: {},
1486
- model: { chatCompression: { contextPercentageThreshold: 0.5 } },
1487
- };
1488
- const workspaceSettingsContent = {
1489
- general: {},
1490
- model: { chatCompression: { contextPercentageThreshold: 0.8 } },
1491
- };
1492
-
1493
- (fs.readFileSync as Mock).mockImplementation(
1494
- (p: fs.PathOrFileDescriptor) => {
1495
- if (p === USER_SETTINGS_PATH)
1496
- return JSON.stringify(userSettingsContent);
1497
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1498
- return JSON.stringify(workspaceSettingsContent);
1499
- return '{}';
1500
- },
1501
- );
1502
-
1503
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1504
- const e = settings.user.settings.model?.chatCompression;
1505
- console.log(e);
1506
-
1507
- expect(settings.user.settings.model?.chatCompression).toEqual({
1508
- contextPercentageThreshold: 0.5,
1509
- });
1510
- expect(settings.workspace.settings.model?.chatCompression).toEqual({
1511
- contextPercentageThreshold: 0.8,
1512
- });
1513
- expect(settings.merged.model?.chatCompression).toEqual({
1514
- contextPercentageThreshold: 0.8,
1515
- });
1516
- });
1517
-
1518
- it('should merge output format settings, with workspace taking precedence', () => {
1519
- (mockFsExistsSync as Mock).mockReturnValue(true);
1520
- const userSettingsContent = {
1521
- output: { format: 'text' },
1522
- };
1523
- const workspaceSettingsContent = {
1524
- output: { format: 'json' },
1525
- };
1526
-
1527
- (fs.readFileSync as Mock).mockImplementation(
1528
- (p: fs.PathOrFileDescriptor) => {
1529
- if (p === USER_SETTINGS_PATH)
1530
- return JSON.stringify(userSettingsContent);
1531
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1532
- return JSON.stringify(workspaceSettingsContent);
1533
- return '{}';
1534
- },
1535
- );
1536
-
1537
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1538
-
1539
- expect(settings.merged.output?.format).toBe('json');
1540
- });
1541
-
1542
- it('should handle chatCompression when only in user settings', () => {
1543
- (mockFsExistsSync as Mock).mockImplementation(
1544
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1545
- );
1546
- const userSettingsContent = {
1547
- general: {},
1548
- model: { chatCompression: { contextPercentageThreshold: 0.5 } },
1549
- };
1550
- (fs.readFileSync as Mock).mockImplementation(
1551
- (p: fs.PathOrFileDescriptor) => {
1552
- if (p === USER_SETTINGS_PATH)
1553
- return JSON.stringify(userSettingsContent);
1554
- return '{}';
1555
- },
1556
- );
1557
-
1558
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1559
- expect(settings.merged.model?.chatCompression).toEqual({
1560
- contextPercentageThreshold: 0.5,
1561
- });
1562
- });
1563
-
1564
- it('should have model as undefined if not in any settings file', () => {
1565
- (mockFsExistsSync as Mock).mockReturnValue(false); // No settings files exist
1566
- (fs.readFileSync as Mock).mockReturnValue('{}');
1567
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1568
- expect(settings.merged.model).toBeUndefined();
1569
- });
1570
-
1571
- it('should ignore chatCompression if contextPercentageThreshold is invalid', () => {
1572
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
1573
- (mockFsExistsSync as Mock).mockImplementation(
1574
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1575
- );
1576
- const userSettingsContent = {
1577
- general: {},
1578
- model: { chatCompression: { contextPercentageThreshold: 1.5 } },
1579
- };
1580
- (fs.readFileSync as Mock).mockImplementation(
1581
- (p: fs.PathOrFileDescriptor) => {
1582
- if (p === USER_SETTINGS_PATH)
1583
- return JSON.stringify(userSettingsContent);
1584
- return '{}';
1585
- },
1586
- );
1587
-
1588
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1589
- expect(settings.merged.model?.chatCompression).toEqual({
1590
- contextPercentageThreshold: 1.5,
1591
- });
1592
- warnSpy.mockRestore();
1593
- });
1594
-
1595
- it('should deep merge chatCompression settings', () => {
1596
- (mockFsExistsSync as Mock).mockReturnValue(true);
1597
- const userSettingsContent = {
1598
- general: {},
1599
- model: { chatCompression: { contextPercentageThreshold: 0.5 } },
1600
- };
1601
- const workspaceSettingsContent = {
1602
- general: {},
1603
- model: { chatCompression: {} },
1604
- };
1605
-
1606
- (fs.readFileSync as Mock).mockImplementation(
1607
- (p: fs.PathOrFileDescriptor) => {
1608
- if (p === USER_SETTINGS_PATH)
1609
- return JSON.stringify(userSettingsContent);
1610
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1611
- return JSON.stringify(workspaceSettingsContent);
1612
- return '{}';
1613
- },
1614
- );
1615
-
1616
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1617
-
1618
- expect(settings.merged.model?.chatCompression).toEqual({
1619
- contextPercentageThreshold: 0.5,
1620
- });
1621
- });
1622
-
1623
- it('should merge includeDirectories from all scopes', () => {
1624
- (mockFsExistsSync as Mock).mockReturnValue(true);
1625
- const systemSettingsContent = {
1626
- context: { includeDirectories: ['/system/dir'] },
1627
- };
1628
- const systemDefaultsContent = {
1629
- context: { includeDirectories: ['/system/defaults/dir'] },
1630
- };
1631
- const userSettingsContent = {
1632
- context: { includeDirectories: ['/user/dir1', '/user/dir2'] },
1633
- };
1634
- const workspaceSettingsContent = {
1635
- context: { includeDirectories: ['/workspace/dir'] },
1636
- };
1637
-
1638
- (fs.readFileSync as Mock).mockImplementation(
1639
- (p: fs.PathOrFileDescriptor) => {
1640
- if (p === getSystemSettingsPath())
1641
- return JSON.stringify(systemSettingsContent);
1642
- if (p === getSystemDefaultsPath())
1643
- return JSON.stringify(systemDefaultsContent);
1644
- if (p === USER_SETTINGS_PATH)
1645
- return JSON.stringify(userSettingsContent);
1646
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1647
- return JSON.stringify(workspaceSettingsContent);
1648
- return '{}';
1649
- },
1650
- );
1651
-
1652
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1653
-
1654
- expect(settings.merged.context?.includeDirectories).toEqual([
1655
- '/system/defaults/dir',
1656
- '/user/dir1',
1657
- '/user/dir2',
1658
- '/workspace/dir',
1659
- '/system/dir',
1660
- ]);
1661
- });
1662
-
1663
- it('should handle JSON parsing errors gracefully', () => {
1664
- (mockFsExistsSync as Mock).mockReturnValue(true); // Both files "exist"
1665
- const invalidJsonContent = 'invalid json';
1666
- const userReadError = new SyntaxError(
1667
- "Expected ',' or '}' after property value in JSON at position 10",
1668
- );
1669
- const workspaceReadError = new SyntaxError(
1670
- 'Unexpected token i in JSON at position 0',
1671
- );
1672
-
1673
- (fs.readFileSync as Mock).mockImplementation(
1674
- (p: fs.PathOrFileDescriptor) => {
1675
- if (p === USER_SETTINGS_PATH) {
1676
- // Simulate JSON.parse throwing for user settings
1677
- vi.spyOn(JSON, 'parse').mockImplementationOnce(() => {
1678
- throw userReadError;
1679
- });
1680
- return invalidJsonContent; // Content that would cause JSON.parse to throw
1681
- }
1682
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
1683
- // Simulate JSON.parse throwing for workspace settings
1684
- vi.spyOn(JSON, 'parse').mockImplementationOnce(() => {
1685
- throw workspaceReadError;
1686
- });
1687
- return invalidJsonContent;
1688
- }
1689
- return '{}'; // Default for other reads
1690
- },
1691
- );
1692
-
1693
- try {
1694
- loadSettings(MOCK_WORKSPACE_DIR);
1695
- throw new Error('loadSettings should have thrown a FatalConfigError');
1696
- } catch (e) {
1697
- expect(e).toBeInstanceOf(FatalConfigError);
1698
- const error = e as FatalConfigError;
1699
- expect(error.message).toContain(
1700
- `Error in ${USER_SETTINGS_PATH}: ${userReadError.message}`,
1701
- );
1702
- expect(error.message).toContain(
1703
- `Error in ${MOCK_WORKSPACE_SETTINGS_PATH}: ${workspaceReadError.message}`,
1704
- );
1705
- expect(error.message).toContain(
1706
- 'Please fix the configuration file(s) and try again.',
1707
- );
1708
- }
1709
-
1710
- // Restore JSON.parse mock if it was spied on specifically for this test
1711
- vi.restoreAllMocks(); // Or more targeted restore if needed
1712
- });
1713
-
1714
- it('should resolve environment variables in user settings', () => {
1715
- process.env['TEST_API_KEY'] = 'user_api_key_from_env';
1716
- const userSettingsContent: TestSettings = {
1717
- apiKey: '$TEST_API_KEY',
1718
- someUrl: 'https://test.com/${TEST_API_KEY}',
1719
- };
1720
- (mockFsExistsSync as Mock).mockImplementation(
1721
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1722
- );
1723
- (fs.readFileSync as Mock).mockImplementation(
1724
- (p: fs.PathOrFileDescriptor) => {
1725
- if (p === USER_SETTINGS_PATH)
1726
- return JSON.stringify(userSettingsContent);
1727
- return '{}';
1728
- },
1729
- );
1730
-
1731
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1732
- expect((settings.user.settings as TestSettings)['apiKey']).toBe(
1733
- 'user_api_key_from_env',
1734
- );
1735
- expect((settings.user.settings as TestSettings)['someUrl']).toBe(
1736
- 'https://test.com/user_api_key_from_env',
1737
- );
1738
- expect((settings.merged as TestSettings)['apiKey']).toBe(
1739
- 'user_api_key_from_env',
1740
- );
1741
- delete process.env['TEST_API_KEY'];
1742
- });
1743
-
1744
- it('should resolve environment variables in workspace settings', () => {
1745
- process.env['WORKSPACE_ENDPOINT'] = 'workspace_endpoint_from_env';
1746
- const workspaceSettingsContent: TestSettings = {
1747
- endpoint: '${WORKSPACE_ENDPOINT}/api',
1748
- nested: { value: '$WORKSPACE_ENDPOINT' },
1749
- };
1750
- (mockFsExistsSync as Mock).mockImplementation(
1751
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
1752
- );
1753
- (fs.readFileSync as Mock).mockImplementation(
1754
- (p: fs.PathOrFileDescriptor) => {
1755
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1756
- return JSON.stringify(workspaceSettingsContent);
1757
- return '{}';
1758
- },
1759
- );
1760
-
1761
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1762
- expect((settings.workspace.settings as TestSettings)['endpoint']).toBe(
1763
- 'workspace_endpoint_from_env/api',
1764
- );
1765
- expect(
1766
- (
1767
- (settings.workspace.settings as TestSettings).nested as {
1768
- [key: string]: unknown;
1769
- }
1770
- )['value'],
1771
- ).toBe('workspace_endpoint_from_env');
1772
- expect((settings.merged as TestSettings)['endpoint']).toBe(
1773
- 'workspace_endpoint_from_env/api',
1774
- );
1775
- delete process.env['WORKSPACE_ENDPOINT'];
1776
- });
1777
-
1778
- it('should correctly resolve and merge env variables from different scopes', () => {
1779
- process.env['SYSTEM_VAR'] = 'system_value';
1780
- process.env['USER_VAR'] = 'user_value';
1781
- process.env['WORKSPACE_VAR'] = 'workspace_value';
1782
- process.env['SHARED_VAR'] = 'final_value';
1783
-
1784
- const systemSettingsContent: TestSettings = {
1785
- configValue: '$SHARED_VAR',
1786
- systemOnly: '$SYSTEM_VAR',
1787
- };
1788
- const userSettingsContent: TestSettings = {
1789
- configValue: '$SHARED_VAR',
1790
- userOnly: '$USER_VAR',
1791
- ui: {
1792
- theme: 'dark',
1793
- },
1794
- };
1795
- const workspaceSettingsContent: TestSettings = {
1796
- configValue: '$SHARED_VAR',
1797
- workspaceOnly: '$WORKSPACE_VAR',
1798
- ui: {
1799
- theme: 'light',
1800
- },
1801
- };
1802
-
1803
- (mockFsExistsSync as Mock).mockReturnValue(true);
1804
- (fs.readFileSync as Mock).mockImplementation(
1805
- (p: fs.PathOrFileDescriptor) => {
1806
- if (p === getSystemSettingsPath()) {
1807
- return JSON.stringify(systemSettingsContent);
1808
- }
1809
- if (p === USER_SETTINGS_PATH) {
1810
- return JSON.stringify(userSettingsContent);
1811
- }
1812
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
1813
- return JSON.stringify(workspaceSettingsContent);
1814
- }
1815
- return '{}';
1816
- },
1817
- );
1818
-
1819
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1820
-
1821
- // Check resolved values in individual scopes
1822
- expect((settings.system.settings as TestSettings)['configValue']).toBe(
1823
- 'final_value',
1824
- );
1825
- expect((settings.system.settings as TestSettings)['systemOnly']).toBe(
1826
- 'system_value',
1827
- );
1828
- expect((settings.user.settings as TestSettings)['configValue']).toBe(
1829
- 'final_value',
1830
- );
1831
- expect((settings.user.settings as TestSettings)['userOnly']).toBe(
1832
- 'user_value',
1833
- );
1834
- expect((settings.workspace.settings as TestSettings)['configValue']).toBe(
1835
- 'final_value',
1836
- );
1837
- expect(
1838
- (settings.workspace.settings as TestSettings)['workspaceOnly'],
1839
- ).toBe('workspace_value');
1840
-
1841
- // Check merged values (system > workspace > user)
1842
- expect((settings.merged as TestSettings)['configValue']).toBe(
1843
- 'final_value',
1844
- );
1845
- expect((settings.merged as TestSettings)['systemOnly']).toBe(
1846
- 'system_value',
1847
- );
1848
- expect((settings.merged as TestSettings)['userOnly']).toBe('user_value');
1849
- expect((settings.merged as TestSettings)['workspaceOnly']).toBe(
1850
- 'workspace_value',
1851
- );
1852
- expect(settings.merged.ui?.theme).toBe('light'); // workspace overrides user
1853
-
1854
- delete process.env['SYSTEM_VAR'];
1855
- delete process.env['USER_VAR'];
1856
- delete process.env['WORKSPACE_VAR'];
1857
- delete process.env['SHARED_VAR'];
1858
- });
1859
-
1860
- it('should correctly merge dnsResolutionOrder with workspace taking precedence', () => {
1861
- (mockFsExistsSync as Mock).mockReturnValue(true);
1862
- const userSettingsContent = {
1863
- advanced: { dnsResolutionOrder: 'ipv4first' },
1864
- };
1865
- const workspaceSettingsContent = {
1866
- advanced: { dnsResolutionOrder: 'verbatim' },
1867
- };
1868
-
1869
- (fs.readFileSync as Mock).mockImplementation(
1870
- (p: fs.PathOrFileDescriptor) => {
1871
- if (p === USER_SETTINGS_PATH)
1872
- return JSON.stringify(userSettingsContent);
1873
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
1874
- return JSON.stringify(workspaceSettingsContent);
1875
- return '{}';
1876
- },
1877
- );
1878
-
1879
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1880
- expect(settings.merged.advanced?.dnsResolutionOrder).toBe('verbatim');
1881
- });
1882
-
1883
- it('should use user dnsResolutionOrder if workspace is not defined', () => {
1884
- (mockFsExistsSync as Mock).mockImplementation(
1885
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1886
- );
1887
- const userSettingsContent = {
1888
- advanced: { dnsResolutionOrder: 'verbatim' },
1889
- };
1890
- (fs.readFileSync as Mock).mockImplementation(
1891
- (p: fs.PathOrFileDescriptor) => {
1892
- if (p === USER_SETTINGS_PATH)
1893
- return JSON.stringify(userSettingsContent);
1894
- return '{}';
1895
- },
1896
- );
1897
-
1898
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1899
- expect(settings.merged.advanced?.dnsResolutionOrder).toBe('verbatim');
1900
- });
1901
-
1902
- it('should leave unresolved environment variables as is', () => {
1903
- const userSettingsContent: TestSettings = { apiKey: '$UNDEFINED_VAR' };
1904
- (mockFsExistsSync as Mock).mockImplementation(
1905
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1906
- );
1907
- (fs.readFileSync as Mock).mockImplementation(
1908
- (p: fs.PathOrFileDescriptor) => {
1909
- if (p === USER_SETTINGS_PATH)
1910
- return JSON.stringify(userSettingsContent);
1911
- return '{}';
1912
- },
1913
- );
1914
-
1915
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1916
- expect((settings.user.settings as TestSettings)['apiKey']).toBe(
1917
- '$UNDEFINED_VAR',
1918
- );
1919
- expect((settings.merged as TestSettings)['apiKey']).toBe(
1920
- '$UNDEFINED_VAR',
1921
- );
1922
- });
1923
-
1924
- it('should resolve multiple environment variables in a single string', () => {
1925
- process.env['VAR_A'] = 'valueA';
1926
- process.env['VAR_B'] = 'valueB';
1927
- const userSettingsContent: TestSettings = {
1928
- path: '/path/$VAR_A/${VAR_B}/end',
1929
- };
1930
- (mockFsExistsSync as Mock).mockImplementation(
1931
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1932
- );
1933
- (fs.readFileSync as Mock).mockImplementation(
1934
- (p: fs.PathOrFileDescriptor) => {
1935
- if (p === USER_SETTINGS_PATH)
1936
- return JSON.stringify(userSettingsContent);
1937
- return '{}';
1938
- },
1939
- );
1940
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1941
- expect((settings.user.settings as TestSettings)['path']).toBe(
1942
- '/path/valueA/valueB/end',
1943
- );
1944
- delete process.env['VAR_A'];
1945
- delete process.env['VAR_B'];
1946
- });
1947
-
1948
- it('should resolve environment variables in arrays', () => {
1949
- process.env['ITEM_1'] = 'item1_env';
1950
- process.env['ITEM_2'] = 'item2_env';
1951
- const userSettingsContent: TestSettings = {
1952
- list: ['$ITEM_1', '${ITEM_2}', 'literal'],
1953
- };
1954
- (mockFsExistsSync as Mock).mockImplementation(
1955
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1956
- );
1957
- (fs.readFileSync as Mock).mockImplementation(
1958
- (p: fs.PathOrFileDescriptor) => {
1959
- if (p === USER_SETTINGS_PATH)
1960
- return JSON.stringify(userSettingsContent);
1961
- return '{}';
1962
- },
1963
- );
1964
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
1965
- expect((settings.user.settings as TestSettings)['list']).toEqual([
1966
- 'item1_env',
1967
- 'item2_env',
1968
- 'literal',
1969
- ]);
1970
- delete process.env['ITEM_1'];
1971
- delete process.env['ITEM_2'];
1972
- });
1973
-
1974
- it('should correctly pass through null, boolean, and number types, and handle undefined properties', () => {
1975
- process.env['MY_ENV_STRING'] = 'env_string_value';
1976
- process.env['MY_ENV_STRING_NESTED'] = 'env_string_nested_value';
1977
-
1978
- const userSettingsContent: TestSettings = {
1979
- nullVal: null,
1980
- trueVal: true,
1981
- falseVal: false,
1982
- numberVal: 123.45,
1983
- stringVal: '$MY_ENV_STRING',
1984
- nestedObj: {
1985
- nestedNull: null,
1986
- nestedBool: true,
1987
- nestedNum: 0,
1988
- nestedString: 'literal',
1989
- anotherEnv: '${MY_ENV_STRING_NESTED}',
1990
- },
1991
- };
1992
-
1993
- (mockFsExistsSync as Mock).mockImplementation(
1994
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
1995
- );
1996
- (fs.readFileSync as Mock).mockImplementation(
1997
- (p: fs.PathOrFileDescriptor) => {
1998
- if (p === USER_SETTINGS_PATH)
1999
- return JSON.stringify(userSettingsContent);
2000
- return '{}';
2001
- },
2002
- );
2003
-
2004
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2005
-
2006
- expect((settings.user.settings as TestSettings)['nullVal']).toBeNull();
2007
- expect((settings.user.settings as TestSettings)['trueVal']).toBe(true);
2008
- expect((settings.user.settings as TestSettings)['falseVal']).toBe(false);
2009
- expect((settings.user.settings as TestSettings)['numberVal']).toBe(
2010
- 123.45,
2011
- );
2012
- expect((settings.user.settings as TestSettings)['stringVal']).toBe(
2013
- 'env_string_value',
2014
- );
2015
- expect(
2016
- (settings.user.settings as TestSettings)['undefinedVal'],
2017
- ).toBeUndefined();
2018
-
2019
- expect(
2020
- (
2021
- (settings.user.settings as TestSettings).nestedObj as {
2022
- [key: string]: unknown;
2023
- }
2024
- )['nestedNull'],
2025
- ).toBeNull();
2026
- expect(
2027
- (
2028
- (settings.user.settings as TestSettings).nestedObj as {
2029
- [key: string]: unknown;
2030
- }
2031
- )['nestedBool'],
2032
- ).toBe(true);
2033
- expect(
2034
- (
2035
- (settings.user.settings as TestSettings).nestedObj as {
2036
- [key: string]: unknown;
2037
- }
2038
- )['nestedNum'],
2039
- ).toBe(0);
2040
- expect(
2041
- (
2042
- (settings.user.settings as TestSettings).nestedObj as {
2043
- [key: string]: unknown;
2044
- }
2045
- )['nestedString'],
2046
- ).toBe('literal');
2047
- expect(
2048
- (
2049
- (settings.user.settings as TestSettings).nestedObj as {
2050
- [key: string]: unknown;
2051
- }
2052
- )['anotherEnv'],
2053
- ).toBe('env_string_nested_value');
2054
-
2055
- delete process.env['MY_ENV_STRING'];
2056
- delete process.env['MY_ENV_STRING_NESTED'];
2057
- });
2058
-
2059
- it('should resolve multiple concatenated environment variables in a single string value', () => {
2060
- process.env['TEST_HOST'] = 'myhost';
2061
- process.env['TEST_PORT'] = '9090';
2062
- const userSettingsContent: TestSettings = {
2063
- serverAddress: '${TEST_HOST}:${TEST_PORT}/api',
2064
- };
2065
- (mockFsExistsSync as Mock).mockImplementation(
2066
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
2067
- );
2068
- (fs.readFileSync as Mock).mockImplementation(
2069
- (p: fs.PathOrFileDescriptor) => {
2070
- if (p === USER_SETTINGS_PATH)
2071
- return JSON.stringify(userSettingsContent);
2072
- return '{}';
2073
- },
2074
- );
2075
-
2076
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2077
- expect((settings.user.settings as TestSettings)['serverAddress']).toBe(
2078
- 'myhost:9090/api',
2079
- );
2080
-
2081
- delete process.env['TEST_HOST'];
2082
- delete process.env['TEST_PORT'];
2083
- });
2084
-
2085
- describe('when QWEN_CODE_SYSTEM_SETTINGS_PATH is set', () => {
2086
- const MOCK_ENV_SYSTEM_SETTINGS_PATH = '/mock/env/system/settings.json';
2087
-
2088
- beforeEach(() => {
2089
- process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'] =
2090
- MOCK_ENV_SYSTEM_SETTINGS_PATH;
2091
- });
2092
-
2093
- afterEach(() => {
2094
- delete process.env['QWEN_CODE_SYSTEM_SETTINGS_PATH'];
2095
- });
2096
-
2097
- it('should load system settings from the path specified in the environment variable', () => {
2098
- (mockFsExistsSync as Mock).mockImplementation(
2099
- (p: fs.PathLike) => p === MOCK_ENV_SYSTEM_SETTINGS_PATH,
2100
- );
2101
- const systemSettingsContent = {
2102
- ui: { theme: 'env-var-theme' },
2103
- tools: { sandbox: true },
2104
- };
2105
- (fs.readFileSync as Mock).mockImplementation(
2106
- (p: fs.PathOrFileDescriptor) => {
2107
- if (p === MOCK_ENV_SYSTEM_SETTINGS_PATH)
2108
- return JSON.stringify(systemSettingsContent);
2109
- return '{}';
2110
- },
2111
- );
2112
-
2113
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2114
-
2115
- expect(fs.readFileSync).toHaveBeenCalledWith(
2116
- MOCK_ENV_SYSTEM_SETTINGS_PATH,
2117
- 'utf-8',
2118
- );
2119
- expect(settings.system.path).toBe(MOCK_ENV_SYSTEM_SETTINGS_PATH);
2120
- expect(settings.system.settings).toEqual({
2121
- ...systemSettingsContent,
2122
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
2123
- });
2124
- expect(settings.merged).toEqual({
2125
- ...systemSettingsContent,
2126
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
2127
- });
2128
- });
2129
- });
2130
- });
2131
-
2132
- describe('excludedProjectEnvVars integration', () => {
2133
- const originalEnv = { ...process.env };
2134
-
2135
- beforeEach(() => {
2136
- process.env = { ...originalEnv };
2137
- });
2138
-
2139
- afterEach(() => {
2140
- process.env = originalEnv;
2141
- });
2142
-
2143
- it('should exclude DEBUG and DEBUG_MODE from project .env files by default', () => {
2144
- // Create a workspace settings file with excludedProjectEnvVars
2145
- const workspaceSettingsContent = {
2146
- general: {},
2147
- advanced: { excludedEnvVars: ['DEBUG', 'DEBUG_MODE'] },
2148
- };
2149
-
2150
- (mockFsExistsSync as Mock).mockImplementation(
2151
- (p: fs.PathLike) => p === MOCK_WORKSPACE_SETTINGS_PATH,
2152
- );
2153
-
2154
- (fs.readFileSync as Mock).mockImplementation(
2155
- (p: fs.PathOrFileDescriptor) => {
2156
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2157
- return JSON.stringify(workspaceSettingsContent);
2158
- return '{}';
2159
- },
2160
- );
2161
-
2162
- // Mock findEnvFile to return a project .env file
2163
- const originalFindEnvFile = (
2164
- loadSettings as unknown as { findEnvFile: () => string }
2165
- ).findEnvFile;
2166
- (loadSettings as unknown as { findEnvFile: () => string }).findEnvFile =
2167
- () => '/mock/project/.env';
2168
-
2169
- // Mock fs.readFileSync for .env file content
2170
- const originalReadFileSync = fs.readFileSync;
2171
- (fs.readFileSync as Mock).mockImplementation(
2172
- (p: fs.PathOrFileDescriptor) => {
2173
- if (p === '/mock/project/.env') {
2174
- return 'DEBUG=true\nDEBUG_MODE=1\nGEMINI_API_KEY=test-key';
2175
- }
2176
- if (p === MOCK_WORKSPACE_SETTINGS_PATH) {
2177
- return JSON.stringify(workspaceSettingsContent);
2178
- }
2179
- return '{}';
2180
- },
2181
- );
2182
-
2183
- try {
2184
- // This will call loadEnvironment internally with the merged settings
2185
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2186
-
2187
- // Verify the settings were loaded correctly
2188
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
2189
- 'DEBUG',
2190
- 'DEBUG_MODE',
2191
- ]);
2192
-
2193
- // Note: We can't directly test process.env changes here because the mocking
2194
- // prevents the actual file system operations, but we can verify the settings
2195
- // are correctly merged and passed to loadEnvironment
2196
- } finally {
2197
- (loadSettings as unknown as { findEnvFile: () => string }).findEnvFile =
2198
- originalFindEnvFile;
2199
- (fs.readFileSync as Mock).mockImplementation(originalReadFileSync);
2200
- }
2201
- });
2202
-
2203
- it('should respect custom excludedProjectEnvVars from user settings', () => {
2204
- const userSettingsContent = {
2205
- general: {},
2206
- advanced: { excludedEnvVars: ['NODE_ENV', 'DEBUG'] },
2207
- };
2208
-
2209
- (mockFsExistsSync as Mock).mockImplementation(
2210
- (p: fs.PathLike) => p === USER_SETTINGS_PATH,
2211
- );
2212
-
2213
- (fs.readFileSync as Mock).mockImplementation(
2214
- (p: fs.PathOrFileDescriptor) => {
2215
- if (p === USER_SETTINGS_PATH)
2216
- return JSON.stringify(userSettingsContent);
2217
- return '{}';
2218
- },
2219
- );
2220
-
2221
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2222
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
2223
- 'NODE_ENV',
2224
- 'DEBUG',
2225
- ]);
2226
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
2227
- 'NODE_ENV',
2228
- 'DEBUG',
2229
- ]);
2230
- });
2231
-
2232
- it('should merge excludedProjectEnvVars with workspace taking precedence', () => {
2233
- const userSettingsContent = {
2234
- general: {},
2235
- advanced: { excludedEnvVars: ['DEBUG', 'NODE_ENV', 'USER_VAR'] },
2236
- };
2237
- const workspaceSettingsContent = {
2238
- general: {},
2239
- advanced: { excludedEnvVars: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'] },
2240
- };
2241
-
2242
- (mockFsExistsSync as Mock).mockReturnValue(true);
2243
-
2244
- (fs.readFileSync as Mock).mockImplementation(
2245
- (p: fs.PathOrFileDescriptor) => {
2246
- if (p === USER_SETTINGS_PATH)
2247
- return JSON.stringify(userSettingsContent);
2248
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2249
- return JSON.stringify(workspaceSettingsContent);
2250
- return '{}';
2251
- },
2252
- );
2253
-
2254
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2255
-
2256
- expect(settings.user.settings.advanced?.excludedEnvVars).toEqual([
2257
- 'DEBUG',
2258
- 'NODE_ENV',
2259
- 'USER_VAR',
2260
- ]);
2261
- expect(settings.workspace.settings.advanced?.excludedEnvVars).toEqual([
2262
- 'WORKSPACE_DEBUG',
2263
- 'WORKSPACE_VAR',
2264
- ]);
2265
- expect(settings.merged.advanced?.excludedEnvVars).toEqual([
2266
- 'DEBUG',
2267
- 'NODE_ENV',
2268
- 'USER_VAR',
2269
- 'WORKSPACE_DEBUG',
2270
- 'WORKSPACE_VAR',
2271
- ]);
2272
- });
2273
- });
2274
-
2275
- describe('with workspace trust', () => {
2276
- it('should merge workspace settings when workspace is trusted', () => {
2277
- (mockFsExistsSync as Mock).mockReturnValue(true);
2278
- const userSettingsContent = {
2279
- ui: { theme: 'dark' },
2280
- tools: { sandbox: false },
2281
- };
2282
- const workspaceSettingsContent = {
2283
- tools: { sandbox: true },
2284
- context: { fileName: 'WORKSPACE.md' },
2285
- };
2286
-
2287
- (fs.readFileSync as Mock).mockImplementation(
2288
- (p: fs.PathOrFileDescriptor) => {
2289
- if (p === USER_SETTINGS_PATH)
2290
- return JSON.stringify(userSettingsContent);
2291
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2292
- return JSON.stringify(workspaceSettingsContent);
2293
- return '{}';
2294
- },
2295
- );
2296
-
2297
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2298
- expect(settings.merged.tools?.sandbox).toBe(true);
2299
- expect(settings.merged.context?.fileName).toBe('WORKSPACE.md');
2300
- expect(settings.merged.ui?.theme).toBe('dark');
2301
- });
2302
-
2303
- it('should NOT merge workspace settings when workspace is not trusted', () => {
2304
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2305
- isTrusted: false,
2306
- source: 'file',
2307
- });
2308
- (mockFsExistsSync as Mock).mockReturnValue(true);
2309
- const userSettingsContent = {
2310
- ui: { theme: 'dark' },
2311
- tools: { sandbox: false },
2312
- context: { fileName: 'USER.md' },
2313
- };
2314
- const workspaceSettingsContent = {
2315
- tools: { sandbox: true },
2316
- context: { fileName: 'WORKSPACE.md' },
2317
- };
2318
-
2319
- (fs.readFileSync as Mock).mockImplementation(
2320
- (p: fs.PathOrFileDescriptor) => {
2321
- if (p === USER_SETTINGS_PATH)
2322
- return JSON.stringify(userSettingsContent);
2323
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2324
- return JSON.stringify(workspaceSettingsContent);
2325
- return '{}';
2326
- },
2327
- );
2328
-
2329
- const settings = loadSettings(MOCK_WORKSPACE_DIR);
2330
-
2331
- expect(settings.merged.tools?.sandbox).toBe(false); // User setting
2332
- expect(settings.merged.context?.fileName).toBe('USER.md'); // User setting
2333
- expect(settings.merged.ui?.theme).toBe('dark'); // User setting
2334
- });
2335
- });
2336
-
2337
- describe('loadEnvironment', () => {
2338
- function setup({
2339
- isFolderTrustEnabled = true,
2340
- isWorkspaceTrustedValue = true,
2341
- }) {
2342
- delete process.env['TESTTEST']; // reset
2343
- const geminiEnvPath = path.resolve(path.join(QWEN_DIR, '.env'));
2344
-
2345
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2346
- isTrusted: isWorkspaceTrustedValue,
2347
- source: 'file',
2348
- });
2349
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2350
- [USER_SETTINGS_PATH, geminiEnvPath].includes(p.toString()),
2351
- );
2352
- const userSettingsContent: Settings = {
2353
- ui: {
2354
- theme: 'dark',
2355
- },
2356
- security: {
2357
- folderTrust: {
2358
- enabled: isFolderTrustEnabled,
2359
- },
2360
- },
2361
- context: {
2362
- fileName: 'USER_CONTEXT.md',
2363
- },
2364
- };
2365
- (fs.readFileSync as Mock).mockImplementation(
2366
- (p: fs.PathOrFileDescriptor) => {
2367
- if (p === USER_SETTINGS_PATH)
2368
- return JSON.stringify(userSettingsContent);
2369
- if (p === geminiEnvPath) return 'TESTTEST=1234';
2370
- return '{}';
2371
- },
2372
- );
2373
- }
2374
-
2375
- it('sets environment variables from .env files', () => {
2376
- setup({ isFolderTrustEnabled: false, isWorkspaceTrustedValue: true });
2377
- loadEnvironment(loadSettings(MOCK_WORKSPACE_DIR).merged);
2378
-
2379
- expect(process.env['TESTTEST']).toEqual('1234');
2380
- });
2381
-
2382
- it('does not load project .env files from untrusted workspaces', () => {
2383
- delete process.env['PROJECT_ENV_VAR'];
2384
- const cwdSpy = vi
2385
- .spyOn(process, 'cwd')
2386
- .mockReturnValue(MOCK_WORKSPACE_DIR);
2387
-
2388
- const projectEnvPath = path.join(MOCK_WORKSPACE_DIR, '.env');
2389
-
2390
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2391
- isTrusted: false,
2392
- source: 'file',
2393
- });
2394
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2395
- [USER_SETTINGS_PATH, projectEnvPath].includes(p.toString()),
2396
- );
2397
- const userSettingsContent: Settings = {
2398
- ui: {
2399
- theme: 'dark',
2400
- },
2401
- security: {
2402
- folderTrust: {
2403
- enabled: true,
2404
- },
2405
- },
2406
- };
2407
- (fs.readFileSync as Mock).mockImplementation(
2408
- (p: fs.PathOrFileDescriptor) => {
2409
- if (p === USER_SETTINGS_PATH)
2410
- return JSON.stringify(userSettingsContent);
2411
- if (p === projectEnvPath) return 'PROJECT_ENV_VAR=from_project';
2412
- return '{}';
2413
- },
2414
- );
2415
-
2416
- loadEnvironment(loadSettings(MOCK_WORKSPACE_DIR).merged);
2417
-
2418
- // Project .env should NOT be loaded when workspace is untrusted
2419
- expect(process.env['PROJECT_ENV_VAR']).toBeUndefined();
2420
- cwdSpy.mockRestore();
2421
- });
2422
-
2423
- describe('settings.env field', () => {
2424
- const originalEnv = { ...process.env };
2425
-
2426
- beforeEach(() => {
2427
- process.env = { ...originalEnv };
2428
- delete process.env['ENV_FROM_SETTINGS'];
2429
- delete process.env['ENV_OVERRIDE_TEST'];
2430
- delete process.env['SYSTEM_ENV_VAR'];
2431
- delete process.env['MULTI_VAR_A'];
2432
- delete process.env['MULTI_VAR_B'];
2433
- delete process.env['MULTI_VAR_C'];
2434
- delete process.env['USER_ENV_VAR'];
2435
- delete process.env['WORKSPACE_ENV_VAR'];
2436
- });
2437
-
2438
- afterEach(() => {
2439
- process.env = originalEnv;
2440
- });
2441
-
2442
- it('should load environment variables from settings.env as fallback', () => {
2443
- const userSettingsContent: Settings = {
2444
- env: {
2445
- ENV_FROM_SETTINGS: 'settings_value',
2446
- },
2447
- };
2448
-
2449
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2450
- [USER_SETTINGS_PATH].includes(p.toString()),
2451
- );
2452
- (fs.readFileSync as Mock).mockImplementation(
2453
- (p: fs.PathOrFileDescriptor) => {
2454
- if (p === USER_SETTINGS_PATH)
2455
- return JSON.stringify(userSettingsContent);
2456
- return '{}';
2457
- },
2458
- );
2459
-
2460
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2461
- isTrusted: true,
2462
- source: 'file',
2463
- });
2464
-
2465
- // loadSettings internally calls loadEnvironment with userSettings
2466
- loadSettings(MOCK_WORKSPACE_DIR);
2467
-
2468
- expect(process.env['ENV_FROM_SETTINGS']).toEqual('settings_value');
2469
- });
2470
-
2471
- it('should allow .env file to override settings.env values', () => {
2472
- const geminiEnvPath = path.resolve(path.join(QWEN_DIR, '.env'));
2473
- const userSettingsContent: Settings = {
2474
- env: {
2475
- ENV_OVERRIDE_TEST: 'from_settings',
2476
- },
2477
- };
2478
-
2479
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2480
- [USER_SETTINGS_PATH, geminiEnvPath].includes(p.toString()),
2481
- );
2482
- (fs.readFileSync as Mock).mockImplementation(
2483
- (p: fs.PathOrFileDescriptor) => {
2484
- if (p === USER_SETTINGS_PATH)
2485
- return JSON.stringify(userSettingsContent);
2486
- if (p === geminiEnvPath) return 'ENV_OVERRIDE_TEST=from_dotenv';
2487
- return '{}';
2488
- },
2489
- );
2490
-
2491
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2492
- isTrusted: true,
2493
- source: 'file',
2494
- });
2495
-
2496
- // loadSettings internally calls loadEnvironment with merged settings
2497
- loadSettings(MOCK_WORKSPACE_DIR);
2498
-
2499
- // .env file has higher priority than settings.env (loaded first, no-override)
2500
- expect(process.env['ENV_OVERRIDE_TEST']).toEqual('from_dotenv');
2501
- });
2502
-
2503
- it('should not override existing system environment variables', () => {
2504
- process.env['SYSTEM_ENV_VAR'] = 'system_value';
2505
-
2506
- const geminiEnvPath = path.resolve(path.join(QWEN_DIR, '.env'));
2507
- const userSettingsContent: Settings = {
2508
- env: {
2509
- SYSTEM_ENV_VAR: 'from_settings',
2510
- },
2511
- };
2512
-
2513
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2514
- [USER_SETTINGS_PATH, geminiEnvPath].includes(p.toString()),
2515
- );
2516
- (fs.readFileSync as Mock).mockImplementation(
2517
- (p: fs.PathOrFileDescriptor) => {
2518
- if (p === USER_SETTINGS_PATH)
2519
- return JSON.stringify(userSettingsContent);
2520
- if (p === geminiEnvPath) return 'SYSTEM_ENV_VAR=from_dotenv';
2521
- return '{}';
2522
- },
2523
- );
2524
-
2525
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2526
- isTrusted: true,
2527
- source: 'file',
2528
- });
2529
-
2530
- // loadSettings internally calls loadEnvironment with userSettings
2531
- loadSettings(MOCK_WORKSPACE_DIR);
2532
-
2533
- // System environment variable should have highest priority
2534
- expect(process.env['SYSTEM_ENV_VAR']).toEqual('system_value');
2535
- });
2536
-
2537
- it('should support multiple env variables in settings.env', () => {
2538
- const userSettingsContent: Settings = {
2539
- env: {
2540
- MULTI_VAR_A: 'value_a',
2541
- MULTI_VAR_B: 'value_b',
2542
- MULTI_VAR_C: 'value_c',
2543
- },
2544
- };
2545
-
2546
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2547
- [USER_SETTINGS_PATH].includes(p.toString()),
2548
- );
2549
- (fs.readFileSync as Mock).mockImplementation(
2550
- (p: fs.PathOrFileDescriptor) => {
2551
- if (p === USER_SETTINGS_PATH)
2552
- return JSON.stringify(userSettingsContent);
2553
- return '{}';
2554
- },
2555
- );
2556
-
2557
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2558
- isTrusted: true,
2559
- source: 'file',
2560
- });
2561
-
2562
- // loadSettings internally calls loadEnvironment with userSettings
2563
- loadSettings(MOCK_WORKSPACE_DIR);
2564
-
2565
- expect(process.env['MULTI_VAR_A']).toEqual('value_a');
2566
- expect(process.env['MULTI_VAR_B']).toEqual('value_b');
2567
- expect(process.env['MULTI_VAR_C']).toEqual('value_c');
2568
- });
2569
-
2570
- it('should load settings.env from both user and workspace settings', () => {
2571
- const workspaceSettingsContent = {
2572
- env: {
2573
- WORKSPACE_ENV_VAR: 'workspace_value',
2574
- },
2575
- };
2576
- const userSettingsContent: Settings = {
2577
- env: {
2578
- USER_ENV_VAR: 'user_value',
2579
- },
2580
- };
2581
-
2582
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2583
- [USER_SETTINGS_PATH, MOCK_WORKSPACE_SETTINGS_PATH].includes(
2584
- p.toString(),
2585
- ),
2586
- );
2587
- (fs.readFileSync as Mock).mockImplementation(
2588
- (p: fs.PathOrFileDescriptor) => {
2589
- if (p === USER_SETTINGS_PATH)
2590
- return JSON.stringify(userSettingsContent);
2591
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2592
- return JSON.stringify(workspaceSettingsContent);
2593
- return '{}';
2594
- },
2595
- );
2596
-
2597
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2598
- isTrusted: true,
2599
- source: 'file',
2600
- });
2601
-
2602
- // loadSettings internally calls loadEnvironment with merged settings
2603
- loadSettings(MOCK_WORKSPACE_DIR);
2604
-
2605
- // Both user-level and workspace-level env should be loaded
2606
- expect(process.env['USER_ENV_VAR']).toEqual('user_value');
2607
- expect(process.env['WORKSPACE_ENV_VAR']).toEqual('workspace_value');
2608
- });
2609
-
2610
- it('should load user-level settings.env even when workspace is untrusted', () => {
2611
- const userSettingsContent: Settings = {
2612
- env: {
2613
- USER_ENV_VAR: 'user_value',
2614
- },
2615
- };
2616
- const workspaceSettingsContent = {
2617
- env: {
2618
- WORKSPACE_ENV_VAR: 'workspace_value',
2619
- },
2620
- };
2621
-
2622
- (mockFsExistsSync as Mock).mockImplementation((p: fs.PathLike) =>
2623
- [USER_SETTINGS_PATH, MOCK_WORKSPACE_SETTINGS_PATH].includes(
2624
- p.toString(),
2625
- ),
2626
- );
2627
- (fs.readFileSync as Mock).mockImplementation(
2628
- (p: fs.PathOrFileDescriptor) => {
2629
- if (p === USER_SETTINGS_PATH)
2630
- return JSON.stringify(userSettingsContent);
2631
- if (p === MOCK_WORKSPACE_SETTINGS_PATH)
2632
- return JSON.stringify(workspaceSettingsContent);
2633
- return '{}';
2634
- },
2635
- );
2636
-
2637
- // Workspace is untrusted
2638
- vi.mocked(isWorkspaceTrusted).mockReturnValue({
2639
- isTrusted: false,
2640
- source: 'file',
2641
- });
2642
-
2643
- loadSettings(MOCK_WORKSPACE_DIR);
2644
-
2645
- // User-level settings.env should still be loaded even when untrusted
2646
- expect(process.env['USER_ENV_VAR']).toEqual('user_value');
2647
- // Workspace-level settings.env should NOT be loaded (filtered by mergeSettings)
2648
- expect(process.env['WORKSPACE_ENV_VAR']).toBeUndefined();
2649
- });
2650
- });
2651
- });
2652
-
2653
- describe('needsMigration', () => {
2654
- it('should return false for an empty object', () => {
2655
- expect(needsMigration({})).toBe(false);
2656
- });
2657
-
2658
- it('should return false for settings that are already in V2 format', () => {
2659
- const v2Settings: Partial<Settings> = {
2660
- ui: {
2661
- theme: 'dark',
2662
- },
2663
- tools: {
2664
- sandbox: true,
2665
- },
2666
- };
2667
- expect(needsMigration(v2Settings)).toBe(false);
2668
- });
2669
-
2670
- it('should return true for settings with a V1 key that needs to be moved', () => {
2671
- const v1Settings = {
2672
- theme: 'dark', // v1 key
2673
- };
2674
- expect(needsMigration(v1Settings)).toBe(true);
2675
- });
2676
-
2677
- it('should return true for settings with a mix of V1 and V2 keys', () => {
2678
- const mixedSettings = {
2679
- theme: 'dark', // v1 key
2680
- tools: {
2681
- sandbox: true, // v2 key
2682
- },
2683
- };
2684
- expect(needsMigration(mixedSettings)).toBe(true);
2685
- });
2686
-
2687
- it('should return false for settings with only V1 keys that are the same in V2', () => {
2688
- const v1Settings = {
2689
- mcpServers: {},
2690
- telemetry: {},
2691
- extensions: [],
2692
- };
2693
- expect(needsMigration(v1Settings)).toBe(false);
2694
- });
2695
-
2696
- it('should return true for settings with a mix of V1 keys that are the same in V2 and V1 keys that need moving', () => {
2697
- const v1Settings = {
2698
- mcpServers: {}, // same in v2
2699
- theme: 'dark', // needs moving
2700
- };
2701
- expect(needsMigration(v1Settings)).toBe(true);
2702
- });
2703
-
2704
- it('should return false for settings with unrecognized keys', () => {
2705
- const settings = {
2706
- someUnrecognizedKey: 'value',
2707
- };
2708
- expect(needsMigration(settings)).toBe(false);
2709
- });
2710
-
2711
- it('should return false for settings with v2 keys and unrecognized keys', () => {
2712
- const settings = {
2713
- ui: { theme: 'dark' },
2714
- someUnrecognizedKey: 'value',
2715
- };
2716
- expect(needsMigration(settings)).toBe(false);
2717
- });
2718
-
2719
- describe('with version field', () => {
2720
- it('should return false when version field indicates current or newer version', () => {
2721
- const settingsWithVersion = {
2722
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
2723
- theme: 'dark', // Even though this is a V1 key, version field takes precedence
2724
- };
2725
- expect(needsMigration(settingsWithVersion)).toBe(false);
2726
- });
2727
-
2728
- it('should return false when version field indicates a newer version', () => {
2729
- const settingsWithNewerVersion = {
2730
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION + 1,
2731
- theme: 'dark',
2732
- };
2733
- expect(needsMigration(settingsWithNewerVersion)).toBe(false);
2734
- });
2735
-
2736
- it('should return true when version field indicates an older version', () => {
2737
- const settingsWithOldVersion = {
2738
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION - 1,
2739
- theme: 'dark',
2740
- };
2741
- expect(needsMigration(settingsWithOldVersion)).toBe(true);
2742
- });
2743
-
2744
- it('should use fallback logic when version field is not a number', () => {
2745
- const settingsWithInvalidVersion = {
2746
- [SETTINGS_VERSION_KEY]: 'not-a-number',
2747
- theme: 'dark',
2748
- };
2749
- expect(needsMigration(settingsWithInvalidVersion)).toBe(true);
2750
- });
2751
-
2752
- it('should use fallback logic when version field is missing', () => {
2753
- const settingsWithoutVersion = {
2754
- theme: 'dark',
2755
- };
2756
- expect(needsMigration(settingsWithoutVersion)).toBe(true);
2757
- });
2758
- });
2759
-
2760
- describe('edge case: partially migrated settings', () => {
2761
- it('should return true for partially migrated settings without version field', () => {
2762
- // This simulates the dangerous edge case: model already in V2 format,
2763
- // but other fields in V1 format
2764
- const partiallyMigrated = {
2765
- model: {
2766
- name: 'qwen-coder',
2767
- },
2768
- autoAccept: false, // V1 key
2769
- };
2770
- expect(needsMigration(partiallyMigrated)).toBe(true);
2771
- });
2772
-
2773
- it('should return false for partially migrated settings WITH version field', () => {
2774
- // With version field, we trust that it's been properly migrated
2775
- const partiallyMigratedWithVersion = {
2776
- [SETTINGS_VERSION_KEY]: SETTINGS_VERSION,
2777
- model: {
2778
- name: 'qwen-coder',
2779
- },
2780
- autoAccept: false, // This would look like V1 but version says it's V2
2781
- };
2782
- expect(needsMigration(partiallyMigratedWithVersion)).toBe(false);
2783
- });
2784
- });
2785
- });
2786
- });