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
@@ -0,0 +1,244 @@
1
+ /**
2
+ * LLM Model Registry - Single Source of Truth for Model Metadata.
3
+ *
4
+ * This registry provides centralized model information including:
5
+ * - Context window sizes (maxInputTokens)
6
+ * - Character-per-token ratios for estimation
7
+ * - Supported file types for multimodal input
8
+ * - Model capabilities
9
+ *
10
+ * Following patterns from Dexto's LLM registry.
11
+ */
12
+ import { LLM_PROVIDERS, } from './types.js';
13
+ /** Default fallback for unknown models */
14
+ export const DEFAULT_MAX_INPUT_TOKENS = 128_000;
15
+ export const DEFAULT_CHARS_PER_TOKEN = 4;
16
+ /**
17
+ * LLM Model Registry
18
+ *
19
+ * IMPORTANT: supportedFileTypes is the SINGLE SOURCE OF TRUTH for file upload capabilities:
20
+ * - Empty array [] = Model does NOT support file uploads
21
+ * - Specific types ['image', 'pdf'] = Model supports ONLY those file types
22
+ */
23
+ export const LLM_REGISTRY = {
24
+ claude: {
25
+ defaultModel: '',
26
+ models: [],
27
+ supportedFileTypes: [],
28
+ },
29
+ gemini: {
30
+ defaultModel: 'gemini-2.5-flash',
31
+ models: [
32
+ // Gemini 2.5 series
33
+ {
34
+ capabilities: {
35
+ supportsAudio: true,
36
+ supportsImages: true,
37
+ supportsPdf: true,
38
+ supportsStreaming: true,
39
+ supportsThinking: true,
40
+ },
41
+ charsPerToken: 4,
42
+ default: true,
43
+ displayName: 'Gemini 2.5 Flash',
44
+ maxInputTokens: 1_000_000,
45
+ maxOutputTokens: 8192,
46
+ name: 'gemini-2.5-flash',
47
+ pricing: { inputPerM: 0.075, outputPerM: 0.3 },
48
+ supportedFileTypes: ['image', 'pdf', 'audio'],
49
+ },
50
+ // Gemini 1.5 series
51
+ {
52
+ capabilities: {
53
+ supportsAudio: true,
54
+ supportsImages: true,
55
+ supportsPdf: true,
56
+ supportsStreaming: true,
57
+ supportsThinking: false,
58
+ },
59
+ charsPerToken: 4,
60
+ displayName: 'Gemini 1.5 Pro',
61
+ maxInputTokens: 2_000_000,
62
+ maxOutputTokens: 8192,
63
+ name: 'gemini-1.5-pro',
64
+ pricing: { inputPerM: 1.25, outputPerM: 5 },
65
+ supportedFileTypes: ['image', 'pdf', 'audio'],
66
+ },
67
+ ],
68
+ supportedFileTypes: ['image', 'pdf', 'audio'],
69
+ },
70
+ openrouter: {
71
+ defaultModel: '',
72
+ models: [],
73
+ supportedFileTypes: [],
74
+ },
75
+ };
76
+ // ============================================================================
77
+ // Registry Helper Functions
78
+ // ============================================================================
79
+ /**
80
+ * Get model information from the registry.
81
+ * @param provider - LLM provider
82
+ * @param model - Model name
83
+ * @returns ModelInfo or undefined if not found
84
+ */
85
+ export function getModelInfo(provider, model) {
86
+ const providerInfo = LLM_REGISTRY[provider];
87
+ if (!providerInfo)
88
+ return undefined;
89
+ return providerInfo.models.find((m) => m.name === model);
90
+ }
91
+ /**
92
+ * Get model info with fallback for unknown models.
93
+ * @param provider - LLM provider
94
+ * @param model - Model name
95
+ * @returns ModelInfo (falls back to default values for unknown models)
96
+ */
97
+ export function getModelInfoWithFallback(provider, model) {
98
+ const info = getModelInfo(provider, model);
99
+ if (info)
100
+ return info;
101
+ // Fallback for unknown models
102
+ const providerInfo = LLM_REGISTRY[provider];
103
+ return {
104
+ capabilities: {
105
+ supportsAudio: false,
106
+ supportsImages: provider !== 'openrouter', // Assume basic image support
107
+ supportsPdf: provider === 'claude' || provider === 'gemini',
108
+ supportsStreaming: true,
109
+ },
110
+ charsPerToken: DEFAULT_CHARS_PER_TOKEN,
111
+ displayName: model,
112
+ maxInputTokens: DEFAULT_MAX_INPUT_TOKENS,
113
+ name: model,
114
+ supportedFileTypes: providerInfo?.supportedFileTypes ?? [],
115
+ };
116
+ }
117
+ /**
118
+ * Get characters per token ratio for a model.
119
+ * @param provider - LLM provider
120
+ * @param model - Model name
121
+ * @returns Characters per token ratio
122
+ */
123
+ export function getCharsPerToken(provider, model) {
124
+ const info = getModelInfo(provider, model);
125
+ return info?.charsPerToken ?? DEFAULT_CHARS_PER_TOKEN;
126
+ }
127
+ /**
128
+ * Get maximum input tokens for a model.
129
+ * @param provider - LLM provider
130
+ * @param model - Model name
131
+ * @returns Maximum input tokens
132
+ */
133
+ export function getMaxInputTokensForModel(provider, model) {
134
+ const info = getModelInfo(provider, model);
135
+ return info?.maxInputTokens ?? DEFAULT_MAX_INPUT_TOKENS;
136
+ }
137
+ /**
138
+ * Check if a model is valid for a provider.
139
+ * @param provider - LLM provider
140
+ * @param model - Model name
141
+ * @returns true if the model is in the registry
142
+ */
143
+ export function isValidProviderModel(provider, model) {
144
+ return getModelInfo(provider, model) !== undefined;
145
+ }
146
+ /**
147
+ * Get supported models for a provider.
148
+ * @param provider - LLM provider
149
+ * @returns Array of model names
150
+ */
151
+ export function getSupportedModels(provider) {
152
+ const providerInfo = LLM_REGISTRY[provider];
153
+ if (!providerInfo)
154
+ return [];
155
+ return providerInfo.models.map((m) => m.name);
156
+ }
157
+ /**
158
+ * Get the default model for a provider.
159
+ * @param provider - LLM provider
160
+ * @returns Default model name
161
+ */
162
+ export function getDefaultModelForProvider(provider) {
163
+ const providerInfo = LLM_REGISTRY[provider];
164
+ return providerInfo?.defaultModel ?? '';
165
+ }
166
+ /**
167
+ * Infer provider from model name.
168
+ * @param model - Model name
169
+ * @returns LLMProvider or undefined if not found
170
+ */
171
+ export function getProviderFromModel(model) {
172
+ // Check each provider's models
173
+ for (const provider of LLM_PROVIDERS) {
174
+ if (getModelInfo(provider, model)) {
175
+ return provider;
176
+ }
177
+ }
178
+ // Fallback: infer from model name prefix
179
+ const lowerModel = model.toLowerCase();
180
+ if (lowerModel.startsWith('claude'))
181
+ return 'claude';
182
+ if (lowerModel.startsWith('gemini'))
183
+ return 'gemini';
184
+ if (lowerModel.includes('/'))
185
+ return 'openrouter'; // OpenRouter uses provider/model format
186
+ return undefined;
187
+ }
188
+ /**
189
+ * Get supported file types for a model.
190
+ * @param provider - LLM provider
191
+ * @param model - Model name
192
+ * @returns Array of supported file types
193
+ */
194
+ export function getSupportedFileTypesForModel(provider, model) {
195
+ const info = getModelInfo(provider, model);
196
+ if (info)
197
+ return info.supportedFileTypes;
198
+ // Fallback to provider-level defaults
199
+ const providerInfo = LLM_REGISTRY[provider];
200
+ return providerInfo?.supportedFileTypes ?? [];
201
+ }
202
+ /**
203
+ * Check if a model supports a specific file type.
204
+ * @param provider - LLM provider
205
+ * @param model - Model name
206
+ * @param fileType - File type to check
207
+ * @returns true if the model supports the file type
208
+ */
209
+ export function modelSupportsFileType(provider, model, fileType) {
210
+ const supportedTypes = getSupportedFileTypesForModel(provider, model);
211
+ return supportedTypes.includes(fileType);
212
+ }
213
+ /**
214
+ * Get model capabilities.
215
+ * @param provider - LLM provider
216
+ * @param model - Model name
217
+ * @returns ModelCapabilities
218
+ */
219
+ export function getModelCapabilities(provider, model) {
220
+ const info = getModelInfoWithFallback(provider, model);
221
+ return info.capabilities;
222
+ }
223
+ /**
224
+ * Get effective max input tokens considering config override.
225
+ * @param provider - LLM provider
226
+ * @param model - Model name
227
+ * @param configuredMax - Optional configured max from user
228
+ * @returns Effective max input tokens (min of model limit and configured limit)
229
+ */
230
+ export function getEffectiveMaxInputTokens(provider, model, configuredMax) {
231
+ const modelMax = getMaxInputTokensForModel(provider, model);
232
+ if (configuredMax === undefined)
233
+ return modelMax;
234
+ return Math.min(modelMax, configuredMax);
235
+ }
236
+ /**
237
+ * Check if OpenRouter accepts any model (custom models).
238
+ * OpenRouter can route to many models not in our registry.
239
+ * @param provider - LLM provider
240
+ * @returns true if provider accepts arbitrary models
241
+ */
242
+ export function acceptsAnyModel(provider) {
243
+ return provider === 'openrouter';
244
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * LLM Configuration Schemas
3
+ *
4
+ * Zod schemas for validating LLM configuration with cross-field validation.
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * Base LLM config object schema (before validation/branding).
9
+ */
10
+ export declare const LLMConfigBaseSchema: z.ZodObject<{
11
+ maxInputTokens: z.ZodOptional<z.ZodNumber>;
12
+ maxIterations: z.ZodDefault<z.ZodNumber>;
13
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
14
+ model: z.ZodString;
15
+ provider: z.ZodEnum<["claude", "gemini", "openrouter"]>;
16
+ temperature: z.ZodOptional<z.ZodNumber>;
17
+ timeout: z.ZodOptional<z.ZodNumber>;
18
+ }, "strict", z.ZodTypeAny, {
19
+ maxIterations: number;
20
+ model: string;
21
+ provider: "claude" | "gemini" | "openrouter";
22
+ timeout?: number | undefined;
23
+ temperature?: number | undefined;
24
+ maxInputTokens?: number | undefined;
25
+ maxOutputTokens?: number | undefined;
26
+ }, {
27
+ model: string;
28
+ provider: "claude" | "gemini" | "openrouter";
29
+ timeout?: number | undefined;
30
+ maxIterations?: number | undefined;
31
+ temperature?: number | undefined;
32
+ maxInputTokens?: number | undefined;
33
+ maxOutputTokens?: number | undefined;
34
+ }>;
35
+ /**
36
+ * Full LLM config schema with cross-field validation.
37
+ */
38
+ export declare const LLMConfigSchema: z.ZodEffects<z.ZodObject<{
39
+ maxInputTokens: z.ZodOptional<z.ZodNumber>;
40
+ maxIterations: z.ZodDefault<z.ZodNumber>;
41
+ maxOutputTokens: z.ZodOptional<z.ZodNumber>;
42
+ model: z.ZodString;
43
+ provider: z.ZodEnum<["claude", "gemini", "openrouter"]>;
44
+ temperature: z.ZodOptional<z.ZodNumber>;
45
+ timeout: z.ZodOptional<z.ZodNumber>;
46
+ }, "strict", z.ZodTypeAny, {
47
+ maxIterations: number;
48
+ model: string;
49
+ provider: "claude" | "gemini" | "openrouter";
50
+ timeout?: number | undefined;
51
+ temperature?: number | undefined;
52
+ maxInputTokens?: number | undefined;
53
+ maxOutputTokens?: number | undefined;
54
+ }, {
55
+ model: string;
56
+ provider: "claude" | "gemini" | "openrouter";
57
+ timeout?: number | undefined;
58
+ maxIterations?: number | undefined;
59
+ temperature?: number | undefined;
60
+ maxInputTokens?: number | undefined;
61
+ maxOutputTokens?: number | undefined;
62
+ }>, {
63
+ maxIterations: number;
64
+ model: string;
65
+ provider: "claude" | "gemini" | "openrouter";
66
+ timeout?: number | undefined;
67
+ temperature?: number | undefined;
68
+ maxInputTokens?: number | undefined;
69
+ maxOutputTokens?: number | undefined;
70
+ }, {
71
+ model: string;
72
+ provider: "claude" | "gemini" | "openrouter";
73
+ timeout?: number | undefined;
74
+ maxIterations?: number | undefined;
75
+ temperature?: number | undefined;
76
+ maxInputTokens?: number | undefined;
77
+ maxOutputTokens?: number | undefined;
78
+ }>;
79
+ /**
80
+ * Input type for LLM config (what users provide).
81
+ */
82
+ export type LLMConfig = z.input<typeof LLMConfigSchema>;
83
+ /**
84
+ * Output type for validated LLM config (after defaults applied).
85
+ */
86
+ export type ValidatedLLMConfig = z.output<typeof LLMConfigSchema>;
87
+ /**
88
+ * PATCH-like schema for LLM config updates (e.g., model switching).
89
+ * All fields are optional, but at least model or provider must be specified.
90
+ */
91
+ export declare const LLMUpdatesSchema: z.ZodEffects<z.ZodObject<{
92
+ maxInputTokens: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
93
+ maxIterations: z.ZodOptional<z.ZodNumber>;
94
+ maxOutputTokens: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
95
+ model: z.ZodOptional<z.ZodString>;
96
+ provider: z.ZodOptional<z.ZodEnum<["claude", "gemini", "openrouter"]>>;
97
+ temperature: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
98
+ timeout: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
99
+ }, "strip", z.ZodTypeAny, {
100
+ timeout?: number | undefined;
101
+ maxIterations?: number | undefined;
102
+ model?: string | undefined;
103
+ provider?: "claude" | "gemini" | "openrouter" | undefined;
104
+ temperature?: number | undefined;
105
+ maxInputTokens?: number | undefined;
106
+ maxOutputTokens?: number | undefined;
107
+ }, {
108
+ timeout?: number | undefined;
109
+ maxIterations?: number | undefined;
110
+ model?: string | undefined;
111
+ provider?: "claude" | "gemini" | "openrouter" | undefined;
112
+ temperature?: number | undefined;
113
+ maxInputTokens?: number | undefined;
114
+ maxOutputTokens?: number | undefined;
115
+ }>, {
116
+ timeout?: number | undefined;
117
+ maxIterations?: number | undefined;
118
+ model?: string | undefined;
119
+ provider?: "claude" | "gemini" | "openrouter" | undefined;
120
+ temperature?: number | undefined;
121
+ maxInputTokens?: number | undefined;
122
+ maxOutputTokens?: number | undefined;
123
+ }, {
124
+ timeout?: number | undefined;
125
+ maxIterations?: number | undefined;
126
+ model?: string | undefined;
127
+ provider?: "claude" | "gemini" | "openrouter" | undefined;
128
+ temperature?: number | undefined;
129
+ maxInputTokens?: number | undefined;
130
+ maxOutputTokens?: number | undefined;
131
+ }>;
132
+ /**
133
+ * Input type for LLM updates.
134
+ */
135
+ export type LLMUpdates = z.input<typeof LLMUpdatesSchema>;
136
+ /**
137
+ * Validate LLM configuration and return validated result.
138
+ * @param config - Raw configuration input
139
+ * @returns Validated configuration with defaults applied
140
+ * @throws ZodError if validation fails
141
+ */
142
+ export declare function validateLLMConfig(config: LLMConfig): ValidatedLLMConfig;
143
+ /**
144
+ * Safely validate LLM configuration without throwing.
145
+ * @param config - Raw configuration input
146
+ * @returns SafeParseResult with success flag and data or error
147
+ */
148
+ export declare function safeParseLLMConfig(config: unknown): z.SafeParseReturnType<LLMConfig, ValidatedLLMConfig>;
149
+ /**
150
+ * Validate LLM updates (partial config for switching).
151
+ * @param updates - Partial configuration updates
152
+ * @returns Validated updates
153
+ * @throws ZodError if validation fails
154
+ */
155
+ export declare function validateLLMUpdates(updates: LLMUpdates): LLMUpdates;
@@ -0,0 +1,151 @@
1
+ /**
2
+ * LLM Configuration Schemas
3
+ *
4
+ * Zod schemas for validating LLM configuration with cross-field validation.
5
+ */
6
+ import { z } from 'zod';
7
+ import { ErrorScope, ErrorType, LLMErrorCode } from './error-codes.js';
8
+ import { acceptsAnyModel, getMaxInputTokensForModel, getSupportedModels, isValidProviderModel } from './registry.js';
9
+ import { LLM_PROVIDERS } from './types.js';
10
+ /**
11
+ * Default-free field definitions for LLM configuration.
12
+ * Used to build both the full config schema (with defaults) and the updates schema (no defaults).
13
+ */
14
+ const LLMConfigFields = {
15
+ maxInputTokens: z.coerce
16
+ .number()
17
+ .int()
18
+ .positive()
19
+ .optional()
20
+ .describe('Max input tokens for history; defaults to model limit'),
21
+ maxIterations: z.coerce
22
+ .number()
23
+ .int()
24
+ .positive()
25
+ .describe('Max iterations for agentic loops'),
26
+ maxOutputTokens: z.coerce
27
+ .number()
28
+ .int()
29
+ .positive()
30
+ .optional()
31
+ .describe('Max tokens for model output'),
32
+ model: z
33
+ .string()
34
+ .min(1, 'Model name is required')
35
+ .describe('Specific model name for the selected provider'),
36
+ provider: z
37
+ .enum(LLM_PROVIDERS)
38
+ .describe("LLM provider (e.g., 'claude', 'gemini', 'openrouter')"),
39
+ temperature: z.coerce
40
+ .number()
41
+ .min(0)
42
+ .max(2)
43
+ .optional()
44
+ .describe('Randomness: 0 deterministic, 2 creative'),
45
+ timeout: z.coerce
46
+ .number()
47
+ .int()
48
+ .positive()
49
+ .optional()
50
+ .describe('Request timeout in milliseconds'),
51
+ };
52
+ /**
53
+ * Base LLM config object schema (before validation/branding).
54
+ */
55
+ export const LLMConfigBaseSchema = z
56
+ .object({
57
+ maxInputTokens: LLMConfigFields.maxInputTokens,
58
+ maxIterations: z.coerce.number().int().positive().default(50),
59
+ maxOutputTokens: LLMConfigFields.maxOutputTokens,
60
+ model: LLMConfigFields.model,
61
+ provider: LLMConfigFields.provider,
62
+ temperature: LLMConfigFields.temperature,
63
+ timeout: LLMConfigFields.timeout,
64
+ })
65
+ .strict();
66
+ /**
67
+ * Full LLM config schema with cross-field validation.
68
+ */
69
+ export const LLMConfigSchema = LLMConfigBaseSchema.superRefine((data, ctx) => {
70
+ const maxInputTokensIsSet = data.maxInputTokens !== null && data.maxInputTokens !== undefined;
71
+ // Validate model exists for provider (unless provider accepts any model)
72
+ if (!acceptsAnyModel(data.provider) && !isValidProviderModel(data.provider, data.model)) {
73
+ const supportedModelsList = getSupportedModels(data.provider);
74
+ ctx.addIssue({
75
+ code: z.ZodIssueCode.custom,
76
+ message: `Model '${data.model}' is not supported for provider '${data.provider}'. ` +
77
+ `Supported: ${supportedModelsList.slice(0, 5).join(', ')}${supportedModelsList.length > 5 ? '...' : ''}`,
78
+ params: {
79
+ code: LLMErrorCode.MODEL_INCOMPATIBLE,
80
+ scope: ErrorScope.LLM,
81
+ type: ErrorType.USER,
82
+ },
83
+ path: ['model'],
84
+ });
85
+ }
86
+ // Validate maxInputTokens doesn't exceed model limit
87
+ if (maxInputTokensIsSet && !acceptsAnyModel(data.provider)) {
88
+ try {
89
+ const modelMax = getMaxInputTokensForModel(data.provider, data.model);
90
+ if (data.maxInputTokens > modelMax) {
91
+ ctx.addIssue({
92
+ code: z.ZodIssueCode.custom,
93
+ message: `maxInputTokens (${data.maxInputTokens}) exceeds model limit (${modelMax}) ` +
94
+ `for '${data.model}'`,
95
+ params: {
96
+ code: LLMErrorCode.TOKENS_EXCEEDED,
97
+ scope: ErrorScope.LLM,
98
+ type: ErrorType.USER,
99
+ },
100
+ path: ['maxInputTokens'],
101
+ });
102
+ }
103
+ }
104
+ catch {
105
+ // Model not found in registry - validation already handled above
106
+ }
107
+ }
108
+ });
109
+ /**
110
+ * PATCH-like schema for LLM config updates (e.g., model switching).
111
+ * All fields are optional, but at least model or provider must be specified.
112
+ */
113
+ export const LLMUpdatesSchema = z
114
+ .object({ ...LLMConfigFields })
115
+ .partial()
116
+ .superRefine((data, ctx) => {
117
+ // Require at least one meaningful change field: model or provider
118
+ if (!data.model && !data.provider) {
119
+ ctx.addIssue({
120
+ code: z.ZodIssueCode.custom,
121
+ message: 'At least model or provider must be specified for LLM update',
122
+ path: [],
123
+ });
124
+ }
125
+ });
126
+ /**
127
+ * Validate LLM configuration and return validated result.
128
+ * @param config - Raw configuration input
129
+ * @returns Validated configuration with defaults applied
130
+ * @throws ZodError if validation fails
131
+ */
132
+ export function validateLLMConfig(config) {
133
+ return LLMConfigSchema.parse(config);
134
+ }
135
+ /**
136
+ * Safely validate LLM configuration without throwing.
137
+ * @param config - Raw configuration input
138
+ * @returns SafeParseResult with success flag and data or error
139
+ */
140
+ export function safeParseLLMConfig(config) {
141
+ return LLMConfigSchema.safeParse(config);
142
+ }
143
+ /**
144
+ * Validate LLM updates (partial config for switching).
145
+ * @param updates - Partial configuration updates
146
+ * @returns Validated updates
147
+ * @throws ZodError if validation fails
148
+ */
149
+ export function validateLLMUpdates(updates) {
150
+ return LLMUpdatesSchema.parse(updates);
151
+ }
@@ -0,0 +1,121 @@
1
+ /**
2
+ * LLM Provider types and constants.
3
+ *
4
+ * This module defines the core types for LLM provider abstraction,
5
+ */
6
+ /**
7
+ * Supported LLM providers as a const array for runtime validation.
8
+ */
9
+ export declare const LLM_PROVIDERS: readonly ["claude", "gemini", "openrouter"];
10
+ /**
11
+ * Union type of all supported LLM providers.
12
+ */
13
+ export type LLMProvider = (typeof LLM_PROVIDERS)[number];
14
+ /**
15
+ * Supported file types for multimodal input.
16
+ */
17
+ export declare const SUPPORTED_FILE_TYPES: readonly ["audio", "image", "pdf"];
18
+ /**
19
+ * Union type of supported file types.
20
+ */
21
+ export type SupportedFileType = (typeof SUPPORTED_FILE_TYPES)[number];
22
+ /**
23
+ * Model capabilities configuration.
24
+ * Defines what features a specific model supports.
25
+ */
26
+ export interface ModelCapabilities {
27
+ /** Whether the model supports audio input */
28
+ supportsAudio: boolean;
29
+ /** Whether the model supports image input */
30
+ supportsImages: boolean;
31
+ /** Whether the model supports PDF input */
32
+ supportsPdf: boolean;
33
+ /** Whether the model supports streaming responses */
34
+ supportsStreaming: boolean;
35
+ /** Whether the model supports extended thinking (Gemini) */
36
+ supportsThinking?: boolean;
37
+ }
38
+ /**
39
+ * Model metadata information.
40
+ * Contains all relevant details about a specific model.
41
+ */
42
+ export interface ModelInfo {
43
+ /** Model capabilities */
44
+ capabilities: ModelCapabilities;
45
+ /** Characters per token ratio for estimation (e.g., 3.5 for Claude) */
46
+ charsPerToken: number;
47
+ /** Whether this is the default model for the provider */
48
+ default?: boolean;
49
+ /** Human-readable display name */
50
+ displayName: string;
51
+ /** Maximum input tokens (context window size) */
52
+ maxInputTokens: number;
53
+ /** Default max output tokens */
54
+ maxOutputTokens?: number;
55
+ /** Model identifier (e.g., 'claude-sonnet-4-20250514') */
56
+ name: string;
57
+ /** Optional pricing info (USD per million tokens) */
58
+ pricing?: {
59
+ inputPerM: number;
60
+ outputPerM: number;
61
+ };
62
+ /** File types this model supports */
63
+ supportedFileTypes: SupportedFileType[];
64
+ }
65
+ /**
66
+ * Provider configuration information.
67
+ * Contains metadata about a provider and its available models.
68
+ */
69
+ export interface ProviderInfo {
70
+ /** Default model name for this provider */
71
+ defaultModel: string;
72
+ /** List of available models */
73
+ models: ModelInfo[];
74
+ /** Provider-level supported file types (fallback when model doesn't specify) */
75
+ supportedFileTypes: SupportedFileType[];
76
+ }
77
+ /**
78
+ * Runtime LLM context information.
79
+ * Represents the current LLM configuration in use.
80
+ */
81
+ export interface LLMContext {
82
+ /** Current model name */
83
+ model: string;
84
+ /** Current provider */
85
+ provider: LLMProvider;
86
+ }
87
+ /**
88
+ * Token usage statistics.
89
+ */
90
+ export interface LLMTokenUsage {
91
+ /** Number of input tokens */
92
+ inputTokens: number;
93
+ /** Number of output tokens */
94
+ outputTokens: number;
95
+ /** Number of reasoning tokens (if applicable) */
96
+ reasoningTokens?: number;
97
+ /** Total tokens (input + output + reasoning) */
98
+ totalTokens: number;
99
+ }
100
+ /**
101
+ * MIME type to file type mapping.
102
+ * Used to determine supported file types from MIME types.
103
+ */
104
+ export declare const MIME_TYPE_TO_FILE_TYPE: Record<string, SupportedFileType>;
105
+ /**
106
+ * Get all allowed MIME types.
107
+ * @returns Array of allowed MIME type strings
108
+ */
109
+ export declare function getAllowedMimeTypes(): string[];
110
+ /**
111
+ * Get file type from MIME type.
112
+ * @param mimeType - MIME type string
113
+ * @returns SupportedFileType or undefined if not supported
114
+ */
115
+ export declare function getFileTypeFromMimeType(mimeType: string): SupportedFileType | undefined;
116
+ /**
117
+ * Check if a MIME type is supported.
118
+ * @param mimeType - MIME type string
119
+ * @returns true if the MIME type is supported
120
+ */
121
+ export declare function isSupportedMimeType(mimeType: string): boolean;