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,852 @@
1
+ import { LLM_OUTPUT_KINDS } from '../types/index.js';
2
+ import { ConfigError } from './errors.js';
3
+ import { normalizePermissionMode, normalizeUiLogMode, normalizeUiLogView } from './normalize.js';
4
+ import { MARKDOWN_RENDER_MODES, MARKDOWN_THEMES, } from './types.js';
5
+ function isRecord(value) {
6
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
7
+ }
8
+ function isString(value) {
9
+ return typeof value === 'string';
10
+ }
11
+ function isNumber(value) {
12
+ return typeof value === 'number' && Number.isFinite(value);
13
+ }
14
+ function isBoolean(value) {
15
+ return typeof value === 'boolean';
16
+ }
17
+ function isNull(value) {
18
+ return value === null;
19
+ }
20
+ function isValidLlmOutputKind(value) {
21
+ return typeof value === 'string' && LLM_OUTPUT_KINDS.includes(value);
22
+ }
23
+ function isValidMarkdownTheme(value) {
24
+ return typeof value === 'string' && MARKDOWN_THEMES.includes(value);
25
+ }
26
+ function isValidMarkdownRenderMode(value) {
27
+ return typeof value === 'string' && MARKDOWN_RENDER_MODES.includes(value);
28
+ }
29
+ export function validateConfigFileV1(input) {
30
+ if (!isRecord(input)) {
31
+ throw new ConfigError('CONFIG_INVALID_ROOT', { expected: 'object' });
32
+ }
33
+ const version = input.version;
34
+ if (version !== undefined && version !== 1) {
35
+ throw new ConfigError('CONFIG_UNSUPPORTED', { version: String(version) });
36
+ }
37
+ const cfg = { version: 1 };
38
+ if (input.mode !== undefined) {
39
+ if (!isString(input.mode)) {
40
+ throw new ConfigError('CONFIG_INVALID_MODE', { expected: 'interactive|yolo' });
41
+ }
42
+ const normalized = normalizePermissionMode(input.mode);
43
+ if (!normalized) {
44
+ throw new ConfigError('CONFIG_INVALID_MODE', { mode: String(input.mode) });
45
+ }
46
+ cfg.mode = normalized;
47
+ }
48
+ if (input.observability !== undefined) {
49
+ if (!isRecord(input.observability)) {
50
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY', { expected: 'object' });
51
+ }
52
+ const obs = input.observability;
53
+ cfg.observability = {};
54
+ if (obs.langfuse !== undefined) {
55
+ if (!isRecord(obs.langfuse)) {
56
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_LANGFUSE', { expected: 'object' });
57
+ }
58
+ const lf = obs.langfuse;
59
+ const out = {};
60
+ if (lf.enabled !== undefined && !isBoolean(lf.enabled)) {
61
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_ENABLED', { expected: 'boolean' });
62
+ }
63
+ if (lf.outcome !== undefined && !isBoolean(lf.outcome)) {
64
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_OUTCOME', { expected: 'boolean' });
65
+ }
66
+ if (lf.endpoint !== undefined && !isString(lf.endpoint)) {
67
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_ENDPOINT', { expected: 'string' });
68
+ }
69
+ if (lf.apiKey !== undefined && !(isString(lf.apiKey) || isNull(lf.apiKey))) {
70
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_API_KEY', {
71
+ expected: 'string|null',
72
+ });
73
+ }
74
+ if (lf.sessionId !== undefined && !isString(lf.sessionId)) {
75
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_SESSION_ID', { expected: 'string' });
76
+ }
77
+ if (lf.userId !== undefined && !isString(lf.userId)) {
78
+ throw new ConfigError('CONFIG_INVALID_LANGFUSE_USER_ID', { expected: 'string' });
79
+ }
80
+ out.enabled = lf.enabled;
81
+ out.outcome = lf.outcome;
82
+ out.endpoint = lf.endpoint;
83
+ out.apiKey = lf.apiKey;
84
+ out.sessionId = lf.sessionId;
85
+ out.userId = lf.userId;
86
+ cfg.observability.langfuse = out;
87
+ }
88
+ if (obs.audit !== undefined) {
89
+ const auditRaw = obs.audit;
90
+ if (!isRecord(auditRaw)) {
91
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT', { expected: 'object' });
92
+ }
93
+ const scopeRaw = auditRaw.scope;
94
+ const bufferRaw = auditRaw.buffer;
95
+ const auditOut = {};
96
+ if (scopeRaw !== undefined) {
97
+ if (!isString(scopeRaw) || (scopeRaw !== 'repo' && scopeRaw !== 'user')) {
98
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT_SCOPE', {
99
+ expected: 'repo|user',
100
+ });
101
+ }
102
+ auditOut.scope = scopeRaw;
103
+ }
104
+ if (bufferRaw !== undefined) {
105
+ if (!isRecord(bufferRaw)) {
106
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT_BUFFER', {
107
+ expected: 'object',
108
+ });
109
+ }
110
+ if (bufferRaw.maxEvents !== undefined && !isNumber(bufferRaw.maxEvents)) {
111
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT_MAX_EVENTS', {
112
+ expected: 'number',
113
+ });
114
+ }
115
+ if (bufferRaw.maxBytes !== undefined && !isNumber(bufferRaw.maxBytes)) {
116
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT_MAX_BYTES', {
117
+ expected: 'number',
118
+ });
119
+ }
120
+ if (bufferRaw.droppedWarn !== undefined && !isNumber(bufferRaw.droppedWarn)) {
121
+ throw new ConfigError('CONFIG_INVALID_OBSERVABILITY_AUDIT_DROPPED_WARN', {
122
+ expected: 'number',
123
+ });
124
+ }
125
+ auditOut.buffer = {
126
+ maxEvents: bufferRaw.maxEvents,
127
+ maxBytes: bufferRaw.maxBytes,
128
+ droppedWarn: bufferRaw.droppedWarn,
129
+ };
130
+ }
131
+ if (auditOut.scope || auditOut.buffer) {
132
+ cfg.observability.audit = auditOut;
133
+ }
134
+ }
135
+ }
136
+ if (input.cli !== undefined) {
137
+ if (!isRecord(input.cli)) {
138
+ throw new ConfigError('CONFIG_INVALID_CLI', { expected: 'object' });
139
+ }
140
+ if (input.cli.defaults !== undefined) {
141
+ if (!isRecord(input.cli.defaults)) {
142
+ throw new ConfigError('CONFIG_INVALID_CLI_DEFAULTS', { expected: 'object' });
143
+ }
144
+ cfg.cli = { defaults: {} };
145
+ const d = input.cli.defaults;
146
+ if (d.verbosity !== undefined && !isString(d.verbosity)) {
147
+ throw new ConfigError('CONFIG_INVALID_VERBOSITY', { expected: 'string' });
148
+ }
149
+ if (d.strategy !== undefined && !isString(d.strategy)) {
150
+ throw new ConfigError('CONFIG_INVALID_STRATEGY', { expected: 'string' });
151
+ }
152
+ if (d.dryRun !== undefined && !isBoolean(d.dryRun)) {
153
+ throw new ConfigError('CONFIG_INVALID_DRY_RUN', { expected: 'boolean' });
154
+ }
155
+ cfg.cli.defaults = {
156
+ verbosity: d.verbosity,
157
+ strategy: d.strategy,
158
+ dryRun: d.dryRun,
159
+ };
160
+ }
161
+ }
162
+ if (input.server !== undefined) {
163
+ const serverRaw = input.server;
164
+ if (!isRecord(serverRaw)) {
165
+ throw new ConfigError('CONFIG_INVALID_SERVER', { expected: 'object' });
166
+ }
167
+ const server = {};
168
+ if (serverRaw.a2a !== undefined) {
169
+ if (!isRecord(serverRaw.a2a)) {
170
+ throw new ConfigError('CONFIG_INVALID_SERVER_A2A', { expected: 'object' });
171
+ }
172
+ const a2aRaw = serverRaw.a2a;
173
+ if (a2aRaw.host !== undefined && !isString(a2aRaw.host)) {
174
+ throw new ConfigError('CONFIG_INVALID_SERVER_A2A_HOST', { expected: 'string' });
175
+ }
176
+ if (a2aRaw.port !== undefined && !isNumber(a2aRaw.port)) {
177
+ throw new ConfigError('CONFIG_INVALID_SERVER_A2A_PORT', { expected: 'number' });
178
+ }
179
+ if (a2aRaw.tokens !== undefined) {
180
+ if (!Array.isArray(a2aRaw.tokens) || !a2aRaw.tokens.every(isString)) {
181
+ throw new ConfigError('CONFIG_INVALID_SERVER_A2A_TOKENS', { expected: 'string[]' });
182
+ }
183
+ }
184
+ server.a2a = {
185
+ host: a2aRaw.host,
186
+ port: a2aRaw.port,
187
+ tokens: a2aRaw.tokens,
188
+ };
189
+ }
190
+ if (serverRaw.sidecar !== undefined) {
191
+ if (!isRecord(serverRaw.sidecar)) {
192
+ throw new ConfigError('CONFIG_INVALID_SERVER_SIDECAR', { expected: 'object' });
193
+ }
194
+ const sidecarRaw = serverRaw.sidecar;
195
+ if (sidecarRaw.socket !== undefined && !isString(sidecarRaw.socket)) {
196
+ throw new ConfigError('CONFIG_INVALID_SERVER_SIDECAR_SOCKET', { expected: 'string' });
197
+ }
198
+ if (sidecarRaw.allowConditional !== undefined && !isBoolean(sidecarRaw.allowConditional)) {
199
+ throw new ConfigError('CONFIG_INVALID_SERVER_SIDECAR_ALLOW_CONDITIONAL', {
200
+ expected: 'boolean',
201
+ });
202
+ }
203
+ server.sidecar = {
204
+ socket: sidecarRaw.socket,
205
+ allowConditional: sidecarRaw.allowConditional,
206
+ };
207
+ }
208
+ if (serverRaw.acp !== undefined) {
209
+ if (!isRecord(serverRaw.acp)) {
210
+ throw new ConfigError('CONFIG_INVALID_SERVER_ACP', { expected: 'object' });
211
+ }
212
+ const acpRaw = serverRaw.acp;
213
+ const acp = {};
214
+ if (acpRaw.sessionStore !== undefined) {
215
+ if (!isRecord(acpRaw.sessionStore)) {
216
+ throw new ConfigError('CONFIG_INVALID_SERVER_ACP_SESSION_STORE', { expected: 'object' });
217
+ }
218
+ const sessionStoreRaw = acpRaw.sessionStore;
219
+ const validateOptionalNumber = (value, code) => {
220
+ if (value !== undefined && !isNumber(value)) {
221
+ throw new ConfigError(code, { expected: 'number' });
222
+ }
223
+ };
224
+ validateOptionalNumber(sessionStoreRaw.maxEntries, 'CONFIG_INVALID_SERVER_ACP_SESSION_STORE_MAX_ENTRIES');
225
+ validateOptionalNumber(sessionStoreRaw.maxAgeMs, 'CONFIG_INVALID_SERVER_ACP_SESSION_STORE_MAX_AGE_MS');
226
+ validateOptionalNumber(sessionStoreRaw.historyMaxEntries, 'CONFIG_INVALID_SERVER_ACP_SESSION_STORE_HISTORY_MAX_ENTRIES');
227
+ validateOptionalNumber(sessionStoreRaw.lockStaleMs, 'CONFIG_INVALID_SERVER_ACP_SESSION_STORE_LOCK_STALE_MS');
228
+ validateOptionalNumber(sessionStoreRaw.lockHeartbeatMs, 'CONFIG_INVALID_SERVER_ACP_SESSION_STORE_LOCK_HEARTBEAT_MS');
229
+ acp.sessionStore = {
230
+ maxEntries: sessionStoreRaw.maxEntries,
231
+ maxAgeMs: sessionStoreRaw.maxAgeMs,
232
+ historyMaxEntries: sessionStoreRaw.historyMaxEntries,
233
+ lockStaleMs: sessionStoreRaw.lockStaleMs,
234
+ lockHeartbeatMs: sessionStoreRaw.lockHeartbeatMs,
235
+ };
236
+ }
237
+ if (acpRaw.checkpointManifest !== undefined) {
238
+ if (!isRecord(acpRaw.checkpointManifest)) {
239
+ throw new ConfigError('CONFIG_INVALID_SERVER_ACP_CHECKPOINT_MANIFEST', {
240
+ expected: 'object',
241
+ });
242
+ }
243
+ const manifestRaw = acpRaw.checkpointManifest;
244
+ const validateOptionalNumber = (value, code) => {
245
+ if (value !== undefined && !isNumber(value)) {
246
+ throw new ConfigError(code, { expected: 'number' });
247
+ }
248
+ };
249
+ validateOptionalNumber(manifestRaw.lockStaleMs, 'CONFIG_INVALID_SERVER_ACP_CHECKPOINT_MANIFEST_LOCK_STALE_MS');
250
+ validateOptionalNumber(manifestRaw.lockHeartbeatMs, 'CONFIG_INVALID_SERVER_ACP_CHECKPOINT_MANIFEST_LOCK_HEARTBEAT_MS');
251
+ acp.checkpointManifest = {
252
+ lockStaleMs: manifestRaw.lockStaleMs,
253
+ lockHeartbeatMs: manifestRaw.lockHeartbeatMs,
254
+ };
255
+ }
256
+ server.acp = acp;
257
+ }
258
+ cfg.server = server;
259
+ }
260
+ if (input.ui !== undefined) {
261
+ const uiRaw = input.ui;
262
+ if (!isRecord(uiRaw)) {
263
+ throw new ConfigError('CONFIG_INVALID_UI', { expected: 'object' });
264
+ }
265
+ const ui = {};
266
+ const logRaw = uiRaw.log;
267
+ if (logRaw !== undefined) {
268
+ if (!isRecord(logRaw)) {
269
+ throw new ConfigError('CONFIG_INVALID_UI_LOG', { expected: 'object' });
270
+ }
271
+ const viewRaw = logRaw.view;
272
+ const modeRaw = logRaw.mode;
273
+ if (viewRaw !== undefined) {
274
+ if (!isString(viewRaw)) {
275
+ throw new ConfigError('CONFIG_INVALID_UI_LOG_VIEW', { expected: 'string' });
276
+ }
277
+ const normalized = normalizeUiLogView(viewRaw);
278
+ if (!normalized) {
279
+ throw new ConfigError('CONFIG_INVALID_UI_LOG_VIEW', { view: String(viewRaw) });
280
+ }
281
+ ui.log = { ...(ui.log ?? {}), view: normalized };
282
+ }
283
+ else {
284
+ ui.log = {};
285
+ }
286
+ if (modeRaw !== undefined) {
287
+ if (!isString(modeRaw)) {
288
+ throw new ConfigError('CONFIG_INVALID_UI_LOG_MODE', { expected: 'string' });
289
+ }
290
+ const normalized = normalizeUiLogMode(modeRaw);
291
+ if (!normalized) {
292
+ throw new ConfigError('CONFIG_INVALID_UI_LOG_MODE', { mode: String(modeRaw) });
293
+ }
294
+ ui.log = { ...(ui.log ?? {}), mode: normalized };
295
+ }
296
+ }
297
+ cfg.ui = ui;
298
+ }
299
+ if (input.context !== undefined) {
300
+ const contextRaw = input.context;
301
+ if (!isRecord(contextRaw)) {
302
+ throw new ConfigError('CONFIG_INVALID_CONTEXT', { expected: 'object' });
303
+ }
304
+ cfg.context = {};
305
+ if (contextRaw.useTokenBudget !== undefined && !isBoolean(contextRaw.useTokenBudget)) {
306
+ throw new ConfigError('CONFIG_INVALID_USE_TOKEN_BUDGET', { expected: 'boolean' });
307
+ }
308
+ if (contextRaw.useTokenBudget !== undefined) {
309
+ cfg.context.useTokenBudget = contextRaw.useTokenBudget;
310
+ }
311
+ if (contextRaw.cache !== undefined) {
312
+ if (!isRecord(contextRaw.cache)) {
313
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE', { expected: 'object' });
314
+ }
315
+ const cacheRaw = contextRaw.cache;
316
+ const cache = {};
317
+ if (cacheRaw.mode !== undefined &&
318
+ cacheRaw.mode !== 'memory' &&
319
+ cacheRaw.mode !== 'persistent') {
320
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_MODE', { mode: String(cacheRaw.mode) });
321
+ }
322
+ if (cacheRaw.path !== undefined && !isString(cacheRaw.path)) {
323
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_PATH', { expected: 'string' });
324
+ }
325
+ if (cacheRaw.allowedRoots !== undefined &&
326
+ (!Array.isArray(cacheRaw.allowedRoots) || cacheRaw.allowedRoots.some((v) => !isString(v)))) {
327
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_ALLOWED_ROOTS', {
328
+ expected: 'string[]',
329
+ });
330
+ }
331
+ if (cacheRaw.maxEntries !== undefined && !isNumber(cacheRaw.maxEntries)) {
332
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_MAX_ENTRIES', { expected: 'number' });
333
+ }
334
+ if (cacheRaw.ttlMs !== undefined && !isNumber(cacheRaw.ttlMs)) {
335
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_TTL', { expected: 'number' });
336
+ }
337
+ if (cacheRaw.maxPayloadBytes !== undefined && !isNumber(cacheRaw.maxPayloadBytes)) {
338
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_MAX_PAYLOAD', { expected: 'number' });
339
+ }
340
+ if (cacheRaw.mode === 'persistent') {
341
+ if (!isString(cacheRaw.path) || cacheRaw.path.length === 0) {
342
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_PATH', {
343
+ expected: 'non-empty string',
344
+ });
345
+ }
346
+ if (!Array.isArray(cacheRaw.allowedRoots) ||
347
+ cacheRaw.allowedRoots.length === 0 ||
348
+ cacheRaw.allowedRoots.some((v) => !isString(v) || v.length === 0)) {
349
+ throw new ConfigError('CONFIG_INVALID_CONTEXT_CACHE_ALLOWED_ROOTS', {
350
+ expected: 'non-empty string[]',
351
+ });
352
+ }
353
+ }
354
+ cache.mode = cacheRaw.mode;
355
+ cache.path = cacheRaw.path;
356
+ cache.allowedRoots = cacheRaw.allowedRoots;
357
+ cache.maxEntries = cacheRaw.maxEntries;
358
+ cache.ttlMs = cacheRaw.ttlMs;
359
+ cache.maxPayloadBytes = cacheRaw.maxPayloadBytes;
360
+ cfg.context.cache = cache;
361
+ }
362
+ if (contextRaw.churn !== undefined) {
363
+ if (!isRecord(contextRaw.churn)) {
364
+ throw new ConfigError('CONFIG_INVALID_CHURN', { expected: 'object' });
365
+ }
366
+ const churnRaw = contextRaw.churn;
367
+ const churn = {};
368
+ if (churnRaw.weight !== undefined) {
369
+ if (!isRecord(churnRaw.weight)) {
370
+ throw new ConfigError('CONFIG_INVALID_CHURN_WEIGHT', { expected: 'object' });
371
+ }
372
+ const weightRaw = churnRaw.weight;
373
+ if (weightRaw.primary !== undefined && !isNumber(weightRaw.primary)) {
374
+ throw new ConfigError('CONFIG_INVALID_CHURN_WEIGHT_PRIMARY', { expected: 'number' });
375
+ }
376
+ if (weightRaw.rerank !== undefined && !isNumber(weightRaw.rerank)) {
377
+ throw new ConfigError('CONFIG_INVALID_CHURN_WEIGHT_RERANK', { expected: 'number' });
378
+ }
379
+ if (weightRaw.tiebreak !== undefined && !isNumber(weightRaw.tiebreak)) {
380
+ throw new ConfigError('CONFIG_INVALID_CHURN_WEIGHT_TIEBREAK', { expected: 'number' });
381
+ }
382
+ churn.weight = {
383
+ primary: weightRaw.primary,
384
+ rerank: weightRaw.rerank,
385
+ tiebreak: weightRaw.tiebreak,
386
+ };
387
+ }
388
+ cfg.context.churn = churn;
389
+ }
390
+ if (contextRaw.dynamicBudget !== undefined) {
391
+ if (!isRecord(contextRaw.dynamicBudget)) {
392
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET', { expected: 'object' });
393
+ }
394
+ const dynamicBudgetRaw = contextRaw.dynamicBudget;
395
+ const dynamicBudget = {};
396
+ if (dynamicBudgetRaw.enabled !== undefined && !isBoolean(dynamicBudgetRaw.enabled)) {
397
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_ENABLED', { expected: 'boolean' });
398
+ }
399
+ if (dynamicBudgetRaw.minBudget !== undefined && !isNumber(dynamicBudgetRaw.minBudget)) {
400
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_MIN', { expected: 'number' });
401
+ }
402
+ if (dynamicBudgetRaw.maxBudget !== undefined && !isNumber(dynamicBudgetRaw.maxBudget)) {
403
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_MAX', { expected: 'number' });
404
+ }
405
+ if (dynamicBudgetRaw.adjustmentStep !== undefined &&
406
+ !isNumber(dynamicBudgetRaw.adjustmentStep)) {
407
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_STEP', { expected: 'number' });
408
+ }
409
+ dynamicBudget.enabled = dynamicBudgetRaw.enabled;
410
+ dynamicBudget.minBudget = dynamicBudgetRaw.minBudget;
411
+ dynamicBudget.maxBudget = dynamicBudgetRaw.maxBudget;
412
+ dynamicBudget.adjustmentStep = dynamicBudgetRaw.adjustmentStep;
413
+ if (dynamicBudgetRaw.alerts !== undefined) {
414
+ if (!isRecord(dynamicBudgetRaw.alerts)) {
415
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_ALERTS', { expected: 'object' });
416
+ }
417
+ const alertsRaw = dynamicBudgetRaw.alerts;
418
+ if (alertsRaw.truncationRateWarn !== undefined && !isNumber(alertsRaw.truncationRateWarn)) {
419
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_ALERT_TRUNCATION', {
420
+ expected: 'number',
421
+ });
422
+ }
423
+ if (alertsRaw.criticalDropRateWarn !== undefined &&
424
+ !isNumber(alertsRaw.criticalDropRateWarn)) {
425
+ throw new ConfigError('CONFIG_INVALID_DYNAMIC_BUDGET_ALERT_CRITICAL_DROP', {
426
+ expected: 'number',
427
+ });
428
+ }
429
+ dynamicBudget.alerts = {
430
+ truncationRateWarn: alertsRaw.truncationRateWarn,
431
+ criticalDropRateWarn: alertsRaw.criticalDropRateWarn,
432
+ };
433
+ }
434
+ cfg.context.dynamicBudget = dynamicBudget;
435
+ }
436
+ }
437
+ if (input.verify !== undefined) {
438
+ if (!isRecord(input.verify)) {
439
+ throw new ConfigError('CONFIG_INVALID_VERIFY', { expected: 'object' });
440
+ }
441
+ if (input.verify.command !== undefined && !isString(input.verify.command)) {
442
+ throw new ConfigError('CONFIG_INVALID_VERIFY_COMMAND', { expected: 'string' });
443
+ }
444
+ if (input.verify.timeoutMs !== undefined && !isNumber(input.verify.timeoutMs)) {
445
+ throw new ConfigError('CONFIG_INVALID_VERIFY_TIMEOUT', { expected: 'number' });
446
+ }
447
+ cfg.verify = { command: input.verify.command, timeoutMs: input.verify.timeoutMs };
448
+ }
449
+ if (input.astValidation !== undefined) {
450
+ const astValidationRaw = input.astValidation;
451
+ if (!isRecord(astValidationRaw)) {
452
+ throw new ConfigError('CONFIG_INVALID_AST_VALIDATION', { expected: 'object' });
453
+ }
454
+ const strictnessRaw = astValidationRaw.strictness;
455
+ if (strictnessRaw !== undefined && strictnessRaw !== 'lenient' && strictnessRaw !== 'strict') {
456
+ throw new ConfigError('CONFIG_INVALID_AST_VALIDATION_STRICTNESS', {
457
+ strictness: String(strictnessRaw),
458
+ });
459
+ }
460
+ cfg.astValidation = {
461
+ strictness: strictnessRaw,
462
+ };
463
+ }
464
+ if (input.llm !== undefined) {
465
+ if (!isRecord(input.llm)) {
466
+ throw new ConfigError('CONFIG_INVALID_LLM', { expected: 'object' });
467
+ }
468
+ cfg.llm = {};
469
+ if (input.llm.activeModel !== undefined && !isString(input.llm.activeModel)) {
470
+ throw new ConfigError('CONFIG_INVALID_LLM_ACTIVE_MODEL', { expected: 'string' });
471
+ }
472
+ if (input.llm.activeModel !== undefined)
473
+ cfg.llm.activeModel = input.llm.activeModel;
474
+ if (input.llm.providers !== undefined) {
475
+ if (!isRecord(input.llm.providers)) {
476
+ throw new ConfigError('CONFIG_INVALID_LLM_PROVIDERS', { expected: 'object' });
477
+ }
478
+ cfg.llm.providers = {};
479
+ for (const [id, rawProvider] of Object.entries(input.llm.providers)) {
480
+ if (!isRecord(rawProvider)) {
481
+ throw new ConfigError('CONFIG_INVALID_PROVIDER', { provider: id, expected: 'object' });
482
+ }
483
+ const p = { type: String(rawProvider.type) };
484
+ if (!isString(rawProvider.type)) {
485
+ throw new ConfigError('CONFIG_INVALID_TYPE', { provider: id, expected: 'string' });
486
+ }
487
+ if (rawProvider.client !== undefined) {
488
+ if (!isRecord(rawProvider.client)) {
489
+ throw new ConfigError('CONFIG_INVALID_CLIENT', { provider: id, expected: 'object' });
490
+ }
491
+ if (rawProvider.client.package !== undefined && !isString(rawProvider.client.package)) {
492
+ throw new ConfigError('CONFIG_INVALID_CLIENT_PACKAGE', {
493
+ provider: id,
494
+ expected: 'string',
495
+ });
496
+ }
497
+ p.client = { package: rawProvider.client.package };
498
+ }
499
+ if (rawProvider.api !== undefined) {
500
+ if (!isRecord(rawProvider.api)) {
501
+ throw new ConfigError('CONFIG_INVALID_API', { provider: id, expected: 'object' });
502
+ }
503
+ const api = rawProvider.api;
504
+ if (api.baseUrl !== undefined && !isString(api.baseUrl)) {
505
+ throw new ConfigError('CONFIG_INVALID_BASE_URL', { provider: id, expected: 'string' });
506
+ }
507
+ if (api.apiKey !== undefined && api.apiKey !== null && !isString(api.apiKey)) {
508
+ throw new ConfigError('CONFIG_INVALID_API_KEY', {
509
+ provider: id,
510
+ expected: 'string_or_null',
511
+ });
512
+ }
513
+ if (api.timeoutMs !== undefined && !isNumber(api.timeoutMs)) {
514
+ throw new ConfigError('CONFIG_INVALID_TIMEOUT', { provider: id, expected: 'number' });
515
+ }
516
+ if (api.headers !== undefined) {
517
+ if (!isRecord(api.headers)) {
518
+ throw new ConfigError('CONFIG_INVALID_HEADERS', { provider: id, expected: 'object' });
519
+ }
520
+ for (const [k, v] of Object.entries(api.headers)) {
521
+ if (!isString(v)) {
522
+ throw new ConfigError('CONFIG_INVALID_HEADER_VALUE', {
523
+ provider: id,
524
+ header: k,
525
+ expected: 'string',
526
+ });
527
+ }
528
+ }
529
+ }
530
+ p.api = {
531
+ baseUrl: api.baseUrl,
532
+ apiKey: api.apiKey,
533
+ timeoutMs: api.timeoutMs,
534
+ headers: api.headers,
535
+ };
536
+ }
537
+ if (rawProvider.models !== undefined) {
538
+ throw new ConfigError('CONFIG_LLM_PROVIDER_MODELS_NOT_SUPPORTED', {
539
+ provider: id,
540
+ hint: 'use llm.models with provider references',
541
+ });
542
+ }
543
+ cfg.llm.providers[id] = p;
544
+ }
545
+ }
546
+ if (input.llm.models !== undefined) {
547
+ if (!isRecord(input.llm.models)) {
548
+ throw new ConfigError('CONFIG_INVALID_LLM_MODELS', { expected: 'object' });
549
+ }
550
+ cfg.llm.models = {};
551
+ for (const [slot, rawModel] of Object.entries(input.llm.models)) {
552
+ if (!isRecord(rawModel)) {
553
+ throw new ConfigError('CONFIG_INVALID_LLM_MODEL_PROFILE', {
554
+ model: slot,
555
+ expected: 'object',
556
+ });
557
+ }
558
+ const provider = rawModel.provider;
559
+ if (!isString(provider) &&
560
+ !(Array.isArray(provider) && provider.length > 0 && provider.every(isString))) {
561
+ throw new ConfigError('CONFIG_INVALID_LLM_MODEL_PROVIDER', {
562
+ model: slot,
563
+ expected: 'string_or_non_empty_string_array',
564
+ });
565
+ }
566
+ if (!isString(rawModel.id) || !rawModel.id.trim()) {
567
+ throw new ConfigError('CONFIG_INVALID_LLM_MODEL_ID', {
568
+ model: slot,
569
+ expected: 'non_empty_string',
570
+ });
571
+ }
572
+ cfg.llm.models[slot] = {
573
+ provider: provider,
574
+ id: rawModel.id,
575
+ params: isRecord(rawModel.params)
576
+ ? rawModel.params
577
+ : undefined,
578
+ };
579
+ }
580
+ }
581
+ if (input.llm.routing !== undefined) {
582
+ if (!isRecord(input.llm.routing)) {
583
+ throw new ConfigError('CONFIG_INVALID_ROUTING', { expected: 'object' });
584
+ }
585
+ const r = input.llm.routing;
586
+ cfg.llm.routing = {};
587
+ if (r.fallbackProviders !== undefined) {
588
+ if (!Array.isArray(r.fallbackProviders) || !r.fallbackProviders.every(isString)) {
589
+ throw new ConfigError('CONFIG_INVALID_FALLBACK_PROVIDERS', { expected: 'string_array' });
590
+ }
591
+ cfg.llm.routing.fallbackProviders = r.fallbackProviders;
592
+ }
593
+ if (r.taskToModel !== undefined) {
594
+ if (!isRecord(r.taskToModel)) {
595
+ throw new ConfigError('CONFIG_INVALID_TASK_TO_MODEL', { expected: 'object' });
596
+ }
597
+ for (const [k, v] of Object.entries(r.taskToModel)) {
598
+ if (!isString(v)) {
599
+ throw new ConfigError('CONFIG_INVALID_TASK_TO_MODEL_VALUE', {
600
+ task: k,
601
+ expected: 'string',
602
+ });
603
+ }
604
+ }
605
+ cfg.llm.routing.taskToModel = r.taskToModel;
606
+ }
607
+ if (r.phaseToModel !== undefined) {
608
+ if (!isRecord(r.phaseToModel)) {
609
+ throw new ConfigError('CONFIG_INVALID_PHASE_TO_MODEL', { expected: 'object' });
610
+ }
611
+ for (const [k, v] of Object.entries(r.phaseToModel)) {
612
+ if (!isString(v)) {
613
+ throw new ConfigError('CONFIG_INVALID_PHASE_TO_MODEL_VALUE', {
614
+ phase: k,
615
+ expected: 'string',
616
+ });
617
+ }
618
+ }
619
+ cfg.llm.routing.phaseToModel = r.phaseToModel;
620
+ }
621
+ }
622
+ }
623
+ if (input.security !== undefined) {
624
+ const securityRaw = input.security;
625
+ if (!isRecord(securityRaw)) {
626
+ throw new ConfigError('CONFIG_INVALID_SECURITY', { expected: 'object' });
627
+ }
628
+ if (securityRaw.redaction !== undefined) {
629
+ if (!isRecord(securityRaw.redaction)) {
630
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION', { expected: 'object' });
631
+ }
632
+ const redactionRaw = securityRaw.redaction;
633
+ if (redactionRaw.enabled !== undefined && !isBoolean(redactionRaw.enabled)) {
634
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_ENABLED', {
635
+ expected: 'boolean',
636
+ });
637
+ }
638
+ if (redactionRaw.mark !== undefined && !isString(redactionRaw.mark)) {
639
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_MARK', { expected: 'string' });
640
+ }
641
+ if (redactionRaw.maxDepth !== undefined && !isNumber(redactionRaw.maxDepth)) {
642
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_MAX_DEPTH', {
643
+ expected: 'number',
644
+ });
645
+ }
646
+ if (redactionRaw.keyAllowlist !== undefined &&
647
+ (!Array.isArray(redactionRaw.keyAllowlist) ||
648
+ redactionRaw.keyAllowlist.some((v) => !isString(v)))) {
649
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_KEY_ALLOWLIST', {
650
+ expected: 'string[]',
651
+ });
652
+ }
653
+ if (redactionRaw.keyDenylist !== undefined &&
654
+ (!Array.isArray(redactionRaw.keyDenylist) ||
655
+ redactionRaw.keyDenylist.some((v) => !isString(v)))) {
656
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_KEY_DENYLIST', {
657
+ expected: 'string[]',
658
+ });
659
+ }
660
+ if (redactionRaw.patterns !== undefined &&
661
+ (!Array.isArray(redactionRaw.patterns) || redactionRaw.patterns.some((v) => !isString(v)))) {
662
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_PATTERNS', {
663
+ expected: 'string[]',
664
+ });
665
+ }
666
+ if (redactionRaw.disableDefaults !== undefined && !isBoolean(redactionRaw.disableDefaults)) {
667
+ throw new ConfigError('CONFIG_INVALID_SECURITY_REDACTION_DISABLE_DEFAULTS', {
668
+ expected: 'boolean',
669
+ });
670
+ }
671
+ cfg.security = {
672
+ redaction: {
673
+ enabled: redactionRaw.enabled,
674
+ mark: redactionRaw.mark,
675
+ maxDepth: redactionRaw.maxDepth,
676
+ keyAllowlist: redactionRaw.keyAllowlist,
677
+ keyDenylist: redactionRaw.keyDenylist,
678
+ patterns: redactionRaw.patterns,
679
+ disableDefaults: redactionRaw.disableDefaults,
680
+ },
681
+ };
682
+ }
683
+ }
684
+ if (input.output !== undefined) {
685
+ if (!isRecord(input.output)) {
686
+ throw new ConfigError('CONFIG_INVALID_OUTPUT', { expected: 'object' });
687
+ }
688
+ const output = input.output;
689
+ cfg.output = {};
690
+ if (output.llm !== undefined) {
691
+ if (!isRecord(output.llm)) {
692
+ throw new ConfigError('CONFIG_INVALID_LLM_OUTPUT', { expected: 'object' });
693
+ }
694
+ const llmOutput = output.llm;
695
+ if (llmOutput.kinds !== undefined) {
696
+ if (!Array.isArray(llmOutput.kinds) || !llmOutput.kinds.every(isString)) {
697
+ throw new ConfigError('CONFIG_INVALID_LLM_OUTPUT_KINDS', { expected: 'string_array' });
698
+ }
699
+ const invalidKind = llmOutput.kinds.find((kind) => !isValidLlmOutputKind(kind));
700
+ if (invalidKind) {
701
+ throw new ConfigError('CONFIG_INVALID_LLM_OUTPUT_KIND', { kind: String(invalidKind) });
702
+ }
703
+ }
704
+ cfg.output.llm = {
705
+ kinds: llmOutput.kinds,
706
+ };
707
+ }
708
+ if (output.markdown !== undefined) {
709
+ if (!isRecord(output.markdown)) {
710
+ throw new ConfigError('CONFIG_INVALID_OUTPUT_MARKDOWN', { expected: 'object' });
711
+ }
712
+ const markdown = output.markdown;
713
+ if (markdown.theme !== undefined) {
714
+ if (!isString(markdown.theme)) {
715
+ throw new ConfigError('CONFIG_INVALID_MARKDOWN_THEME', { expected: 'string' });
716
+ }
717
+ if (!isValidMarkdownTheme(markdown.theme)) {
718
+ throw new ConfigError('CONFIG_INVALID_MARKDOWN_THEME', { theme: String(markdown.theme) });
719
+ }
720
+ }
721
+ if (markdown.mode !== undefined) {
722
+ if (!isString(markdown.mode)) {
723
+ throw new ConfigError('CONFIG_INVALID_MARKDOWN_RENDER_MODE', { expected: 'string' });
724
+ }
725
+ if (!isValidMarkdownRenderMode(markdown.mode)) {
726
+ throw new ConfigError('CONFIG_INVALID_MARKDOWN_RENDER_MODE', {
727
+ mode: String(markdown.mode),
728
+ });
729
+ }
730
+ }
731
+ cfg.output.markdown = {
732
+ theme: markdown.theme,
733
+ mode: markdown.mode,
734
+ };
735
+ }
736
+ }
737
+ if (input.toolAuthorization !== undefined) {
738
+ if (!isRecord(input.toolAuthorization)) {
739
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH', { expected: 'object' });
740
+ }
741
+ cfg.toolAuthorization = {};
742
+ const t = input.toolAuthorization;
743
+ if (t.sessionTtlMs !== undefined && !isNumber(t.sessionTtlMs)) {
744
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_TTL', { expected: 'number' });
745
+ }
746
+ if (t.nonInteractive !== undefined) {
747
+ if (!isRecord(t.nonInteractive)) {
748
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE', { expected: 'object' });
749
+ }
750
+ const ni = t.nonInteractive;
751
+ if (ni.strategy !== undefined && !isString(ni.strategy)) {
752
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_STRATEGY', {
753
+ expected: 'string',
754
+ });
755
+ }
756
+ const strategy = ni.strategy ?? undefined;
757
+ if (strategy !== undefined &&
758
+ strategy !== 'deny' &&
759
+ strategy !== 'command' &&
760
+ strategy !== 'mcp') {
761
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_STRATEGY', {
762
+ strategy: String(strategy),
763
+ });
764
+ }
765
+ if (ni.command !== undefined) {
766
+ if (!isRecord(ni.command)) {
767
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_COMMAND', {
768
+ expected: 'object',
769
+ });
770
+ }
771
+ if (!isString(ni.command.cmd)) {
772
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_COMMAND_CMD', {
773
+ expected: 'string',
774
+ });
775
+ }
776
+ if (ni.command.timeoutMs !== undefined && !isNumber(ni.command.timeoutMs)) {
777
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_COMMAND_TIMEOUT', {
778
+ expected: 'number',
779
+ });
780
+ }
781
+ }
782
+ if (ni.mcp !== undefined) {
783
+ if (!isRecord(ni.mcp)) {
784
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_MCP', {
785
+ expected: 'object',
786
+ });
787
+ }
788
+ if (!isString(ni.mcp.server)) {
789
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_MCP_SERVER', {
790
+ expected: 'string',
791
+ });
792
+ }
793
+ if (!isString(ni.mcp.tool)) {
794
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_MCP_TOOL', {
795
+ expected: 'string',
796
+ });
797
+ }
798
+ if (ni.mcp.timeoutMs !== undefined && !isNumber(ni.mcp.timeoutMs)) {
799
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_NON_INTERACTIVE_MCP_TIMEOUT', {
800
+ expected: 'number',
801
+ });
802
+ }
803
+ }
804
+ cfg.toolAuthorization.nonInteractive = {
805
+ strategy: strategy,
806
+ command: ni.command,
807
+ mcp: ni.mcp,
808
+ };
809
+ }
810
+ if (t.autoAllowRisk !== undefined) {
811
+ if (!isRecord(t.autoAllowRisk)) {
812
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_RISK', { expected: 'object' });
813
+ }
814
+ const r = t.autoAllowRisk;
815
+ if (r.low !== undefined && !isBoolean(r.low)) {
816
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_RISK_LOW', { expected: 'boolean' });
817
+ }
818
+ if (r.medium !== undefined && !isBoolean(r.medium)) {
819
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_RISK_MEDIUM', { expected: 'boolean' });
820
+ }
821
+ if (r.high !== undefined && !isBoolean(r.high)) {
822
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_RISK_HIGH', { expected: 'boolean' });
823
+ }
824
+ cfg.toolAuthorization.autoAllowRisk = {
825
+ low: r.low,
826
+ medium: r.medium,
827
+ high: r.high,
828
+ };
829
+ }
830
+ if (t.allowlist !== undefined) {
831
+ if (!isRecord(t.allowlist)) {
832
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_ALLOWLIST', { expected: 'object' });
833
+ }
834
+ const a = t.allowlist;
835
+ if (a.repoFile !== undefined && !isString(a.repoFile)) {
836
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_REPO_FILE', { expected: 'string' });
837
+ }
838
+ if (a.userFile !== undefined && !isString(a.userFile)) {
839
+ throw new ConfigError('CONFIG_INVALID_TOOL_AUTH_USER_FILE', { expected: 'string' });
840
+ }
841
+ cfg.toolAuthorization.allowlist = {
842
+ repoFile: a.repoFile,
843
+ userFile: a.userFile,
844
+ };
845
+ }
846
+ if (t.sessionTtlMs !== undefined) {
847
+ cfg.toolAuthorization.sessionTtlMs = t.sessionTtlMs;
848
+ }
849
+ }
850
+ return cfg;
851
+ }
852
+ //# sourceMappingURL=validate.js.map