indusagi-coding-agent 0.1.23 → 0.1.25

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 (236) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +2 -0
  3. package/dist/cli/args.d.ts +117 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +221 -52
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +58 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js +130 -12
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts +70 -2
  12. package/dist/cli/file-processor.d.ts.map +1 -1
  13. package/dist/cli/file-processor.js +240 -15
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +63 -3
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js +202 -27
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/login-handler.d.ts +82 -8
  20. package/dist/cli/login-handler.d.ts.map +1 -1
  21. package/dist/cli/login-handler.js +410 -77
  22. package/dist/cli/login-handler.js.map +1 -1
  23. package/dist/cli/session-picker.d.ts +74 -2
  24. package/dist/cli/session-picker.d.ts.map +1 -1
  25. package/dist/cli/session-picker.js +236 -12
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +214 -9
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +214 -9
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/bash-executor.d.ts +302 -12
  32. package/dist/core/bash-executor.d.ts.map +1 -1
  33. package/dist/core/bash-executor.js +302 -12
  34. package/dist/core/bash-executor.js.map +1 -1
  35. package/dist/core/diagnostics.d.ts +191 -0
  36. package/dist/core/diagnostics.d.ts.map +1 -1
  37. package/dist/core/diagnostics.js +142 -0
  38. package/dist/core/diagnostics.js.map +1 -1
  39. package/dist/core/discover-packages.d.ts +6 -0
  40. package/dist/core/discover-packages.d.ts.map +1 -0
  41. package/dist/core/discover-packages.js +62 -0
  42. package/dist/core/discover-packages.js.map +1 -0
  43. package/dist/core/event-bus.d.ts +146 -0
  44. package/dist/core/event-bus.d.ts.map +1 -1
  45. package/dist/core/event-bus.js +93 -0
  46. package/dist/core/event-bus.js.map +1 -1
  47. package/dist/core/export-html/ansi-to-html.d.ts +4 -0
  48. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  49. package/dist/core/export-html/ansi-to-html.js +4 -0
  50. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  51. package/dist/core/export-html/index.d.ts +128 -0
  52. package/dist/core/export-html/index.d.ts.map +1 -1
  53. package/dist/core/export-html/index.js +128 -0
  54. package/dist/core/export-html/index.js.map +1 -1
  55. package/dist/core/export-html/tool-renderer.d.ts +4 -0
  56. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  57. package/dist/core/export-html/tool-renderer.js +4 -0
  58. package/dist/core/export-html/tool-renderer.js.map +1 -1
  59. package/dist/core/keybindings.d.ts +142 -0
  60. package/dist/core/keybindings.d.ts.map +1 -1
  61. package/dist/core/keybindings.js +142 -0
  62. package/dist/core/keybindings.js.map +1 -1
  63. package/dist/core/model-registry.d.ts +98 -1
  64. package/dist/core/model-registry.d.ts.map +1 -1
  65. package/dist/core/model-registry.js +98 -1
  66. package/dist/core/model-registry.js.map +1 -1
  67. package/dist/core/model-resolver.d.ts +99 -1
  68. package/dist/core/model-resolver.d.ts.map +1 -1
  69. package/dist/core/model-resolver.js +99 -1
  70. package/dist/core/model-resolver.js.map +1 -1
  71. package/dist/core/prompt-templates.js.map +1 -1
  72. package/dist/core/sdk.d.ts.map +1 -1
  73. package/dist/core/sdk.js +2 -0
  74. package/dist/core/sdk.js.map +1 -1
  75. package/dist/core/session-manager.d.ts +127 -0
  76. package/dist/core/session-manager.d.ts.map +1 -1
  77. package/dist/core/session-manager.js +125 -0
  78. package/dist/core/session-manager.js.map +1 -1
  79. package/dist/core/skills.js.map +1 -1
  80. package/dist/core/subagents.js.map +1 -1
  81. package/dist/core/tools/bash.d.ts +391 -11
  82. package/dist/core/tools/bash.d.ts.map +1 -1
  83. package/dist/core/tools/bash.js +269 -2
  84. package/dist/core/tools/bash.js.map +1 -1
  85. package/dist/core/tools/bg-process.d.ts +49 -0
  86. package/dist/core/tools/bg-process.d.ts.map +1 -0
  87. package/dist/core/tools/bg-process.js +69 -0
  88. package/dist/core/tools/bg-process.js.map +1 -0
  89. package/dist/core/tools/edit.d.ts +284 -6
  90. package/dist/core/tools/edit.d.ts.map +1 -1
  91. package/dist/core/tools/edit.js +238 -0
  92. package/dist/core/tools/edit.js.map +1 -1
  93. package/dist/core/tools/find.d.ts +169 -5
  94. package/dist/core/tools/find.d.ts.map +1 -1
  95. package/dist/core/tools/find.js +136 -0
  96. package/dist/core/tools/find.js.map +1 -1
  97. package/dist/core/tools/grep.d.ts +285 -5
  98. package/dist/core/tools/grep.d.ts.map +1 -1
  99. package/dist/core/tools/grep.js +247 -0
  100. package/dist/core/tools/grep.js.map +1 -1
  101. package/dist/core/tools/index.d.ts +45 -0
  102. package/dist/core/tools/index.d.ts.map +1 -1
  103. package/dist/core/tools/index.js +15 -0
  104. package/dist/core/tools/index.js.map +1 -1
  105. package/dist/core/tools/ls.d.ts +6 -0
  106. package/dist/core/tools/ls.d.ts.map +1 -1
  107. package/dist/core/tools/ls.js +6 -0
  108. package/dist/core/tools/ls.js.map +1 -1
  109. package/dist/core/tools/read.d.ts +308 -7
  110. package/dist/core/tools/read.d.ts.map +1 -1
  111. package/dist/core/tools/read.js +231 -0
  112. package/dist/core/tools/read.js.map +1 -1
  113. package/dist/core/tools/registry.d.ts +17 -0
  114. package/dist/core/tools/registry.d.ts.map +1 -0
  115. package/dist/core/tools/registry.js +108 -0
  116. package/dist/core/tools/registry.js.map +1 -0
  117. package/dist/core/tools/webfetch.d.ts +118 -3
  118. package/dist/core/tools/webfetch.d.ts.map +1 -1
  119. package/dist/core/tools/webfetch.js +118 -3
  120. package/dist/core/tools/webfetch.js.map +1 -1
  121. package/dist/core/tools/websearch.d.ts +130 -3
  122. package/dist/core/tools/websearch.d.ts.map +1 -1
  123. package/dist/core/tools/websearch.js +130 -3
  124. package/dist/core/tools/websearch.js.map +1 -1
  125. package/dist/core/tools/write.d.ts +251 -5
  126. package/dist/core/tools/write.d.ts.map +1 -1
  127. package/dist/core/tools/write.js +210 -0
  128. package/dist/core/tools/write.js.map +1 -1
  129. package/dist/main.d.ts.map +1 -1
  130. package/dist/main.js +12 -1
  131. package/dist/main.js.map +1 -1
  132. package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
  133. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  134. package/dist/modes/interactive/components/assistant-message.js +164 -1
  135. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  136. package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
  137. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  138. package/dist/modes/interactive/components/bash-execution.js +297 -1
  139. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  140. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  141. package/dist/modes/interactive/components/tool-execution.js +251 -1
  142. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  143. package/dist/modes/interactive/components/user-message.d.ts +186 -1
  144. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/user-message.js +186 -1
  146. package/dist/modes/interactive/components/user-message.js.map +1 -1
  147. package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
  148. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-mode.js +1567 -13
  150. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  151. package/dist/modes/interactive/theme/theme.d.ts +422 -0
  152. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  153. package/dist/modes/interactive/theme/theme.js +422 -0
  154. package/dist/modes/interactive/theme/theme.js.map +1 -1
  155. package/dist/modes/print-mode.d.ts +538 -5
  156. package/dist/modes/print-mode.d.ts.map +1 -1
  157. package/dist/modes/print-mode.js +538 -5
  158. package/dist/modes/print-mode.js.map +1 -1
  159. package/dist/modes/rpc/rpc-client.d.ts +921 -8
  160. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  161. package/dist/modes/rpc/rpc-client.js +921 -8
  162. package/dist/modes/rpc/rpc-client.js.map +1 -1
  163. package/dist/modes/rpc/rpc-mode.d.ts +802 -9
  164. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  165. package/dist/modes/rpc/rpc-mode.js +802 -9
  166. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  167. package/dist/modes/rpc/rpc-types.d.ts +356 -3
  168. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  169. package/dist/modes/rpc/rpc-types.js +356 -3
  170. package/dist/modes/rpc/rpc-types.js.map +1 -1
  171. package/dist/modes/shared.d.ts +386 -0
  172. package/dist/modes/shared.d.ts.map +1 -0
  173. package/dist/modes/shared.js +543 -0
  174. package/dist/modes/shared.js.map +1 -0
  175. package/dist/utils/array.d.ts +389 -0
  176. package/dist/utils/array.d.ts.map +1 -0
  177. package/dist/utils/array.js +585 -0
  178. package/dist/utils/array.js.map +1 -0
  179. package/dist/utils/color-formatter.d.ts +318 -0
  180. package/dist/utils/color-formatter.d.ts.map +1 -0
  181. package/dist/utils/color-formatter.js +442 -0
  182. package/dist/utils/color-formatter.js.map +1 -0
  183. package/dist/utils/data-transformer.d.ts +326 -0
  184. package/dist/utils/data-transformer.d.ts.map +1 -0
  185. package/dist/utils/data-transformer.js +512 -0
  186. package/dist/utils/data-transformer.js.map +1 -0
  187. package/dist/utils/date-formatter.d.ts +281 -0
  188. package/dist/utils/date-formatter.d.ts.map +1 -0
  189. package/dist/utils/date-formatter.js +503 -0
  190. package/dist/utils/date-formatter.js.map +1 -0
  191. package/dist/utils/error-handler.d.ts +541 -0
  192. package/dist/utils/error-handler.d.ts.map +1 -0
  193. package/dist/utils/error-handler.js +726 -0
  194. package/dist/utils/error-handler.js.map +1 -0
  195. package/dist/utils/file-operations.d.ts +297 -0
  196. package/dist/utils/file-operations.d.ts.map +1 -0
  197. package/dist/utils/file-operations.js +505 -0
  198. package/dist/utils/file-operations.js.map +1 -0
  199. package/dist/utils/frontmatter.d.ts +268 -6
  200. package/dist/utils/frontmatter.d.ts.map +1 -1
  201. package/dist/utils/frontmatter.js +500 -21
  202. package/dist/utils/frontmatter.js.map +1 -1
  203. package/dist/utils/json-formatter.d.ts +259 -0
  204. package/dist/utils/json-formatter.d.ts.map +1 -0
  205. package/dist/utils/json-formatter.js +517 -0
  206. package/dist/utils/json-formatter.js.map +1 -0
  207. package/dist/utils/logger.d.ts +176 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +346 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/utils/markdown-formatter.d.ts +211 -0
  212. package/dist/utils/markdown-formatter.d.ts.map +1 -0
  213. package/dist/utils/markdown-formatter.js +482 -0
  214. package/dist/utils/markdown-formatter.js.map +1 -0
  215. package/dist/utils/path-validator.d.ts +603 -0
  216. package/dist/utils/path-validator.d.ts.map +1 -0
  217. package/dist/utils/path-validator.js +870 -0
  218. package/dist/utils/path-validator.js.map +1 -0
  219. package/dist/utils/string-formatter.d.ts +609 -0
  220. package/dist/utils/string-formatter.d.ts.map +1 -0
  221. package/dist/utils/string-formatter.js +806 -0
  222. package/dist/utils/string-formatter.js.map +1 -0
  223. package/dist/utils/type-guards.d.ts +629 -0
  224. package/dist/utils/type-guards.d.ts.map +1 -0
  225. package/dist/utils/type-guards.js +662 -0
  226. package/dist/utils/type-guards.js.map +1 -0
  227. package/docs/COMPLETE-GUIDE.md +300 -0
  228. package/docs/COMPREHENSIVE-CLI-SUMMARY.md +900 -0
  229. package/docs/MODES-ARCHITECTURE.md +565 -0
  230. package/docs/PRINT-MODE-GUIDE.md +456 -0
  231. package/docs/RPC-GUIDE.md +705 -0
  232. package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
  233. package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
  234. package/docs/UTILS-QA-CHECKLIST.md +1061 -0
  235. package/docs/UTILS-USAGE-GUIDE.md +1419 -0
  236. package/package.json +7 -3
@@ -1,7 +1,170 @@
1
1
  import { Container, Markdown, Spacer, Text } from "indusagi/tui";
2
2
  import { getMarkdownTheme, theme } from "../theme/theme.js";
3
3
  /**
4
- * Component that renders a complete assistant message
4
+ * ============================================================================
5
+ * ASSISTANT MESSAGE COMPONENT - RENDERING MODULE
6
+ * ============================================================================
7
+ *
8
+ * PURPOSE:
9
+ * ============================================================================
10
+ * Renders complete assistant messages with support for streaming text content,
11
+ * thinking blocks, and error states. This component is the core renderer for
12
+ * all AI assistant responses in the interactive chat interface.
13
+ *
14
+ * MESSAGE TYPES:
15
+ * - Text: Regular assistant responses with markdown formatting
16
+ * - Thinking: Internal reasoning traces (collapsible, italicized)
17
+ * - Errors: Graceful rendering of aborted/failed operations
18
+ * - Mixed: Multiple content types in sequence (text + thinking)
19
+ *
20
+ * DATA FLOW:
21
+ * ============================================================================
22
+ * Session Event Flow:
23
+ * AgentSession.prompt() emits message_streamed events
24
+ * ↓
25
+ * InteractiveMode.subscribeToAgent() receives event
26
+ * ↓
27
+ * AssistantMessage extracted from event.message
28
+ * ↓
29
+ * AssistantMessageComponent created or updateContent() called
30
+ * ↓
31
+ * contentContainer cleared and rebuilt
32
+ * ↓
33
+ * Markdown/Text components added for each content block
34
+ * ↓
35
+ * TUI invalidate() and requestRender()
36
+ * ↓
37
+ * Terminal renders styled markdown
38
+ *
39
+ * Component State Lifecycle:
40
+ * 1. Constructor: Initialize empty container, apply theme
41
+ * 2. updateContent(): Parse message.content array
42
+ * 3. For each content item:
43
+ * - Check if visible (non-empty text/thinking)
44
+ * - Apply appropriate styling and formatting
45
+ * - Add to contentContainer with spacing
46
+ * 4. Check for error/abort states
47
+ * 5. invalidate() on theme change: re-render preserving message
48
+ *
49
+ * RENDERING PIPELINE:
50
+ * ============================================================================
51
+ * Layout Structure (ASCII):
52
+ * ┌─────────────────────────────────────┐
53
+ * │ [Spacer 1 line] │ ← Top spacing
54
+ * ├─────────────────────────────────────┤
55
+ * │ Markdown: Regular assistant text │ ← Text content (if present)
56
+ * │ with code blocks, lists, etc. │
57
+ * ├─────────────────────────────────────┤
58
+ * │ [Thinking...] (or full thinking) │ ← Thinking block (if present)
59
+ * │ Italic, dimmed color │
60
+ * ├─────────────────────────────────────┤
61
+ * │ Error: Operation aborted │ ← Error message (if error)
62
+ * └─────────────────────────────────────┘
63
+ *
64
+ * Rendering Rules:
65
+ * 1. Only show spacer if content is visible (non-empty text/thinking)
66
+ * 2. Text content: full markdown rendering with syntax highlight
67
+ * 3. Thinking blocks:
68
+ * - If hideThinkingBlock=true: show compact "Thinking..." label
69
+ * - If hideThinkingBlock=false: show full thinking text in italic
70
+ * 4. Spacing: Spacer(1) between thinking and following text
71
+ * 5. Errors: Only shown if no tool calls in message (tools show their own errors)
72
+ *
73
+ * STYLING/FORMATTING:
74
+ * ============================================================================
75
+ * Color Scheme (from theme):
76
+ * - Text: markdownTheme colors (inherit from theme)
77
+ * - Thinking: theme.fg("thinkingText", text) + italic
78
+ * - Error: theme.fg("error", message)
79
+ * - Aborted: theme.fg("error", message) [same as error]
80
+ *
81
+ * Text Processing:
82
+ * - Markdown: Full markdown rendering (lists, code, emphasis, etc.)
83
+ * - Text trim(): Remove leading/trailing whitespace
84
+ * - Thinking italic: Applied via theme formatter
85
+ *
86
+ * Component Nesting:
87
+ * - AssistantMessageComponent (Container)
88
+ * └── contentContainer (Container)
89
+ * ├── Spacer(1) [conditional]
90
+ * ├── Markdown(text content) [0+ times]
91
+ * ├── Markdown(thinking) [italic] [0+ times]
92
+ * ├── Spacer(1) [between thinking and text]
93
+ * └── Text(error message) [conditional]
94
+ *
95
+ * EXAMPLES:
96
+ * ============================================================================
97
+ *
98
+ * Example 1: Regular Text Response
99
+ * ─────────────────────────────────
100
+ * Message content: [{ type: "text", text: "# Hello\n\nThis is a response" }]
101
+ * Rendered output:
102
+ * <blank line>
103
+ * # Hello
104
+ *
105
+ * This is a response
106
+ *
107
+ * Example 2: Response with Thinking
108
+ * ──────────────────────────────────
109
+ * Message content: [
110
+ * { type: "thinking", thinking: "Let me reason about this..." },
111
+ * { type: "text", text: "The answer is..." }
112
+ * ]
113
+ * Rendered output:
114
+ * <blank line>
115
+ * [italic, dim] Thinking...
116
+ * <blank line>
117
+ * The answer is...
118
+ *
119
+ * Example 3: Thinking with Full Trace (hideThinkingBlock=false)
120
+ * ───────────────────────────────────────────────────────────
121
+ * Message content: [
122
+ * { type: "thinking", thinking: "1. Check args\n2. Validate\n3. Execute" }
123
+ * ]
124
+ * Rendered output:
125
+ * <blank line>
126
+ * [italic, muted color]
127
+ * 1. Check args
128
+ * 2. Validate
129
+ * 3. Execute
130
+ *
131
+ * Example 4: Error State
132
+ * ──────────────────────
133
+ * Message: { stopReason: "error", errorMessage: "Rate limit exceeded" }
134
+ * Rendered output:
135
+ * Error: Rate limit exceeded
136
+ *
137
+ * INTEGRATION:
138
+ * ============================================================================
139
+ * TUI Integration:
140
+ * - Extends Container (indusagi/tui base component)
141
+ * - Uses Markdown, Text, Spacer from indusagi/tui
142
+ * - Theme system: getMarkdownTheme(), theme.fg(), theme.italic()
143
+ *
144
+ * Session Integration:
145
+ * - Created in InteractiveMode.handleEvent() for message_streamed
146
+ * - Updated via updateContent() as streaming progresses
147
+ * - Stored in chatContainer for display
148
+ *
149
+ * Theme Integration:
150
+ * - Listens to theme changes via invalidate()
151
+ * - Re-renders with new theme when theme.json changes
152
+ * - Preserves message content across re-renders
153
+ *
154
+ * Settings Integration:
155
+ * - hideThinkingBlock: Toggle thinking visibility
156
+ * - Can be changed after component creation via setHideThinkingBlock()
157
+ * - Changes take effect on next invalidate()
158
+ *
159
+ * Streaming Integration:
160
+ * - updateContent() called repeatedly as text arrives
161
+ * - Maintains lastMessage reference for invalidate() re-render
162
+ * - Efficient: only modifies contentContainer, not entire component tree
163
+ *
164
+ * Performance Notes:
165
+ * - Markdown rendering is cached by indusagi/tui library
166
+ * - invalidate() only re-renders contentContainer
167
+ * - Suitable for incremental streaming (100+ updates acceptable)
5
168
  */
6
169
  export class AssistantMessageComponent extends Container {
7
170
  constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme()) {
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,301 @@
1
1
  /**
2
- * Component for displaying bash command execution with streaming output.
2
+ * ============================================================================
3
+ * BASH EXECUTION COMPONENT - REAL-TIME BASH OUTPUT RENDERER
4
+ * ============================================================================
5
+ *
6
+ * PURPOSE:
7
+ * ============================================================================
8
+ * Renders live bash command execution in the interactive chat interface.
9
+ * This component displays:
10
+ *
11
+ * - Command invocation with dynamic border styling
12
+ * - Real-time streaming output (appended as chunks arrive)
13
+ * - Loading animation while command runs
14
+ * - Exit code and cancellation status
15
+ * - Expandable output (collapsed preview vs full output)
16
+ * - Truncation warnings (context limits, path to full output)
17
+ * - Visual line truncation with width-aware caching
18
+ *
19
+ * DESIGN:
20
+ * BashExecutionComponent is distinct from ToolExecutionComponent because:
21
+ * 1. Streaming: Output arrives chunk-by-chunk (append, not replace)
22
+ * 2. State: Maintains outputLines array during execution
23
+ * 3. Loading: Shows spinner while running
24
+ * 4. Borders: Dynamic borders with color based on context exclusion
25
+ * 5. Visual wrapping: Line-based truncation respects terminal width
26
+ *
27
+ * DIFFERENCES FROM TOOL EXECUTION:
28
+ * - Tool execution: Shows full tool state (args + result at once)
29
+ * - Bash execution: Shows streaming output with real-time updates
30
+ * - Tool has result.content structure, bash has outputLines array
31
+ * - Bash shows loader during execution, tool shows pending background
32
+ *
33
+ * DATA FLOW:
34
+ * ============================================================================
35
+ * Bash Execution Pipeline:
36
+ * User types: !! command text
37
+ * ↓
38
+ * InteractiveMode.handleBashCommand() captures input
39
+ * ↓
40
+ * session.bash() starts async bash execution
41
+ * ↓
42
+ * BashExecutionComponent created
43
+ * ↓
44
+ * While running, agent streams stdout via session.on('bash_output')
45
+ * ↓
46
+ * component.appendOutput(chunk) called repeatedly
47
+ * ↓
48
+ * updateDisplay() called, adds new lines to content
49
+ * ↓
50
+ * TUI invalidate() and requestRender()
51
+ * ↓
52
+ * Terminal shows streaming output with loading spinner
53
+ * ↓
54
+ * Agent emits bash_complete event
55
+ * ↓
56
+ * component.setComplete(exitCode, cancelled, truncation, fullPath)
57
+ * ↓
58
+ * Loader stops, exit code/status displayed
59
+ * ↓
60
+ * TUI displays final output
61
+ *
62
+ * Component State Lifecycle:
63
+ * 1. Constructor:
64
+ * - Initialize with command string
65
+ * - Create bordered container structure
66
+ * - Add command header with styling
67
+ * - Show loader with "Running..." text
68
+ * 2. appendOutput() calls (while running):
69
+ * - Strip ANSI codes and normalize line endings
70
+ * - Split on newlines and append to outputLines
71
+ * - Call updateDisplay() to refresh
72
+ * - TUI invalidate() → render shows new content
73
+ * 3. setComplete() call (when done):
74
+ * - Store exit code and status (error/cancelled/complete)
75
+ * - Stop loader animation
76
+ * - Call updateDisplay() final time
77
+ * - Display exit code or cancellation message
78
+ * 4. invalidate() call (on theme change):
79
+ * - Re-render with new colors
80
+ * - Keep outputLines unchanged
81
+ * - Re-apply truncation and styling
82
+ *
83
+ * RENDERING PIPELINE:
84
+ * ============================================================================
85
+ * Layout Structure (ASCII):
86
+ * ┌─────────────────────────────────────────────┐
87
+ * │ [Spacer 1 line] │ ← Top margin
88
+ * ├─────────────────────────────────────────────┤
89
+ * │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ ← DynamicBorder
90
+ * │ $ command text │ ← Command header
91
+ * │ │ ← (or content)
92
+ * │ [spinner] Running... (C-c to cancel) │ ← Loader (if running)
93
+ * │ │
94
+ * │ output line 1 │ ← Output lines
95
+ * │ output line 2 │
96
+ * │ output line 3 │
97
+ * │ ... (5 more lines, to expand) │ ← Truncation hint (collapsed)
98
+ * │ │
99
+ * │ (exit 0) or (cancelled) or (exit 1) │ ← Status (if complete)
100
+ * │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │ ← DynamicBorder
101
+ * └─────────────────────────────────────────────┘
102
+ *
103
+ * Rendering Rules:
104
+ * 1. Top spacer: Always present
105
+ * 2. Top border: DynamicBorder with colorKey (bashMode or dim)
106
+ * 3. ContentContainer:
107
+ * - Command header: "$ command" (bold, colored)
108
+ * - Output lines (if available):
109
+ * a. If expanded: Show all outputLines
110
+ * b. If collapsed: Show last PREVIEW_LINES with visual truncation
111
+ * - Loader: Only if status="running"
112
+ * - Status: Only if status!="running" (complete/error/cancelled)
113
+ * 4. Bottom border: Same style as top border
114
+ *
115
+ * Output Line Handling:
116
+ * - Raw output: Received with ANSI codes
117
+ * - Strip ANSI: stripAnsi() removes color codes (preserve structure)
118
+ * - Normalize newlines: \r\n → \n, \r → \n
119
+ * - Split/append: newLines split on \n, append to outputLines
120
+ * - Styling: Apply theme.fg("muted", line) to each line
121
+ * - Wrapping: Visual line truncation handles width changes
122
+ *
123
+ * Preview Truncation (collapsed state):
124
+ * - PREVIEW_LINES = 20 (max logical lines to show when collapsed)
125
+ * - hiddenLineCount = availableLines.length - previewLogicalLines.length
126
+ * - Visual truncation: truncateToVisualLines() respects terminal width
127
+ * - Shown: "... N more lines" hint with expand key hint
128
+ *
129
+ * Context Truncation (for LLM):
130
+ * - DEFAULT_MAX_LINES = 500
131
+ * - DEFAULT_MAX_BYTES = 50KB
132
+ * - Applied BEFORE preview truncation
133
+ * - Only tail of output kept (prevents explosion of context)
134
+ * - Warning message shows truncation occurred
135
+ *
136
+ * STYLING/FORMATTING:
137
+ * ============================================================================
138
+ * Color Scheme:
139
+ * - Command: theme.fg("bashMode", "$ command") [colored, bold]
140
+ * - Border: colorKey function (bashMode or dim)
141
+ * - Output: theme.fg("muted", line) [neutral/gray]
142
+ * - Error status: theme.fg("error", "(exit 1)") [red]
143
+ * - Cancelled: theme.fg("warning", "(cancelled)") [yellow]
144
+ * - Truncation: theme.fg("warning", "[Truncated...]") [yellow]
145
+ * - Hints: keyHint("expandTools", "...") [key binding text]
146
+ *
147
+ * Loader Styling:
148
+ * - Spinner: Animated loader component
149
+ * - Spinner color: theme.fg(colorKey, spinner)
150
+ * - Text: theme.fg("muted", "Running...")
151
+ * - Key hint: editorKey("selectCancel") + " to cancel"
152
+ *
153
+ * Border Styling:
154
+ * - DynamicBorder: Fills terminal width with box characters
155
+ * - Color: colorKey function (respects excludeFromContext flag)
156
+ * - excludeFromContext: Command prefixed with !! (dim border)
157
+ * - Normal: bashMode color (highlighted border)
158
+ *
159
+ * Component Nesting:
160
+ * - BashExecutionComponent (Container)
161
+ * ├── Spacer(1) ← Top margin
162
+ * ├── DynamicBorder ← Top border
163
+ * ├── contentContainer (Container)
164
+ * │ ├── Text: "$ command" header
165
+ * │ ├── Text or dynamic component: Output lines
166
+ * │ ├── Loader ← If running
167
+ * │ └── Text: Status message ← If complete
168
+ * └── DynamicBorder ← Bottom border
169
+ *
170
+ * EXAMPLES:
171
+ * ============================================================================
172
+ *
173
+ * Example 1: Simple Command (Running)
174
+ * ────────────────────────────────────
175
+ * Command: "ls -la"
176
+ * Rendered:
177
+ * <blank>
178
+ * ┌─────────────────────────────────────────┐
179
+ * $ ls -la
180
+ * [spinner] Running... (C-c to cancel)
181
+ * └─────────────────────────────────────────┘
182
+ *
183
+ * Example 2: Simple Command (Complete)
184
+ * ──────────────────────────────────────
185
+ * Command: "echo hello" completed successfully
186
+ * Rendered:
187
+ * <blank>
188
+ * ┌─────────────────────────────────────────┐
189
+ * $ echo hello
190
+ *
191
+ * hello
192
+ * └─────────────────────────────────────────┘
193
+ *
194
+ * Example 3: Large Output (Collapsed)
195
+ * ────────────────────────────────────
196
+ * Command: "find ." with 1000 results, collapsed
197
+ * Rendered:
198
+ * <blank>
199
+ * ┌─────────────────────────────────────────┐
200
+ * $ find .
201
+ *
202
+ * ... 980 more lines (to expand)
203
+ * ./src/index.ts
204
+ * ./src/main.ts
205
+ * ./dist/index.js
206
+ * (exit 0)
207
+ * └─────────────────────────────────────────┘
208
+ *
209
+ * Example 4: Error Exit Code
210
+ * ──────────────────────────
211
+ * Command: "rm /nonexistent" failed
212
+ * Rendered:
213
+ * <blank>
214
+ * ┌─────────────────────────────────────────┐
215
+ * $ rm /nonexistent
216
+ *
217
+ * Cannot remove: No such file or directory
218
+ * (exit 1)
219
+ * └─────────────────────────────────────────┘
220
+ *
221
+ * Example 5: Cancelled Command
222
+ * ──────────────────────────────
223
+ * User pressed Ctrl-C during execution
224
+ * Rendered:
225
+ * <blank>
226
+ * ┌─────────────────────────────────────────┐
227
+ * $ long_running_command
228
+ *
229
+ * Processing...
230
+ * ... 10 more lines (to expand)
231
+ * (cancelled)
232
+ * └─────────────────────────────────────────┘
233
+ *
234
+ * INTEGRATION:
235
+ * ============================================================================
236
+ * TUI Integration:
237
+ * - Extends Container (indusagi/tui base component)
238
+ * - Uses Text, Spacer, Loader, DynamicBorder components
239
+ * - Theme system: theme.fg(), theme.bold()
240
+ * - Loader component: Animated spinner from indusagi/tui
241
+ * - Terminal access: this.ui.terminal.columns for width
242
+ *
243
+ * Session Integration:
244
+ * - Created by InteractiveMode when !! command entered
245
+ * - Updates come from AgentSession.on('bash_output')
246
+ * - Completion from AgentSession.on('bash_complete')
247
+ * - Stored in chatContainer like other messages
248
+ * - Output exported via getOutput() for BashExecutionMessage
249
+ *
250
+ * Theme Integration:
251
+ * - bashMode color: Border and command header color
252
+ * - dim color: Used if excludeFromContext=true
253
+ * - muted color: Output lines rendered in muted color
254
+ * - invalidate(): Re-renders with new theme
255
+ * - Colors apply dynamically at render time
256
+ *
257
+ * Real-time Updates:
258
+ * - appendOutput(): Non-blocking append to array
259
+ * - updateDisplay(): Rebuilds contentContainer
260
+ * - TUI calls render() after requestRender()
261
+ * - Suitable for high-frequency updates (many lines/sec)
262
+ *
263
+ * Performance Notes:
264
+ * - outputLines stored as string array (efficient append)
265
+ * - Visual truncation cached (recomputed on width change)
266
+ * - Loader is simple spinner (minimal overhead)
267
+ * - PREVIEW_LINES limits rendered lines when collapsed
268
+ * - DEFAULT_MAX_LINES prevents context explosion (500 lines cap)
269
+ *
270
+ * API:
271
+ * ============================================================================
272
+ * Constructor(command, ui, excludeFromContext):
273
+ * - command: String to display in header (can be long)
274
+ * - ui: TUI instance for requestRender() and terminal access
275
+ * - excludeFromContext: Boolean, true if !! prefixed (dim border)
276
+ *
277
+ * setExpanded(expanded):
278
+ * - expanded: Boolean, toggle between full/preview output
279
+ * - Updates display immediately
280
+ *
281
+ * appendOutput(chunk):
282
+ * - chunk: String of output to append (can be partial line)
283
+ * - Strips ANSI, normalizes newlines, appends to outputLines
284
+ * - Calls updateDisplay() and requestRender()
285
+ *
286
+ * setComplete(exitCode, cancelled, truncationResult, fullOutputPath):
287
+ * - exitCode: Number or undefined (exit code from bash)
288
+ * - cancelled: Boolean, true if user cancelled
289
+ * - truncationResult: Optional truncation info for context limits
290
+ * - fullOutputPath: Path to file with full output (if truncated)
291
+ * - Stops loader, sets status, calls updateDisplay()
292
+ *
293
+ * getOutput():
294
+ * - Returns: String of all output lines joined with newlines
295
+ * - Used for creating BashExecutionMessage
296
+ *
297
+ * getCommand():
298
+ * - Returns: String of the command that was executed
3
299
  */
4
300
  import { Container, type TUI } from "indusagi/tui";
5
301
  import { type TruncationResult } from "../../../core/tools/truncate.js";
@@ -1 +1 @@
1
- {"version":3,"file":"bash-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/bash-execution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAwB,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAGN,KAAK,gBAAgB,EAErB,MAAM,iCAAiC,CAAC;AASzC,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,EAAE,CAAM;gBAEJ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,kBAAkB,UAAQ;IAoChE;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK3B,UAAU,IAAI,IAAI;IAK3B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAkBjC,WAAW,CACV,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,cAAc,CAAC,EAAE,MAAM,GACrB,IAAI;IAgBP,OAAO,CAAC,aAAa;IA4ErB;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;CAGpB"}
1
+ {"version":3,"file":"bash-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/bash-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0SG;AAEH,OAAO,EAAE,SAAS,EAAwB,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAGN,KAAK,gBAAgB,EAErB,MAAM,iCAAiC,CAAC;AASzC,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,EAAE,CAAM;gBAEJ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,kBAAkB,UAAQ;IAoChE;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK3B,UAAU,IAAI,IAAI;IAK3B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAkBjC,WAAW,CACV,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,cAAc,CAAC,EAAE,MAAM,GACrB,IAAI;IAgBP,OAAO,CAAC,aAAa;IA4ErB;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;CAGpB"}