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,133 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { tmpdir } from 'os';
3
+ import path from 'path';
4
+ import { readFile, rm } from '../../adapters/fs/node-fs.js';
5
+ import { GitAdapter } from '../../adapters/git/git-adapter.js';
6
+ import { AstParser } from '../../ast/index.js';
7
+ import { convertDiffToShadowOperations } from '../../patch/diff.js';
8
+ import { tryGetPluginRegistry } from '../../plugin/registry.js';
9
+ import { OpType } from '../domain/grizzco-types.js';
10
+ function looksLikeUnifiedDiff(text) {
11
+ const trimmed = text.trimStart();
12
+ return (trimmed.startsWith('diff --git ') ||
13
+ trimmed.startsWith('--- a/') ||
14
+ trimmed.startsWith('--- /dev/null'));
15
+ }
16
+ function isAstInfrastructureError(message) {
17
+ const lower = message.toLowerCase();
18
+ return (lower.includes('failed to load language') ||
19
+ lower.includes('failed to initialize ast parser') ||
20
+ (lower.includes('enoent') && lower.includes('tree-sitter')));
21
+ }
22
+ function defaultResolveLanguage(filePath) {
23
+ return tryGetPluginRegistry()?.getByExtension(filePath)?.meta.id;
24
+ }
25
+ function defaultSupportsStrictValidation(filePath) {
26
+ const plugin = tryGetPluginRegistry()?.getByExtension(filePath);
27
+ return Boolean(plugin?.meta.capabilities?.ast?.strictValidation);
28
+ }
29
+ async function defaultBuildProposedSource(workPath, operation) {
30
+ if (!operation.content || operation.type === OpType.DELETE)
31
+ return null;
32
+ const contentText = operation.content.toString('utf8');
33
+ const isDiffPayload = looksLikeUnifiedDiff(contentText);
34
+ // Some callers may provide raw full-file content for OVERWRITE; parse it directly.
35
+ if (operation.type === OpType.OVERWRITE && !isDiffPayload)
36
+ return contentText;
37
+ // PATCH operations are unified diffs and may only contain hunks.
38
+ // Reconstruct candidate file content by applying the diff to a temporary git index.
39
+ if (!isDiffPayload)
40
+ return null;
41
+ const git = new GitAdapter(workPath);
42
+ const tempIndex = path.join(tmpdir(), `s8p-ast-${Date.now()}-${randomBytes(4).toString('hex')}`);
43
+ const env = { ...process.env, GIT_INDEX_FILE: tempIndex };
44
+ const patchText = contentText;
45
+ const absoluteTargetPath = path.join(workPath, operation.path);
46
+ try {
47
+ const readTreeResult = await git.execMeta(['read-tree', 'HEAD'], { env });
48
+ if (!readTreeResult.ok) {
49
+ // Unborn branch or missing HEAD: seed temporary index from working tree when possible.
50
+ const existingContent = await readFile(absoluteTargetPath).catch(() => null);
51
+ if (existingContent) {
52
+ const hashRes = await git.execMeta(['hash-object', '-w', '--stdin'], {
53
+ env,
54
+ input: existingContent,
55
+ });
56
+ if (hashRes.ok) {
57
+ const blobHash = hashRes.stdout.toString('utf8').trim();
58
+ if (blobHash) {
59
+ await git.exec(['update-index', '--add', '--cacheinfo', '100644', blobHash, operation.path], { env });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ await git.exec(['apply', '--cached', '--recount', '--ignore-whitespace', '-'], {
65
+ env,
66
+ input: Buffer.from(patchText, 'utf8'),
67
+ });
68
+ const showResult = await git.execMeta(['show', `:${operation.path}`], { env });
69
+ if (!showResult.ok)
70
+ return null;
71
+ return showResult.stdout.toString('utf8');
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ finally {
77
+ await rm(tempIndex, { force: true }).catch(() => undefined);
78
+ await rm(`${tempIndex}.lock`, { force: true }).catch(() => undefined);
79
+ }
80
+ }
81
+ export class AstValidationService {
82
+ deps;
83
+ constructor(deps = {}) {
84
+ this.deps = {
85
+ convertDiffToShadowOperations,
86
+ parse: (code, lang) => AstParser.parse(code, lang),
87
+ resolveLanguage: defaultResolveLanguage,
88
+ supportsStrictValidation: defaultSupportsStrictValidation,
89
+ buildProposedSource: defaultBuildProposedSource,
90
+ ...deps,
91
+ };
92
+ }
93
+ async validate(args) {
94
+ const operations = await this.deps.convertDiffToShadowOperations(args.diff);
95
+ const strictness = args.strictness ?? 'lenient';
96
+ for (const op of operations) {
97
+ if (op.type === OpType.DELETE)
98
+ continue;
99
+ const lang = this.deps.resolveLanguage(op.path);
100
+ if (!lang)
101
+ continue;
102
+ const enforceStrict = strictness === 'strict' && this.deps.supportsStrictValidation(op.path);
103
+ try {
104
+ const proposedSource = await this.deps.buildProposedSource(args.workPath, op);
105
+ if (typeof proposedSource !== 'string') {
106
+ if (enforceStrict) {
107
+ return {
108
+ ok: false,
109
+ filePath: op.path,
110
+ error: `AST Validation failed for ${op.path}: unable to reconstruct proposed source`,
111
+ };
112
+ }
113
+ continue;
114
+ }
115
+ await this.deps.parse(proposedSource, lang);
116
+ }
117
+ catch (error) {
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ // Best-effort mode: if AST tooling is unavailable, strict-capable plugins may still fail hard.
120
+ if (isAstInfrastructureError(message) && !enforceStrict) {
121
+ continue;
122
+ }
123
+ return {
124
+ ok: false,
125
+ filePath: op.path,
126
+ error: `AST Syntax Error in ${op.path}: ${message}`,
127
+ };
128
+ }
129
+ }
130
+ return { ok: true };
131
+ }
132
+ }
133
+ //# sourceMappingURL=AstValidationService.js.map
@@ -0,0 +1,17 @@
1
+ export class ContextValidator {
2
+ /**
3
+ * Validates the consistency of the exploration phase.
4
+ * If the model performs searches and has results, but no read actions,
5
+ * it's identified as a potential hallucination risk.
6
+ */
7
+ static validateExploration(audit, capturedCount) {
8
+ if (capturedCount > 0)
9
+ return { isValid: true };
10
+ const hasSuccessfulSearch = audit.some((e) => e.toolIntent === 'SEARCH' && e.toolResultStatus === 'ok');
11
+ return {
12
+ isValid: false,
13
+ errorCode: hasSuccessfulSearch ? 'explorationHallucination' : 'noFilesRead',
14
+ };
15
+ }
16
+ }
17
+ //# sourceMappingURL=ContextValidator.js.map
@@ -0,0 +1,11 @@
1
+ export function resolveAstValidationStrictness(input) {
2
+ const configuredStrictness = input.options?.astValidation?.strictness;
3
+ if (configuredStrictness === 'strict' || configuredStrictness === 'lenient') {
4
+ return configuredStrictness;
5
+ }
6
+ // Default policy:
7
+ // - debug mode emphasizes containment and safety guarantees
8
+ // - other modes prefer best-effort compatibility
9
+ return input.mode === 'debug' ? 'strict' : 'lenient';
10
+ }
11
+ //# sourceMappingURL=ast-validation-policy.js.map
@@ -0,0 +1,44 @@
1
+ import { OpType } from '../domain/grizzco-types.js';
2
+ /**
3
+ * Direct Write Worker
4
+ * Use case: Clean files, Untracked files (New files)
5
+ */
6
+ export class DirectWriteWorker {
7
+ id = 'direct-write';
8
+ async execute(op, state) {
9
+ const startTime = Date.now();
10
+ if (!op.content && op.type !== OpType.DELETE) {
11
+ // Delete operations might not have content, but modify/create must
12
+ // However, ShadowOperation structure usually has content for create/modify
13
+ return {
14
+ path: state.path,
15
+ success: false,
16
+ error: 'Operation missing content',
17
+ isConflict: false,
18
+ workerId: this.id,
19
+ executionTime: Date.now() - startTime,
20
+ };
21
+ }
22
+ // For delete operations, we don't strictly need content, but the merged content is technically empty/null
23
+ // logic handling is done in AtomicFileWriter, but here we prepare the result.
24
+ // If it's a delete, mergedContent should be undefined or empty?
25
+ // The AtomicFileWriter checks op.type.
26
+ // But TransactionStrategy calls executeMerge first.
27
+ // If op.type === 'delete', executeMerge might just pass.
28
+ // Actually, looking at TransactionStrategy in plan:
29
+ // .writeAtomic() handles delete logic separate from .executeMerge().
30
+ // But .executeMerge() is expected to produce mergedContent for write.
31
+ // If delete, maybe we return success with no content?
32
+ // Let's assume this worker is mainly for Create/Modify on clean files.
33
+ // If it's delete, it might be handled here too if needed, but let's stick to the plan's DirectWrite logic which returns op.content.
34
+ return {
35
+ path: state.path,
36
+ success: true,
37
+ mergedContent: op.content,
38
+ isConflict: false,
39
+ workerId: this.id,
40
+ executionTime: Date.now() - startTime,
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=direct-write-worker.js.map
@@ -0,0 +1,75 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { tmpdir } from 'os';
3
+ import * as path from 'path';
4
+ import { rm } from '../../adapters/fs/node-fs.js';
5
+ import { GitAdapter } from '../../adapters/git/git-adapter.js';
6
+ import { logIgnoredError } from '../../observability/ignored-error.js';
7
+ import { FileStatus } from '../domain/grizzco-types.js';
8
+ /**
9
+ * Git Apply Worker
10
+ * 🛡️ DATA INTEGRITY GUARDIAN:
11
+ * This worker uses the native 'git apply --3way' engine.
12
+ * It is the ONLY safe way to apply incremental patches to existing files
13
+ * without risking full-file truncation.
14
+ */
15
+ export class GitApplyWorker {
16
+ workPath;
17
+ id = 'git-apply';
18
+ constructor(workPath) {
19
+ this.workPath = workPath;
20
+ }
21
+ async execute(op, state) {
22
+ const startTime = Date.now();
23
+ const git = new GitAdapter(this.workPath);
24
+ const tmpIndex = path.join(tmpdir(), `s8p-idx-${Date.now()}-${randomBytes(4).toString('hex')}`);
25
+ const env = { GIT_INDEX_FILE: tmpIndex };
26
+ try {
27
+ if (!op.content) {
28
+ throw new Error('Patch content is empty');
29
+ }
30
+ const diffText = op.content.toString('utf8');
31
+ // git apply --3way may consult the index for base blobs. In MM state, the index and working tree differ,
32
+ // which can trigger "does not match index" even for safe patches. We use a temporary index that matches
33
+ // the current working tree for the target path to keep the real index untouched.
34
+ const useTempIndex = state.status === FileStatus.MM;
35
+ if (useTempIndex) {
36
+ await git.exec(['read-tree', 'HEAD'], { env });
37
+ await git.exec(['add', '--', state.path], { env });
38
+ }
39
+ // applyPatch handles writing a temp patch file and running git apply
40
+ await git.applyPatch(diffText, {
41
+ threeWay: true,
42
+ ignoreWhitespace: true,
43
+ env: useTempIndex ? env : undefined,
44
+ });
45
+ return {
46
+ path: state.path,
47
+ success: true,
48
+ // For git-apply, the changes are applied directly to the filesystem.
49
+ // We return empty mergedContent because the result is already on disk,
50
+ // but success is true to indicate the transaction was successful.
51
+ isConflict: false,
52
+ workerId: this.id,
53
+ executionTime: Date.now() - startTime,
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ path: state.path,
59
+ success: false,
60
+ error: error instanceof Error
61
+ ? error instanceof Error
62
+ ? error.message
63
+ : String(error)
64
+ : String(error),
65
+ isConflict: false,
66
+ workerId: this.id,
67
+ executionTime: Date.now() - startTime,
68
+ };
69
+ }
70
+ finally {
71
+ await rm(tmpIndex, { force: true }).catch((error) => logIgnoredError(`[GitApplyWorker] cleanup ${tmpIndex}`, error));
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=git-apply-worker.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=i-merge-worker.js.map
@@ -0,0 +1,117 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { tmpdir } from 'os';
3
+ import * as path from 'path';
4
+ import { promises as fs } from '../../adapters/fs/node-fs.js';
5
+ import { logIgnoredError } from '../../observability/ignored-error.js';
6
+ import { StrataContentGuardian } from '../../strata/interaction/content-guardian.js';
7
+ import { StrataFileSystemProvider } from '../../strata/interaction/file-system-provider.js';
8
+ /**
9
+ * MM (Double Dirty) Three-Way Merge Worker
10
+ * Use case: File has changes in BOTH Index and Worktree.
11
+ *
12
+ * Strategy: Optimistic Concurrency Control.
13
+ *
14
+ * Base: Snapshot T0 (The state when AI started thinking)
15
+ * Ours: Current worktree (may have changed since T0)
16
+ * Theirs: AI Content (V2 - based on T0)
17
+ *
18
+ * This allows merging AI changes (T0 -> AI) with the user's latest changes (T0 -> current).
19
+ */
20
+ export class MMThreeWayWorker {
21
+ git;
22
+ id = '3way-mm-advanced';
23
+ guardian = new StrataContentGuardian();
24
+ fsProvider;
25
+ constructor(git) {
26
+ this.git = git;
27
+ this.fsProvider = new StrataFileSystemProvider(git);
28
+ }
29
+ async gitMergeFile(baseText, oursText, theirsText) {
30
+ const tempDir = tmpdir();
31
+ const id = randomBytes(4).toString('hex');
32
+ const tempBase = path.join(tempDir, `s8p-mm-base-${id}`);
33
+ const tempOurs = path.join(tempDir, `s8p-mm-ours-${id}`);
34
+ const tempTheirs = path.join(tempDir, `s8p-mm-theirs-${id}`);
35
+ try {
36
+ await fs.writeFile(tempBase, baseText, 'utf8');
37
+ await fs.writeFile(tempOurs, oursText, 'utf8');
38
+ await fs.writeFile(tempTheirs, theirsText, 'utf8');
39
+ return await this.git.mergeFile(tempBase, tempOurs, tempTheirs);
40
+ }
41
+ finally {
42
+ await Promise.all([
43
+ fs
44
+ .unlink(tempBase)
45
+ .catch((error) => logIgnoredError(`[MMThreeWayWorker] cleanup ${tempBase}`, error)),
46
+ fs
47
+ .unlink(tempOurs)
48
+ .catch((error) => logIgnoredError(`[MMThreeWayWorker] cleanup ${tempOurs}`, error)),
49
+ fs
50
+ .unlink(tempTheirs)
51
+ .catch((error) => logIgnoredError(`[MMThreeWayWorker] cleanup ${tempTheirs}`, error)),
52
+ ]);
53
+ }
54
+ }
55
+ async execute(op, state, context) {
56
+ const startTime = Date.now();
57
+ if (!context?.snapshotId) {
58
+ return {
59
+ path: state.path,
60
+ success: false,
61
+ error: 'MM merge strategy requires snapshotId',
62
+ isConflict: false,
63
+ workerId: this.id,
64
+ executionTime: Date.now() - startTime,
65
+ };
66
+ }
67
+ try {
68
+ // 1. Get Base (Snapshot T0)
69
+ const base = await this.git.show(context.snapshotId, state.path);
70
+ // 2. Get Theirs (AI Content)
71
+ const theirs = op.content;
72
+ // 3. Get Ours (Current Worktree) via Strata Safety Operator
73
+ // Scenario D: Must read from disk to include unstaged changes
74
+ const ours = await this.fsProvider.readYours(this.git.repoPath, state.path);
75
+ if (!ours) {
76
+ throw new Error(`Failed to read content for ${state.path} from disk`);
77
+ }
78
+ // 4. Content Safety Inspection (EOL & Binary)
79
+ const baseInfo = this.guardian.inspect(base);
80
+ const theirsInfo = this.guardian.inspect(theirs);
81
+ const oursInfo = this.guardian.inspect(ours);
82
+ if (baseInfo.isBinary || theirsInfo.isBinary || oursInfo.isBinary) {
83
+ return {
84
+ path: state.path,
85
+ success: false,
86
+ error: 'Cannot perform text merge on binary file',
87
+ isConflict: false,
88
+ workerId: this.id,
89
+ executionTime: Date.now() - startTime,
90
+ };
91
+ }
92
+ // 5. Perform Merge (Using Normalized Content)
93
+ const merged = await this.gitMergeFile(baseInfo.normalized, oursInfo.normalized, theirsInfo.normalized);
94
+ // 6. Restore EOL (Using User's Disk Preference)
95
+ const finalContent = this.guardian.restore(merged.content.toString('utf8'), oursInfo.eol);
96
+ return {
97
+ path: state.path,
98
+ success: !merged.hasConflict,
99
+ mergedContent: Buffer.from(finalContent),
100
+ isConflict: merged.hasConflict,
101
+ workerId: this.id,
102
+ executionTime: Date.now() - startTime,
103
+ };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ path: state.path,
108
+ success: false,
109
+ error: `MM merge failed: ${error instanceof Error ? error.message : String(error)}`,
110
+ isConflict: false,
111
+ workerId: this.id,
112
+ executionTime: Date.now() - startTime,
113
+ };
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=mm-three-way-worker.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * NoOpWorker
3
+ * Does nothing. Useful for skipping files successfully.
4
+ */
5
+ export class NoOpWorker {
6
+ id = 'no-op';
7
+ async execute(op, _state) {
8
+ return {
9
+ path: op.path,
10
+ success: true,
11
+ mergedContent: undefined,
12
+ isConflict: false,
13
+ workerId: 'no-op',
14
+ executionTime: 0,
15
+ };
16
+ }
17
+ }
18
+ //# sourceMappingURL=no-op-worker.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Overwrite Binary Worker
3
+ * Use case: Modifying binary files (no merge possible, just overwrite)
4
+ */
5
+ export class OverwriteBinaryWorker {
6
+ id = 'overwrite-binary';
7
+ async execute(op, state) {
8
+ const startTime = Date.now();
9
+ if (!op.content) {
10
+ return {
11
+ path: state.path,
12
+ success: false,
13
+ error: 'Operation missing content for binary overwrite',
14
+ isConflict: false,
15
+ workerId: this.id,
16
+ executionTime: Date.now() - startTime,
17
+ };
18
+ }
19
+ return {
20
+ path: state.path,
21
+ success: true,
22
+ mergedContent: op.content,
23
+ isConflict: false,
24
+ workerId: this.id,
25
+ executionTime: Date.now() - startTime,
26
+ };
27
+ }
28
+ }
29
+ //# sourceMappingURL=overwrite-binary-worker.js.map
@@ -0,0 +1,69 @@
1
+ import { promises as fs } from '../../adapters/fs/node-fs.js';
2
+ import { ShadowMergeEngine } from '../../strata/engine/shadow-merge-engine.js';
3
+ /**
4
+ * StrataSyncWorker
5
+ * A bridge worker that delegates to the legacy ShadowMergeEngine for complex worktree synchronizations.
6
+ */
7
+ export class StrataSyncWorker {
8
+ git;
9
+ checkpoints;
10
+ id = 'strata-sync';
11
+ constructor(git, checkpoints) {
12
+ this.git = git;
13
+ this.checkpoints = checkpoints;
14
+ }
15
+ async execute(op, state, context) {
16
+ const startTime = Date.now();
17
+ // Guard: Ensure we have necessary context for ShadowMergeEngine
18
+ if (!context?.shadowWorktreePath || !context?.initialRef || !context?.latestRef) {
19
+ return {
20
+ path: state.path,
21
+ success: false,
22
+ error: 'StrataSyncWorker requires shadowWorktreePath, initialRef, and latestRef in context',
23
+ isConflict: false,
24
+ workerId: this.id,
25
+ executionTime: Date.now() - startTime,
26
+ };
27
+ }
28
+ try {
29
+ // 1. Instantiate the legacy engine
30
+ const engine = new ShadowMergeEngine({
31
+ mainRepoPath: this.git.repoPath,
32
+ shadowWorktreePath: context.shadowWorktreePath,
33
+ initialRef: context.initialRef,
34
+ latestRef: context.latestRef,
35
+ // We default to '3way' as Grizzco handles the high-level policy
36
+ applyBackOnDirty: '3way',
37
+ // Optional: propagate verbose level if available in context/options (omitted for brevity)
38
+ }, this.checkpoints);
39
+ // We need to fetch base content to use mergeFileContents
40
+ const baseContent = await this.git.show(context.initialRef, state.path);
41
+ // User content from disk
42
+ const userContent = await fs.readFile(state.absolutePath || state.path);
43
+ // AI content from op
44
+ const aiContent = op.content;
45
+ // Invoke legacy merge logic
46
+ // private method: async mergeFileContents(repoPath, base, user, ai, options?)
47
+ const result = await engine.mergeFileContents(this.git.repoPath, baseContent, userContent, aiContent);
48
+ return {
49
+ path: state.path,
50
+ success: !result.conflict,
51
+ mergedContent: result.merged,
52
+ isConflict: result.conflict,
53
+ workerId: this.id,
54
+ executionTime: Date.now() - startTime,
55
+ };
56
+ }
57
+ catch (error) {
58
+ return {
59
+ path: state.path,
60
+ success: false,
61
+ error: `Strata sync failed: ${error instanceof Error ? error.message : String(error)}`,
62
+ isConflict: false,
63
+ workerId: this.id,
64
+ executionTime: Date.now() - startTime,
65
+ };
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=strata-sync-worker.js.map
@@ -0,0 +1,84 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { tmpdir } from 'os';
3
+ import * as path from 'path';
4
+ import { promises as fs } from '../../adapters/fs/node-fs.js';
5
+ import { logIgnoredError } from '../../observability/ignored-error.js';
6
+ /**
7
+ * Standard Three-Way Merge Worker
8
+ * Use case: Unstaged modifications in text files.
9
+ *
10
+ * Base: HEAD
11
+ * Ours: Working Tree (File on disk)
12
+ * Theirs: AI Content
13
+ */
14
+ export class ThreeWayMergeWorker {
15
+ git;
16
+ normalizer;
17
+ id = '3way-standard';
18
+ constructor(git, normalizer) {
19
+ this.git = git;
20
+ this.normalizer = normalizer;
21
+ }
22
+ async execute(op, state) {
23
+ const startTime = Date.now();
24
+ try {
25
+ // 1. Get Base (HEAD)
26
+ const base = await this.git.show('HEAD', state.path);
27
+ // 2. Get Theirs (AI Content)
28
+ const theirs = op.content;
29
+ // 3. Get Ours (Working Tree)
30
+ // We read from disk directly to ensure we have the latest content including unstaged changes
31
+ const ours = await fs.readFile(state.path);
32
+ // 4. Perform Merge
33
+ const merged = await this.gitMergeFile(base, theirs, ours);
34
+ return {
35
+ path: state.path,
36
+ success: !merged.hasConflict,
37
+ mergedContent: merged.content,
38
+ isConflict: merged.hasConflict,
39
+ workerId: this.id,
40
+ executionTime: Date.now() - startTime,
41
+ };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ path: state.path,
46
+ success: false,
47
+ error: `Three-way merge failed: ${error instanceof Error ? error.message : String(error)}`,
48
+ isConflict: false,
49
+ workerId: this.id,
50
+ executionTime: Date.now() - startTime,
51
+ };
52
+ }
53
+ }
54
+ async gitMergeFile(base, theirs, ours) {
55
+ const tempDir = tmpdir();
56
+ const id = randomBytes(4).toString('hex');
57
+ const tempBase = path.join(tempDir, `s8p-base-${id}`);
58
+ const tempTheirs = path.join(tempDir, `s8p-theirs-${id}`);
59
+ const tempOurs = path.join(tempDir, `s8p-ours-${id}`);
60
+ try {
61
+ await fs.writeFile(tempBase, base);
62
+ await fs.writeFile(tempTheirs, theirs);
63
+ await fs.writeFile(tempOurs, ours);
64
+ // Use GitAdapter to execute merge-file
65
+ // Note: GitAdapter.mergeFile implementation takes paths: base, current(ours), incoming(theirs)
66
+ return await this.git.mergeFile(tempBase, tempOurs, tempTheirs);
67
+ }
68
+ finally {
69
+ // Cleanup
70
+ await Promise.all([
71
+ fs
72
+ .unlink(tempBase)
73
+ .catch((error) => logIgnoredError(`[ThreeWayMergeWorker] cleanup ${tempBase}`, error)),
74
+ fs
75
+ .unlink(tempTheirs)
76
+ .catch((error) => logIgnoredError(`[ThreeWayMergeWorker] cleanup ${tempTheirs}`, error)),
77
+ fs
78
+ .unlink(tempOurs)
79
+ .catch((error) => logIgnoredError(`[ThreeWayMergeWorker] cleanup ${tempOurs}`, error)),
80
+ ]);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=three-way-merge-worker.js.map