@nghyane/arcane 0.1.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 (738) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +12 -0
  3. package/examples/README.md +21 -0
  4. package/examples/custom-tools/README.md +109 -0
  5. package/examples/custom-tools/hello/index.ts +20 -0
  6. package/examples/custom-tools/todo/index.ts +206 -0
  7. package/examples/extensions/README.md +143 -0
  8. package/examples/extensions/api-demo.ts +89 -0
  9. package/examples/extensions/chalk-logger.ts +25 -0
  10. package/examples/extensions/hello.ts +32 -0
  11. package/examples/extensions/pirate.ts +43 -0
  12. package/examples/extensions/plan-mode.ts +550 -0
  13. package/examples/extensions/reload-runtime.ts +37 -0
  14. package/examples/extensions/todo.ts +296 -0
  15. package/examples/extensions/tools.ts +144 -0
  16. package/examples/extensions/with-deps/index.ts +35 -0
  17. package/examples/extensions/with-deps/package-lock.json +31 -0
  18. package/examples/extensions/with-deps/package.json +16 -0
  19. package/examples/hooks/README.md +56 -0
  20. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  21. package/examples/hooks/confirm-destructive.ts +58 -0
  22. package/examples/hooks/custom-compaction.ts +116 -0
  23. package/examples/hooks/dirty-repo-guard.ts +51 -0
  24. package/examples/hooks/file-trigger.ts +40 -0
  25. package/examples/hooks/git-checkpoint.ts +52 -0
  26. package/examples/hooks/handoff.ts +150 -0
  27. package/examples/hooks/permission-gate.ts +33 -0
  28. package/examples/hooks/protected-paths.ts +29 -0
  29. package/examples/hooks/qna.ts +119 -0
  30. package/examples/hooks/status-line.ts +39 -0
  31. package/examples/sdk/01-minimal.ts +21 -0
  32. package/examples/sdk/02-custom-model.ts +49 -0
  33. package/examples/sdk/03-custom-prompt.ts +43 -0
  34. package/examples/sdk/04-skills.ts +43 -0
  35. package/examples/sdk/06-extensions.ts +80 -0
  36. package/examples/sdk/06-hooks.ts +61 -0
  37. package/examples/sdk/07-context-files.ts +35 -0
  38. package/examples/sdk/08-prompt-templates.ts +36 -0
  39. package/examples/sdk/08-slash-commands.ts +41 -0
  40. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  41. package/examples/sdk/11-sessions.ts +47 -0
  42. package/examples/sdk/README.md +150 -0
  43. package/package.json +464 -0
  44. package/scripts/format-prompts.ts +184 -0
  45. package/scripts/generate-docs-index.ts +40 -0
  46. package/scripts/generate-template.ts +32 -0
  47. package/src/bun-imports.d.ts +22 -0
  48. package/src/capability/context-file.ts +39 -0
  49. package/src/capability/extension-module.ts +33 -0
  50. package/src/capability/extension.ts +47 -0
  51. package/src/capability/fs.ts +89 -0
  52. package/src/capability/hook.ts +39 -0
  53. package/src/capability/index.ts +432 -0
  54. package/src/capability/instruction.ts +36 -0
  55. package/src/capability/mcp.ts +60 -0
  56. package/src/capability/prompt.ts +34 -0
  57. package/src/capability/rule.ts +223 -0
  58. package/src/capability/settings.ts +34 -0
  59. package/src/capability/skill.ts +48 -0
  60. package/src/capability/slash-command.ts +39 -0
  61. package/src/capability/ssh.ts +41 -0
  62. package/src/capability/system-prompt.ts +34 -0
  63. package/src/capability/tool.ts +37 -0
  64. package/src/capability/types.ts +156 -0
  65. package/src/cli/args.ts +259 -0
  66. package/src/cli/config-cli.ts +357 -0
  67. package/src/cli/file-processor.ts +124 -0
  68. package/src/cli/grep-cli.ts +152 -0
  69. package/src/cli/jupyter-cli.ts +106 -0
  70. package/src/cli/list-models.ts +103 -0
  71. package/src/cli/plugin-cli.ts +661 -0
  72. package/src/cli/session-picker.ts +42 -0
  73. package/src/cli/setup-cli.ts +376 -0
  74. package/src/cli/shell-cli.ts +174 -0
  75. package/src/cli/ssh-cli.ts +179 -0
  76. package/src/cli/stats-cli.ts +197 -0
  77. package/src/cli/update-cli.ts +286 -0
  78. package/src/cli/web-search-cli.ts +143 -0
  79. package/src/cli.ts +65 -0
  80. package/src/commands/commit.ts +36 -0
  81. package/src/commands/config.ts +51 -0
  82. package/src/commands/grep.ts +41 -0
  83. package/src/commands/jupyter.ts +32 -0
  84. package/src/commands/launch.ts +139 -0
  85. package/src/commands/plugin.ts +70 -0
  86. package/src/commands/setup.ts +42 -0
  87. package/src/commands/shell.ts +29 -0
  88. package/src/commands/ssh.ts +60 -0
  89. package/src/commands/stats.ts +29 -0
  90. package/src/commands/update.ts +21 -0
  91. package/src/commands/web-search.ts +42 -0
  92. package/src/commit/agentic/agent.ts +311 -0
  93. package/src/commit/agentic/fallback.ts +96 -0
  94. package/src/commit/agentic/index.ts +359 -0
  95. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  96. package/src/commit/agentic/prompts/session-user.md +25 -0
  97. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  98. package/src/commit/agentic/prompts/system.md +38 -0
  99. package/src/commit/agentic/state.ts +69 -0
  100. package/src/commit/agentic/tools/analyze-file.ts +118 -0
  101. package/src/commit/agentic/tools/git-file-diff.ts +194 -0
  102. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  103. package/src/commit/agentic/tools/git-overview.ts +84 -0
  104. package/src/commit/agentic/tools/index.ts +56 -0
  105. package/src/commit/agentic/tools/propose-changelog.ts +128 -0
  106. package/src/commit/agentic/tools/propose-commit.ts +154 -0
  107. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  108. package/src/commit/agentic/tools/split-commit.ts +280 -0
  109. package/src/commit/agentic/topo-sort.ts +44 -0
  110. package/src/commit/agentic/trivial.ts +51 -0
  111. package/src/commit/agentic/validation.ts +200 -0
  112. package/src/commit/analysis/conventional.ts +165 -0
  113. package/src/commit/analysis/index.ts +4 -0
  114. package/src/commit/analysis/scope.ts +242 -0
  115. package/src/commit/analysis/summary.ts +112 -0
  116. package/src/commit/analysis/validation.ts +66 -0
  117. package/src/commit/changelog/detect.ts +37 -0
  118. package/src/commit/changelog/generate.ts +110 -0
  119. package/src/commit/changelog/index.ts +234 -0
  120. package/src/commit/changelog/parse.ts +44 -0
  121. package/src/commit/cli.ts +93 -0
  122. package/src/commit/git/diff.ts +148 -0
  123. package/src/commit/git/errors.ts +9 -0
  124. package/src/commit/git/index.ts +211 -0
  125. package/src/commit/git/operations.ts +54 -0
  126. package/src/commit/index.ts +5 -0
  127. package/src/commit/map-reduce/index.ts +64 -0
  128. package/src/commit/map-reduce/map-phase.ts +178 -0
  129. package/src/commit/map-reduce/reduce-phase.ts +145 -0
  130. package/src/commit/map-reduce/utils.ts +9 -0
  131. package/src/commit/message.ts +11 -0
  132. package/src/commit/model-selection.ts +69 -0
  133. package/src/commit/pipeline.ts +243 -0
  134. package/src/commit/prompts/analysis-system.md +148 -0
  135. package/src/commit/prompts/analysis-user.md +38 -0
  136. package/src/commit/prompts/changelog-system.md +50 -0
  137. package/src/commit/prompts/changelog-user.md +18 -0
  138. package/src/commit/prompts/file-observer-system.md +24 -0
  139. package/src/commit/prompts/file-observer-user.md +8 -0
  140. package/src/commit/prompts/reduce-system.md +50 -0
  141. package/src/commit/prompts/reduce-user.md +17 -0
  142. package/src/commit/prompts/summary-retry.md +3 -0
  143. package/src/commit/prompts/summary-system.md +38 -0
  144. package/src/commit/prompts/summary-user.md +13 -0
  145. package/src/commit/prompts/types-description.md +2 -0
  146. package/src/commit/types.ts +109 -0
  147. package/src/commit/utils/exclusions.ts +42 -0
  148. package/src/config/file-lock.ts +121 -0
  149. package/src/config/keybindings.ts +280 -0
  150. package/src/config/model-registry.ts +1140 -0
  151. package/src/config/model-resolver.ts +812 -0
  152. package/src/config/prompt-templates.ts +526 -0
  153. package/src/config/resolve-config-value.ts +92 -0
  154. package/src/config/settings-schema.ts +1236 -0
  155. package/src/config/settings.ts +706 -0
  156. package/src/config.ts +414 -0
  157. package/src/cursor.ts +239 -0
  158. package/src/debug/index.ts +431 -0
  159. package/src/debug/log-formatting.ts +60 -0
  160. package/src/debug/log-viewer.ts +903 -0
  161. package/src/debug/profiler.ts +158 -0
  162. package/src/debug/report-bundle.ts +366 -0
  163. package/src/debug/system-info.ts +112 -0
  164. package/src/discovery/agents-md.ts +68 -0
  165. package/src/discovery/agents.ts +199 -0
  166. package/src/discovery/builtin.ts +815 -0
  167. package/src/discovery/claude-plugins.ts +205 -0
  168. package/src/discovery/claude.ts +506 -0
  169. package/src/discovery/cline.ts +83 -0
  170. package/src/discovery/codex.ts +532 -0
  171. package/src/discovery/cursor.ts +218 -0
  172. package/src/discovery/gemini.ts +395 -0
  173. package/src/discovery/github.ts +117 -0
  174. package/src/discovery/helpers.ts +698 -0
  175. package/src/discovery/index.ts +89 -0
  176. package/src/discovery/mcp-json.ts +156 -0
  177. package/src/discovery/opencode.ts +394 -0
  178. package/src/discovery/ssh.ts +160 -0
  179. package/src/discovery/vscode.ts +103 -0
  180. package/src/discovery/windsurf.ts +145 -0
  181. package/src/exa/company.ts +57 -0
  182. package/src/exa/index.ts +62 -0
  183. package/src/exa/linkedin.ts +57 -0
  184. package/src/exa/mcp-client.ts +289 -0
  185. package/src/exa/render.ts +244 -0
  186. package/src/exa/researcher.ts +89 -0
  187. package/src/exa/search.ts +330 -0
  188. package/src/exa/types.ts +166 -0
  189. package/src/exa/websets.ts +247 -0
  190. package/src/exec/bash-executor.ts +184 -0
  191. package/src/exec/exec.ts +53 -0
  192. package/src/export/custom-share.ts +65 -0
  193. package/src/export/html/index.ts +162 -0
  194. package/src/export/html/template.css +889 -0
  195. package/src/export/html/template.generated.ts +2 -0
  196. package/src/export/html/template.html +45 -0
  197. package/src/export/html/template.js +1329 -0
  198. package/src/export/html/template.macro.ts +24 -0
  199. package/src/export/html/vendor/highlight.min.js +1213 -0
  200. package/src/export/html/vendor/marked.min.js +6 -0
  201. package/src/export/ttsr.ts +434 -0
  202. package/src/extensibility/custom-commands/bundled/review/index.ts +433 -0
  203. package/src/extensibility/custom-commands/index.ts +15 -0
  204. package/src/extensibility/custom-commands/loader.ts +231 -0
  205. package/src/extensibility/custom-commands/types.ts +111 -0
  206. package/src/extensibility/custom-tools/index.ts +22 -0
  207. package/src/extensibility/custom-tools/loader.ts +235 -0
  208. package/src/extensibility/custom-tools/types.ts +226 -0
  209. package/src/extensibility/custom-tools/wrapper.ts +45 -0
  210. package/src/extensibility/extensions/index.ts +136 -0
  211. package/src/extensibility/extensions/loader.ts +520 -0
  212. package/src/extensibility/extensions/runner.ts +774 -0
  213. package/src/extensibility/extensions/types.ts +1293 -0
  214. package/src/extensibility/extensions/wrapper.ts +188 -0
  215. package/src/extensibility/hooks/index.ts +16 -0
  216. package/src/extensibility/hooks/loader.ts +273 -0
  217. package/src/extensibility/hooks/runner.ts +441 -0
  218. package/src/extensibility/hooks/tool-wrapper.ts +106 -0
  219. package/src/extensibility/hooks/types.ts +817 -0
  220. package/src/extensibility/plugins/doctor.ts +65 -0
  221. package/src/extensibility/plugins/git-url.ts +281 -0
  222. package/src/extensibility/plugins/index.ts +33 -0
  223. package/src/extensibility/plugins/installer.ts +192 -0
  224. package/src/extensibility/plugins/loader.ts +338 -0
  225. package/src/extensibility/plugins/manager.ts +716 -0
  226. package/src/extensibility/plugins/parser.ts +105 -0
  227. package/src/extensibility/plugins/types.ts +190 -0
  228. package/src/extensibility/skills.ts +385 -0
  229. package/src/extensibility/slash-commands.ts +287 -0
  230. package/src/extensibility/tool-proxy.ts +25 -0
  231. package/src/index.ts +275 -0
  232. package/src/internal-urls/agent-protocol.ts +136 -0
  233. package/src/internal-urls/artifact-protocol.ts +97 -0
  234. package/src/internal-urls/docs-index.generated.ts +54 -0
  235. package/src/internal-urls/docs-protocol.ts +84 -0
  236. package/src/internal-urls/index.ts +31 -0
  237. package/src/internal-urls/json-query.ts +126 -0
  238. package/src/internal-urls/memory-protocol.ts +133 -0
  239. package/src/internal-urls/router.ts +70 -0
  240. package/src/internal-urls/rule-protocol.ts +55 -0
  241. package/src/internal-urls/skill-protocol.ts +111 -0
  242. package/src/internal-urls/types.ts +52 -0
  243. package/src/ipy/executor.ts +556 -0
  244. package/src/ipy/gateway-coordinator.ts +426 -0
  245. package/src/ipy/kernel.ts +892 -0
  246. package/src/ipy/modules.ts +109 -0
  247. package/src/ipy/prelude.py +831 -0
  248. package/src/ipy/prelude.ts +3 -0
  249. package/src/ipy/runtime.ts +222 -0
  250. package/src/lsp/client.ts +867 -0
  251. package/src/lsp/clients/biome-client.ts +202 -0
  252. package/src/lsp/clients/index.ts +50 -0
  253. package/src/lsp/clients/lsp-linter-client.ts +93 -0
  254. package/src/lsp/clients/swiftlint-client.ts +120 -0
  255. package/src/lsp/config.ts +397 -0
  256. package/src/lsp/defaults.json +464 -0
  257. package/src/lsp/edits.ts +109 -0
  258. package/src/lsp/index.ts +1268 -0
  259. package/src/lsp/lspmux.ts +250 -0
  260. package/src/lsp/render.ts +689 -0
  261. package/src/lsp/types.ts +414 -0
  262. package/src/lsp/utils.ts +549 -0
  263. package/src/main.ts +773 -0
  264. package/src/mcp/client.ts +239 -0
  265. package/src/mcp/config-writer.ts +215 -0
  266. package/src/mcp/config.ts +363 -0
  267. package/src/mcp/index.ts +55 -0
  268. package/src/mcp/json-rpc.ts +84 -0
  269. package/src/mcp/loader.ts +124 -0
  270. package/src/mcp/manager.ts +490 -0
  271. package/src/mcp/oauth-discovery.ts +274 -0
  272. package/src/mcp/oauth-flow.ts +229 -0
  273. package/src/mcp/render.ts +123 -0
  274. package/src/mcp/tool-bridge.ts +372 -0
  275. package/src/mcp/tool-cache.ts +121 -0
  276. package/src/mcp/transports/http.ts +332 -0
  277. package/src/mcp/transports/index.ts +6 -0
  278. package/src/mcp/transports/stdio.ts +281 -0
  279. package/src/mcp/types.ts +248 -0
  280. package/src/memories/index.ts +1099 -0
  281. package/src/memories/storage.ts +563 -0
  282. package/src/modes/components/agent-dashboard.ts +1130 -0
  283. package/src/modes/components/assistant-message.ts +144 -0
  284. package/src/modes/components/bash-execution.ts +218 -0
  285. package/src/modes/components/bordered-loader.ts +41 -0
  286. package/src/modes/components/branch-summary-message.ts +45 -0
  287. package/src/modes/components/codemode-group.ts +369 -0
  288. package/src/modes/components/compaction-summary-message.ts +51 -0
  289. package/src/modes/components/countdown-timer.ts +46 -0
  290. package/src/modes/components/custom-editor.ts +181 -0
  291. package/src/modes/components/custom-message.ts +91 -0
  292. package/src/modes/components/diff.ts +186 -0
  293. package/src/modes/components/dynamic-border.ts +25 -0
  294. package/src/modes/components/extensions/extension-dashboard.ts +325 -0
  295. package/src/modes/components/extensions/extension-list.ts +484 -0
  296. package/src/modes/components/extensions/index.ts +9 -0
  297. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  298. package/src/modes/components/extensions/state-manager.ts +586 -0
  299. package/src/modes/components/extensions/types.ts +191 -0
  300. package/src/modes/components/footer.ts +315 -0
  301. package/src/modes/components/history-search.ts +157 -0
  302. package/src/modes/components/hook-editor.ts +101 -0
  303. package/src/modes/components/hook-input.ts +72 -0
  304. package/src/modes/components/hook-message.ts +100 -0
  305. package/src/modes/components/hook-selector.ts +155 -0
  306. package/src/modes/components/index.ts +41 -0
  307. package/src/modes/components/keybinding-hints.ts +65 -0
  308. package/src/modes/components/login-dialog.ts +164 -0
  309. package/src/modes/components/mcp-add-wizard.ts +1295 -0
  310. package/src/modes/components/model-selector.ts +625 -0
  311. package/src/modes/components/oauth-selector.ts +210 -0
  312. package/src/modes/components/plugin-settings.ts +477 -0
  313. package/src/modes/components/python-execution.ts +196 -0
  314. package/src/modes/components/queue-mode-selector.ts +56 -0
  315. package/src/modes/components/read-tool-group.ts +119 -0
  316. package/src/modes/components/session-selector.ts +242 -0
  317. package/src/modes/components/settings-defs.ts +340 -0
  318. package/src/modes/components/settings-selector.ts +529 -0
  319. package/src/modes/components/show-images-selector.ts +45 -0
  320. package/src/modes/components/skill-message.ts +90 -0
  321. package/src/modes/components/status-line/index.ts +4 -0
  322. package/src/modes/components/status-line/presets.ts +94 -0
  323. package/src/modes/components/status-line/segments.ts +352 -0
  324. package/src/modes/components/status-line/separators.ts +55 -0
  325. package/src/modes/components/status-line/types.ts +75 -0
  326. package/src/modes/components/status-line-segment-editor.ts +354 -0
  327. package/src/modes/components/status-line.ts +421 -0
  328. package/src/modes/components/theme-selector.ts +63 -0
  329. package/src/modes/components/thinking-selector.ts +64 -0
  330. package/src/modes/components/todo-display.ts +115 -0
  331. package/src/modes/components/todo-reminder.ts +40 -0
  332. package/src/modes/components/tool-execution.ts +703 -0
  333. package/src/modes/components/tree-selector.ts +904 -0
  334. package/src/modes/components/ttsr-notification.ts +80 -0
  335. package/src/modes/components/user-message-selector.ts +146 -0
  336. package/src/modes/components/user-message.ts +22 -0
  337. package/src/modes/components/visual-truncate.ts +63 -0
  338. package/src/modes/components/welcome.ts +247 -0
  339. package/src/modes/controllers/command-controller.ts +1120 -0
  340. package/src/modes/controllers/event-controller.ts +479 -0
  341. package/src/modes/controllers/extension-ui-controller.ts +778 -0
  342. package/src/modes/controllers/input-controller.ts +671 -0
  343. package/src/modes/controllers/mcp-command-controller.ts +1315 -0
  344. package/src/modes/controllers/selector-controller.ts +712 -0
  345. package/src/modes/controllers/ssh-command-controller.ts +452 -0
  346. package/src/modes/index.ts +15 -0
  347. package/src/modes/interactive-mode.ts +1027 -0
  348. package/src/modes/print-mode.ts +191 -0
  349. package/src/modes/rpc/rpc-client.ts +583 -0
  350. package/src/modes/rpc/rpc-mode.ts +700 -0
  351. package/src/modes/rpc/rpc-types.ts +236 -0
  352. package/src/modes/theme/dark.json +95 -0
  353. package/src/modes/theme/defaults/alabaster.json +93 -0
  354. package/src/modes/theme/defaults/amethyst.json +96 -0
  355. package/src/modes/theme/defaults/anthracite.json +93 -0
  356. package/src/modes/theme/defaults/basalt.json +91 -0
  357. package/src/modes/theme/defaults/birch.json +95 -0
  358. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  359. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  360. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  361. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  362. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  363. package/src/modes/theme/defaults/dark-copper.json +95 -0
  364. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  365. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  366. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  367. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  368. package/src/modes/theme/defaults/dark-ember.json +95 -0
  369. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  370. package/src/modes/theme/defaults/dark-forest.json +96 -0
  371. package/src/modes/theme/defaults/dark-github.json +105 -0
  372. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  373. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  374. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  375. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  376. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  377. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  378. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  379. package/src/modes/theme/defaults/dark-nord.json +97 -0
  380. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  381. package/src/modes/theme/defaults/dark-one.json +100 -0
  382. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  383. package/src/modes/theme/defaults/dark-reef.json +91 -0
  384. package/src/modes/theme/defaults/dark-retro.json +92 -0
  385. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  386. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  387. package/src/modes/theme/defaults/dark-slate.json +95 -0
  388. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  389. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  390. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  391. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  392. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  393. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  394. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  395. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  396. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  397. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  398. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  399. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  400. package/src/modes/theme/defaults/graphite.json +92 -0
  401. package/src/modes/theme/defaults/index.ts +195 -0
  402. package/src/modes/theme/defaults/light-arctic.json +107 -0
  403. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  404. package/src/modes/theme/defaults/light-canyon.json +91 -0
  405. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  406. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  407. package/src/modes/theme/defaults/light-coral.json +95 -0
  408. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  409. package/src/modes/theme/defaults/light-dawn.json +90 -0
  410. package/src/modes/theme/defaults/light-dunes.json +91 -0
  411. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  412. package/src/modes/theme/defaults/light-forest.json +100 -0
  413. package/src/modes/theme/defaults/light-frost.json +95 -0
  414. package/src/modes/theme/defaults/light-github.json +115 -0
  415. package/src/modes/theme/defaults/light-glacier.json +91 -0
  416. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  417. package/src/modes/theme/defaults/light-haze.json +90 -0
  418. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  419. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  420. package/src/modes/theme/defaults/light-lavender.json +95 -0
  421. package/src/modes/theme/defaults/light-meadow.json +91 -0
  422. package/src/modes/theme/defaults/light-mint.json +95 -0
  423. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  424. package/src/modes/theme/defaults/light-ocean.json +99 -0
  425. package/src/modes/theme/defaults/light-one.json +99 -0
  426. package/src/modes/theme/defaults/light-opal.json +91 -0
  427. package/src/modes/theme/defaults/light-orchard.json +91 -0
  428. package/src/modes/theme/defaults/light-paper.json +95 -0
  429. package/src/modes/theme/defaults/light-prism.json +90 -0
  430. package/src/modes/theme/defaults/light-retro.json +98 -0
  431. package/src/modes/theme/defaults/light-sand.json +95 -0
  432. package/src/modes/theme/defaults/light-savanna.json +91 -0
  433. package/src/modes/theme/defaults/light-solarized.json +102 -0
  434. package/src/modes/theme/defaults/light-soleil.json +90 -0
  435. package/src/modes/theme/defaults/light-sunset.json +99 -0
  436. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  437. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  438. package/src/modes/theme/defaults/light-wetland.json +91 -0
  439. package/src/modes/theme/defaults/light-zenith.json +89 -0
  440. package/src/modes/theme/defaults/limestone.json +94 -0
  441. package/src/modes/theme/defaults/mahogany.json +97 -0
  442. package/src/modes/theme/defaults/marble.json +93 -0
  443. package/src/modes/theme/defaults/obsidian.json +91 -0
  444. package/src/modes/theme/defaults/onyx.json +91 -0
  445. package/src/modes/theme/defaults/pearl.json +93 -0
  446. package/src/modes/theme/defaults/porcelain.json +91 -0
  447. package/src/modes/theme/defaults/quartz.json +96 -0
  448. package/src/modes/theme/defaults/sandstone.json +95 -0
  449. package/src/modes/theme/defaults/titanium.json +90 -0
  450. package/src/modes/theme/light.json +93 -0
  451. package/src/modes/theme/mermaid-cache.ts +111 -0
  452. package/src/modes/theme/theme-schema.json +429 -0
  453. package/src/modes/theme/theme.ts +2333 -0
  454. package/src/modes/types.ts +216 -0
  455. package/src/modes/utils/ui-helpers.ts +529 -0
  456. package/src/patch/applicator.ts +1482 -0
  457. package/src/patch/diff.ts +425 -0
  458. package/src/patch/fuzzy.ts +784 -0
  459. package/src/patch/hashline.ts +972 -0
  460. package/src/patch/index.ts +964 -0
  461. package/src/patch/normalize.ts +397 -0
  462. package/src/patch/normative.ts +72 -0
  463. package/src/patch/parser.ts +532 -0
  464. package/src/patch/shared.ts +400 -0
  465. package/src/patch/types.ts +292 -0
  466. package/src/priority.json +35 -0
  467. package/src/prompts/agents/explore.md +48 -0
  468. package/src/prompts/agents/frontmatter.md +9 -0
  469. package/src/prompts/agents/init.md +36 -0
  470. package/src/prompts/agents/librarian.md +53 -0
  471. package/src/prompts/agents/oracle.md +51 -0
  472. package/src/prompts/agents/reviewer.md +70 -0
  473. package/src/prompts/agents/task.md +14 -0
  474. package/src/prompts/compaction/branch-summary-context.md +5 -0
  475. package/src/prompts/compaction/branch-summary-preamble.md +2 -0
  476. package/src/prompts/compaction/branch-summary.md +30 -0
  477. package/src/prompts/compaction/compaction-short-summary.md +9 -0
  478. package/src/prompts/compaction/compaction-summary-context.md +5 -0
  479. package/src/prompts/compaction/compaction-summary.md +38 -0
  480. package/src/prompts/compaction/compaction-turn-prefix.md +17 -0
  481. package/src/prompts/compaction/compaction-update-summary.md +45 -0
  482. package/src/prompts/memories/consolidation.md +30 -0
  483. package/src/prompts/memories/read_path.md +11 -0
  484. package/src/prompts/memories/stage_one_input.md +6 -0
  485. package/src/prompts/memories/stage_one_system.md +21 -0
  486. package/src/prompts/review-request.md +64 -0
  487. package/src/prompts/system/agent-creation-architect.md +65 -0
  488. package/src/prompts/system/agent-creation-user.md +6 -0
  489. package/src/prompts/system/custom-system-prompt.md +68 -0
  490. package/src/prompts/system/file-operations.md +10 -0
  491. package/src/prompts/system/subagent-submit-reminder.md +11 -0
  492. package/src/prompts/system/subagent-system-prompt.md +31 -0
  493. package/src/prompts/system/subagent-user-prompt.md +8 -0
  494. package/src/prompts/system/summarization-system.md +3 -0
  495. package/src/prompts/system/system-prompt.md +300 -0
  496. package/src/prompts/system/title-system.md +2 -0
  497. package/src/prompts/system/ttsr-interrupt.md +7 -0
  498. package/src/prompts/system/web-search.md +28 -0
  499. package/src/prompts/tools/ask.md +44 -0
  500. package/src/prompts/tools/bash.md +24 -0
  501. package/src/prompts/tools/browser.md +33 -0
  502. package/src/prompts/tools/calculator.md +12 -0
  503. package/src/prompts/tools/explore.md +29 -0
  504. package/src/prompts/tools/fetch.md +16 -0
  505. package/src/prompts/tools/find.md +18 -0
  506. package/src/prompts/tools/gemini-image.md +23 -0
  507. package/src/prompts/tools/grep.md +28 -0
  508. package/src/prompts/tools/hashline.md +232 -0
  509. package/src/prompts/tools/librarian.md +24 -0
  510. package/src/prompts/tools/lsp.md +28 -0
  511. package/src/prompts/tools/oracle.md +26 -0
  512. package/src/prompts/tools/patch.md +74 -0
  513. package/src/prompts/tools/python.md +66 -0
  514. package/src/prompts/tools/read.md +36 -0
  515. package/src/prompts/tools/replace.md +38 -0
  516. package/src/prompts/tools/reviewer.md +41 -0
  517. package/src/prompts/tools/ssh.md +51 -0
  518. package/src/prompts/tools/task-summary.md +28 -0
  519. package/src/prompts/tools/task.md +275 -0
  520. package/src/prompts/tools/todo-write.md +65 -0
  521. package/src/prompts/tools/undo-edit.md +7 -0
  522. package/src/prompts/tools/web-search.md +19 -0
  523. package/src/prompts/tools/write.md +18 -0
  524. package/src/sdk.ts +1287 -0
  525. package/src/secrets/index.ts +116 -0
  526. package/src/secrets/obfuscator.ts +269 -0
  527. package/src/secrets/regex.ts +21 -0
  528. package/src/session/agent-session.ts +4669 -0
  529. package/src/session/agent-storage.ts +621 -0
  530. package/src/session/artifacts.ts +132 -0
  531. package/src/session/auth-storage.ts +1433 -0
  532. package/src/session/blob-store.ts +103 -0
  533. package/src/session/compaction/branch-summarization.ts +315 -0
  534. package/src/session/compaction/compaction.ts +864 -0
  535. package/src/session/compaction/index.ts +7 -0
  536. package/src/session/compaction/pruning.ts +91 -0
  537. package/src/session/compaction/utils.ts +171 -0
  538. package/src/session/history-storage.ts +170 -0
  539. package/src/session/messages.ts +317 -0
  540. package/src/session/session-manager.ts +2276 -0
  541. package/src/session/session-storage.ts +342 -0
  542. package/src/session/streaming-output.ts +565 -0
  543. package/src/slash-commands/builtin-registry.ts +439 -0
  544. package/src/ssh/config-writer.ts +183 -0
  545. package/src/ssh/connection-manager.ts +444 -0
  546. package/src/ssh/ssh-executor.ts +127 -0
  547. package/src/ssh/sshfs-mount.ts +135 -0
  548. package/src/stt/downloader.ts +71 -0
  549. package/src/stt/index.ts +3 -0
  550. package/src/stt/recorder.ts +351 -0
  551. package/src/stt/setup.ts +52 -0
  552. package/src/stt/stt-controller.ts +160 -0
  553. package/src/stt/transcribe.py +70 -0
  554. package/src/stt/transcriber.ts +91 -0
  555. package/src/system-prompt.ts +685 -0
  556. package/src/task/agents.ts +155 -0
  557. package/src/task/batch.ts +102 -0
  558. package/src/task/commands.ts +134 -0
  559. package/src/task/discovery.ts +126 -0
  560. package/src/task/executor.ts +908 -0
  561. package/src/task/index.ts +223 -0
  562. package/src/task/output-manager.ts +107 -0
  563. package/src/task/parallel.ts +84 -0
  564. package/src/task/render.ts +326 -0
  565. package/src/task/subprocess-tool-registry.ts +88 -0
  566. package/src/task/template.ts +32 -0
  567. package/src/task/types.ts +144 -0
  568. package/src/tools/ask.ts +523 -0
  569. package/src/tools/bash-interactive.ts +419 -0
  570. package/src/tools/bash-interceptor.ts +105 -0
  571. package/src/tools/bash-normalize.ts +107 -0
  572. package/src/tools/bash-skill-urls.ts +177 -0
  573. package/src/tools/bash.ts +347 -0
  574. package/src/tools/browser.ts +1374 -0
  575. package/src/tools/calculator.ts +537 -0
  576. package/src/tools/context.ts +39 -0
  577. package/src/tools/explore.ts +23 -0
  578. package/src/tools/fetch.ts +1091 -0
  579. package/src/tools/find.ts +540 -0
  580. package/src/tools/fs-cache-invalidation.ts +28 -0
  581. package/src/tools/gemini-image.ts +907 -0
  582. package/src/tools/grep.ts +489 -0
  583. package/src/tools/index.ts +337 -0
  584. package/src/tools/json-tree.ts +231 -0
  585. package/src/tools/jtd-to-json-schema.ts +247 -0
  586. package/src/tools/jtd-to-typescript.ts +198 -0
  587. package/src/tools/librarian.ts +33 -0
  588. package/src/tools/list-limit.ts +40 -0
  589. package/src/tools/notebook.ts +287 -0
  590. package/src/tools/oracle.ts +40 -0
  591. package/src/tools/output-meta.ts +459 -0
  592. package/src/tools/output-utils.ts +63 -0
  593. package/src/tools/path-utils.ts +116 -0
  594. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  595. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  596. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  597. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  598. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  599. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  600. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  601. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  602. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  603. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  604. package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
  605. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  606. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  607. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  608. package/src/tools/python.ts +1118 -0
  609. package/src/tools/read.ts +1193 -0
  610. package/src/tools/render-utils.ts +680 -0
  611. package/src/tools/renderers.ts +60 -0
  612. package/src/tools/reviewer-tool.ts +41 -0
  613. package/src/tools/ssh.ts +326 -0
  614. package/src/tools/subagent-tool.ts +169 -0
  615. package/src/tools/submit-result.ts +152 -0
  616. package/src/tools/todo-write.ts +255 -0
  617. package/src/tools/tool-errors.ts +92 -0
  618. package/src/tools/tool-result.ts +86 -0
  619. package/src/tools/undo-edit.ts +145 -0
  620. package/src/tools/undo-history.ts +22 -0
  621. package/src/tools/write.ts +274 -0
  622. package/src/tui/code-cell.ts +108 -0
  623. package/src/tui/file-list.ts +47 -0
  624. package/src/tui/index.ts +11 -0
  625. package/src/tui/output-block.ts +144 -0
  626. package/src/tui/status-line.ts +39 -0
  627. package/src/tui/tree-list.ts +53 -0
  628. package/src/tui/types.ts +16 -0
  629. package/src/tui/utils.ts +116 -0
  630. package/src/utils/changelog.ts +98 -0
  631. package/src/utils/event-bus.ts +33 -0
  632. package/src/utils/external-editor.ts +59 -0
  633. package/src/utils/file-display-mode.ts +36 -0
  634. package/src/utils/file-mentions.ts +384 -0
  635. package/src/utils/frontmatter.ts +101 -0
  636. package/src/utils/fuzzy.ts +108 -0
  637. package/src/utils/ignore-files.ts +119 -0
  638. package/src/utils/image-convert.ts +27 -0
  639. package/src/utils/image-resize.ts +236 -0
  640. package/src/utils/mime.ts +30 -0
  641. package/src/utils/open.ts +20 -0
  642. package/src/utils/shell-snapshot.ts +199 -0
  643. package/src/utils/timings.ts +26 -0
  644. package/src/utils/title-generator.ts +167 -0
  645. package/src/utils/tools-manager.ts +362 -0
  646. package/src/web/scrapers/artifacthub.ts +215 -0
  647. package/src/web/scrapers/arxiv.ts +88 -0
  648. package/src/web/scrapers/aur.ts +175 -0
  649. package/src/web/scrapers/biorxiv.ts +141 -0
  650. package/src/web/scrapers/bluesky.ts +284 -0
  651. package/src/web/scrapers/brew.ts +177 -0
  652. package/src/web/scrapers/cheatsh.ts +78 -0
  653. package/src/web/scrapers/chocolatey.ts +158 -0
  654. package/src/web/scrapers/choosealicense.ts +110 -0
  655. package/src/web/scrapers/cisa-kev.ts +100 -0
  656. package/src/web/scrapers/clojars.ts +180 -0
  657. package/src/web/scrapers/coingecko.ts +184 -0
  658. package/src/web/scrapers/crates-io.ts +128 -0
  659. package/src/web/scrapers/crossref.ts +149 -0
  660. package/src/web/scrapers/devto.ts +177 -0
  661. package/src/web/scrapers/discogs.ts +307 -0
  662. package/src/web/scrapers/discourse.ts +221 -0
  663. package/src/web/scrapers/dockerhub.ts +160 -0
  664. package/src/web/scrapers/fdroid.ts +158 -0
  665. package/src/web/scrapers/firefox-addons.ts +214 -0
  666. package/src/web/scrapers/flathub.ts +239 -0
  667. package/src/web/scrapers/github-gist.ts +68 -0
  668. package/src/web/scrapers/github.ts +490 -0
  669. package/src/web/scrapers/gitlab.ts +456 -0
  670. package/src/web/scrapers/go-pkg.ts +275 -0
  671. package/src/web/scrapers/hackage.ts +94 -0
  672. package/src/web/scrapers/hackernews.ts +208 -0
  673. package/src/web/scrapers/hex.ts +121 -0
  674. package/src/web/scrapers/huggingface.ts +385 -0
  675. package/src/web/scrapers/iacr.ts +86 -0
  676. package/src/web/scrapers/index.ts +249 -0
  677. package/src/web/scrapers/jetbrains-marketplace.ts +169 -0
  678. package/src/web/scrapers/lemmy.ts +220 -0
  679. package/src/web/scrapers/lobsters.ts +186 -0
  680. package/src/web/scrapers/mastodon.ts +310 -0
  681. package/src/web/scrapers/maven.ts +152 -0
  682. package/src/web/scrapers/mdn.ts +172 -0
  683. package/src/web/scrapers/metacpan.ts +253 -0
  684. package/src/web/scrapers/musicbrainz.ts +272 -0
  685. package/src/web/scrapers/npm.ts +114 -0
  686. package/src/web/scrapers/nuget.ts +205 -0
  687. package/src/web/scrapers/nvd.ts +243 -0
  688. package/src/web/scrapers/ollama.ts +265 -0
  689. package/src/web/scrapers/open-vsx.ts +119 -0
  690. package/src/web/scrapers/opencorporates.ts +275 -0
  691. package/src/web/scrapers/openlibrary.ts +319 -0
  692. package/src/web/scrapers/orcid.ts +298 -0
  693. package/src/web/scrapers/osv.ts +192 -0
  694. package/src/web/scrapers/packagist.ts +174 -0
  695. package/src/web/scrapers/pub-dev.ts +185 -0
  696. package/src/web/scrapers/pubmed.ts +177 -0
  697. package/src/web/scrapers/pypi.ts +129 -0
  698. package/src/web/scrapers/rawg.ts +124 -0
  699. package/src/web/scrapers/readthedocs.ts +125 -0
  700. package/src/web/scrapers/reddit.ts +104 -0
  701. package/src/web/scrapers/repology.ts +262 -0
  702. package/src/web/scrapers/rfc.ts +209 -0
  703. package/src/web/scrapers/rubygems.ts +117 -0
  704. package/src/web/scrapers/searchcode.ts +217 -0
  705. package/src/web/scrapers/sec-edgar.ts +274 -0
  706. package/src/web/scrapers/semantic-scholar.ts +190 -0
  707. package/src/web/scrapers/snapcraft.ts +200 -0
  708. package/src/web/scrapers/sourcegraph.ts +373 -0
  709. package/src/web/scrapers/spdx.ts +121 -0
  710. package/src/web/scrapers/spotify.ts +217 -0
  711. package/src/web/scrapers/stackoverflow.ts +124 -0
  712. package/src/web/scrapers/terraform.ts +304 -0
  713. package/src/web/scrapers/tldr.ts +51 -0
  714. package/src/web/scrapers/twitter.ts +97 -0
  715. package/src/web/scrapers/types.ts +200 -0
  716. package/src/web/scrapers/utils.ts +142 -0
  717. package/src/web/scrapers/vimeo.ts +152 -0
  718. package/src/web/scrapers/vscode-marketplace.ts +195 -0
  719. package/src/web/scrapers/w3c.ts +163 -0
  720. package/src/web/scrapers/wikidata.ts +357 -0
  721. package/src/web/scrapers/wikipedia.ts +95 -0
  722. package/src/web/scrapers/youtube.ts +312 -0
  723. package/src/web/search/auth.ts +178 -0
  724. package/src/web/search/index.ts +598 -0
  725. package/src/web/search/provider.ts +77 -0
  726. package/src/web/search/providers/anthropic.ts +284 -0
  727. package/src/web/search/providers/base.ts +22 -0
  728. package/src/web/search/providers/brave.ts +165 -0
  729. package/src/web/search/providers/codex.ts +377 -0
  730. package/src/web/search/providers/exa.ts +158 -0
  731. package/src/web/search/providers/gemini.ts +437 -0
  732. package/src/web/search/providers/jina.ts +99 -0
  733. package/src/web/search/providers/kimi.ts +196 -0
  734. package/src/web/search/providers/perplexity.ts +546 -0
  735. package/src/web/search/providers/synthetic.ts +136 -0
  736. package/src/web/search/providers/zai.ts +352 -0
  737. package/src/web/search/render.ts +299 -0
  738. package/src/web/search/types.ts +437 -0
@@ -0,0 +1,1236 @@
1
+ /**
2
+ * Unified settings schema - single source of truth for all settings.
3
+ *
4
+ * Each setting is defined once here with:
5
+ * - Type and default value
6
+ * - Optional UI metadata (label, description, tab)
7
+ *
8
+ * The Settings singleton provides type-safe path-based access:
9
+ * settings.get("compaction.enabled") // => boolean
10
+ * settings.set("theme.dark", "titanium") // sync, saves in background
11
+ */
12
+
13
+ // ═══════════════════════════════════════════════════════════════════════════
14
+ // Schema Definition Types
15
+ // ═══════════════════════════════════════════════════════════════════════════
16
+
17
+ export type SettingTab =
18
+ | "display"
19
+ | "agent"
20
+ | "input"
21
+ | "tools"
22
+ | "config"
23
+ | "services"
24
+ | "bash"
25
+ | "lsp"
26
+ | "ttsr"
27
+ | "status";
28
+
29
+ /** Tab display metadata - icon is resolved via theme.symbol() */
30
+ export type TabMetadata = { label: string; icon: `tab.${string}` };
31
+
32
+ /** Ordered list of tabs for UI rendering (status excluded - custom menu) */
33
+ export const SETTING_TABS: SettingTab[] = [
34
+ "display",
35
+ "agent",
36
+ "input",
37
+ "tools",
38
+ "config",
39
+ "services",
40
+ "bash",
41
+ "lsp",
42
+ "ttsr",
43
+ ];
44
+
45
+ /** Tab display metadata - icon is a symbol key from theme.ts (tab.*) */
46
+ export const TAB_METADATA: Record<SettingTab, { label: string; icon: `tab.${string}` }> = {
47
+ display: { label: "Display", icon: "tab.display" },
48
+ agent: { label: "Agent", icon: "tab.agent" },
49
+ input: { label: "Input", icon: "tab.input" },
50
+ tools: { label: "Tools", icon: "tab.tools" },
51
+ config: { label: "Config", icon: "tab.config" },
52
+ services: { label: "Services", icon: "tab.services" },
53
+ bash: { label: "Bash", icon: "tab.bash" },
54
+ lsp: { label: "LSP", icon: "tab.lsp" },
55
+ ttsr: { label: "TTSR", icon: "tab.ttsr" },
56
+ status: { label: "Status", icon: "tab.status" },
57
+ };
58
+
59
+ /** Status line segment identifiers */
60
+ export type StatusLineSegmentId =
61
+ | "arcane"
62
+ | "model"
63
+ | "path"
64
+ | "git"
65
+ | "subagents"
66
+ | "token_in"
67
+ | "token_out"
68
+ | "token_total"
69
+ | "cost"
70
+ | "context_pct"
71
+ | "context_total"
72
+ | "time_spent"
73
+ | "time"
74
+ | "session"
75
+ | "hostname"
76
+ | "cache_read"
77
+ | "cache_write";
78
+
79
+ interface UiMetadata {
80
+ tab: SettingTab;
81
+ label: string;
82
+ description: string;
83
+ /** For enum/submenu - display as inline toggle vs dropdown */
84
+ submenu?: boolean;
85
+ /** Condition function name - setting only shown when true */
86
+ condition?: string;
87
+ }
88
+
89
+ interface BooleanDef {
90
+ type: "boolean";
91
+ default: boolean;
92
+ ui?: UiMetadata;
93
+ }
94
+
95
+ interface StringDef {
96
+ type: "string";
97
+ default: string | undefined;
98
+ ui?: UiMetadata;
99
+ }
100
+
101
+ interface NumberDef {
102
+ type: "number";
103
+ default: number;
104
+ ui?: UiMetadata;
105
+ }
106
+
107
+ interface EnumDef<T extends readonly string[]> {
108
+ type: "enum";
109
+ values: T;
110
+ default: T[number];
111
+ ui?: UiMetadata;
112
+ }
113
+
114
+ interface ArrayDef<T> {
115
+ type: "array";
116
+ default: T[];
117
+ ui?: UiMetadata;
118
+ }
119
+
120
+ interface RecordDef<T> {
121
+ type: "record";
122
+ default: Record<string, T>;
123
+ ui?: UiMetadata;
124
+ }
125
+
126
+ type SettingDef =
127
+ | BooleanDef
128
+ | StringDef
129
+ | NumberDef
130
+ | EnumDef<readonly string[]>
131
+ | ArrayDef<unknown>
132
+ | RecordDef<unknown>;
133
+
134
+ // ═══════════════════════════════════════════════════════════════════════════
135
+ // Schema Definition
136
+ // ═══════════════════════════════════════════════════════════════════════════
137
+
138
+ export const SETTINGS_SCHEMA = {
139
+ // ─────────────────────────────────────────────────────────────────────────
140
+ // Top-level settings
141
+ // ─────────────────────────────────────────────────────────────────────────
142
+ lastChangelogVersion: { type: "string", default: undefined },
143
+ "theme.dark": {
144
+ type: "string",
145
+ default: "dark-copper",
146
+ ui: {
147
+ tab: "display",
148
+ label: "Dark theme",
149
+ description: "Theme used when terminal has dark background",
150
+ submenu: true,
151
+ },
152
+ },
153
+ "theme.light": {
154
+ type: "string",
155
+ default: "light",
156
+ ui: {
157
+ tab: "display",
158
+ label: "Light theme",
159
+ description: "Theme used when terminal has light background",
160
+ submenu: true,
161
+ },
162
+ },
163
+ symbolPreset: {
164
+ type: "enum",
165
+ values: ["unicode", "nerd", "ascii"] as const,
166
+ default: "unicode",
167
+ ui: { tab: "display", label: "Symbol preset", description: "Icon/symbol style", submenu: true },
168
+ },
169
+ colorBlindMode: {
170
+ type: "boolean",
171
+ default: false,
172
+ ui: {
173
+ tab: "display",
174
+ label: "Color blind mode",
175
+ description: "Use blue instead of green for diff additions",
176
+ },
177
+ },
178
+ defaultThinkingLevel: {
179
+ type: "enum",
180
+ values: ["off", "minimal", "low", "medium", "high", "xhigh"] as const,
181
+ default: "high",
182
+ ui: {
183
+ tab: "agent",
184
+ label: "Thinking level",
185
+ description: "Reasoning depth for thinking-capable models",
186
+ submenu: true,
187
+ },
188
+ },
189
+ temperature: {
190
+ type: "number",
191
+ default: -1,
192
+ ui: {
193
+ tab: "agent",
194
+ label: "Temperature",
195
+ description: "Sampling temperature (0 = deterministic, 1 = creative, -1 = provider default)",
196
+ submenu: true,
197
+ },
198
+ },
199
+ hideThinkingBlock: {
200
+ type: "boolean",
201
+ default: false,
202
+ ui: { tab: "agent", label: "Hide thinking", description: "Hide thinking blocks in assistant responses" },
203
+ },
204
+ steeringMode: {
205
+ type: "enum",
206
+ values: ["all", "one-at-a-time"] as const,
207
+ default: "one-at-a-time",
208
+ ui: {
209
+ tab: "agent",
210
+ label: "Steering mode",
211
+ description: "How to process queued messages while agent is working",
212
+ },
213
+ },
214
+ followUpMode: {
215
+ type: "enum",
216
+ values: ["all", "one-at-a-time"] as const,
217
+ default: "one-at-a-time",
218
+ ui: {
219
+ tab: "agent",
220
+ label: "Follow-up mode",
221
+ description: "How to drain follow-up messages after a turn completes",
222
+ },
223
+ },
224
+ interruptMode: {
225
+ type: "enum",
226
+ values: ["immediate", "wait"] as const,
227
+ default: "immediate",
228
+ ui: { tab: "agent", label: "Interrupt mode", description: "When steering messages interrupt tool execution" },
229
+ },
230
+ doubleEscapeAction: {
231
+ type: "enum",
232
+ values: ["branch", "tree", "none"] as const,
233
+ default: "tree",
234
+ ui: {
235
+ tab: "input",
236
+ label: "Double-escape action",
237
+ description: "Action when pressing Escape twice with empty editor",
238
+ },
239
+ },
240
+ shellPath: { type: "string", default: undefined },
241
+ collapseChangelog: {
242
+ type: "boolean",
243
+ default: false,
244
+ ui: { tab: "input", label: "Collapse changelog", description: "Show condensed changelog after updates" },
245
+ },
246
+ autocompleteMaxVisible: {
247
+ type: "number",
248
+ default: 5,
249
+ ui: {
250
+ tab: "input",
251
+ label: "Autocomplete max items",
252
+ description: "Max visible items in autocomplete dropdown (3-20)",
253
+ submenu: true,
254
+ },
255
+ },
256
+ normativeRewrite: {
257
+ type: "boolean",
258
+ default: false,
259
+ ui: {
260
+ tab: "agent",
261
+ label: "Normative rewrite",
262
+ description: "Rewrite tool call arguments to normalized format in session history",
263
+ },
264
+ },
265
+ repeatToolDescriptions: {
266
+ type: "boolean",
267
+ default: false,
268
+ ui: {
269
+ tab: "agent",
270
+ label: "Repeat tool descriptions",
271
+ description: "Render full tool descriptions in the system prompt instead of a tool name list",
272
+ },
273
+ },
274
+ readLineNumbers: {
275
+ type: "boolean",
276
+ default: false,
277
+ ui: {
278
+ tab: "config",
279
+ label: "Read line numbers",
280
+ description: "Prepend line numbers to read tool output by default",
281
+ },
282
+ },
283
+ readHashLines: {
284
+ type: "boolean",
285
+ default: true,
286
+ ui: {
287
+ tab: "config",
288
+ label: "Read hash lines",
289
+ description: "Include line hashes in read output for hashline edit mode (LINE#ID:content)",
290
+ },
291
+ },
292
+ showHardwareCursor: {
293
+ type: "boolean",
294
+ default: true, // will be computed based on platform if undefined
295
+ ui: { tab: "display", label: "Hardware cursor", description: "Show terminal cursor for IME support" },
296
+ },
297
+ clearOnShrink: {
298
+ type: "boolean",
299
+ default: false,
300
+ ui: {
301
+ tab: "display",
302
+ label: "Clear on shrink",
303
+ description: "Clear empty rows when content shrinks (may cause flicker)",
304
+ },
305
+ },
306
+ extensions: { type: "array", default: [] as string[] },
307
+ enabledModels: { type: "array", default: [] as string[] },
308
+ disabledProviders: { type: "array", default: [] as string[] },
309
+ disabledExtensions: { type: "array", default: [] as string[] },
310
+ modelRoles: { type: "record", default: {} as Record<string, string> },
311
+ "contextPromotion.enabled": {
312
+ type: "boolean",
313
+ default: true,
314
+ ui: {
315
+ tab: "agent",
316
+ label: "Auto-promote context",
317
+ description: "Promote to a larger-context model on context overflow instead of compacting",
318
+ },
319
+ },
320
+
321
+ // ─────────────────────────────────────────────────────────────────────────
322
+ // Secrets settings
323
+ // ─────────────────────────────────────────────────────────────────────────
324
+ "secrets.enabled": {
325
+ type: "boolean",
326
+ default: false,
327
+ ui: { tab: "config", label: "Hide secrets", description: "Obfuscate secrets before sending to AI providers" },
328
+ },
329
+
330
+ // ─────────────────────────────────────────────────────────────────────────
331
+ // Compaction settings
332
+ // ─────────────────────────────────────────────────────────────────────────
333
+ "compaction.enabled": {
334
+ type: "boolean",
335
+ default: true,
336
+ ui: {
337
+ tab: "agent",
338
+ label: "Auto-compact",
339
+ description: "Automatically compact context when it gets too large",
340
+ },
341
+ },
342
+ "compaction.reserveTokens": { type: "number", default: 16384 },
343
+ "compaction.keepRecentTokens": { type: "number", default: 20000 },
344
+ "compaction.autoContinue": { type: "boolean", default: true },
345
+ "compaction.remoteEndpoint": { type: "string", default: undefined },
346
+
347
+ // ─────────────────────────────────────────────────────────────────────────
348
+ // Branch summary settings
349
+ // ─────────────────────────────────────────────────────────────────────────
350
+ "branchSummary.enabled": {
351
+ type: "boolean",
352
+ default: false,
353
+ ui: { tab: "agent", label: "Branch summaries", description: "Prompt to summarize when leaving a branch" },
354
+ },
355
+ "branchSummary.reserveTokens": { type: "number", default: 16384 },
356
+
357
+ // ─────────────────────────────────────────────────────────────────────────
358
+ // Memories settings
359
+ // ─────────────────────────────────────────────────────────────────────────
360
+ "memories.enabled": {
361
+ type: "boolean",
362
+ default: false,
363
+ ui: {
364
+ tab: "agent",
365
+ label: "Memories",
366
+ description: "Enable autonomous memory extraction and consolidation",
367
+ },
368
+ },
369
+ "memories.maxRolloutsPerStartup": { type: "number", default: 64 },
370
+ "memories.maxRolloutAgeDays": { type: "number", default: 30 },
371
+ "memories.minRolloutIdleHours": { type: "number", default: 12 },
372
+ "memories.threadScanLimit": { type: "number", default: 300 },
373
+ "memories.maxRawMemoriesForGlobal": { type: "number", default: 200 },
374
+ "memories.stage1Concurrency": { type: "number", default: 8 },
375
+ "memories.stage1LeaseSeconds": { type: "number", default: 120 },
376
+ "memories.stage1RetryDelaySeconds": { type: "number", default: 120 },
377
+ "memories.phase2LeaseSeconds": { type: "number", default: 180 },
378
+ "memories.phase2RetryDelaySeconds": { type: "number", default: 180 },
379
+ "memories.phase2HeartbeatSeconds": { type: "number", default: 30 },
380
+ "memories.rolloutPayloadPercent": { type: "number", default: 0.7 },
381
+ "memories.fallbackTokenLimit": { type: "number", default: 16000 },
382
+ "memories.summaryInjectionTokenLimit": { type: "number", default: 5000 },
383
+
384
+ // ─────────────────────────────────────────────────────────────────────────
385
+ // Retry settings
386
+ // ─────────────────────────────────────────────────────────────────────────
387
+ "retry.enabled": { type: "boolean", default: true },
388
+ "retry.maxRetries": {
389
+ type: "number",
390
+ default: 3,
391
+ ui: {
392
+ tab: "agent",
393
+ label: "Retry max attempts",
394
+ description: "Maximum retry attempts on API errors",
395
+ submenu: true,
396
+ },
397
+ },
398
+ "retry.baseDelayMs": { type: "number", default: 2000 },
399
+
400
+ // ─────────────────────────────────────────────────────────────────────────
401
+ // Todo completion settings
402
+ // ─────────────────────────────────────────────────────────────────────────
403
+ "todo.reminders": {
404
+ type: "boolean",
405
+ default: false,
406
+ ui: { tab: "agent", label: "Todo reminders", description: "Remind agent to complete todos before stopping" },
407
+ },
408
+ "todo.reminders.max": {
409
+ type: "number",
410
+ default: 3,
411
+ ui: {
412
+ tab: "agent",
413
+ label: "Todo max reminders",
414
+ description: "Maximum reminders to complete todos before giving up",
415
+ submenu: true,
416
+ },
417
+ },
418
+
419
+ // ─────────────────────────────────────────────────────────────────────────
420
+ // Optional tools
421
+ // ─────────────────────────────────────────────────────────────────────────
422
+ "todo.enabled": {
423
+ type: "boolean",
424
+ default: true,
425
+ ui: { tab: "tools", label: "Enable Todos", description: "Enable the todo_write tool for task tracking" },
426
+ },
427
+ "find.enabled": {
428
+ type: "boolean",
429
+ default: true,
430
+ ui: { tab: "tools", label: "Enable Find", description: "Enable the find tool for file searching" },
431
+ },
432
+ "grep.enabled": {
433
+ type: "boolean",
434
+ default: true,
435
+ ui: { tab: "tools", label: "Enable Grep", description: "Enable the grep tool for content searching" },
436
+ },
437
+ "grep.contextBefore": {
438
+ type: "number",
439
+ default: 0,
440
+ ui: {
441
+ tab: "tools",
442
+ label: "Grep context before",
443
+ description: "Lines of context before each grep match",
444
+ submenu: true,
445
+ },
446
+ },
447
+ "grep.contextAfter": {
448
+ type: "number",
449
+ default: 0,
450
+ ui: {
451
+ tab: "tools",
452
+ label: "Grep context after",
453
+ description: "Lines of context after each grep match",
454
+ submenu: true,
455
+ },
456
+ },
457
+ "notebook.enabled": {
458
+ type: "boolean",
459
+ default: true,
460
+ ui: { tab: "tools", label: "Enable Notebook", description: "Enable the notebook tool for notebook editing" },
461
+ },
462
+ "oracle.enabled": {
463
+ type: "boolean",
464
+ default: true,
465
+ ui: { tab: "tools", label: "Enable Oracle", description: "Enable the Oracle cross-model reasoning advisor tool" },
466
+ },
467
+ "fetch.enabled": {
468
+ type: "boolean",
469
+ default: true,
470
+ ui: { tab: "tools", label: "Enable Fetch", description: "Enable the fetch tool for URL fetching" },
471
+ },
472
+ "librarian.enabled": {
473
+ type: "boolean",
474
+ default: true,
475
+ ui: {
476
+ tab: "tools",
477
+ label: "Enable Librarian",
478
+ description: "Enable the Librarian tool for repository exploration via GitHub",
479
+ },
480
+ },
481
+ "web_search.enabled": {
482
+ type: "boolean",
483
+ default: true,
484
+ ui: { tab: "tools", label: "Enable Web Search", description: "Enable the web_search tool for web searching" },
485
+ },
486
+ "lsp.enabled": {
487
+ type: "boolean",
488
+ default: true,
489
+ ui: { tab: "tools", label: "Enable LSP", description: "Enable the lsp tool for language server protocol" },
490
+ },
491
+ "calc.enabled": {
492
+ type: "boolean",
493
+ default: false,
494
+ ui: {
495
+ tab: "tools",
496
+ label: "Enable Calculator",
497
+ description: "Enable the calculator tool for basic calculations",
498
+ },
499
+ },
500
+ "browser.enabled": {
501
+ type: "boolean",
502
+ default: true,
503
+ ui: {
504
+ tab: "tools",
505
+ label: "Enable Browser",
506
+ description: "Enable the browser tool (Ulixee Hero)",
507
+ },
508
+ },
509
+ "browser.headless": {
510
+ type: "boolean",
511
+ default: true,
512
+ ui: {
513
+ tab: "tools",
514
+ label: "Browser headless",
515
+ description: "Launch browser in headless mode (disable to show browser UI)",
516
+ },
517
+ },
518
+ "tools.intentTracing": {
519
+ type: "boolean",
520
+ default: true,
521
+ ui: {
522
+ tab: "tools",
523
+ label: "Intent tracing",
524
+ description: "Ask the agent to describe the intent of each tool call before executing it",
525
+ },
526
+ },
527
+
528
+ // ─────────────────────────────────────────────────────────────────────────
529
+ // Task tool settings
530
+ // ─────────────────────────────────────────────────────────────────────────
531
+ "task.isolation.enabled": {
532
+ type: "boolean",
533
+ default: false,
534
+ ui: {
535
+ tab: "tools",
536
+ label: "Task isolation",
537
+ description: "Run subagents in isolated git worktrees",
538
+ submenu: true,
539
+ },
540
+ },
541
+ "task.maxConcurrency": {
542
+ type: "number",
543
+ default: 32,
544
+ ui: {
545
+ tab: "tools",
546
+ label: "Task max concurrency",
547
+ description: "Concurrent limit for subagents",
548
+ submenu: true,
549
+ },
550
+ },
551
+ "task.maxRecursionDepth": {
552
+ type: "number",
553
+ default: 2,
554
+ ui: {
555
+ tab: "tools",
556
+ label: "Task max recursion depth",
557
+ description: "How many levels deep subagents can spawn their own subagents",
558
+ submenu: true,
559
+ },
560
+ },
561
+ "task.disabledAgents": {
562
+ type: "array",
563
+ default: [] as string[],
564
+ },
565
+ "task.agentModelOverrides": {
566
+ type: "record",
567
+ default: {} as Record<string, string>,
568
+ },
569
+
570
+ // ─────────────────────────────────────────────────────────────────────────
571
+ // Startup settings
572
+ // ─────────────────────────────────────────────────────────────────────────
573
+ "startup.quiet": {
574
+ type: "boolean",
575
+ default: false,
576
+ ui: { tab: "input", label: "Startup quiet", description: "Skip welcome screen and startup status messages" },
577
+ },
578
+
579
+ // ─────────────────────────────────────────────────────────────────────────
580
+ // Notification settings
581
+ // ─────────────────────────────────────────────────────────────────────────
582
+ "completion.notify": {
583
+ type: "enum",
584
+ values: ["on", "off"] as const,
585
+ default: "on",
586
+ ui: { tab: "input", label: "Completion notification", description: "Notify when the agent completes" },
587
+ },
588
+
589
+ // ─────────────────────────────────────────────────────────────────────────
590
+ // Ask settings
591
+ // ─────────────────────────────────────────────────────────────────────────
592
+ "ask.timeout": {
593
+ type: "number",
594
+ default: 30,
595
+ ui: {
596
+ tab: "input",
597
+ label: "Ask tool timeout",
598
+ description: "Auto-select recommended option after timeout (0 to disable)",
599
+ submenu: true,
600
+ },
601
+ },
602
+ "ask.notify": {
603
+ type: "enum",
604
+ values: ["on", "off"] as const,
605
+ default: "on",
606
+ ui: { tab: "input", label: "Ask notification", description: "Notify when ask tool is waiting for input" },
607
+ },
608
+
609
+ // ─────────────────────────────────────────────────────────────────────────
610
+ // Terminal settings
611
+ // ─────────────────────────────────────────────────────────────────────────
612
+ "terminal.showImages": {
613
+ type: "boolean",
614
+ default: true,
615
+ ui: {
616
+ tab: "display",
617
+ label: "Show images",
618
+ description: "Render images inline in terminal",
619
+ condition: "hasImageProtocol",
620
+ },
621
+ },
622
+
623
+ // ─────────────────────────────────────────────────────────────────────────
624
+ // Image settings
625
+ // ─────────────────────────────────────────────────────────────────────────
626
+ "images.autoResize": {
627
+ type: "boolean",
628
+ default: true,
629
+ ui: {
630
+ tab: "display",
631
+ label: "Auto-resize images",
632
+ description: "Resize large images to 2000x2000 max for better model compatibility",
633
+ },
634
+ },
635
+ "images.blockImages": {
636
+ type: "boolean",
637
+ default: false,
638
+ ui: { tab: "display", label: "Block images", description: "Prevent images from being sent to LLM providers" },
639
+ },
640
+
641
+ // ─────────────────────────────────────────────────────────────────────────
642
+ // Skills settings
643
+ // ─────────────────────────────────────────────────────────────────────────
644
+ "skills.enabled": { type: "boolean", default: true },
645
+ "skills.enableSkillCommands": {
646
+ type: "boolean",
647
+ default: true,
648
+ ui: { tab: "tools", label: "Skill commands", description: "Register skills as /skill:name commands" },
649
+ },
650
+ "skills.enableCodexUser": { type: "boolean", default: true },
651
+ "skills.enableClaudeUser": { type: "boolean", default: true },
652
+ "skills.enableClaudeProject": { type: "boolean", default: true },
653
+ "skills.enablePiUser": { type: "boolean", default: true },
654
+ "skills.enablePiProject": { type: "boolean", default: true },
655
+ "skills.customDirectories": { type: "array", default: [] as string[] },
656
+ "skills.ignoredSkills": { type: "array", default: [] as string[] },
657
+ "skills.includeSkills": { type: "array", default: [] as string[] },
658
+
659
+ // ─────────────────────────────────────────────────────────────────────────
660
+ // Commands settings
661
+ // ─────────────────────────────────────────────────────────────────────────
662
+ "commands.enableClaudeUser": {
663
+ type: "boolean",
664
+ default: true,
665
+ ui: { tab: "tools", label: "Claude user commands", description: "Load commands from ~/.claude/commands/" },
666
+ },
667
+ "commands.enableClaudeProject": {
668
+ type: "boolean",
669
+ default: true,
670
+ ui: { tab: "tools", label: "Claude project commands", description: "Load commands from .claude/commands/" },
671
+ },
672
+
673
+ // ─────────────────────────────────────────────────────────────────────────
674
+ // Provider settings
675
+ // ─────────────────────────────────────────────────────────────────────────
676
+ "providers.webSearch": {
677
+ type: "enum",
678
+ values: ["auto", "exa", "brave", "jina", "kimi", "zai", "perplexity", "anthropic"] as const,
679
+ default: "auto",
680
+ ui: { tab: "services", label: "Web search provider", description: "Provider for web search tool", submenu: true },
681
+ },
682
+ "providers.image": {
683
+ type: "enum",
684
+ values: ["auto", "gemini", "openrouter"] as const,
685
+ default: "auto",
686
+ ui: {
687
+ tab: "services",
688
+ label: "Image provider",
689
+ description: "Provider for image generation tool",
690
+ submenu: true,
691
+ },
692
+ },
693
+ "providers.kimiApiFormat": {
694
+ type: "enum",
695
+ values: ["openai", "anthropic"] as const,
696
+ default: "anthropic",
697
+ ui: {
698
+ tab: "services",
699
+ label: "Kimi API format",
700
+ description: "API format for Kimi Code provider",
701
+ submenu: true,
702
+ },
703
+ },
704
+ "providers.openaiWebsockets": {
705
+ type: "enum",
706
+ values: ["auto", "off", "on"] as const,
707
+ default: "auto",
708
+ ui: {
709
+ tab: "services",
710
+ label: "OpenAI websockets",
711
+ description: "Websocket policy for OpenAI Codex models (auto uses model defaults, on forces, off disables)",
712
+ submenu: true,
713
+ },
714
+ },
715
+
716
+ // ─────────────────────────────────────────────────────────────────────────
717
+ // Exa settings
718
+ // ─────────────────────────────────────────────────────────────────────────
719
+ "exa.enabled": {
720
+ type: "boolean",
721
+ default: true,
722
+ ui: { tab: "services", label: "Exa enabled", description: "Master toggle for all Exa search tools" },
723
+ },
724
+ "exa.enableSearch": {
725
+ type: "boolean",
726
+ default: true,
727
+ ui: { tab: "services", label: "Exa search", description: "Basic search, deep search, code search, crawl" },
728
+ },
729
+ "exa.enableLinkedin": {
730
+ type: "boolean",
731
+ default: false,
732
+ ui: { tab: "services", label: "Exa LinkedIn", description: "Search LinkedIn for people and companies" },
733
+ },
734
+ "exa.enableCompany": {
735
+ type: "boolean",
736
+ default: false,
737
+ ui: { tab: "services", label: "Exa company", description: "Comprehensive company research tool" },
738
+ },
739
+ "exa.enableResearcher": {
740
+ type: "boolean",
741
+ default: false,
742
+ ui: { tab: "services", label: "Exa researcher", description: "AI-powered deep research tasks" },
743
+ },
744
+ "exa.enableWebsets": {
745
+ type: "boolean",
746
+ default: false,
747
+ ui: { tab: "services", label: "Exa websets", description: "Webset management and enrichment tools" },
748
+ },
749
+
750
+ // ─────────────────────────────────────────────────────────────────────────
751
+ // Code Mode settings
752
+ // ─────────────────────────────────────────────────────────────────────────
753
+ "codemode.enabled": {
754
+ type: "boolean",
755
+ default: true,
756
+ ui: {
757
+ tab: "agent",
758
+ label: "Code Mode",
759
+ description: "Replace tool-calling with code generation (LLM writes JS to orchestrate tools)",
760
+ },
761
+ },
762
+
763
+ // Bash interceptor settings
764
+ // ─────────────────────────────────────────────────────────────────────────
765
+ "bash.virtualTerminal": {
766
+ type: "enum",
767
+ values: ["on", "off"] as const,
768
+ default: "off",
769
+ ui: {
770
+ tab: "bash",
771
+ label: "Virtual terminal",
772
+ description: "Use PTY-backed interactive execution for bash",
773
+ submenu: true,
774
+ },
775
+ },
776
+ "bashInterceptor.enabled": {
777
+ type: "boolean",
778
+ default: false,
779
+ ui: { tab: "bash", label: "Interceptor", description: "Block shell commands that have dedicated tools" },
780
+ },
781
+ "bashInterceptor.simpleLs": {
782
+ type: "boolean",
783
+ default: true,
784
+ ui: {
785
+ tab: "bash",
786
+ label: "Intercept ls",
787
+ description: "Intercept bare ls commands (when interceptor is enabled)",
788
+ },
789
+ },
790
+ // bashInterceptor.patterns is complex - handle separately
791
+
792
+ // ─────────────────────────────────────────────────────────────────────────
793
+ // MCP settings
794
+ // ─────────────────────────────────────────────────────────────────────────
795
+ "mcp.enableProjectConfig": {
796
+ type: "boolean",
797
+ default: true,
798
+ ui: { tab: "tools", label: "MCP project config", description: "Load .mcp.json/mcp.json from project root" },
799
+ },
800
+
801
+ // ─────────────────────────────────────────────────────────────────────────
802
+ // LSP settings
803
+ // ─────────────────────────────────────────────────────────────────────────
804
+ "lsp.formatOnWrite": {
805
+ type: "boolean",
806
+ default: false,
807
+ ui: {
808
+ tab: "lsp",
809
+ label: "Format on write",
810
+ description: "Automatically format code files using LSP after writing",
811
+ },
812
+ },
813
+ "lsp.diagnosticsOnWrite": {
814
+ type: "boolean",
815
+ default: true,
816
+ ui: { tab: "lsp", label: "Diagnostics on write", description: "Return LSP diagnostics after writing code files" },
817
+ },
818
+ "lsp.diagnosticsOnEdit": {
819
+ type: "boolean",
820
+ default: false,
821
+ ui: { tab: "lsp", label: "Diagnostics on edit", description: "Return LSP diagnostics after editing code files" },
822
+ },
823
+
824
+ // ─────────────────────────────────────────────────────────────────────────
825
+ // Python settings
826
+ // ─────────────────────────────────────────────────────────────────────────
827
+ "python.toolMode": {
828
+ type: "enum",
829
+ values: ["ipy-only", "bash-only", "both"] as const,
830
+ default: "both",
831
+ ui: { tab: "config", label: "Python tool mode", description: "How Python code is executed" },
832
+ },
833
+ "python.kernelMode": {
834
+ type: "enum",
835
+ values: ["session", "per-call"] as const,
836
+ default: "session",
837
+ ui: {
838
+ tab: "config",
839
+ label: "Python kernel mode",
840
+ description: "Whether to keep IPython kernel alive across calls",
841
+ },
842
+ },
843
+ "python.sharedGateway": {
844
+ type: "boolean",
845
+ default: true,
846
+ ui: {
847
+ tab: "config",
848
+ label: "Python shared gateway",
849
+ description: "Share IPython kernel gateway across pi instances",
850
+ },
851
+ },
852
+
853
+ // ─────────────────────────────────────────────────────────────────────────
854
+ // STT settings
855
+ // ─────────────────────────────────────────────────────────────────────────
856
+ "stt.enabled": {
857
+ type: "boolean",
858
+ default: false,
859
+ ui: { tab: "input", label: "Speech-to-text", description: "Enable speech-to-text input via microphone" },
860
+ },
861
+ "stt.language": {
862
+ type: "string",
863
+ default: "en",
864
+ ui: {
865
+ tab: "input",
866
+ label: "STT language",
867
+ description: "Language code for transcription (e.g., en, es, fr)",
868
+ submenu: true,
869
+ },
870
+ },
871
+ "stt.modelName": {
872
+ type: "enum",
873
+ values: ["tiny", "tiny.en", "base", "base.en", "small", "small.en", "medium", "medium.en", "large"] as const,
874
+ default: "base.en",
875
+ ui: {
876
+ tab: "input",
877
+ label: "STT model",
878
+ description: "Whisper model size (larger = more accurate but slower)",
879
+ submenu: true,
880
+ },
881
+ },
882
+
883
+ // ─────────────────────────────────────────────────────────────────────────
884
+ // Edit settings
885
+ // ─────────────────────────────────────────────────────────────────────────
886
+ "edit.fuzzyMatch": {
887
+ type: "boolean",
888
+ default: true,
889
+ ui: {
890
+ tab: "config",
891
+ label: "Edit fuzzy match",
892
+ description: "Accept high-confidence fuzzy matches for whitespace differences",
893
+ },
894
+ },
895
+ "edit.fuzzyThreshold": {
896
+ type: "number",
897
+ default: 0.95,
898
+ ui: {
899
+ tab: "config",
900
+ label: "Edit fuzzy threshold",
901
+ description: "Similarity threshold for fuzzy matches",
902
+ submenu: true,
903
+ },
904
+ },
905
+ "edit.mode": {
906
+ type: "enum",
907
+ values: ["replace", "patch", "hashline"] as const,
908
+ default: "hashline",
909
+ ui: {
910
+ tab: "config",
911
+ label: "Edit mode",
912
+ description: "Select the edit tool variant (replace, patch, or hashline)",
913
+ },
914
+ },
915
+ "edit.streamingAbort": {
916
+ type: "boolean",
917
+ default: false,
918
+ ui: {
919
+ tab: "config",
920
+ label: "Edit streaming abort",
921
+ description: "Abort streaming edit tool calls when patch preview fails",
922
+ },
923
+ },
924
+ // edit.modelVariants is complex - handle separately
925
+
926
+ // ─────────────────────────────────────────────────────────────────────────
927
+ // TTSR settings
928
+ // ─────────────────────────────────────────────────────────────────────────
929
+ "ttsr.enabled": {
930
+ type: "boolean",
931
+ default: true,
932
+ ui: {
933
+ tab: "ttsr",
934
+ label: "TTSR enabled",
935
+ description: "Time Traveling Stream Rules: interrupt agent when output matches patterns",
936
+ },
937
+ },
938
+ "ttsr.contextMode": {
939
+ type: "enum",
940
+ values: ["discard", "keep"] as const,
941
+ default: "discard",
942
+ ui: { tab: "ttsr", label: "TTSR context mode", description: "What to do with partial output when TTSR triggers" },
943
+ },
944
+ "ttsr.interruptMode": {
945
+ type: "enum",
946
+ values: ["never", "prose-only", "tool-only", "always"] as const,
947
+ default: "always",
948
+ ui: {
949
+ tab: "ttsr",
950
+ label: "TTSR interrupt mode",
951
+ description: "When to interrupt mid-stream vs inject warning after completion",
952
+ submenu: true,
953
+ },
954
+ },
955
+ "ttsr.repeatMode": {
956
+ type: "enum",
957
+ values: ["once", "after-gap"] as const,
958
+ default: "once",
959
+ ui: {
960
+ tab: "ttsr",
961
+ label: "TTSR repeat mode",
962
+ description: "How rules can repeat: once per session or after a message gap",
963
+ },
964
+ },
965
+ "ttsr.repeatGap": {
966
+ type: "number",
967
+ default: 10,
968
+ ui: {
969
+ tab: "ttsr",
970
+ label: "TTSR repeat gap",
971
+ description: "Messages before a rule can trigger again",
972
+ submenu: true,
973
+ },
974
+ },
975
+
976
+ // ─────────────────────────────────────────────────────────────────────────
977
+ // Commit settings (no UI - advanced)
978
+ // ─────────────────────────────────────────────────────────────────────────
979
+ "commit.mapReduceEnabled": { type: "boolean", default: true },
980
+ "commit.mapReduceMinFiles": { type: "number", default: 4 },
981
+ "commit.mapReduceMaxFileTokens": { type: "number", default: 50000 },
982
+ "commit.mapReduceTimeoutMs": { type: "number", default: 120000 },
983
+ "commit.mapReduceMaxConcurrency": { type: "number", default: 5 },
984
+ "commit.changelogMaxDiffChars": { type: "number", default: 120000 },
985
+
986
+ // ─────────────────────────────────────────────────────────────────────────
987
+ // Thinking budgets (no UI - advanced)
988
+ // ─────────────────────────────────────────────────────────────────────────
989
+ "thinkingBudgets.minimal": { type: "number", default: 1024 },
990
+ "thinkingBudgets.low": { type: "number", default: 2048 },
991
+ "thinkingBudgets.medium": { type: "number", default: 8192 },
992
+ "thinkingBudgets.high": { type: "number", default: 16384 },
993
+
994
+ // ─────────────────────────────────────────────────────────────────────────
995
+ // Status line settings
996
+ // ─────────────────────────────────────────────────────────────────────────
997
+ "statusLine.preset": {
998
+ type: "enum",
999
+ values: ["default", "minimal", "compact", "full", "nerd", "ascii", "custom"] as const,
1000
+ default: "default",
1001
+ ui: { tab: "status", label: "Preset", description: "Pre-built status line configurations", submenu: true },
1002
+ },
1003
+ "statusLine.separator": {
1004
+ type: "enum",
1005
+ values: ["powerline", "powerline-thin", "slash", "pipe", "block", "none", "ascii"] as const,
1006
+ default: "powerline-thin",
1007
+ ui: {
1008
+ tab: "status",
1009
+ label: "Separator style",
1010
+ description: "Style of separators between segments",
1011
+ submenu: true,
1012
+ },
1013
+ },
1014
+ "statusLine.showHookStatus": {
1015
+ type: "boolean",
1016
+ default: true,
1017
+ ui: {
1018
+ tab: "status",
1019
+ label: "Show extension status",
1020
+ description: "Display hook status messages below status line",
1021
+ },
1022
+ },
1023
+ "statusLine.leftSegments": { type: "array", default: [] as StatusLineSegmentId[] },
1024
+ "statusLine.rightSegments": { type: "array", default: [] as StatusLineSegmentId[] },
1025
+ "statusLine.segmentOptions": { type: "record", default: {} as Record<string, unknown> },
1026
+ } as const;
1027
+
1028
+ // ═══════════════════════════════════════════════════════════════════════════
1029
+ // Type Inference
1030
+ // ═══════════════════════════════════════════════════════════════════════════
1031
+
1032
+ type Schema = typeof SETTINGS_SCHEMA;
1033
+
1034
+ /** All valid setting paths */
1035
+ export type SettingPath = keyof Schema;
1036
+
1037
+ /** Infer the value type for a setting path */
1038
+ export type SettingValue<P extends SettingPath> = Schema[P] extends { type: "boolean" }
1039
+ ? boolean
1040
+ : Schema[P] extends { type: "string" }
1041
+ ? string | undefined
1042
+ : Schema[P] extends { type: "number" }
1043
+ ? number
1044
+ : Schema[P] extends { type: "enum"; values: infer V }
1045
+ ? V extends readonly string[]
1046
+ ? V[number]
1047
+ : never
1048
+ : Schema[P] extends { type: "array"; default: infer D }
1049
+ ? D
1050
+ : Schema[P] extends { type: "record"; default: infer D }
1051
+ ? D
1052
+ : never;
1053
+
1054
+ /** Get the default value for a setting path */
1055
+ export function getDefault<P extends SettingPath>(path: P): SettingValue<P> {
1056
+ return SETTINGS_SCHEMA[path].default as SettingValue<P>;
1057
+ }
1058
+
1059
+ /** Check if a path has UI metadata (should appear in settings panel) */
1060
+ export function hasUi(path: SettingPath): boolean {
1061
+ return "ui" in SETTINGS_SCHEMA[path];
1062
+ }
1063
+
1064
+ /** Get UI metadata for a path (undefined if no UI) */
1065
+ export function getUi(path: SettingPath): UiMetadata | undefined {
1066
+ const def = SETTINGS_SCHEMA[path];
1067
+ return "ui" in def ? (def.ui as UiMetadata) : undefined;
1068
+ }
1069
+
1070
+ /** Get all paths for a specific tab */
1071
+ export function getPathsForTab(tab: SettingTab): SettingPath[] {
1072
+ return (Object.keys(SETTINGS_SCHEMA) as SettingPath[]).filter(path => {
1073
+ const ui = getUi(path);
1074
+ return ui?.tab === tab;
1075
+ });
1076
+ }
1077
+
1078
+ /** Get the type of a setting */
1079
+ export function getType(path: SettingPath): SettingDef["type"] {
1080
+ return SETTINGS_SCHEMA[path].type;
1081
+ }
1082
+
1083
+ /** Get enum values for an enum setting */
1084
+ export function getEnumValues(path: SettingPath): readonly string[] | undefined {
1085
+ const def = SETTINGS_SCHEMA[path];
1086
+ return "values" in def ? (def.values as readonly string[]) : undefined;
1087
+ }
1088
+
1089
+ // ═══════════════════════════════════════════════════════════════════════════
1090
+ // Derived Types from Schema
1091
+ // ═══════════════════════════════════════════════════════════════════════════
1092
+
1093
+ /** Status line preset - derived from schema */
1094
+ export type StatusLinePreset = SettingValue<"statusLine.preset">;
1095
+
1096
+ /** Status line separator style - derived from schema */
1097
+ export type StatusLineSeparatorStyle = SettingValue<"statusLine.separator">;
1098
+
1099
+ // ═══════════════════════════════════════════════════════════════════════════
1100
+ // Typed Group Definitions
1101
+ // ═══════════════════════════════════════════════════════════════════════════
1102
+
1103
+ export interface CompactionSettings {
1104
+ enabled: boolean;
1105
+ reserveTokens: number;
1106
+ keepRecentTokens: number;
1107
+ autoContinue: boolean;
1108
+ remoteEndpoint: string | undefined;
1109
+ }
1110
+
1111
+ export interface ContextPromotionSettings {
1112
+ enabled: boolean;
1113
+ }
1114
+ export interface RetrySettings {
1115
+ enabled: boolean;
1116
+ maxRetries: number;
1117
+ baseDelayMs: number;
1118
+ }
1119
+
1120
+ export interface MemoriesSettings {
1121
+ enabled: boolean;
1122
+ maxRolloutsPerStartup: number;
1123
+ maxRolloutAgeDays: number;
1124
+ minRolloutIdleHours: number;
1125
+ threadScanLimit: number;
1126
+ maxRawMemoriesForGlobal: number;
1127
+ stage1Concurrency: number;
1128
+ stage1LeaseSeconds: number;
1129
+ stage1RetryDelaySeconds: number;
1130
+ phase2LeaseSeconds: number;
1131
+ phase2RetryDelaySeconds: number;
1132
+ phase2HeartbeatSeconds: number;
1133
+ rolloutPayloadPercent: number;
1134
+ fallbackTokenLimit: number;
1135
+ summaryInjectionTokenLimit: number;
1136
+ }
1137
+
1138
+ export interface TodoCompletionSettings {
1139
+ enabled: boolean;
1140
+ maxReminders: number;
1141
+ }
1142
+
1143
+ export interface BranchSummarySettings {
1144
+ enabled: boolean;
1145
+ reserveTokens: number;
1146
+ }
1147
+
1148
+ export interface SkillsSettings {
1149
+ enabled?: boolean;
1150
+ enableSkillCommands?: boolean;
1151
+ enableCodexUser?: boolean;
1152
+ enableClaudeUser?: boolean;
1153
+ enableClaudeProject?: boolean;
1154
+ enablePiUser?: boolean;
1155
+ enablePiProject?: boolean;
1156
+ customDirectories?: string[];
1157
+ ignoredSkills?: string[];
1158
+ includeSkills?: string[];
1159
+ }
1160
+
1161
+ export interface CommitSettings {
1162
+ mapReduceEnabled: boolean;
1163
+ mapReduceMinFiles: number;
1164
+ mapReduceMaxFileTokens: number;
1165
+ mapReduceTimeoutMs: number;
1166
+ mapReduceMaxConcurrency: number;
1167
+ changelogMaxDiffChars: number;
1168
+ }
1169
+
1170
+ export interface TtsrSettings {
1171
+ enabled: boolean;
1172
+ contextMode: "discard" | "keep";
1173
+ interruptMode: "never" | "prose-only" | "tool-only" | "always";
1174
+ repeatMode: "once" | "after-gap";
1175
+ repeatGap: number;
1176
+ }
1177
+
1178
+ export interface ExaSettings {
1179
+ enabled: boolean;
1180
+ enableSearch: boolean;
1181
+ enableLinkedin: boolean;
1182
+ enableCompany: boolean;
1183
+ enableResearcher: boolean;
1184
+ enableWebsets: boolean;
1185
+ }
1186
+
1187
+ export interface StatusLineSettings {
1188
+ preset: StatusLinePreset;
1189
+ separator: StatusLineSeparatorStyle;
1190
+ showHookStatus: boolean;
1191
+ leftSegments: StatusLineSegmentId[];
1192
+ rightSegments: StatusLineSegmentId[];
1193
+ segmentOptions: Record<string, unknown>;
1194
+ }
1195
+
1196
+ export interface ThinkingBudgetsSettings {
1197
+ minimal: number;
1198
+ low: number;
1199
+ medium: number;
1200
+ high: number;
1201
+ }
1202
+
1203
+ export interface SttSettings {
1204
+ enabled: boolean;
1205
+ language: string | undefined;
1206
+ modelName: string;
1207
+ whisperPath: string | undefined;
1208
+ modelPath: string | undefined;
1209
+ }
1210
+
1211
+ export interface BashInterceptorRule {
1212
+ pattern: string;
1213
+ flags?: string;
1214
+ tool: string;
1215
+ message: string;
1216
+ allowSubcommands?: string[];
1217
+ }
1218
+
1219
+ /** Map group prefix -> typed settings interface */
1220
+ export interface GroupTypeMap {
1221
+ compaction: CompactionSettings;
1222
+ contextPromotion: ContextPromotionSettings;
1223
+ retry: RetrySettings;
1224
+ memories: MemoriesSettings;
1225
+ branchSummary: BranchSummarySettings;
1226
+ skills: SkillsSettings;
1227
+ commit: CommitSettings;
1228
+ ttsr: TtsrSettings;
1229
+ exa: ExaSettings;
1230
+ statusLine: StatusLineSettings;
1231
+ thinkingBudgets: ThinkingBudgetsSettings;
1232
+ stt: SttSettings;
1233
+ modelRoles: Record<string, string>;
1234
+ }
1235
+
1236
+ export type GroupPrefix = keyof GroupTypeMap;