byterover-cli 0.4.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  49. package/dist/core/domain/errors/connection-error.js +54 -0
  50. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  51. package/dist/core/domain/errors/core-process-error.js +43 -0
  52. package/dist/core/domain/errors/task-error.d.ts +64 -0
  53. package/dist/core/domain/errors/task-error.js +116 -0
  54. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  55. package/dist/core/domain/errors/transport-error.js +114 -0
  56. package/dist/core/domain/instance/index.d.ts +1 -0
  57. package/dist/core/domain/instance/index.js +1 -0
  58. package/dist/core/domain/instance/types.d.ts +57 -0
  59. package/dist/core/domain/instance/types.js +72 -0
  60. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  61. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  62. package/dist/core/domain/transport/index.d.ts +2 -0
  63. package/dist/core/domain/transport/index.js +2 -0
  64. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  65. package/dist/core/domain/transport/schemas.js +554 -0
  66. package/dist/core/domain/transport/types.d.ts +67 -0
  67. package/dist/core/domain/transport/types.js +7 -0
  68. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  69. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  70. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  71. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  72. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  73. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  74. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  75. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  76. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  77. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  79. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  80. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  81. package/dist/core/interfaces/cipher/index.js +11 -0
  82. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  83. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  84. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  85. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  86. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  87. package/dist/core/interfaces/cipher/message-types.js +6 -0
  88. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  89. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  90. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  91. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  92. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  93. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  94. package/dist/core/interfaces/executor/index.d.ts +2 -0
  95. package/dist/core/interfaces/executor/index.js +2 -0
  96. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  97. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  98. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  99. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  100. package/dist/core/interfaces/instance/index.d.ts +2 -0
  101. package/dist/core/interfaces/instance/index.js +2 -0
  102. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  103. package/dist/core/interfaces/noop-implementations.js +62 -0
  104. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  105. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  106. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  107. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  108. package/dist/core/interfaces/transport/index.d.ts +2 -0
  109. package/dist/core/interfaces/transport/index.js +2 -0
  110. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  111. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  112. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  113. package/dist/infra/cipher/agent/agent-error.js +79 -0
  114. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  115. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  116. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  117. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  118. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  119. package/dist/infra/cipher/agent/base-agent.js +240 -0
  120. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  121. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  122. package/dist/infra/cipher/agent/index.d.ts +22 -0
  123. package/dist/infra/cipher/agent/index.js +24 -0
  124. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  125. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  126. package/dist/infra/cipher/agent/types.d.ts +35 -0
  127. package/dist/infra/cipher/agent/types.js +1 -0
  128. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  129. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  130. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  131. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  132. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  133. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  134. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  135. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  136. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  137. package/dist/infra/cipher/consumer/index.js +2 -1
  138. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  139. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  140. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  141. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  142. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  143. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  144. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  145. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  146. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  147. package/dist/infra/cipher/interactive-loop.js +41 -33
  148. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  149. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  150. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  151. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  152. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  153. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  154. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  155. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  156. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  157. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  158. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  159. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  160. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  161. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  162. package/dist/infra/cipher/llm/context/utils.js +17 -4
  163. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  164. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  165. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  166. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  167. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  168. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  169. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  170. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  171. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  172. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  173. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  174. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  175. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  176. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  177. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  178. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  179. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  180. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  181. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  182. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  183. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  184. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  185. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  186. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  187. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  188. package/dist/infra/cipher/process/command-validator.js +75 -0
  189. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  190. package/dist/infra/cipher/process/path-utils.js +94 -0
  191. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  192. package/dist/infra/cipher/process/process-service.js +98 -17
  193. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  194. package/dist/infra/cipher/session/chat-session.js +163 -13
  195. package/dist/infra/cipher/session/index.d.ts +1 -0
  196. package/dist/infra/cipher/session/index.js +2 -0
  197. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  198. package/dist/infra/cipher/session/message-queue.js +90 -0
  199. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  200. package/dist/infra/cipher/session/session-manager.js +254 -7
  201. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  202. package/dist/infra/cipher/session/session-status.js +184 -0
  203. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  204. package/dist/infra/cipher/session/title-generator.js +31 -0
  205. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  206. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  207. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  208. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  209. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  210. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  211. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  212. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  213. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  214. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  215. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  216. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  217. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  218. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  219. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  220. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  221. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  222. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  223. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  224. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  225. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  226. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  227. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  228. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  229. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  230. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  231. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  232. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  233. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  234. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  235. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  236. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  237. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  238. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  239. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  240. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  241. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  242. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  243. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  244. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  245. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  246. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  247. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  249. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  250. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  251. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  252. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  253. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  254. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  255. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  256. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  257. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  258. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  259. package/dist/infra/cipher/tools/index.d.ts +1 -1
  260. package/dist/infra/cipher/tools/index.js +1 -1
  261. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  262. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  263. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  264. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  265. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  266. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  267. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  268. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  269. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  270. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  271. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  272. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  273. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  274. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  275. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  276. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  277. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  278. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  279. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  280. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  281. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  282. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  283. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  284. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  285. package/dist/infra/context-tree/path-utils.js +7 -0
  286. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  287. package/dist/infra/core/executors/curate-executor.js +123 -0
  288. package/dist/infra/core/executors/index.d.ts +2 -0
  289. package/dist/infra/core/executors/index.js +2 -0
  290. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  291. package/dist/infra/core/executors/query-executor.js +51 -0
  292. package/dist/infra/core/task-processor.d.ts +81 -0
  293. package/dist/infra/core/task-processor.js +115 -0
  294. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  295. package/dist/infra/instance/file-instance-discovery.js +84 -0
  296. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  297. package/dist/infra/instance/file-instance-manager.js +123 -0
  298. package/dist/infra/instance/index.d.ts +3 -0
  299. package/dist/infra/instance/index.js +3 -0
  300. package/dist/infra/instance/process-utils.d.ts +14 -0
  301. package/dist/infra/instance/process-utils.js +39 -0
  302. package/dist/infra/process/agent-worker.d.ts +20 -0
  303. package/dist/infra/process/agent-worker.js +602 -0
  304. package/dist/infra/process/index.d.ts +12 -0
  305. package/dist/infra/process/index.js +11 -0
  306. package/dist/infra/process/ipc-types.d.ts +55 -0
  307. package/dist/infra/process/ipc-types.js +12 -0
  308. package/dist/infra/process/process-manager.d.ts +154 -0
  309. package/dist/infra/process/process-manager.js +471 -0
  310. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  311. package/dist/infra/process/task-queue-manager.js +226 -0
  312. package/dist/infra/process/transport-handlers.d.ts +124 -0
  313. package/dist/infra/process/transport-handlers.js +348 -0
  314. package/dist/infra/process/transport-worker.d.ts +20 -0
  315. package/dist/infra/process/transport-worker.js +168 -0
  316. package/dist/infra/repl/commands/curate-command.js +0 -5
  317. package/dist/infra/repl/commands/query-command.js +0 -3
  318. package/dist/infra/repl/repl-startup.d.ts +4 -0
  319. package/dist/infra/repl/repl-startup.js +8 -1
  320. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  321. package/dist/infra/repl/transport-client-helper.js +96 -0
  322. package/dist/infra/transport/index.d.ts +4 -0
  323. package/dist/infra/transport/index.js +4 -0
  324. package/dist/infra/transport/port-utils.d.ts +42 -0
  325. package/dist/infra/transport/port-utils.js +84 -0
  326. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  327. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  328. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  329. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  330. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  331. package/dist/infra/transport/transport-client-factory.js +168 -0
  332. package/dist/infra/transport/transport-factory.d.ts +33 -0
  333. package/dist/infra/transport/transport-factory.js +59 -0
  334. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  335. package/dist/infra/usecase/curate-use-case.js +71 -262
  336. package/dist/infra/usecase/init-use-case.js +3 -2
  337. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  338. package/dist/infra/usecase/query-use-case.js +250 -326
  339. package/dist/infra/usecase/status-use-case.js +1 -1
  340. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  341. package/dist/resources/prompts/explore.yml +78 -0
  342. package/dist/resources/prompts/plan.yml +114 -0
  343. package/dist/resources/prompts/reflection.yml +1 -1
  344. package/dist/resources/prompts/system-prompt.yml +15 -8
  345. package/dist/resources/prompts/tool-outputs.yml +0 -5
  346. package/dist/resources/tools/bash_exec.txt +98 -0
  347. package/dist/resources/tools/bash_output.txt +40 -0
  348. package/dist/resources/tools/batch.txt +28 -0
  349. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  350. package/dist/resources/tools/curate.txt +22 -0
  351. package/dist/resources/tools/delete_memory.txt +1 -0
  352. package/dist/resources/tools/detect_domains.txt +11 -0
  353. package/dist/resources/tools/edit_file.txt +1 -0
  354. package/dist/resources/tools/edit_memory.txt +1 -0
  355. package/dist/resources/tools/glob_files.txt +20 -0
  356. package/dist/resources/tools/grep_content.txt +18 -0
  357. package/dist/resources/tools/kill_process.txt +16 -0
  358. package/dist/resources/tools/list_directory.txt +16 -0
  359. package/dist/resources/tools/list_memories.txt +1 -0
  360. package/dist/resources/tools/read_file.txt +31 -0
  361. package/dist/resources/tools/read_memory.txt +1 -0
  362. package/dist/resources/tools/read_todos.txt +17 -0
  363. package/dist/resources/tools/search_history.txt +1 -0
  364. package/dist/resources/tools/task.txt +23 -0
  365. package/dist/resources/tools/write_file.txt +1 -0
  366. package/dist/resources/tools/write_memory.txt +1 -0
  367. package/dist/resources/tools/write_todos.txt +29 -0
  368. package/dist/tui/app.js +9 -13
  369. package/dist/tui/components/command-details.d.ts +14 -0
  370. package/dist/tui/components/command-details.js +35 -0
  371. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  372. package/dist/tui/components/execution/execution-changes.js +19 -4
  373. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  374. package/dist/tui/components/execution/execution-content.js +26 -13
  375. package/dist/tui/components/execution/execution-input.js +3 -3
  376. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  377. package/dist/tui/components/execution/execution-progress.js +8 -6
  378. package/dist/tui/components/execution/log-item.d.ts +3 -4
  379. package/dist/tui/components/execution/log-item.js +2 -5
  380. package/dist/tui/components/footer.js +9 -4
  381. package/dist/tui/components/header.d.ts +3 -3
  382. package/dist/tui/components/header.js +5 -3
  383. package/dist/tui/components/index.d.ts +1 -0
  384. package/dist/tui/components/index.js +1 -0
  385. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  386. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  387. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  388. package/dist/tui/components/scrollable-list.js +12 -10
  389. package/dist/tui/components/suggestions.js +39 -41
  390. package/dist/tui/components/tab-bar.d.ts +2 -1
  391. package/dist/tui/components/tab-bar.js +3 -4
  392. package/dist/tui/constants.d.ts +0 -5
  393. package/dist/tui/constants.js +0 -5
  394. package/dist/tui/contexts/auth-context.js +9 -2
  395. package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
  396. package/dist/tui/contexts/index.d.ts +6 -1
  397. package/dist/tui/contexts/index.js +6 -1
  398. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  399. package/dist/tui/contexts/onboarding-context.js +9 -9
  400. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  401. package/dist/tui/contexts/tasks-context.js +218 -0
  402. package/dist/tui/contexts/transport-context.d.ts +29 -0
  403. package/dist/tui/contexts/transport-context.js +82 -0
  404. package/dist/tui/hooks/index.d.ts +10 -6
  405. package/dist/tui/hooks/index.js +7 -6
  406. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  407. package/dist/tui/hooks/use-activity-logs.js +87 -34
  408. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  409. package/dist/tui/hooks/use-auth-polling.js +104 -0
  410. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  411. package/dist/tui/hooks/use-slash-completion.js +1 -1
  412. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  413. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  414. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  415. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  416. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  417. package/dist/tui/hooks/use-ui-heights.js +88 -0
  418. package/dist/tui/providers/app-providers.js +2 -6
  419. package/dist/tui/types/commands.d.ts +0 -26
  420. package/dist/tui/types/index.d.ts +1 -1
  421. package/dist/tui/types/ui.d.ts +9 -4
  422. package/dist/tui/utils/line.d.ts +11 -0
  423. package/dist/tui/utils/line.js +16 -0
  424. package/dist/tui/utils/log.d.ts +27 -0
  425. package/dist/tui/utils/log.js +114 -0
  426. package/dist/tui/views/command-view.d.ts +7 -0
  427. package/dist/tui/views/command-view.js +103 -80
  428. package/dist/tui/views/login-view.js +7 -4
  429. package/dist/tui/views/logs-view.d.ts +13 -0
  430. package/dist/tui/views/logs-view.js +27 -52
  431. package/dist/utils/connection-error-handler.d.ts +16 -0
  432. package/dist/utils/connection-error-handler.js +49 -0
  433. package/dist/utils/crash-log.d.ts +14 -0
  434. package/dist/utils/crash-log.js +19 -0
  435. package/dist/utils/file-helpers.d.ts +14 -0
  436. package/dist/utils/file-helpers.js +21 -0
  437. package/dist/utils/global-logs-path.d.ts +11 -0
  438. package/dist/utils/global-logs-path.js +37 -0
  439. package/dist/utils/process-logger.d.ts +53 -0
  440. package/dist/utils/process-logger.js +253 -0
  441. package/dist/utils/sandbox-detector.d.ts +31 -0
  442. package/dist/utils/sandbox-detector.js +122 -0
  443. package/oclif.manifest.json +10 -198
  444. package/package.json +5 -1
  445. package/dist/commands/cipher-agent/run.d.ts +0 -142
  446. package/dist/commands/cipher-agent/run.js +0 -555
  447. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  448. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  449. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  450. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  451. package/dist/commands/foo.d.ts +0 -14
  452. package/dist/commands/foo.js +0 -66
  453. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  454. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  455. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  456. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  457. package/dist/infra/cipher/cipher-agent.js +0 -317
  458. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  459. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  460. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  461. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  462. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  463. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  464. package/dist/tui/contexts/consumer.d.ts +0 -31
  465. package/dist/tui/contexts/consumer.js +0 -56
  466. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  467. package/dist/tui/hooks/use-consumer.js +0 -50
  468. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  469. package/dist/tui/hooks/use-queue-polling.js +0 -90
  470. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  471. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  472. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  473. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  474. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -0,0 +1,16 @@
1
+ Lists files and directories in a given path with a tree structure.
2
+
3
+ - The path parameter must be absolute; omit it to use the current workspace directory
4
+ - Automatically ignores common build artifacts: node_modules, dist, .git, __pycache__, etc.
5
+ - You can provide additional ignore patterns via the `ignore` parameter
6
+ - Returns up to 100 files by default (adjustable via `maxResults`)
7
+ - You should generally prefer the glob_files and grep_content tools if you know which directories to search
8
+ - Use this tool to get an overview of a directory structure
9
+
10
+ Default ignored patterns:
11
+ - node_modules/, dist/, build/, target/, vendor/
12
+ - .git/, .idea/, .vscode/
13
+ - __pycache__/, .venv/, venv/, env/
14
+ - coverage/, .cache/, cache/, logs/, tmp/, temp/
15
+
16
+ If results are truncated, consider using glob_files with a specific pattern instead.
@@ -0,0 +1 @@
1
+ List and filter memories from the scratch pad. Returns memories sorted by most recent first. Use this to discover what context has been stored.
@@ -0,0 +1,31 @@
1
+ Reads a file from the local filesystem.
2
+
3
+ Usage:
4
+ - Accepts both absolute and relative paths (relative paths resolved against working directory)
5
+ - By default, reads up to 2000 lines starting from the beginning of the file
6
+ - You can specify offset (1-based line number) and limit to read specific sections
7
+ - Any lines longer than 2000 characters will be truncated with "..."
8
+ - Results include line numbers in "00001| content" format wrapped in <file> tags
9
+ - If the file is not found, similar filenames will be suggested
10
+
11
+ Special file handling:
12
+ - Image files (PNG, JPG, GIF, WebP, BMP, ICO): Returned as base64 attachment for multimodal processing
13
+ - PDF files: Returned as base64 attachment
14
+ - Binary files: Rejected with clear error message
15
+ - .env files: Blocked for security (except .env.sample, .env.example, .env.template)
16
+
17
+ Output:
18
+ - content: File content with line numbers (00001| format) wrapped in <file> tags
19
+ - lines: Number of lines returned
20
+ - totalLines: Total lines in the file
21
+ - truncated: Whether more content is available
22
+ - message: Human-readable status with guidance on how to read more
23
+ - preview: First 20 lines of content (for UI display)
24
+ - attachment: Base64 data for images/PDFs (with mimeType and fileName)
25
+
26
+ For large files, use offset and limit parameters:
27
+ - First read: offset=1, limit=2000 (default)
28
+ - Continue: offset=2001, limit=2000
29
+ - Read specific section: offset=500, limit=100
30
+
31
+ If results are truncated, the message will tell you which offset to use next.
@@ -0,0 +1 @@
1
+ Read a specific memory by ID. Use this to retrieve previously stored context, findings, or intermediate results from the scratch pad.
@@ -0,0 +1,17 @@
1
+ Read the current todo list for this session.
2
+
3
+ This tool should be used proactively and frequently to ensure that you are aware of
4
+ the status of the current task list
5
+
6
+ ## Output
7
+
8
+ - **title**: Count of incomplete todos (e.g., "3 todos")
9
+ - **content**: JSON formatted list of all todos
10
+ - **metadata**: Structured todo data for programmatic access
11
+
12
+ ## Each todo item contains
13
+
14
+ - **id**: Unique identifier
15
+ - **content**: Task description (imperative form, e.g., "Run tests")
16
+ - **activeForm**: Present continuous form for display (e.g., "Running tests")
17
+ - **status**: pending, in_progress, completed, or cancelled
@@ -0,0 +1 @@
1
+ Search conversation history. Supports searching messages or sessions. Can filter by role and session.
@@ -0,0 +1,23 @@
1
+ Delegates work to a specialized subagent for complex tasks.
2
+
3
+ Available Subagents:
4
+ - explore: Fast codebase exploration. Searches files, reads code, finds patterns.
5
+ Use for: finding implementations, understanding code structure, locating files
6
+ - curate: Creates/updates knowledge topics in the context tree.
7
+ Use for: storing knowledge after gathering information
8
+
9
+ Parameters:
10
+ - subagent_type: "explore" or "curate"
11
+ - description: Short task description (3-5 words)
12
+ - prompt: Detailed instructions for the subagent
13
+ - contextTreeOnly: (Optional) If true, restricts to .brv/context-tree/ only
14
+ - session_id: (Optional) Continue existing session
15
+
16
+ Workflow:
17
+ 1. Use explore to find/understand code
18
+ 2. Use curate to store findings in context tree
19
+
20
+ Rules:
21
+ - Provide clear, detailed prompts
22
+ - Subagents cannot call task (no recursion)
23
+ - For context tree queries, use contextTreeOnly=true
@@ -0,0 +1 @@
1
+ Write content to a file. Overwrites existing files. Can optionally create parent directories.
@@ -0,0 +1 @@
1
+ Write content to agent memory as a scratch pad. Use this to store intermediate results, findings, or context that should persist across tool calls. Memories can be tagged and pinned for easy retrieval.
@@ -0,0 +1,29 @@
1
+ Use this tool to create and manage a structured task list for the current session. This helps track progress, organize complex tasks, and demonstrate thoroughness to the user.
2
+
3
+ ## When to Use This Tool
4
+ Always use this tool proactively when curating the context tree:
5
+ 1. Based on the context that needs to be queried, create a plan
6
+ 2. Start with the `glob_files` and `grep_content` tools to examine the current tree structure located at `.brv/context-tree/ related to the context that needs to be curated, such as domains, topics, and subtopics
7
+ 3. Read to understand important context if necessary using the `read_file` tool
8
+ 4. Run the `curator` tool to determine the necessary operations
9
+ 5. Curate using the tools: `write_file` to add, `edit_file` to update or merge, and `bash_exec` to remove context (delete operations)
10
+
11
+ ## Task States
12
+ - **pending**: Task not yet started
13
+ - **in_progress**: Currently working on (limit to ONE task at a time)
14
+ - **completed**: Task finished successfully
15
+ - **cancelled**: Task no longer needed
16
+
17
+ ## Important Rules
18
+ - ONLY ONE task can be "in_progress" at any time
19
+ - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)
20
+ - Each todo must have a unique **id** for tracking
21
+ - Task descriptions need both forms:
22
+ - content: Imperative form (e.g., "Run tests")
23
+ - activeForm: Present continuous form (e.g., "Running tests")
24
+
25
+ ## Todo Item Fields
26
+ - **id**: Unique identifier for the todo item (required)
27
+ - **content**: Imperative description (e.g., "Run tests")
28
+ - **activeForm**: Present continuous form (e.g., "Running tests")
29
+ - **status**: pending, in_progress, completed, or cancelled
package/dist/tui/app.js CHANGED
@@ -6,21 +6,17 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
6
6
  * - Unauthorized: Show login prompt
7
7
  * - Authorized: Show main app with tabs
8
8
  */
9
- import { Box, useStdout } from 'ink';
9
+ import { Box } from 'ink';
10
10
  import { Footer, Header, TabBar } from './components/index.js';
11
- import { LAYOUT } from './constants.js';
12
- import { useAuth, useConsumer } from './contexts/index.js';
13
- import { useTabNavigation } from './hooks/index.js';
11
+ import { useAuth, useTasks } from './contexts/index.js';
12
+ import { useTabNavigation, useTerminalBreakpoint, useUIHeights } from './hooks/index.js';
14
13
  import { CommandView, LoginView, LogsView } from './views/index.js';
15
14
  export const App = () => {
16
- const { stdout } = useStdout();
17
- const terminalHeight = stdout?.rows ?? 24;
18
- const terminalWidth = stdout?.columns ?? 80;
19
- // Get auth state from context
15
+ const { columns: terminalWidth, rows: terminalHeight } = useTerminalBreakpoint();
16
+ const { appBottomPadding, footer, header, tab } = useUIHeights();
20
17
  const { isAuthorized } = useAuth();
21
- // Tab navigation and queue hooks
22
- const { activeTab } = useTabNavigation();
23
- const { stats } = useConsumer();
24
- const contentHeight = Math.max(1, terminalHeight - LAYOUT.headerHeight - LAYOUT.tabBarHeight - LAYOUT.footerHeight);
25
- return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, paddingBottom: 1, width: terminalWidth, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Header, { compact: isAuthorized, queueStats: stats ? { pending: stats.queued, processing: stats.running } : undefined, showQueueStats: isAuthorized }) }), isAuthorized ? (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(TabBar, { activeTab: activeTab }) }), _jsxs(Box, { flexGrow: 1, height: contentHeight, paddingX: 1, children: [_jsx(Box, { display: activeTab === 'activity' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(LogsView, { availableHeight: contentHeight }) }), _jsx(Box, { display: activeTab === 'console' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(CommandView, { availableHeight: contentHeight }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(Footer, {}) })] })) : (_jsx(Box, { flexGrow: 1, paddingX: 1, children: _jsx(LoginView, {}) }))] }));
18
+ const { activeTab, tabs } = useTabNavigation();
19
+ const { stats: taskStats } = useTasks();
20
+ const contentHeight = Math.max(1, terminalHeight - header - tab - footer);
21
+ return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, paddingBottom: appBottomPadding, width: terminalWidth, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Header, { compact: isAuthorized, showTransportStats: isAuthorized, taskStats: taskStats }) }), isAuthorized ? (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(TabBar, { activeTab: activeTab, tabs: tabs }) }), _jsxs(Box, { flexGrow: 1, paddingX: 1, children: [_jsx(Box, { display: activeTab === 'activity' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(LogsView, { availableHeight: contentHeight }) }), _jsx(Box, { display: activeTab === 'console' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(CommandView, { availableHeight: contentHeight }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(Footer, {}) })] })) : (_jsx(Box, { flexGrow: 1, paddingX: 1, children: _jsx(LoginView, {}) }))] }));
26
22
  };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Command Details Component
3
+ *
4
+ * Displays detailed information about a selected command suggestion,
5
+ * including description, usage, subcommands, arguments, and flags.
6
+ */
7
+ import React from 'react';
8
+ import type { CommandSuggestion } from '../types.js';
9
+ interface CommandDetailsProps {
10
+ labelWidth: number;
11
+ selectedSuggestion: CommandSuggestion | null;
12
+ }
13
+ export declare const CommandDetails: React.FC<CommandDetailsProps>;
14
+ export {};
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Command Details Component
4
+ *
5
+ * Displays detailed information about a selected command suggestion,
6
+ * including description, usage, subcommands, arguments, and flags.
7
+ */
8
+ import { Box, Text } from 'ink';
9
+ import { useTheme } from '../contexts/theme-context.js';
10
+ /**
11
+ * Format usage string from args, flags, and subcommands
12
+ */
13
+ function formatUsage(label, args, flags, subCommands) {
14
+ let usage = label;
15
+ if (subCommands?.length) {
16
+ usage += ' <subcommand>';
17
+ }
18
+ if (args?.length) {
19
+ const argsStr = args.map((a) => (a.required ? `<${a.name}>` : `[${a.name}]`)).join(' ');
20
+ usage += ` ${argsStr}`;
21
+ }
22
+ if (flags?.length) {
23
+ const flagsStr = flags.map((f) => `[--${f.name}]`).join(' ');
24
+ usage += ` ${flagsStr}`;
25
+ }
26
+ return usage;
27
+ }
28
+ export const CommandDetails = ({ labelWidth, selectedSuggestion }) => {
29
+ const { theme: { colors }, } = useTheme();
30
+ const hasDetails = selectedSuggestion &&
31
+ (selectedSuggestion.args?.length || selectedSuggestion.flags?.length || selectedSuggestion.subCommands?.length);
32
+ return (_jsxs(Box, { borderBottom: false, borderColor: colors.border, borderRight: false, borderStyle: "single", borderTop: false, flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: colors.dimText, children: selectedSuggestion?.description || '' }), hasDetails && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: colors.text, children: ["Usage:", ' ', formatUsage(selectedSuggestion.label, selectedSuggestion.args, selectedSuggestion.flags, selectedSuggestion.subCommands)] }), selectedSuggestion.subCommands?.map((sub) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: sub.name.padEnd(labelWidth + 2) }), ' ', sub.description] }, sub.name))), selectedSuggestion.args?.map((arg) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: (arg.required ? `<${arg.name}>` : `[${arg.name}]`).padEnd(labelWidth + 2) }), ' ', arg.description] }, arg.name))), selectedSuggestion.flags?.map((flag) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: (flag.type === 'file'
33
+ ? `${flag.char || '@'}file`
34
+ : (flag.char ? `-${flag.char}, ` : '') + `--${flag.name}`).padEnd(labelWidth + 2) }), ' ', flag.description, flag.default !== undefined && _jsxs(Text, { children: [" (default: ", String(flag.default), ")"] })] }, flag.name)))] }))] }));
35
+ };
@@ -7,6 +7,11 @@ import React from 'react';
7
7
  interface ExecutionChangesProps {
8
8
  /** List of created file paths */
9
9
  created: string[];
10
+ /** Maximum changes configuration */
11
+ maxChanges?: {
12
+ created: number;
13
+ updated: number;
14
+ };
10
15
  /** List of updated file paths */
11
16
  updated: string[];
12
17
  }
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * Execution Changes Component
4
4
  *
@@ -6,10 +6,25 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
6
6
  */
7
7
  import { Box, Text } from 'ink';
8
8
  import { useTheme } from '../../hooks/index.js';
9
- export const ExecutionChanges = ({ created, updated }) => {
9
+ export const ExecutionChanges = ({ created, updated, maxChanges = { created: Infinity, updated: Infinity }, }) => {
10
10
  const { theme: { colors }, } = useTheme();
11
- if (created.length === 0 && updated.length === 0) {
11
+ const totalChanges = created.length + updated.length;
12
+ if (totalChanges === 0) {
12
13
  return null;
13
14
  }
14
- return (_jsxs(_Fragment, { children: [created.length > 0 && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "created at:" }), _jsx(Box, { flexDirection: "column", children: created.map((path) => (_jsx(Text, { children: path }, path))) })] })), updated.length > 0 && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "updated at:" }), _jsx(Box, { flexDirection: "column", children: updated.map((path) => (_jsx(Text, { children: path }, path))) })] }))] }));
15
+ const hasCreated = created.length > 0;
16
+ const hasUpdated = updated.length > 0;
17
+ // Calculate overflow for each section
18
+ // maxChanges represents total lines (items + indicator if overflow)
19
+ const createdOverflow = created.length > maxChanges.created;
20
+ const updatedOverflow = updated.length > maxChanges.updated;
21
+ // Calculate visible items per section
22
+ // If overflow, reserve 1 line for indicator, show (maxChanges - 1) items
23
+ const createdItemsMax = createdOverflow ? maxChanges.created - 1 : maxChanges.created;
24
+ const updatedItemsMax = updatedOverflow ? maxChanges.updated - 1 : maxChanges.updated;
25
+ const visibleCreated = created.slice(0, Math.max(0, createdItemsMax));
26
+ const visibleUpdated = updated.slice(0, Math.max(0, updatedItemsMax));
27
+ const createdRemaining = created.length - visibleCreated.length;
28
+ const updatedRemaining = updated.length - visibleUpdated.length;
29
+ return (_jsxs(Box, { flexDirection: "column", children: [hasCreated && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "created at:" }), _jsxs(Box, { flexDirection: "column", children: [visibleCreated.map((path) => (_jsx(Text, { children: path }, path))), createdRemaining > 0 && _jsxs(Text, { color: colors.dimText, children: ["... and ", createdRemaining, " more created"] })] })] })), hasUpdated && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "updated at:" }), _jsxs(Box, { flexDirection: "column", children: [visibleUpdated.map((path) => (_jsx(Text, { children: path }, path))), updatedRemaining > 0 && _jsxs(Text, { color: colors.dimText, children: ["... and ", updatedRemaining, " more updated"] })] })] }))] }));
15
30
  };
@@ -14,12 +14,14 @@ export declare function truncateContent(content: string, maxLines: number, maxCh
14
14
  truncatedContent: string;
15
15
  };
16
16
  interface ExecutionContentProps {
17
+ /** Bottom margin for this content section */
18
+ bottomMargin?: number;
17
19
  /** The content to display */
18
20
  content: string;
19
21
  /** Whether this is error content */
20
22
  isError?: boolean;
21
- /** Maximum number of lines before truncation */
22
- maxLines: number;
23
+ /** Maximum number of lines (rows) this component can use, including the "more lines" indicator */
24
+ maxLines?: number;
23
25
  }
24
26
  export declare const ExecutionContent: React.FC<ExecutionContentProps>;
25
27
  export {};
@@ -6,15 +6,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  */
7
7
  import { Box, Text, useStdout } from 'ink';
8
8
  import { useTheme } from '../../hooks/index.js';
9
- /**
10
- * Calculate visual line count for a single line, accounting for wrapping
11
- */
12
- function getVisualLineCount(line, maxCharsPerLine) {
13
- if (maxCharsPerLine <= 0 || line.length === 0) {
14
- return 1;
15
- }
16
- return Math.ceil(line.length / maxCharsPerLine) || 1;
17
- }
9
+ import { getVisualLineCount } from '../../utils/line.js';
10
+ const DEFAULT_MAX_LINES = 5;
18
11
  /**
19
12
  * Truncate content string to maxLines, returning truncated content and remaining line count.
20
13
  * Accounts for line wrapping when maxCharsPerLine is provided.
@@ -49,19 +42,39 @@ export function truncateContent(content, maxLines, maxCharsPerLine) {
49
42
  break;
50
43
  }
51
44
  }
45
+ // Replace last 3 characters of last line with "..." if truncated
46
+ let finalContent = truncatedLines.join('\n');
47
+ if (truncatedLines.length > 0 && totalVisualLines > visualLineCount) {
48
+ const lastLineIndex = truncatedLines.length - 1;
49
+ const lastLine = truncatedLines[lastLineIndex];
50
+ if (lastLine.length >= 3) {
51
+ truncatedLines[lastLineIndex] = lastLine.slice(0, -3) + '...';
52
+ finalContent = truncatedLines.join('\n');
53
+ }
54
+ else if (lastLine.length > 0) {
55
+ // If last line is shorter than 3 chars, just replace entirely with "..."
56
+ truncatedLines[lastLineIndex] = '...';
57
+ finalContent = truncatedLines.join('\n');
58
+ }
59
+ }
52
60
  return {
53
61
  remainingLines: totalVisualLines - visualLineCount,
54
62
  totalLines: totalVisualLines,
55
- truncatedContent: truncatedLines.join('\n'),
63
+ truncatedContent: finalContent,
56
64
  };
57
65
  }
58
- export const ExecutionContent = ({ content, isError = false, maxLines }) => {
66
+ export const ExecutionContent = ({ bottomMargin = 1, content, isError = false, maxLines = DEFAULT_MAX_LINES, }) => {
59
67
  const { theme: { colors }, } = useTheme();
60
68
  const { stdout } = useStdout();
61
69
  const contentWidth = (stdout?.columns ?? 80) - 4; // 4 is for padding
62
70
  if (!content) {
63
71
  return null;
64
72
  }
65
- const { remainingLines, truncatedContent } = truncateContent(content, maxLines, contentWidth);
66
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: isError ? colors.errorText : colors.text, children: truncatedContent }), remainingLines > 0 && _jsxs(Text, { color: colors.dimText, children: ["\u2195 ", remainingLines, " more lines"] })] }));
73
+ // First check if content would overflow
74
+ const { totalLines } = truncateContent(content, maxLines, contentWidth);
75
+ const hasOverflow = totalLines > maxLines;
76
+ // If overflow, reserve 1 line for indicator, show (maxLines - 1) lines of content
77
+ const effectiveMaxLines = hasOverflow ? maxLines - 1 : maxLines;
78
+ const { remainingLines, truncatedContent } = truncateContent(content, effectiveMaxLines, contentWidth);
79
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: bottomMargin, children: [_jsx(Text, { color: isError ? colors.errorText : colors.text, children: truncatedContent }), remainingLines > 0 && _jsxs(Text, { color: colors.dimText, children: ["\u2195 ", remainingLines, " more lines"] })] }));
67
80
  };
@@ -1,4 +1,4 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
3
  * Execution Input Component
4
4
  *
@@ -11,6 +11,6 @@ export const ExecutionInput = ({ input }) => {
11
11
  const { theme: { colors }, } = useTheme();
12
12
  const { stdout } = useStdout();
13
13
  const contentWidth = (stdout?.columns ?? 80) - 8; // 8 is for padding
14
- const { remainingLines, truncatedContent } = truncateContent(input, 1, contentWidth);
15
- return (_jsx(Box, { borderColor: colors.border, borderStyle: "single", flexDirection: "column", children: _jsxs(Text, { children: [truncatedContent, remainingLines > 1 ? '...' : ''] }) }));
14
+ const { truncatedContent } = truncateContent(input, 1, contentWidth);
15
+ return (_jsx(Box, { borderColor: colors.border, borderStyle: "single", flexDirection: "column", children: _jsx(Text, { children: truncatedContent }) }));
16
16
  };
@@ -12,8 +12,8 @@ interface ProgressItem {
12
12
  toolCallName: string;
13
13
  }
14
14
  interface ExecutionProgressProps {
15
- /** Maximum number of items to show (default: 3) */
16
- maxItems?: number;
15
+ /** Maximum number of lines (rows) this component can use, including hint line (default: 3) */
16
+ maxLines?: number;
17
17
  /** Array of progress items */
18
18
  progress: ProgressItem[];
19
19
  }
@@ -8,14 +8,16 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
8
8
  import { Box, Text } from 'ink';
9
9
  import Spinner from 'ink-spinner';
10
10
  import { useTheme } from '../../hooks/index.js';
11
- /** Default maximum number of visible progress items */
12
- const DEFAULT_MAX_ITEMS = 3;
13
- export const ExecutionProgress = ({ maxItems = DEFAULT_MAX_ITEMS, progress }) => {
11
+ /** Default maximum number of lines (rows) for progress display */
12
+ const DEFAULT_MAX_LINES = 3;
13
+ export const ExecutionProgress = ({ maxLines = DEFAULT_MAX_LINES, progress }) => {
14
14
  const { theme: { colors }, } = useTheme();
15
15
  if (!progress || progress.length === 0) {
16
16
  return null;
17
17
  }
18
- const hasMore = progress.length > maxItems;
19
- const visibleItems = progress.slice(-maxItems).reverse();
20
- return (_jsxs(Box, { flexDirection: "column", children: [hasMore && _jsxs(Text, { color: colors.dimText, children: ["... and ", progress.length - maxItems, " more"] }), visibleItems.map((item) => (_jsxs(Box, { children: [item.status === 'completed' && _jsx(Text, { color: colors.primary, children: "\u2713 " }), item.status === 'running' && (_jsxs(Text, { color: colors.dimText, children: [_jsx(Spinner, { type: "dots" }), ' '] })), item.status === 'failed' && _jsx(Text, { color: colors.errorText, children: "\u2717 " }), _jsx(Text, { color: colors.dimText, children: item.toolCallName })] }, item.id)))] }));
18
+ const hasMore = progress.length > maxLines;
19
+ // If there's overflow, reserve 1 line for hint, show (maxLines - 1) items
20
+ const visibleCount = hasMore ? maxLines - 1 : maxLines;
21
+ const visibleItems = progress.slice(-visibleCount);
22
+ return (_jsxs(Box, { flexDirection: "column", children: [hasMore && _jsxs(Text, { color: colors.dimText, children: ["... and ", progress.length - visibleCount, " more tools used"] }), visibleItems.map((item) => (_jsxs(Box, { children: [item.status === 'completed' && _jsx(Text, { color: colors.primary, children: "\u2713 " }), item.status === 'running' && (_jsxs(Text, { color: colors.dimText, children: [_jsx(Spinner, { type: "dots" }), ' '] })), item.status === 'failed' && _jsx(Text, { color: colors.errorText, children: "\u2717 " }), _jsx(Text, { color: colors.dimText, children: item.toolCallName })] }, item.id)))] }));
21
23
  };
@@ -4,14 +4,13 @@
4
4
  * Displays a single activity log entry with header, input, progress, content, and changes.
5
5
  */
6
6
  import React from 'react';
7
+ import type { MessageItemHeights } from '../../hooks/index.js';
7
8
  import type { ActivityLog } from '../../types.js';
8
9
  interface LogItemProps {
10
+ /** Dynamic heights based on terminal breakpoint */
11
+ heights: MessageItemHeights;
9
12
  /** The activity log to display */
10
13
  log: ActivityLog;
11
- /** Maximum number of content lines before truncation */
12
- maxContentLines: number;
13
- /** Maximum number of progress items to show (default: 3) */
14
- maxProgressItems?: number;
15
14
  }
16
15
  export declare const LogItem: React.FC<LogItemProps>;
17
16
  export {};
@@ -11,15 +11,12 @@ import { ExecutionContent } from './execution-content.js';
11
11
  import { ExecutionInput } from './execution-input.js';
12
12
  import { ExecutionProgress } from './execution-progress.js';
13
13
  import { ExecutionStatus } from './execution-status.js';
14
- /** Default maximum number of visible progress items */
15
- const DEFAULT_MAX_PROGRESS_ITEMS = 3;
16
- export const LogItem = ({ log, maxContentLines, maxProgressItems = DEFAULT_MAX_PROGRESS_ITEMS, }) => {
14
+ export const LogItem = ({ heights, log }) => {
17
15
  const { theme: { colors }, } = useTheme();
18
16
  // Format timestamp as local time HH:MM:SS
19
17
  const hours = log.timestamp.getHours().toString().padStart(2, '0');
20
18
  const minutes = log.timestamp.getMinutes().toString().padStart(2, '0');
21
19
  const seconds = log.timestamp.getSeconds().toString().padStart(2, '0');
22
20
  const displayTime = `${hours}:${minutes}:${seconds}`;
23
- const displayTools = Math.min(log.progress?.length ?? 0, maxProgressItems) + 1;
24
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: [_jsxs(Box, { children: [_jsxs(Text, { color: log.type === 'curate' ? colors.curateCommand : colors.queryCommand, children: ["[", log.type, "] "] }), _jsxs(Text, { color: colors.dimText, children: ["@", log.source ?? 'system'] }), _jsx(Spacer, {}), _jsxs(Text, { color: colors.dimText, children: ["[", displayTime, "]"] })] }), _jsx(ExecutionInput, { input: log.input }), _jsxs(Box, { flexDirection: "column", children: [log.progress && _jsx(ExecutionProgress, { maxItems: maxProgressItems, progress: log.progress }), _jsx(ExecutionStatus, { status: log.status })] }), (log.status === 'failed' || log.status === 'completed') && (_jsx(ExecutionContent, { content: log.content ?? '', isError: log.status === 'failed', maxLines: maxContentLines - displayTools })), log.status === 'completed' && _jsx(ExecutionChanges, { created: log.changes.created, updated: log.changes.updated })] }));
21
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: [_jsxs(Box, { children: [_jsxs(Text, { color: log.type === 'curate' ? colors.curateCommand : colors.queryCommand, children: ["[", log.type, "] "] }), _jsxs(Text, { color: colors.dimText, children: ["@", log.source ?? 'system'] }), _jsx(Spacer, {}), _jsxs(Text, { color: colors.dimText, children: ["[", displayTime, "]"] })] }), _jsx(ExecutionInput, { input: log.input }), _jsxs(Box, { flexDirection: "column", children: [log.progress && _jsx(ExecutionProgress, { maxLines: heights.maxProgressItems, progress: log.progress }), _jsx(ExecutionStatus, { status: log.status })] }), (log.status === 'failed' || log.status === 'completed') && (_jsx(ExecutionContent, { bottomMargin: heights.contentBottomMargin, content: log.content ?? '', isError: log.status === 'failed', maxLines: heights.maxContentLines })), log.status === 'completed' && (_jsx(ExecutionChanges, { created: log.changes.created, maxChanges: heights.maxChanges, updated: log.changes.updated }))] }));
25
22
  };
@@ -3,10 +3,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  * Footer Component - Dynamic based on active tab
4
4
  */
5
5
  import { Box, Text } from 'ink';
6
- import { useMode } from '../contexts/use-mode.js';
7
- import { useTheme } from '../contexts/use-theme.js';
6
+ import { useMemo } from 'react';
7
+ import { useMode } from '../contexts/mode-context.js';
8
+ import { useOnboarding } from '../contexts/onboarding-context.js';
9
+ import { useTheme } from '../contexts/theme-context.js';
8
10
  export const Footer = () => {
9
11
  const { shortcuts } = useMode();
10
- const { theme: { colors } } = useTheme();
11
- return (_jsx(Box, { gap: 1, paddingX: 1, width: "100%", children: shortcuts.map((shortcut, index) => (_jsxs(Box, { children: [index > 0 && _jsx(Text, { color: colors.dimText, children: " \u2022 " }), _jsx(Text, { color: colors.text, children: shortcut.key }), _jsxs(Text, { color: colors.dimText, children: [" ", shortcut.description] })] }, shortcut.key))) }));
12
+ const { shouldShowOnboarding } = useOnboarding();
13
+ const { theme: { colors }, } = useTheme();
14
+ // Filter out 'tab' shortcut during onboarding (tab switching is disabled)
15
+ const visibleShortcuts = useMemo(() => (shouldShowOnboarding ? shortcuts.filter((s) => s.key !== 'tab') : shortcuts), [shortcuts, shouldShowOnboarding]);
16
+ return (_jsx(Box, { gap: 1, paddingX: 1, width: "100%", children: visibleShortcuts.map((shortcut, index) => (_jsxs(Box, { children: [index > 0 && _jsx(Text, { color: colors.dimText, children: " \u2022 " }), _jsx(Text, { color: colors.text, children: shortcut.key }), _jsxs(Text, { color: colors.dimText, children: [" ", shortcut.description] })] }, shortcut.key))) }));
12
17
  };
@@ -7,12 +7,12 @@
7
7
  * - Queue stats (pending/processing)
8
8
  */
9
9
  import React from 'react';
10
- import type { QueueStats } from '../types.js';
10
+ import { TaskStats } from '../types/ui.js';
11
11
  interface HeaderProps {
12
12
  compact?: boolean;
13
13
  connectedAgent?: string;
14
- queueStats?: QueueStats;
15
- showQueueStats?: boolean;
14
+ showTransportStats?: boolean;
15
+ taskStats?: TaskStats;
16
16
  }
17
17
  export declare const Header: React.FC<HeaderProps>;
18
18
  export {};
@@ -9,10 +9,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  */
10
10
  import { Box, Spacer, Text } from 'ink';
11
11
  import { useServices } from '../contexts/index.js';
12
- import { useTheme } from '../contexts/use-theme.js';
12
+ import { useTheme } from '../contexts/theme-context.js';
13
+ import { useTerminalBreakpoint } from '../hooks/use-terminal-breakpoint.js';
13
14
  import { Logo } from './logo.js';
14
- export const Header = ({ compact, connectedAgent, queueStats, showQueueStats }) => {
15
+ export const Header = ({ compact, connectedAgent, showTransportStats, taskStats: transportStats }) => {
15
16
  const { version } = useServices();
16
17
  const { theme } = useTheme();
17
- return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Logo, { compact: compact, version: version }), _jsxs(Box, { justifyContent: "space-between", children: [_jsx(Box, { gap: 2, children: connectedAgent && (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u25CF " }), _jsx(Text, { color: "gray", children: connectedAgent })] })) }), showQueueStats && (_jsxs(Box, { paddingRight: 1, children: [_jsx(Spacer, {}), _jsx(Text, { children: "~ in queue: " }), _jsx(Text, { color: theme.colors.warning, children: queueStats?.pending ?? 0 }), _jsx(Text, { children: " | running: " }), _jsx(Text, { color: theme.colors.primary, children: queueStats?.processing ?? 0 })] }))] })] }));
18
+ const { breakpoint } = useTerminalBreakpoint();
19
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Logo, { compact: compact, version: version }), _jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { gap: 2, children: [connectedAgent && (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u25CF " }), _jsx(Text, { color: "gray", children: connectedAgent })] })), breakpoint === "compact" && (_jsx(Text, { color: theme.colors.warning, children: "Terminal too small - expand for better experience" }))] }), showTransportStats && (_jsxs(Box, { paddingRight: 1, children: [_jsx(Spacer, {}), _jsx(Text, { children: "~ in queue: " }), _jsx(Text, { color: theme.colors.warning, children: transportStats?.created ?? 0 }), _jsx(Text, { children: " | running: " }), _jsx(Text, { color: theme.colors.primary, children: transportStats?.started ?? 0 })] }))] })] }));
18
20
  };
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * TUI Components
3
3
  */
4
+ export { CommandDetails } from './command-details.js';
4
5
  export { EnterPrompt } from './enter-prompt.js';
5
6
  export { ExecutionChanges, ExecutionContent, ExecutionInput, ExecutionProgress, ExecutionStatus, LogItem, truncateContent, } from './execution/index.js';
6
7
  export { Footer } from './footer.js';
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * TUI Components
3
3
  */
4
+ export { CommandDetails } from './command-details.js';
4
5
  export { EnterPrompt } from './enter-prompt.js';
5
6
  export { ExecutionChanges, ExecutionContent, ExecutionInput, ExecutionProgress, ExecutionStatus, LogItem, truncateContent, } from './execution/index.js';
6
7
  export { Footer } from './footer.js';
@@ -1,15 +1,17 @@
1
1
  /**
2
2
  * Copyable Prompt Component
3
3
  *
4
- * Displays a bordered prompt with keyboard shortcut to copy to clipboard.
4
+ * Renders a customizable button that copies text to clipboard on ctrl+y.
5
5
  * Shows visual feedback when copied.
6
6
  */
7
7
  import React from 'react';
8
8
  interface CopyablePromptProps {
9
+ /** Button label/content to display */
10
+ buttonLabel?: string;
9
11
  /** Whether keyboard input is active for this component */
10
12
  isActive?: boolean;
11
- /** The prompt text to display and copy */
12
- prompt: string;
13
+ /** The text to copy to clipboard */
14
+ textToCopy: string;
13
15
  }
14
16
  export declare const CopyablePrompt: React.FC<CopyablePromptProps>;
15
17
  export {};
@@ -1,11 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
3
  * Copyable Prompt Component
4
4
  *
5
- * Displays a bordered prompt with keyboard shortcut to copy to clipboard.
5
+ * Renders a customizable button that copies text to clipboard on ctrl+y.
6
6
  * Shows visual feedback when copied.
7
7
  */
8
- import { Box, Text, useInput } from 'ink';
8
+ import { Text, useInput } from 'ink';
9
9
  import { execSync } from 'node:child_process';
10
10
  import { platform } from 'node:os';
11
11
  import { useCallback, useEffect, useState } from 'react';
@@ -37,10 +37,9 @@ function copyToClipboard(text) {
37
37
  return false;
38
38
  }
39
39
  }
40
- export const CopyablePrompt = ({ isActive = true, prompt }) => {
40
+ export const CopyablePrompt = ({ buttonLabel = 'Press ctrl+y to copy', isActive = true, textToCopy, }) => {
41
41
  const { theme: { colors }, } = useTheme();
42
42
  const [copied, setCopied] = useState(false);
43
- // Reset copied state after 2 seconds
44
43
  useEffect(() => {
45
44
  if (copied) {
46
45
  const timer = setTimeout(() => {
@@ -50,16 +49,16 @@ export const CopyablePrompt = ({ isActive = true, prompt }) => {
50
49
  }
51
50
  }, [copied]);
52
51
  const handleCopy = useCallback(() => {
53
- const success = copyToClipboard(prompt);
52
+ const success = copyToClipboard(textToCopy);
54
53
  if (success) {
55
54
  setCopied(true);
56
55
  }
57
- }, [prompt]);
56
+ }, [textToCopy]);
58
57
  useInput((input, key) => {
59
58
  // ctrl+y to copy
60
59
  if (key.ctrl && input === 'y') {
61
60
  handleCopy();
62
61
  }
63
62
  }, { isActive });
64
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { borderColor: colors.border, borderStyle: "round", paddingX: 1, children: _jsx(Text, { children: prompt }) }), _jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: colors.dimText, children: ["Press", ' ', _jsx(Text, { backgroundColor: colors.primary, color: "black", children: ' ctrl+y ' }), ' ', "to copy"] }), copied && _jsx(Text, { color: colors.secondary, children: " Copied!" })] })] }));
63
+ return (_jsx(Text, { color: copied ? colors.primary : colors.dimText, children: copied ? "Copied!" : buttonLabel }));
65
64
  };