byterover-cli 0.4.0 → 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 (478) 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/entities/event.d.ts +1 -1
  49. package/dist/core/domain/entities/event.js +3 -1
  50. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  51. package/dist/core/domain/errors/connection-error.js +54 -0
  52. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  53. package/dist/core/domain/errors/core-process-error.js +43 -0
  54. package/dist/core/domain/errors/task-error.d.ts +64 -0
  55. package/dist/core/domain/errors/task-error.js +116 -0
  56. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  57. package/dist/core/domain/errors/transport-error.js +114 -0
  58. package/dist/core/domain/instance/index.d.ts +1 -0
  59. package/dist/core/domain/instance/index.js +1 -0
  60. package/dist/core/domain/instance/types.d.ts +57 -0
  61. package/dist/core/domain/instance/types.js +72 -0
  62. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  63. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  64. package/dist/core/domain/transport/index.d.ts +2 -0
  65. package/dist/core/domain/transport/index.js +2 -0
  66. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  67. package/dist/core/domain/transport/schemas.js +554 -0
  68. package/dist/core/domain/transport/types.d.ts +67 -0
  69. package/dist/core/domain/transport/types.js +7 -0
  70. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  71. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  72. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  73. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  74. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  75. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  76. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  77. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  79. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  80. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  81. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  82. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  83. package/dist/core/interfaces/cipher/index.js +11 -0
  84. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  85. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  86. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  87. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  88. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  89. package/dist/core/interfaces/cipher/message-types.js +6 -0
  90. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  91. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  92. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  93. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  94. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  95. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  96. package/dist/core/interfaces/executor/index.d.ts +2 -0
  97. package/dist/core/interfaces/executor/index.js +2 -0
  98. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  99. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  100. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  101. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  102. package/dist/core/interfaces/instance/index.d.ts +2 -0
  103. package/dist/core/interfaces/instance/index.js +2 -0
  104. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  105. package/dist/core/interfaces/noop-implementations.js +62 -0
  106. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  107. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  108. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  109. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  110. package/dist/core/interfaces/transport/index.d.ts +2 -0
  111. package/dist/core/interfaces/transport/index.js +2 -0
  112. package/dist/hooks/init/welcome.js +9 -24
  113. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  114. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  115. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  116. package/dist/infra/cipher/agent/agent-error.js +79 -0
  117. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  118. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  119. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  120. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  121. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  122. package/dist/infra/cipher/agent/base-agent.js +240 -0
  123. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  124. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  125. package/dist/infra/cipher/agent/index.d.ts +22 -0
  126. package/dist/infra/cipher/agent/index.js +24 -0
  127. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  128. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  129. package/dist/infra/cipher/agent/types.d.ts +35 -0
  130. package/dist/infra/cipher/agent/types.js +1 -0
  131. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  132. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  133. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  134. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  135. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  136. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  137. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  138. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  139. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  140. package/dist/infra/cipher/consumer/index.js +2 -1
  141. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  142. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  143. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  144. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  145. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  146. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  147. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  148. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  149. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  150. package/dist/infra/cipher/interactive-loop.js +41 -33
  151. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  152. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  153. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  154. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  155. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  156. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  157. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  158. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  159. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  160. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  161. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  162. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  163. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  164. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  165. package/dist/infra/cipher/llm/context/utils.js +17 -4
  166. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  167. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  168. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  169. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  170. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  171. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  172. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  173. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  174. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  175. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  176. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  177. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  178. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  179. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  180. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  181. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  182. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  183. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  184. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  185. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  186. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  187. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  188. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  189. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  190. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  191. package/dist/infra/cipher/process/command-validator.js +75 -0
  192. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  193. package/dist/infra/cipher/process/path-utils.js +94 -0
  194. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  195. package/dist/infra/cipher/process/process-service.js +98 -17
  196. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  197. package/dist/infra/cipher/session/chat-session.js +163 -13
  198. package/dist/infra/cipher/session/index.d.ts +1 -0
  199. package/dist/infra/cipher/session/index.js +2 -0
  200. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  201. package/dist/infra/cipher/session/message-queue.js +90 -0
  202. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  203. package/dist/infra/cipher/session/session-manager.js +254 -7
  204. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  205. package/dist/infra/cipher/session/session-status.js +184 -0
  206. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  207. package/dist/infra/cipher/session/title-generator.js +31 -0
  208. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  209. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  210. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  211. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  212. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  213. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  214. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  215. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  216. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  217. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  218. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  219. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  220. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  221. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  222. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  223. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  224. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  225. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  226. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  227. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  228. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  229. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  230. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  231. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  232. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  233. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  234. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  235. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  236. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  237. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  238. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  239. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  240. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  241. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  242. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  243. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  244. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  245. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  246. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  247. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  249. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  250. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  251. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  252. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  253. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  254. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  255. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  256. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  257. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  258. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  259. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  260. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  261. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  262. package/dist/infra/cipher/tools/index.d.ts +1 -1
  263. package/dist/infra/cipher/tools/index.js +1 -1
  264. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  265. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  266. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  267. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  268. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  269. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  270. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  271. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  272. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  273. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  274. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  275. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  276. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  277. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  278. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  279. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  280. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  281. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  282. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  283. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  284. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  285. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  286. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  287. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  288. package/dist/infra/context-tree/path-utils.js +7 -0
  289. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  290. package/dist/infra/core/executors/curate-executor.js +123 -0
  291. package/dist/infra/core/executors/index.d.ts +2 -0
  292. package/dist/infra/core/executors/index.js +2 -0
  293. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  294. package/dist/infra/core/executors/query-executor.js +51 -0
  295. package/dist/infra/core/task-processor.d.ts +81 -0
  296. package/dist/infra/core/task-processor.js +115 -0
  297. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  298. package/dist/infra/instance/file-instance-discovery.js +84 -0
  299. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  300. package/dist/infra/instance/file-instance-manager.js +123 -0
  301. package/dist/infra/instance/index.d.ts +3 -0
  302. package/dist/infra/instance/index.js +3 -0
  303. package/dist/infra/instance/process-utils.d.ts +14 -0
  304. package/dist/infra/instance/process-utils.js +39 -0
  305. package/dist/infra/process/agent-worker.d.ts +20 -0
  306. package/dist/infra/process/agent-worker.js +602 -0
  307. package/dist/infra/process/index.d.ts +12 -0
  308. package/dist/infra/process/index.js +11 -0
  309. package/dist/infra/process/ipc-types.d.ts +55 -0
  310. package/dist/infra/process/ipc-types.js +12 -0
  311. package/dist/infra/process/process-manager.d.ts +154 -0
  312. package/dist/infra/process/process-manager.js +471 -0
  313. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  314. package/dist/infra/process/task-queue-manager.js +226 -0
  315. package/dist/infra/process/transport-handlers.d.ts +124 -0
  316. package/dist/infra/process/transport-handlers.js +348 -0
  317. package/dist/infra/process/transport-worker.d.ts +20 -0
  318. package/dist/infra/process/transport-worker.js +168 -0
  319. package/dist/infra/repl/commands/curate-command.js +0 -5
  320. package/dist/infra/repl/commands/query-command.js +0 -3
  321. package/dist/infra/repl/repl-startup.d.ts +4 -0
  322. package/dist/infra/repl/repl-startup.js +10 -1
  323. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  324. package/dist/infra/repl/transport-client-helper.js +96 -0
  325. package/dist/infra/transport/index.d.ts +4 -0
  326. package/dist/infra/transport/index.js +4 -0
  327. package/dist/infra/transport/port-utils.d.ts +42 -0
  328. package/dist/infra/transport/port-utils.js +84 -0
  329. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  330. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  331. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  332. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  333. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  334. package/dist/infra/transport/transport-client-factory.js +168 -0
  335. package/dist/infra/transport/transport-factory.d.ts +33 -0
  336. package/dist/infra/transport/transport-factory.js +59 -0
  337. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  338. package/dist/infra/usecase/curate-use-case.js +73 -259
  339. package/dist/infra/usecase/init-use-case.js +19 -8
  340. package/dist/infra/usecase/login-use-case.js +9 -3
  341. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  342. package/dist/infra/usecase/query-use-case.js +251 -326
  343. package/dist/infra/usecase/status-use-case.js +1 -1
  344. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  345. package/dist/resources/prompts/explore.yml +78 -0
  346. package/dist/resources/prompts/plan.yml +114 -0
  347. package/dist/resources/prompts/reflection.yml +1 -1
  348. package/dist/resources/prompts/system-prompt.yml +15 -8
  349. package/dist/resources/prompts/tool-outputs.yml +0 -5
  350. package/dist/resources/tools/bash_exec.txt +98 -0
  351. package/dist/resources/tools/bash_output.txt +40 -0
  352. package/dist/resources/tools/batch.txt +28 -0
  353. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  354. package/dist/resources/tools/curate.txt +22 -0
  355. package/dist/resources/tools/delete_memory.txt +1 -0
  356. package/dist/resources/tools/detect_domains.txt +11 -0
  357. package/dist/resources/tools/edit_file.txt +1 -0
  358. package/dist/resources/tools/edit_memory.txt +1 -0
  359. package/dist/resources/tools/glob_files.txt +20 -0
  360. package/dist/resources/tools/grep_content.txt +18 -0
  361. package/dist/resources/tools/kill_process.txt +16 -0
  362. package/dist/resources/tools/list_directory.txt +16 -0
  363. package/dist/resources/tools/list_memories.txt +1 -0
  364. package/dist/resources/tools/read_file.txt +31 -0
  365. package/dist/resources/tools/read_memory.txt +1 -0
  366. package/dist/resources/tools/read_todos.txt +17 -0
  367. package/dist/resources/tools/search_history.txt +1 -0
  368. package/dist/resources/tools/task.txt +23 -0
  369. package/dist/resources/tools/write_file.txt +1 -0
  370. package/dist/resources/tools/write_memory.txt +1 -0
  371. package/dist/resources/tools/write_todos.txt +29 -0
  372. package/dist/tui/app.js +9 -13
  373. package/dist/tui/components/command-details.d.ts +14 -0
  374. package/dist/tui/components/command-details.js +35 -0
  375. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  376. package/dist/tui/components/execution/execution-changes.js +19 -4
  377. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  378. package/dist/tui/components/execution/execution-content.js +26 -13
  379. package/dist/tui/components/execution/execution-input.js +3 -3
  380. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  381. package/dist/tui/components/execution/execution-progress.js +8 -6
  382. package/dist/tui/components/execution/log-item.d.ts +3 -4
  383. package/dist/tui/components/execution/log-item.js +2 -5
  384. package/dist/tui/components/footer.js +9 -4
  385. package/dist/tui/components/header.d.ts +3 -3
  386. package/dist/tui/components/header.js +5 -3
  387. package/dist/tui/components/index.d.ts +1 -0
  388. package/dist/tui/components/index.js +1 -0
  389. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  390. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  391. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  392. package/dist/tui/components/scrollable-list.js +12 -10
  393. package/dist/tui/components/suggestions.js +39 -41
  394. package/dist/tui/components/tab-bar.d.ts +2 -1
  395. package/dist/tui/components/tab-bar.js +3 -4
  396. package/dist/tui/constants.d.ts +0 -5
  397. package/dist/tui/constants.js +0 -5
  398. package/dist/tui/contexts/auth-context.js +9 -2
  399. package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
  400. package/dist/tui/contexts/index.d.ts +6 -1
  401. package/dist/tui/contexts/index.js +6 -1
  402. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  403. package/dist/tui/contexts/onboarding-context.js +9 -9
  404. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  405. package/dist/tui/contexts/tasks-context.js +218 -0
  406. package/dist/tui/contexts/transport-context.d.ts +29 -0
  407. package/dist/tui/contexts/transport-context.js +82 -0
  408. package/dist/tui/hooks/index.d.ts +10 -6
  409. package/dist/tui/hooks/index.js +7 -6
  410. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  411. package/dist/tui/hooks/use-activity-logs.js +87 -34
  412. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  413. package/dist/tui/hooks/use-auth-polling.js +104 -0
  414. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  415. package/dist/tui/hooks/use-slash-completion.js +1 -1
  416. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  417. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  418. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  419. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  420. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  421. package/dist/tui/hooks/use-ui-heights.js +88 -0
  422. package/dist/tui/providers/app-providers.js +2 -6
  423. package/dist/tui/types/commands.d.ts +0 -26
  424. package/dist/tui/types/index.d.ts +1 -1
  425. package/dist/tui/types/ui.d.ts +9 -4
  426. package/dist/tui/utils/line.d.ts +11 -0
  427. package/dist/tui/utils/line.js +16 -0
  428. package/dist/tui/utils/log.d.ts +27 -0
  429. package/dist/tui/utils/log.js +114 -0
  430. package/dist/tui/views/command-view.d.ts +7 -0
  431. package/dist/tui/views/command-view.js +103 -80
  432. package/dist/tui/views/login-view.js +7 -4
  433. package/dist/tui/views/logs-view.d.ts +13 -0
  434. package/dist/tui/views/logs-view.js +27 -52
  435. package/dist/utils/connection-error-handler.d.ts +16 -0
  436. package/dist/utils/connection-error-handler.js +49 -0
  437. package/dist/utils/crash-log.d.ts +14 -0
  438. package/dist/utils/crash-log.js +19 -0
  439. package/dist/utils/file-helpers.d.ts +14 -0
  440. package/dist/utils/file-helpers.js +21 -0
  441. package/dist/utils/global-logs-path.d.ts +11 -0
  442. package/dist/utils/global-logs-path.js +37 -0
  443. package/dist/utils/process-logger.d.ts +53 -0
  444. package/dist/utils/process-logger.js +253 -0
  445. package/dist/utils/sandbox-detector.d.ts +31 -0
  446. package/dist/utils/sandbox-detector.js +122 -0
  447. package/oclif.manifest.json +10 -198
  448. package/package.json +5 -1
  449. package/dist/commands/cipher-agent/run.d.ts +0 -142
  450. package/dist/commands/cipher-agent/run.js +0 -555
  451. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  452. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  453. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  454. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  455. package/dist/commands/foo.d.ts +0 -14
  456. package/dist/commands/foo.js +0 -66
  457. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  458. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  459. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  460. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  461. package/dist/infra/cipher/cipher-agent.js +0 -317
  462. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  463. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  464. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  465. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  466. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  467. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  468. package/dist/tui/contexts/consumer.d.ts +0 -31
  469. package/dist/tui/contexts/consumer.js +0 -56
  470. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  471. package/dist/tui/hooks/use-consumer.js +0 -50
  472. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  473. package/dist/tui/hooks/use-queue-polling.js +0 -90
  474. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  475. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  476. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  477. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  478. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import { getAgentRegistry } from '../../../core/domain/cipher/agent/agent-registry.js';
1
2
  import { ToolError, ToolErrorType, ToolErrorUtils } from '../../../core/domain/cipher/tools/tool-error.js';
2
3
  /**
3
4
  * Tool Manager for CipherAgent
@@ -7,6 +8,7 @@ import { ToolError, ToolErrorType, ToolErrorUtils } from '../../../core/domain/c
7
8
  *
8
9
  * Features:
9
10
  * - Optional scheduler integration for policy-based execution
11
+ * - Optional plugin system for before/after execution hooks
10
12
  * - Tool caching for performance
11
13
  * - Structured error handling with classification
12
14
  *
@@ -14,6 +16,11 @@ import { ToolError, ToolErrorType, ToolErrorUtils } from '../../../core/domain/c
14
16
  * 1. Policy check (ALLOW/DENY)
15
17
  * 2. Execution (if allowed)
16
18
  *
19
+ * When a plugin manager is provided, execution flows through:
20
+ * 1. Before hooks (can modify args or block execution)
21
+ * 2. Tool execution
22
+ * 3. After hooks (for logging, auditing, etc.)
23
+ *
17
24
  * Without a scheduler, tools execute directly via the provider.
18
25
  */
19
26
  export class ToolManager {
@@ -22,7 +29,6 @@ export class ToolManager {
22
29
  */
23
30
  static CURATE_TOOL_NAMES = [
24
31
  'detect_domains',
25
- 'find_knowledge_topics',
26
32
  'read_file',
27
33
  'grep_content',
28
34
  'glob_files',
@@ -32,12 +38,14 @@ export class ToolManager {
32
38
  * Read-only tools allowed for query operations
33
39
  */
34
40
  static QUERY_TOOL_NAMES = [
35
- 'find_knowledge_topics',
36
41
  'read_file',
37
42
  'grep_content',
38
43
  'glob_files',
44
+ 'task',
39
45
  ];
40
46
  cacheValid = false;
47
+ callIdCounter = 0;
48
+ pluginManager;
41
49
  scheduler;
42
50
  toolProvider;
43
51
  toolsCache = {};
@@ -46,10 +54,12 @@ export class ToolManager {
46
54
  *
47
55
  * @param toolProvider - Tool provider instance
48
56
  * @param scheduler - Optional tool scheduler for policy-based execution
57
+ * @param pluginManager - Optional plugin manager for before/after hooks
49
58
  */
50
- constructor(toolProvider, scheduler) {
59
+ constructor(toolProvider, scheduler, pluginManager) {
51
60
  this.toolProvider = toolProvider;
52
61
  this.scheduler = scheduler;
62
+ this.pluginManager = pluginManager;
53
63
  }
54
64
  /**
55
65
  * Execute a tool by name with structured error handling.
@@ -58,7 +68,12 @@ export class ToolManager {
58
68
  * error classification, and metadata. This enables better error handling
59
69
  * and provides actionable feedback to the LLM.
60
70
  *
61
- * When a scheduler is configured, execution flows through:
71
+ * When a plugin manager is configured, execution flows through:
72
+ * 1. Before hooks (can modify args or block execution)
73
+ * 2. Tool execution (via scheduler or provider)
74
+ * 3. After hooks (for logging, auditing, etc.)
75
+ *
76
+ * When a scheduler is configured, tool execution flows through:
62
77
  * 1. Policy check (ALLOW/DENY)
63
78
  * 2. Execution (if allowed)
64
79
  *
@@ -67,29 +82,65 @@ export class ToolManager {
67
82
  * @param toolName - Name of the tool to execute
68
83
  * @param args - Tool arguments (validated by provider)
69
84
  * @param sessionId - Optional session ID for context
85
+ * @param context - Optional execution context (includes metadata callback for streaming)
70
86
  * @returns Structured tool execution result
71
87
  */
72
- async executeTool(toolName, args, sessionId) {
88
+ async executeTool(toolName, args, sessionId, context) {
73
89
  const startTime = Date.now();
90
+ const callId = this.generateCallId();
91
+ const hookContext = {
92
+ callId,
93
+ sessionId: sessionId ?? 'default',
94
+ toolName,
95
+ };
96
+ // Merge sessionId into context if not already present
97
+ const effectiveContext = {
98
+ ...context,
99
+ sessionId: context?.sessionId ?? sessionId,
100
+ };
74
101
  try {
75
102
  // Check if tool exists before execution
76
103
  if (!this.hasTool(toolName)) {
77
104
  throw new ToolError(`Tool '${toolName}' not found`, ToolErrorType.TOOL_NOT_FOUND, toolName, { context: { availableTools: this.getToolNames() } });
78
105
  }
106
+ // Run before hooks (can modify args or block execution)
107
+ let effectiveArgs = args;
108
+ if (this.pluginManager) {
109
+ const beforeResult = await this.pluginManager.triggerBefore(hookContext, args);
110
+ if (!beforeResult.proceed) {
111
+ const errorResult = ToolErrorUtils.createErrorResult(new ToolError(beforeResult.reason ?? 'Execution blocked by plugin', ToolErrorType.PERMISSION_DENIED, toolName), { durationMs: Date.now() - startTime });
112
+ await this.pluginManager.triggerAfter(hookContext, args, errorResult);
113
+ return errorResult;
114
+ }
115
+ effectiveArgs = beforeResult.args;
116
+ }
79
117
  // Execute tool via scheduler (with policy check) or directly via provider
80
118
  const result = this.scheduler
81
- ? await this.scheduler.execute(toolName, args, { sessionId: sessionId ?? 'default' })
82
- : await this.toolProvider.executeTool(toolName, args, sessionId);
119
+ ? await this.scheduler.execute(toolName, effectiveArgs, {
120
+ sessionId: sessionId ?? 'default',
121
+ taskId: effectiveContext.taskId,
122
+ })
123
+ : await this.toolProvider.executeTool(toolName, effectiveArgs, sessionId, effectiveContext);
83
124
  const durationMs = Date.now() - startTime;
84
- // Return success result
85
- return ToolErrorUtils.createSuccess(result, { durationMs });
125
+ // Create success result
126
+ const successResult = ToolErrorUtils.createSuccess(result, { durationMs });
127
+ // Run after hooks
128
+ if (this.pluginManager) {
129
+ await this.pluginManager.triggerAfter(hookContext, effectiveArgs, successResult);
130
+ }
131
+ return successResult;
86
132
  }
87
133
  catch (error) {
88
134
  const durationMs = Date.now() - startTime;
89
135
  // Classify error
90
136
  const toolError = ToolErrorUtils.classify(error, toolName);
91
- // Return error result
92
- return ToolErrorUtils.createErrorResult(toolError, { durationMs });
137
+ // Create error result
138
+ const errorResult = ToolErrorUtils.createErrorResult(toolError, { durationMs });
139
+ // Run after hooks even on error
140
+ if (this.pluginManager) {
141
+ await this.pluginManager.triggerAfter(hookContext, args, errorResult);
142
+ }
143
+ return errorResult;
93
144
  }
94
145
  }
95
146
  /**
@@ -162,6 +213,44 @@ export class ToolManager {
162
213
  getToolsByMarker(marker) {
163
214
  return this.toolProvider.getToolsByMarker(marker);
164
215
  }
216
+ /**
217
+ * Get filtered tools based on agent configuration.
218
+ * Uses the agent registry to determine which tools are enabled/disabled for the agent.
219
+ *
220
+ * Tool filtering rules from agent.tools config:
221
+ * - `{ '*': false }` - Disable all tools
222
+ * - `{ '*': false, 'tool_name': true }` - Only enable specific tools
223
+ * - `{ 'tool_name': false }` - Disable specific tools, keep others enabled
224
+ * - `{}` or undefined - All tools enabled (default)
225
+ *
226
+ * @param agentName - The agent name (e.g., 'plan', 'query', 'curate')
227
+ * @returns Filtered tool set based on agent configuration
228
+ */
229
+ getToolsForAgent(agentName) {
230
+ const registry = getAgentRegistry();
231
+ const agent = registry.get(agentName);
232
+ if (!agent) {
233
+ // Unknown agent - return all tools
234
+ return this.getAllTools();
235
+ }
236
+ const allTools = this.getAllTools();
237
+ const toolConfig = agent.tools;
238
+ // If no tool config or empty, return all tools
239
+ if (!toolConfig || Object.keys(toolConfig).length === 0) {
240
+ return allTools;
241
+ }
242
+ // Check for wildcard disable
243
+ const wildcardValue = toolConfig['*'];
244
+ const filteredTools = {};
245
+ for (const [toolName, toolDef] of Object.entries(allTools)) {
246
+ // Get specific config for this tool, or use wildcard, or default to true
247
+ const isEnabled = toolConfig[toolName] ?? wildcardValue ?? true;
248
+ if (isEnabled) {
249
+ filteredTools[toolName] = toolDef;
250
+ }
251
+ }
252
+ return filteredTools;
253
+ }
165
254
  /**
166
255
  * Get filtered tools based on command type.
167
256
  * For 'query' command, returns only read-only discovery tools.
@@ -225,6 +314,13 @@ export class ToolManager {
225
314
  refresh() {
226
315
  this.invalidateCache();
227
316
  }
317
+ /**
318
+ * Generates a unique call ID for tool execution.
319
+ */
320
+ generateCallId() {
321
+ this.callIdCounter++;
322
+ return `call_${Date.now()}_${this.callIdCounter}`;
323
+ }
228
324
  /**
229
325
  * Invalidates the tool cache.
230
326
  * Next call to getAllTools() will rebuild the cache.
@@ -0,0 +1,6 @@
1
+ import type { IToolProvider } from '../../../core/interfaces/cipher/i-tool-provider.js';
2
+ /**
3
+ * Lazy getter for ToolProvider to avoid circular dependencies.
4
+ * Used by batch tool to execute other tools at runtime.
5
+ */
6
+ export type ToolProviderGetter = () => IToolProvider;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,7 @@
1
- import type { ToolSet } from '../../../core/domain/cipher/tools/types.js';
1
+ import type { ToolExecutionContext, ToolSet } from '../../../core/domain/cipher/tools/types.js';
2
2
  import type { IToolProvider } from '../../../core/interfaces/cipher/i-tool-provider.js';
3
- import type { SimplePromptFactory } from '../system-prompt/simple-prompt-factory.js';
3
+ import type { SystemPromptManager } from '../system-prompt/system-prompt-manager.js';
4
+ import type { ToolDescriptionLoader } from './tool-description-loader.js';
4
5
  import type { ToolServices } from './tool-registry.js';
5
6
  import { ToolMarker } from './tool-markers.js';
6
7
  /**
@@ -12,18 +13,20 @@ import { ToolMarker } from './tool-markers.js';
12
13
  * 2. Execution phase (via invocation)
13
14
  */
14
15
  export declare class ToolProvider implements IToolProvider {
16
+ private readonly descriptionLoader?;
15
17
  private initialized;
16
18
  private invocationBuilder?;
17
- private readonly promptFactory?;
18
- private readonly services;
19
+ private services;
20
+ private readonly systemPromptManager?;
19
21
  private readonly toolMarkers;
20
22
  private readonly tools;
21
23
  /**
22
24
  * Creates a new tool provider
23
25
  * @param services - Services available to tools
24
- * @param promptFactory - Optional prompt factory for tool output guidance
26
+ * @param systemPromptManager - Optional system prompt manager for tool output guidance
27
+ * @param descriptionLoader - Optional loader for external tool descriptions
25
28
  */
26
- constructor(services: ToolServices, promptFactory?: SimplePromptFactory);
29
+ constructor(services: ToolServices, systemPromptManager?: SystemPromptManager, descriptionLoader?: ToolDescriptionLoader);
27
30
  /**
28
31
  * Execute a tool with the given arguments using builder/invocation pattern.
29
32
  *
@@ -34,12 +37,13 @@ export declare class ToolProvider implements IToolProvider {
34
37
  * @param toolName - Name of the tool to execute
35
38
  * @param args - Tool arguments
36
39
  * @param sessionId - Optional session ID for context
40
+ * @param context - Optional execution context (includes metadata callback for streaming)
37
41
  * @returns Tool execution result
38
42
  * @throws ToolNotFoundError if tool doesn't exist
39
43
  * @throws ToolValidationError if input validation fails
40
44
  * @throws ToolExecutionError if execution fails
41
45
  */
42
- executeTool(toolName: string, args: Record<string, unknown>, sessionId?: string): Promise<unknown>;
46
+ executeTool(toolName: string, args: Record<string, unknown>, sessionId?: string, context?: ToolExecutionContext): Promise<unknown>;
43
47
  /**
44
48
  * Get all registered tools in JSON Schema format.
45
49
  */
@@ -67,11 +71,32 @@ export declare class ToolProvider implements IToolProvider {
67
71
  /**
68
72
  * Initialize the tool provider.
69
73
  * Registers all tools whose required services are available.
74
+ * If a description loader is provided, tool descriptions are loaded from external files.
70
75
  */
71
76
  initialize(): Promise<void>;
77
+ /**
78
+ * Update services and re-register tools that depend on newly available services.
79
+ * This is used to inject services that are created after ToolProvider initialization
80
+ * (e.g., SessionManager which is created after ToolProvider).
81
+ *
82
+ * @param additionalServices - Additional services to add
83
+ */
84
+ updateServices(additionalServices: Partial<ToolServices>): void;
72
85
  /**
73
86
  * Ensures the provider is initialized.
74
87
  * @throws ToolProviderNotInitializedError if not initialized
75
88
  */
76
89
  private ensureInitialized;
90
+ /**
91
+ * Loads description from external file if configured.
92
+ * @param descriptionFile - The description file name (without .txt extension)
93
+ * @returns The loaded description or undefined if not available
94
+ */
95
+ private loadExternalDescription;
96
+ /**
97
+ * Registers a single tool if all required services are available.
98
+ * @param toolName - Name of the tool to register
99
+ * @param entry - Registry entry for the tool
100
+ */
101
+ private registerToolIfAvailable;
77
102
  }
@@ -12,20 +12,23 @@ import { convertZodToJsonSchema } from './utils/schema-converter.js';
12
12
  * 2. Execution phase (via invocation)
13
13
  */
14
14
  export class ToolProvider {
15
+ descriptionLoader;
15
16
  initialized = false;
16
17
  invocationBuilder;
17
- promptFactory;
18
18
  services;
19
+ systemPromptManager;
19
20
  toolMarkers = new Set();
20
21
  tools = new Map();
21
22
  /**
22
23
  * Creates a new tool provider
23
24
  * @param services - Services available to tools
24
- * @param promptFactory - Optional prompt factory for tool output guidance
25
+ * @param systemPromptManager - Optional system prompt manager for tool output guidance
26
+ * @param descriptionLoader - Optional loader for external tool descriptions
25
27
  */
26
- constructor(services, promptFactory) {
28
+ constructor(services, systemPromptManager, descriptionLoader) {
27
29
  this.services = services;
28
- this.promptFactory = promptFactory;
30
+ this.systemPromptManager = systemPromptManager;
31
+ this.descriptionLoader = descriptionLoader;
29
32
  }
30
33
  /**
31
34
  * Execute a tool with the given arguments using builder/invocation pattern.
@@ -37,21 +40,26 @@ export class ToolProvider {
37
40
  * @param toolName - Name of the tool to execute
38
41
  * @param args - Tool arguments
39
42
  * @param sessionId - Optional session ID for context
43
+ * @param context - Optional execution context (includes metadata callback for streaming)
40
44
  * @returns Tool execution result
41
45
  * @throws ToolNotFoundError if tool doesn't exist
42
46
  * @throws ToolValidationError if input validation fails
43
47
  * @throws ToolExecutionError if execution fails
44
48
  */
45
- async executeTool(toolName, args, sessionId) {
49
+ async executeTool(toolName, args, sessionId, context) {
46
50
  this.ensureInitialized();
47
51
  if (!this.invocationBuilder) {
48
52
  throw new ToolProviderNotInitializedError();
49
53
  }
50
54
  try {
51
55
  // Phase 1: Build and validate invocation
52
- const context = { sessionId };
56
+ // Merge sessionId into context for backward compatibility
57
+ const effectiveContext = {
58
+ ...context,
59
+ sessionId: context?.sessionId ?? sessionId,
60
+ };
53
61
  const invocation = this.invocationBuilder.build(`tool_call_${Date.now()}`, // Generate unique ID
54
- toolName, args, context);
62
+ toolName, args, effectiveContext);
55
63
  // Phase 2: Execute validated invocation
56
64
  const executionResult = await invocation.execute();
57
65
  // Handle execution result
@@ -64,8 +72,8 @@ export class ToolProvider {
64
72
  }
65
73
  // Check if this tool has output guidance configured
66
74
  const registryEntry = TOOL_REGISTRY[toolName];
67
- if (registryEntry?.outputGuidance && this.promptFactory) {
68
- const guidance = this.promptFactory.getToolOutputGuidance(registryEntry.outputGuidance);
75
+ if (registryEntry?.outputGuidance && this.systemPromptManager) {
76
+ const guidance = this.systemPromptManager.getToolOutputGuidance(registryEntry.outputGuidance);
69
77
  if (guidance) {
70
78
  // Return structured result with guidance
71
79
  return {
@@ -156,6 +164,7 @@ export class ToolProvider {
156
164
  /**
157
165
  * Initialize the tool provider.
158
166
  * Registers all tools whose required services are available.
167
+ * If a description loader is provided, tool descriptions are loaded from external files.
159
168
  */
160
169
  async initialize() {
161
170
  if (this.initialized) {
@@ -163,27 +172,35 @@ export class ToolProvider {
163
172
  }
164
173
  // Register tools from registry
165
174
  for (const [toolName, entry] of Object.entries(TOOL_REGISTRY)) {
166
- // Check if all required services are available
167
- const allServicesAvailable = entry.requiredServices.every((serviceName) => this.services[serviceName] !== undefined);
168
- if (allServicesAvailable) {
169
- try {
170
- const tool = entry.factory(this.services);
171
- this.tools.set(toolName, tool);
172
- // Collect markers from registered tools
173
- for (const marker of entry.markers) {
174
- this.toolMarkers.add(marker);
175
- }
176
- }
177
- catch (error) {
178
- // Log error but don't fail initialization
179
- console.error(`Failed to register tool ${toolName}:`, error);
180
- }
181
- }
175
+ this.registerToolIfAvailable(toolName, entry);
182
176
  }
183
177
  // Initialize invocation builder with registered tools
184
178
  this.invocationBuilder = new ToolInvocationBuilder(this.tools);
185
179
  this.initialized = true;
186
180
  }
181
+ /**
182
+ * Update services and re-register tools that depend on newly available services.
183
+ * This is used to inject services that are created after ToolProvider initialization
184
+ * (e.g., SessionManager which is created after ToolProvider).
185
+ *
186
+ * @param additionalServices - Additional services to add
187
+ */
188
+ updateServices(additionalServices) {
189
+ // Merge new services into existing services
190
+ this.services = { ...this.services, ...additionalServices };
191
+ // Re-register tools that may now have their required services available
192
+ for (const [toolName, entry] of Object.entries(TOOL_REGISTRY)) {
193
+ // Skip if tool is already registered
194
+ if (this.tools.has(toolName)) {
195
+ continue;
196
+ }
197
+ this.registerToolIfAvailable(toolName, entry);
198
+ }
199
+ // Update invocation builder with any newly registered tools
200
+ if (this.initialized && this.invocationBuilder) {
201
+ this.invocationBuilder = new ToolInvocationBuilder(this.tools);
202
+ }
203
+ }
187
204
  /**
188
205
  * Ensures the provider is initialized.
189
206
  * @throws ToolProviderNotInitializedError if not initialized
@@ -193,4 +210,43 @@ export class ToolProvider {
193
210
  throw new ToolProviderNotInitializedError();
194
211
  }
195
212
  }
213
+ /**
214
+ * Loads description from external file if configured.
215
+ * @param descriptionFile - The description file name (without .txt extension)
216
+ * @returns The loaded description or undefined if not available
217
+ */
218
+ loadExternalDescription(descriptionFile) {
219
+ if (!descriptionFile || !this.descriptionLoader) {
220
+ return undefined;
221
+ }
222
+ return this.descriptionLoader.load(descriptionFile);
223
+ }
224
+ /**
225
+ * Registers a single tool if all required services are available.
226
+ * @param toolName - Name of the tool to register
227
+ * @param entry - Registry entry for the tool
228
+ */
229
+ registerToolIfAvailable(toolName, entry) {
230
+ const allServicesAvailable = entry.requiredServices.every((serviceName) => this.services[serviceName] !== undefined);
231
+ if (!allServicesAvailable) {
232
+ return;
233
+ }
234
+ try {
235
+ const tool = entry.factory(this.services);
236
+ // Override description from external file if available
237
+ const fileDescription = this.loadExternalDescription(entry.descriptionFile);
238
+ if (fileDescription) {
239
+ tool.description = fileDescription;
240
+ }
241
+ this.tools.set(toolName, tool);
242
+ // Collect markers from registered tools
243
+ for (const marker of entry.markers) {
244
+ this.toolMarkers.add(marker);
245
+ }
246
+ }
247
+ catch (error) {
248
+ // Log error but don't fail initialization
249
+ console.error(`Failed to register tool ${toolName}:`, error);
250
+ }
251
+ }
196
252
  }
@@ -2,7 +2,10 @@ import type { KnownTool } from '../../../core/domain/cipher/tools/constants.js';
2
2
  import type { Tool } from '../../../core/domain/cipher/tools/types.js';
3
3
  import type { IFileSystem } from '../../../core/interfaces/cipher/i-file-system.js';
4
4
  import type { IProcessService } from '../../../core/interfaces/cipher/i-process-service.js';
5
+ import type { ITodoStorage } from '../../../core/interfaces/cipher/i-todo-storage.js';
5
6
  import type { MemoryManager } from '../memory/memory-manager.js';
7
+ import type { SessionManager } from '../session/session-manager.js';
8
+ import type { ToolProviderGetter } from './tool-provider-getter.js';
6
9
  import { ToolMarker } from './tool-markers.js';
7
10
  /**
8
11
  * Service dependencies available to tools.
@@ -11,10 +14,23 @@ import { ToolMarker } from './tool-markers.js';
11
14
  export interface ToolServices {
12
15
  /** File system service for file operations */
13
16
  fileSystemService?: IFileSystem;
17
+ /**
18
+ * Lazy getter for session manager (avoids circular dependency).
19
+ * SessionManager is created after ToolProvider, so we need a getter.
20
+ * Used by task tool for subagent delegation.
21
+ */
22
+ getSessionManager?: () => SessionManager | undefined;
23
+ /**
24
+ * Lazy getter for tool provider (avoids circular dependency).
25
+ * Used by batch tool to execute other tools.
26
+ */
27
+ getToolProvider?: ToolProviderGetter;
14
28
  /** Memory manager for agent memory operations */
15
29
  memoryManager?: MemoryManager;
16
30
  /** Process service for command execution */
17
31
  processService?: IProcessService;
32
+ /** Todo storage service for session-based todo persistence */
33
+ todoStorage?: ITodoStorage;
18
34
  }
19
35
  /**
20
36
  * Tool factory function type.
@@ -26,6 +42,13 @@ export type ToolFactory = (services: ToolServices) => Tool;
26
42
  * Defines the factory, required services, semantic markers, and optional output guidance for each tool.
27
43
  */
28
44
  export interface ToolRegistryEntry {
45
+ /**
46
+ * Optional external description file name (without .txt extension).
47
+ * If specified, the ToolProvider will load the description from
48
+ * src/resources/tools/{descriptionFile}.txt instead of using the inline description.
49
+ * Example: 'bash_exec' will load from 'src/resources/tools/bash_exec.txt'
50
+ */
51
+ descriptionFile?: string;
29
52
  /** Factory function to create the tool */
30
53
  factory: ToolFactory;
31
54
  /** Semantic markers for this tool (enables smart filtering and conditional prompts) */