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,157 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import * as path from 'path';
3
+ import * as fs from '../../adapters/fs/node-fs.js';
4
+ import { LIMITS } from '../../config/limits.js';
5
+ import { FileStatus } from '../../grizzco/domain/grizzco-types.js';
6
+ /**
7
+ * FileStateResolver
8
+ * Responsibilities: Accurately scan workspace and index state, implementing the data foundation for Zero Index Access.
9
+ */
10
+ export class FileStateResolver {
11
+ git;
12
+ workspaceRoot;
13
+ constructor(git, workspaceRoot) {
14
+ this.git = git;
15
+ this.workspaceRoot = workspaceRoot;
16
+ }
17
+ /**
18
+ * Resolve the state of a single file.
19
+ * Strictly follows git status --porcelain=v2 specification.
20
+ */
21
+ async resolve(filePath) {
22
+ // Normalize path to forward slashes for Git
23
+ const normalizedPath = filePath.replace(/\\/g, '/');
24
+ // Get status using GitAdapter
25
+ const output = await this.git.getStatus([normalizedPath]);
26
+ const line = output.trim().split('\n')[0] || '';
27
+ const status = this.parseStatus(line);
28
+ const absolutePath = path.join(this.workspaceRoot, normalizedPath);
29
+ const state = {
30
+ path: normalizedPath,
31
+ absolutePath: absolutePath,
32
+ status: status,
33
+ isBinary: await this.detectBinary(absolutePath),
34
+ isSymlink: await this.detectSymlink(absolutePath),
35
+ isIgnored: await this.git.checkIgnore(normalizedPath), // [Added] Physical check for safety guard
36
+ size: await this.getFileSize(absolutePath),
37
+ };
38
+ // For MM state, we need snapshots of both versions
39
+ // stagedContent comes from Index (:0)
40
+ // workingContent comes from Disk
41
+ if (status === FileStatus.MM) {
42
+ try {
43
+ state.stagedContent = await this.git.show(':0', normalizedPath);
44
+ state.workingContent = await fs.readFile(absolutePath);
45
+ }
46
+ catch {
47
+ // Fallback: If we can't capture content, we might be in a race condition.
48
+ // But proceed with what we have; strategy layer will handle missing content if needed.
49
+ }
50
+ }
51
+ return state;
52
+ }
53
+ /**
54
+ * Batch resolution
55
+ */
56
+ async getWorkspaceMap(paths) {
57
+ const resultMap = new Map();
58
+ if (paths.length === 0)
59
+ return resultMap;
60
+ // Simple parallel processing
61
+ await Promise.all(paths.map(async (p) => {
62
+ const state = await this.resolve(p);
63
+ resultMap.set(p, state);
64
+ }));
65
+ return resultMap;
66
+ }
67
+ /**
68
+ * Parse Git Porcelain V2 status line.
69
+ * Format examples:
70
+ * 1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path> (Tracked)
71
+ * ? <path> (Untracked)
72
+ * u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path> (Conflict)
73
+ */
74
+ parseStatus(line) {
75
+ if (!line)
76
+ return FileStatus.CLEAN;
77
+ const parts = line.split(' ');
78
+ const type = parts[0];
79
+ // 1. Untracked
80
+ if (type === '?')
81
+ return FileStatus.UNTRACKED;
82
+ // 2. Conflict (Unmerged)
83
+ if (type === 'u')
84
+ return FileStatus.CONFLICT;
85
+ // 3. Tracked (Normal or Rename)
86
+ if (type === '1' || type === '2') {
87
+ const xy = parts[1]; // XY flags
88
+ const x = xy[0];
89
+ const y = xy[1];
90
+ // Double Dirty (MM)
91
+ // X (Index status) != Unmodified (.) AND Y (Worktree status) != Unmodified (.)
92
+ if (x !== '.' && y !== '.')
93
+ return FileStatus.MM;
94
+ // Staged (X != '.', Y == '.')
95
+ if (x !== '.' && y === '.') {
96
+ if (x === 'A')
97
+ return FileStatus.STAGED_ADDED;
98
+ if (x === 'D')
99
+ return FileStatus.STAGED_DELETED;
100
+ return FileStatus.STAGED_MODIFIED;
101
+ }
102
+ // Unstaged (X == '.', Y != '.')
103
+ if (x === '.' && y !== '.') {
104
+ if (y === 'D')
105
+ return FileStatus.UNSTAGED_DELETED;
106
+ return FileStatus.UNSTAGED_MODIFIED;
107
+ }
108
+ }
109
+ return FileStatus.CLEAN;
110
+ }
111
+ /**
112
+ * Detect if a file is binary by checking for null bytes in the first 8KB.
113
+ */
114
+ async detectBinary(filePath) {
115
+ try {
116
+ const buffer = Buffer.alloc(LIMITS.binaryCheckBufferSize);
117
+ const fd = await fs.open(filePath, 'r');
118
+ try {
119
+ const { bytesRead } = await fd.read(buffer, 0, LIMITS.binaryCheckBufferSize, 0);
120
+ const sample = buffer.subarray(0, bytesRead);
121
+ return sample.includes(0x00);
122
+ }
123
+ finally {
124
+ await fd.close();
125
+ }
126
+ }
127
+ catch {
128
+ // If file doesn't exist or can't be read, assume non-binary (safe default for new files)
129
+ return false;
130
+ }
131
+ }
132
+ /**
133
+ * Detect if path is a symlink.
134
+ */
135
+ async detectSymlink(filePath) {
136
+ try {
137
+ const stats = await fs.lstat(filePath);
138
+ return stats.isSymbolicLink();
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ /**
145
+ * Get file size in bytes.
146
+ */
147
+ async getFileSize(filePath) {
148
+ try {
149
+ const stats = await fs.stat(filePath);
150
+ return stats.size;
151
+ }
152
+ catch {
153
+ return 0;
154
+ }
155
+ }
156
+ }
157
+ //# sourceMappingURL=file-state-resolver.js.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ImmutableGitLayer - Layer 1 Git Snapshot Management
3
+ *
4
+ * Wraps existing CheckpointManager to provide StrataSystem interface
5
+ * for L1 Git snapshot and worktree operations.
6
+ */
7
+ import { CheckpointManager } from '../checkpoint/manager.js';
8
+ /**
9
+ * ImmutableGitLayer Implementation
10
+ */
11
+ export class ImmutableGitLayerImpl {
12
+ checkpointManager;
13
+ constructor() {
14
+ this.checkpointManager = new CheckpointManager();
15
+ }
16
+ /**
17
+ * Create a snapshot of the current repository state
18
+ */
19
+ async snapshot() {
20
+ const result = await this.checkpointManager.createSafeSnapshot(process.cwd());
21
+ return result.commitHash;
22
+ }
23
+ /**
24
+ * Checkout snapshot to shadow worktree
25
+ */
26
+ async checkout(shadowPath, commitHash) {
27
+ await this.checkpointManager.restoreToShadow(process.cwd(), shadowPath, commitHash);
28
+ }
29
+ /**
30
+ * Get file content from snapshot
31
+ */
32
+ async getFile(path) {
33
+ try {
34
+ const content = await this.checkpointManager.getSnapshotFileContent(process.cwd(), 'HEAD', path);
35
+ return Buffer.from(content);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=immutable-git-layer.js.map
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Copy Backend for ShadowDriver
3
+ *
4
+ * Platform-specific copy implementations:
5
+ * - macOS: cp -Rc (APFS CoW)
6
+ * - Linux: cp -r (safe) or cp -al (hardlink with readonly lock)
7
+ * - Windows: robocopy /MIR
8
+ */
9
+ import { getLogger } from '../../../observability/logger.js';
10
+ import { spawnCommand } from '../../../runtime/process-runner.js';
11
+ import { normalizePath } from '../../../utils/path.js';
12
+ /**
13
+ * Copy directory with platform-specific implementation
14
+ */
15
+ export async function copyDir(src, dest, platform) {
16
+ const normalizedSrc = normalizePath(src);
17
+ const normalizedDest = normalizePath(dest);
18
+ getLogger().debug(`Copying ${normalizedSrc} to ${normalizedDest} on ${platform}`);
19
+ if (platform === 'darwin') {
20
+ try {
21
+ await exec(['cp', '-Rc', `${normalizedSrc}/.`, normalizedDest], {
22
+ allowExitCodes: new Set([0]),
23
+ });
24
+ }
25
+ catch (err) {
26
+ getLogger().warn(`macOS CoW copy failed, falling back to standard copy: ${err}`);
27
+ await exec(['cp', '-R', `${normalizedSrc}/.`, normalizedDest], {
28
+ allowExitCodes: new Set([0]),
29
+ });
30
+ }
31
+ return;
32
+ }
33
+ if (platform === 'linux') {
34
+ await exec(['cp', '-r', `${normalizedSrc}/.`, normalizedDest], {
35
+ allowExitCodes: new Set([0]),
36
+ });
37
+ return;
38
+ }
39
+ if (platform === 'win32') {
40
+ const robocopyArgs = [
41
+ 'robocopy',
42
+ normalizedSrc,
43
+ normalizedDest,
44
+ '/MIR',
45
+ '/MT:8',
46
+ '/R:3',
47
+ '/W:1',
48
+ '/XD',
49
+ '.git',
50
+ ];
51
+ // Robocopy exit codes 0-7 are considered success (e.g. 1 means files copied).
52
+ // https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
53
+ await exec(robocopyArgs, {
54
+ allowExitCodes: new Set([0, 1, 2, 3, 4, 5, 6, 7]),
55
+ });
56
+ return;
57
+ }
58
+ }
59
+ /**
60
+ * Hardlink directory (Linux only)
61
+ */
62
+ export async function linkDirLinux(src, dest) {
63
+ const normalizedSrc = normalizePath(src);
64
+ const normalizedDest = normalizePath(dest);
65
+ try {
66
+ await exec(['cp', '-al', `${normalizedSrc}/.`, normalizedDest], {
67
+ allowExitCodes: new Set([0]),
68
+ });
69
+ }
70
+ catch (err) {
71
+ if (String((err instanceof Error ? err.message : String(err)) || '').includes('EXDEV')) {
72
+ getLogger().debug('Cross-device hardlink failed, falling back to copy');
73
+ await exec(['cp', '-r', `${normalizedSrc}/.`, normalizedDest], {
74
+ allowExitCodes: new Set([0]),
75
+ });
76
+ return;
77
+ }
78
+ throw err;
79
+ }
80
+ }
81
+ /**
82
+ * Execute command with timeout and error handling
83
+ */
84
+ async function exec(command, options = {}) {
85
+ const commandArray = Array.isArray(command) ? command : [command];
86
+ const allowExitCodes = options.allowExitCodes ?? new Set([0]);
87
+ const timeout = options.timeout || 300000;
88
+ let stdout = '';
89
+ let stderr = '';
90
+ const result = await spawnCommand({
91
+ command: commandArray[0],
92
+ args: commandArray.slice(1),
93
+ cwd: options.cwd,
94
+ timeoutMs: timeout,
95
+ onStdoutChunk: (data) => {
96
+ stdout += Buffer.from(data).toString();
97
+ },
98
+ onStderrChunk: (data) => {
99
+ stderr += Buffer.from(data).toString();
100
+ },
101
+ });
102
+ if (result.error) {
103
+ throw new Error(`Command failed: ${result.error.message}`);
104
+ }
105
+ if (result.timedOut) {
106
+ throw new Error(`Command timed out after ${timeout}ms`);
107
+ }
108
+ const exitCode = result.code ?? 0;
109
+ if (allowExitCodes.has(exitCode)) {
110
+ return { code: exitCode, stdout, stderr };
111
+ }
112
+ throw new Error(`Command failed with code ${exitCode}: ${stderr}`);
113
+ }
114
+ //# sourceMappingURL=copy-backend.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Environment Variable Injection for ShadowDriver
3
+ *
4
+ * Provides optimized environment variables for dependency caching
5
+ * and performance optimization.
6
+ */
7
+ import os from 'os';
8
+ import path from 'path';
9
+ /**
10
+ * Get environment variable injection for optimized execution
11
+ */
12
+ export function getEnvInjection(repoRoot) {
13
+ const delimiter = path.delimiter;
14
+ const env = { ...process.env };
15
+ // Node.js: fallback dependency paths
16
+ const nodePaths = [env.NODE_PATH || '', '/usr/lib/s8p/global_modules'];
17
+ if (repoRoot) {
18
+ nodePaths.push(path.join(repoRoot, 'node_modules'));
19
+ }
20
+ env.NODE_PATH = nodePaths.filter(Boolean).join(delimiter);
21
+ // Rust
22
+ env.RUSTC_WRAPPER = env.RUSTC_WRAPPER || 'sccache';
23
+ // C/C++
24
+ env.CCACHE_DIR = env.CCACHE_DIR || path.join(os.homedir(), '.ccache');
25
+ // Go
26
+ env.GOCACHE = env.GOCACHE || path.join(os.homedir(), '.cache', 'go-build');
27
+ return env;
28
+ }
29
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Error Classifier for ShadowDriver
3
+ *
4
+ * Classifies errors to determine if they are environment-related
5
+ * and should trigger fallback to ISOLATED strategy.
6
+ */
7
+ /**
8
+ * Check if an error is environment-related
9
+ */
10
+ export function isEnvironmentError(error) {
11
+ const msg = String(error?.message || error?.stderr || '');
12
+ // Module not found errors
13
+ if (msg.includes('MODULE_NOT_FOUND') || msg.includes('Cannot find module'))
14
+ return true;
15
+ // File not found errors for critical dependency paths
16
+ if (msg.includes('ENOENT') || msg.includes('no such file or directory')) {
17
+ const critical = [
18
+ 'node_modules',
19
+ 'bun.lock',
20
+ 'bun.lockb',
21
+ 'target/',
22
+ 'build/',
23
+ '.cache',
24
+ 'toolchain',
25
+ ];
26
+ return critical.some((p) => msg.includes(p));
27
+ }
28
+ // Permission errors
29
+ if (/EACCES|EPERM|Permission denied/.test(msg))
30
+ return true;
31
+ // Architecture mismatch errors
32
+ if (/wrong ELF class|mach-o, but wrong architecture/.test(msg))
33
+ return true;
34
+ // Windows-specific environment errors
35
+ if (msg.includes('The system cannot find the path specified'))
36
+ return true;
37
+ if (msg.includes('is not recognized as an internal or external command'))
38
+ return true;
39
+ return false;
40
+ }
41
+ //# sourceMappingURL=error-classifier.js.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ShadowDriver - Layer 2 Dependency Environment Manager
3
+ *
4
+ * Responsibilities:
5
+ * - Prepare dependency environments for ShadowMergeEngine
6
+ * - Manage dependency lifecycle (build, readonly lock, cleanup, fallback)
7
+ * - Implement Safe by Default -> Fast if Possible -> Fallback on Failure strategy
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ export * from './strategy.js';
12
+ export * from './error-classifier.js';
13
+ export * from './copy-backend.js';
14
+ export * from './readonly-lock.js';
15
+ export * from './env.js';
16
+ export * from './shadow-driver.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Readonly Lock Manager for ShadowDriver
3
+ *
4
+ * Implements readonly locking for AGGRESSIVE strategy on Linux
5
+ * to prevent hardlink pollution.
6
+ *
7
+ * Also implements concurrent file lock mechanism for shadowRoot.
8
+ */
9
+ import { randomBytes } from 'crypto';
10
+ import path from 'path';
11
+ import { mkdir, writeFile, unlink, readFile, rename } from '../../../adapters/fs/node-fs.js';
12
+ import { getLogger } from '../../../observability/logger.js';
13
+ import { getShadowLockPath } from '../../../runtime/paths.js';
14
+ import { spawnCommand } from '../../../runtime/process-runner.js';
15
+ import { normalizePath } from '../../../utils/path.js';
16
+ const ownedLockTokens = new Map();
17
+ /**
18
+ * Acquire a file lock for shadowRoot
19
+ */
20
+ export async function acquireLock(shadowRoot) {
21
+ const lockPath = getShadowLockPath(shadowRoot);
22
+ const pid = process.pid;
23
+ const timestamp = Date.now();
24
+ try {
25
+ await mkdir(path.dirname(lockPath), { recursive: true });
26
+ const lockPayload = `${pid}:${timestamp}:${randomBytes(4).toString('hex')}`;
27
+ for (let attempt = 0; attempt < 2; attempt += 1) {
28
+ try {
29
+ await writeFile(lockPath, lockPayload, { flag: 'wx' });
30
+ ownedLockTokens.set(lockPath, lockPayload);
31
+ getLogger().debug(`Lock acquired for shadowRoot: ${shadowRoot}`);
32
+ return;
33
+ }
34
+ catch (error) {
35
+ const err = error;
36
+ if ((err && typeof err === 'object' && 'code' in err
37
+ ? err.code
38
+ : undefined) !== 'EEXIST') {
39
+ throw error;
40
+ }
41
+ const existingLock = await readFile(lockPath, 'utf8').catch(() => null);
42
+ if (!existingLock) {
43
+ continue;
44
+ }
45
+ const [oldPid, oldTs] = existingLock.split(':').map(Number);
46
+ if (!Number.isFinite(oldPid) || oldPid <= 0) {
47
+ await removeLockByToken(lockPath, existingLock);
48
+ continue;
49
+ }
50
+ const isAlive = await isProcessAlive(oldPid);
51
+ if (isAlive && oldPid !== pid) {
52
+ const lockSince = formatLockTimestamp(oldTs);
53
+ throw new Error(`ShadowRoot is locked by process ${oldPid} since ${lockSince}`);
54
+ }
55
+ if (isAlive && oldPid === pid) {
56
+ ownedLockTokens.set(lockPath, existingLock);
57
+ getLogger().debug(`Lock already held by current process ${pid}`);
58
+ return;
59
+ }
60
+ getLogger().warn(`Stale lock found for process ${oldPid}, removing...`);
61
+ await removeLockByToken(lockPath, existingLock);
62
+ }
63
+ }
64
+ throw new Error('Failed to acquire lock due to concurrent lock updates');
65
+ }
66
+ catch (error) {
67
+ getLogger().error(`Failed to acquire lock: ${error}`);
68
+ throw error;
69
+ }
70
+ }
71
+ /**
72
+ * Release the file lock
73
+ */
74
+ export async function releaseLock(shadowRoot) {
75
+ const lockPath = getShadowLockPath(shadowRoot);
76
+ const ownedToken = ownedLockTokens.get(lockPath);
77
+ if (!ownedToken) {
78
+ getLogger().warn(`Skip releasing unowned lock: ${shadowRoot}`);
79
+ return;
80
+ }
81
+ try {
82
+ const removed = await removeLockByToken(lockPath, ownedToken);
83
+ if (!removed) {
84
+ getLogger().warn(`Skip releasing lock due to ownership mismatch: ${shadowRoot}`);
85
+ ownedLockTokens.delete(lockPath);
86
+ return;
87
+ }
88
+ ownedLockTokens.delete(lockPath);
89
+ getLogger().debug(`Lock released for shadowRoot: ${shadowRoot}`);
90
+ }
91
+ catch (error) {
92
+ getLogger().warn(`Failed to release lock: ${error}`);
93
+ }
94
+ }
95
+ /**
96
+ * Check if a process is alive
97
+ */
98
+ async function isProcessAlive(pid) {
99
+ try {
100
+ process.kill(pid, 0);
101
+ return true;
102
+ }
103
+ catch (error) {
104
+ const err = error;
105
+ const message = err?.message || '';
106
+ if ((err && typeof err === 'object' && 'code' in err
107
+ ? err.code
108
+ : undefined) === 'ESRCH' ||
109
+ message.includes('ESRCH'))
110
+ return false;
111
+ if ((err && typeof err === 'object' && 'code' in err
112
+ ? err.code
113
+ : undefined) === 'EPERM' ||
114
+ message.includes('EPERM'))
115
+ return true;
116
+ return true;
117
+ }
118
+ }
119
+ function formatLockTimestamp(value) {
120
+ if (!Number.isFinite(value))
121
+ return 'unknown-time';
122
+ const date = new Date(value);
123
+ if (Number.isNaN(date.getTime()))
124
+ return 'unknown-time';
125
+ return date.toISOString();
126
+ }
127
+ async function removeLockByToken(lockPath, expectedToken) {
128
+ const swapPath = `${lockPath}.swap-${process.pid}-${randomBytes(4).toString('hex')}`;
129
+ try {
130
+ await rename(lockPath, swapPath);
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ try {
136
+ const movedToken = await readFile(swapPath, 'utf8');
137
+ if (movedToken === expectedToken) {
138
+ await unlink(swapPath);
139
+ return true;
140
+ }
141
+ try {
142
+ await rename(swapPath, lockPath);
143
+ }
144
+ catch {
145
+ // Best-effort rollback when concurrent updates happen.
146
+ await unlink(swapPath).catch(() => null);
147
+ }
148
+ return false;
149
+ }
150
+ catch {
151
+ try {
152
+ await rename(swapPath, lockPath);
153
+ }
154
+ catch {
155
+ // Best-effort rollback when concurrent updates happen.
156
+ await unlink(swapPath).catch(() => null);
157
+ }
158
+ return false;
159
+ }
160
+ }
161
+ /**
162
+ * Enforce readonly permissions on dependency paths
163
+ */
164
+ export async function enforceReadOnly(root, depPaths) {
165
+ if (process.platform !== 'linux')
166
+ return;
167
+ getLogger().debug(`Enforcing readonly lock on ${depPaths.length} paths`);
168
+ for (const dep of depPaths) {
169
+ const depPath = normalizePath(`${root}/${dep}`);
170
+ try {
171
+ await execChmod('a-w', depPath);
172
+ getLogger().debug(`Readonly lock applied to ${depPath}`);
173
+ }
174
+ catch (error) {
175
+ getLogger().warn(`Failed to apply readonly lock to ${depPath}: ${error}`);
176
+ }
177
+ }
178
+ }
179
+ /**
180
+ * Restore write permissions for cleanup
181
+ */
182
+ export async function restoreWrite(root, depPaths) {
183
+ if (process.platform !== 'linux')
184
+ return;
185
+ getLogger().debug(`Restoring write permissions on ${depPaths.length} paths`);
186
+ for (const dep of depPaths) {
187
+ const depPath = normalizePath(`${root}/${dep}`);
188
+ try {
189
+ await execChmod('u+w', depPath);
190
+ getLogger().debug(`Write permissions restored to ${depPath}`);
191
+ }
192
+ catch (error) {
193
+ getLogger().warn(`Failed to restore write permissions to ${depPath}: ${error}`);
194
+ }
195
+ }
196
+ }
197
+ /**
198
+ * Execute command helper
199
+ */
200
+ async function execChmod(mode, targetPath) {
201
+ let stderr = '';
202
+ const result = await spawnCommand({
203
+ command: 'chmod',
204
+ args: ['-R', mode, targetPath],
205
+ timeoutMs: 10000,
206
+ onStderrChunk: (chunk) => {
207
+ stderr += Buffer.from(chunk).toString();
208
+ },
209
+ });
210
+ if (result.error) {
211
+ throw new Error(`Command failed: ${result.error.message}`);
212
+ }
213
+ if (result.timedOut) {
214
+ throw new Error('Command timed out');
215
+ }
216
+ if (result.code === 0) {
217
+ return;
218
+ }
219
+ throw new Error(`Command failed with code ${result.code}: ${stderr}`);
220
+ }
221
+ //# sourceMappingURL=readonly-lock.js.map