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
@@ -3,7 +3,13 @@
3
3
  *
4
4
  * Handles truncation and file saving for large tool outputs.
5
5
  * Prevents context overflow by truncating outputs while preserving critical information.
6
+ *
7
+ * Enhanced with:
8
+ * - Attachment extraction from structured/MCP-style outputs
9
+ * - Title extraction for display
10
+ * - Support for image and file attachments
6
11
  */
12
+ import type { AttachmentPart } from '../../../core/interfaces/cipher/message-types.js';
7
13
  /**
8
14
  * Configuration for output truncation behavior
9
15
  */
@@ -33,6 +39,10 @@ export interface TruncationConfig {
33
39
  * Result of output processing
34
40
  */
35
41
  export interface ProcessedOutput {
42
+ /**
43
+ * Attachments extracted from tool output (images, files)
44
+ */
45
+ attachments?: AttachmentPart[];
36
46
  /**
37
47
  * Processed content (truncated if necessary)
38
48
  */
@@ -54,6 +64,10 @@ export interface ProcessedOutput {
54
64
  */
55
65
  truncated?: boolean;
56
66
  };
67
+ /**
68
+ * Human-readable title for display
69
+ */
70
+ title?: string;
57
71
  }
58
72
  /**
59
73
  * Default truncation configuration
@@ -83,6 +97,43 @@ export declare class ToolOutputProcessor {
83
97
  * @returns Processed output with metadata
84
98
  */
85
99
  processOutput(toolName: string, output: unknown): Promise<ProcessedOutput>;
100
+ /**
101
+ * Process structured tool output that may contain attachments.
102
+ *
103
+ * Handles:
104
+ * - MCP-style responses with content array (text + image items)
105
+ * - Structured outputs with explicit attachments array
106
+ * - Title extraction for display
107
+ *
108
+ * @param toolName - Name of the tool that produced the output
109
+ * @param output - Raw tool output (structured or plain)
110
+ * @returns Processed output with attachments and title
111
+ */
112
+ processStructuredOutput(toolName: string, output: unknown): Promise<ProcessedOutput>;
113
+ /**
114
+ * Extract attachments from structured output.
115
+ */
116
+ private extractAttachments;
117
+ /**
118
+ * Extract attachments from MCP-style content array.
119
+ */
120
+ private extractMcpAttachments;
121
+ /**
122
+ * Extract text content from MCP-style content array.
123
+ */
124
+ private extractMcpTextContent;
125
+ /**
126
+ * Extract text content from structured output.
127
+ */
128
+ private extractTextContent;
129
+ /**
130
+ * Check if output is an MCP-style content array.
131
+ */
132
+ private isMcpContentArray;
133
+ /**
134
+ * Check if output is a structured output with potential attachments.
135
+ */
136
+ private isStructuredOutput;
86
137
  /**
87
138
  * Save content to a temporary file
88
139
  *
@@ -3,6 +3,11 @@
3
3
  *
4
4
  * Handles truncation and file saving for large tool outputs.
5
5
  * Prevents context overflow by truncating outputs while preserving critical information.
6
+ *
7
+ * Enhanced with:
8
+ * - Attachment extraction from structured/MCP-style outputs
9
+ * - Title extraction for display
10
+ * - Support for image and file attachments
6
11
  */
7
12
  import { existsSync, promises as fsPromises, mkdirSync } from 'node:fs';
8
13
  import { tmpdir } from 'node:os';
@@ -32,6 +37,7 @@ export class ToolOutputProcessor {
32
37
  ...config,
33
38
  };
34
39
  }
40
+ // ==================== PUBLIC METHODS ====================
35
41
  /**
36
42
  * Process tool output with truncation and file saving
37
43
  *
@@ -67,6 +73,139 @@ export class ToolOutputProcessor {
67
73
  },
68
74
  };
69
75
  }
76
+ /**
77
+ * Process structured tool output that may contain attachments.
78
+ *
79
+ * Handles:
80
+ * - MCP-style responses with content array (text + image items)
81
+ * - Structured outputs with explicit attachments array
82
+ * - Title extraction for display
83
+ *
84
+ * @param toolName - Name of the tool that produced the output
85
+ * @param output - Raw tool output (structured or plain)
86
+ * @returns Processed output with attachments and title
87
+ */
88
+ async processStructuredOutput(toolName, output) {
89
+ // Try to detect structured output
90
+ if (this.isStructuredOutput(output)) {
91
+ const structured = output;
92
+ const attachments = this.extractAttachments(structured);
93
+ const textContent = this.extractTextContent(structured);
94
+ // Process the text content with truncation
95
+ const processed = await this.processOutput(toolName, textContent);
96
+ return {
97
+ ...processed,
98
+ attachments: attachments.length > 0 ? attachments : undefined,
99
+ title: structured.title,
100
+ };
101
+ }
102
+ // Try to detect MCP-style content array
103
+ if (this.isMcpContentArray(output)) {
104
+ const contentArray = output;
105
+ const attachments = this.extractMcpAttachments(contentArray);
106
+ const textContent = this.extractMcpTextContent(contentArray);
107
+ // Process the text content with truncation
108
+ const processed = await this.processOutput(toolName, textContent);
109
+ return {
110
+ ...processed,
111
+ attachments: attachments.length > 0 ? attachments : undefined,
112
+ };
113
+ }
114
+ // Fall back to regular processing
115
+ return this.processOutput(toolName, output);
116
+ }
117
+ // ==================== PRIVATE METHODS (alphabetical order) ====================
118
+ /**
119
+ * Extract attachments from structured output.
120
+ */
121
+ extractAttachments(structured) {
122
+ const attachments = [];
123
+ // Extract from explicit attachments array
124
+ if (structured.attachments) {
125
+ for (const att of structured.attachments) {
126
+ attachments.push({
127
+ data: att.data,
128
+ filename: att.filename,
129
+ mime: att.mimeType,
130
+ type: att.type,
131
+ });
132
+ }
133
+ }
134
+ // Extract images from MCP-style content array
135
+ if (Array.isArray(structured.content)) {
136
+ for (const item of structured.content) {
137
+ if (item.type === 'image' && item.data && item.mimeType) {
138
+ attachments.push({
139
+ data: `data:${item.mimeType};base64,${item.data}`,
140
+ mime: item.mimeType,
141
+ type: 'image',
142
+ });
143
+ }
144
+ }
145
+ }
146
+ return attachments;
147
+ }
148
+ /**
149
+ * Extract attachments from MCP-style content array.
150
+ */
151
+ extractMcpAttachments(content) {
152
+ const attachments = [];
153
+ for (const item of content) {
154
+ if (item.type === 'image' && item.data && item.mimeType) {
155
+ attachments.push({
156
+ data: `data:${item.mimeType};base64,${item.data}`,
157
+ mime: item.mimeType,
158
+ type: 'image',
159
+ });
160
+ }
161
+ }
162
+ return attachments;
163
+ }
164
+ /**
165
+ * Extract text content from MCP-style content array.
166
+ */
167
+ extractMcpTextContent(content) {
168
+ return content
169
+ .filter((item) => item.type === 'text' && item.text)
170
+ .map((item) => item.text)
171
+ .join('\n');
172
+ }
173
+ /**
174
+ * Extract text content from structured output.
175
+ */
176
+ extractTextContent(structured) {
177
+ if (typeof structured.content === 'string') {
178
+ return structured.content;
179
+ }
180
+ if (Array.isArray(structured.content)) {
181
+ return structured.content
182
+ .filter((item) => item.type === 'text' && item.text)
183
+ .map((item) => item.text)
184
+ .join('\n');
185
+ }
186
+ return '';
187
+ }
188
+ /**
189
+ * Check if output is an MCP-style content array.
190
+ */
191
+ isMcpContentArray(output) {
192
+ if (!Array.isArray(output)) {
193
+ return false;
194
+ }
195
+ // Check if all items have a type field
196
+ return output.every((item) => typeof item === 'object' && item !== null && 'type' in item && (item.type === 'text' || item.type === 'image'));
197
+ }
198
+ /**
199
+ * Check if output is a structured output with potential attachments.
200
+ */
201
+ isStructuredOutput(output) {
202
+ if (typeof output !== 'object' || output === null) {
203
+ return false;
204
+ }
205
+ const obj = output;
206
+ // Must have at least one of: content, attachments, or title
207
+ return 'content' in obj || 'attachments' in obj || 'title' in obj;
208
+ }
70
209
  /**
71
210
  * Save content to a temporary file
72
211
  *
@@ -13,6 +13,29 @@ export declare class CommandValidator {
13
13
  * @param config - Process configuration for security settings
14
14
  */
15
15
  constructor(config: Pick<ProcessConfig, 'allowedCommands' | 'blockedCommands' | 'securityLevel'>);
16
+ /**
17
+ * Extract file path arguments from a command.
18
+ *
19
+ * Identifies commands that operate on file paths and extracts
20
+ * the path arguments for validation. Filters out flags (arguments
21
+ * starting with -) and special arguments like chmod modes.
22
+ *
23
+ * @param command - Command string to parse
24
+ * @returns Array of path arguments (normalized for the current platform)
25
+ *
26
+ * @example
27
+ * extractPathArguments('rm -rf /home/user/file.txt')
28
+ * // Returns ['/home/user/file.txt']
29
+ *
30
+ * @example
31
+ * extractPathArguments('cp src/file.txt dest/file.txt')
32
+ * // Returns ['src/file.txt', 'dest/file.txt']
33
+ *
34
+ * @example
35
+ * extractPathArguments('chmod 755 script.sh')
36
+ * // Returns ['script.sh'] (755 is filtered as chmod mode)
37
+ */
38
+ extractPathArguments(command: string): string[];
16
39
  /**
17
40
  * Get the list of allowed commands.
18
41
  *
@@ -1,7 +1,29 @@
1
+ import { normalizePath } from './path-utils.js';
1
2
  /**
2
3
  * Maximum allowed command length (characters).
3
4
  */
4
5
  const MAX_COMMAND_LENGTH = 10_000;
6
+ /**
7
+ * Commands that operate on file paths and need path validation.
8
+ * These commands take file/directory paths as arguments.
9
+ */
10
+ const PATH_SENSITIVE_COMMANDS = new Set([
11
+ 'cat',
12
+ 'cd',
13
+ 'chmod',
14
+ 'chown',
15
+ 'cp',
16
+ 'head',
17
+ 'less',
18
+ 'ln',
19
+ 'mkdir',
20
+ 'more',
21
+ 'mv',
22
+ 'rm',
23
+ 'rmdir',
24
+ 'tail',
25
+ 'touch',
26
+ ]);
5
27
  /**
6
28
  * Dangerous patterns that should always be blocked or require approval.
7
29
  *
@@ -132,6 +154,59 @@ export class CommandValidator {
132
154
  constructor(config) {
133
155
  this.config = config;
134
156
  }
157
+ /**
158
+ * Extract file path arguments from a command.
159
+ *
160
+ * Identifies commands that operate on file paths and extracts
161
+ * the path arguments for validation. Filters out flags (arguments
162
+ * starting with -) and special arguments like chmod modes.
163
+ *
164
+ * @param command - Command string to parse
165
+ * @returns Array of path arguments (normalized for the current platform)
166
+ *
167
+ * @example
168
+ * extractPathArguments('rm -rf /home/user/file.txt')
169
+ * // Returns ['/home/user/file.txt']
170
+ *
171
+ * @example
172
+ * extractPathArguments('cp src/file.txt dest/file.txt')
173
+ * // Returns ['src/file.txt', 'dest/file.txt']
174
+ *
175
+ * @example
176
+ * extractPathArguments('chmod 755 script.sh')
177
+ * // Returns ['script.sh'] (755 is filtered as chmod mode)
178
+ */
179
+ extractPathArguments(command) {
180
+ const trimmed = command.trim();
181
+ const parts = trimmed.split(/\s+/);
182
+ const commandName = parts[0];
183
+ // Only extract paths from path-sensitive commands
184
+ if (!PATH_SENSITIVE_COMMANDS.has(commandName)) {
185
+ return [];
186
+ }
187
+ return parts.slice(1).filter((arg) => {
188
+ // Skip flags (arguments starting with -)
189
+ if (arg.startsWith('-')) {
190
+ return false;
191
+ }
192
+ // Skip chmod numeric modes (e.g., 755, 0644) and symbolic modes (e.g., +x, u+rwx)
193
+ if (commandName === 'chmod') {
194
+ // Numeric mode: 3-4 octal digits
195
+ if (/^[0-7]{3,4}$/.test(arg)) {
196
+ return false;
197
+ }
198
+ // Symbolic mode: starts with +, -, or contains = with permission letters
199
+ if (/^[ugoa]*[+-=][rwxXstugo]+$/.test(arg)) {
200
+ return false;
201
+ }
202
+ }
203
+ // Skip chown user:group specifiers (contains : but not a path separator pattern)
204
+ if (commandName === 'chown' && /^[^/]+:[^/]*$/.test(arg) && !arg.includes('/')) {
205
+ return false;
206
+ }
207
+ return true;
208
+ }).map((path) => normalizePath(path));
209
+ }
135
210
  /**
136
211
  * Get the list of allowed commands.
137
212
  *
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Path utilities for cross-platform compatibility.
3
+ *
4
+ * Provides functions for normalizing paths across different environments,
5
+ * particularly handling Git Bash and MSYS/Cygwin Unix-style paths on Windows.
6
+ */
7
+ /**
8
+ * Normalize paths for cross-platform compatibility.
9
+ * Handles Git Bash Unix-style paths on Windows (e.g., /c/Users/... -> C:\Users\...)
10
+ *
11
+ * @param inputPath - Path to normalize
12
+ * @returns Normalized path for the current platform
13
+ *
14
+ * @example
15
+ * // On Windows with Git Bash path
16
+ * normalizePath('/c/Users/name') // Returns 'C:\\Users\\name'
17
+ *
18
+ * @example
19
+ * // On Unix, returns unchanged
20
+ * normalizePath('/home/user') // Returns '/home/user'
21
+ */
22
+ export declare function normalizePath(inputPath: string): string;
23
+ /**
24
+ * Check if a path is a Windows absolute path.
25
+ *
26
+ * @param inputPath - Path to check
27
+ * @returns True if the path is a Windows absolute path (e.g., C:\ or C:/)
28
+ *
29
+ * @example
30
+ * isWindowsAbsolute('C:\\Users') // Returns true
31
+ * isWindowsAbsolute('C:/Users') // Returns true
32
+ * isWindowsAbsolute('/home/user') // Returns false
33
+ */
34
+ export declare function isWindowsAbsolute(inputPath: string): boolean;
35
+ /**
36
+ * Normalize path for comparison (lowercase drive letter on Windows, forward slashes on all platforms).
37
+ * Useful when comparing paths that may have different separator styles.
38
+ *
39
+ * Always converts backslashes to forward slashes regardless of platform,
40
+ * since paths from external sources (APIs, configs) may contain Windows-style
41
+ * separators even when running on Unix.
42
+ *
43
+ * @param inputPath - Path to normalize for comparison
44
+ * @returns Normalized path with forward slashes (and lowercase drive on Windows)
45
+ *
46
+ * @example
47
+ * // On Windows
48
+ * normalizeForComparison('C:\\Users\\Name') // Returns 'c:/Users/Name'
49
+ *
50
+ * @example
51
+ * // On Unix (also converts backslashes)
52
+ * normalizeForComparison('auth\\jwt\\context.md') // Returns 'auth/jwt/context.md'
53
+ */
54
+ export declare function normalizeForComparison(inputPath: string): string;
55
+ /**
56
+ * Check if a path appears to be a Git Bash or MSYS/Cygwin Unix-style path on Windows.
57
+ *
58
+ * @param inputPath - Path to check
59
+ * @returns True if the path looks like a Unix-style path that needs normalization on Windows
60
+ *
61
+ * @example
62
+ * isUnixStyleWindowsPath('/c/Users') // Returns true
63
+ * isUnixStyleWindowsPath('/cygdrive/c/Users') // Returns true
64
+ * isUnixStyleWindowsPath('/home/user') // Returns false (no drive letter pattern)
65
+ */
66
+ export declare function isUnixStyleWindowsPath(inputPath: string): boolean;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Path utilities for cross-platform compatibility.
3
+ *
4
+ * Provides functions for normalizing paths across different environments,
5
+ * particularly handling Git Bash and MSYS/Cygwin Unix-style paths on Windows.
6
+ */
7
+ /**
8
+ * Normalize paths for cross-platform compatibility.
9
+ * Handles Git Bash Unix-style paths on Windows (e.g., /c/Users/... -> C:\Users\...)
10
+ *
11
+ * @param inputPath - Path to normalize
12
+ * @returns Normalized path for the current platform
13
+ *
14
+ * @example
15
+ * // On Windows with Git Bash path
16
+ * normalizePath('/c/Users/name') // Returns 'C:\\Users\\name'
17
+ *
18
+ * @example
19
+ * // On Unix, returns unchanged
20
+ * normalizePath('/home/user') // Returns '/home/user'
21
+ */
22
+ export function normalizePath(inputPath) {
23
+ if (process.platform !== 'win32') {
24
+ return inputPath;
25
+ }
26
+ // Git Bash on Windows returns Unix-style paths like /c/Users/...
27
+ if (/^\/[a-z]\//i.test(inputPath)) {
28
+ return inputPath
29
+ .replace(/^\/([a-z])\//i, (_, drive) => `${drive.toUpperCase()}:\\`)
30
+ .replaceAll('/', '\\');
31
+ }
32
+ // MSYS/Cygwin style: /cygdrive/c/...
33
+ if (/^\/cygdrive\/[a-z]\//i.test(inputPath)) {
34
+ return inputPath
35
+ .replace(/^\/cygdrive\/([a-z])\//i, (_, drive) => `${drive.toUpperCase()}:\\`)
36
+ .replaceAll('/', '\\');
37
+ }
38
+ return inputPath;
39
+ }
40
+ /**
41
+ * Check if a path is a Windows absolute path.
42
+ *
43
+ * @param inputPath - Path to check
44
+ * @returns True if the path is a Windows absolute path (e.g., C:\ or C:/)
45
+ *
46
+ * @example
47
+ * isWindowsAbsolute('C:\\Users') // Returns true
48
+ * isWindowsAbsolute('C:/Users') // Returns true
49
+ * isWindowsAbsolute('/home/user') // Returns false
50
+ */
51
+ export function isWindowsAbsolute(inputPath) {
52
+ return /^[a-z]:\\/i.test(inputPath) || /^[a-z]:\//i.test(inputPath);
53
+ }
54
+ /**
55
+ * Normalize path for comparison (lowercase drive letter on Windows, forward slashes on all platforms).
56
+ * Useful when comparing paths that may have different separator styles.
57
+ *
58
+ * Always converts backslashes to forward slashes regardless of platform,
59
+ * since paths from external sources (APIs, configs) may contain Windows-style
60
+ * separators even when running on Unix.
61
+ *
62
+ * @param inputPath - Path to normalize for comparison
63
+ * @returns Normalized path with forward slashes (and lowercase drive on Windows)
64
+ *
65
+ * @example
66
+ * // On Windows
67
+ * normalizeForComparison('C:\\Users\\Name') // Returns 'c:/Users/Name'
68
+ *
69
+ * @example
70
+ * // On Unix (also converts backslashes)
71
+ * normalizeForComparison('auth\\jwt\\context.md') // Returns 'auth/jwt/context.md'
72
+ */
73
+ export function normalizeForComparison(inputPath) {
74
+ let result = inputPath.replaceAll('\\', '/');
75
+ // Lowercase drive letter on Windows only
76
+ if (process.platform === 'win32') {
77
+ result = result.replace(/^([A-Z]):/, (_, drive) => `${drive.toLowerCase()}:`);
78
+ }
79
+ return result;
80
+ }
81
+ /**
82
+ * Check if a path appears to be a Git Bash or MSYS/Cygwin Unix-style path on Windows.
83
+ *
84
+ * @param inputPath - Path to check
85
+ * @returns True if the path looks like a Unix-style path that needs normalization on Windows
86
+ *
87
+ * @example
88
+ * isUnixStyleWindowsPath('/c/Users') // Returns true
89
+ * isUnixStyleWindowsPath('/cygdrive/c/Users') // Returns true
90
+ * isUnixStyleWindowsPath('/home/user') // Returns false (no drive letter pattern)
91
+ */
92
+ export function isUnixStyleWindowsPath(inputPath) {
93
+ return /^\/[a-z]\//i.test(inputPath) || /^\/cygdrive\/[a-z]\//i.test(inputPath);
94
+ }
@@ -52,6 +52,8 @@ export declare class ProcessService implements IProcessService {
52
52
  /**
53
53
  * Terminate a background process.
54
54
  *
55
+ * Uses process tree killing to ensure all child processes are terminated.
56
+ *
55
57
  * @param processId - Unique process identifier
56
58
  */
57
59
  killProcess(processId: string): Promise<void>;
@@ -82,6 +84,18 @@ export declare class ProcessService implements IProcessService {
82
84
  * @returns Process handle with processId
83
85
  */
84
86
  private executeInBackground;
87
+ /**
88
+ * Kill a process and all its children (process tree).
89
+ *
90
+ * On Unix, uses process groups (-pid) to kill all descendants.
91
+ * On Windows, uses taskkill with /t flag for tree kill.
92
+ * Falls back to direct kill if process group kill fails.
93
+ *
94
+ * @param child - Child process to kill
95
+ * @param pid - Process ID (optional, extracted from child if not provided)
96
+ * @returns Promise that resolves when kill attempt completes
97
+ */
98
+ private killProcessTree;
85
99
  /**
86
100
  * Resolve and validate working directory.
87
101
  *
@@ -92,4 +106,22 @@ export declare class ProcessService implements IProcessService {
92
106
  * @returns Safe absolute working directory
93
107
  */
94
108
  private resolveSafeCwd;
109
+ /**
110
+ * Sleep for specified milliseconds.
111
+ *
112
+ * @param ms - Milliseconds to sleep
113
+ * @returns Promise that resolves after the delay
114
+ */
115
+ private sleep;
116
+ /**
117
+ * Validate file path arguments in a command.
118
+ *
119
+ * Extracts path arguments from path-sensitive commands and validates
120
+ * that they are within the configured base directory.
121
+ *
122
+ * @param command - Command string to validate
123
+ * @param baseDir - Base directory for confinement
124
+ * @throws ProcessError if any path argument is outside the base directory
125
+ */
126
+ private validatePathArguments;
95
127
  }