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,173 @@
1
+ /**
2
+ * Encoding registry using Strategy pattern.
3
+ *
4
+ * Allows registration of new encodings without modifying existing code.
5
+ * Follows Open/Closed Principle.
6
+ */
7
+ import { get_encoding } from 'tiktoken';
8
+ /**
9
+ * Base encoding implementation using tiktoken.
10
+ */
11
+ class TiktokenEncoding {
12
+ name;
13
+ models;
14
+ encoder = null;
15
+ initialized = false;
16
+ constructor(name, models) {
17
+ this.name = name;
18
+ this.models = models;
19
+ }
20
+ async initialize() {
21
+ if (this.initialized)
22
+ return;
23
+ this.encoder = get_encoding(this.getTiktokenName());
24
+ this.initialized = true;
25
+ }
26
+ encode(text) {
27
+ this.ensureInitialized();
28
+ return Array.from(this.encoder.encode(text));
29
+ }
30
+ decode(tokens) {
31
+ this.ensureInitialized();
32
+ const uint32Tokens = new Uint32Array(tokens);
33
+ const decoded = this.encoder.decode(uint32Tokens);
34
+ return new TextDecoder().decode(decoded);
35
+ }
36
+ count(text) {
37
+ return this.encode(text).length;
38
+ }
39
+ dispose() {
40
+ if (this.encoder) {
41
+ this.encoder.free();
42
+ this.encoder = null;
43
+ }
44
+ this.initialized = false;
45
+ }
46
+ ensureInitialized() {
47
+ if (!this.initialized || !this.encoder) {
48
+ throw new Error(`Encoding ${this.name} not initialized. Call initialize() first.`);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * cl100k_base encoding (GPT-4, GPT-3.5-turbo, Claude).
54
+ */
55
+ class Cl100kEncoding extends TiktokenEncoding {
56
+ constructor() {
57
+ super('cl100k_base', ['openai-gpt4', 'openai-gpt35', 'anthropic-claude']);
58
+ }
59
+ getTiktokenName() {
60
+ return 'cl100k_base';
61
+ }
62
+ }
63
+ /**
64
+ * o200k_base encoding (GPT-4o, GPT-4o-mini).
65
+ */
66
+ class O200kEncoding extends TiktokenEncoding {
67
+ constructor() {
68
+ super('o200k_base', ['openai-gpt4o']);
69
+ }
70
+ getTiktokenName() {
71
+ return 'o200k_base';
72
+ }
73
+ }
74
+ /**
75
+ * Registry for encoding strategies.
76
+ *
77
+ * Features:
78
+ * - Register new encodings at runtime
79
+ * - Auto-select encoding by model family
80
+ * - Default encoding fallback
81
+ */
82
+ export class EncodingRegistry {
83
+ encodings = new Map();
84
+ modelToEncoding = new Map();
85
+ initialized = false;
86
+ constructor() {
87
+ // Register default encodings
88
+ this.register(new Cl100kEncoding());
89
+ this.register(new O200kEncoding());
90
+ }
91
+ /**
92
+ * Register a new encoding.
93
+ */
94
+ register(encoding) {
95
+ this.encodings.set(encoding.name, encoding);
96
+ for (const model of encoding.models) {
97
+ this.modelToEncoding.set(model, encoding.name);
98
+ }
99
+ }
100
+ /**
101
+ * Get encoding by type.
102
+ */
103
+ get(encoding) {
104
+ const enc = this.encodings.get(encoding);
105
+ if (!enc) {
106
+ throw new Error(`Unknown encoding: ${encoding}`);
107
+ }
108
+ return enc;
109
+ }
110
+ /**
111
+ * Get encoding for a model family.
112
+ * Returns default encoding if model not found.
113
+ */
114
+ getByModel(model) {
115
+ const encodingName = this.modelToEncoding.get(model);
116
+ if (!encodingName) {
117
+ // Default fallback
118
+ return this.get('cl100k_base');
119
+ }
120
+ return this.get(encodingName);
121
+ }
122
+ /**
123
+ * Get encoding type for a model family.
124
+ */
125
+ getEncodingTypeForModel(model) {
126
+ return this.modelToEncoding.get(model) ?? 'cl100k_base';
127
+ }
128
+ /**
129
+ * Check if encoding is registered.
130
+ */
131
+ has(encoding) {
132
+ return this.encodings.has(encoding);
133
+ }
134
+ /**
135
+ * List all registered encodings.
136
+ */
137
+ listEncodings() {
138
+ return Array.from(this.encodings.keys());
139
+ }
140
+ /**
141
+ * List all registered models.
142
+ */
143
+ listModels() {
144
+ return Array.from(this.modelToEncoding.keys());
145
+ }
146
+ /**
147
+ * Initialize all encodings.
148
+ * Call once at application startup.
149
+ */
150
+ async initializeAll() {
151
+ if (this.initialized)
152
+ return;
153
+ await Promise.all(Array.from(this.encodings.values()).map((e) => e.initialize()));
154
+ this.initialized = true;
155
+ }
156
+ /**
157
+ * Dispose all encodings.
158
+ * Call at application shutdown.
159
+ */
160
+ disposeAll() {
161
+ for (const encoding of this.encodings.values()) {
162
+ encoding.dispose();
163
+ }
164
+ this.initialized = false;
165
+ }
166
+ /**
167
+ * Check if initialized.
168
+ */
169
+ isInitialized() {
170
+ return this.initialized;
171
+ }
172
+ }
173
+ //# sourceMappingURL=encoding-registry.js.map
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Token counting module.
3
+ *
4
+ * Provides accurate token counting with caching for performance optimization.
5
+ * Includes model-adaptive budget calculation.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { TokenCounter, TokenBudgetCalculator } from './token/index.js';
10
+ *
11
+ * const counter = new TokenCounter();
12
+ * await counter.initialize();
13
+ *
14
+ * // Simple counting
15
+ * const tokens = counter.count('Hello, world!');
16
+ *
17
+ * // Count for a model
18
+ * const tokens = counter.countByModel('Hello', 'openai-gpt4');
19
+ *
20
+ * // Model-adaptive budget
21
+ * const budget = new TokenBudgetCalculator();
22
+ * budget.setModel('gpt-4o');
23
+ * const defaultBudget = budget.getDefaultBudget();
24
+ * ```
25
+ */
26
+ export { TokenCounter } from './counter.js';
27
+ export { TokenCache } from './cache.js';
28
+ export { EncodingRegistry } from './encoding-registry.js';
29
+ export { TokenBudgetCalculator, DEFAULT_TOKEN_BUDGET_CONFIG } from './token-budget.js';
30
+ export { AdaptiveBudgetCalculator, MODEL_CONTEXT_CONFIG, getAdaptiveBudgetCalculator, resetAdaptiveBudgetCalculator, getModelRecommendedBudget, getModelMinBudget, getModelMaxPrimaryTokens, } from './adaptive-budget.js';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Token budget calculator for context management.
3
+ *
4
+ * Provides token-based budget calculation as a replacement for character-based estimation.
5
+ * Designed for gradual migration from character-based to token-based budgeting.
6
+ *
7
+ * Supports model-adaptive budget via AdaptiveBudgetCalculator integration.
8
+ */
9
+ import { LIMITS } from '../../config/limits.js';
10
+ import { getAdaptiveBudgetCalculator, } from './adaptive-budget.js';
11
+ import { TokenCounter } from './index.js';
12
+ /**
13
+ * Default token budget configuration.
14
+ */
15
+ export const DEFAULT_TOKEN_BUDGET_CONFIG = {
16
+ mode: 'token',
17
+ defaultTokenBudget: LIMITS.maxContextTokens,
18
+ minTokenBudget: LIMITS.minContextTokens,
19
+ };
20
+ /**
21
+ * Token budget calculator.
22
+ *
23
+ * Provides methods for calculating token counts of context components.
24
+ * Supports model-adaptive budget via setModel().
25
+ */
26
+ export class TokenBudgetCalculator {
27
+ config;
28
+ tokenCounter = null;
29
+ initialized = false;
30
+ modelId = null;
31
+ modelConfig = null;
32
+ constructor(config = DEFAULT_TOKEN_BUDGET_CONFIG) {
33
+ this.config = config;
34
+ }
35
+ /**
36
+ * Initialize the calculator (loads tiktoken).
37
+ */
38
+ async initialize() {
39
+ if (this.initialized)
40
+ return;
41
+ if (this.config.mode === 'token') {
42
+ this.tokenCounter = new TokenCounter();
43
+ await this.tokenCounter.initialize();
44
+ }
45
+ this.initialized = true;
46
+ }
47
+ /**
48
+ * Dispose resources.
49
+ */
50
+ dispose() {
51
+ if (this.tokenCounter) {
52
+ this.tokenCounter.dispose();
53
+ this.tokenCounter = null;
54
+ }
55
+ this.initialized = false;
56
+ this.modelId = null;
57
+ this.modelConfig = null;
58
+ }
59
+ /**
60
+ * Set model for adaptive budget calculation.
61
+ * This updates budget limits based on model capabilities.
62
+ */
63
+ setModel(modelId) {
64
+ this.modelId = modelId;
65
+ this.modelConfig = getAdaptiveBudgetCalculator().resolveConfig(modelId);
66
+ }
67
+ /**
68
+ * Get current model ID.
69
+ */
70
+ getModel() {
71
+ return this.modelId;
72
+ }
73
+ /**
74
+ * Get current model context config.
75
+ */
76
+ getModelConfig() {
77
+ return this.modelConfig;
78
+ }
79
+ /**
80
+ * Set user budget configuration override.
81
+ */
82
+ setUserConfig(config) {
83
+ getAdaptiveBudgetCalculator().setUserConfig(config);
84
+ // Refresh model config if model is set
85
+ if (this.modelId) {
86
+ this.modelConfig = getAdaptiveBudgetCalculator().resolveConfig(this.modelId);
87
+ }
88
+ }
89
+ /**
90
+ * Get current budget mode.
91
+ */
92
+ get mode() {
93
+ return this.config.mode;
94
+ }
95
+ /**
96
+ * Count tokens/chars for a string based on current mode.
97
+ */
98
+ count(text) {
99
+ if (this.config.mode === 'char') {
100
+ return text.length;
101
+ }
102
+ if (!this.tokenCounter) {
103
+ // Fallback to char estimation if not initialized
104
+ return Math.ceil(text.length / 4);
105
+ }
106
+ return this.tokenCounter.count(text);
107
+ }
108
+ /**
109
+ * Calculate total tokens for context.
110
+ */
111
+ calculateTotalTokens(context) {
112
+ const primary = this.count(context.primaryText ?? '');
113
+ const related = context.relatedFiles?.reduce((sum, file) => sum + this.count(file.content ?? ''), 0) ?? 0;
114
+ const snippets = context.rgSnippets.reduce((sum, snippet) => sum + this.count(snippet.content ?? ''), 0);
115
+ const diff = this.count(context.gitDiff ?? '') +
116
+ this.count(context.stagedDiff ?? '') +
117
+ this.count(context.unstagedDiff ?? '') +
118
+ this.count(context.untrackedDiff ?? '');
119
+ return primary + related + snippets + diff;
120
+ }
121
+ /**
122
+ * Calculate section-wise tokens.
123
+ */
124
+ calculateSectionTokens(context) {
125
+ const primary = this.count(context.primaryText ?? '');
126
+ const relatedFiles = context.relatedFiles?.reduce((sum, f) => sum + this.count(f.content ?? ''), 0) ?? 0;
127
+ const rgSnippets = context.rgSnippets.reduce((sum, s) => sum + this.count(s.content ?? ''), 0);
128
+ const diffs = this.count(context.gitDiff ?? '') +
129
+ this.count(context.stagedDiff ?? '') +
130
+ this.count(context.unstagedDiff ?? '') +
131
+ this.count(context.untrackedDiff ?? '');
132
+ return {
133
+ primary,
134
+ relatedFiles,
135
+ rgSnippets,
136
+ diffs,
137
+ total: primary + relatedFiles + rgSnippets + diffs,
138
+ };
139
+ }
140
+ /**
141
+ * Calculate tokens for a file.
142
+ */
143
+ calculateFileTokens(file) {
144
+ return this.count(file.content ?? '');
145
+ }
146
+ /**
147
+ * Calculate tokens for a snippet.
148
+ */
149
+ calculateSnippetTokens(snippet) {
150
+ return this.count(snippet.content ?? '');
151
+ }
152
+ /**
153
+ * Calculate tokens for diffs.
154
+ */
155
+ calculateDiffTokens(context) {
156
+ return (this.count(context.gitDiff ?? '') +
157
+ this.count(context.stagedDiff ?? '') +
158
+ this.count(context.unstagedDiff ?? '') +
159
+ this.count(context.untrackedDiff ?? ''));
160
+ }
161
+ /**
162
+ * Get default budget for current mode.
163
+ * If model is set, returns model-specific recommended budget.
164
+ */
165
+ getDefaultBudget() {
166
+ if (this.modelConfig) {
167
+ return this.modelConfig.recommendedBudget;
168
+ }
169
+ return this.config.defaultTokenBudget;
170
+ }
171
+ /**
172
+ * Get minimum budget for current mode.
173
+ * If model is set, returns model-specific minimum budget.
174
+ */
175
+ getMinBudget() {
176
+ if (this.modelConfig) {
177
+ return this.modelConfig.minBudget;
178
+ }
179
+ return this.config.minTokenBudget;
180
+ }
181
+ /**
182
+ * Get maximum primary tokens.
183
+ * If model is set, returns model-specific max primary tokens.
184
+ */
185
+ getMaxPrimaryTokens() {
186
+ if (this.modelConfig) {
187
+ return this.modelConfig.maxPrimaryTokens;
188
+ }
189
+ return this.config.defaultTokenBudget;
190
+ }
191
+ /**
192
+ * Get output buffer for current model.
193
+ */
194
+ getOutputBuffer() {
195
+ if (this.modelConfig) {
196
+ return this.modelConfig.outputBuffer;
197
+ }
198
+ return 4096; // Default output buffer
199
+ }
200
+ /**
201
+ * Convert token budget to char estimate (for backwards compatibility).
202
+ */
203
+ tokenToCharEstimate(tokens) {
204
+ return tokens * 4; // Rough estimate: 1 token ≈ 4 chars
205
+ }
206
+ /**
207
+ * Convert char budget to token estimate.
208
+ */
209
+ charToTokenEstimate(chars) {
210
+ return Math.ceil(chars / 4);
211
+ }
212
+ }
213
+ //# sourceMappingURL=token-budget.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Token counting types and interfaces.
3
+ *
4
+ * Design Principles:
5
+ * - Strategy pattern for encoding extensibility
6
+ * - Model-agnostic configuration
7
+ * - Cache-first for performance
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Semantic truncation module.
3
+ *
4
+ * Provides type-aware truncation for tool outputs.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { SemanticTruncator, truncateOutput } from './truncation/index.js';
9
+ *
10
+ * // Using convenience function
11
+ * const result = truncateOutput(output, 4000, 'error');
12
+ *
13
+ * // Using class
14
+ * const truncator = new SemanticTruncator();
15
+ * const result = truncator.truncate(output, 4000);
16
+ * console.log(result.keyInfoPreserved); // ['error_messages', 'stack_trace_top']
17
+ * ```
18
+ */
19
+ export { SemanticTruncator, getSemanticTruncator, truncateOutput } from './semantic-truncator.js';
20
+ export { detectOutputType, detectOutputTypeWithHint } from './type-detector.js';
21
+ export { DEFAULT_TRUNCATION_CONFIG } from './types.js';
22
+ export { ErrorStackStrategy, JsonStrategy, GitDiffStrategy, LogStrategy, TestResultStrategy, GenericStrategy, } from './strategies/index.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Semantic truncator - main entry point.
3
+ *
4
+ * Analyzes output type and applies appropriate truncation strategy.
5
+ */
6
+ import { ErrorStackStrategy, JsonStrategy, GitDiffStrategy, LogStrategy, TestResultStrategy, GenericStrategy, } from './strategies/index.js';
7
+ import { detectOutputType, detectOutputTypeWithHint } from './type-detector.js';
8
+ import { DEFAULT_TRUNCATION_CONFIG } from './types.js';
9
+ /**
10
+ * Semantic truncator with type-aware strategies.
11
+ */
12
+ export class SemanticTruncator {
13
+ config;
14
+ strategies;
15
+ constructor(config = DEFAULT_TRUNCATION_CONFIG) {
16
+ this.config = config;
17
+ // Register all strategies
18
+ this.strategies = [
19
+ new ErrorStackStrategy(config),
20
+ new JsonStrategy(config),
21
+ new GitDiffStrategy(config),
22
+ new LogStrategy(config),
23
+ new TestResultStrategy(config),
24
+ new GenericStrategy(config), // Must be last (fallback)
25
+ ];
26
+ }
27
+ /**
28
+ * Truncate output using appropriate strategy.
29
+ *
30
+ * @param output - Raw output string
31
+ * @param budget - Maximum character budget
32
+ * @param typeHint - Optional type hint for detection
33
+ * @returns Truncated output with metadata
34
+ */
35
+ truncate(output, budget, typeHint) {
36
+ // Detect output type
37
+ const detection = typeHint
38
+ ? detectOutputTypeWithHint(output, typeHint)
39
+ : detectOutputType(output);
40
+ // Find appropriate strategy
41
+ const strategy = this.findStrategy(detection.type);
42
+ // Apply truncation
43
+ return strategy.truncate(output, budget);
44
+ }
45
+ /**
46
+ * Truncate output with explicit type.
47
+ *
48
+ * @param output - Raw output string
49
+ * @param type - Explicit output type
50
+ * @param budget - Maximum character budget
51
+ * @returns Truncated output with metadata
52
+ */
53
+ truncateWithType(output, type, budget) {
54
+ const strategy = this.findStrategy(type);
55
+ return strategy.truncate(output, budget);
56
+ }
57
+ /**
58
+ * Detect output type without truncating.
59
+ *
60
+ * @param output - Raw output string
61
+ * @returns Detected type with confidence
62
+ */
63
+ detectType(output) {
64
+ return detectOutputType(output);
65
+ }
66
+ /**
67
+ * Find strategy for given type.
68
+ */
69
+ findStrategy(type) {
70
+ for (const strategy of this.strategies) {
71
+ if (strategy.supportedTypes.includes(type)) {
72
+ return strategy;
73
+ }
74
+ }
75
+ // Fallback to generic
76
+ return this.strategies[this.strategies.length - 1];
77
+ }
78
+ }
79
+ /**
80
+ * Global truncator instance.
81
+ */
82
+ let globalTruncator = null;
83
+ /**
84
+ * Get global truncator instance.
85
+ */
86
+ export function getSemanticTruncator() {
87
+ if (!globalTruncator) {
88
+ globalTruncator = new SemanticTruncator();
89
+ }
90
+ return globalTruncator;
91
+ }
92
+ /**
93
+ * Convenience function for semantic truncation.
94
+ *
95
+ * @param output - Raw output string
96
+ * @param budget - Maximum character budget
97
+ * @param typeHint - Optional type hint
98
+ * @returns Truncated output
99
+ */
100
+ export function truncateOutput(output, budget, typeHint) {
101
+ return getSemanticTruncator().truncate(output, budget, typeHint);
102
+ }
103
+ //# sourceMappingURL=semantic-truncator.js.map
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Error stack truncation strategy.
3
+ *
4
+ * Preserves complete error information - errors are critical for debugging.
5
+ * Only truncates if absolutely necessary, preserving the error message and
6
+ * top of stack trace.
7
+ */
8
+ import { DEFAULT_TRUNCATION_CONFIG } from '../types.js';
9
+ /**
10
+ * Error stack truncation strategy.
11
+ * Prioritizes preserving all error information.
12
+ */
13
+ export class ErrorStackStrategy {
14
+ config;
15
+ name = 'error_stack';
16
+ supportedTypes = ['error_stack'];
17
+ constructor(config = DEFAULT_TRUNCATION_CONFIG) {
18
+ this.config = config;
19
+ }
20
+ canHandle(output) {
21
+ return /^\s*\w*Error:|^\s+at\s+.+\(/m.test(output);
22
+ }
23
+ truncate(output, budget) {
24
+ const lines = output.split('\n');
25
+ const keyInfoPreserved = [];
26
+ // If output fits in budget, return as-is
27
+ if (output.length <= budget) {
28
+ return {
29
+ content: output,
30
+ wasTruncated: false,
31
+ strategy: this.name,
32
+ keyInfoPreserved: ['complete_error'],
33
+ };
34
+ }
35
+ // Find error lines (Error: TypeError:, etc.)
36
+ const errorLines = [];
37
+ const stackLines = [];
38
+ for (let i = 0; i < lines.length; i++) {
39
+ const line = lines[i];
40
+ if (/^\s*\w*Error:|TypeError:|ReferenceError:|SyntaxError:|RuntimeError:/i.test(line)) {
41
+ errorLines.push(i);
42
+ }
43
+ else if (/^\s+at\s+/.test(line)) {
44
+ stackLines.push(i);
45
+ }
46
+ }
47
+ // Preserve error messages with context
48
+ const preservedIndices = new Set();
49
+ // Always preserve first line (often the error message)
50
+ preservedIndices.add(0);
51
+ // Preserve all error lines
52
+ for (const idx of errorLines) {
53
+ preservedIndices.add(idx);
54
+ // Add context lines around error
55
+ for (let j = Math.max(0, idx - this.config.contextLines); j <= Math.min(lines.length - 1, idx + this.config.contextLines); j++) {
56
+ preservedIndices.add(j);
57
+ }
58
+ }
59
+ // Preserve top of stack trace (most relevant)
60
+ for (let i = 0; i < Math.min(5, stackLines.length); i++) {
61
+ preservedIndices.add(stackLines[i]);
62
+ }
63
+ // Build truncated output
64
+ const result = [];
65
+ let currentLength = 0;
66
+ let lastAdded = -2;
67
+ for (let i = 0; i < lines.length; i++) {
68
+ if (preservedIndices.has(i)) {
69
+ // Add truncation marker if there's a gap
70
+ if (i > lastAdded + 1 && lastAdded >= 0) {
71
+ result.push(this.config.truncationMarker);
72
+ currentLength += this.config.truncationMarker.length;
73
+ }
74
+ result.push(lines[i]);
75
+ currentLength += lines[i].length + 1; // +1 for newline
76
+ lastAdded = i;
77
+ }
78
+ // Check budget
79
+ if (currentLength > budget) {
80
+ break;
81
+ }
82
+ }
83
+ keyInfoPreserved.push('error_messages');
84
+ if (stackLines.length > 0)
85
+ keyInfoPreserved.push('stack_trace_top');
86
+ return {
87
+ content: result.join('\n'),
88
+ wasTruncated: true,
89
+ strategy: this.name,
90
+ keyInfoPreserved,
91
+ };
92
+ }
93
+ }
94
+ //# sourceMappingURL=error-stack.js.map
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Generic truncation strategy.
3
+ *
4
+ * Fallback strategy that uses simple head/tail truncation
5
+ * with a marker in the middle.
6
+ */
7
+ import { DEFAULT_TRUNCATION_CONFIG } from '../types.js';
8
+ /**
9
+ * Generic truncation strategy.
10
+ * Uses simple head/tail truncation.
11
+ */
12
+ export class GenericStrategy {
13
+ config;
14
+ name = 'generic';
15
+ supportedTypes = ['generic'];
16
+ constructor(config = DEFAULT_TRUNCATION_CONFIG) {
17
+ this.config = config;
18
+ }
19
+ canHandle(_output) {
20
+ return true; // Always can handle
21
+ }
22
+ truncate(output, budget) {
23
+ // If output fits in budget, return as-is
24
+ if (output.length <= budget) {
25
+ return {
26
+ content: output,
27
+ wasTruncated: false,
28
+ strategy: this.name,
29
+ keyInfoPreserved: ['complete_content'],
30
+ };
31
+ }
32
+ // Reserve space for truncation marker
33
+ const markerLength = this.config.truncationMarker.length;
34
+ const availableBudget = budget - markerLength;
35
+ // Split budget between head and tail (50/50)
36
+ const headBudget = Math.floor(availableBudget / 2);
37
+ const tailBudget = availableBudget - headBudget;
38
+ const head = output.slice(0, headBudget);
39
+ const tail = output.slice(-tailBudget);
40
+ return {
41
+ content: `${head}${this.config.truncationMarker}${tail}`,
42
+ wasTruncated: true,
43
+ strategy: this.name,
44
+ keyInfoPreserved: ['head', 'tail'],
45
+ };
46
+ }
47
+ }
48
+ //# sourceMappingURL=generic.js.map