salmon-loop 0.2.3

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 (655) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +144 -0
  3. package/README.zh-CN.md +144 -0
  4. package/dist/cli/argv/headless-detection.js +60 -0
  5. package/dist/cli/argv/print-mode.js +60 -0
  6. package/dist/cli/authorization/allowlist.js +908 -0
  7. package/dist/cli/authorization/non-interactive.js +166 -0
  8. package/dist/cli/authorization/provider.js +416 -0
  9. package/dist/cli/chat-interface.js +83 -0
  10. package/dist/cli/chat.js +492 -0
  11. package/dist/cli/cli-runtime-context.js +12 -0
  12. package/dist/cli/commander-error-adapter.js +35 -0
  13. package/dist/cli/commander-error-meta.js +13 -0
  14. package/dist/cli/commands/allowlist.js +270 -0
  15. package/dist/cli/commands/chat.js +120 -0
  16. package/dist/cli/commands/config.js +250 -0
  17. package/dist/cli/commands/context.js +57 -0
  18. package/dist/cli/commands/dispatcher.js +53 -0
  19. package/dist/cli/commands/exit.js +9 -0
  20. package/dist/cli/commands/llm-output.js +135 -0
  21. package/dist/cli/commands/log-mode.js +143 -0
  22. package/dist/cli/commands/mode.js +136 -0
  23. package/dist/cli/commands/new.js +18 -0
  24. package/dist/cli/commands/parallel.js +256 -0
  25. package/dist/cli/commands/queue.js +130 -0
  26. package/dist/cli/commands/registry.js +85 -0
  27. package/dist/cli/commands/restore.js +26 -0
  28. package/dist/cli/commands/run/assistant-message.js +14 -0
  29. package/dist/cli/commands/run/config-resolution.js +37 -0
  30. package/dist/cli/commands/run/early-errors.js +108 -0
  31. package/dist/cli/commands/run/execute.js +73 -0
  32. package/dist/cli/commands/run/extensions-resolution.js +22 -0
  33. package/dist/cli/commands/run/handler.js +434 -0
  34. package/dist/cli/commands/run/headless-error-writer.js +182 -0
  35. package/dist/cli/commands/run/instruction-guard.js +24 -0
  36. package/dist/cli/commands/run/loop-params.js +46 -0
  37. package/dist/cli/commands/run/mode.js +8 -0
  38. package/dist/cli/commands/run/parse-options.js +67 -0
  39. package/dist/cli/commands/run/persist-session.js +35 -0
  40. package/dist/cli/commands/run/preflight.js +156 -0
  41. package/dist/cli/commands/run/reporter-factory.js +52 -0
  42. package/dist/cli/commands/run/runtime-llm.js +56 -0
  43. package/dist/cli/commands/run/runtime-options.js +30 -0
  44. package/dist/cli/commands/run/session.js +19 -0
  45. package/dist/cli/commands/run/structured-output.js +106 -0
  46. package/dist/cli/commands/run/types.js +2 -0
  47. package/dist/cli/commands/run/validate-options.js +28 -0
  48. package/dist/cli/commands/run/verbose.js +36 -0
  49. package/dist/cli/commands/run.js +2 -0
  50. package/dist/cli/commands/serve.js +323 -0
  51. package/dist/cli/commands/session.js +77 -0
  52. package/dist/cli/commands/snapshot-interactive.js +165 -0
  53. package/dist/cli/commands/snapshot.js +159 -0
  54. package/dist/cli/commands/status.js +17 -0
  55. package/dist/cli/commands/subagent.js +178 -0
  56. package/dist/cli/commands/subcommand-suggestions.js +63 -0
  57. package/dist/cli/commands/tool-names.js +155 -0
  58. package/dist/cli/commands/types.js +2 -0
  59. package/dist/cli/commands/utils.js +42 -0
  60. package/dist/cli/config.js +16 -0
  61. package/dist/cli/crash-reporter.js +5 -0
  62. package/dist/cli/headless/anthropic-stream-normalized-encoder.js +164 -0
  63. package/dist/cli/headless/anthropic-stream-protocol.js +62 -0
  64. package/dist/cli/headless/json-protocol.js +124 -0
  65. package/dist/cli/headless/native-stream-normalized-encoder.js +206 -0
  66. package/dist/cli/headless/openai-responses-canonical-applier.js +94 -0
  67. package/dist/cli/headless/openai-responses-state.js +294 -0
  68. package/dist/cli/headless/openai-stream-encoder.js +152 -0
  69. package/dist/cli/headless/stdout-writer.js +9 -0
  70. package/dist/cli/headless/stream-json-protocol.js +136 -0
  71. package/dist/cli/index.js +8 -0
  72. package/dist/cli/locales/en.js +409 -0
  73. package/dist/cli/locales/index.js +7 -0
  74. package/dist/cli/program-bootstrap.js +14 -0
  75. package/dist/cli/program-commands.js +106 -0
  76. package/dist/cli/program-options.js +15 -0
  77. package/dist/cli/program-output-mode.js +11 -0
  78. package/dist/cli/program-parse.js +24 -0
  79. package/dist/cli/reporters/anthropic-stream.js +77 -0
  80. package/dist/cli/reporters/base.js +2 -0
  81. package/dist/cli/reporters/json.js +69 -0
  82. package/dist/cli/reporters/openai-stream.js +72 -0
  83. package/dist/cli/reporters/standard.js +226 -0
  84. package/dist/cli/reporters/stderr-log-reporter.js +71 -0
  85. package/dist/cli/reporters/stream-json.js +111 -0
  86. package/dist/cli/run-cli.js +25 -0
  87. package/dist/cli/slash/runtime.js +240 -0
  88. package/dist/cli/ui/App.js +273 -0
  89. package/dist/cli/ui/authorization/bus.js +35 -0
  90. package/dist/cli/ui/components/CommandInput.js +200 -0
  91. package/dist/cli/ui/components/CommandSuggestionList.js +20 -0
  92. package/dist/cli/ui/components/Markdown.js +423 -0
  93. package/dist/cli/ui/components/MessageList.js +34 -0
  94. package/dist/cli/ui/components/StatusBannerLine.js +7 -0
  95. package/dist/cli/ui/components/TodoDrawer.js +60 -0
  96. package/dist/cli/ui/components/WelcomeMessage.js +14 -0
  97. package/dist/cli/ui/components/animations/StretchingThinking.js +51 -0
  98. package/dist/cli/ui/components/animations/ThinkingWave.js +15 -0
  99. package/dist/cli/ui/components/animations/TypeIndicator.js +30 -0
  100. package/dist/cli/ui/components/layout/SplitPane.js +11 -0
  101. package/dist/cli/ui/components/messageList/MessageItem.js +27 -0
  102. package/dist/cli/ui/components/messageList/QueuePreviewList.js +11 -0
  103. package/dist/cli/ui/components/messageList/items/EmphasisMessageItem.js +20 -0
  104. package/dist/cli/ui/components/messageList/items/InterruptMessageItem.js +10 -0
  105. package/dist/cli/ui/components/messageList/items/LightweightMessageItem.js +12 -0
  106. package/dist/cli/ui/components/messageList/items/StandardMessageItem.js +23 -0
  107. package/dist/cli/ui/components/messageList/items/WelcomeMessageItem.js +7 -0
  108. package/dist/cli/ui/components/messageList/messageListLayout.js +27 -0
  109. package/dist/cli/ui/components/messageList/streaming.js +51 -0
  110. package/dist/cli/ui/components/messageList/types.js +2 -0
  111. package/dist/cli/ui/components/messageList/utils.js +7 -0
  112. package/dist/cli/ui/components/sidebar/FileContext.js +8 -0
  113. package/dist/cli/ui/components/sidebar/MissionControl.js +8 -0
  114. package/dist/cli/ui/config.js +59 -0
  115. package/dist/cli/ui/hooks/useCommandLifecycle.js +110 -0
  116. package/dist/cli/ui/hooks/useCommandSuggestions.js +87 -0
  117. package/dist/cli/ui/hooks/useInputHistory.js +57 -0
  118. package/dist/cli/ui/hooks/useLoopEvents.js +382 -0
  119. package/dist/cli/ui/hooks/useLoopState.js +73 -0
  120. package/dist/cli/ui/hooks/useOnionExit.js +31 -0
  121. package/dist/cli/ui/hooks/useTerminalDimensions.js +34 -0
  122. package/dist/cli/ui/index.js +136 -0
  123. package/dist/cli/ui/selection/bus.js +35 -0
  124. package/dist/cli/ui/status/formatStatusBanner.js +8 -0
  125. package/dist/cli/ui/store/context.js +17 -0
  126. package/dist/cli/ui/store/reducer.js +264 -0
  127. package/dist/cli/ui/store/types.js +81 -0
  128. package/dist/cli/ui/styles/theme.js +295 -0
  129. package/dist/cli/ui/types.js +2 -0
  130. package/dist/cli/ui/utils/sanitizer.js +122 -0
  131. package/dist/cli/ui/utils/transcript.js +28 -0
  132. package/dist/cli/utils/asyncQueue.js +125 -0
  133. package/dist/cli/utils/audit-scope.js +10 -0
  134. package/dist/cli/utils/detectors/index.js +38 -0
  135. package/dist/cli/utils/llm-output.js +34 -0
  136. package/dist/cli/utils/outcome-reporter.js +17 -0
  137. package/dist/cli/utils/safe-fs.js +184 -0
  138. package/dist/cli/utils/verify-resolver.js +34 -0
  139. package/dist/cli/utils/worktree-prepare-resolver.js +18 -0
  140. package/dist/core/adapters/fs/atomic-file-writer.js +129 -0
  141. package/dist/core/adapters/fs/file-adapter.js +95 -0
  142. package/dist/core/adapters/fs/filesystem.js +31 -0
  143. package/dist/core/adapters/fs/index.js +5 -0
  144. package/dist/core/adapters/fs/node-fs.js +7 -0
  145. package/dist/core/adapters/fs/readonly-filesystem.js +23 -0
  146. package/dist/core/adapters/git/git-adapter.js +704 -0
  147. package/dist/core/adapters/git/git-runner.js +119 -0
  148. package/dist/core/adapters/git/lock-manager.js +314 -0
  149. package/dist/core/adapters/git/types.js +2 -0
  150. package/dist/core/adapters/path/index.js +2 -0
  151. package/dist/core/adapters/path/path-adapter.js +23 -0
  152. package/dist/core/ast/guard.js +116 -0
  153. package/dist/core/ast/index.js +4 -0
  154. package/dist/core/ast/parser.js +284 -0
  155. package/dist/core/ast/validator.js +46 -0
  156. package/dist/core/backends/salmon-loop/task-executor.js +68 -0
  157. package/dist/core/checkpoint-domain/manifest-store.js +379 -0
  158. package/dist/core/checkpoint-domain/service.js +84 -0
  159. package/dist/core/checkpoint-domain/types.js +2 -0
  160. package/dist/core/config/defaults.js +50 -0
  161. package/dist/core/config/errors.js +11 -0
  162. package/dist/core/config/file-format.js +108 -0
  163. package/dist/core/config/index.js +7 -0
  164. package/dist/core/config/limits.js +77 -0
  165. package/dist/core/config/load.js +34 -0
  166. package/dist/core/config/normalize.js +35 -0
  167. package/dist/core/config/paths.js +20 -0
  168. package/dist/core/config/redact.js +16 -0
  169. package/dist/core/config/resolve-env.js +43 -0
  170. package/dist/core/config/resolve-llm.js +130 -0
  171. package/dist/core/config/resolve.js +68 -0
  172. package/dist/core/config/resolvers/ast-validation.js +8 -0
  173. package/dist/core/config/resolvers/context.js +21 -0
  174. package/dist/core/config/resolvers/observability.js +45 -0
  175. package/dist/core/config/resolvers/output.js +8 -0
  176. package/dist/core/config/resolvers/permission-mode.js +6 -0
  177. package/dist/core/config/resolvers/security.js +14 -0
  178. package/dist/core/config/resolvers/server.js +36 -0
  179. package/dist/core/config/resolvers/tool-authorization.js +39 -0
  180. package/dist/core/config/resolvers/ui.js +26 -0
  181. package/dist/core/config/types/config-file.js +2 -0
  182. package/dist/core/config/types/primitives.js +9 -0
  183. package/dist/core/config/types/resolved.js +2 -0
  184. package/dist/core/config/types.js +4 -0
  185. package/dist/core/config/validate.js +852 -0
  186. package/dist/core/context/assembly/default-prompt-assembler.js +7 -0
  187. package/dist/core/context/assembly/prompt-assembler.js +2 -0
  188. package/dist/core/context/ast/import-extractor.js +28 -0
  189. package/dist/core/context/ast/module-resolver.js +61 -0
  190. package/dist/core/context/ast/source-outline.js +25 -0
  191. package/dist/core/context/audit-constants.js +23 -0
  192. package/dist/core/context/audit.js +54 -0
  193. package/dist/core/context/budget/dynamic-adjuster.js +149 -0
  194. package/dist/core/context/budget/example-integration.js +49 -0
  195. package/dist/core/context/budget/integration.js +93 -0
  196. package/dist/core/context/builder.js +289 -0
  197. package/dist/core/context/cache/errors.js +16 -0
  198. package/dist/core/context/cache/incremental-updater.js +131 -0
  199. package/dist/core/context/cache/index.js +25 -0
  200. package/dist/core/context/cache/path-resolver.js +127 -0
  201. package/dist/core/context/cache/prompt-caching.js +207 -0
  202. package/dist/core/context/cache/store-factory.js +63 -0
  203. package/dist/core/context/cache/store.js +193 -0
  204. package/dist/core/context/cache/types.js +15 -0
  205. package/dist/core/context/compression/js-like-comments.js +139 -0
  206. package/dist/core/context/compression/smart-compress.js +61 -0
  207. package/dist/core/context/compression/whitespace.js +26 -0
  208. package/dist/core/context/dependencies.js +102 -0
  209. package/dist/core/context/effectiveness/index.js +25 -0
  210. package/dist/core/context/effectiveness/tracker.js +253 -0
  211. package/dist/core/context/effectiveness/types.js +15 -0
  212. package/dist/core/context/formatters/index.js +7 -0
  213. package/dist/core/context/formatters/json-converter.js +662 -0
  214. package/dist/core/context/formatters/types.js +6 -0
  215. package/dist/core/context/formatters/xml-context.js +296 -0
  216. package/dist/core/context/gatherers/architecture-gatherer.js +75 -0
  217. package/dist/core/context/gatherers/artifact-gatherer.js +53 -0
  218. package/dist/core/context/gatherers/ast-gatherer.js +370 -0
  219. package/dist/core/context/gatherers/ghost-dependency-gatherer.js +46 -0
  220. package/dist/core/context/gatherers/git-diff-gatherer.js +91 -0
  221. package/dist/core/context/gatherers/git-history-gatherer.js +57 -0
  222. package/dist/core/context/gatherers/knowledge-gatherer.js +101 -0
  223. package/dist/core/context/gatherers/metadata-gatherer.js +59 -0
  224. package/dist/core/context/gatherers/primary-text-gatherer.js +36 -0
  225. package/dist/core/context/gatherers/ripgrep-gatherer.js +104 -0
  226. package/dist/core/context/hash.js +52 -0
  227. package/dist/core/context/index.js +3 -0
  228. package/dist/core/context/keywords.js +179 -0
  229. package/dist/core/context/policies/budget-policy.js +36 -0
  230. package/dist/core/context/policies/pack-until-full.js +419 -0
  231. package/dist/core/context/scoring/relevance.js +191 -0
  232. package/dist/core/context/service-deps.js +32 -0
  233. package/dist/core/context/service-helpers.js +32 -0
  234. package/dist/core/context/service.js +265 -0
  235. package/dist/core/context/steps/context-budget.js +157 -0
  236. package/dist/core/context/steps/context-gather.js +71 -0
  237. package/dist/core/context/steps/context-primary.js +19 -0
  238. package/dist/core/context/steps/context-promotion.js +78 -0
  239. package/dist/core/context/steps/context-targets.js +85 -0
  240. package/dist/core/context/steps/types.js +2 -0
  241. package/dist/core/context/summarization/index.js +27 -0
  242. package/dist/core/context/summarization/prompts.js +80 -0
  243. package/dist/core/context/summarization/summarizer.js +377 -0
  244. package/dist/core/context/summarization/types.js +29 -0
  245. package/dist/core/context/targeting/churn-policy.js +27 -0
  246. package/dist/core/context/targeting/target-resolver.js +491 -0
  247. package/dist/core/context/token/adaptive-budget.js +364 -0
  248. package/dist/core/context/token/cache.js +163 -0
  249. package/dist/core/context/token/counter.js +190 -0
  250. package/dist/core/context/token/encoding-registry.js +173 -0
  251. package/dist/core/context/token/index.js +31 -0
  252. package/dist/core/context/token/token-budget.js +213 -0
  253. package/dist/core/context/token/types.js +10 -0
  254. package/dist/core/context/truncation/index.js +23 -0
  255. package/dist/core/context/truncation/semantic-truncator.js +103 -0
  256. package/dist/core/context/truncation/strategies/error-stack.js +94 -0
  257. package/dist/core/context/truncation/strategies/generic.js +48 -0
  258. package/dist/core/context/truncation/strategies/git-diff.js +99 -0
  259. package/dist/core/context/truncation/strategies/index.js +10 -0
  260. package/dist/core/context/truncation/strategies/json.js +142 -0
  261. package/dist/core/context/truncation/strategies/log.js +131 -0
  262. package/dist/core/context/truncation/strategies/test-result.js +140 -0
  263. package/dist/core/context/truncation/type-detector.js +133 -0
  264. package/dist/core/context/truncation/types.js +16 -0
  265. package/dist/core/context/types.js +2 -0
  266. package/dist/core/extensions/index.js +118 -0
  267. package/dist/core/extensions/load.js +36 -0
  268. package/dist/core/extensions/merge.js +29 -0
  269. package/dist/core/extensions/paths.js +40 -0
  270. package/dist/core/extensions/redact.js +37 -0
  271. package/dist/core/extensions/schemas.js +70 -0
  272. package/dist/core/extensions/types.js +2 -0
  273. package/dist/core/facades/cli-authorization-allowlist.js +3 -0
  274. package/dist/core/facades/cli-authorization-non-interactive.js +3 -0
  275. package/dist/core/facades/cli-authorization-provider.js +2 -0
  276. package/dist/core/facades/cli-chat.js +11 -0
  277. package/dist/core/facades/cli-command-allowlist.js +3 -0
  278. package/dist/core/facades/cli-command-chat.js +8 -0
  279. package/dist/core/facades/cli-command-checkpoint.js +3 -0
  280. package/dist/core/facades/cli-command-config.js +10 -0
  281. package/dist/core/facades/cli-command-dispatcher.js +2 -0
  282. package/dist/core/facades/cli-command-parallel.js +8 -0
  283. package/dist/core/facades/cli-command-session.js +2 -0
  284. package/dist/core/facades/cli-command-tool-names.js +6 -0
  285. package/dist/core/facades/cli-context.js +8 -0
  286. package/dist/core/facades/cli-headless.js +3 -0
  287. package/dist/core/facades/cli-observability.js +3 -0
  288. package/dist/core/facades/cli-program-bootstrap.js +2 -0
  289. package/dist/core/facades/cli-reporters.js +5 -0
  290. package/dist/core/facades/cli-run-execute.js +3 -0
  291. package/dist/core/facades/cli-run-handler.js +7 -0
  292. package/dist/core/facades/cli-run-headless-error-writer.js +2 -0
  293. package/dist/core/facades/cli-run-loop-params.js +2 -0
  294. package/dist/core/facades/cli-run-persist-session.js +2 -0
  295. package/dist/core/facades/cli-run-runtime-llm.js +5 -0
  296. package/dist/core/facades/cli-serve.js +21 -0
  297. package/dist/core/facades/cli-slash-runtime.js +9 -0
  298. package/dist/core/facades/cli-subagent.js +2 -0
  299. package/dist/core/facades/cli-ui.js +5 -0
  300. package/dist/core/facades/cli-utils-llm-output.js +3 -0
  301. package/dist/core/facades/cli-utils-path.js +2 -0
  302. package/dist/core/facades/cli-utils-worktree.js +2 -0
  303. package/dist/core/failure/diagnostics.js +221 -0
  304. package/dist/core/feedback/index.js +28 -0
  305. package/dist/core/feedback/parsers.js +59 -0
  306. package/dist/core/feedback/patterns.js +26 -0
  307. package/dist/core/feedback/types.js +2 -0
  308. package/dist/core/grizzco/domain/grizzco-types.js +41 -0
  309. package/dist/core/grizzco/dsl/DecisionEngine.js +149 -0
  310. package/dist/core/grizzco/dsl/MicroTaskRunner.js +39 -0
  311. package/dist/core/grizzco/dsl/llm-strategy.js +80 -0
  312. package/dist/core/grizzco/dsl/strategies.js +69 -0
  313. package/dist/core/grizzco/dsl/types.js +2 -0
  314. package/dist/core/grizzco/engine/observability/event-adapter.js +41 -0
  315. package/dist/core/grizzco/engine/observability/index.js +3 -0
  316. package/dist/core/grizzco/engine/observability/loop-telemetry.js +51 -0
  317. package/dist/core/grizzco/engine/outcome/index.js +2 -0
  318. package/dist/core/grizzco/engine/outcome/loop-result-mapper.js +167 -0
  319. package/dist/core/grizzco/engine/pipeline/pipeline.js +335 -0
  320. package/dist/core/grizzco/engine/pipeline/types.js +2 -0
  321. package/dist/core/grizzco/engine/transaction/attempt-failure.js +242 -0
  322. package/dist/core/grizzco/engine/transaction/authorization-summary.js +44 -0
  323. package/dist/core/grizzco/engine/transaction/index.js +3 -0
  324. package/dist/core/grizzco/engine/transaction/report-mapper.js +50 -0
  325. package/dist/core/grizzco/engine/transaction/retry-policy.js +19 -0
  326. package/dist/core/grizzco/engine/transaction/runner-builder.js +45 -0
  327. package/dist/core/grizzco/engine/transaction/session.js +58 -0
  328. package/dist/core/grizzco/engine/transaction/transaction-runner.js +193 -0
  329. package/dist/core/grizzco/engine/transaction/types.js +2 -0
  330. package/dist/core/grizzco/execution/Executor.js +58 -0
  331. package/dist/core/grizzco/execution/RejectionManager.js +71 -0
  332. package/dist/core/grizzco/execution/WorkerFactory.js +31 -0
  333. package/dist/core/grizzco/flows/SalmonLoopFlow.js +102 -0
  334. package/dist/core/grizzco/runtime/apply-back-runtime.js +136 -0
  335. package/dist/core/grizzco/runtime/apply-back-utils.js +13 -0
  336. package/dist/core/grizzco/runtime/host/host-runner.js +99 -0
  337. package/dist/core/grizzco/runtime/host/index.js +2 -0
  338. package/dist/core/grizzco/runtime/host/types.js +2 -0
  339. package/dist/core/grizzco/services/CachedService.js +42 -0
  340. package/dist/core/grizzco/services/implementations/default/GitConfigService.js +38 -0
  341. package/dist/core/grizzco/services/implementations/mock/MockLockService.js +11 -0
  342. package/dist/core/grizzco/services/implementations/mock/MockUserQuotaService.js +11 -0
  343. package/dist/core/grizzco/services/registry.js +30 -0
  344. package/dist/core/grizzco/services/types.js +2 -0
  345. package/dist/core/grizzco/steps/answer.js +75 -0
  346. package/dist/core/grizzco/steps/apply-back.js +46 -0
  347. package/dist/core/grizzco/steps/apply.js +136 -0
  348. package/dist/core/grizzco/steps/ast-validate.js +37 -0
  349. package/dist/core/grizzco/steps/audit.js +311 -0
  350. package/dist/core/grizzco/steps/context.js +74 -0
  351. package/dist/core/grizzco/steps/display-answer.js +6 -0
  352. package/dist/core/grizzco/steps/display-report.js +158 -0
  353. package/dist/core/grizzco/steps/display-research.js +6 -0
  354. package/dist/core/grizzco/steps/displayReview.js +6 -0
  355. package/dist/core/grizzco/steps/explore.js +245 -0
  356. package/dist/core/grizzco/steps/extractIssues.js +27 -0
  357. package/dist/core/grizzco/steps/generateFixPlan.js +13 -0
  358. package/dist/core/grizzco/steps/generateReview.js +71 -0
  359. package/dist/core/grizzco/steps/patch.js +220 -0
  360. package/dist/core/grizzco/steps/plan.js +191 -0
  361. package/dist/core/grizzco/steps/preflight.js +93 -0
  362. package/dist/core/grizzco/steps/prepare-deps.js +49 -0
  363. package/dist/core/grizzco/steps/read-only-shrink.js +4 -0
  364. package/dist/core/grizzco/steps/research.js +188 -0
  365. package/dist/core/grizzco/steps/rollback.js +138 -0
  366. package/dist/core/grizzco/steps/shrink.js +64 -0
  367. package/dist/core/grizzco/steps/validate.js +40 -0
  368. package/dist/core/grizzco/steps/verify.js +136 -0
  369. package/dist/core/grizzco/validation/AstValidationService.js +133 -0
  370. package/dist/core/grizzco/validation/ContextValidator.js +17 -0
  371. package/dist/core/grizzco/validation/ast-validation-policy.js +11 -0
  372. package/dist/core/grizzco/workers/direct-write-worker.js +44 -0
  373. package/dist/core/grizzco/workers/git-apply-worker.js +75 -0
  374. package/dist/core/grizzco/workers/i-merge-worker.js +2 -0
  375. package/dist/core/grizzco/workers/mm-three-way-worker.js +117 -0
  376. package/dist/core/grizzco/workers/no-op-worker.js +18 -0
  377. package/dist/core/grizzco/workers/overwrite-binary-worker.js +29 -0
  378. package/dist/core/grizzco/workers/strata-sync-worker.js +69 -0
  379. package/dist/core/grizzco/workers/three-way-merge-worker.js +84 -0
  380. package/dist/core/grizzco/workers/three-way-staged-worker.js +93 -0
  381. package/dist/core/grizzco/workers/union-merge-worker.js +71 -0
  382. package/dist/core/history/input-history.js +55 -0
  383. package/dist/core/intent/chat-intent.js +250 -0
  384. package/dist/core/interaction/events/bus.js +52 -0
  385. package/dist/core/interaction/model/events.js +2 -0
  386. package/dist/core/interaction/model/index.js +3 -0
  387. package/dist/core/interaction/model/task-state.js +9 -0
  388. package/dist/core/interaction/model/transition-policy.js +50 -0
  389. package/dist/core/interaction/model/types.js +2 -0
  390. package/dist/core/interaction/orchestration/facade.js +190 -0
  391. package/dist/core/interaction/orchestration/index.js +2 -0
  392. package/dist/core/interaction/orchestration/store.js +32 -0
  393. package/dist/core/interaction/sync/task-sync-engine.js +57 -0
  394. package/dist/core/interaction/turn-stop-reason.js +27 -0
  395. package/dist/core/language-support/index.js +3 -0
  396. package/dist/core/language-support/orchestrator.js +37 -0
  397. package/dist/core/language-support/strategies/extension-candidate-strategy.js +27 -0
  398. package/dist/core/language-support/strategies/index.js +3 -0
  399. package/dist/core/language-support/strategies/language-query-strategy.js +26 -0
  400. package/dist/core/llm/ai-sdk/chat-executor.js +88 -0
  401. package/dist/core/llm/ai-sdk/langfuse-headers.js +28 -0
  402. package/dist/core/llm/ai-sdk/message-mapper.js +240 -0
  403. package/dist/core/llm/ai-sdk/observation-context.js +16 -0
  404. package/dist/core/llm/ai-sdk/provider-factory.js +29 -0
  405. package/dist/core/llm/ai-sdk/request-params.js +18 -0
  406. package/dist/core/llm/ai-sdk/request-runtime.js +168 -0
  407. package/dist/core/llm/ai-sdk/result-mapper.js +31 -0
  408. package/dist/core/llm/ai-sdk/retry-classifier.js +82 -0
  409. package/dist/core/llm/ai-sdk/retry-executor.js +38 -0
  410. package/dist/core/llm/ai-sdk.js +92 -0
  411. package/dist/core/llm/audit.js +2 -0
  412. package/dist/core/llm/base-url.js +18 -0
  413. package/dist/core/llm/contracts/repair.js +68 -0
  414. package/dist/core/llm/errors.js +172 -0
  415. package/dist/core/llm/factory.js +21 -0
  416. package/dist/core/llm/http/index.js +2 -0
  417. package/dist/core/llm/index.js +6 -0
  418. package/dist/core/llm/message-composition.js +25 -0
  419. package/dist/core/llm/openai.js +69 -0
  420. package/dist/core/llm/output-policy.js +192 -0
  421. package/dist/core/llm/phase-router.js +55 -0
  422. package/dist/core/llm/redact.js +37 -0
  423. package/dist/core/llm/registry.js +81 -0
  424. package/dist/core/llm/retry-utils.js +114 -0
  425. package/dist/core/llm/stream-utils.js +87 -0
  426. package/dist/core/llm/utils.js +82 -0
  427. package/dist/core/observability/audit-file.js +199 -0
  428. package/dist/core/observability/audit-trail.js +125 -0
  429. package/dist/core/observability/authorization-decisions.js +54 -0
  430. package/dist/core/observability/debug-artifacts.js +61 -0
  431. package/dist/core/observability/error-envelope.js +63 -0
  432. package/dist/core/observability/error-mapping.js +271 -0
  433. package/dist/core/observability/ignored-error.js +6 -0
  434. package/dist/core/observability/logger.js +457 -0
  435. package/dist/core/observability/loop-event-reporter.js +46 -0
  436. package/dist/core/observability/monitor.js +240 -0
  437. package/dist/core/observability/run-outcome-reporter.js +15 -0
  438. package/dist/core/observability/token-usage.js +36 -0
  439. package/dist/core/observability/ui-log-sanitize.js +35 -0
  440. package/dist/core/patch/aggregator.js +93 -0
  441. package/dist/core/patch/diff.js +298 -0
  442. package/dist/core/permission-gate/default-gate.js +115 -0
  443. package/dist/core/permission-gate/gate.js +2 -0
  444. package/dist/core/permission-gate/types.js +2 -0
  445. package/dist/core/plan/index.js +2 -0
  446. package/dist/core/plan/manager.js +123 -0
  447. package/dist/core/plan/markdown-editor.js +238 -0
  448. package/dist/core/plan/storage.js +75 -0
  449. package/dist/core/plan/types.js +2 -0
  450. package/dist/core/plugin/interface.js +2 -0
  451. package/dist/core/plugin/loader.js +130 -0
  452. package/dist/core/plugin/registry.js +90 -0
  453. package/dist/core/plugin/validator.js +98 -0
  454. package/dist/core/prompts/registry.js +189 -0
  455. package/dist/core/prompts/runtime.js +69 -0
  456. package/dist/core/prompts/schema.js +2 -0
  457. package/dist/core/prompts/templates/phases/explore_user.hbs +26 -0
  458. package/dist/core/prompts/templates/phases/patch_user.hbs +57 -0
  459. package/dist/core/prompts/templates/phases/plan_user.hbs +33 -0
  460. package/dist/core/prompts/templates/system/_context_json_legend.hbs +21 -0
  461. package/dist/core/prompts/templates/system/_tool_defs.hbs +60 -0
  462. package/dist/core/prompts/templates/system/explore_system.hbs +26 -0
  463. package/dist/core/prompts/templates/system/main_system.hbs +18 -0
  464. package/dist/core/prompts/templates/system/patch_system.hbs +10 -0
  465. package/dist/core/prompts/templates/system/plan_system.hbs +1 -0
  466. package/dist/core/prompts/templates/system/reflection.hbs +39 -0
  467. package/dist/core/protocols/a2a/agent-card.js +30 -0
  468. package/dist/core/protocols/a2a/mapper.js +14 -0
  469. package/dist/core/protocols/a2a/sdk/auth-middleware.js +31 -0
  470. package/dist/core/protocols/a2a/sdk/executor.js +301 -0
  471. package/dist/core/protocols/a2a/sdk/server.js +24 -0
  472. package/dist/core/protocols/a2a/task-projection.js +45 -0
  473. package/dist/core/protocols/acp/acp-command-runner.js +204 -0
  474. package/dist/core/protocols/acp/acp-filesystem.js +43 -0
  475. package/dist/core/protocols/acp/checkpoint-meta.js +2 -0
  476. package/dist/core/protocols/acp/formal-agent.js +1201 -0
  477. package/dist/core/protocols/acp/handlers.js +51 -0
  478. package/dist/core/protocols/acp/permission-provider.js +122 -0
  479. package/dist/core/protocols/acp/stdio-server.js +116 -0
  480. package/dist/core/reflection/engine.js +55 -0
  481. package/dist/core/reflection/types.js +2 -0
  482. package/dist/core/runtime/agent-server-runtime.js +88 -0
  483. package/dist/core/runtime/bun-runtime.js +26 -0
  484. package/dist/core/runtime/command-runner-context.js +16 -0
  485. package/dist/core/runtime/exit-codes.js +11 -0
  486. package/dist/core/runtime/fastify-fetch-bridge.js +51 -0
  487. package/dist/core/runtime/fastify-server-bundle.js +26 -0
  488. package/dist/core/runtime/initialize.js +132 -0
  489. package/dist/core/runtime/loop-finalize.js +71 -0
  490. package/dist/core/runtime/loop-run-lifecycle.js +73 -0
  491. package/dist/core/runtime/loop-run-reporter.js +19 -0
  492. package/dist/core/runtime/loop-runtime-config.js +26 -0
  493. package/dist/core/runtime/loop-session-runner.js +30 -0
  494. package/dist/core/runtime/loop.js +84 -0
  495. package/dist/core/runtime/paths.js +84 -0
  496. package/dist/core/runtime/process-runner.js +16 -0
  497. package/dist/core/runtime/process-types.js +2 -0
  498. package/dist/core/runtime/semaphore.js +41 -0
  499. package/dist/core/runtime/sidecar-fastify-plugin.js +35 -0
  500. package/dist/core/runtime/sidecar-paths.js +47 -0
  501. package/dist/core/runtime/sidecar-route-catalog.js +103 -0
  502. package/dist/core/runtime/spawn-command.js +392 -0
  503. package/dist/core/runtime/spawn-interactive.js +71 -0
  504. package/dist/core/security/redaction.js +160 -0
  505. package/dist/core/session/compression.js +323 -0
  506. package/dist/core/session/flow.js +85 -0
  507. package/dist/core/session/manager.js +313 -0
  508. package/dist/core/session/pruning-strategy.js +153 -0
  509. package/dist/core/session/session-context-builder.js +122 -0
  510. package/dist/core/session/summary-sync.js +82 -0
  511. package/dist/core/session/token-tracker.js +82 -0
  512. package/dist/core/session/types.js +2 -0
  513. package/dist/core/skills/bridge.js +33 -0
  514. package/dist/core/skills/index.js +8 -0
  515. package/dist/core/skills/loader.js +80 -0
  516. package/dist/core/skills/parser.js +66 -0
  517. package/dist/core/skills/runtime/MicroTaskRunner.js +102 -0
  518. package/dist/core/skills/runtime/SkillRunner.js +108 -0
  519. package/dist/core/skills/strategy.js +29 -0
  520. package/dist/core/skills/types.js +2 -0
  521. package/dist/core/slash/index.js +6 -0
  522. package/dist/core/slash/parser.js +33 -0
  523. package/dist/core/slash/registry.js +78 -0
  524. package/dist/core/slash/router.js +76 -0
  525. package/dist/core/slash/steps/slash-decide.js +19 -0
  526. package/dist/core/slash/steps/slash-execute.js +73 -0
  527. package/dist/core/slash/steps/types.js +2 -0
  528. package/dist/core/slash/strategy.js +33 -0
  529. package/dist/core/slash/types.js +2 -0
  530. package/dist/core/strata/checkpoint/manager.js +492 -0
  531. package/dist/core/strata/checkpoint/snapshot-audit.js +88 -0
  532. package/dist/core/strata/checkpoint/snapshot-create.js +79 -0
  533. package/dist/core/strata/checkpoint/snapshot-write-tree.js +72 -0
  534. package/dist/core/strata/engine/shadow-merge-engine.js +394 -0
  535. package/dist/core/strata/index.js +15 -0
  536. package/dist/core/strata/interaction/content-guardian.js +59 -0
  537. package/dist/core/strata/interaction/file-system-provider.js +89 -0
  538. package/dist/core/strata/layers/file-state-resolver.js +157 -0
  539. package/dist/core/strata/layers/immutable-git-layer.js +42 -0
  540. package/dist/core/strata/layers/shadow-driver/copy-backend.js +114 -0
  541. package/dist/core/strata/layers/shadow-driver/env.js +29 -0
  542. package/dist/core/strata/layers/shadow-driver/error-classifier.js +41 -0
  543. package/dist/core/strata/layers/shadow-driver/index.js +17 -0
  544. package/dist/core/strata/layers/shadow-driver/readonly-lock.js +221 -0
  545. package/dist/core/strata/layers/shadow-driver/shadow-driver.js +234 -0
  546. package/dist/core/strata/layers/shadow-driver/strategy.js +86 -0
  547. package/dist/core/strata/layers/sidecar-layer.js +96 -0
  548. package/dist/core/strata/layers/worktree.js +240 -0
  549. package/dist/core/strata/runtime/environment.js +377 -0
  550. package/dist/core/strata/runtime/synchronizer.js +819 -0
  551. package/dist/core/strata/types.js +46 -0
  552. package/dist/core/streaming/canonical/canonical-responses-event-emitter.js +326 -0
  553. package/dist/core/streaming/canonical/function-call-item-id.js +13 -0
  554. package/dist/core/streaming/canonical/parts-from-llm-stream-chunk.js +54 -0
  555. package/dist/core/streaming/canonical/responses-event-emitter.js +127 -0
  556. package/dist/core/streaming/canonical/responses-events.js +2 -0
  557. package/dist/core/streaming/normalized-events.js +9 -0
  558. package/dist/core/streaming/normalized-from-text.js +47 -0
  559. package/dist/core/streaming/stream-assembler.js +347 -0
  560. package/dist/core/structured-output/index.js +3 -0
  561. package/dist/core/structured-output/json-extract.js +70 -0
  562. package/dist/core/structured-output/json-schema-validator.js +90 -0
  563. package/dist/core/structured-output/types.js +2 -0
  564. package/dist/core/sub-agent/artifacts/store.js +141 -0
  565. package/dist/core/sub-agent/artifacts/types.js +2 -0
  566. package/dist/core/sub-agent/controller.js +69 -0
  567. package/dist/core/sub-agent/core/loop.js +79 -0
  568. package/dist/core/sub-agent/core/manager.js +246 -0
  569. package/dist/core/sub-agent/registry-defaults.js +52 -0
  570. package/dist/core/sub-agent/registry.js +35 -0
  571. package/dist/core/sub-agent/tools/task-spawn.js +29 -0
  572. package/dist/core/sub-agent/types.js +23 -0
  573. package/dist/core/target-runtime/command-resolver.js +42 -0
  574. package/dist/core/target-runtime/index.js +3 -0
  575. package/dist/core/target-runtime/profile.js +73 -0
  576. package/dist/core/testgen/detector.js +17 -0
  577. package/dist/core/testgen/index.js +38 -0
  578. package/dist/core/testgen/templates.js +46 -0
  579. package/dist/core/tools/audit.js +140 -0
  580. package/dist/core/tools/authorization/types.js +2 -0
  581. package/dist/core/tools/budget.js +118 -0
  582. package/dist/core/tools/builtin/artifact.js +29 -0
  583. package/dist/core/tools/builtin/ast-grep.js +107 -0
  584. package/dist/core/tools/builtin/ast.js +62 -0
  585. package/dist/core/tools/builtin/code-search/backends/powershell.js +84 -0
  586. package/dist/core/tools/builtin/code-search/backends/rg.js +85 -0
  587. package/dist/core/tools/builtin/code-search/executor.js +87 -0
  588. package/dist/core/tools/builtin/code-search/parse/plain-grep.js +59 -0
  589. package/dist/core/tools/builtin/code-search/parse/rg-json.js +31 -0
  590. package/dist/core/tools/builtin/code-search/spec.js +82 -0
  591. package/dist/core/tools/builtin/fs.js +243 -0
  592. package/dist/core/tools/builtin/git.js +118 -0
  593. package/dist/core/tools/builtin/index.js +80 -0
  594. package/dist/core/tools/builtin/interaction.js +120 -0
  595. package/dist/core/tools/builtin/knowledge.js +98 -0
  596. package/dist/core/tools/builtin/plan.js +148 -0
  597. package/dist/core/tools/builtin/proposal.js +207 -0
  598. package/dist/core/tools/builtin/shell.js +71 -0
  599. package/dist/core/tools/builtin/verify.js +41 -0
  600. package/dist/core/tools/capability/executor.js +84 -0
  601. package/dist/core/tools/capability/runner.js +50 -0
  602. package/dist/core/tools/capability/types.js +2 -0
  603. package/dist/core/tools/dispatcher.js +80 -0
  604. package/dist/core/tools/headless-payload.js +37 -0
  605. package/dist/core/tools/loader.js +100 -0
  606. package/dist/core/tools/mapper.js +142 -0
  607. package/dist/core/tools/mcp/client.js +308 -0
  608. package/dist/core/tools/mcp/loader.js +110 -0
  609. package/dist/core/tools/mcp/schema.js +54 -0
  610. package/dist/core/tools/mcp/streamable-http.js +101 -0
  611. package/dist/core/tools/mcp/types.js +26 -0
  612. package/dist/core/tools/parallel/isolation.js +25 -0
  613. package/dist/core/tools/parallel/lock-manager.js +124 -0
  614. package/dist/core/tools/parallel/persistence.js +126 -0
  615. package/dist/core/tools/parallel/plan-builder.js +66 -0
  616. package/dist/core/tools/parallel/plan.js +2 -0
  617. package/dist/core/tools/parallel/refs.js +7 -0
  618. package/dist/core/tools/parallel/resolve-args.js +50 -0
  619. package/dist/core/tools/parallel/resource-helpers.js +35 -0
  620. package/dist/core/tools/parallel/resources.js +2 -0
  621. package/dist/core/tools/parallel/scheduler.js +372 -0
  622. package/dist/core/tools/parser.js +89 -0
  623. package/dist/core/tools/permissions/permission-rules.js +503 -0
  624. package/dist/core/tools/plugins/loader.js +102 -0
  625. package/dist/core/tools/policy.js +87 -0
  626. package/dist/core/tools/registry.js +29 -0
  627. package/dist/core/tools/router.js +514 -0
  628. package/dist/core/tools/sanitize.js +78 -0
  629. package/dist/core/tools/schema-utils.js +71 -0
  630. package/dist/core/tools/session.js +1105 -0
  631. package/dist/core/tools/streaming/ToolCallAccumulator.js +64 -0
  632. package/dist/core/tools/types.js +2 -0
  633. package/dist/core/types/authorization.js +2 -0
  634. package/dist/core/types/context.js +2 -0
  635. package/dist/core/types/errors.js +29 -0
  636. package/dist/core/types/execution.js +65 -0
  637. package/dist/core/types/index.js +9 -0
  638. package/dist/core/types/llm.js +9 -0
  639. package/dist/core/types/loop.js +2 -0
  640. package/dist/core/types/planning.js +2 -0
  641. package/dist/core/types/runtime.js +2 -0
  642. package/dist/core/types/usage.js +2 -0
  643. package/dist/core/ui/kaomoji.js +5 -0
  644. package/dist/core/utils/path.js +116 -0
  645. package/dist/core/utils/platform-shell.js +10 -0
  646. package/dist/core/utils/sanitizer.js +107 -0
  647. package/dist/core/verification/runner.js +265 -0
  648. package/dist/integrations/langfuse/litellm-langfuse-outcome-reporter.js +272 -0
  649. package/dist/integrations/langfuse/outcome-proxy.js +68 -0
  650. package/dist/interfaces/cli/task-runner.js +11 -0
  651. package/dist/languages/typescript/index.js +178 -0
  652. package/dist/locales/en.js +679 -0
  653. package/dist/locales/index.js +11 -0
  654. package/dist/utils/eol.js +35 -0
  655. package/package.json +153 -0
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Pack-Until-Full budget policy.
3
+ *
4
+ * Packs context items by priority until budget is exhausted.
5
+ * Supports both character-based (legacy) and token-based (accurate) budgeting.
6
+ */
7
+ import { text } from '../../../locales/index.js';
8
+ import { LIMITS } from '../../config/limits.js';
9
+ import { normalizePath } from '../../utils/path.js';
10
+ import { TokenBudgetCalculator } from '../token/token-budget.js';
11
+ /**
12
+ * Character-based budget calculator (legacy).
13
+ */
14
+ class CharBudgetCalculator {
15
+ count(text) {
16
+ return text.length;
17
+ }
18
+ calculateTotalTokens(context) {
19
+ const primary = context.primaryText?.length ?? 0;
20
+ const related = context.relatedFiles?.reduce((sum, file) => sum + (file.content?.length ?? 0), 0) ?? 0;
21
+ const snippets = context.rgSnippets.reduce((sum, snippet) => sum + (snippet.content?.length ?? 0), 0);
22
+ const diff = (context.gitDiff?.length ?? 0) +
23
+ (context.stagedDiff?.length ?? 0) +
24
+ (context.unstagedDiff?.length ?? 0) +
25
+ (context.untrackedDiff?.length ?? 0);
26
+ return primary + related + snippets + diff;
27
+ }
28
+ calculateDiffTokens(context) {
29
+ return ((context.gitDiff?.length ?? 0) +
30
+ (context.stagedDiff?.length ?? 0) +
31
+ (context.unstagedDiff?.length ?? 0) +
32
+ (context.untrackedDiff?.length ?? 0));
33
+ }
34
+ calculateFileTokens(file) {
35
+ return file.content?.length ?? 0;
36
+ }
37
+ calculateSnippetTokens(snippet) {
38
+ return snippet.content?.length ?? 0;
39
+ }
40
+ getDefaultBudget() {
41
+ return LIMITS.maxContextChars;
42
+ }
43
+ getMinBudget() {
44
+ return LIMITS.minContextChars;
45
+ }
46
+ }
47
+ /**
48
+ * Adapter for TokenBudgetCalculator.
49
+ */
50
+ class TokenBudgetAdapter {
51
+ calculator;
52
+ constructor(calculator) {
53
+ this.calculator = calculator;
54
+ }
55
+ count(text) {
56
+ return this.calculator.count(text);
57
+ }
58
+ calculateTotalTokens(context) {
59
+ return this.calculator.calculateTotalTokens(context);
60
+ }
61
+ calculateDiffTokens(context) {
62
+ return this.calculator.calculateDiffTokens(context);
63
+ }
64
+ calculateFileTokens(file) {
65
+ return this.calculator.calculateFileTokens(file);
66
+ }
67
+ calculateSnippetTokens(snippet) {
68
+ return this.calculator.calculateSnippetTokens(snippet);
69
+ }
70
+ getDefaultBudget() {
71
+ return this.calculator.getDefaultBudget();
72
+ }
73
+ getMinBudget() {
74
+ return this.calculator.getMinBudget();
75
+ }
76
+ }
77
+ /**
78
+ * Create budget calculator based on mode.
79
+ */
80
+ export function createBudgetCalculator(tokenCalculator) {
81
+ if (tokenCalculator) {
82
+ return new TokenBudgetAdapter(tokenCalculator);
83
+ }
84
+ return new CharBudgetCalculator();
85
+ }
86
+ /**
87
+ * Budget allocation strategy with partitioned quotas.
88
+ * Ensures critical content always has guaranteed space.
89
+ */
90
+ function truncateWithMarker(content, maxUnits, minUnits, calculator) {
91
+ if (maxUnits < minUnits)
92
+ return undefined;
93
+ const contentUnits = calculator.count(content);
94
+ if (contentUnits <= maxUnits)
95
+ return content;
96
+ const marker = `\n${text.context.contentTruncated}\n`;
97
+ const markerUnits = calculator.count(marker);
98
+ const maxSliceUnits = Math.max(0, maxUnits - markerUnits);
99
+ if (maxSliceUnits < minUnits) {
100
+ // Simple truncation without marker
101
+ const ratio = maxUnits / contentUnits;
102
+ const sliceLen = Math.floor(content.length * ratio);
103
+ return content.substring(0, sliceLen);
104
+ }
105
+ const ratio = maxSliceUnits / contentUnits;
106
+ const sliceLen = Math.floor(content.length * ratio);
107
+ return `${content.substring(0, sliceLen)}${marker}`;
108
+ }
109
+ function buildTargetSet(context) {
110
+ const set = new Set();
111
+ for (const t of context.targets ?? []) {
112
+ const key = normalizePath(t.path).replace(/^(\.\/|\/)+/, '');
113
+ if (key)
114
+ set.add(key);
115
+ }
116
+ if (context.primaryFile) {
117
+ const key = normalizePath(context.primaryFile).replace(/^(\.\/|\/)+/, '');
118
+ if (key)
119
+ set.add(key);
120
+ }
121
+ return set;
122
+ }
123
+ /**
124
+ * Singleton token calculator for default usage.
125
+ * Initialized lazily on first use.
126
+ */
127
+ let defaultTokenCalculator = null;
128
+ let initializationPromise = null;
129
+ let useTokenBudget = true; // Default to true
130
+ /**
131
+ * Set whether to use token budget by default.
132
+ * Can be controlled via config.context.useTokenBudget.
133
+ */
134
+ export function setUseTokenBudget(enabled) {
135
+ useTokenBudget = enabled;
136
+ }
137
+ /**
138
+ * Set model for adaptive budget calculation.
139
+ * This updates budget limits based on model capabilities.
140
+ */
141
+ export function setDefaultModel(modelId) {
142
+ if (defaultTokenCalculator) {
143
+ defaultTokenCalculator.setModel(modelId);
144
+ }
145
+ }
146
+ /**
147
+ * Get or create the default token calculator.
148
+ * Initializes on first call.
149
+ */
150
+ async function getDefaultTokenCalculator() {
151
+ if (defaultTokenCalculator) {
152
+ return defaultTokenCalculator;
153
+ }
154
+ if (!initializationPromise) {
155
+ initializationPromise = (async () => {
156
+ defaultTokenCalculator = new TokenBudgetCalculator();
157
+ await defaultTokenCalculator.initialize();
158
+ })();
159
+ }
160
+ await initializationPromise;
161
+ return defaultTokenCalculator;
162
+ }
163
+ /**
164
+ * Create default budget calculator.
165
+ * Uses token-based calculation by default for accuracy.
166
+ * Falls back to char-based if token calculator initialization fails or disabled.
167
+ */
168
+ function createDefaultCalculator() {
169
+ // If token budget is disabled, use char calculator
170
+ if (!useTokenBudget) {
171
+ return new CharBudgetCalculator();
172
+ }
173
+ // Return a lazy-initializing adapter
174
+ return {
175
+ count(text) {
176
+ if (defaultTokenCalculator?.mode === 'token') {
177
+ return defaultTokenCalculator.count(text);
178
+ }
179
+ // Fallback to char-based estimation
180
+ return Math.ceil(text.length / 4);
181
+ },
182
+ calculateTotalTokens(context) {
183
+ if (defaultTokenCalculator?.mode === 'token') {
184
+ return defaultTokenCalculator.calculateTotalTokens(context);
185
+ }
186
+ return new CharBudgetCalculator().calculateTotalTokens(context);
187
+ },
188
+ calculateDiffTokens(context) {
189
+ if (defaultTokenCalculator?.mode === 'token') {
190
+ return defaultTokenCalculator.calculateDiffTokens(context);
191
+ }
192
+ return new CharBudgetCalculator().calculateDiffTokens(context);
193
+ },
194
+ calculateFileTokens(file) {
195
+ if (defaultTokenCalculator?.mode === 'token') {
196
+ return defaultTokenCalculator.calculateFileTokens(file);
197
+ }
198
+ return file.content?.length ?? 0;
199
+ },
200
+ calculateSnippetTokens(snippet) {
201
+ if (defaultTokenCalculator?.mode === 'token') {
202
+ return defaultTokenCalculator.calculateSnippetTokens(snippet);
203
+ }
204
+ return snippet.content?.length ?? 0;
205
+ },
206
+ getDefaultBudget() {
207
+ if (defaultTokenCalculator?.mode === 'token') {
208
+ return defaultTokenCalculator.getDefaultBudget();
209
+ }
210
+ return LIMITS.maxContextChars;
211
+ },
212
+ getMinBudget() {
213
+ if (defaultTokenCalculator?.mode === 'token') {
214
+ return defaultTokenCalculator.getMinBudget();
215
+ }
216
+ return LIMITS.minContextChars;
217
+ },
218
+ };
219
+ }
220
+ /**
221
+ * Initialize the default token calculator.
222
+ * Call this at application startup for best performance.
223
+ */
224
+ export async function initializeDefaultCalculator() {
225
+ await getDefaultTokenCalculator();
226
+ }
227
+ /**
228
+ * Pack context items until budget is exhausted.
229
+ *
230
+ * @param context - Context to pack
231
+ * @param budget - Budget in tokens/chars (defaults to calculator's default)
232
+ * @param calculator - Budget calculator (defaults to token-based)
233
+ */
234
+ export function packUntilFull(context, budget, calculator) {
235
+ const calc = calculator ?? createDefaultCalculator();
236
+ const budgetUnits = budget ?? calc.getDefaultBudget();
237
+ const totalUnits = calc.calculateTotalTokens(context);
238
+ if (totalUnits <= budgetUnits) {
239
+ return { context, truncated: false };
240
+ }
241
+ const primaryUnits = calc.count(context.primaryText ?? '');
242
+ const diffUnits = calc.calculateDiffTokens(context);
243
+ // Calculate minimum guaranteed budgets for critical content
244
+ // Ensure diffs get at least what they need (up to 30% of budget)
245
+ const minDiffBudget = diffUnits > 0 ? Math.min(diffUnits, Math.floor(budgetUnits * 0.3)) : 0;
246
+ const minTargetBudget = Math.floor(budgetUnits * 0.1); // Guarantee 10% for targets
247
+ const remainingUnits = budgetUnits - primaryUnits;
248
+ if (remainingUnits <= 0) {
249
+ const emergencyDiffBudget = diffUnits > 0 ? Math.max(1, Math.min(diffUnits, Math.floor(budgetUnits * 0.1))) : 0;
250
+ const minDiffUnits = Math.min(calc.count('x'.repeat(16)), Math.max(1, emergencyDiffBudget));
251
+ let remainingDiffUnits = emergencyDiffBudget;
252
+ const stagedDiff = context.stagedDiff
253
+ ? truncateWithMarker(context.stagedDiff, remainingDiffUnits, minDiffUnits, calc)
254
+ : undefined;
255
+ if (stagedDiff)
256
+ remainingDiffUnits = Math.max(0, remainingDiffUnits - calc.count(stagedDiff));
257
+ const unstagedDiff = context.unstagedDiff
258
+ ? truncateWithMarker(context.unstagedDiff, remainingDiffUnits, minDiffUnits, calc)
259
+ : undefined;
260
+ if (unstagedDiff) {
261
+ remainingDiffUnits = Math.max(0, remainingDiffUnits - calc.count(unstagedDiff));
262
+ }
263
+ const gitDiff = !stagedDiff && !unstagedDiff && context.gitDiff
264
+ ? truncateWithMarker(context.gitDiff, remainingDiffUnits, minDiffUnits, calc)
265
+ : undefined;
266
+ if (gitDiff)
267
+ remainingDiffUnits = Math.max(0, remainingDiffUnits - calc.count(gitDiff));
268
+ const untrackedDiff = context.untrackedDiff
269
+ ? truncateWithMarker(context.untrackedDiff, remainingDiffUnits, minDiffUnits, calc)
270
+ : undefined;
271
+ return {
272
+ context: {
273
+ ...context,
274
+ relatedFiles: [],
275
+ rgSnippets: [],
276
+ gitDiff,
277
+ stagedDiff,
278
+ unstagedDiff,
279
+ untrackedDiff,
280
+ },
281
+ truncated: true,
282
+ };
283
+ }
284
+ // Reserve budget for diffs and targets
285
+ const reservedForDiff = Math.max(minDiffBudget, 0);
286
+ const reservedForTargets = Math.max(minTargetBudget, 0);
287
+ let remainingForContent = Math.max(0, remainingUnits - reservedForDiff - reservedForTargets);
288
+ const targetSet = buildTargetSet(context);
289
+ // Respect pre-sorted order from relevance ranking
290
+ const relatedFiles = context.relatedFiles ?? [];
291
+ const truncatedRelated = [];
292
+ let usedTargetBudget = 0;
293
+ // Pack related files (targets use reserved budget, others use remaining)
294
+ for (const file of relatedFiles) {
295
+ const isTarget = targetSet.has(normalizePath(file.path).replace(/^(\.\/|\/)+/, ''));
296
+ const fileUnits = calc.calculateFileTokens(file);
297
+ // Determine available budget
298
+ const availableBudget = isTarget
299
+ ? Math.max(0, reservedForTargets - usedTargetBudget) + remainingForContent
300
+ : remainingForContent;
301
+ if (fileUnits <= availableBudget) {
302
+ truncatedRelated.push(file);
303
+ if (isTarget) {
304
+ const fromTargetReserve = Math.min(fileUnits, Math.max(0, reservedForTargets - usedTargetBudget));
305
+ usedTargetBudget += fromTargetReserve;
306
+ remainingForContent -= fileUnits - fromTargetReserve;
307
+ }
308
+ else {
309
+ remainingForContent -= fileUnits;
310
+ }
311
+ continue;
312
+ }
313
+ const outline = file.outline;
314
+ const outlineUnits = outline ? calc.count(outline) : 0;
315
+ const minSnippetUnits = calc.count('x'.repeat(LIMITS.minSnippetChars));
316
+ if (outline && outlineUnits <= availableBudget && outlineUnits >= minSnippetUnits) {
317
+ const outlineContent = `${outline}\n\n${text.context.relatedContentTruncated}`;
318
+ truncatedRelated.push({
319
+ ...file,
320
+ mode: 'outline',
321
+ content: outlineContent,
322
+ outline: undefined,
323
+ });
324
+ const outlineSize = calc.count(outlineContent);
325
+ if (isTarget) {
326
+ usedTargetBudget += outlineSize;
327
+ }
328
+ else {
329
+ remainingForContent -= outlineSize;
330
+ }
331
+ continue;
332
+ }
333
+ // Force include target outline even if over budget
334
+ if (isTarget && outline && outlineUnits >= minSnippetUnits) {
335
+ const outlineContent = `${outline}\n\n${text.context.relatedContentTruncated}`;
336
+ truncatedRelated.push({
337
+ ...file,
338
+ mode: 'outline',
339
+ content: outlineContent,
340
+ outline: undefined,
341
+ });
342
+ continue;
343
+ }
344
+ if (availableBudget >= minSnippetUnits) {
345
+ const ratio = availableBudget / fileUnits;
346
+ const sliceLen = Math.floor((file.content?.length ?? 0) * ratio);
347
+ truncatedRelated.push({
348
+ ...file,
349
+ mode: 'outline',
350
+ content: file.content?.substring(0, sliceLen) ?? '',
351
+ outline: undefined,
352
+ });
353
+ if (isTarget) {
354
+ usedTargetBudget += availableBudget;
355
+ }
356
+ else {
357
+ remainingForContent = 0;
358
+ }
359
+ }
360
+ break;
361
+ }
362
+ // Add unused target budget back to content budget
363
+ remainingForContent += Math.max(0, reservedForTargets - usedTargetBudget);
364
+ const snippets = context.rgSnippets;
365
+ const truncatedSnippets = [];
366
+ for (const snippet of snippets) {
367
+ const snippetUnits = calc.calculateSnippetTokens(snippet);
368
+ if (snippetUnits <= remainingForContent) {
369
+ truncatedSnippets.push(snippet);
370
+ remainingForContent -= snippetUnits;
371
+ continue;
372
+ }
373
+ const minSnippetUnits = calc.count('x'.repeat(LIMITS.minSnippetChars));
374
+ if (remainingForContent >= minSnippetUnits) {
375
+ const ratio = remainingForContent / snippetUnits;
376
+ const sliceLen = Math.floor((snippet.content?.length ?? 0) * ratio);
377
+ truncatedSnippets.push({
378
+ ...snippet,
379
+ content: snippet.content?.substring(0, sliceLen) ?? '',
380
+ });
381
+ }
382
+ break;
383
+ }
384
+ // Pack diffs using reserved budget
385
+ let remainingDiffUnits = reservedForDiff;
386
+ // Minimum diff budget - adjust based on available budget
387
+ const minDiffUnits = Math.min(calc.count('x'.repeat(32)), Math.max(1, remainingDiffUnits));
388
+ const stagedDiff = context.stagedDiff
389
+ ? truncateWithMarker(context.stagedDiff, remainingDiffUnits, minDiffUnits, calc)
390
+ : undefined;
391
+ if (stagedDiff)
392
+ remainingDiffUnits = Math.max(0, remainingDiffUnits - calc.count(stagedDiff));
393
+ const unstagedDiff = context.unstagedDiff
394
+ ? truncateWithMarker(context.unstagedDiff, remainingDiffUnits, minDiffUnits, calc)
395
+ : undefined;
396
+ if (unstagedDiff)
397
+ remainingDiffUnits = Math.max(0, remainingDiffUnits - calc.count(unstagedDiff));
398
+ const gitDiff = !stagedDiff && !unstagedDiff && context.gitDiff
399
+ ? truncateWithMarker(context.gitDiff, remainingDiffUnits, minDiffUnits, calc)
400
+ : undefined;
401
+ if (gitDiff)
402
+ remainingDiffUnits -= calc.count(gitDiff);
403
+ const untrackedDiff = context.untrackedDiff
404
+ ? truncateWithMarker(context.untrackedDiff, remainingDiffUnits, minDiffUnits, calc)
405
+ : undefined;
406
+ return {
407
+ context: {
408
+ ...context,
409
+ relatedFiles: truncatedRelated,
410
+ rgSnippets: truncatedSnippets,
411
+ stagedDiff,
412
+ unstagedDiff,
413
+ gitDiff,
414
+ untrackedDiff,
415
+ },
416
+ truncated: true,
417
+ };
418
+ }
419
+ //# sourceMappingURL=pack-until-full.js.map
@@ -0,0 +1,191 @@
1
+ import { normalizePath } from '../../utils/path.js';
2
+ function extractChangedFilesFromDiffText(diffText) {
3
+ const out = new Set();
4
+ if (!diffText)
5
+ return out;
6
+ const re = /^diff --git a\/(.+?) b\/(.+?)$/gm;
7
+ let match;
8
+ while ((match = re.exec(diffText)) !== null) {
9
+ const file = normalizePath(match[2] || match[1] || '').replace(/^(\.\/|\/)+/, '');
10
+ if (file)
11
+ out.add(file);
12
+ }
13
+ return out;
14
+ }
15
+ function buildTargetSet(context) {
16
+ const out = new Set();
17
+ for (const t of context.targets ?? []) {
18
+ const p = normalizePath(t.path).replace(/^(\.\/|\/)+/, '');
19
+ if (p)
20
+ out.add(p);
21
+ }
22
+ if (context.primaryFile) {
23
+ const p = normalizePath(context.primaryFile).replace(/^(\.\/|\/)+/, '');
24
+ if (p)
25
+ out.add(p);
26
+ }
27
+ return out;
28
+ }
29
+ function extractKeywords(instruction) {
30
+ if (!instruction)
31
+ return [];
32
+ // Basic keyword extraction: split by non-alphanumeric, filter short words
33
+ return instruction
34
+ .toLowerCase()
35
+ .split(/[^a-z0-9_]/)
36
+ .filter((word) => word.length >= 3);
37
+ }
38
+ /**
39
+ * Compute a granular relevance score for a related file.
40
+ */
41
+ function computeRelatedFileScore(params) {
42
+ const { file, changedFiles, isTarget, repoMap, symbolMap, keywords, primaryFile } = params;
43
+ const normalizedPath = normalizePath(file.path).replace(/^(\.\/|\/)+/, '');
44
+ let score = 50;
45
+ // 1. Kind-based scoring
46
+ if (file.kind === 'import') {
47
+ score = changedFiles.has(normalizedPath) ? 90 : 60;
48
+ }
49
+ else if (file.kind === 'failed') {
50
+ score = 95;
51
+ }
52
+ else if (file.kind === 'dependency') {
53
+ score = changedFiles.has(normalizedPath) ? 85 : 55;
54
+ }
55
+ // 2. Explicit Target Bonus
56
+ if (isTarget) {
57
+ if (file.kind === 'failed') {
58
+ score = 98;
59
+ }
60
+ else {
61
+ score = Math.min(97, score + 30);
62
+ }
63
+ }
64
+ // 3. RepoMap Depth Penalty
65
+ if (repoMap) {
66
+ const node = repoMap.nodes.find((n) => normalizePath(n.path).replace(/^(\.\/|\/)+/, '') === normalizedPath);
67
+ if (node) {
68
+ score -= node.depth * 5;
69
+ }
70
+ else if (repoMap.nodes.length > 0) {
71
+ score -= 15;
72
+ }
73
+ }
74
+ // 4. Instruction Keyword Bonus (Path-based)
75
+ const fileNameLower = normalizedPath.toLowerCase();
76
+ const pathTokens = fileNameLower.split(/[^a-z0-9]/).filter((t) => t.length >= 3);
77
+ for (const kw of keywords) {
78
+ const matchesPath = pathTokens.some((t) => kw.includes(t) || t.includes(kw));
79
+ if (matchesPath) {
80
+ score += 15;
81
+ break;
82
+ }
83
+ }
84
+ // 5. Symbol Analysis
85
+ if (symbolMap) {
86
+ const fileSymbols = symbolMap.nodes.filter((n) => n.path && normalizePath(n.path).replace(/^(\.\/|\/)+/, '') === normalizedPath);
87
+ const hasDefinition = fileSymbols.some((n) => n.kind === 'definition');
88
+ if (hasDefinition) {
89
+ score += 10;
90
+ }
91
+ // 6. Instruction Keyword Bonus (Symbol-based)
92
+ for (const kw of keywords) {
93
+ const matchesSymbol = fileSymbols.some((s) => {
94
+ const symLower = s.name.toLowerCase();
95
+ return symLower.includes(kw) || kw.includes(symLower);
96
+ });
97
+ if (matchesSymbol) {
98
+ score += 10;
99
+ break;
100
+ }
101
+ }
102
+ // 7. Call Density Bonus
103
+ if (primaryFile) {
104
+ const normalizedPrimary = normalizePath(primaryFile).replace(/^(\.\/|\/)+/, '');
105
+ const callCount = symbolMap.edges.filter((e) => {
106
+ if (e.type !== 'call')
107
+ return false;
108
+ const fromNode = symbolMap.nodes.find((n) => n.id === e.from);
109
+ const toNode = symbolMap.nodes.find((n) => n.id === e.to);
110
+ return (fromNode?.path &&
111
+ normalizePath(fromNode.path).replace(/^(\.\/|\/)+/, '') === normalizedPrimary &&
112
+ toNode?.path &&
113
+ normalizePath(toNode.path).replace(/^(\.\/|\/)+/, '') === normalizedPath);
114
+ }).length;
115
+ if (callCount > 0) {
116
+ score += Math.min(15, callCount * 3);
117
+ }
118
+ }
119
+ }
120
+ return score;
121
+ }
122
+ function stableSortByScore(items, getScore, getTieKey) {
123
+ return [...items].sort((a, b) => {
124
+ const sa = getScore(a);
125
+ const sb = getScore(b);
126
+ if (sa !== sb)
127
+ return sb - sa;
128
+ return getTieKey(a).localeCompare(getTieKey(b));
129
+ });
130
+ }
131
+ function rankRelatedFiles(related, changedFiles, targetSet, repoMap, symbolMap, keywords, primaryFile) {
132
+ if (!related)
133
+ return related;
134
+ return stableSortByScore(related, (f) => computeRelatedFileScore({
135
+ file: f,
136
+ changedFiles,
137
+ isTarget: targetSet.has(normalizePath(f.path).replace(/^(\.\/|\/)+/, '')),
138
+ repoMap,
139
+ symbolMap,
140
+ keywords,
141
+ primaryFile,
142
+ }), (f) => normalizePath(f.path).replace(/^(\.\/|\/)+/, ''));
143
+ }
144
+ function rankSnippets(snippets, targetSet) {
145
+ if (!snippets || snippets.length === 0)
146
+ return snippets;
147
+ const freq = new Map();
148
+ for (const s of snippets) {
149
+ const key = normalizePath(s.file).replace(/^(\.\/|\/)+/, '');
150
+ freq.set(key, (freq.get(key) ?? 0) + 1);
151
+ }
152
+ return [...snippets].sort((a, b) => {
153
+ const aPath = normalizePath(a.file).replace(/^(\.\/|\/)+/, '');
154
+ const bPath = normalizePath(b.file).replace(/^(\.\/|\/)+/, '');
155
+ const aIsTarget = targetSet.has(aPath);
156
+ const bIsTarget = targetSet.has(bPath);
157
+ if (aIsTarget !== bIsTarget)
158
+ return aIsTarget ? -1 : 1;
159
+ const fa = freq.get(aPath) ?? 0;
160
+ const fb = freq.get(bPath) ?? 0;
161
+ if (fa !== fb)
162
+ return fb - fa;
163
+ if (a.file !== b.file)
164
+ return a.file.localeCompare(b.file);
165
+ return a.line - b.line;
166
+ });
167
+ }
168
+ /**
169
+ * Ranks context items by relevance to the primary task and instruction.
170
+ *
171
+ * This implementation uses a multi-factor scoring engine (Semantic Probe) that considers:
172
+ * - Direct targets and diffs
173
+ * - AST symbol density and call frequency
174
+ * - Instruction keyword alignment
175
+ * - Dependency graph distance
176
+ */
177
+ export function rankContextForRelevance(context) {
178
+ const changed = new Set([
179
+ ...extractChangedFilesFromDiffText(context.stagedDiff),
180
+ ...extractChangedFilesFromDiffText(context.unstagedDiff),
181
+ ...extractChangedFilesFromDiffText(context.gitDiff),
182
+ ]);
183
+ const targetSet = buildTargetSet(context);
184
+ const keywords = extractKeywords(context.instruction);
185
+ return {
186
+ ...context,
187
+ relatedFiles: rankRelatedFiles(context.relatedFiles, changed, targetSet, context.repoMap, context.symbolMap, keywords, context.primaryFile),
188
+ rgSnippets: rankSnippets(context.rgSnippets, targetSet),
189
+ };
190
+ }
191
+ //# sourceMappingURL=relevance.js.map
@@ -0,0 +1,32 @@
1
+ import { DefaultPromptAssembler } from './assembly/default-prompt-assembler.js';
2
+ import { PromptCachingManager } from './cache/prompt-caching.js';
3
+ import { ArchitectureGatherer } from './gatherers/architecture-gatherer.js';
4
+ import { ArtifactGatherer } from './gatherers/artifact-gatherer.js';
5
+ import { AstGatherer } from './gatherers/ast-gatherer.js';
6
+ import { GhostDependencyGatherer } from './gatherers/ghost-dependency-gatherer.js';
7
+ import { GitDiffGatherer } from './gatherers/git-diff-gatherer.js';
8
+ import { GitHistoryGatherer } from './gatherers/git-history-gatherer.js';
9
+ import { KnowledgeGatherer } from './gatherers/knowledge-gatherer.js';
10
+ import { MetadataGatherer } from './gatherers/metadata-gatherer.js';
11
+ import { PrimaryTextGatherer } from './gatherers/primary-text-gatherer.js';
12
+ import { RipgrepGatherer } from './gatherers/ripgrep-gatherer.js';
13
+ import { TargetResolver } from './targeting/target-resolver.js';
14
+ export function defaultContextServiceDeps() {
15
+ const ripgrepGatherer = new RipgrepGatherer();
16
+ return {
17
+ primaryTextGatherer: new PrimaryTextGatherer(),
18
+ ripgrepGatherer,
19
+ gitDiffGatherer: new GitDiffGatherer(),
20
+ astGatherer: new AstGatherer(),
21
+ metadataGatherer: new MetadataGatherer(),
22
+ gitHistoryGatherer: new GitHistoryGatherer(),
23
+ architectureGatherer: new ArchitectureGatherer(),
24
+ knowledgeGatherer: new KnowledgeGatherer(),
25
+ artifactGatherer: new ArtifactGatherer(),
26
+ ghostDependencyGatherer: new GhostDependencyGatherer(ripgrepGatherer),
27
+ targetResolver: new TargetResolver(),
28
+ assembler: new DefaultPromptAssembler(),
29
+ promptCachingManager: new PromptCachingManager(),
30
+ };
31
+ }
32
+ //# sourceMappingURL=service-deps.js.map
@@ -0,0 +1,32 @@
1
+ export function assertNotAborted(signal) {
2
+ if (signal?.aborted) {
3
+ throw new Error('Operation cancelled by user');
4
+ }
5
+ }
6
+ export function calculateUsedChars(context) {
7
+ const primary = context.primaryText?.length ?? 0;
8
+ const related = context.relatedFiles?.reduce((sum, f) => sum + (f.content?.length ?? 0), 0) ?? 0;
9
+ const snippets = context.rgSnippets.reduce((sum, s) => sum + (s.content?.length ?? 0), 0);
10
+ const diff = (context.gitDiff?.length ?? 0) +
11
+ (context.stagedDiff?.length ?? 0) +
12
+ (context.unstagedDiff?.length ?? 0) +
13
+ (context.untrackedDiff?.length ?? 0);
14
+ return primary + related + snippets + diff;
15
+ }
16
+ export function calculateSectionChars(context) {
17
+ const primary = context.primaryText?.length ?? 0;
18
+ const relatedFiles = context.relatedFiles?.reduce((sum, f) => sum + (f.content?.length ?? 0), 0) ?? 0;
19
+ const rgSnippets = context.rgSnippets.reduce((sum, s) => sum + (s.content?.length ?? 0), 0);
20
+ const diffs = (context.gitDiff?.length ?? 0) +
21
+ (context.stagedDiff?.length ?? 0) +
22
+ (context.unstagedDiff?.length ?? 0) +
23
+ (context.untrackedDiff?.length ?? 0);
24
+ return {
25
+ primary,
26
+ relatedFiles,
27
+ rgSnippets,
28
+ diffs,
29
+ total: primary + relatedFiles + rgSnippets + diffs,
30
+ };
31
+ }
32
+ //# sourceMappingURL=service-helpers.js.map