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,228 @@
1
+ /**
2
+ * Blob reference resolver for lazy media evaluation.
3
+ *
4
+ * This service resolves @blob:id references in message content to actual data
5
+ * at format-time (when sending to LLM), enabling lazy evaluation of large media.
6
+ *
7
+ * Key features:
8
+ * - Lazy expansion: Blob references only resolved when needed
9
+ * - MIME type filtering: Exclude unsupported media types
10
+ * - Placeholder generation: Replace filtered media with descriptive placeholders
11
+ *
12
+ */
13
+ import { BLOB_REF_PATTERN, containsBlobReferences, extractBlobId, generateMediaPlaceholder, matchesAnyMimePattern, parseBlobReferences, } from './blob-reference-utils.js';
14
+ /**
15
+ * Blob reference resolver.
16
+ *
17
+ * Resolves @blob:id references to actual content at format-time.
18
+ */
19
+ export class BlobReferenceResolver {
20
+ blobStorage;
21
+ constructor(blobStorage) {
22
+ this.blobStorage = blobStorage;
23
+ }
24
+ /**
25
+ * Expand blob references in message content.
26
+ *
27
+ * Processes an array of message parts and resolves any @blob:id references
28
+ * to actual content. Supports blob refs in:
29
+ * - TextPart.text (inline references)
30
+ * - ImagePart.image (blob ref instead of base64)
31
+ * - FilePart.data (blob ref instead of base64)
32
+ *
33
+ * @param content - Array of message parts to expand
34
+ * @param options - Resolution options
35
+ * @returns Array of message parts with blob refs resolved
36
+ */
37
+ async expandBlobReferences(content, options) {
38
+ const expanded = [];
39
+ const expandedParts = await Promise.all(content.map((part) => this.expandPart(part, options)));
40
+ for (const parts of expandedParts) {
41
+ expanded.push(...parts);
42
+ }
43
+ return expanded;
44
+ }
45
+ /**
46
+ * Get all blob IDs referenced in content.
47
+ */
48
+ getBlobIds(content) {
49
+ const ids = new Set();
50
+ for (const part of content) {
51
+ if (part.type === 'text') {
52
+ for (const id of parseBlobReferences(part.text)) {
53
+ ids.add(id);
54
+ }
55
+ }
56
+ if (part.type === 'image' && typeof part.image === 'string') {
57
+ const id = extractBlobId(part.image);
58
+ if (id)
59
+ ids.add(id);
60
+ }
61
+ if (part.type === 'file' && typeof part.data === 'string') {
62
+ const id = extractBlobId(part.data);
63
+ if (id)
64
+ ids.add(id);
65
+ }
66
+ }
67
+ return [...ids];
68
+ }
69
+ /**
70
+ * Check if content contains any blob references.
71
+ *
72
+ * Useful for determining if expansion is needed before calling expandBlobReferences.
73
+ */
74
+ hasAnyBlobReferences(content) {
75
+ for (const part of content) {
76
+ if (part.type === 'text' && containsBlobReferences(part.text)) {
77
+ return true;
78
+ }
79
+ if (part.type === 'image' && typeof part.image === 'string' && part.image.startsWith('@blob:')) {
80
+ return true;
81
+ }
82
+ if (part.type === 'file' && typeof part.data === 'string' && part.data.startsWith('@blob:')) {
83
+ return true;
84
+ }
85
+ }
86
+ return false;
87
+ }
88
+ /**
89
+ * Prefetch blobs for a set of message parts.
90
+ *
91
+ * Useful for warming the cache before expansion.
92
+ */
93
+ async prefetchBlobs(content) {
94
+ const ids = this.getBlobIds(content);
95
+ await Promise.all(ids.map((id) => this.blobStorage.retrieve(id)));
96
+ }
97
+ /**
98
+ * Expand blob references embedded in text.
99
+ *
100
+ * Text like "Here is the image: @blob:abc123" will be split into
101
+ * multiple parts: text before, image part, text after.
102
+ */
103
+ async expandBlobsInText(text, options) {
104
+ const blobIds = parseBlobReferences(text);
105
+ if (blobIds.length === 0) {
106
+ return [{ text, type: 'text' }];
107
+ }
108
+ const parts = [];
109
+ let lastIndex = 0;
110
+ const matches = [...text.matchAll(new RegExp(BLOB_REF_PATTERN.source, 'g'))];
111
+ const resolvedParts = await Promise.all(matches.map((match) => {
112
+ const blobId = match[1];
113
+ return this.resolveBlobToParts(blobId, options);
114
+ }));
115
+ for (const [index, match] of matches.entries()) {
116
+ const matchIndex = match.index;
117
+ // Add text before this match
118
+ if (matchIndex > lastIndex) {
119
+ const segment = text.slice(lastIndex, matchIndex);
120
+ if (segment.length > 0) {
121
+ parts.push({ text: segment, type: 'text' });
122
+ }
123
+ }
124
+ // Resolve the blob
125
+ parts.push(...resolvedParts[index]);
126
+ lastIndex = matchIndex + match[0].length;
127
+ }
128
+ // Add remaining text
129
+ if (lastIndex < text.length) {
130
+ const trailing = text.slice(lastIndex);
131
+ if (trailing.length > 0) {
132
+ parts.push({ text: trailing, type: 'text' });
133
+ }
134
+ }
135
+ return parts;
136
+ }
137
+ /**
138
+ * Expand a single message part.
139
+ */
140
+ async expandPart(part, options) {
141
+ // Text part with embedded blob refs
142
+ if (part.type === 'text' && containsBlobReferences(part.text)) {
143
+ return this.expandBlobsInText(part.text, options);
144
+ }
145
+ // Image part with blob ref
146
+ if (part.type === 'image' && typeof part.image === 'string' && part.image.startsWith('@blob:')) {
147
+ const resolved = await this.resolveImageBlob(part, options);
148
+ return [resolved];
149
+ }
150
+ // File part with blob ref
151
+ if (part.type === 'file' && typeof part.data === 'string' && part.data.startsWith('@blob:')) {
152
+ const resolved = await this.resolveFileBlob(part, options);
153
+ return [resolved];
154
+ }
155
+ // No blob refs, return as-is
156
+ return [part];
157
+ }
158
+ /**
159
+ * Resolve a blob ID to message parts.
160
+ */
161
+ async resolveBlobToParts(blobId, options) {
162
+ try {
163
+ const blob = await this.blobStorage.retrieve(blobId);
164
+ if (!blob) {
165
+ return [{ text: `[Attachment unavailable: @blob:${blobId}]`, type: 'text' }];
166
+ }
167
+ const mimeType = blob.metadata.contentType || 'application/octet-stream';
168
+ // Check MIME type filtering
169
+ if (options?.allowedMimeTypes && !matchesAnyMimePattern(mimeType, options.allowedMimeTypes)) {
170
+ const placeholder = generateMediaPlaceholder({
171
+ mimeType,
172
+ originalName: blob.metadata.originalName,
173
+ size: blob.metadata.size,
174
+ });
175
+ return [{ text: placeholder, type: 'text' }];
176
+ }
177
+ // Convert to appropriate part type
178
+ const base64Content = blob.content.toString('base64');
179
+ if (mimeType.startsWith('image/')) {
180
+ return [{
181
+ image: base64Content,
182
+ mimeType,
183
+ type: 'image',
184
+ }];
185
+ }
186
+ return [{
187
+ data: base64Content,
188
+ mimeType,
189
+ type: 'file',
190
+ ...(blob.metadata.originalName && { filename: blob.metadata.originalName }),
191
+ }];
192
+ }
193
+ catch (error) {
194
+ const message = error instanceof Error ? error.message : 'Unknown error';
195
+ return [{ text: `[Attachment unavailable: @blob:${blobId} - ${message}]`, type: 'text' }];
196
+ }
197
+ }
198
+ /**
199
+ * Resolve a file part with blob reference.
200
+ */
201
+ async resolveFileBlob(part, options) {
202
+ const blobId = extractBlobId(part.data);
203
+ if (!blobId)
204
+ return part;
205
+ const resolved = await this.resolveBlobToParts(blobId, options);
206
+ // If resolved to a file part, preserve the original filename
207
+ if (resolved[0]?.type === 'file' && part.filename && !resolved[0].filename) {
208
+ return { ...resolved[0], filename: part.filename };
209
+ }
210
+ return resolved[0] || part;
211
+ }
212
+ /**
213
+ * Resolve an image part with blob reference.
214
+ */
215
+ async resolveImageBlob(part, options) {
216
+ const blobId = extractBlobId(part.image);
217
+ if (!blobId)
218
+ return part;
219
+ const resolved = await this.resolveBlobToParts(blobId, options);
220
+ return resolved[0] || part;
221
+ }
222
+ }
223
+ /**
224
+ * Create a BlobReferenceResolver instance.
225
+ */
226
+ export function createBlobReferenceResolver(blobStorage) {
227
+ return new BlobReferenceResolver(blobStorage);
228
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Blob reference utilities for lazy media evaluation.
3
+ *
4
+ * Blob references are URIs that point to data stored in blob storage.
5
+ * Format: @blob:{id}
6
+ *
7
+ * This allows messages to reference large media without embedding the
8
+ * actual data, deferring resolution to format-time when needed.
9
+ *
10
+ * Based on dexto's @blob: reference pattern.
11
+ */
12
+ /**
13
+ * Regular expression for matching blob references.
14
+ * Captures the blob ID from @blob:{id} format.
15
+ */
16
+ export declare const BLOB_REF_PATTERN: RegExp;
17
+ /**
18
+ * Prefix for blob references.
19
+ */
20
+ export declare const BLOB_REF_PREFIX = "@blob:";
21
+ /**
22
+ * Check if a string contains any blob references.
23
+ *
24
+ * @param content - String to check
25
+ * @returns true if content contains @blob: references
26
+ */
27
+ export declare function containsBlobReferences(content: string): boolean;
28
+ /**
29
+ * Parse all blob references from a string.
30
+ *
31
+ * @param content - String containing blob references
32
+ * @returns Array of blob IDs (without @blob: prefix)
33
+ */
34
+ export declare function parseBlobReferences(content: string): string[];
35
+ /**
36
+ * Create a blob reference string from a blob ID.
37
+ *
38
+ * @param blobId - The blob storage key
39
+ * @returns Blob reference string (@blob:{id})
40
+ */
41
+ export declare function createBlobRef(blobId: string): string;
42
+ /**
43
+ * Extract blob ID from a reference string.
44
+ *
45
+ * @param ref - Blob reference string (@blob:{id})
46
+ * @returns Blob ID or null if not a valid reference
47
+ */
48
+ export declare function extractBlobId(ref: string): null | string;
49
+ /**
50
+ * Check if a string is a blob reference.
51
+ *
52
+ * @param value - String to check
53
+ * @returns true if the string is a blob reference
54
+ */
55
+ export declare function isBlobReference(value: string): boolean;
56
+ /**
57
+ * Check if a MIME type matches a pattern.
58
+ *
59
+ * Supports exact match, wildcard subtype (image/*), and wildcard all.
60
+ *
61
+ * @param mimeType - MIME type to check
62
+ * @param pattern - Pattern to match against
63
+ * @returns true if the MIME type matches the pattern
64
+ */
65
+ export declare function matchesMimePattern(mimeType: string | undefined, pattern: string): boolean;
66
+ /**
67
+ * Check if a MIME type matches any pattern in an array.
68
+ *
69
+ * @param mimeType - MIME type to check
70
+ * @param patterns - Array of patterns to match against
71
+ * @returns true if the MIME type matches any pattern
72
+ */
73
+ export declare function matchesAnyMimePattern(mimeType: string | undefined, patterns: string[]): boolean;
74
+ /**
75
+ * Format byte size as human-readable string.
76
+ *
77
+ * @param bytes - Number of bytes
78
+ * @returns Formatted string like "1.5 KB" or "2.3 MB"
79
+ */
80
+ export declare function formatByteSize(bytes: number): string;
81
+ /**
82
+ * Generate a placeholder string for filtered/unavailable media.
83
+ *
84
+ * @param metadata - Media metadata
85
+ * @param metadata.mimeType - MIME type of the media
86
+ * @param metadata.originalName - Original filename if available
87
+ * @param metadata.size - Size in bytes
88
+ * @returns Placeholder string like "[Video: demo.mp4 (5.2 MB)]"
89
+ */
90
+ export declare function generateMediaPlaceholder(metadata: {
91
+ mimeType: string;
92
+ originalName?: string;
93
+ size: number;
94
+ }): string;
95
+ /**
96
+ * Replace a blob reference in a string with resolved content.
97
+ *
98
+ * @param content - String containing blob reference
99
+ * @param blobId - Blob ID to replace
100
+ * @param replacement - Replacement string
101
+ * @returns String with blob reference replaced
102
+ */
103
+ export declare function replaceBlobReference(content: string, blobId: string, replacement: string): string;
104
+ /**
105
+ * Get MIME type category for display purposes.
106
+ *
107
+ * @param mimeType - MIME type
108
+ * @returns Category label
109
+ */
110
+ export declare function getMimeTypeCategory(mimeType: string): string;
111
+ /**
112
+ * Infer MIME type from filename extension.
113
+ *
114
+ * @param filename - Filename with extension
115
+ * @returns MIME type or undefined if not recognized
116
+ */
117
+ export declare function inferMimeTypeFromFilename(filename: string): string | undefined;
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Blob reference utilities for lazy media evaluation.
3
+ *
4
+ * Blob references are URIs that point to data stored in blob storage.
5
+ * Format: @blob:{id}
6
+ *
7
+ * This allows messages to reference large media without embedding the
8
+ * actual data, deferring resolution to format-time when needed.
9
+ *
10
+ * Based on dexto's @blob: reference pattern.
11
+ */
12
+ /**
13
+ * Regular expression for matching blob references.
14
+ * Captures the blob ID from @blob:{id} format.
15
+ */
16
+ export const BLOB_REF_PATTERN = /@blob:([a-zA-Z0-9_-]+)/g;
17
+ /**
18
+ * Prefix for blob references.
19
+ */
20
+ export const BLOB_REF_PREFIX = '@blob:';
21
+ /**
22
+ * Check if a string contains any blob references.
23
+ *
24
+ * @param content - String to check
25
+ * @returns true if content contains @blob: references
26
+ */
27
+ export function containsBlobReferences(content) {
28
+ if (!content || typeof content !== 'string')
29
+ return false;
30
+ return content.includes(BLOB_REF_PREFIX);
31
+ }
32
+ /**
33
+ * Parse all blob references from a string.
34
+ *
35
+ * @param content - String containing blob references
36
+ * @returns Array of blob IDs (without @blob: prefix)
37
+ */
38
+ export function parseBlobReferences(content) {
39
+ if (!content || typeof content !== 'string')
40
+ return [];
41
+ const matches = [...content.matchAll(new RegExp(BLOB_REF_PATTERN.source, 'g'))];
42
+ return matches.map((m) => m[1]);
43
+ }
44
+ /**
45
+ * Create a blob reference string from a blob ID.
46
+ *
47
+ * @param blobId - The blob storage key
48
+ * @returns Blob reference string (@blob:{id})
49
+ */
50
+ export function createBlobRef(blobId) {
51
+ return `${BLOB_REF_PREFIX}${blobId}`;
52
+ }
53
+ /**
54
+ * Extract blob ID from a reference string.
55
+ *
56
+ * @param ref - Blob reference string (@blob:{id})
57
+ * @returns Blob ID or null if not a valid reference
58
+ */
59
+ export function extractBlobId(ref) {
60
+ if (!ref || typeof ref !== 'string')
61
+ return null;
62
+ if (!ref.startsWith(BLOB_REF_PREFIX))
63
+ return null;
64
+ return ref.slice(BLOB_REF_PREFIX.length);
65
+ }
66
+ /**
67
+ * Check if a string is a blob reference.
68
+ *
69
+ * @param value - String to check
70
+ * @returns true if the string is a blob reference
71
+ */
72
+ export function isBlobReference(value) {
73
+ if (!value || typeof value !== 'string')
74
+ return false;
75
+ return value.startsWith(BLOB_REF_PREFIX) && extractBlobId(value) !== null;
76
+ }
77
+ /**
78
+ * Check if a MIME type matches a pattern.
79
+ *
80
+ * Supports exact match, wildcard subtype (image/*), and wildcard all.
81
+ *
82
+ * @param mimeType - MIME type to check
83
+ * @param pattern - Pattern to match against
84
+ * @returns true if the MIME type matches the pattern
85
+ */
86
+ export function matchesMimePattern(mimeType, pattern) {
87
+ if (!mimeType)
88
+ return false;
89
+ const normalizedMime = mimeType.toLowerCase().trim();
90
+ const normalizedPattern = pattern.toLowerCase().trim();
91
+ // Any type
92
+ if (normalizedPattern === '*' || normalizedPattern === '*/*')
93
+ return true;
94
+ // Exact match
95
+ if (normalizedMime === normalizedPattern)
96
+ return true;
97
+ // Wildcard subtype (e.g., "image/*")
98
+ if (normalizedPattern.endsWith('/*')) {
99
+ const patternType = normalizedPattern.slice(0, -2);
100
+ const mimeTypePrefix = normalizedMime.split('/')[0];
101
+ return mimeTypePrefix === patternType;
102
+ }
103
+ return false;
104
+ }
105
+ /**
106
+ * Check if a MIME type matches any pattern in an array.
107
+ *
108
+ * @param mimeType - MIME type to check
109
+ * @param patterns - Array of patterns to match against
110
+ * @returns true if the MIME type matches any pattern
111
+ */
112
+ export function matchesAnyMimePattern(mimeType, patterns) {
113
+ if (!patterns || patterns.length === 0)
114
+ return true; // No filter = allow all
115
+ return patterns.some((pattern) => matchesMimePattern(mimeType, pattern));
116
+ }
117
+ /**
118
+ * Format byte size as human-readable string.
119
+ *
120
+ * @param bytes - Number of bytes
121
+ * @returns Formatted string like "1.5 KB" or "2.3 MB"
122
+ */
123
+ export function formatByteSize(bytes) {
124
+ if (bytes === 0)
125
+ return '0 B';
126
+ const k = 1024;
127
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
128
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
129
+ return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
130
+ }
131
+ /**
132
+ * Generate a placeholder string for filtered/unavailable media.
133
+ *
134
+ * @param metadata - Media metadata
135
+ * @param metadata.mimeType - MIME type of the media
136
+ * @param metadata.originalName - Original filename if available
137
+ * @param metadata.size - Size in bytes
138
+ * @returns Placeholder string like "[Video: demo.mp4 (5.2 MB)]"
139
+ */
140
+ export function generateMediaPlaceholder(metadata) {
141
+ let typeLabel = 'File';
142
+ if (metadata.mimeType.startsWith('video/'))
143
+ typeLabel = 'Video';
144
+ else if (metadata.mimeType.startsWith('audio/'))
145
+ typeLabel = 'Audio';
146
+ else if (metadata.mimeType.startsWith('image/'))
147
+ typeLabel = 'Image';
148
+ else if (metadata.mimeType === 'application/pdf')
149
+ typeLabel = 'PDF';
150
+ const size = formatByteSize(metadata.size);
151
+ const name = metadata.originalName || 'unnamed';
152
+ return `[${typeLabel}: ${name} (${size})]`;
153
+ }
154
+ /**
155
+ * Replace a blob reference in a string with resolved content.
156
+ *
157
+ * @param content - String containing blob reference
158
+ * @param blobId - Blob ID to replace
159
+ * @param replacement - Replacement string
160
+ * @returns String with blob reference replaced
161
+ */
162
+ export function replaceBlobReference(content, blobId, replacement) {
163
+ const ref = createBlobRef(blobId);
164
+ return content.replace(ref, replacement);
165
+ }
166
+ /**
167
+ * Get MIME type category for display purposes.
168
+ *
169
+ * @param mimeType - MIME type
170
+ * @returns Category label
171
+ */
172
+ export function getMimeTypeCategory(mimeType) {
173
+ const lower = mimeType.toLowerCase();
174
+ if (lower.startsWith('image/'))
175
+ return 'Image';
176
+ if (lower.startsWith('video/'))
177
+ return 'Video';
178
+ if (lower.startsWith('audio/'))
179
+ return 'Audio';
180
+ if (lower === 'application/pdf')
181
+ return 'PDF';
182
+ if (lower.startsWith('text/'))
183
+ return 'Text';
184
+ return 'File';
185
+ }
186
+ /**
187
+ * File extension to MIME type mapping for common types.
188
+ */
189
+ const EXTENSION_TO_MIME = {
190
+ '.avi': 'video/x-msvideo',
191
+ '.bmp': 'image/bmp',
192
+ '.css': 'text/css',
193
+ '.flac': 'audio/flac',
194
+ '.gif': 'image/gif',
195
+ '.gz': 'application/gzip',
196
+ '.html': 'text/html',
197
+ '.ico': 'image/x-icon',
198
+ '.jpeg': 'image/jpeg',
199
+ '.jpg': 'image/jpeg',
200
+ '.js': 'text/javascript',
201
+ '.json': 'application/json',
202
+ '.m4a': 'audio/mp4',
203
+ '.mkv': 'video/x-matroska',
204
+ '.mov': 'video/quicktime',
205
+ '.mp3': 'audio/mpeg',
206
+ '.mp4': 'video/mp4',
207
+ '.ogg': 'audio/ogg',
208
+ '.pdf': 'application/pdf',
209
+ '.png': 'image/png',
210
+ '.svg': 'image/svg+xml',
211
+ '.tar': 'application/x-tar',
212
+ '.txt': 'text/plain',
213
+ '.wav': 'audio/wav',
214
+ '.webm': 'video/webm',
215
+ '.webp': 'image/webp',
216
+ '.xml': 'application/xml',
217
+ '.zip': 'application/zip',
218
+ };
219
+ /**
220
+ * Infer MIME type from filename extension.
221
+ *
222
+ * @param filename - Filename with extension
223
+ * @returns MIME type or undefined if not recognized
224
+ */
225
+ export function inferMimeTypeFromFilename(filename) {
226
+ if (!filename)
227
+ return undefined;
228
+ const ext = filename.slice(filename.lastIndexOf('.')).toLowerCase();
229
+ return EXTENSION_TO_MIME[ext];
230
+ }
@@ -1,3 +1,4 @@
1
+ // TODO(v0.5.0): Remove this file. Consumer locking is no longer needed (one CoreProcess per TUI).
1
2
  import { getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
2
3
  // Consumer is considered stale after 30 seconds without heartbeat
3
4
  const STALE_TIMEOUT_MS = 30_000;
@@ -1,3 +1,4 @@
1
+ // TODO(v0.5.0): Remove this file. ConsumerService is replaced by CoreProcess → TaskProcessor.
1
2
  import { ProjectConfigStore } from '../../config/file-config-store.js';
2
3
  import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
3
4
  import { closeAgentStorage } from '../storage/agent-storage.js';
@@ -54,7 +54,12 @@ export declare class ExecutionConsumer {
54
54
  */
55
55
  stop(): void;
56
56
  /**
57
- * Execute a curate job
57
+ * Execute a curate job using the Plan Agent for orchestration.
58
+ *
59
+ * The Plan Agent orchestrates the curation workflow by:
60
+ * 1. Analyzing the user's request
61
+ * 2. Delegating to Query subagent to find existing context
62
+ * 3. Delegating to Curate subagent to create/update topics
58
63
  */
59
64
  private executeCurate;
60
65
  /**