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,92 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { LIMITS } from '../config/limits.js';
3
+ import { getPatchPrompt, getPlanPrompt } from '../prompts/runtime.js';
4
+ import { executeAiSdkChatRequest, executeAiSdkChatStreamRequest } from './ai-sdk/chat-executor.js';
5
+ import { toAiSdkMessages, toAiSdkToolSet } from './ai-sdk/message-mapper.js';
6
+ import { withAuditObservationName } from './ai-sdk/observation-context.js';
7
+ import { createAiSdkChatModel, resolveAiSdkModelId } from './ai-sdk/provider-factory.js';
8
+ import { wrapPlanEmpty, sanitizeError, LlmError } from './errors.js';
9
+ import { extractUnifiedDiffFromLLMContent, formatContextForPrompt, parsePlanFromLLMContent, } from './utils.js';
10
+ export class AiSdkLLM {
11
+ cfg;
12
+ model;
13
+ modelId;
14
+ timeoutMs;
15
+ constructor(cfg) {
16
+ this.cfg = cfg;
17
+ this.modelId = resolveAiSdkModelId(cfg.modelId);
18
+ this.timeoutMs = cfg.timeoutMs;
19
+ this.model = createAiSdkChatModel(cfg, this.modelId);
20
+ }
21
+ getModelId() {
22
+ return this.modelId;
23
+ }
24
+ getCapabilities() {
25
+ return {
26
+ toolCalling: true,
27
+ responseFormatJsonObject: true,
28
+ streaming: true,
29
+ };
30
+ }
31
+ async chat(messages, options = {}) {
32
+ const aiMessages = toAiSdkMessages(messages);
33
+ const tools = toAiSdkToolSet(options.tools, options.toolSpecs);
34
+ return executeAiSdkChatRequest({
35
+ model: this.model,
36
+ modelId: this.modelId,
37
+ timeoutMs: this.timeoutMs,
38
+ langfuseEnabled: Boolean(this.cfg.langfuseEnabled),
39
+ requestId: randomUUID(),
40
+ messages: aiMessages,
41
+ tools,
42
+ options,
43
+ });
44
+ }
45
+ async *chatStream(messages, options = {}) {
46
+ const aiMessages = toAiSdkMessages(messages);
47
+ const tools = toAiSdkToolSet(options.tools, options.toolSpecs);
48
+ yield* executeAiSdkChatStreamRequest({
49
+ model: this.model,
50
+ modelId: this.modelId,
51
+ timeoutMs: this.timeoutMs,
52
+ langfuseEnabled: Boolean(this.cfg.langfuseEnabled),
53
+ requestId: randomUUID(),
54
+ messages: aiMessages,
55
+ tools,
56
+ options,
57
+ });
58
+ }
59
+ /**
60
+ * Explicit tool-aware streaming method for the pipeline.
61
+ * This surfaces text deltas and tool calls as they arrive.
62
+ */
63
+ async *chatWithToolsStreaming(messages, options = {}) {
64
+ // Current pipeline implementation expects chatStream to handle basic deltas.
65
+ // This is a specialized version that ensures tool-call governance can be observed.
66
+ yield* this.chatStream(messages, options);
67
+ }
68
+ async createPlan(context, instruction, lastError, signal) {
69
+ const prompt = await getPlanPrompt(formatContextForPrompt(context), instruction, LIMITS.maxFilesChanged, lastError);
70
+ const response = await withAuditObservationName('PLAN:plan-json', async () => this.chat([{ role: 'user', content: prompt }], { signal }));
71
+ const content = response.content;
72
+ if (!content) {
73
+ throw wrapPlanEmpty();
74
+ }
75
+ try {
76
+ return parsePlanFromLLMContent(content);
77
+ }
78
+ catch (e) {
79
+ throw new LlmError('LLM plan parsing failed', 'LLM_PLAN_INVALID_JSON', {
80
+ causeMessage: sanitizeError(e),
81
+ });
82
+ }
83
+ }
84
+ async createPatch(context, plan, lastError, signal) {
85
+ const planStr = JSON.stringify(plan, null, 2);
86
+ const formattedContext = formatContextForPrompt(context);
87
+ const prompt = await getPatchPrompt(planStr, formattedContext, LIMITS.maxFilesChanged, LIMITS.maxDiffLines, lastError);
88
+ const response = await withAuditObservationName('PATCH:unified-diff', async () => this.chat([{ role: 'user', content: prompt }], { signal }));
89
+ return extractUnifiedDiffFromLLMContent(response.content || '');
90
+ }
91
+ }
92
+ //# sourceMappingURL=ai-sdk.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1,18 @@
1
+ const ENV_ORDER = ['SALMONLOOP_BASE_URL', 'S8P_BASE_URL'];
2
+ function trimValue(value) {
3
+ if (!value)
4
+ return undefined;
5
+ const trimmed = value.trim();
6
+ return trimmed ? trimmed : undefined;
7
+ }
8
+ function normalizeUrl(value) {
9
+ return value.replace(/\/+$/, '');
10
+ }
11
+ export function resolveBaseUrl(override) {
12
+ const candidate = trimValue(override) ||
13
+ ENV_ORDER.map((name) => trimValue(process.env[name])).find((v) => Boolean(v));
14
+ if (!candidate)
15
+ return undefined;
16
+ return normalizeUrl(candidate);
17
+ }
18
+ //# sourceMappingURL=base-url.js.map
@@ -0,0 +1,68 @@
1
+ import { LIMITS } from '../../config/limits.js';
2
+ function truncateForPrompt(text, maxChars) {
3
+ const value = String(text ?? '');
4
+ if (value.length <= maxChars)
5
+ return value;
6
+ const head = Math.max(0, Math.floor(maxChars * 0.6));
7
+ const tail = Math.max(0, maxChars - head);
8
+ return `${value.slice(0, head)}\n…[truncated]…\n${value.slice(-tail)}`;
9
+ }
10
+ export async function repairToJsonObject(args) {
11
+ const { llm, baseMessages, chatOptions, badContent, reason } = args;
12
+ const prompt = [
13
+ 'Your previous response did not satisfy the contract.',
14
+ `Reason: ${reason}`,
15
+ '',
16
+ 'Return ONLY a single JSON object.',
17
+ '- No Markdown fences.',
18
+ '- No commentary.',
19
+ '- No leading/trailing text.',
20
+ '',
21
+ 'The JSON object MUST include keys: goal, files, changes, verify.',
22
+ '',
23
+ 'Previous response (truncated):',
24
+ truncateForPrompt(badContent, Math.min(1200, Math.max(400, LIMITS.maxContextChars / 100))),
25
+ ].join('\n');
26
+ return llm.chat([
27
+ ...baseMessages,
28
+ { role: 'assistant', content: badContent || '' },
29
+ { role: 'user', content: prompt },
30
+ ], {
31
+ ...chatOptions,
32
+ responseFormat: 'json_object',
33
+ // Ensure the model cannot get "distracted" by tool calling during repair.
34
+ tools: undefined,
35
+ toolSpecs: undefined,
36
+ toolChoice: undefined,
37
+ temperature: 0,
38
+ });
39
+ }
40
+ export async function repairToUnifiedDiff(args) {
41
+ const { llm, baseMessages, chatOptions, badContent, reason } = args;
42
+ const prompt = [
43
+ 'Your previous response did not satisfy the contract.',
44
+ `Reason: ${reason}`,
45
+ '',
46
+ 'Return ONLY a standard git unified diff patch.',
47
+ '- It MUST start with `diff --git`.',
48
+ '- No Markdown fences.',
49
+ '- No commentary.',
50
+ '- Exactly one final patch block (no multiple alternatives).',
51
+ '',
52
+ 'Previous response (truncated):',
53
+ truncateForPrompt(badContent, Math.min(1200, Math.max(400, LIMITS.maxContextChars / 100))),
54
+ ].join('\n');
55
+ return llm.chat([
56
+ ...baseMessages,
57
+ { role: 'assistant', content: badContent || '' },
58
+ { role: 'user', content: prompt },
59
+ ], {
60
+ ...chatOptions,
61
+ responseFormat: 'text',
62
+ tools: undefined,
63
+ toolSpecs: undefined,
64
+ toolChoice: undefined,
65
+ temperature: 0,
66
+ });
67
+ }
68
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1,172 @@
1
+ import { SalmonError } from '../types/errors.js';
2
+ import { sanitizeErrorMessage } from '../utils/sanitizer.js';
3
+ export class LlmError extends SalmonError {
4
+ llmCode;
5
+ meta;
6
+ constructor(message, llmCode, meta) {
7
+ // Ensure SalmonError receives llmCode as its core code
8
+ super(message, llmCode);
9
+ this.llmCode = llmCode;
10
+ this.meta = meta;
11
+ }
12
+ }
13
+ function truncate(value, max = 500) {
14
+ if (value.length <= max)
15
+ return value;
16
+ return value.slice(0, max) + '...';
17
+ }
18
+ function extractProviderDetails(err) {
19
+ const details = {};
20
+ if (err && typeof err === 'object') {
21
+ const candidate = err;
22
+ // Handle AI SDK's APICallError/RetryError structure
23
+ if (candidate.lastError) {
24
+ return extractProviderDetails(candidate.lastError);
25
+ }
26
+ if (typeof candidate.statusCode === 'number') {
27
+ details.statusCode = candidate.statusCode;
28
+ }
29
+ if (typeof candidate.responseBody === 'string') {
30
+ // Apply sanitization to responseBody immediately after truncation
31
+ details.responseBody = sanitizeError(truncate(candidate.responseBody));
32
+ // Try to parse JSON from responseBody to get a better message
33
+ try {
34
+ const parsed = JSON.parse(candidate.responseBody);
35
+ if (parsed?.error?.message) {
36
+ details.providerMessage = sanitizeError(parsed.error.message);
37
+ }
38
+ else if (parsed?.message) {
39
+ details.providerMessage = sanitizeError(parsed.message);
40
+ }
41
+ }
42
+ catch {
43
+ // ignore
44
+ }
45
+ }
46
+ else if (candidate.responseBody) {
47
+ details.responseBody = truncate(JSON.stringify(candidate.responseBody));
48
+ }
49
+ // Check for nested error objects (common in Google/Anthropic APIs)
50
+ const data = candidate.data;
51
+ if (data && typeof data.error === 'object' && data.error) {
52
+ const errInfo = data.error;
53
+ if (typeof errInfo.message === 'string') {
54
+ details.providerMessage = sanitizeError(truncate(errInfo.message));
55
+ }
56
+ else if (typeof errInfo.details === 'string') {
57
+ details.providerMessage = sanitizeError(truncate(errInfo.details));
58
+ }
59
+ }
60
+ // Also check if the 'message' property itself contains JSON (common in some SDK wrappers)
61
+ if (!details.providerMessage && typeof candidate.message === 'string') {
62
+ const jsonMatch = candidate.message.match(/HTTP \d+: ({[\s\S]*})/);
63
+ if (jsonMatch && jsonMatch[1]) {
64
+ try {
65
+ const parsed = JSON.parse(jsonMatch[1]);
66
+ if (parsed?.error?.message) {
67
+ details.providerMessage = sanitizeError(parsed.error.message);
68
+ }
69
+ }
70
+ catch {
71
+ // ignore
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return details;
77
+ }
78
+ /**
79
+ * Sanitizes an error message using the shared utility to prevent leakage
80
+ * of sensitive technical data.
81
+ */
82
+ export function sanitizeError(err) {
83
+ return sanitizeErrorMessage(err);
84
+ }
85
+ export function toLlmError(err, provider) {
86
+ let name = err instanceof Error ? err.name : 'UnknownError';
87
+ let message = err instanceof Error ? err.message : String(err);
88
+ // Unwrap RetryError to get the last error's message if available
89
+ if (name === 'AI_RetryError' || err?.lastError) {
90
+ const lastError = err.lastError;
91
+ // Update the error reference so subsequent checks work on the actual cause
92
+ err = lastError;
93
+ if (lastError instanceof Error) {
94
+ name = lastError.name;
95
+ message = lastError.message;
96
+ }
97
+ }
98
+ // Handle AI SDK Validation Errors (Zod)
99
+ if (name === 'AI_TypeValidationError' ||
100
+ name === 'ZodError' ||
101
+ name.includes('TypeValidationError') ||
102
+ message.includes('TypeValidationError') ||
103
+ err?.[Symbol.for('vercel.ai.error.AI_TypeValidationError')]) {
104
+ return new LlmError('LLM validation failed', 'LLM_VALIDATION_FAILED', {
105
+ provider,
106
+ causeName: name,
107
+ causeMessage: sanitizeError(err),
108
+ });
109
+ }
110
+ // Use provider-specific details if available
111
+ const providerDetails = extractProviderDetails(err);
112
+ if (providerDetails.providerMessage) {
113
+ message = providerDetails.providerMessage;
114
+ }
115
+ // Apply unified sanitization
116
+ const sanitizedMessage = sanitizeError(err);
117
+ const isValidationFailure = sanitizedMessage.includes('validation failed') || name === 'AI_TypeValidationError';
118
+ const meta = {
119
+ provider,
120
+ causeName: name,
121
+ causeMessage: sanitizeError(err),
122
+ ...providerDetails,
123
+ };
124
+ if (isValidationFailure) {
125
+ return new LlmError(sanitizedMessage, 'LLM_VALIDATION_FAILED', meta);
126
+ }
127
+ if (name === 'AbortError' || /aborted/i.test(message)) {
128
+ return new LlmError('Request aborted', 'LLM_HTTP_ABORTED', meta);
129
+ }
130
+ if (/Unexpected end of JSON input/i.test(message)) {
131
+ return new LlmError('Invalid JSON response from LLM', 'LLM_HTTP_RESPONSE_INVALID_JSON', meta);
132
+ }
133
+ // Use a generic message for all other HTTP failures
134
+ if (isContextLengthExceeded({
135
+ statusCode: meta.statusCode,
136
+ providerMessage: meta.providerMessage,
137
+ })) {
138
+ return new LlmError('LLM context length exceeded', 'LLM_CONTEXT_LENGTH_EXCEEDED', meta);
139
+ }
140
+ return new LlmError('LLM request failed', 'LLM_HTTP_REQUEST_FAILED', meta);
141
+ }
142
+ function isContextLengthExceeded(input) {
143
+ if (input.statusCode !== 400 && input.statusCode !== 413)
144
+ return false;
145
+ const msg = (input.providerMessage ?? '').toLowerCase();
146
+ if (!msg)
147
+ return false;
148
+ return (msg.includes('maximum context length') ||
149
+ msg.includes('context length') ||
150
+ msg.includes('too many tokens') ||
151
+ msg.includes('prompt is too long') ||
152
+ msg.includes('input is too long') ||
153
+ msg.includes('reduce the length') ||
154
+ msg.includes('please reduce'));
155
+ }
156
+ export function wrapPlanEmpty() {
157
+ return new LlmError('LLM returned an empty plan', 'LLM_PLAN_EMPTY');
158
+ }
159
+ export function wrapPlanInvalidJson() {
160
+ return new LlmError('LLM returned invalid JSON for plan', 'LLM_PLAN_INVALID_JSON');
161
+ }
162
+ export function wrapPatchEmpty(reason) {
163
+ const msg = reason ? `LLM returned an empty patch: ${reason}` : 'LLM returned an empty patch';
164
+ return new LlmError(msg, 'LLM_PATCH_EMPTY');
165
+ }
166
+ export function wrapPatchNotUnifiedDiff() {
167
+ return new LlmError('LLM patch is not in unified diff format', 'LLM_PATCH_NOT_UNIFIED_DIFF');
168
+ }
169
+ export function wrapPatchInvalid(message) {
170
+ return new LlmError(message, 'LLM_PATCH_INVALID');
171
+ }
172
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,21 @@
1
+ import { createDefaultLlmRegistry, createDefaultOpenAiFallback, } from './registry.js';
2
+ export function createRuntimeLlm(resolved, options) {
3
+ const registry = createDefaultLlmRegistry();
4
+ if (resolved.clientPackage) {
5
+ const adapter = registry.resolve({
6
+ providerType: resolved.type,
7
+ clientPackage: resolved.clientPackage,
8
+ });
9
+ if (adapter) {
10
+ return adapter(resolved, options);
11
+ }
12
+ // If the user requested a package explicitly but it's not registered, keep going with a stable warning.
13
+ const fallback = createDefaultOpenAiFallback(resolved, options);
14
+ return {
15
+ ...fallback,
16
+ warnings: Array.from(new Set([...fallback.warnings, 'CLIENT_PACKAGE_NOT_SUPPORTED'])),
17
+ };
18
+ }
19
+ return createDefaultOpenAiFallback(resolved, options);
20
+ }
21
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ // Keep `src/core/llm.ts` as the stable import path for existing code/tests.
2
+ // Implementations live under `src/core/llm/` to match the project layout.
3
+ export { StubLLM, FakeLLM } from './openai.js';
4
+ export { AiSdkLLM } from './ai-sdk.js';
5
+ export { LlmError, sanitizeError, toLlmError } from './errors.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,25 @@
1
+ function toSafeConversationMessage(msg) {
2
+ if (!msg || typeof msg !== 'object')
3
+ return null;
4
+ if (msg.role !== 'user' && msg.role !== 'assistant')
5
+ return null;
6
+ if (typeof msg.content !== 'string')
7
+ return null;
8
+ const content = msg.content.trimEnd();
9
+ if (!content)
10
+ return null;
11
+ return { role: msg.role, content };
12
+ }
13
+ export function composeChatMessages(params) {
14
+ const out = [{ role: 'system', content: String(params.system ?? '') }];
15
+ if (Array.isArray(params.conversationContext)) {
16
+ for (const msg of params.conversationContext) {
17
+ const safe = toSafeConversationMessage(msg);
18
+ if (safe)
19
+ out.push(safe);
20
+ }
21
+ }
22
+ out.push({ role: 'user', content: String(params.user ?? '') });
23
+ return out;
24
+ }
25
+ //# sourceMappingURL=message-composition.js.map
@@ -0,0 +1,69 @@
1
+ export class StubLLM {
2
+ getCapabilities() {
3
+ return {
4
+ toolCalling: false,
5
+ responseFormatJsonObject: false,
6
+ streaming: false,
7
+ };
8
+ }
9
+ async chat(messages) {
10
+ const lastMsg = messages[messages.length - 1];
11
+ return {
12
+ role: 'assistant',
13
+ content: `Stub response for: ${lastMsg.content.substring(0, 50)}...`,
14
+ };
15
+ }
16
+ async createPlan(_context, instruction, _lastError) {
17
+ return {
18
+ goal: `Implement functionality based on instruction "${instruction}"`,
19
+ files: ['example.txt'],
20
+ changes: ['Modify example file content'],
21
+ verify: 'Check if changes are applied correctly',
22
+ };
23
+ }
24
+ async createPatch(_context, _plan, _lastError) {
25
+ return `diff --git a/example.txt b/example.txt
26
+ index 1234567..abcdefg 100644
27
+ --- a/example.txt
28
+ +++ b/example.txt
29
+ @@ -1,3 +1,3 @@
30
+ -Hello
31
+ +Hello World
32
+ Test
33
+ -End
34
+ +End Test`;
35
+ }
36
+ }
37
+ /**
38
+ * A fake LLM for deterministic testing.
39
+ */
40
+ export class FakeLLM {
41
+ plans;
42
+ patches;
43
+ constructor(plans, patches) {
44
+ this.plans = plans;
45
+ this.patches = patches;
46
+ }
47
+ planIndex = 0;
48
+ patchIndex = 0;
49
+ getCapabilities() {
50
+ return {
51
+ toolCalling: false,
52
+ responseFormatJsonObject: false,
53
+ streaming: false,
54
+ };
55
+ }
56
+ async chat(_messages) {
57
+ return {
58
+ role: 'assistant',
59
+ content: 'Fake chat response',
60
+ };
61
+ }
62
+ async createPlan() {
63
+ return this.plans[this.planIndex++] || this.plans[this.plans.length - 1];
64
+ }
65
+ async createPatch() {
66
+ return this.patches[this.patchIndex++] || this.patches[this.patches.length - 1];
67
+ }
68
+ }
69
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1,192 @@
1
+ import { LIMITS } from '../config/limits.js';
2
+ import { CanonicalResponsesEventEmitter } from '../streaming/canonical/canonical-responses-event-emitter.js';
3
+ import { LLM_OUTPUT_KINDS } from '../types/llm.js';
4
+ const SECRET_LINE_PATTERN = /(api[-_]?key|authorization|token|secret|password|cookie)/i;
5
+ const TOKEN_LIKE_PATTERN = /[A-Za-z0-9_\-/+=]{16,}/;
6
+ const STREAM_SANITIZATION_STATE = new Map();
7
+ const STREAM_CANONICAL_EMITTERS = new Map();
8
+ export const DEFAULT_LLM_OUTPUT_POLICY = {
9
+ kinds: ['review', 'assistant_message', 'plan'],
10
+ };
11
+ function normalizeKinds(kinds) {
12
+ const seen = new Set();
13
+ const out = [];
14
+ for (const kind of kinds) {
15
+ if (!LLM_OUTPUT_KINDS.includes(kind))
16
+ continue;
17
+ if (seen.has(kind))
18
+ continue;
19
+ seen.add(kind);
20
+ out.push(kind);
21
+ }
22
+ return out;
23
+ }
24
+ export function resolveLlmOutputPolicy(input) {
25
+ if (!input)
26
+ return { ...DEFAULT_LLM_OUTPUT_POLICY };
27
+ if (input.kinds === undefined)
28
+ return { ...DEFAULT_LLM_OUTPUT_POLICY };
29
+ return {
30
+ kinds: normalizeKinds(input.kinds),
31
+ };
32
+ }
33
+ export function shouldEmitLlmOutput(policy, kind) {
34
+ const effective = policy ?? DEFAULT_LLM_OUTPUT_POLICY;
35
+ return effective.kinds.includes(kind);
36
+ }
37
+ export function sanitizeLlmOutput(content) {
38
+ let output = String(content ?? '');
39
+ if (!output)
40
+ return '';
41
+ const redacted = output.split('\n').map(redactPotentialSecretLine).join('\n');
42
+ output = redacted.split('\u0000').join('');
43
+ if (output.length > LIMITS.maxLogLength) {
44
+ output = output.substring(0, LIMITS.maxLogLength) + '...';
45
+ }
46
+ return output;
47
+ }
48
+ function redactPotentialSecretLine(line) {
49
+ if (!SECRET_LINE_PATTERN.test(line))
50
+ return line;
51
+ const assignment = line.match(/^(.*?)([:=]\s*)(.+)$/);
52
+ if (assignment) {
53
+ return `${assignment[1]}${assignment[2]}[REDACTED]`;
54
+ }
55
+ if (TOKEN_LIKE_PATTERN.test(line)) {
56
+ return '[REDACTED]';
57
+ }
58
+ return line;
59
+ }
60
+ function sanitizeLlmStreamDelta(streamId, delta) {
61
+ if (!delta)
62
+ return '';
63
+ if (STREAM_SANITIZATION_STATE.size > 256 && !STREAM_SANITIZATION_STATE.has(streamId)) {
64
+ STREAM_SANITIZATION_STATE.clear();
65
+ }
66
+ const state = STREAM_SANITIZATION_STATE.get(streamId) ?? { raw: '', emittedLength: 0 };
67
+ state.raw = (state.raw + delta).split('\u0000').join('');
68
+ // Keep bounded memory while preserving enough history for cross-chunk redaction.
69
+ if (state.raw.length > LIMITS.maxLogLength * 4) {
70
+ state.raw = state.raw.slice(-LIMITS.maxLogLength * 2);
71
+ state.emittedLength = 0;
72
+ }
73
+ const sanitized = sanitizeLlmOutput(state.raw);
74
+ const next = sanitized.slice(state.emittedLength);
75
+ state.emittedLength = sanitized.length;
76
+ STREAM_SANITIZATION_STATE.set(streamId, state);
77
+ return next;
78
+ }
79
+ function getCanonicalEmitter(streamId) {
80
+ if (STREAM_CANONICAL_EMITTERS.size > 256 && !STREAM_CANONICAL_EMITTERS.has(streamId)) {
81
+ STREAM_CANONICAL_EMITTERS.clear();
82
+ }
83
+ const existing = STREAM_CANONICAL_EMITTERS.get(streamId);
84
+ if (existing)
85
+ return existing;
86
+ const created = new CanonicalResponsesEventEmitter();
87
+ STREAM_CANONICAL_EMITTERS.set(streamId, created);
88
+ return created;
89
+ }
90
+ function getSanitizedStreamText(streamId) {
91
+ const st = STREAM_SANITIZATION_STATE.get(streamId);
92
+ if (!st)
93
+ return '';
94
+ return sanitizeLlmOutput(st.raw);
95
+ }
96
+ export function emitLlmOutput(params) {
97
+ const { emit, policy, kind, step, content } = params;
98
+ if (!emit)
99
+ return;
100
+ if (!shouldEmitLlmOutput(policy, kind))
101
+ return;
102
+ const sanitized = sanitizeLlmOutput(content);
103
+ if (!sanitized.trim())
104
+ return;
105
+ emit({
106
+ type: 'llm.output',
107
+ kind,
108
+ step,
109
+ content: sanitized,
110
+ timestamp: new Date(),
111
+ });
112
+ }
113
+ export function emitLlmStreamDelta(params) {
114
+ const { emit, policy, kind, step, streamId, content } = params;
115
+ if (!emit)
116
+ return;
117
+ if (!shouldEmitLlmOutput(policy, kind))
118
+ return;
119
+ const sanitized = sanitizeLlmStreamDelta(streamId, content);
120
+ if (!sanitized)
121
+ return;
122
+ const timestamp = new Date();
123
+ const emitter = getCanonicalEmitter(streamId);
124
+ const canonical = emitter.push({
125
+ type: 'output_text.delta',
126
+ streamId,
127
+ delta: sanitized,
128
+ logprobs: [],
129
+ });
130
+ for (const event of canonical) {
131
+ emit({
132
+ type: 'llm.responses.event',
133
+ kind,
134
+ step,
135
+ streamId,
136
+ source: 'synthesized',
137
+ event,
138
+ timestamp,
139
+ });
140
+ }
141
+ emit({
142
+ type: 'llm.stream.delta',
143
+ kind,
144
+ step,
145
+ streamId,
146
+ content: sanitized,
147
+ timestamp,
148
+ });
149
+ }
150
+ export function emitLlmStreamEnd(params) {
151
+ const { emit, policy, kind, step, streamId, finishReason } = params;
152
+ if (!emit)
153
+ return;
154
+ if (!streamId)
155
+ return;
156
+ if (!shouldEmitLlmOutput(policy, kind))
157
+ return;
158
+ const timestamp = new Date();
159
+ const finalText = getSanitizedStreamText(streamId);
160
+ const emitter = getCanonicalEmitter(streamId);
161
+ const doneEvents = [
162
+ ...emitter.push({
163
+ type: 'output_text.done',
164
+ streamId,
165
+ text: finalText,
166
+ logprobs: [],
167
+ }),
168
+ ...emitter.finish(streamId),
169
+ ];
170
+ for (const event of doneEvents) {
171
+ emit({
172
+ type: 'llm.responses.event',
173
+ kind,
174
+ step,
175
+ streamId,
176
+ source: 'synthesized',
177
+ event,
178
+ timestamp,
179
+ });
180
+ }
181
+ emit({
182
+ type: 'llm.stream.end',
183
+ kind,
184
+ step,
185
+ streamId,
186
+ finishReason,
187
+ timestamp,
188
+ });
189
+ STREAM_CANONICAL_EMITTERS.delete(streamId);
190
+ STREAM_SANITIZATION_STATE.delete(streamId);
191
+ }
192
+ //# sourceMappingURL=output-policy.js.map