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,265 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { FileAdapter } from '../adapters/fs/file-adapter.js';
3
+ import { defaultPathAdapter } from '../adapters/path/path-adapter.js';
4
+ import { Pipeline } from '../grizzco/engine/pipeline/pipeline.js';
5
+ import { getLogger } from '../observability/logger.js';
6
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from './audit-constants.js';
7
+ import { recordContextAuditEvent } from './audit.js';
8
+ import { IncrementalUpdater } from './cache/incremental-updater.js';
9
+ import { MemoryContextCacheStore, } from './cache/store.js';
10
+ import { createIntentSignature, createTargetSetSignature } from './hash.js';
11
+ import { defaultContextServiceDeps } from './service-deps.js';
12
+ import { buildContextBudgetStep } from './steps/context-budget.js';
13
+ import { buildContextGatherStep } from './steps/context-gather.js';
14
+ import { buildContextPrimaryStep } from './steps/context-primary.js';
15
+ import { buildContextPromotionStep } from './steps/context-promotion.js';
16
+ import { buildContextTargetsStep } from './steps/context-targets.js';
17
+ export class ContextService {
18
+ deps;
19
+ cacheStore;
20
+ updaters = new Map();
21
+ promptCachingManager;
22
+ fileAdapter = new FileAdapter();
23
+ static MAX_CACHE_TRACKED_FILES = 64;
24
+ static DEFAULT_CACHE_MAX_ENTRIES = 256;
25
+ static DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;
26
+ cacheMaxEntries;
27
+ cacheTtlMs;
28
+ cacheMetrics = {
29
+ hits: 0,
30
+ misses: 0,
31
+ evictions: 0,
32
+ };
33
+ constructor(deps = {}, options) {
34
+ this.deps = { ...defaultContextServiceDeps(), ...deps };
35
+ this.promptCachingManager = this.deps.promptCachingManager;
36
+ this.cacheMaxEntries =
37
+ options?.cacheMaxEntries && options.cacheMaxEntries > 0
38
+ ? Math.floor(options.cacheMaxEntries)
39
+ : ContextService.DEFAULT_CACHE_MAX_ENTRIES;
40
+ this.cacheTtlMs =
41
+ options?.cacheTtlMs && options.cacheTtlMs > 0
42
+ ? Math.floor(options.cacheTtlMs)
43
+ : ContextService.DEFAULT_CACHE_TTL_MS;
44
+ this.cacheStore = options?.cacheStore ?? new MemoryContextCacheStore();
45
+ }
46
+ async build(req) {
47
+ const diffScope = req.diffScope ?? 'primary';
48
+ const intentSignature = createIntentSignature({
49
+ instruction: req.instruction,
50
+ primaryFile: req.primaryFile,
51
+ selection: req.selection,
52
+ diffScope: req.diffScope,
53
+ });
54
+ const cacheKey = this.makeCacheKey(req, intentSignature);
55
+ const cacheLookup = await this.getValidCachedResult(cacheKey, req.repoPath);
56
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.cacheLookup, {
57
+ cacheKey,
58
+ intentSignature,
59
+ targetSetSignature: cacheLookup.targetSetSignature,
60
+ hit: Boolean(cacheLookup.result),
61
+ missReason: cacheLookup.result ? undefined : cacheLookup.missReason,
62
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.primary });
63
+ const cached = cacheLookup.result;
64
+ if (cached && !req.signal?.aborted) {
65
+ getLogger().trace(`[CONTEXT_CACHE] hit ${cacheKey}`);
66
+ return cached;
67
+ }
68
+ getLogger().trace(` [CONTEXT] Building context for repo: ${req.repoPath}`);
69
+ getLogger().trace(` [CONTEXT] File: ${req.primaryFile}, Instruction: ${req.instruction}`);
70
+ const report = await Pipeline.of({ req, diffScope })
71
+ .step('CONTEXT_PRIMARY', buildContextPrimaryStep(this.deps))
72
+ .step('CONTEXT_GATHER', buildContextGatherStep(this.deps))
73
+ .step('CONTEXT_TARGETS', buildContextTargetsStep(this.deps))
74
+ .step('CONTEXT_PROMOTION', buildContextPromotionStep(this.deps))
75
+ .step('CONTEXT_BUDGET', buildContextBudgetStep(this.deps))
76
+ .execute();
77
+ if (!report.success) {
78
+ throw report.error ?? new Error('Context pipeline failed');
79
+ }
80
+ const contextResult = report.data;
81
+ const trackedFiles = this.collectTrackedFiles(req, contextResult);
82
+ const signature = await this.computeTrackedFilesSignature(req.repoPath, trackedFiles);
83
+ await this.cacheStore.set(cacheKey, {
84
+ result: contextResult,
85
+ trackedFiles,
86
+ signature,
87
+ targetSetSignature: contextResult.meta.targetSetSignature,
88
+ intentSignature,
89
+ });
90
+ await this.bumpCacheEntry(cacheKey);
91
+ await this.evictLruIfNeeded();
92
+ this.recordContextDiff(cacheKey, contextResult);
93
+ return contextResult;
94
+ }
95
+ makeCacheKey(req, intentSignature) {
96
+ const parts = [
97
+ req.repoPath,
98
+ req.snapshotHash ?? '',
99
+ req.diffScope ?? 'primary',
100
+ req.workspaceMode ?? 'direct',
101
+ intentSignature,
102
+ ];
103
+ return parts.join('::');
104
+ }
105
+ async getValidCachedResult(cacheKey, repoPath) {
106
+ await this.evictExpiredEntries();
107
+ const entry = await this.cacheStore.get(cacheKey);
108
+ if (!entry) {
109
+ this.cacheMetrics.misses += 1;
110
+ return { missReason: 'key_miss' };
111
+ }
112
+ if (await this.isExpired(cacheKey, entry)) {
113
+ this.cacheMetrics.misses += 1;
114
+ return { missReason: 'expired' };
115
+ }
116
+ const expectedTargetSetSignature = createTargetSetSignature(entry.result.context.targets);
117
+ const recordedTargetSetSignature = entry.targetSetSignature ??
118
+ entry.result.meta.targetSetSignature ??
119
+ expectedTargetSetSignature;
120
+ if (recordedTargetSetSignature !== expectedTargetSetSignature) {
121
+ await this.cacheStore.delete(cacheKey);
122
+ this.cacheMetrics.misses += 1;
123
+ return {
124
+ missReason: 'target_signature_mismatch',
125
+ targetSetSignature: expectedTargetSetSignature,
126
+ };
127
+ }
128
+ const nextSignature = await this.computeTrackedFilesSignature(repoPath, entry.trackedFiles);
129
+ if (nextSignature !== entry.signature) {
130
+ await this.cacheStore.delete(cacheKey);
131
+ this.cacheMetrics.misses += 1;
132
+ return { missReason: 'signature_mismatch', targetSetSignature: expectedTargetSetSignature };
133
+ }
134
+ this.cacheMetrics.hits += 1;
135
+ await this.bumpCacheEntry(cacheKey);
136
+ return { result: entry.result, targetSetSignature: expectedTargetSetSignature };
137
+ }
138
+ collectTrackedFiles(req, result) {
139
+ const deduped = new Set();
140
+ if (req.primaryFile)
141
+ deduped.add(req.primaryFile);
142
+ for (const file of result.meta.includedFiles ?? []) {
143
+ if (file)
144
+ deduped.add(file);
145
+ }
146
+ for (const target of result.context.targets ?? []) {
147
+ if (target.path)
148
+ deduped.add(target.path);
149
+ }
150
+ return [...deduped].sort().slice(0, ContextService.MAX_CACHE_TRACKED_FILES);
151
+ }
152
+ async computeTrackedFilesSignature(repoPath, files) {
153
+ const parts = [];
154
+ for (const relativeFile of files) {
155
+ const absoluteFile = defaultPathAdapter.resolve(repoPath, relativeFile);
156
+ try {
157
+ const stat = await this.fileAdapter.stat(absoluteFile);
158
+ parts.push(`${relativeFile}:${stat.mtimeMs}:${stat.size}`);
159
+ }
160
+ catch {
161
+ parts.push(`${relativeFile}:missing`);
162
+ }
163
+ }
164
+ if (files.length === 0) {
165
+ parts.push('files:none');
166
+ }
167
+ parts.push(...(await this.computeRepoStateSignatureParts(repoPath)));
168
+ return createHash('sha1').update(parts.join('|')).digest('hex');
169
+ }
170
+ async computeRepoStateSignatureParts(repoPath) {
171
+ const gitFiles = ['.git/HEAD', '.git/index'];
172
+ const parts = [];
173
+ for (const rel of gitFiles) {
174
+ const gitPath = defaultPathAdapter.resolve(repoPath, rel);
175
+ try {
176
+ const stat = await this.fileAdapter.stat(gitPath);
177
+ parts.push(`${rel}:${stat.mtimeMs}:${stat.size}`);
178
+ }
179
+ catch {
180
+ parts.push(`${rel}:missing`);
181
+ }
182
+ }
183
+ return parts;
184
+ }
185
+ getEntryTimestamp(entry) {
186
+ return entry.lastAccessedAt ?? entry.createdAt ?? 0;
187
+ }
188
+ async bumpCacheEntry(cacheKey) {
189
+ const entry = await this.cacheStore.get(cacheKey);
190
+ if (!entry)
191
+ return;
192
+ const now = Date.now();
193
+ entry.createdAt = entry.createdAt ?? now;
194
+ entry.lastAccessedAt = now;
195
+ await this.cacheStore.set(cacheKey, entry);
196
+ }
197
+ async isExpired(cacheKey, entry) {
198
+ const last = this.getEntryTimestamp(entry);
199
+ if (!last || Date.now() - last <= this.cacheTtlMs)
200
+ return false;
201
+ await this.cacheStore.delete(cacheKey);
202
+ this.cacheMetrics.evictions += 1;
203
+ return true;
204
+ }
205
+ async evictExpiredEntries() {
206
+ for (const [key, entry] of await this.cacheStore.entries()) {
207
+ await this.isExpired(key, entry);
208
+ }
209
+ }
210
+ async evictLruIfNeeded() {
211
+ while ((await this.cacheStore.size()) > this.cacheMaxEntries) {
212
+ let victimKey;
213
+ let victimTs = Number.POSITIVE_INFINITY;
214
+ for (const [key, entry] of await this.cacheStore.entries()) {
215
+ const ts = this.getEntryTimestamp(entry);
216
+ if (ts < victimTs) {
217
+ victimTs = ts;
218
+ victimKey = key;
219
+ }
220
+ }
221
+ if (!victimKey)
222
+ break;
223
+ await this.cacheStore.delete(victimKey);
224
+ this.cacheMetrics.evictions += 1;
225
+ }
226
+ }
227
+ async getCacheStats() {
228
+ const total = this.cacheMetrics.hits + this.cacheMetrics.misses;
229
+ const hitRate = total > 0 ? this.cacheMetrics.hits / total : 0;
230
+ return {
231
+ size: await this.cacheStore.size(),
232
+ maxEntries: this.cacheMaxEntries,
233
+ ttlMs: this.cacheTtlMs,
234
+ hits: this.cacheMetrics.hits,
235
+ misses: this.cacheMetrics.misses,
236
+ evictions: this.cacheMetrics.evictions,
237
+ hitRate,
238
+ };
239
+ }
240
+ recordContextDiff(key, contextResult) {
241
+ const updater = this.getUpdater(key);
242
+ const diff = updater.computeDiff(contextResult.context);
243
+ this.logDiff(key, diff);
244
+ this.logPromptCacheStats(key);
245
+ }
246
+ getUpdater(key) {
247
+ let updater = this.updaters.get(key);
248
+ if (!updater) {
249
+ updater = new IncrementalUpdater();
250
+ this.updaters.set(key, updater);
251
+ }
252
+ return updater;
253
+ }
254
+ logDiff(key, diff) {
255
+ if (!diff.addedFiles.length && !diff.modifiedFiles.length && !diff.removedFiles.length) {
256
+ return;
257
+ }
258
+ getLogger().trace(`[CONTEXT_CACHE] ${key} diff added=${diff.addedFiles.length} modified=${diff.modifiedFiles.length} removed=${diff.removedFiles.length}`);
259
+ }
260
+ logPromptCacheStats(key) {
261
+ const stats = this.promptCachingManager.getStats();
262
+ getLogger().trace(`[PROMPT_CACHE] ${key} provider=${stats.provider} hitRate=${(stats.cacheHitRate * 100).toFixed(1)}% cachedTokens=${stats.cachedTokens}`);
263
+ }
264
+ }
265
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1,157 @@
1
+ import { LIMITS } from '../../config/limits.js';
2
+ import { DefaultPromptAssembler } from '../assembly/default-prompt-assembler.js';
3
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from '../audit-constants.js';
4
+ import { recordContextAuditEvent } from '../audit.js';
5
+ import { applySmartCompression } from '../compression/smart-compress.js';
6
+ import { createContextHash, createIntentSignature } from '../hash.js';
7
+ import { buildContextBudgetPolicyPlan, executeContextBudgetPolicyPlan, } from '../policies/budget-policy.js';
8
+ import { packUntilFull } from '../policies/pack-until-full.js';
9
+ import { rankContextForRelevance } from '../scoring/relevance.js';
10
+ import { calculateSectionChars, calculateUsedChars } from '../service-helpers.js';
11
+ const BUDGET_RATIO = {
12
+ primary: 0.6,
13
+ related: 0.3,
14
+ secondary: 0.1,
15
+ };
16
+ function computeBudgetAllocation(budgetChars, sectionChars) {
17
+ const primaryBudget = Math.max(0, Math.floor(budgetChars * BUDGET_RATIO.primary));
18
+ const relatedBudget = Math.max(0, Math.floor(budgetChars * BUDGET_RATIO.related));
19
+ const secondaryBudget = Math.max(0, budgetChars - primaryBudget - relatedBudget);
20
+ const secondaryUsed = Math.max(0, sectionChars.rgSnippets + sectionChars.diffs);
21
+ return {
22
+ ratio: {
23
+ primary: BUDGET_RATIO.primary,
24
+ related: BUDGET_RATIO.related,
25
+ secondary: BUDGET_RATIO.secondary,
26
+ },
27
+ budgetChars: {
28
+ primary: primaryBudget,
29
+ related: relatedBudget,
30
+ secondary: secondaryBudget,
31
+ },
32
+ usedChars: {
33
+ primary: sectionChars.primary,
34
+ related: sectionChars.relatedFiles,
35
+ secondary: secondaryUsed,
36
+ },
37
+ };
38
+ }
39
+ export function buildContextBudgetStep(deps) {
40
+ const assembler = deps.assembler ?? new DefaultPromptAssembler();
41
+ return async ({ req, diffScope, primaryText, rgSnippets, targets, targetSetSignature, includedFiles, stagedDiff, unstagedDiff, gitDiff, relatedFiles, symbols, definitionMap, analysis, repoMap, symbolMap, projectMetadata, gitHistory, projectTopology, knowledgeBase, runtimeArtifacts, }) => {
42
+ const workspaceMode = req.workspaceMode ?? 'direct';
43
+ const context = {
44
+ repoPath: req.repoPath,
45
+ instruction: req.instruction,
46
+ primaryFile: req.primaryFile,
47
+ workspaceMode,
48
+ primaryText,
49
+ relatedFiles,
50
+ rgSnippets,
51
+ gitDiff,
52
+ stagedDiff,
53
+ unstagedDiff,
54
+ untrackedDiff: undefined,
55
+ untrackedFiles: [],
56
+ symbols,
57
+ definitionMap,
58
+ targets,
59
+ analysis,
60
+ repoMap,
61
+ symbolMap,
62
+ projectMetadata,
63
+ gitHistory,
64
+ projectTopology,
65
+ knowledgeBase,
66
+ runtimeArtifacts,
67
+ };
68
+ const compressed = applySmartCompression(context, { budgetChars: req.budgetChars });
69
+ const ranked = rankContextForRelevance(compressed);
70
+ const preBudgetSectionChars = calculateSectionChars(ranked);
71
+ const budgetPolicyPlan = buildContextBudgetPolicyPlan({
72
+ requestedBudgetChars: req.budgetChars,
73
+ preBudgetSectionChars,
74
+ targetCount: (ranked.targets ?? []).length,
75
+ });
76
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.budgetPolicyPlan, {
77
+ workerId: budgetPolicyPlan.workerId,
78
+ actions: budgetPolicyPlan.actions.map((a) => a.type),
79
+ decisionTree: budgetPolicyPlan.decisionTree,
80
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.budget });
81
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.relevanceRanking, {
82
+ topRelatedFiles: (ranked.relatedFiles ?? []).slice(0, 10).map((f) => ({
83
+ path: f.path,
84
+ kind: f.kind,
85
+ mode: f.mode,
86
+ })),
87
+ snippetFiles: Array.from(new Set((ranked.rgSnippets ?? []).slice(0, 20).map((s) => s.file))),
88
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.budget });
89
+ const budget = req.budgetChars;
90
+ const budgeted = executeContextBudgetPolicyPlan({
91
+ plan: budgetPolicyPlan,
92
+ context: ranked,
93
+ fallbackBudgetChars: budget ?? LIMITS.maxContextChars,
94
+ pack: packUntilFull,
95
+ });
96
+ const assembled = assembler.assemble(budgeted.context, req);
97
+ const contextHash = createContextHash(budgeted.context);
98
+ const sectionChars = calculateSectionChars(budgeted.context);
99
+ const requestedBudgetChars = budget ?? LIMITS.maxContextChars;
100
+ const budgetAllocation = computeBudgetAllocation(requestedBudgetChars, sectionChars);
101
+ const droppedSections = budgeted.truncated && preBudgetSectionChars.diffs > 0
102
+ ? {
103
+ stagedDiff: ranked.stagedDiff !== undefined && budgeted.context.stagedDiff === undefined,
104
+ unstagedDiff: ranked.unstagedDiff !== undefined && budgeted.context.unstagedDiff === undefined,
105
+ gitDiff: ranked.gitDiff !== undefined && budgeted.context.gitDiff === undefined,
106
+ untrackedDiff: ranked.untrackedDiff !== undefined && budgeted.context.untrackedDiff === undefined,
107
+ }
108
+ : undefined;
109
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.packSummary, {
110
+ intentSignature: createIntentSignature({
111
+ instruction: req.instruction,
112
+ primaryFile: req.primaryFile,
113
+ selection: req.selection,
114
+ diffScope: req.diffScope,
115
+ }),
116
+ targetSetSignature,
117
+ cacheKeyHint: [
118
+ req.repoPath,
119
+ req.snapshotHash ?? '',
120
+ req.diffScope ?? 'primary',
121
+ workspaceMode,
122
+ ].join('::'),
123
+ requestedBudgetChars: budget,
124
+ preBudgetSectionChars,
125
+ sectionChars,
126
+ budgetAllocation,
127
+ truncated: budgeted.truncated,
128
+ droppedSections,
129
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.budget });
130
+ return {
131
+ context: {
132
+ ...budgeted.context,
133
+ contextHash,
134
+ targetSetSignature,
135
+ },
136
+ prompt: assembled.prompt,
137
+ meta: {
138
+ usedChars: calculateUsedChars(budgeted.context),
139
+ truncated: budgeted.truncated,
140
+ diffScope,
141
+ includedFiles,
142
+ requestedBudgetChars: budget,
143
+ preBudgetSectionChars,
144
+ sectionChars,
145
+ budgetAllocation,
146
+ contextHash,
147
+ targetSetSignature,
148
+ environment: {
149
+ workspaceMode,
150
+ },
151
+ droppedSections,
152
+ ...(assembled.meta || {}),
153
+ },
154
+ };
155
+ };
156
+ }
157
+ //# sourceMappingURL=context-budget.js.map
@@ -0,0 +1,71 @@
1
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from '../audit-constants.js';
2
+ import { recordContextAuditEvent } from '../audit.js';
3
+ import { extractKeywords } from '../keywords.js';
4
+ import { assertNotAborted } from '../service-helpers.js';
5
+ export function buildContextGatherStep(deps) {
6
+ return async ({ req, diffScope, primaryText }) => {
7
+ assertNotAborted(req.signal);
8
+ const keywords = extractKeywords(req.instruction);
9
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.keywordsExtracted, { count: keywords.length, keywords: keywords.slice(0, 5) }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.gather });
10
+ const [rgSnippets, diffRes, astRes, projectMetadata, gitHistory, projectTopology, knowledgeBase, runtimeArtifacts,] = await Promise.all([
11
+ deps.ripgrepGatherer.searchMultipleKeywords(keywords, req.repoPath, req.signal),
12
+ deps.gitDiffGatherer.gather({ ...req, diffScope }),
13
+ deps.astGatherer.gather(primaryText, req),
14
+ deps.metadataGatherer.gather(req),
15
+ deps.gitHistoryGatherer.gather(req),
16
+ deps.architectureGatherer.gather(req),
17
+ deps.knowledgeGatherer.gather(req),
18
+ deps.artifactGatherer.gather(req),
19
+ ]);
20
+ assertNotAborted(req.signal);
21
+ // 2nd Stage: Semantic/Ghost Dependency Probe
22
+ const existingFiles = new Set(astRes.relatedFiles.map((f) => f.path));
23
+ const ghostFiles = await deps.ghostDependencyGatherer.gather(primaryText, req, existingFiles);
24
+ if (ghostFiles.length > 0) {
25
+ astRes.relatedFiles.push(...ghostFiles);
26
+ }
27
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.gatherCompleted, {
28
+ rgSnippets: rgSnippets.length,
29
+ includedFiles: diffRes.includedFiles.length,
30
+ importedFiles: astRes.relatedFiles.length,
31
+ ghostFiles: ghostFiles.length,
32
+ syntaxErrors: astRes.syntaxErrors?.length ?? 0,
33
+ hasParseError: Boolean(astRes.parseError),
34
+ hasProjectMetadata: Boolean(projectMetadata),
35
+ hasGitHistory: Boolean(gitHistory),
36
+ hasProjectTopology: Boolean(projectTopology),
37
+ hasKnowledgeBase: Boolean(knowledgeBase),
38
+ hasRuntimeArtifacts: Boolean(runtimeArtifacts),
39
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.gather });
40
+ return {
41
+ req,
42
+ diffScope,
43
+ primaryText,
44
+ rgSnippets,
45
+ projectMetadata,
46
+ gitHistory,
47
+ projectTopology,
48
+ knowledgeBase,
49
+ runtimeArtifacts,
50
+ diff: {
51
+ includedFiles: diffRes.includedFiles,
52
+ stagedDiff: diffRes.stagedDiff,
53
+ unstagedDiff: diffRes.unstagedDiff,
54
+ gitDiff: diffRes.gitDiff,
55
+ },
56
+ ast: {
57
+ relatedFiles: astRes.relatedFiles,
58
+ repoMap: astRes.repoMap,
59
+ symbolMap: astRes.symbolMap,
60
+ controlFlow: astRes.controlFlow,
61
+ exceptionPaths: astRes.exceptionPaths,
62
+ symbols: astRes.symbols,
63
+ definitionMap: astRes.definitionMap,
64
+ languageId: astRes.languageId,
65
+ syntaxErrors: astRes.syntaxErrors,
66
+ parseError: astRes.parseError,
67
+ },
68
+ };
69
+ };
70
+ }
71
+ //# sourceMappingURL=context-gather.js.map
@@ -0,0 +1,19 @@
1
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from '../audit-constants.js';
2
+ import { recordContextAuditEvent } from '../audit.js';
3
+ import { assertNotAborted } from '../service-helpers.js';
4
+ export function buildContextPrimaryStep(deps) {
5
+ return async ({ req, diffScope }) => {
6
+ assertNotAborted(req.signal);
7
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.inputSummary, {
8
+ hasPrimaryFile: Boolean(req.primaryFile),
9
+ hasSelection: Boolean(req.selection),
10
+ instructionChars: req.instruction?.length ?? 0,
11
+ diffScope,
12
+ budgetChars: req.budgetChars ?? null,
13
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.primary });
14
+ const { primaryText } = await deps.primaryTextGatherer.gather(req);
15
+ assertNotAborted(req.signal);
16
+ return { req, diffScope, primaryText };
17
+ };
18
+ }
19
+ //# sourceMappingURL=context-primary.js.map
@@ -0,0 +1,78 @@
1
+ import { FileAdapter } from '../../adapters/fs/file-adapter.js';
2
+ import { LIMITS } from '../../config/limits.js';
3
+ import { ensureInSandbox, normalizePath, safeJoin } from '../../utils/path.js';
4
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from '../audit-constants.js';
5
+ import { recordContextAuditEvent } from '../audit.js';
6
+ import { rankContextForRelevance } from '../scoring/relevance.js';
7
+ import { assertNotAborted } from '../service-helpers.js';
8
+ const fileAdapter = new FileAdapter();
9
+ /**
10
+ * Promotes high-relevance 'outline' files to 'full' content.
11
+ * This effectively breaks the 'static snapshot' limitation by performing
12
+ * a second-stage targeted read based on initial ranking.
13
+ */
14
+ export function buildContextPromotionStep(_deps) {
15
+ return async (ctx) => {
16
+ const { req } = ctx;
17
+ assertNotAborted(req.signal);
18
+ // 1. Create temporary context for ranking
19
+ const tempContext = {
20
+ repoPath: req.repoPath,
21
+ instruction: req.instruction,
22
+ primaryFile: req.primaryFile,
23
+ primaryText: ctx.primaryText,
24
+ relatedFiles: ctx.relatedFiles,
25
+ rgSnippets: ctx.rgSnippets,
26
+ targets: ctx.targets,
27
+ symbolMap: ctx.symbolMap,
28
+ repoMap: ctx.repoMap,
29
+ };
30
+ // 2. Rank to find high-relevance candidates
31
+ const ranked = rankContextForRelevance(tempContext);
32
+ const candidates = (ranked.relatedFiles ?? []).filter((f) => f.mode === 'outline').slice(0, 5); // Promote up to Top 5 high-relevance outlines
33
+ if (candidates.length === 0)
34
+ return ctx;
35
+ const promotedPaths = [];
36
+ const updatedRelatedFiles = [...(ctx.relatedFiles ?? [])];
37
+ for (const candidate of candidates) {
38
+ // Check if score is high enough to justify promotion
39
+ // In a real system, we'd check the score, but here we'll use a heuristic:
40
+ // if it's in the top 5 and matched keywords or targets.
41
+ try {
42
+ const normalized = normalizePath(candidate.path).replace(/^(\.\/|\/)+/, '');
43
+ const fullPath = ensureInSandbox(req.repoPath, safeJoin(req.repoPath, normalized));
44
+ const content = await fileAdapter.readFile(fullPath, 'utf-8');
45
+ // Only promote if not obscenely large
46
+ if (content.length < LIMITS.largeFileThresholdBytes * 2) {
47
+ const index = updatedRelatedFiles.findIndex((f) => f.path === candidate.path);
48
+ if (index !== -1) {
49
+ updatedRelatedFiles[index] = {
50
+ ...updatedRelatedFiles[index],
51
+ mode: 'full',
52
+ content: content,
53
+ outline: updatedRelatedFiles[index].outline || candidate.content, // preserve original outline if needed
54
+ };
55
+ promotedPaths.push(candidate.path);
56
+ }
57
+ }
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error ?? 'Unknown error');
61
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.promotionFailed, { path: candidate.path, error: message }, {
62
+ source: 'context',
63
+ severity: 'medium',
64
+ scope: 'session',
65
+ phase: CONTEXT_AUDIT_PHASE.promotion,
66
+ });
67
+ }
68
+ }
69
+ if (promotedPaths.length > 0) {
70
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.promotionCompleted, { count: promotedPaths.length, paths: promotedPaths }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.gather });
71
+ }
72
+ return {
73
+ ...ctx,
74
+ relatedFiles: updatedRelatedFiles,
75
+ };
76
+ };
77
+ }
78
+ //# sourceMappingURL=context-promotion.js.map
@@ -0,0 +1,85 @@
1
+ import { CONTEXT_AUDIT_ACTION, CONTEXT_AUDIT_PHASE } from '../audit-constants.js';
2
+ import { recordContextAuditEvent } from '../audit.js';
3
+ import { createIntentSignature } from '../hash.js';
4
+ import { assertNotAborted } from '../service-helpers.js';
5
+ export function buildContextTargetsStep(deps) {
6
+ return async ({ req, diffScope, primaryText, rgSnippets, projectMetadata, gitHistory, projectTopology, knowledgeBase, runtimeArtifacts, diff, ast, }) => {
7
+ assertNotAborted(req.signal);
8
+ const importRelatedFiles = (ast.relatedFiles ?? []).map((f) => f.path);
9
+ const rgHitFiles = Array.from(new Set((rgSnippets ?? []).map((s) => s.file)));
10
+ const symbolCandidates = req.instruction.match(/\b[A-Za-z_][A-Za-z0-9_]{2,}\b/g) ?? [];
11
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.targetingCandidates, {
12
+ explicitPathCandidates: (req.instruction.match(/\.\w{1,5}\b/g) || []).length,
13
+ symbolCandidates: symbolCandidates.slice(0, 20),
14
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.targets });
15
+ const { targets, diffusionMetrics, targetSetSignature } = await deps.targetResolver.resolve({
16
+ req,
17
+ includedFiles: diff.includedFiles,
18
+ importRelatedFiles,
19
+ rgHitFiles,
20
+ definitionMap: ast.definitionMap,
21
+ symbolMap: ast.symbolMap,
22
+ churnByFile: gitHistory?.churnByFile,
23
+ });
24
+ assertNotAborted(req.signal);
25
+ recordContextAuditEvent(CONTEXT_AUDIT_ACTION.targetsResolved, {
26
+ intentSignature: createIntentSignature({
27
+ instruction: req.instruction,
28
+ primaryFile: req.primaryFile,
29
+ selection: req.selection,
30
+ diffScope: req.diffScope,
31
+ }),
32
+ targetSetSignature,
33
+ strategyTargets: targets.map((t) => ({
34
+ path: t.path,
35
+ reason: t.reason,
36
+ confidence: t.confidence,
37
+ churnWeight: t.churnWeight,
38
+ ranking: t.ranking,
39
+ })),
40
+ diffusionMetrics: diffusionMetrics
41
+ ? {
42
+ totalCandidates: diffusionMetrics.totalCandidates,
43
+ selectedTargets: diffusionMetrics.selectedTargets,
44
+ budgetLimit: diffusionMetrics.budgetLimit,
45
+ sourceBreakdown: diffusionMetrics.sourceBreakdown,
46
+ }
47
+ : undefined,
48
+ }, { source: 'context', severity: 'low', scope: 'session', phase: CONTEXT_AUDIT_PHASE.targets });
49
+ return {
50
+ req,
51
+ diffScope,
52
+ primaryText,
53
+ rgSnippets,
54
+ targets,
55
+ targetSetSignature,
56
+ projectMetadata,
57
+ gitHistory,
58
+ projectTopology,
59
+ knowledgeBase,
60
+ runtimeArtifacts,
61
+ includedFiles: diff.includedFiles,
62
+ stagedDiff: diff.stagedDiff,
63
+ unstagedDiff: diff.unstagedDiff,
64
+ gitDiff: diff.gitDiff,
65
+ relatedFiles: ast.relatedFiles,
66
+ symbols: ast.symbols,
67
+ definitionMap: ast.definitionMap,
68
+ repoMap: ast.repoMap,
69
+ symbolMap: ast.symbolMap,
70
+ analysis: {
71
+ ast: {
72
+ languageId: ast.languageId,
73
+ syntaxErrors: ast.syntaxErrors,
74
+ parseError: ast.parseError,
75
+ controlFlow: ast.controlFlow,
76
+ exceptionPaths: ast.exceptionPaths,
77
+ notes: [
78
+ 'Type mismatch, dead code, and potential bug detection are not available in this analysis layer.',
79
+ ],
80
+ },
81
+ },
82
+ };
83
+ };
84
+ }
85
+ //# sourceMappingURL=context-targets.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map