@nghyane/arcane 0.1.13 → 0.1.15

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 (303) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.json +21 -70
  3. package/scripts/format-prompts.ts +1 -3
  4. package/src/cli/args.ts +2 -7
  5. package/src/cli/config-cli.ts +1 -1
  6. package/src/cli/plugin-cli.ts +1 -1
  7. package/src/cli/setup-cli.ts +1 -1
  8. package/src/cli/update-cli.ts +1 -1
  9. package/src/cli/web-search-cli.ts +1 -1
  10. package/src/cli.ts +0 -1
  11. package/src/commands/config.ts +1 -1
  12. package/src/commands/grep.ts +1 -1
  13. package/src/commands/jupyter.ts +1 -1
  14. package/src/commands/plugin.ts +1 -1
  15. package/src/commands/setup.ts +1 -1
  16. package/src/commands/shell.ts +1 -1
  17. package/src/commands/ssh.ts +1 -1
  18. package/src/commands/stats.ts +1 -1
  19. package/src/commands/update.ts +1 -1
  20. package/src/config/model-registry.ts +3 -4
  21. package/src/config/model-resolver.ts +36 -9
  22. package/src/config/prompt-templates.ts +1 -9
  23. package/src/config/settings-schema.ts +32 -88
  24. package/src/config/settings.ts +3 -4
  25. package/src/debug/index.ts +1 -1
  26. package/src/debug/log-formatting.ts +1 -1
  27. package/src/debug/log-viewer.ts +2 -2
  28. package/src/discovery/helpers.ts +13 -3
  29. package/src/exa/index.ts +1 -35
  30. package/src/exa/render.ts +30 -190
  31. package/src/export/html/index.ts +1 -1
  32. package/src/extensibility/custom-tools/loader.ts +1 -1
  33. package/src/extensibility/custom-tools/types.ts +5 -1
  34. package/src/extensibility/custom-tools/wrapper.ts +1 -1
  35. package/src/extensibility/extensions/runner.ts +1 -1
  36. package/src/extensibility/extensions/types.ts +1 -1
  37. package/src/extensibility/extensions/wrapper.ts +7 -15
  38. package/src/extensibility/hooks/runner.ts +1 -1
  39. package/src/extensibility/hooks/types.ts +1 -1
  40. package/src/extensibility/plugins/doctor.ts +1 -1
  41. package/src/index.ts +13 -13
  42. package/src/lsp/index.ts +77 -24
  43. package/src/lsp/render.ts +34 -583
  44. package/src/lsp/types.ts +3 -3
  45. package/src/lsp/utils.ts +1 -1
  46. package/src/main.ts +1 -1
  47. package/src/mcp/tool-bridge.ts +1 -24
  48. package/src/modes/components/assistant-message.ts +7 -7
  49. package/src/modes/components/bash-execution.ts +50 -112
  50. package/src/modes/components/bordered-loader.ts +1 -1
  51. package/src/modes/components/branch-summary-message.ts +16 -10
  52. package/src/modes/components/compaction-summary-message.ts +20 -12
  53. package/src/modes/components/context-group.ts +106 -0
  54. package/src/modes/components/custom-message.ts +4 -5
  55. package/src/modes/components/diff.ts +2 -2
  56. package/src/modes/components/dynamic-border.ts +1 -1
  57. package/src/modes/components/extensions/extension-dashboard.ts +1 -1
  58. package/src/modes/components/extensions/extension-list.ts +1 -1
  59. package/src/modes/components/extensions/inspector-panel.ts +1 -1
  60. package/src/modes/components/footer.ts +2 -2
  61. package/src/modes/components/history-search.ts +1 -1
  62. package/src/modes/components/hook-editor.ts +1 -1
  63. package/src/modes/components/hook-input.ts +1 -1
  64. package/src/modes/components/hook-message.ts +4 -5
  65. package/src/modes/components/hook-selector.ts +1 -1
  66. package/src/modes/components/index.ts +0 -2
  67. package/src/modes/components/keybinding-hints.ts +1 -1
  68. package/src/modes/components/login-dialog.ts +1 -1
  69. package/src/modes/components/mcp-add-wizard.ts +1 -1
  70. package/src/modes/components/model-selector.ts +1 -1
  71. package/src/modes/components/oauth-selector.ts +1 -1
  72. package/src/modes/components/plugin-settings.ts +1 -1
  73. package/src/modes/components/python-execution.ts +51 -91
  74. package/src/modes/components/queue-mode-selector.ts +1 -1
  75. package/src/modes/components/session-selector.ts +1 -1
  76. package/src/modes/components/settings-defs.ts +5 -10
  77. package/src/modes/components/settings-selector.ts +1 -1
  78. package/src/modes/components/show-images-selector.ts +1 -1
  79. package/src/modes/components/skill-message.ts +4 -4
  80. package/src/modes/components/status-line/segments.ts +2 -2
  81. package/src/modes/components/status-line/separators.ts +1 -1
  82. package/src/modes/components/status-line-segment-editor.ts +1 -1
  83. package/src/modes/components/status-line.ts +1 -1
  84. package/src/modes/components/theme-selector.ts +1 -1
  85. package/src/modes/components/thinking-selector.ts +1 -1
  86. package/src/modes/components/todo-display.ts +2 -4
  87. package/src/modes/components/todo-reminder.ts +4 -4
  88. package/src/modes/components/tool-execution.ts +118 -440
  89. package/src/modes/components/tool-image-display.ts +107 -0
  90. package/src/modes/components/tree-selector.ts +2 -2
  91. package/src/modes/components/ttsr-notification.ts +4 -17
  92. package/src/modes/components/user-message-selector.ts +1 -1
  93. package/src/modes/components/user-message.ts +9 -10
  94. package/src/modes/components/welcome.ts +1 -1
  95. package/src/modes/controllers/command-controller.ts +1 -1
  96. package/src/modes/controllers/event-controller.ts +58 -187
  97. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  98. package/src/modes/controllers/input-controller.ts +3 -1
  99. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  100. package/src/modes/controllers/selector-controller.ts +3 -26
  101. package/src/modes/controllers/ssh-command-controller.ts +1 -1
  102. package/src/modes/interactive-mode.ts +3 -7
  103. package/src/modes/print-mode.ts +5 -5
  104. package/src/modes/rpc/rpc-mode.ts +1 -1
  105. package/src/modes/types.ts +1 -2
  106. package/src/modes/utils/ui-helpers.ts +34 -32
  107. package/src/patch/edit-tool.ts +742 -0
  108. package/src/patch/index.ts +32 -898
  109. package/src/patch/schemas.ts +208 -0
  110. package/src/patch/shared.ts +83 -151
  111. package/src/prompts/agents/explore.md +22 -37
  112. package/src/prompts/agents/init.md +1 -1
  113. package/src/prompts/agents/librarian.md +29 -20
  114. package/src/prompts/agents/oracle.md +9 -2
  115. package/src/prompts/agents/reviewer.md +14 -48
  116. package/src/prompts/agents/task.md +16 -8
  117. package/src/prompts/compaction/branch-summary.md +4 -1
  118. package/src/prompts/compaction/compaction-summary.md +4 -1
  119. package/src/prompts/system/subagent-system-prompt.md +1 -1
  120. package/src/prompts/system/system-prompt.md +162 -178
  121. package/src/prompts/system/verification-reminder.md +6 -0
  122. package/src/sdk.ts +0 -9
  123. package/src/session/agent-session.ts +244 -1459
  124. package/src/session/model-controller.ts +406 -0
  125. package/src/session/retry-utils.ts +71 -0
  126. package/src/session/session-manager.ts +22 -186
  127. package/src/session/session-types.ts +312 -0
  128. package/src/session/stats.ts +387 -0
  129. package/src/session/streaming-edit.ts +258 -0
  130. package/src/session/ttsr.ts +213 -0
  131. package/src/slash-commands/builtin-registry.ts +0 -8
  132. package/src/stt/recorder.ts +2 -2
  133. package/src/system-prompt.ts +1 -14
  134. package/src/task/agents.ts +7 -33
  135. package/src/task/executor.ts +50 -438
  136. package/src/task/index.ts +104 -71
  137. package/src/task/progress-tracker.ts +390 -0
  138. package/src/task/render.ts +371 -187
  139. package/src/task/subprocess-tool-registry.ts +1 -1
  140. package/src/task/types.ts +14 -47
  141. package/src/tools/ask.ts +31 -42
  142. package/src/tools/bash-interactive.ts +2 -2
  143. package/src/tools/bash-interceptor.ts +2 -2
  144. package/src/tools/bash-normalize.ts +1 -1
  145. package/src/tools/bash-skill-urls.ts +2 -2
  146. package/src/tools/bash.ts +87 -136
  147. package/src/tools/browser.ts +54 -84
  148. package/src/tools/create-tools.ts +186 -0
  149. package/src/tools/default-renderer.ts +104 -0
  150. package/src/tools/explore.ts +11 -10
  151. package/src/tools/fetch.ts +24 -114
  152. package/src/tools/find.ts +48 -132
  153. package/src/tools/gemini-image.ts +5 -15
  154. package/src/tools/github.ts +450 -0
  155. package/src/tools/grep.ts +43 -179
  156. package/src/tools/index.ts +35 -198
  157. package/src/tools/json-tree.ts +3 -3
  158. package/src/tools/librarian.ts +18 -18
  159. package/src/tools/list-limit.ts +2 -2
  160. package/src/tools/notebook.ts +35 -87
  161. package/src/tools/oracle.ts +25 -25
  162. package/src/tools/output-meta.ts +89 -4
  163. package/src/tools/output-utils.ts +2 -2
  164. package/src/tools/python.ts +86 -637
  165. package/src/tools/read.ts +36 -119
  166. package/src/tools/reviewer-tool.ts +19 -21
  167. package/src/tools/search-code.ts +128 -0
  168. package/src/tools/ssh.ts +67 -126
  169. package/src/tools/subagent-tool.ts +197 -123
  170. package/src/tools/todo-write.ts +15 -31
  171. package/src/tools/tool-errors.ts +0 -30
  172. package/src/tools/undo-edit.ts +30 -67
  173. package/src/tools/write.ts +78 -127
  174. package/src/tui/code-cell.ts +4 -4
  175. package/src/tui/file-list.ts +2 -2
  176. package/src/tui/output-block.ts +1 -1
  177. package/src/tui/status-line.ts +1 -1
  178. package/src/tui/tree-list.ts +2 -2
  179. package/src/tui/types.ts +1 -1
  180. package/src/tui/utils.ts +1 -1
  181. package/src/{tools → ui}/render-utils.ts +87 -126
  182. package/src/utils/external-editor.ts +4 -4
  183. package/src/utils/file-mentions.ts +1 -1
  184. package/src/utils/index.ts +30 -0
  185. package/src/utils/tools-manager.ts +9 -19
  186. package/src/web/github-client.ts +290 -0
  187. package/src/web/scrapers/github.ts +11 -62
  188. package/src/web/search/auth.ts +1 -3
  189. package/src/web/search/index.ts +82 -46
  190. package/src/web/search/provider.ts +11 -16
  191. package/src/web/search/providers/grep.ts +160 -0
  192. package/src/web/search/render.ts +48 -235
  193. package/src/web/search/types.ts +1 -1
  194. package/src/commands/commit.ts +0 -36
  195. package/src/commit/agentic/agent.ts +0 -311
  196. package/src/commit/agentic/fallback.ts +0 -96
  197. package/src/commit/agentic/index.ts +0 -359
  198. package/src/commit/agentic/prompts/analyze-file.md +0 -22
  199. package/src/commit/agentic/prompts/session-user.md +0 -25
  200. package/src/commit/agentic/prompts/split-confirm.md +0 -1
  201. package/src/commit/agentic/prompts/system.md +0 -38
  202. package/src/commit/agentic/state.ts +0 -69
  203. package/src/commit/agentic/tools/analyze-file.ts +0 -118
  204. package/src/commit/agentic/tools/git-file-diff.ts +0 -194
  205. package/src/commit/agentic/tools/git-hunk.ts +0 -50
  206. package/src/commit/agentic/tools/git-overview.ts +0 -84
  207. package/src/commit/agentic/tools/index.ts +0 -56
  208. package/src/commit/agentic/tools/propose-changelog.ts +0 -128
  209. package/src/commit/agentic/tools/propose-commit.ts +0 -154
  210. package/src/commit/agentic/tools/recent-commits.ts +0 -81
  211. package/src/commit/agentic/tools/split-commit.ts +0 -280
  212. package/src/commit/agentic/topo-sort.ts +0 -44
  213. package/src/commit/agentic/trivial.ts +0 -51
  214. package/src/commit/agentic/validation.ts +0 -200
  215. package/src/commit/analysis/conventional.ts +0 -165
  216. package/src/commit/analysis/index.ts +0 -4
  217. package/src/commit/analysis/scope.ts +0 -242
  218. package/src/commit/analysis/summary.ts +0 -112
  219. package/src/commit/analysis/validation.ts +0 -66
  220. package/src/commit/changelog/detect.ts +0 -37
  221. package/src/commit/changelog/generate.ts +0 -110
  222. package/src/commit/changelog/index.ts +0 -234
  223. package/src/commit/changelog/parse.ts +0 -44
  224. package/src/commit/cli.ts +0 -93
  225. package/src/commit/git/diff.ts +0 -148
  226. package/src/commit/git/errors.ts +0 -9
  227. package/src/commit/git/index.ts +0 -211
  228. package/src/commit/git/operations.ts +0 -54
  229. package/src/commit/index.ts +0 -5
  230. package/src/commit/map-reduce/index.ts +0 -64
  231. package/src/commit/map-reduce/map-phase.ts +0 -178
  232. package/src/commit/map-reduce/reduce-phase.ts +0 -145
  233. package/src/commit/map-reduce/utils.ts +0 -9
  234. package/src/commit/message.ts +0 -11
  235. package/src/commit/model-selection.ts +0 -69
  236. package/src/commit/pipeline.ts +0 -243
  237. package/src/commit/prompts/analysis-system.md +0 -148
  238. package/src/commit/prompts/analysis-user.md +0 -38
  239. package/src/commit/prompts/changelog-system.md +0 -50
  240. package/src/commit/prompts/changelog-user.md +0 -18
  241. package/src/commit/prompts/file-observer-system.md +0 -24
  242. package/src/commit/prompts/file-observer-user.md +0 -8
  243. package/src/commit/prompts/reduce-system.md +0 -50
  244. package/src/commit/prompts/reduce-user.md +0 -17
  245. package/src/commit/prompts/summary-retry.md +0 -3
  246. package/src/commit/prompts/summary-system.md +0 -38
  247. package/src/commit/prompts/summary-user.md +0 -13
  248. package/src/commit/prompts/types-description.md +0 -2
  249. package/src/commit/types.ts +0 -109
  250. package/src/commit/utils/exclusions.ts +0 -42
  251. package/src/mcp/render.ts +0 -123
  252. package/src/modes/components/agent-dashboard.ts +0 -1130
  253. package/src/modes/components/codemode-group.ts +0 -369
  254. package/src/modes/components/read-tool-group.ts +0 -119
  255. package/src/modes/components/visual-truncate.ts +0 -63
  256. package/src/prompts/system/subagent-user-prompt.md +0 -8
  257. package/src/prompts/tools/ask.md +0 -44
  258. package/src/prompts/tools/bash.md +0 -24
  259. package/src/prompts/tools/browser.md +0 -33
  260. package/src/prompts/tools/calculator.md +0 -12
  261. package/src/prompts/tools/explore.md +0 -29
  262. package/src/prompts/tools/fetch.md +0 -16
  263. package/src/prompts/tools/find.md +0 -18
  264. package/src/prompts/tools/gemini-image.md +0 -23
  265. package/src/prompts/tools/grep.md +0 -28
  266. package/src/prompts/tools/hashline.md +0 -232
  267. package/src/prompts/tools/librarian.md +0 -24
  268. package/src/prompts/tools/lsp.md +0 -28
  269. package/src/prompts/tools/oracle.md +0 -26
  270. package/src/prompts/tools/patch.md +0 -74
  271. package/src/prompts/tools/python.md +0 -66
  272. package/src/prompts/tools/read.md +0 -36
  273. package/src/prompts/tools/replace.md +0 -38
  274. package/src/prompts/tools/reviewer.md +0 -41
  275. package/src/prompts/tools/ssh.md +0 -51
  276. package/src/prompts/tools/task-summary.md +0 -28
  277. package/src/prompts/tools/task.md +0 -146
  278. package/src/prompts/tools/todo-write.md +0 -65
  279. package/src/prompts/tools/undo-edit.md +0 -7
  280. package/src/prompts/tools/web-search.md +0 -19
  281. package/src/prompts/tools/write.md +0 -18
  282. package/src/task/batch.ts +0 -102
  283. package/src/task/discovery.ts +0 -126
  284. package/src/task/parallel.ts +0 -84
  285. package/src/task/template.ts +0 -32
  286. package/src/tools/calculator.ts +0 -537
  287. package/src/tools/jtd-to-typescript.ts +0 -198
  288. package/src/tools/renderers.ts +0 -60
  289. package/src/tools/tool-result.ts +0 -86
  290. /package/src/{modes/theme → theme}/dark.json +0 -0
  291. /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
  292. /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
  293. /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
  294. /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
  295. /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  296. /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
  297. /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
  298. /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
  299. /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
  300. /package/src/{modes/theme → theme}/light.json +0 -0
  301. /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
  302. /package/src/{modes/theme → theme}/theme-schema.json +0 -0
  303. /package/src/{modes/theme → theme}/theme.ts +0 -0
@@ -31,7 +31,6 @@ import type { ModelRegistry } from "../../config/model-registry";
31
31
  import type { BashResult } from "../../exec/bash-executor";
32
32
  import type { ExecOptions, ExecResult } from "../../exec/exec";
33
33
  import type { PythonResult } from "../../ipy/executor";
34
- import type { Theme } from "../../modes/theme/theme";
35
34
  import type { EditToolDetails } from "../../patch";
36
35
  import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
37
36
  import type { CustomMessage } from "../../session/messages";
@@ -42,6 +41,7 @@ import type {
42
41
  SessionEntry,
43
42
  SessionManager,
44
43
  } from "../../session/session-manager";
44
+ import type { Theme } from "../../theme/theme";
45
45
  import type {
46
46
  BashToolDetails,
47
47
  BashToolInput,
@@ -4,7 +4,6 @@
4
4
  import type { AgentTool, AgentToolContext, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
5
5
  import type { ImageContent, TextContent } from "@nghyane/arcane-ai";
6
6
  import type { Static, TSchema } from "@sinclair/typebox";
7
- import type { Theme } from "../../modes/theme/theme";
8
7
  import { applyToolProxy } from "../tool-proxy";
9
8
  import type { ExtensionRunner } from "./runner";
10
9
  import type { RegisteredTool, ToolCallEventResult } from "./types";
@@ -18,29 +17,22 @@ export class RegisteredToolAdapter implements AgentTool<any, any, any> {
18
17
  declare parameters: any;
19
18
  declare label: string;
20
19
 
21
- renderCall?: (args: any, options: any, theme: any) => any;
22
- renderResult?: (result: any, options: any, theme: any, args?: any) => any;
23
-
24
20
  constructor(
25
21
  private registeredTool: RegisteredTool,
26
22
  private runner: ExtensionRunner,
27
23
  ) {
28
24
  applyToolProxy(registeredTool.definition, this);
29
25
 
30
- // Only define render methods when the underlying definition provides them.
31
- // If these exist unconditionally on the prototype, ToolExecutionComponent
32
- // enters the custom-renderer path, gets undefined back, and silently
33
- // discards tool result text (extensions without renderers show blank).
34
- if (registeredTool.definition.renderCall) {
35
- this.renderCall = (args: any, options: any, theme: any) =>
36
- registeredTool.definition.renderCall!(args, options, theme as Theme);
26
+ const def = registeredTool.definition;
27
+ if (def.renderCall) {
28
+ (this as any).renderCall = (args: any, options: any, theme: any) => def.renderCall!(args, options, theme);
37
29
  }
38
- if (registeredTool.definition.renderResult) {
39
- this.renderResult = (result: any, options: any, theme: any, args?: any) =>
40
- registeredTool.definition.renderResult!(
30
+ if (def.renderResult) {
31
+ (this as any).renderResult = (result: any, options: any, theme: any, args?: any) =>
32
+ def.renderResult!(
41
33
  result,
42
34
  { expanded: options.expanded, isPartial: options.isPartial, spinnerFrame: options.spinnerFrame },
43
- theme as Theme,
35
+ theme,
44
36
  args,
45
37
  );
46
38
  }
@@ -4,8 +4,8 @@
4
4
  import type { AgentMessage } from "@nghyane/arcane-agent";
5
5
  import type { Model } from "@nghyane/arcane-ai";
6
6
  import type { ModelRegistry } from "../../config/model-registry";
7
- import { theme } from "../../modes/theme/theme";
8
7
  import type { SessionManager } from "../../session/session-manager";
8
+ import { theme } from "../../theme/theme";
9
9
  import type {
10
10
  AppendEntryHandler,
11
11
  BranchHandler,
@@ -10,7 +10,6 @@ import type { Component, TUI } from "@nghyane/arcane-tui";
10
10
  import type { Rule } from "../../capability/rule";
11
11
  import type { ModelRegistry } from "../../config/model-registry";
12
12
  import type { ExecOptions, ExecResult } from "../../exec/exec";
13
- import type { Theme } from "../../modes/theme/theme";
14
13
  import type { EditToolDetails } from "../../patch";
15
14
  import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
16
15
  import type { HookMessage } from "../../session/messages";
@@ -21,6 +20,7 @@ import type {
21
20
  SessionEntry,
22
21
  SessionManager,
23
22
  } from "../../session/session-manager";
23
+ import type { Theme } from "../../theme/theme";
24
24
  import type { BashToolDetails, FindToolDetails, GrepToolDetails, ReadToolDetails } from "../../tools";
25
25
  import type { TodoItem } from "../../tools/todo-write";
26
26
 
@@ -1,4 +1,4 @@
1
- import { theme } from "../../modes/theme/theme";
1
+ import { theme } from "../../theme/theme";
2
2
  import type { DoctorCheck } from "./types";
3
3
 
4
4
  export async function runDoctorChecks(): Promise<DoctorCheck[]> {
package/src/index.ts CHANGED
@@ -136,22 +136,9 @@ export {
136
136
  ToolExecutionComponent,
137
137
  type ToolExecutionOptions,
138
138
  TreeSelectorComponent,
139
- truncateToVisualLines,
140
139
  UserMessageComponent,
141
140
  UserMessageSelectorComponent,
142
- type VisualTruncateResult,
143
141
  } from "./modes/components";
144
- // Theme utilities for custom tools
145
- export {
146
- getLanguageFromPath,
147
- getMarkdownTheme,
148
- getSelectListTheme,
149
- getSettingsListTheme,
150
- highlightCode,
151
- initTheme,
152
- Theme,
153
- type ThemeColor,
154
- } from "./modes/theme/theme";
155
142
  export { computeLineHash } from "./patch/hashline";
156
143
  // SDK for programmatic usage
157
144
  export {
@@ -242,6 +229,7 @@ export {
242
229
  type ThinkingLevelChangeEntry,
243
230
  } from "./session/session-manager";
244
231
  export { runAgent } from "./task/executor";
232
+ export { extractAgentOutput, ProgressTracker } from "./task/progress-tracker";
245
233
  export type {
246
234
  AgentDefinition,
247
235
  AgentProgress,
@@ -249,6 +237,17 @@ export type {
249
237
  SingleResult,
250
238
  TaskParams,
251
239
  } from "./task/types";
240
+ // Theme utilities for custom tools
241
+ export {
242
+ getLanguageFromPath,
243
+ getMarkdownTheme,
244
+ getSelectListTheme,
245
+ getSettingsListTheme,
246
+ highlightCode,
247
+ initTheme,
248
+ Theme,
249
+ type ThemeColor,
250
+ } from "./theme/theme";
252
251
  // Tools (detail types and utilities)
253
252
  export {
254
253
  type BashToolDetails,
@@ -274,4 +273,5 @@ export {
274
273
  type WriteToolDetails,
275
274
  type WriteToolInput,
276
275
  } from "./tools";
276
+ export { EventBus } from "./utils/event-bus";
277
277
  export { VERSION } from "./version";
package/src/lsp/index.ts CHANGED
@@ -3,9 +3,7 @@ import path from "node:path";
3
3
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
4
4
  import { logger, once, untilAborted } from "@nghyane/arcane-utils";
5
5
  import type { BunFile } from "bun";
6
- import { renderPromptTemplate } from "../config/prompt-templates";
7
- import { type Theme, theme } from "../modes/theme/theme";
8
- import lspDescription from "../prompts/tools/lsp.md" with { type: "text" };
6
+ import { type Theme, theme } from "../theme/theme";
9
7
  import type { ToolSession } from "../tools";
10
8
  import { resolveToCwd } from "../tools/path-utils";
11
9
  import { ToolAbortError, throwIfAborted } from "../tools/tool-errors";
@@ -112,7 +110,10 @@ export async function warmupLspServers(cwd: string, options?: LspWarmupOptions):
112
110
  });
113
111
  } else {
114
112
  const errorMsg = result.reason?.message ?? String(result.reason);
115
- logger.warn("LSP server failed to start", { server: name, error: errorMsg });
113
+ logger.warn("LSP server failed to start", {
114
+ server: name,
115
+ error: errorMsg,
116
+ });
116
117
  servers.push({
117
118
  name,
118
119
  status: "error",
@@ -286,22 +287,38 @@ interface ProjectType {
286
287
  function detectProjectType(cwd: string): ProjectType {
287
288
  // Check for Rust (Cargo.toml)
288
289
  if (fs.existsSync(path.join(cwd, "Cargo.toml"))) {
289
- return { type: "rust", command: ["cargo", "check", "--message-format=short"], description: "Rust (cargo check)" };
290
+ return {
291
+ type: "rust",
292
+ command: ["cargo", "check", "--message-format=short"],
293
+ description: "Rust (cargo check)",
294
+ };
290
295
  }
291
296
 
292
297
  // Check for TypeScript (tsconfig.json)
293
298
  if (fs.existsSync(path.join(cwd, "tsconfig.json"))) {
294
- return { type: "typescript", command: ["npx", "tsc", "--noEmit"], description: "TypeScript (tsc --noEmit)" };
299
+ return {
300
+ type: "typescript",
301
+ command: ["npx", "tsc", "--noEmit"],
302
+ description: "TypeScript (tsc --noEmit)",
303
+ };
295
304
  }
296
305
 
297
306
  // Check for Go (go.mod)
298
307
  if (fs.existsSync(path.join(cwd, "go.mod"))) {
299
- return { type: "go", command: ["go", "build", "./..."], description: "Go (go build)" };
308
+ return {
309
+ type: "go",
310
+ command: ["go", "build", "./..."],
311
+ description: "Go (go build)",
312
+ };
300
313
  }
301
314
 
302
315
  // Check for Python (pyproject.toml or pyrightconfig.json)
303
316
  if (fs.existsSync(path.join(cwd, "pyproject.toml")) || fs.existsSync(path.join(cwd, "pyrightconfig.json"))) {
304
- return { type: "python", command: ["pyright"], description: "Python (pyright)" };
317
+ return {
318
+ type: "python",
319
+ command: ["pyright"],
320
+ description: "Python (pyright)",
321
+ };
305
322
  }
306
323
 
307
324
  return { type: "unknown", description: "Unknown project type" };
@@ -344,14 +361,20 @@ async function runWorkspaceDiagnostics(
344
361
  // Limit output length
345
362
  const lines = combined.split("\n");
346
363
  if (lines.length > 50) {
347
- return { output: `${lines.slice(0, 50).join("\n")}\n... and ${lines.length - 50} more lines`, projectType };
364
+ return {
365
+ output: `${lines.slice(0, 50).join("\n")}\n... and ${lines.length - 50} more lines`,
366
+ projectType,
367
+ };
348
368
  }
349
369
  return { output: combined, projectType };
350
370
  } catch (e) {
351
371
  if (signal?.aborted) {
352
372
  throw new ToolAbortError();
353
373
  }
354
- return { output: `Failed to run ${projectType.command.join(" ")}: ${e}`, projectType };
374
+ return {
375
+ output: `Failed to run ${projectType.command.join(" ")}: ${e}`,
376
+ projectType,
377
+ };
355
378
  } finally {
356
379
  signal?.removeEventListener("abort", abortHandler);
357
380
  }
@@ -639,7 +662,10 @@ export async function flushLspWritethroughBatch(
639
662
  return flushWritethroughBatch(Array.from(state.entries.values()), cwd, state.options, signal);
640
663
  }
641
664
 
642
- function summarizeDiagnosticMessages(messages: string[]): { summary: string; errored: boolean } {
665
+ function summarizeDiagnosticMessages(messages: string[]): {
666
+ summary: string;
667
+ errored: boolean;
668
+ } {
643
669
  const counts = { error: 0, warning: 0, info: 0, hint: 0 };
644
670
  for (const message of messages) {
645
671
  const match = message.match(/\[(error|warning|info|hint)\]/i);
@@ -864,16 +890,13 @@ export function createLspWritethrough(cwd: string, options?: WritethroughOptions
864
890
  export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Theme> {
865
891
  readonly name = "lsp";
866
892
  readonly label = "LSP";
867
- readonly description: string;
893
+ readonly description =
894
+ "Run LSP operations: diagnostics, go-to-definition, references, hover, symbols, rename. Output is shown to the user, so do not repeat or summarize the results.";
868
895
  readonly parameters = lspSchema;
869
896
  readonly renderCall = renderCall;
870
897
  readonly renderResult = renderResult;
871
- readonly mergeCallAndResult = true;
872
- readonly inline = true;
873
898
 
874
- constructor(private readonly session: ToolSession) {
875
- this.description = renderPromptTemplate(lspDescription);
876
- }
899
+ constructor(private readonly session: ToolSession) {}
877
900
 
878
901
  static createIf(session: ToolSession): LspTool | null {
879
902
  return session.enableLsp === false ? null : new LspTool(session);
@@ -988,7 +1011,11 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
988
1011
  if (uniqueDiagnostics.length === 0) {
989
1012
  return {
990
1013
  content: [{ type: "text", text: "No diagnostics" }],
991
- details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1014
+ details: {
1015
+ action,
1016
+ serverName: Array.from(allServerNames).join(", "),
1017
+ success: true,
1018
+ },
992
1019
  };
993
1020
  }
994
1021
 
@@ -997,7 +1024,11 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
997
1024
  const output = `${summary}:\n${formatted.map(f => ` ${f}`).join("\n")}`;
998
1025
  return {
999
1026
  content: [{ type: "text", text: output }],
1000
- details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1027
+ details: {
1028
+ action,
1029
+ serverName: Array.from(allServerNames).join(", "),
1030
+ success: true,
1031
+ },
1001
1032
  };
1002
1033
  }
1003
1034
 
@@ -1014,7 +1045,11 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
1014
1045
 
1015
1046
  return {
1016
1047
  content: [{ type: "text", text: results.join("\n") }],
1017
- details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1048
+ details: {
1049
+ action,
1050
+ serverName: Array.from(allServerNames).join(", "),
1051
+ success: true,
1052
+ },
1018
1053
  };
1019
1054
  }
1020
1055
 
@@ -1022,7 +1057,12 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
1022
1057
 
1023
1058
  if (requiresFile) {
1024
1059
  return {
1025
- content: [{ type: "text", text: "Error: file parameter required for this action" }],
1060
+ content: [
1061
+ {
1062
+ type: "text",
1063
+ text: "Error: file parameter required for this action",
1064
+ },
1065
+ ],
1026
1066
  details: { action, success: false },
1027
1067
  };
1028
1068
  }
@@ -1081,7 +1121,12 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
1081
1121
  if ("targetUri" in loc) {
1082
1122
  // Use targetSelectionRange (the precise identifier range) with fallback to targetRange
1083
1123
  const link = loc as LocationLink;
1084
- return [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];
1124
+ return [
1125
+ {
1126
+ uri: link.targetUri,
1127
+ range: link.targetSelectionRange ?? link.targetRange,
1128
+ },
1129
+ ];
1085
1130
  }
1086
1131
  return [];
1087
1132
  });
@@ -1143,7 +1188,10 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
1143
1188
  if (!query) {
1144
1189
  return {
1145
1190
  content: [
1146
- { type: "text", text: "Error: query parameter required for workspace symbol search" },
1191
+ {
1192
+ type: "text",
1193
+ text: "Error: query parameter required for workspace symbol search",
1194
+ },
1147
1195
  ],
1148
1196
  details: { action, serverName, success: false },
1149
1197
  };
@@ -1191,7 +1239,12 @@ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Them
1191
1239
  case "rename": {
1192
1240
  if (!new_name) {
1193
1241
  return {
1194
- content: [{ type: "text", text: "Error: new_name parameter required for rename" }],
1242
+ content: [
1243
+ {
1244
+ type: "text",
1245
+ text: "Error: new_name parameter required for rename",
1246
+ },
1247
+ ],
1195
1248
  details: { action, serverName, success: false },
1196
1249
  };
1197
1250
  }