@nghyane/arcane 0.1.12 → 0.1.14

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 (333) 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/company.ts +2 -7
  30. package/src/exa/index.ts +1 -35
  31. package/src/exa/linkedin.ts +2 -7
  32. package/src/exa/mcp-client.ts +21 -11
  33. package/src/exa/render.ts +30 -190
  34. package/src/exa/researcher.ts +2 -12
  35. package/src/exa/search.ts +5 -25
  36. package/src/exa/types.ts +3 -3
  37. package/src/exec/bash-executor.ts +2 -1
  38. package/src/exec/non-interactive-env.ts +43 -0
  39. package/src/export/html/index.ts +1 -1
  40. package/src/extensibility/custom-tools/loader.ts +1 -1
  41. package/src/extensibility/custom-tools/types.ts +5 -1
  42. package/src/extensibility/custom-tools/wrapper.ts +1 -1
  43. package/src/extensibility/extensions/runner.ts +1 -1
  44. package/src/extensibility/extensions/types.ts +1 -1
  45. package/src/extensibility/extensions/wrapper.ts +7 -15
  46. package/src/extensibility/hooks/runner.ts +1 -1
  47. package/src/extensibility/hooks/types.ts +1 -1
  48. package/src/extensibility/plugins/doctor.ts +1 -1
  49. package/src/index.ts +13 -13
  50. package/src/lsp/index.ts +77 -24
  51. package/src/lsp/render.ts +34 -583
  52. package/src/lsp/types.ts +3 -3
  53. package/src/lsp/utils.ts +1 -1
  54. package/src/main.ts +1 -1
  55. package/src/mcp/tool-bridge.ts +1 -24
  56. package/src/modes/components/assistant-message.ts +7 -7
  57. package/src/modes/components/bash-execution.ts +48 -113
  58. package/src/modes/components/bordered-loader.ts +1 -1
  59. package/src/modes/components/branch-summary-message.ts +13 -10
  60. package/src/modes/components/compaction-summary-message.ts +14 -13
  61. package/src/modes/components/context-group.ts +106 -0
  62. package/src/modes/components/custom-message.ts +4 -5
  63. package/src/modes/components/diff.ts +2 -2
  64. package/src/modes/components/dynamic-border.ts +1 -1
  65. package/src/modes/components/extensions/extension-dashboard.ts +2 -2
  66. package/src/modes/components/extensions/extension-list.ts +1 -1
  67. package/src/modes/components/extensions/inspector-panel.ts +8 -3
  68. package/src/modes/components/footer.ts +2 -2
  69. package/src/modes/components/history-search.ts +1 -1
  70. package/src/modes/components/hook-editor.ts +1 -1
  71. package/src/modes/components/hook-input.ts +1 -1
  72. package/src/modes/components/hook-message.ts +4 -5
  73. package/src/modes/components/hook-selector.ts +1 -1
  74. package/src/modes/components/index.ts +0 -2
  75. package/src/modes/components/keybinding-hints.ts +1 -1
  76. package/src/modes/components/login-dialog.ts +1 -1
  77. package/src/modes/components/mcp-add-wizard.ts +1 -1
  78. package/src/modes/components/model-selector.ts +1 -1
  79. package/src/modes/components/oauth-selector.ts +1 -1
  80. package/src/modes/components/plugin-settings.ts +1 -1
  81. package/src/modes/components/python-execution.ts +49 -92
  82. package/src/modes/components/queue-mode-selector.ts +1 -1
  83. package/src/modes/components/session-selector.ts +1 -1
  84. package/src/modes/components/settings-defs.ts +5 -10
  85. package/src/modes/components/settings-selector.ts +1 -1
  86. package/src/modes/components/show-images-selector.ts +1 -1
  87. package/src/modes/components/skill-message.ts +4 -4
  88. package/src/modes/components/status-line/segments.ts +2 -2
  89. package/src/modes/components/status-line/separators.ts +1 -1
  90. package/src/modes/components/status-line-segment-editor.ts +1 -1
  91. package/src/modes/components/status-line.ts +1 -1
  92. package/src/modes/components/theme-selector.ts +1 -1
  93. package/src/modes/components/thinking-selector.ts +1 -1
  94. package/src/modes/components/todo-display.ts +2 -4
  95. package/src/modes/components/todo-reminder.ts +4 -4
  96. package/src/modes/components/tool-execution.ts +118 -440
  97. package/src/modes/components/tool-image-display.ts +107 -0
  98. package/src/modes/components/tree-selector.ts +2 -2
  99. package/src/modes/components/ttsr-notification.ts +4 -17
  100. package/src/modes/components/user-message-selector.ts +1 -1
  101. package/src/modes/components/user-message.ts +9 -10
  102. package/src/modes/components/welcome.ts +1 -1
  103. package/src/modes/controllers/command-controller.ts +1 -1
  104. package/src/modes/controllers/event-controller.ts +58 -187
  105. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  106. package/src/modes/controllers/input-controller.ts +3 -1
  107. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  108. package/src/modes/controllers/selector-controller.ts +3 -26
  109. package/src/modes/controllers/ssh-command-controller.ts +1 -1
  110. package/src/modes/interactive-mode.ts +3 -7
  111. package/src/modes/print-mode.ts +5 -5
  112. package/src/modes/rpc/rpc-mode.ts +1 -1
  113. package/src/modes/types.ts +1 -2
  114. package/src/modes/utils/ui-helpers.ts +34 -32
  115. package/src/patch/edit-tool.ts +742 -0
  116. package/src/patch/index.ts +32 -898
  117. package/src/patch/schemas.ts +208 -0
  118. package/src/patch/shared.ts +83 -151
  119. package/src/prompts/agents/explore.md +22 -37
  120. package/src/prompts/agents/frontmatter.md +1 -1
  121. package/src/prompts/agents/init.md +2 -2
  122. package/src/prompts/agents/librarian.md +30 -21
  123. package/src/prompts/agents/oracle.md +9 -2
  124. package/src/prompts/agents/reviewer.md +15 -49
  125. package/src/prompts/agents/task.md +17 -9
  126. package/src/prompts/compaction/branch-summary-context.md +1 -1
  127. package/src/prompts/compaction/branch-summary-preamble.md +1 -1
  128. package/src/prompts/compaction/branch-summary.md +4 -1
  129. package/src/prompts/compaction/compaction-short-summary.md +1 -1
  130. package/src/prompts/compaction/compaction-summary-context.md +1 -1
  131. package/src/prompts/compaction/compaction-summary.md +4 -1
  132. package/src/prompts/compaction/compaction-turn-prefix.md +1 -1
  133. package/src/prompts/compaction/compaction-update-summary.md +1 -1
  134. package/src/prompts/memories/consolidation.md +1 -1
  135. package/src/prompts/memories/read_path.md +1 -1
  136. package/src/prompts/memories/stage_one_input.md +1 -1
  137. package/src/prompts/memories/stage_one_system.md +1 -1
  138. package/src/prompts/review-request.md +1 -1
  139. package/src/prompts/system/agent-creation-architect.md +1 -1
  140. package/src/prompts/system/agent-creation-user.md +1 -1
  141. package/src/prompts/system/custom-system-prompt.md +1 -1
  142. package/src/prompts/system/file-operations.md +1 -1
  143. package/src/prompts/system/subagent-system-prompt.md +2 -2
  144. package/src/prompts/system/summarization-system.md +1 -1
  145. package/src/prompts/system/system-prompt.md +163 -178
  146. package/src/prompts/system/title-system.md +1 -1
  147. package/src/prompts/system/ttsr-interrupt.md +1 -1
  148. package/src/prompts/system/verification-reminder.md +6 -0
  149. package/src/prompts/system/web-search.md +1 -1
  150. package/src/sdk.ts +0 -9
  151. package/src/session/agent-session.ts +244 -1459
  152. package/src/session/auth-storage.ts +5 -0
  153. package/src/session/model-controller.ts +406 -0
  154. package/src/session/retry-utils.ts +71 -0
  155. package/src/session/session-manager.ts +22 -186
  156. package/src/session/session-types.ts +312 -0
  157. package/src/session/stats.ts +387 -0
  158. package/src/session/streaming-edit.ts +258 -0
  159. package/src/session/ttsr.ts +213 -0
  160. package/src/slash-commands/builtin-registry.ts +0 -8
  161. package/src/ssh/connection-manager.ts +1 -0
  162. package/src/stt/recorder.ts +2 -2
  163. package/src/system-prompt.ts +1 -14
  164. package/src/task/agents.ts +7 -33
  165. package/src/task/executor.ts +50 -438
  166. package/src/task/index.ts +104 -71
  167. package/src/task/progress-tracker.ts +390 -0
  168. package/src/task/render.ts +371 -187
  169. package/src/task/subprocess-tool-registry.ts +1 -1
  170. package/src/task/types.ts +14 -47
  171. package/src/tools/ask.ts +31 -42
  172. package/src/tools/bash-interactive.ts +4 -47
  173. package/src/tools/bash-interceptor.ts +2 -2
  174. package/src/tools/bash-normalize.ts +1 -1
  175. package/src/tools/bash-skill-urls.ts +2 -2
  176. package/src/tools/bash.ts +87 -136
  177. package/src/tools/browser.ts +54 -84
  178. package/src/tools/create-tools.ts +186 -0
  179. package/src/tools/default-renderer.ts +104 -0
  180. package/src/tools/explore.ts +11 -10
  181. package/src/tools/fetch.ts +24 -114
  182. package/src/tools/find.ts +48 -132
  183. package/src/tools/gemini-image.ts +5 -15
  184. package/src/tools/github.ts +450 -0
  185. package/src/tools/grep.ts +43 -179
  186. package/src/tools/index.ts +35 -198
  187. package/src/tools/json-tree.ts +3 -3
  188. package/src/tools/librarian.ts +18 -18
  189. package/src/tools/list-limit.ts +2 -2
  190. package/src/tools/notebook.ts +35 -87
  191. package/src/tools/oracle.ts +25 -25
  192. package/src/tools/output-meta.ts +89 -4
  193. package/src/tools/output-utils.ts +2 -2
  194. package/src/tools/python.ts +86 -637
  195. package/src/tools/read.ts +36 -119
  196. package/src/tools/reviewer-tool.ts +19 -21
  197. package/src/tools/search-code.ts +128 -0
  198. package/src/tools/ssh.ts +67 -126
  199. package/src/tools/subagent-tool.ts +197 -123
  200. package/src/tools/todo-write.ts +15 -31
  201. package/src/tools/tool-errors.ts +0 -30
  202. package/src/tools/undo-edit.ts +30 -67
  203. package/src/tools/write.ts +78 -127
  204. package/src/tui/code-cell.ts +4 -4
  205. package/src/tui/file-list.ts +2 -2
  206. package/src/tui/output-block.ts +1 -1
  207. package/src/tui/status-line.ts +1 -1
  208. package/src/tui/tree-list.ts +2 -2
  209. package/src/tui/types.ts +1 -1
  210. package/src/tui/utils.ts +1 -1
  211. package/src/{tools → ui}/render-utils.ts +87 -126
  212. package/src/utils/external-editor.ts +4 -4
  213. package/src/utils/file-mentions.ts +1 -1
  214. package/src/utils/index.ts +30 -0
  215. package/src/utils/tools-manager.ts +9 -19
  216. package/src/web/github-client.ts +290 -0
  217. package/src/web/scrapers/github.ts +11 -62
  218. package/src/web/search/auth.ts +1 -3
  219. package/src/web/search/index.ts +85 -49
  220. package/src/web/search/provider.ts +11 -16
  221. package/src/web/search/providers/grep.ts +160 -0
  222. package/src/web/search/render.ts +48 -235
  223. package/src/web/search/types.ts +1 -1
  224. package/src/commands/commit.ts +0 -36
  225. package/src/commit/agentic/agent.ts +0 -311
  226. package/src/commit/agentic/fallback.ts +0 -96
  227. package/src/commit/agentic/index.ts +0 -359
  228. package/src/commit/agentic/prompts/analyze-file.md +0 -22
  229. package/src/commit/agentic/prompts/session-user.md +0 -25
  230. package/src/commit/agentic/prompts/split-confirm.md +0 -1
  231. package/src/commit/agentic/prompts/system.md +0 -38
  232. package/src/commit/agentic/state.ts +0 -69
  233. package/src/commit/agentic/tools/analyze-file.ts +0 -118
  234. package/src/commit/agentic/tools/git-file-diff.ts +0 -194
  235. package/src/commit/agentic/tools/git-hunk.ts +0 -50
  236. package/src/commit/agentic/tools/git-overview.ts +0 -84
  237. package/src/commit/agentic/tools/index.ts +0 -56
  238. package/src/commit/agentic/tools/propose-changelog.ts +0 -128
  239. package/src/commit/agentic/tools/propose-commit.ts +0 -154
  240. package/src/commit/agentic/tools/recent-commits.ts +0 -81
  241. package/src/commit/agentic/tools/split-commit.ts +0 -280
  242. package/src/commit/agentic/topo-sort.ts +0 -44
  243. package/src/commit/agentic/trivial.ts +0 -51
  244. package/src/commit/agentic/validation.ts +0 -200
  245. package/src/commit/analysis/conventional.ts +0 -165
  246. package/src/commit/analysis/index.ts +0 -4
  247. package/src/commit/analysis/scope.ts +0 -242
  248. package/src/commit/analysis/summary.ts +0 -112
  249. package/src/commit/analysis/validation.ts +0 -66
  250. package/src/commit/changelog/detect.ts +0 -37
  251. package/src/commit/changelog/generate.ts +0 -110
  252. package/src/commit/changelog/index.ts +0 -234
  253. package/src/commit/changelog/parse.ts +0 -44
  254. package/src/commit/cli.ts +0 -93
  255. package/src/commit/git/diff.ts +0 -148
  256. package/src/commit/git/errors.ts +0 -9
  257. package/src/commit/git/index.ts +0 -211
  258. package/src/commit/git/operations.ts +0 -54
  259. package/src/commit/index.ts +0 -5
  260. package/src/commit/map-reduce/index.ts +0 -64
  261. package/src/commit/map-reduce/map-phase.ts +0 -178
  262. package/src/commit/map-reduce/reduce-phase.ts +0 -145
  263. package/src/commit/map-reduce/utils.ts +0 -9
  264. package/src/commit/message.ts +0 -11
  265. package/src/commit/model-selection.ts +0 -69
  266. package/src/commit/pipeline.ts +0 -243
  267. package/src/commit/prompts/analysis-system.md +0 -148
  268. package/src/commit/prompts/analysis-user.md +0 -38
  269. package/src/commit/prompts/changelog-system.md +0 -50
  270. package/src/commit/prompts/changelog-user.md +0 -18
  271. package/src/commit/prompts/file-observer-system.md +0 -24
  272. package/src/commit/prompts/file-observer-user.md +0 -8
  273. package/src/commit/prompts/reduce-system.md +0 -50
  274. package/src/commit/prompts/reduce-user.md +0 -17
  275. package/src/commit/prompts/summary-retry.md +0 -3
  276. package/src/commit/prompts/summary-system.md +0 -38
  277. package/src/commit/prompts/summary-user.md +0 -13
  278. package/src/commit/prompts/types-description.md +0 -2
  279. package/src/commit/types.ts +0 -109
  280. package/src/commit/utils/exclusions.ts +0 -42
  281. package/src/mcp/render.ts +0 -123
  282. package/src/modes/components/agent-dashboard.ts +0 -1130
  283. package/src/modes/components/codemode-group.ts +0 -369
  284. package/src/modes/components/read-tool-group.ts +0 -119
  285. package/src/modes/components/visual-truncate.ts +0 -63
  286. package/src/prompts/system/subagent-user-prompt.md +0 -8
  287. package/src/prompts/tools/ask.md +0 -44
  288. package/src/prompts/tools/bash.md +0 -24
  289. package/src/prompts/tools/browser.md +0 -33
  290. package/src/prompts/tools/calculator.md +0 -12
  291. package/src/prompts/tools/explore.md +0 -29
  292. package/src/prompts/tools/fetch.md +0 -16
  293. package/src/prompts/tools/find.md +0 -18
  294. package/src/prompts/tools/gemini-image.md +0 -23
  295. package/src/prompts/tools/grep.md +0 -28
  296. package/src/prompts/tools/hashline.md +0 -232
  297. package/src/prompts/tools/librarian.md +0 -24
  298. package/src/prompts/tools/lsp.md +0 -28
  299. package/src/prompts/tools/oracle.md +0 -26
  300. package/src/prompts/tools/patch.md +0 -74
  301. package/src/prompts/tools/python.md +0 -66
  302. package/src/prompts/tools/read.md +0 -36
  303. package/src/prompts/tools/replace.md +0 -38
  304. package/src/prompts/tools/reviewer.md +0 -41
  305. package/src/prompts/tools/ssh.md +0 -51
  306. package/src/prompts/tools/task-summary.md +0 -28
  307. package/src/prompts/tools/task.md +0 -146
  308. package/src/prompts/tools/todo-write.md +0 -65
  309. package/src/prompts/tools/undo-edit.md +0 -7
  310. package/src/prompts/tools/web-search.md +0 -19
  311. package/src/prompts/tools/write.md +0 -18
  312. package/src/task/batch.ts +0 -102
  313. package/src/task/discovery.ts +0 -126
  314. package/src/task/parallel.ts +0 -84
  315. package/src/task/template.ts +0 -32
  316. package/src/tools/calculator.ts +0 -537
  317. package/src/tools/jtd-to-typescript.ts +0 -198
  318. package/src/tools/renderers.ts +0 -60
  319. package/src/tools/tool-result.ts +0 -86
  320. /package/src/{modes/theme → theme}/dark.json +0 -0
  321. /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
  322. /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
  323. /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
  324. /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
  325. /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  326. /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
  327. /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
  328. /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
  329. /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
  330. /package/src/{modes/theme → theme}/light.json +0 -0
  331. /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
  332. /package/src/{modes/theme → theme}/theme-schema.json +0 -0
  333. /package/src/{modes/theme → theme}/theme.ts +0 -0
package/src/exa/render.ts CHANGED
@@ -5,41 +5,13 @@
5
5
  */
6
6
  import type { Component } from "@nghyane/arcane-tui";
7
7
  import { Text } from "@nghyane/arcane-tui";
8
- import { logger } from "@nghyane/arcane-utils";
9
8
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
10
- import type { Theme } from "../modes/theme/theme";
11
- import {
12
- formatCount,
13
- formatExpandHint,
14
- formatMoreItems,
15
- formatStatusIcon,
16
- getDomain,
17
- getPreviewLines,
18
- PREVIEW_LIMITS,
19
- TRUNCATE_LENGTHS,
20
- truncateToWidth,
21
- } from "../tools/render-utils";
9
+ import type { Theme } from "../theme/theme";
10
+ import { renderStatusLine } from "../tui";
11
+ import { formatCount, formatMoreItems, getDomain, truncateToWidth } from "../ui/render-utils";
22
12
  import type { ExaRenderDetails } from "./types";
23
13
 
24
- const COLLAPSED_PREVIEW_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
25
- const COLLAPSED_PREVIEW_LINE_LEN = TRUNCATE_LENGTHS.LONG;
26
- const EXPANDED_TEXT_LINES = 5;
27
- const EXPANDED_TEXT_LINE_LEN = 90;
28
- const MAX_TITLE_LEN = TRUNCATE_LENGTHS.TITLE;
29
- const MAX_HIGHLIGHT_LEN = TRUNCATE_LENGTHS.CONTENT;
30
-
31
- function renderErrorMessage(message: string, theme: Theme): Text {
32
- const clean = message.replace(/^Error:\s*/, "").trim();
33
- return new Text(
34
- `${formatStatusIcon("error", theme)} ${theme.fg("error", `Error: ${clean || "Unknown error"}`)}`,
35
- 0,
36
- 0,
37
- );
38
- }
39
-
40
- function renderEmptyMessage(message: string, theme: Theme): Text {
41
- return new Text(`${formatStatusIcon("warning", theme)} ${theme.fg("muted", message)}`, 0, 0);
42
- }
14
+ const MAX_COLLAPSED_RESULTS = 5;
43
15
 
44
16
  /** Render Exa result with tree-based layout */
45
17
  export function renderExaResult(
@@ -47,183 +19,51 @@ export function renderExaResult(
47
19
  options: RenderResultOptions,
48
20
  uiTheme: Theme,
49
21
  ): Component {
50
- const { expanded } = options;
51
22
  const details = result.details;
52
-
53
- if (details?.error) {
54
- logger.error("Exa render error", { error: details.error, toolName: details.toolName });
55
- return renderErrorMessage(details.error, uiTheme);
56
- }
57
-
58
23
  const response = details?.response;
59
- if (!response) {
60
- if (details?.raw) {
61
- const rawText = typeof details.raw === "string" ? details.raw : JSON.stringify(details.raw, null, 2);
62
- const rawLines = rawText.split("\n").filter(l => l.trim());
63
- const maxLines = expanded ? rawLines.length : Math.min(rawLines.length, COLLAPSED_PREVIEW_LINES);
64
- const displayLines = rawLines.slice(0, maxLines);
65
- const remaining = rawLines.length - maxLines;
66
- const expandHint = formatExpandHint(uiTheme, expanded, remaining > 0);
67
-
68
- let text = `${formatStatusIcon("info", uiTheme)} ${uiTheme.fg("dim", "Raw response")}${expandHint}`;
69
-
70
- for (let i = 0; i < displayLines.length; i++) {
71
- const isLast = i === displayLines.length - 1 && remaining === 0;
72
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
73
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(
74
- "toolOutput",
75
- truncateToWidth(displayLines[i], COLLAPSED_PREVIEW_LINE_LEN),
76
- )}`;
77
- }
78
-
79
- if (remaining > 0) {
80
- text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg(
81
- "muted",
82
- formatMoreItems(remaining, "line"),
83
- )}`;
84
- }
85
-
86
- return new Text(text, 0, 0);
87
- }
88
- return renderEmptyMessage("No response data", uiTheme);
89
- }
90
-
91
- const results = response.results ?? [];
24
+ const results = response?.results ?? [];
92
25
  const resultCount = results.length;
93
- const cost = response.costDollars?.total;
94
- const time = response.searchTime;
95
-
96
- const icon = formatStatusIcon(resultCount > 0 ? "success" : "warning", uiTheme);
97
26
 
98
- const metaParts = [formatCount("result", resultCount)];
99
- if (cost !== undefined) metaParts.push(`cost:$${cost.toFixed(4)}`);
100
- if (time !== undefined) metaParts.push(`time:${time.toFixed(2)}s`);
101
- const summaryText = metaParts.join(uiTheme.sep.dot);
27
+ const icon = details?.error ? "error" : resultCount > 0 ? "success" : "warning";
102
28
 
103
- let hasMorePreview = false;
104
- if (!expanded && resultCount > 0) {
105
- const previewText = results[0].text ?? results[0].title ?? "";
106
- const totalLines = previewText.split("\n").filter(l => l.trim()).length;
107
- hasMorePreview = totalLines > COLLAPSED_PREVIEW_LINES || resultCount > 1;
108
- }
109
- const expandHint = formatExpandHint(uiTheme, expanded, hasMorePreview);
110
-
111
- let text = `${icon} ${uiTheme.fg("dim", summaryText)}${expandHint}`;
112
-
113
- if (!expanded) {
114
- if (resultCount === 0) {
115
- text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
116
- return new Text(text, 0, 0);
117
- }
118
-
119
- const first = results[0];
120
- const previewText = first.text ?? first.title ?? "";
121
- const previewLines = previewText
122
- ? getPreviewLines(previewText, COLLAPSED_PREVIEW_LINES, COLLAPSED_PREVIEW_LINE_LEN)
123
- : [];
124
- const safePreviewLines = previewLines.length > 0 ? previewLines : ["No preview text"];
125
- const totalLines = previewText.split("\n").filter(l => l.trim()).length;
126
- const remainingLines = Math.max(0, totalLines - previewLines.length);
127
- const extraItems: string[] = [];
128
- if (remainingLines > 0) {
129
- extraItems.push(formatMoreItems(remainingLines, "line"));
130
- }
131
- if (resultCount > 1) {
132
- extraItems.push(formatMoreItems(resultCount - 1, "result"));
133
- }
134
-
135
- for (let i = 0; i < safePreviewLines.length; i++) {
136
- const isLast = i === safePreviewLines.length - 1 && extraItems.length === 0;
137
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
138
- const line = safePreviewLines[i];
139
- const color = line === "No preview text" ? "muted" : "toolOutput";
140
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(color, line)}`;
141
- }
29
+ const header = renderStatusLine(
30
+ {
31
+ icon,
32
+ title: "Exa Search",
33
+ meta: [formatCount("result", resultCount)],
34
+ },
35
+ uiTheme,
36
+ );
142
37
 
143
- for (let i = 0; i < extraItems.length; i++) {
144
- const isLast = i === extraItems.length - 1;
145
- const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
146
- text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("muted", extraItems[i])}`;
147
- }
38
+ let text = header;
148
39
 
40
+ if (details?.error) {
41
+ const clean = details.error.replace(/^Error:\s*/, "").trim();
42
+ text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("error", clean || "Unknown error")}`;
149
43
  return new Text(text, 0, 0);
150
44
  }
151
45
 
152
- if (resultCount === 0) {
46
+ if (!response || resultCount === 0) {
153
47
  text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
154
48
  return new Text(text, 0, 0);
155
49
  }
156
50
 
157
- for (let i = 0; i < results.length; i++) {
51
+ const { expanded } = options;
52
+ const maxItems = expanded ? results.length : Math.min(results.length, MAX_COLLAPSED_RESULTS);
53
+ const remaining = results.length - maxItems;
54
+
55
+ for (let i = 0; i < maxItems; i++) {
158
56
  const res = results[i];
159
- const isLast = i === results.length - 1;
57
+ const isLast = i === maxItems - 1 && remaining === 0;
160
58
  const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
161
- const cont = isLast ? " " : uiTheme.tree.vertical;
162
-
163
- const title = truncateToWidth(res.title ?? "Untitled", MAX_TITLE_LEN);
59
+ const title = truncateToWidth(res.title ?? "Untitled", 70);
164
60
  const domain = res.url ? getDomain(res.url) : "";
165
- const domainPart = domain ? uiTheme.fg("dim", ` (${domain})`) : "";
166
-
61
+ const domainPart = domain ? ` ${uiTheme.fg("dim", `(${domain})`)}` : "";
167
62
  text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("accent", title)}${domainPart}`;
63
+ }
168
64
 
169
- if (res.url) {
170
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
171
- "mdLinkUrl",
172
- res.url,
173
- )}`;
174
- }
175
-
176
- if (res.author) {
177
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
178
- "muted",
179
- `Author: ${res.author}`,
180
- )}`;
181
- }
182
-
183
- if (res.publishedDate) {
184
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
185
- "muted",
186
- `Published: ${res.publishedDate}`,
187
- )}`;
188
- }
189
-
190
- if (res.text) {
191
- const textLines = res.text.split("\n").filter(l => l.trim());
192
- const displayLines = textLines.slice(0, EXPANDED_TEXT_LINES);
193
- for (const line of displayLines) {
194
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
195
- "toolOutput",
196
- truncateToWidth(line.trim(), EXPANDED_TEXT_LINE_LEN),
197
- )}`;
198
- }
199
- if (textLines.length > EXPANDED_TEXT_LINES) {
200
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
201
- "muted",
202
- formatMoreItems(textLines.length - EXPANDED_TEXT_LINES, "line"),
203
- )}`;
204
- }
205
- }
206
-
207
- if (res.highlights?.length) {
208
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
209
- "accent",
210
- "Highlights",
211
- )}`;
212
- const maxHighlights = Math.min(res.highlights.length, 3);
213
- for (let j = 0; j < maxHighlights; j++) {
214
- const h = res.highlights[j];
215
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
216
- "muted",
217
- `${uiTheme.format.dash} ${truncateToWidth(h, MAX_HIGHLIGHT_LEN)}`,
218
- )}`;
219
- }
220
- if (res.highlights.length > maxHighlights) {
221
- text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
222
- "muted",
223
- formatMoreItems(res.highlights.length - maxHighlights, "highlight"),
224
- )}`;
225
- }
226
- }
65
+ if (remaining > 0) {
66
+ text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", formatMoreItems(remaining, "result"))}`;
227
67
  }
228
68
 
229
69
  return new Text(text, 0, 0);
@@ -33,12 +33,7 @@ const researcherStartTool: CustomTool<any, ExaRenderDetails> = {
33
33
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
34
34
  try {
35
35
  const apiKey = await findApiKey();
36
- if (!apiKey) {
37
- return {
38
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
39
- details: { error: "EXA_API_KEY not found", toolName: "exa_researcher_start" },
40
- };
41
- }
36
+ // Exa MCP endpoint is publicly accessible; API key is optional
42
37
  const result = await callExaTool("deep_researcher_start", params as Record<string, unknown>, apiKey);
43
38
  return {
44
39
  content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
@@ -65,12 +60,7 @@ const researcherPollTool: CustomTool<any, ExaRenderDetails> = {
65
60
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
66
61
  try {
67
62
  const apiKey = await findApiKey();
68
- if (!apiKey) {
69
- return {
70
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
71
- details: { error: "EXA_API_KEY not found", toolName: "exa_researcher_poll" },
72
- };
73
- }
63
+ // Exa MCP endpoint is publicly accessible; API key is optional
74
64
  const result = await callExaTool("deep_researcher_check", params as Record<string, unknown>, apiKey);
75
65
  return {
76
66
  content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
package/src/exa/search.ts CHANGED
@@ -83,12 +83,7 @@ Parameters:
83
83
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
84
84
  try {
85
85
  const apiKey = await findApiKey();
86
- if (!apiKey) {
87
- return {
88
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
89
- details: { error: "EXA_API_KEY not found", toolName: "exa_search" },
90
- };
91
- }
86
+ // Exa MCP endpoint is publicly accessible; API key is optional
92
87
  const response = await callExaTool("web_search_exa", params, apiKey);
93
88
 
94
89
  if (isSearchResponse(response)) {
@@ -177,12 +172,7 @@ Similar parameters to exa_search, optimized for research depth.`,
177
172
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
178
173
  try {
179
174
  const apiKey = await findApiKey();
180
- if (!apiKey) {
181
- return {
182
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
183
- details: { error: "EXA_API_KEY not found", toolName: "exa_search_deep" },
184
- };
185
- }
175
+ // Exa MCP endpoint is publicly accessible; API key is optional
186
176
  const args = { ...params, type: "deep" };
187
177
  const response = await callExaTool("web_search_exa", args, apiKey);
188
178
 
@@ -232,12 +222,7 @@ Parameters:
232
222
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
233
223
  try {
234
224
  const apiKey = await findApiKey();
235
- if (!apiKey) {
236
- return {
237
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
238
- details: { error: "EXA_API_KEY not found", toolName: "exa_search_code" },
239
- };
240
- }
225
+ // Exa MCP endpoint is publicly accessible; API key is optional
241
226
  const response = await callExaTool("get_code_context_exa", params, apiKey);
242
227
 
243
228
  if (isSearchResponse(response)) {
@@ -292,13 +277,8 @@ Parameters:
292
277
  async execute(_toolCallId, params, _onUpdate, _ctx, _signal) {
293
278
  try {
294
279
  const apiKey = await findApiKey();
295
- if (!apiKey) {
296
- return {
297
- content: [{ type: "text" as const, text: "Error: EXA_API_KEY not found" }],
298
- details: { error: "EXA_API_KEY not found", toolName: "exa_crawl" },
299
- };
300
- }
301
- const response = await callExaTool("crawling", params, apiKey);
280
+ // Exa MCP endpoint is publicly accessible; API key is optional
281
+ const response = await callExaTool("crawling_exa", params, apiKey);
302
282
 
303
283
  if (isSearchResponse(response)) {
304
284
  const formatted = formatSearchResults(response);
package/src/exa/types.ts CHANGED
@@ -122,11 +122,11 @@ export const EXA_TOOL_MAPPINGS = {
122
122
  // Search tools
123
123
  web_search_exa: "exa_search",
124
124
  get_code_context_exa: "exa_search_code",
125
- crawling: "exa_crawl",
125
+ crawling_exa: "exa_crawl",
126
126
  // LinkedIn
127
- linkedin_search: "exa_linkedin",
127
+ linkedin_search_exa: "exa_linkedin",
128
128
  // Company
129
- company_research: "exa_company",
129
+ company_research_exa: "exa_company",
130
130
  // Researcher
131
131
  deep_researcher_start: "exa_researcher_start",
132
132
  deep_researcher_check: "exa_researcher_poll",
@@ -7,6 +7,7 @@ import { Shell } from "@nghyane/arcane-natives";
7
7
  import { Settings } from "../config/settings";
8
8
  import { OutputSink } from "../session/streaming-output";
9
9
  import { getOrCreateSnapshot } from "../utils/shell-snapshot";
10
+ import { NON_INTERACTIVE_ENV } from "./non-interactive-env";
10
11
 
11
12
  export interface BashExecutorOptions {
12
13
  cwd?: string;
@@ -97,7 +98,7 @@ export async function executeBash(command: string, options?: BashExecutorOptions
97
98
  {
98
99
  command: finalCommand,
99
100
  cwd: options?.cwd,
100
- env: options?.env,
101
+ env: options?.env ? { ...NON_INTERACTIVE_ENV, ...options.env } : NON_INTERACTIVE_ENV,
101
102
  timeoutMs: options?.timeout,
102
103
  signal,
103
104
  },
@@ -0,0 +1,43 @@
1
+ export const NON_INTERACTIVE_ENV: Readonly<Record<string, string>> = {
2
+ // Disable pagers so commands don't block on interactive views.
3
+ PAGER: "cat",
4
+ GIT_PAGER: "cat",
5
+ MANPAGER: "cat",
6
+ SYSTEMD_PAGER: "cat",
7
+ BAT_PAGER: "cat",
8
+ DELTA_PAGER: "cat",
9
+ GH_PAGER: "cat",
10
+ GLAB_PAGER: "cat",
11
+ PSQL_PAGER: "cat",
12
+ MYSQL_PAGER: "cat",
13
+ AWS_PAGER: "",
14
+ HOMEBREW_PAGER: "cat",
15
+ LESS: "FRX",
16
+ // Disable editor and terminal credential prompts.
17
+ GIT_EDITOR: "true",
18
+ VISUAL: "true",
19
+ EDITOR: "true",
20
+ GIT_TERMINAL_PROMPT: "0",
21
+ SSH_ASKPASS: "/usr/bin/false",
22
+ CI: "1",
23
+ // Package manager defaults for unattended execution.
24
+ npm_config_yes: "true",
25
+ npm_config_update_notifier: "false",
26
+ npm_config_fund: "false",
27
+ npm_config_audit: "false",
28
+ npm_config_progress: "false",
29
+ PNPM_DISABLE_SELF_UPDATE_CHECK: "true",
30
+ PNPM_UPDATE_NOTIFIER: "false",
31
+ YARN_ENABLE_TELEMETRY: "0",
32
+ YARN_ENABLE_PROGRESS_BARS: "0",
33
+ // Cross-language/tooling non-interactive defaults.
34
+ CARGO_TERM_PROGRESS_WHEN: "never",
35
+ DEBIAN_FRONTEND: "noninteractive",
36
+ PIP_NO_INPUT: "1",
37
+ PIP_DISABLE_PIP_VERSION_CHECK: "1",
38
+ TF_INPUT: "0",
39
+ TF_IN_AUTOMATION: "1",
40
+ GH_PROMPT_DISABLED: "1",
41
+ COMPOSER_NO_INTERACTION: "1",
42
+ CLOUDSDK_CORE_DISABLE_PROMPTS: "1",
43
+ };
@@ -2,8 +2,8 @@ import * as path from "node:path";
2
2
  import type { AgentState } from "@nghyane/arcane-agent";
3
3
  import { isEnoent } from "@nghyane/arcane-utils";
4
4
  import { APP_NAME } from "@nghyane/arcane-utils/dirs";
5
- import { getResolvedThemeColors, getThemeExportColors } from "../../modes/theme/theme";
6
5
  import { type SessionEntry, type SessionHeader, SessionManager } from "../../session/session-manager";
6
+ import { getResolvedThemeColors, getThemeExportColors } from "../../theme/theme";
7
7
  // Pre-generated template (created by scripts/generate-template.ts at publish time)
8
8
  import { TEMPLATE } from "./template.generated";
9
9
 
@@ -15,7 +15,7 @@ import type { ExecOptions } from "../../exec/exec";
15
15
  import { execCommand } from "../../exec/exec";
16
16
  import type { HookUIContext } from "../../extensibility/hooks/types";
17
17
  import { getAllPluginToolPaths } from "../../extensibility/plugins/loader";
18
- import { theme } from "../../modes/theme/theme";
18
+ import { theme } from "../../theme/theme";
19
19
  import type { CustomToolAPI, CustomToolFactory, LoadedCustomTool, ToolLoadError } from "./types";
20
20
 
21
21
  /**
@@ -12,9 +12,9 @@ import type { Rule } from "../../capability/rule";
12
12
  import type { ModelRegistry } from "../../config/model-registry";
13
13
  import type { ExecOptions, ExecResult } from "../../exec/exec";
14
14
  import type { HookUIContext } from "../../extensibility/hooks/types";
15
- import type { Theme } from "../../modes/theme/theme";
16
15
  import type { CompactionResult } from "../../session/compaction";
17
16
  import type { ReadonlySessionManager } from "../../session/session-manager";
17
+ import type { Theme } from "../../theme/theme";
18
18
  import type { TodoItem } from "../../tools/todo-write";
19
19
 
20
20
  /** Alias for clarity */
@@ -114,6 +114,10 @@ export interface RenderResultOptions {
114
114
  isPartial: boolean;
115
115
  /** Current spinner frame index for animated elements (0-9, only provided during partial results) */
116
116
  spinnerFrame?: number;
117
+ /** Tool display label (used by default renderer) */
118
+ label?: string;
119
+ /** Extra rendering context from ToolExecutionComponent (bash output, edit diff, etc.) */
120
+ renderContext?: Record<string, unknown>;
117
121
  }
118
122
 
119
123
  export type CustomToolResult<TDetails = any> = AgentToolResult<TDetails>;
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import type { AgentTool, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
5
5
  import type { Static, TSchema } from "@sinclair/typebox";
6
- import type { Theme } from "../../modes/theme/theme";
6
+ import type { Theme } from "../../theme/theme";
7
7
  import { applyToolProxy } from "../tool-proxy";
8
8
  import type { CustomTool, CustomToolContext } from "./types";
9
9
 
@@ -6,8 +6,8 @@ import type { ImageContent, Model } from "@nghyane/arcane-ai";
6
6
  import type { KeyId } from "@nghyane/arcane-tui";
7
7
  import { logger } from "@nghyane/arcane-utils";
8
8
  import type { ModelRegistry } from "../../config/model-registry";
9
- import { type Theme, theme } from "../../modes/theme/theme";
10
9
  import type { SessionManager } from "../../session/session-manager";
10
+ import { type Theme, theme } from "../../theme/theme";
11
11
  import type {
12
12
  BeforeAgentStartEvent,
13
13
  BeforeAgentStartEventResult,
@@ -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";