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.
- package/LICENSE +21 -0
- package/README.md +144 -0
- package/README.zh-CN.md +144 -0
- package/dist/cli/argv/headless-detection.js +60 -0
- package/dist/cli/argv/print-mode.js +60 -0
- package/dist/cli/authorization/allowlist.js +908 -0
- package/dist/cli/authorization/non-interactive.js +166 -0
- package/dist/cli/authorization/provider.js +416 -0
- package/dist/cli/chat-interface.js +83 -0
- package/dist/cli/chat.js +492 -0
- package/dist/cli/cli-runtime-context.js +12 -0
- package/dist/cli/commander-error-adapter.js +35 -0
- package/dist/cli/commander-error-meta.js +13 -0
- package/dist/cli/commands/allowlist.js +270 -0
- package/dist/cli/commands/chat.js +120 -0
- package/dist/cli/commands/config.js +250 -0
- package/dist/cli/commands/context.js +57 -0
- package/dist/cli/commands/dispatcher.js +53 -0
- package/dist/cli/commands/exit.js +9 -0
- package/dist/cli/commands/llm-output.js +135 -0
- package/dist/cli/commands/log-mode.js +143 -0
- package/dist/cli/commands/mode.js +136 -0
- package/dist/cli/commands/new.js +18 -0
- package/dist/cli/commands/parallel.js +256 -0
- package/dist/cli/commands/queue.js +130 -0
- package/dist/cli/commands/registry.js +85 -0
- package/dist/cli/commands/restore.js +26 -0
- package/dist/cli/commands/run/assistant-message.js +14 -0
- package/dist/cli/commands/run/config-resolution.js +37 -0
- package/dist/cli/commands/run/early-errors.js +108 -0
- package/dist/cli/commands/run/execute.js +73 -0
- package/dist/cli/commands/run/extensions-resolution.js +22 -0
- package/dist/cli/commands/run/handler.js +434 -0
- package/dist/cli/commands/run/headless-error-writer.js +182 -0
- package/dist/cli/commands/run/instruction-guard.js +24 -0
- package/dist/cli/commands/run/loop-params.js +46 -0
- package/dist/cli/commands/run/mode.js +8 -0
- package/dist/cli/commands/run/parse-options.js +67 -0
- package/dist/cli/commands/run/persist-session.js +35 -0
- package/dist/cli/commands/run/preflight.js +156 -0
- package/dist/cli/commands/run/reporter-factory.js +52 -0
- package/dist/cli/commands/run/runtime-llm.js +56 -0
- package/dist/cli/commands/run/runtime-options.js +30 -0
- package/dist/cli/commands/run/session.js +19 -0
- package/dist/cli/commands/run/structured-output.js +106 -0
- package/dist/cli/commands/run/types.js +2 -0
- package/dist/cli/commands/run/validate-options.js +28 -0
- package/dist/cli/commands/run/verbose.js +36 -0
- package/dist/cli/commands/run.js +2 -0
- package/dist/cli/commands/serve.js +323 -0
- package/dist/cli/commands/session.js +77 -0
- package/dist/cli/commands/snapshot-interactive.js +165 -0
- package/dist/cli/commands/snapshot.js +159 -0
- package/dist/cli/commands/status.js +17 -0
- package/dist/cli/commands/subagent.js +178 -0
- package/dist/cli/commands/subcommand-suggestions.js +63 -0
- package/dist/cli/commands/tool-names.js +155 -0
- package/dist/cli/commands/types.js +2 -0
- package/dist/cli/commands/utils.js +42 -0
- package/dist/cli/config.js +16 -0
- package/dist/cli/crash-reporter.js +5 -0
- package/dist/cli/headless/anthropic-stream-normalized-encoder.js +164 -0
- package/dist/cli/headless/anthropic-stream-protocol.js +62 -0
- package/dist/cli/headless/json-protocol.js +124 -0
- package/dist/cli/headless/native-stream-normalized-encoder.js +206 -0
- package/dist/cli/headless/openai-responses-canonical-applier.js +94 -0
- package/dist/cli/headless/openai-responses-state.js +294 -0
- package/dist/cli/headless/openai-stream-encoder.js +152 -0
- package/dist/cli/headless/stdout-writer.js +9 -0
- package/dist/cli/headless/stream-json-protocol.js +136 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/locales/en.js +409 -0
- package/dist/cli/locales/index.js +7 -0
- package/dist/cli/program-bootstrap.js +14 -0
- package/dist/cli/program-commands.js +106 -0
- package/dist/cli/program-options.js +15 -0
- package/dist/cli/program-output-mode.js +11 -0
- package/dist/cli/program-parse.js +24 -0
- package/dist/cli/reporters/anthropic-stream.js +77 -0
- package/dist/cli/reporters/base.js +2 -0
- package/dist/cli/reporters/json.js +69 -0
- package/dist/cli/reporters/openai-stream.js +72 -0
- package/dist/cli/reporters/standard.js +226 -0
- package/dist/cli/reporters/stderr-log-reporter.js +71 -0
- package/dist/cli/reporters/stream-json.js +111 -0
- package/dist/cli/run-cli.js +25 -0
- package/dist/cli/slash/runtime.js +240 -0
- package/dist/cli/ui/App.js +273 -0
- package/dist/cli/ui/authorization/bus.js +35 -0
- package/dist/cli/ui/components/CommandInput.js +200 -0
- package/dist/cli/ui/components/CommandSuggestionList.js +20 -0
- package/dist/cli/ui/components/Markdown.js +423 -0
- package/dist/cli/ui/components/MessageList.js +34 -0
- package/dist/cli/ui/components/StatusBannerLine.js +7 -0
- package/dist/cli/ui/components/TodoDrawer.js +60 -0
- package/dist/cli/ui/components/WelcomeMessage.js +14 -0
- package/dist/cli/ui/components/animations/StretchingThinking.js +51 -0
- package/dist/cli/ui/components/animations/ThinkingWave.js +15 -0
- package/dist/cli/ui/components/animations/TypeIndicator.js +30 -0
- package/dist/cli/ui/components/layout/SplitPane.js +11 -0
- package/dist/cli/ui/components/messageList/MessageItem.js +27 -0
- package/dist/cli/ui/components/messageList/QueuePreviewList.js +11 -0
- package/dist/cli/ui/components/messageList/items/EmphasisMessageItem.js +20 -0
- package/dist/cli/ui/components/messageList/items/InterruptMessageItem.js +10 -0
- package/dist/cli/ui/components/messageList/items/LightweightMessageItem.js +12 -0
- package/dist/cli/ui/components/messageList/items/StandardMessageItem.js +23 -0
- package/dist/cli/ui/components/messageList/items/WelcomeMessageItem.js +7 -0
- package/dist/cli/ui/components/messageList/messageListLayout.js +27 -0
- package/dist/cli/ui/components/messageList/streaming.js +51 -0
- package/dist/cli/ui/components/messageList/types.js +2 -0
- package/dist/cli/ui/components/messageList/utils.js +7 -0
- package/dist/cli/ui/components/sidebar/FileContext.js +8 -0
- package/dist/cli/ui/components/sidebar/MissionControl.js +8 -0
- package/dist/cli/ui/config.js +59 -0
- package/dist/cli/ui/hooks/useCommandLifecycle.js +110 -0
- package/dist/cli/ui/hooks/useCommandSuggestions.js +87 -0
- package/dist/cli/ui/hooks/useInputHistory.js +57 -0
- package/dist/cli/ui/hooks/useLoopEvents.js +382 -0
- package/dist/cli/ui/hooks/useLoopState.js +73 -0
- package/dist/cli/ui/hooks/useOnionExit.js +31 -0
- package/dist/cli/ui/hooks/useTerminalDimensions.js +34 -0
- package/dist/cli/ui/index.js +136 -0
- package/dist/cli/ui/selection/bus.js +35 -0
- package/dist/cli/ui/status/formatStatusBanner.js +8 -0
- package/dist/cli/ui/store/context.js +17 -0
- package/dist/cli/ui/store/reducer.js +264 -0
- package/dist/cli/ui/store/types.js +81 -0
- package/dist/cli/ui/styles/theme.js +295 -0
- package/dist/cli/ui/types.js +2 -0
- package/dist/cli/ui/utils/sanitizer.js +122 -0
- package/dist/cli/ui/utils/transcript.js +28 -0
- package/dist/cli/utils/asyncQueue.js +125 -0
- package/dist/cli/utils/audit-scope.js +10 -0
- package/dist/cli/utils/detectors/index.js +38 -0
- package/dist/cli/utils/llm-output.js +34 -0
- package/dist/cli/utils/outcome-reporter.js +17 -0
- package/dist/cli/utils/safe-fs.js +184 -0
- package/dist/cli/utils/verify-resolver.js +34 -0
- package/dist/cli/utils/worktree-prepare-resolver.js +18 -0
- package/dist/core/adapters/fs/atomic-file-writer.js +129 -0
- package/dist/core/adapters/fs/file-adapter.js +95 -0
- package/dist/core/adapters/fs/filesystem.js +31 -0
- package/dist/core/adapters/fs/index.js +5 -0
- package/dist/core/adapters/fs/node-fs.js +7 -0
- package/dist/core/adapters/fs/readonly-filesystem.js +23 -0
- package/dist/core/adapters/git/git-adapter.js +704 -0
- package/dist/core/adapters/git/git-runner.js +119 -0
- package/dist/core/adapters/git/lock-manager.js +314 -0
- package/dist/core/adapters/git/types.js +2 -0
- package/dist/core/adapters/path/index.js +2 -0
- package/dist/core/adapters/path/path-adapter.js +23 -0
- package/dist/core/ast/guard.js +116 -0
- package/dist/core/ast/index.js +4 -0
- package/dist/core/ast/parser.js +284 -0
- package/dist/core/ast/validator.js +46 -0
- package/dist/core/backends/salmon-loop/task-executor.js +68 -0
- package/dist/core/checkpoint-domain/manifest-store.js +379 -0
- package/dist/core/checkpoint-domain/service.js +84 -0
- package/dist/core/checkpoint-domain/types.js +2 -0
- package/dist/core/config/defaults.js +50 -0
- package/dist/core/config/errors.js +11 -0
- package/dist/core/config/file-format.js +108 -0
- package/dist/core/config/index.js +7 -0
- package/dist/core/config/limits.js +77 -0
- package/dist/core/config/load.js +34 -0
- package/dist/core/config/normalize.js +35 -0
- package/dist/core/config/paths.js +20 -0
- package/dist/core/config/redact.js +16 -0
- package/dist/core/config/resolve-env.js +43 -0
- package/dist/core/config/resolve-llm.js +130 -0
- package/dist/core/config/resolve.js +68 -0
- package/dist/core/config/resolvers/ast-validation.js +8 -0
- package/dist/core/config/resolvers/context.js +21 -0
- package/dist/core/config/resolvers/observability.js +45 -0
- package/dist/core/config/resolvers/output.js +8 -0
- package/dist/core/config/resolvers/permission-mode.js +6 -0
- package/dist/core/config/resolvers/security.js +14 -0
- package/dist/core/config/resolvers/server.js +36 -0
- package/dist/core/config/resolvers/tool-authorization.js +39 -0
- package/dist/core/config/resolvers/ui.js +26 -0
- package/dist/core/config/types/config-file.js +2 -0
- package/dist/core/config/types/primitives.js +9 -0
- package/dist/core/config/types/resolved.js +2 -0
- package/dist/core/config/types.js +4 -0
- package/dist/core/config/validate.js +852 -0
- package/dist/core/context/assembly/default-prompt-assembler.js +7 -0
- package/dist/core/context/assembly/prompt-assembler.js +2 -0
- package/dist/core/context/ast/import-extractor.js +28 -0
- package/dist/core/context/ast/module-resolver.js +61 -0
- package/dist/core/context/ast/source-outline.js +25 -0
- package/dist/core/context/audit-constants.js +23 -0
- package/dist/core/context/audit.js +54 -0
- package/dist/core/context/budget/dynamic-adjuster.js +149 -0
- package/dist/core/context/budget/example-integration.js +49 -0
- package/dist/core/context/budget/integration.js +93 -0
- package/dist/core/context/builder.js +289 -0
- package/dist/core/context/cache/errors.js +16 -0
- package/dist/core/context/cache/incremental-updater.js +131 -0
- package/dist/core/context/cache/index.js +25 -0
- package/dist/core/context/cache/path-resolver.js +127 -0
- package/dist/core/context/cache/prompt-caching.js +207 -0
- package/dist/core/context/cache/store-factory.js +63 -0
- package/dist/core/context/cache/store.js +193 -0
- package/dist/core/context/cache/types.js +15 -0
- package/dist/core/context/compression/js-like-comments.js +139 -0
- package/dist/core/context/compression/smart-compress.js +61 -0
- package/dist/core/context/compression/whitespace.js +26 -0
- package/dist/core/context/dependencies.js +102 -0
- package/dist/core/context/effectiveness/index.js +25 -0
- package/dist/core/context/effectiveness/tracker.js +253 -0
- package/dist/core/context/effectiveness/types.js +15 -0
- package/dist/core/context/formatters/index.js +7 -0
- package/dist/core/context/formatters/json-converter.js +662 -0
- package/dist/core/context/formatters/types.js +6 -0
- package/dist/core/context/formatters/xml-context.js +296 -0
- package/dist/core/context/gatherers/architecture-gatherer.js +75 -0
- package/dist/core/context/gatherers/artifact-gatherer.js +53 -0
- package/dist/core/context/gatherers/ast-gatherer.js +370 -0
- package/dist/core/context/gatherers/ghost-dependency-gatherer.js +46 -0
- package/dist/core/context/gatherers/git-diff-gatherer.js +91 -0
- package/dist/core/context/gatherers/git-history-gatherer.js +57 -0
- package/dist/core/context/gatherers/knowledge-gatherer.js +101 -0
- package/dist/core/context/gatherers/metadata-gatherer.js +59 -0
- package/dist/core/context/gatherers/primary-text-gatherer.js +36 -0
- package/dist/core/context/gatherers/ripgrep-gatherer.js +104 -0
- package/dist/core/context/hash.js +52 -0
- package/dist/core/context/index.js +3 -0
- package/dist/core/context/keywords.js +179 -0
- package/dist/core/context/policies/budget-policy.js +36 -0
- package/dist/core/context/policies/pack-until-full.js +419 -0
- package/dist/core/context/scoring/relevance.js +191 -0
- package/dist/core/context/service-deps.js +32 -0
- package/dist/core/context/service-helpers.js +32 -0
- package/dist/core/context/service.js +265 -0
- package/dist/core/context/steps/context-budget.js +157 -0
- package/dist/core/context/steps/context-gather.js +71 -0
- package/dist/core/context/steps/context-primary.js +19 -0
- package/dist/core/context/steps/context-promotion.js +78 -0
- package/dist/core/context/steps/context-targets.js +85 -0
- package/dist/core/context/steps/types.js +2 -0
- package/dist/core/context/summarization/index.js +27 -0
- package/dist/core/context/summarization/prompts.js +80 -0
- package/dist/core/context/summarization/summarizer.js +377 -0
- package/dist/core/context/summarization/types.js +29 -0
- package/dist/core/context/targeting/churn-policy.js +27 -0
- package/dist/core/context/targeting/target-resolver.js +491 -0
- package/dist/core/context/token/adaptive-budget.js +364 -0
- package/dist/core/context/token/cache.js +163 -0
- package/dist/core/context/token/counter.js +190 -0
- package/dist/core/context/token/encoding-registry.js +173 -0
- package/dist/core/context/token/index.js +31 -0
- package/dist/core/context/token/token-budget.js +213 -0
- package/dist/core/context/token/types.js +10 -0
- package/dist/core/context/truncation/index.js +23 -0
- package/dist/core/context/truncation/semantic-truncator.js +103 -0
- package/dist/core/context/truncation/strategies/error-stack.js +94 -0
- package/dist/core/context/truncation/strategies/generic.js +48 -0
- package/dist/core/context/truncation/strategies/git-diff.js +99 -0
- package/dist/core/context/truncation/strategies/index.js +10 -0
- package/dist/core/context/truncation/strategies/json.js +142 -0
- package/dist/core/context/truncation/strategies/log.js +131 -0
- package/dist/core/context/truncation/strategies/test-result.js +140 -0
- package/dist/core/context/truncation/type-detector.js +133 -0
- package/dist/core/context/truncation/types.js +16 -0
- package/dist/core/context/types.js +2 -0
- package/dist/core/extensions/index.js +118 -0
- package/dist/core/extensions/load.js +36 -0
- package/dist/core/extensions/merge.js +29 -0
- package/dist/core/extensions/paths.js +40 -0
- package/dist/core/extensions/redact.js +37 -0
- package/dist/core/extensions/schemas.js +70 -0
- package/dist/core/extensions/types.js +2 -0
- package/dist/core/facades/cli-authorization-allowlist.js +3 -0
- package/dist/core/facades/cli-authorization-non-interactive.js +3 -0
- package/dist/core/facades/cli-authorization-provider.js +2 -0
- package/dist/core/facades/cli-chat.js +11 -0
- package/dist/core/facades/cli-command-allowlist.js +3 -0
- package/dist/core/facades/cli-command-chat.js +8 -0
- package/dist/core/facades/cli-command-checkpoint.js +3 -0
- package/dist/core/facades/cli-command-config.js +10 -0
- package/dist/core/facades/cli-command-dispatcher.js +2 -0
- package/dist/core/facades/cli-command-parallel.js +8 -0
- package/dist/core/facades/cli-command-session.js +2 -0
- package/dist/core/facades/cli-command-tool-names.js +6 -0
- package/dist/core/facades/cli-context.js +8 -0
- package/dist/core/facades/cli-headless.js +3 -0
- package/dist/core/facades/cli-observability.js +3 -0
- package/dist/core/facades/cli-program-bootstrap.js +2 -0
- package/dist/core/facades/cli-reporters.js +5 -0
- package/dist/core/facades/cli-run-execute.js +3 -0
- package/dist/core/facades/cli-run-handler.js +7 -0
- package/dist/core/facades/cli-run-headless-error-writer.js +2 -0
- package/dist/core/facades/cli-run-loop-params.js +2 -0
- package/dist/core/facades/cli-run-persist-session.js +2 -0
- package/dist/core/facades/cli-run-runtime-llm.js +5 -0
- package/dist/core/facades/cli-serve.js +21 -0
- package/dist/core/facades/cli-slash-runtime.js +9 -0
- package/dist/core/facades/cli-subagent.js +2 -0
- package/dist/core/facades/cli-ui.js +5 -0
- package/dist/core/facades/cli-utils-llm-output.js +3 -0
- package/dist/core/facades/cli-utils-path.js +2 -0
- package/dist/core/facades/cli-utils-worktree.js +2 -0
- package/dist/core/failure/diagnostics.js +221 -0
- package/dist/core/feedback/index.js +28 -0
- package/dist/core/feedback/parsers.js +59 -0
- package/dist/core/feedback/patterns.js +26 -0
- package/dist/core/feedback/types.js +2 -0
- package/dist/core/grizzco/domain/grizzco-types.js +41 -0
- package/dist/core/grizzco/dsl/DecisionEngine.js +149 -0
- package/dist/core/grizzco/dsl/MicroTaskRunner.js +39 -0
- package/dist/core/grizzco/dsl/llm-strategy.js +80 -0
- package/dist/core/grizzco/dsl/strategies.js +69 -0
- package/dist/core/grizzco/dsl/types.js +2 -0
- package/dist/core/grizzco/engine/observability/event-adapter.js +41 -0
- package/dist/core/grizzco/engine/observability/index.js +3 -0
- package/dist/core/grizzco/engine/observability/loop-telemetry.js +51 -0
- package/dist/core/grizzco/engine/outcome/index.js +2 -0
- package/dist/core/grizzco/engine/outcome/loop-result-mapper.js +167 -0
- package/dist/core/grizzco/engine/pipeline/pipeline.js +335 -0
- package/dist/core/grizzco/engine/pipeline/types.js +2 -0
- package/dist/core/grizzco/engine/transaction/attempt-failure.js +242 -0
- package/dist/core/grizzco/engine/transaction/authorization-summary.js +44 -0
- package/dist/core/grizzco/engine/transaction/index.js +3 -0
- package/dist/core/grizzco/engine/transaction/report-mapper.js +50 -0
- package/dist/core/grizzco/engine/transaction/retry-policy.js +19 -0
- package/dist/core/grizzco/engine/transaction/runner-builder.js +45 -0
- package/dist/core/grizzco/engine/transaction/session.js +58 -0
- package/dist/core/grizzco/engine/transaction/transaction-runner.js +193 -0
- package/dist/core/grizzco/engine/transaction/types.js +2 -0
- package/dist/core/grizzco/execution/Executor.js +58 -0
- package/dist/core/grizzco/execution/RejectionManager.js +71 -0
- package/dist/core/grizzco/execution/WorkerFactory.js +31 -0
- package/dist/core/grizzco/flows/SalmonLoopFlow.js +102 -0
- package/dist/core/grizzco/runtime/apply-back-runtime.js +136 -0
- package/dist/core/grizzco/runtime/apply-back-utils.js +13 -0
- package/dist/core/grizzco/runtime/host/host-runner.js +99 -0
- package/dist/core/grizzco/runtime/host/index.js +2 -0
- package/dist/core/grizzco/runtime/host/types.js +2 -0
- package/dist/core/grizzco/services/CachedService.js +42 -0
- package/dist/core/grizzco/services/implementations/default/GitConfigService.js +38 -0
- package/dist/core/grizzco/services/implementations/mock/MockLockService.js +11 -0
- package/dist/core/grizzco/services/implementations/mock/MockUserQuotaService.js +11 -0
- package/dist/core/grizzco/services/registry.js +30 -0
- package/dist/core/grizzco/services/types.js +2 -0
- package/dist/core/grizzco/steps/answer.js +75 -0
- package/dist/core/grizzco/steps/apply-back.js +46 -0
- package/dist/core/grizzco/steps/apply.js +136 -0
- package/dist/core/grizzco/steps/ast-validate.js +37 -0
- package/dist/core/grizzco/steps/audit.js +311 -0
- package/dist/core/grizzco/steps/context.js +74 -0
- package/dist/core/grizzco/steps/display-answer.js +6 -0
- package/dist/core/grizzco/steps/display-report.js +158 -0
- package/dist/core/grizzco/steps/display-research.js +6 -0
- package/dist/core/grizzco/steps/displayReview.js +6 -0
- package/dist/core/grizzco/steps/explore.js +245 -0
- package/dist/core/grizzco/steps/extractIssues.js +27 -0
- package/dist/core/grizzco/steps/generateFixPlan.js +13 -0
- package/dist/core/grizzco/steps/generateReview.js +71 -0
- package/dist/core/grizzco/steps/patch.js +220 -0
- package/dist/core/grizzco/steps/plan.js +191 -0
- package/dist/core/grizzco/steps/preflight.js +93 -0
- package/dist/core/grizzco/steps/prepare-deps.js +49 -0
- package/dist/core/grizzco/steps/read-only-shrink.js +4 -0
- package/dist/core/grizzco/steps/research.js +188 -0
- package/dist/core/grizzco/steps/rollback.js +138 -0
- package/dist/core/grizzco/steps/shrink.js +64 -0
- package/dist/core/grizzco/steps/validate.js +40 -0
- package/dist/core/grizzco/steps/verify.js +136 -0
- package/dist/core/grizzco/validation/AstValidationService.js +133 -0
- package/dist/core/grizzco/validation/ContextValidator.js +17 -0
- package/dist/core/grizzco/validation/ast-validation-policy.js +11 -0
- package/dist/core/grizzco/workers/direct-write-worker.js +44 -0
- package/dist/core/grizzco/workers/git-apply-worker.js +75 -0
- package/dist/core/grizzco/workers/i-merge-worker.js +2 -0
- package/dist/core/grizzco/workers/mm-three-way-worker.js +117 -0
- package/dist/core/grizzco/workers/no-op-worker.js +18 -0
- package/dist/core/grizzco/workers/overwrite-binary-worker.js +29 -0
- package/dist/core/grizzco/workers/strata-sync-worker.js +69 -0
- package/dist/core/grizzco/workers/three-way-merge-worker.js +84 -0
- package/dist/core/grizzco/workers/three-way-staged-worker.js +93 -0
- package/dist/core/grizzco/workers/union-merge-worker.js +71 -0
- package/dist/core/history/input-history.js +55 -0
- package/dist/core/intent/chat-intent.js +250 -0
- package/dist/core/interaction/events/bus.js +52 -0
- package/dist/core/interaction/model/events.js +2 -0
- package/dist/core/interaction/model/index.js +3 -0
- package/dist/core/interaction/model/task-state.js +9 -0
- package/dist/core/interaction/model/transition-policy.js +50 -0
- package/dist/core/interaction/model/types.js +2 -0
- package/dist/core/interaction/orchestration/facade.js +190 -0
- package/dist/core/interaction/orchestration/index.js +2 -0
- package/dist/core/interaction/orchestration/store.js +32 -0
- package/dist/core/interaction/sync/task-sync-engine.js +57 -0
- package/dist/core/interaction/turn-stop-reason.js +27 -0
- package/dist/core/language-support/index.js +3 -0
- package/dist/core/language-support/orchestrator.js +37 -0
- package/dist/core/language-support/strategies/extension-candidate-strategy.js +27 -0
- package/dist/core/language-support/strategies/index.js +3 -0
- package/dist/core/language-support/strategies/language-query-strategy.js +26 -0
- package/dist/core/llm/ai-sdk/chat-executor.js +88 -0
- package/dist/core/llm/ai-sdk/langfuse-headers.js +28 -0
- package/dist/core/llm/ai-sdk/message-mapper.js +240 -0
- package/dist/core/llm/ai-sdk/observation-context.js +16 -0
- package/dist/core/llm/ai-sdk/provider-factory.js +29 -0
- package/dist/core/llm/ai-sdk/request-params.js +18 -0
- package/dist/core/llm/ai-sdk/request-runtime.js +168 -0
- package/dist/core/llm/ai-sdk/result-mapper.js +31 -0
- package/dist/core/llm/ai-sdk/retry-classifier.js +82 -0
- package/dist/core/llm/ai-sdk/retry-executor.js +38 -0
- package/dist/core/llm/ai-sdk.js +92 -0
- package/dist/core/llm/audit.js +2 -0
- package/dist/core/llm/base-url.js +18 -0
- package/dist/core/llm/contracts/repair.js +68 -0
- package/dist/core/llm/errors.js +172 -0
- package/dist/core/llm/factory.js +21 -0
- package/dist/core/llm/http/index.js +2 -0
- package/dist/core/llm/index.js +6 -0
- package/dist/core/llm/message-composition.js +25 -0
- package/dist/core/llm/openai.js +69 -0
- package/dist/core/llm/output-policy.js +192 -0
- package/dist/core/llm/phase-router.js +55 -0
- package/dist/core/llm/redact.js +37 -0
- package/dist/core/llm/registry.js +81 -0
- package/dist/core/llm/retry-utils.js +114 -0
- package/dist/core/llm/stream-utils.js +87 -0
- package/dist/core/llm/utils.js +82 -0
- package/dist/core/observability/audit-file.js +199 -0
- package/dist/core/observability/audit-trail.js +125 -0
- package/dist/core/observability/authorization-decisions.js +54 -0
- package/dist/core/observability/debug-artifacts.js +61 -0
- package/dist/core/observability/error-envelope.js +63 -0
- package/dist/core/observability/error-mapping.js +271 -0
- package/dist/core/observability/ignored-error.js +6 -0
- package/dist/core/observability/logger.js +457 -0
- package/dist/core/observability/loop-event-reporter.js +46 -0
- package/dist/core/observability/monitor.js +240 -0
- package/dist/core/observability/run-outcome-reporter.js +15 -0
- package/dist/core/observability/token-usage.js +36 -0
- package/dist/core/observability/ui-log-sanitize.js +35 -0
- package/dist/core/patch/aggregator.js +93 -0
- package/dist/core/patch/diff.js +298 -0
- package/dist/core/permission-gate/default-gate.js +115 -0
- package/dist/core/permission-gate/gate.js +2 -0
- package/dist/core/permission-gate/types.js +2 -0
- package/dist/core/plan/index.js +2 -0
- package/dist/core/plan/manager.js +123 -0
- package/dist/core/plan/markdown-editor.js +238 -0
- package/dist/core/plan/storage.js +75 -0
- package/dist/core/plan/types.js +2 -0
- package/dist/core/plugin/interface.js +2 -0
- package/dist/core/plugin/loader.js +130 -0
- package/dist/core/plugin/registry.js +90 -0
- package/dist/core/plugin/validator.js +98 -0
- package/dist/core/prompts/registry.js +189 -0
- package/dist/core/prompts/runtime.js +69 -0
- package/dist/core/prompts/schema.js +2 -0
- package/dist/core/prompts/templates/phases/explore_user.hbs +26 -0
- package/dist/core/prompts/templates/phases/patch_user.hbs +57 -0
- package/dist/core/prompts/templates/phases/plan_user.hbs +33 -0
- package/dist/core/prompts/templates/system/_context_json_legend.hbs +21 -0
- package/dist/core/prompts/templates/system/_tool_defs.hbs +60 -0
- package/dist/core/prompts/templates/system/explore_system.hbs +26 -0
- package/dist/core/prompts/templates/system/main_system.hbs +18 -0
- package/dist/core/prompts/templates/system/patch_system.hbs +10 -0
- package/dist/core/prompts/templates/system/plan_system.hbs +1 -0
- package/dist/core/prompts/templates/system/reflection.hbs +39 -0
- package/dist/core/protocols/a2a/agent-card.js +30 -0
- package/dist/core/protocols/a2a/mapper.js +14 -0
- package/dist/core/protocols/a2a/sdk/auth-middleware.js +31 -0
- package/dist/core/protocols/a2a/sdk/executor.js +301 -0
- package/dist/core/protocols/a2a/sdk/server.js +24 -0
- package/dist/core/protocols/a2a/task-projection.js +45 -0
- package/dist/core/protocols/acp/acp-command-runner.js +204 -0
- package/dist/core/protocols/acp/acp-filesystem.js +43 -0
- package/dist/core/protocols/acp/checkpoint-meta.js +2 -0
- package/dist/core/protocols/acp/formal-agent.js +1201 -0
- package/dist/core/protocols/acp/handlers.js +51 -0
- package/dist/core/protocols/acp/permission-provider.js +122 -0
- package/dist/core/protocols/acp/stdio-server.js +116 -0
- package/dist/core/reflection/engine.js +55 -0
- package/dist/core/reflection/types.js +2 -0
- package/dist/core/runtime/agent-server-runtime.js +88 -0
- package/dist/core/runtime/bun-runtime.js +26 -0
- package/dist/core/runtime/command-runner-context.js +16 -0
- package/dist/core/runtime/exit-codes.js +11 -0
- package/dist/core/runtime/fastify-fetch-bridge.js +51 -0
- package/dist/core/runtime/fastify-server-bundle.js +26 -0
- package/dist/core/runtime/initialize.js +132 -0
- package/dist/core/runtime/loop-finalize.js +71 -0
- package/dist/core/runtime/loop-run-lifecycle.js +73 -0
- package/dist/core/runtime/loop-run-reporter.js +19 -0
- package/dist/core/runtime/loop-runtime-config.js +26 -0
- package/dist/core/runtime/loop-session-runner.js +30 -0
- package/dist/core/runtime/loop.js +84 -0
- package/dist/core/runtime/paths.js +84 -0
- package/dist/core/runtime/process-runner.js +16 -0
- package/dist/core/runtime/process-types.js +2 -0
- package/dist/core/runtime/semaphore.js +41 -0
- package/dist/core/runtime/sidecar-fastify-plugin.js +35 -0
- package/dist/core/runtime/sidecar-paths.js +47 -0
- package/dist/core/runtime/sidecar-route-catalog.js +103 -0
- package/dist/core/runtime/spawn-command.js +392 -0
- package/dist/core/runtime/spawn-interactive.js +71 -0
- package/dist/core/security/redaction.js +160 -0
- package/dist/core/session/compression.js +323 -0
- package/dist/core/session/flow.js +85 -0
- package/dist/core/session/manager.js +313 -0
- package/dist/core/session/pruning-strategy.js +153 -0
- package/dist/core/session/session-context-builder.js +122 -0
- package/dist/core/session/summary-sync.js +82 -0
- package/dist/core/session/token-tracker.js +82 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/skills/bridge.js +33 -0
- package/dist/core/skills/index.js +8 -0
- package/dist/core/skills/loader.js +80 -0
- package/dist/core/skills/parser.js +66 -0
- package/dist/core/skills/runtime/MicroTaskRunner.js +102 -0
- package/dist/core/skills/runtime/SkillRunner.js +108 -0
- package/dist/core/skills/strategy.js +29 -0
- package/dist/core/skills/types.js +2 -0
- package/dist/core/slash/index.js +6 -0
- package/dist/core/slash/parser.js +33 -0
- package/dist/core/slash/registry.js +78 -0
- package/dist/core/slash/router.js +76 -0
- package/dist/core/slash/steps/slash-decide.js +19 -0
- package/dist/core/slash/steps/slash-execute.js +73 -0
- package/dist/core/slash/steps/types.js +2 -0
- package/dist/core/slash/strategy.js +33 -0
- package/dist/core/slash/types.js +2 -0
- package/dist/core/strata/checkpoint/manager.js +492 -0
- package/dist/core/strata/checkpoint/snapshot-audit.js +88 -0
- package/dist/core/strata/checkpoint/snapshot-create.js +79 -0
- package/dist/core/strata/checkpoint/snapshot-write-tree.js +72 -0
- package/dist/core/strata/engine/shadow-merge-engine.js +394 -0
- package/dist/core/strata/index.js +15 -0
- package/dist/core/strata/interaction/content-guardian.js +59 -0
- package/dist/core/strata/interaction/file-system-provider.js +89 -0
- package/dist/core/strata/layers/file-state-resolver.js +157 -0
- package/dist/core/strata/layers/immutable-git-layer.js +42 -0
- package/dist/core/strata/layers/shadow-driver/copy-backend.js +114 -0
- package/dist/core/strata/layers/shadow-driver/env.js +29 -0
- package/dist/core/strata/layers/shadow-driver/error-classifier.js +41 -0
- package/dist/core/strata/layers/shadow-driver/index.js +17 -0
- package/dist/core/strata/layers/shadow-driver/readonly-lock.js +221 -0
- package/dist/core/strata/layers/shadow-driver/shadow-driver.js +234 -0
- package/dist/core/strata/layers/shadow-driver/strategy.js +86 -0
- package/dist/core/strata/layers/sidecar-layer.js +96 -0
- package/dist/core/strata/layers/worktree.js +240 -0
- package/dist/core/strata/runtime/environment.js +377 -0
- package/dist/core/strata/runtime/synchronizer.js +819 -0
- package/dist/core/strata/types.js +46 -0
- package/dist/core/streaming/canonical/canonical-responses-event-emitter.js +326 -0
- package/dist/core/streaming/canonical/function-call-item-id.js +13 -0
- package/dist/core/streaming/canonical/parts-from-llm-stream-chunk.js +54 -0
- package/dist/core/streaming/canonical/responses-event-emitter.js +127 -0
- package/dist/core/streaming/canonical/responses-events.js +2 -0
- package/dist/core/streaming/normalized-events.js +9 -0
- package/dist/core/streaming/normalized-from-text.js +47 -0
- package/dist/core/streaming/stream-assembler.js +347 -0
- package/dist/core/structured-output/index.js +3 -0
- package/dist/core/structured-output/json-extract.js +70 -0
- package/dist/core/structured-output/json-schema-validator.js +90 -0
- package/dist/core/structured-output/types.js +2 -0
- package/dist/core/sub-agent/artifacts/store.js +141 -0
- package/dist/core/sub-agent/artifacts/types.js +2 -0
- package/dist/core/sub-agent/controller.js +69 -0
- package/dist/core/sub-agent/core/loop.js +79 -0
- package/dist/core/sub-agent/core/manager.js +246 -0
- package/dist/core/sub-agent/registry-defaults.js +52 -0
- package/dist/core/sub-agent/registry.js +35 -0
- package/dist/core/sub-agent/tools/task-spawn.js +29 -0
- package/dist/core/sub-agent/types.js +23 -0
- package/dist/core/target-runtime/command-resolver.js +42 -0
- package/dist/core/target-runtime/index.js +3 -0
- package/dist/core/target-runtime/profile.js +73 -0
- package/dist/core/testgen/detector.js +17 -0
- package/dist/core/testgen/index.js +38 -0
- package/dist/core/testgen/templates.js +46 -0
- package/dist/core/tools/audit.js +140 -0
- package/dist/core/tools/authorization/types.js +2 -0
- package/dist/core/tools/budget.js +118 -0
- package/dist/core/tools/builtin/artifact.js +29 -0
- package/dist/core/tools/builtin/ast-grep.js +107 -0
- package/dist/core/tools/builtin/ast.js +62 -0
- package/dist/core/tools/builtin/code-search/backends/powershell.js +84 -0
- package/dist/core/tools/builtin/code-search/backends/rg.js +85 -0
- package/dist/core/tools/builtin/code-search/executor.js +87 -0
- package/dist/core/tools/builtin/code-search/parse/plain-grep.js +59 -0
- package/dist/core/tools/builtin/code-search/parse/rg-json.js +31 -0
- package/dist/core/tools/builtin/code-search/spec.js +82 -0
- package/dist/core/tools/builtin/fs.js +243 -0
- package/dist/core/tools/builtin/git.js +118 -0
- package/dist/core/tools/builtin/index.js +80 -0
- package/dist/core/tools/builtin/interaction.js +120 -0
- package/dist/core/tools/builtin/knowledge.js +98 -0
- package/dist/core/tools/builtin/plan.js +148 -0
- package/dist/core/tools/builtin/proposal.js +207 -0
- package/dist/core/tools/builtin/shell.js +71 -0
- package/dist/core/tools/builtin/verify.js +41 -0
- package/dist/core/tools/capability/executor.js +84 -0
- package/dist/core/tools/capability/runner.js +50 -0
- package/dist/core/tools/capability/types.js +2 -0
- package/dist/core/tools/dispatcher.js +80 -0
- package/dist/core/tools/headless-payload.js +37 -0
- package/dist/core/tools/loader.js +100 -0
- package/dist/core/tools/mapper.js +142 -0
- package/dist/core/tools/mcp/client.js +308 -0
- package/dist/core/tools/mcp/loader.js +110 -0
- package/dist/core/tools/mcp/schema.js +54 -0
- package/dist/core/tools/mcp/streamable-http.js +101 -0
- package/dist/core/tools/mcp/types.js +26 -0
- package/dist/core/tools/parallel/isolation.js +25 -0
- package/dist/core/tools/parallel/lock-manager.js +124 -0
- package/dist/core/tools/parallel/persistence.js +126 -0
- package/dist/core/tools/parallel/plan-builder.js +66 -0
- package/dist/core/tools/parallel/plan.js +2 -0
- package/dist/core/tools/parallel/refs.js +7 -0
- package/dist/core/tools/parallel/resolve-args.js +50 -0
- package/dist/core/tools/parallel/resource-helpers.js +35 -0
- package/dist/core/tools/parallel/resources.js +2 -0
- package/dist/core/tools/parallel/scheduler.js +372 -0
- package/dist/core/tools/parser.js +89 -0
- package/dist/core/tools/permissions/permission-rules.js +503 -0
- package/dist/core/tools/plugins/loader.js +102 -0
- package/dist/core/tools/policy.js +87 -0
- package/dist/core/tools/registry.js +29 -0
- package/dist/core/tools/router.js +514 -0
- package/dist/core/tools/sanitize.js +78 -0
- package/dist/core/tools/schema-utils.js +71 -0
- package/dist/core/tools/session.js +1105 -0
- package/dist/core/tools/streaming/ToolCallAccumulator.js +64 -0
- package/dist/core/tools/types.js +2 -0
- package/dist/core/types/authorization.js +2 -0
- package/dist/core/types/context.js +2 -0
- package/dist/core/types/errors.js +29 -0
- package/dist/core/types/execution.js +65 -0
- package/dist/core/types/index.js +9 -0
- package/dist/core/types/llm.js +9 -0
- package/dist/core/types/loop.js +2 -0
- package/dist/core/types/planning.js +2 -0
- package/dist/core/types/runtime.js +2 -0
- package/dist/core/types/usage.js +2 -0
- package/dist/core/ui/kaomoji.js +5 -0
- package/dist/core/utils/path.js +116 -0
- package/dist/core/utils/platform-shell.js +10 -0
- package/dist/core/utils/sanitizer.js +107 -0
- package/dist/core/verification/runner.js +265 -0
- package/dist/integrations/langfuse/litellm-langfuse-outcome-reporter.js +272 -0
- package/dist/integrations/langfuse/outcome-proxy.js +68 -0
- package/dist/interfaces/cli/task-runner.js +11 -0
- package/dist/languages/typescript/index.js +178 -0
- package/dist/locales/en.js +679 -0
- package/dist/locales/index.js +11 -0
- package/dist/utils/eol.js +35 -0
- package/package.json +153 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 salmonloop
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Salmon-Loop
|
|
2
|
+
|
|
3
|
+
[English](README.md) | [简体中文](README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
SalmonLoop is a chat-first coding agent CLI for repositories that care about safety, auditability, and clean diffs.
|
|
6
|
+
Open `s8p`, describe the job, and let the loop stay disciplined about verification, rollback, and protecting user data.
|
|
7
|
+
|
|
8
|
+
## Why SalmonLoop
|
|
9
|
+
|
|
10
|
+
- **Agent, with guardrails**: SalmonLoop can plan, patch, verify, and serve through ACP/A2A, but it does not get a free pass to mutate your repo however it wants.
|
|
11
|
+
- **Chat-first UX**: `s8p` drops straight into the main experience.
|
|
12
|
+
- **Patch-first under the hood**: Changes are generated as diffs, not mystery rewrites.
|
|
13
|
+
- **Verify before success**: A run is only successful if your verification command passes.
|
|
14
|
+
- **Built for messy real repos**: The worktree strategy keeps dirty workspaces safer by isolating execution and applying changes back carefully.
|
|
15
|
+
- **Observable**: Sessions, audit events, snapshots, and structured outputs make it easier to inspect what happened.
|
|
16
|
+
|
|
17
|
+
## The Vibe
|
|
18
|
+
|
|
19
|
+
SalmonLoop is not trying to be an always-on autopilot that wanders around your codebase.
|
|
20
|
+
It is a disciplined engineering agent: focused instructions in, reviewable patches out.
|
|
21
|
+
|
|
22
|
+
The execution model stays pragmatic:
|
|
23
|
+
|
|
24
|
+
1. **Deterministic tools** for cheap, reliable operations.
|
|
25
|
+
2. **Microtasks** for small logic bridges and context assembly.
|
|
26
|
+
3. **Sub-agents** for multi-step tasks that actually need agent behavior.
|
|
27
|
+
|
|
28
|
+
## Quickstart
|
|
29
|
+
|
|
30
|
+
### 1. Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g salmon-loop
|
|
34
|
+
# or
|
|
35
|
+
bun install -g salmon-loop
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Requires `bun >= 1.3.9` if you use Bun as your package manager.
|
|
39
|
+
|
|
40
|
+
### 2. Configure an LLM
|
|
41
|
+
|
|
42
|
+
Create a local `.env` and set the preferred environment variables:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
SALMONLOOP_API_KEY=your-key
|
|
46
|
+
SALMONLOOP_BASE_URL=https://api.openai.com/v1
|
|
47
|
+
SALMONLOOP_MODEL=gpt-4.1-mini
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Legacy `S8P_*` aliases still work, but new setups should prefer `SALMONLOOP_*`.
|
|
51
|
+
|
|
52
|
+
### 3. Start chat mode
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
s8p
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
That is the primary product surface. Open it inside the repository you want to work on, then give it a task and a verification command in chat.
|
|
59
|
+
|
|
60
|
+
Example prompt:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
Fix the null handling in src/user.ts and verify with bun run test
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4. Use `run` when you want one-shot automation
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
s8p run \
|
|
70
|
+
--repo /path/to/your/repo \
|
|
71
|
+
--instruction "Fix the null handling in src/user.ts" \
|
|
72
|
+
--verify "bun run test" \
|
|
73
|
+
--checkpoint-strategy worktree
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 5. Serve it as an agent
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
s8p serve
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
This starts the built-in agent server stack for A2A and local sidecar integration.
|
|
83
|
+
|
|
84
|
+
## What Users Usually Care About
|
|
85
|
+
|
|
86
|
+
- **Chat mode**: `s8p`
|
|
87
|
+
- **Single run**: `s8p run --instruction "..." --verify "..."` when chat is not the right fit
|
|
88
|
+
- **Context only**: `s8p context -i "..."`
|
|
89
|
+
- **Snapshots**: `s8p snap ls`, `s8p snap show <hash>`, `s8p checkout <hash>`
|
|
90
|
+
- **Headless / CI**: `--output-format json` or `--output-format stream-json`
|
|
91
|
+
|
|
92
|
+
More detail lives in [docs/user/cli.md](docs/user/cli.md), [docs/user/config.md](docs/user/config.md), and [docs/reference/headless.md](docs/reference/headless.md).
|
|
93
|
+
|
|
94
|
+
## Safety Model
|
|
95
|
+
|
|
96
|
+
SalmonLoop is opinionated here, on purpose.
|
|
97
|
+
|
|
98
|
+
- **User data safety comes first**: the execution contract is designed to avoid unintended writes to the main workspace and Git index.
|
|
99
|
+
- **Dirty workspace support is explicit**: use `worktree` when you need isolation and safer apply-back behavior.
|
|
100
|
+
- **Rollback is part of the design**: failed verification is not a soft warning; it is a failed run.
|
|
101
|
+
- **Read-only phases stay read-only**: exploration, planning, and validation do not get casual write access.
|
|
102
|
+
|
|
103
|
+
If you want the exact contract, start with [docs/design/execution-contract.md](docs/design/execution-contract.md).
|
|
104
|
+
|
|
105
|
+
## Extensibility
|
|
106
|
+
|
|
107
|
+
- **Language plugins**: add support under `.salmonloop/languages/<lang>/index.js`
|
|
108
|
+
- **External tools and MCP**: configure extensions under `.salmonloop/config/`
|
|
109
|
+
See [docs/user/plugins.md](docs/user/plugins.md) and [docs/user/extensions.md](docs/user/extensions.md).
|
|
110
|
+
|
|
111
|
+
## Contributing
|
|
112
|
+
|
|
113
|
+
For contributors, the short version is:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
bun run setup:hooks
|
|
117
|
+
bun run verify
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`bun run verify` is the delivery bar for code changes in this repository.
|
|
121
|
+
|
|
122
|
+
Useful docs:
|
|
123
|
+
|
|
124
|
+
- [docs/contributing/contributing.md](docs/contributing/contributing.md)
|
|
125
|
+
- [docs/contributing/testing.md](docs/contributing/testing.md)
|
|
126
|
+
- [docs/contributing/coding-standards.md](docs/contributing/coding-standards.md)
|
|
127
|
+
- [docs/contributing/release.md](docs/contributing/release.md)
|
|
128
|
+
- [docs/contributing/security.md](docs/contributing/security.md)
|
|
129
|
+
|
|
130
|
+
## Docs Map
|
|
131
|
+
|
|
132
|
+
The documentation hub is [docs/README.md](docs/README.md).
|
|
133
|
+
|
|
134
|
+
Good starting points:
|
|
135
|
+
|
|
136
|
+
- [docs/getting-started/overview.md](docs/getting-started/overview.md)
|
|
137
|
+
- [docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)
|
|
138
|
+
- [docs/user/execution-safety.md](docs/user/execution-safety.md)
|
|
139
|
+
- [docs/design/execution-limits.md](docs/design/execution-limits.md)
|
|
140
|
+
- [docs/reference/changelog.md](docs/reference/changelog.md)
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Salmon-Loop
|
|
2
|
+
|
|
3
|
+
[English](README.md) | [简体中文](README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
SalmonLoop 是一个以对话为主入口的 coding agent CLI,适合对安全性、可审计性和干净 diff 有要求的代码仓库。
|
|
6
|
+
直接运行 `s8p` 就会进入主体验,后面的执行仍然会严格受验证、回滚和用户数据保护约束。
|
|
7
|
+
|
|
8
|
+
## 为什么用 SalmonLoop
|
|
9
|
+
|
|
10
|
+
- **是 Agent,但有边界**:它可以规划、打补丁、验证,也能通过 ACP / A2A 对外提供 Agent 能力,但不会无约束地乱改仓库。
|
|
11
|
+
- **对话优先**:`s8p` 直接进入主体验。
|
|
12
|
+
- **补丁优先**:底层依然默认产出 diff,而不是神秘的大段重写。
|
|
13
|
+
- **验证通过才算成功**:你的验证命令不过,任务就不算完成。
|
|
14
|
+
- **适合真实仓库**:`worktree` 策略可以在脏工作区里隔离执行,再谨慎地 apply back。
|
|
15
|
+
- **过程可追踪**:会话、审计事件、快照和结构化输出都方便排查问题。
|
|
16
|
+
|
|
17
|
+
## 整体气质
|
|
18
|
+
|
|
19
|
+
SalmonLoop 不是那种会一直在代码库里游荡的自动驾驶型 Agent。
|
|
20
|
+
它更像一个纪律严格的工程 Agent:输入明确指令,输出可审查的补丁。
|
|
21
|
+
|
|
22
|
+
它的执行模型也比较务实:
|
|
23
|
+
|
|
24
|
+
1. **确定性工具** 处理便宜、可靠的操作。
|
|
25
|
+
2. **微任务** 负责小范围逻辑拼装和上下文补全。
|
|
26
|
+
3. **子代理** 只在确实需要多步推理时出场。
|
|
27
|
+
|
|
28
|
+
## 快速开始
|
|
29
|
+
|
|
30
|
+
### 1. 安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g salmon-loop
|
|
34
|
+
# 或
|
|
35
|
+
bun install -g salmon-loop
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
如果你用 Bun 作为包管理器,要求 `bun >= 1.3.9`。
|
|
39
|
+
|
|
40
|
+
### 2. 配置 LLM
|
|
41
|
+
|
|
42
|
+
新建本地 `.env`,优先使用这些环境变量:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
SALMONLOOP_API_KEY=your-key
|
|
46
|
+
SALMONLOOP_BASE_URL=https://api.openai.com/v1
|
|
47
|
+
SALMONLOOP_MODEL=gpt-4.1-mini
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
旧的 `S8P_*` 别名仍然兼容,但新配置建议统一用 `SALMONLOOP_*`。
|
|
51
|
+
|
|
52
|
+
### 3. 进入对话模式
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
s8p
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
这是主推入口。进入目标仓库后,直接在对话里给它任务和验证命令即可。
|
|
59
|
+
|
|
60
|
+
例如:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
Fix the null handling in src/user.ts and verify with bun run test
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4. 需要一次性执行时再用 `run`
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
s8p run \
|
|
70
|
+
--repo /path/to/your/repo \
|
|
71
|
+
--instruction "Fix the null handling in src/user.ts" \
|
|
72
|
+
--verify "bun run test" \
|
|
73
|
+
--checkpoint-strategy worktree
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 5. 作为 Agent 服务运行
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
s8p serve
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
这会启动内置的 Agent 服务栈,用于 A2A 和本地 sidecar 集成。
|
|
83
|
+
|
|
84
|
+
## 用户最常用的能力
|
|
85
|
+
|
|
86
|
+
- **对话模式**:`s8p`
|
|
87
|
+
- **单次执行**:`s8p run --instruction "..." --verify "..."`,适合非交互场景
|
|
88
|
+
- **只构建上下文**:`s8p context -i "..."`
|
|
89
|
+
- **快照管理**:`s8p snap ls`、`s8p snap show <hash>`、`s8p checkout <hash>`
|
|
90
|
+
- **Headless / CI**:`--output-format json` 或 `--output-format stream-json`
|
|
91
|
+
|
|
92
|
+
更完整的用法可以看 [docs/user/cli.md](docs/user/cli.md)、[docs/user/config.md](docs/user/config.md)、[docs/reference/headless.md](docs/reference/headless.md)。
|
|
93
|
+
|
|
94
|
+
## 安全模型
|
|
95
|
+
|
|
96
|
+
SalmonLoop 在这里是故意严格的。
|
|
97
|
+
|
|
98
|
+
- **用户数据安全优先**:执行契约明确限制对主工作区和 Git index 的非预期写入。
|
|
99
|
+
- **脏工作区支持是显式设计**:需要隔离执行和更安全的 apply-back 时,就用 `worktree`。
|
|
100
|
+
- **回滚不是附属功能**:验证失败就是失败,不会含糊带过。
|
|
101
|
+
- **只读阶段必须只读**:探索、规划、验证阶段不会随便获得写权限。
|
|
102
|
+
|
|
103
|
+
如果你想看完整契约,先从 [docs/design/execution-contract.md](docs/design/execution-contract.md) 开始。
|
|
104
|
+
|
|
105
|
+
## 扩展能力
|
|
106
|
+
|
|
107
|
+
- **语言插件**:放到 `.salmonloop/languages/<lang>/index.js`
|
|
108
|
+
- **外部工具和 MCP**:通过 `.salmonloop/config/` 配置
|
|
109
|
+
相关文档见 [docs/user/plugins.md](docs/user/plugins.md) 和 [docs/user/extensions.md](docs/user/extensions.md)。
|
|
110
|
+
|
|
111
|
+
## 参与贡献
|
|
112
|
+
|
|
113
|
+
对贡献者来说,最短路径是:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
bun run setup:hooks
|
|
117
|
+
bun run verify
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
这个仓库里,`bun run verify` 就是代码交付线。
|
|
121
|
+
|
|
122
|
+
建议先看:
|
|
123
|
+
|
|
124
|
+
- [docs/contributing/contributing.md](docs/contributing/contributing.md)
|
|
125
|
+
- [docs/contributing/testing.md](docs/contributing/testing.md)
|
|
126
|
+
- [docs/contributing/coding-standards.md](docs/contributing/coding-standards.md)
|
|
127
|
+
- [docs/contributing/release.md](docs/contributing/release.md)
|
|
128
|
+
- [docs/contributing/security.md](docs/contributing/security.md)
|
|
129
|
+
|
|
130
|
+
## 文档入口
|
|
131
|
+
|
|
132
|
+
完整文档目录在 [docs/README.md](docs/README.md)。
|
|
133
|
+
|
|
134
|
+
推荐先读这些:
|
|
135
|
+
|
|
136
|
+
- [docs/getting-started/overview.md](docs/getting-started/overview.md)
|
|
137
|
+
- [docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)
|
|
138
|
+
- [docs/user/execution-safety.md](docs/user/execution-safety.md)
|
|
139
|
+
- [docs/design/execution-limits.md](docs/design/execution-limits.md)
|
|
140
|
+
- [docs/reference/changelog.md](docs/reference/changelog.md)
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
function readFlagValue(tokens, index) {
|
|
2
|
+
const token = tokens[index];
|
|
3
|
+
const eq = token.indexOf('=');
|
|
4
|
+
if (eq !== -1)
|
|
5
|
+
return { value: token.slice(eq + 1), nextIndex: index };
|
|
6
|
+
const next = tokens[index + 1];
|
|
7
|
+
if (typeof next === 'string')
|
|
8
|
+
return { value: next, nextIndex: index + 1 };
|
|
9
|
+
return { value: undefined, nextIndex: index };
|
|
10
|
+
}
|
|
11
|
+
export function detectHeadlessOutputFromArgv(argv) {
|
|
12
|
+
const tokens = argv.slice(2);
|
|
13
|
+
let repoPath;
|
|
14
|
+
let instruction;
|
|
15
|
+
let resumeSessionId;
|
|
16
|
+
let outputFormat;
|
|
17
|
+
let outputProfile;
|
|
18
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
19
|
+
const token = tokens[i];
|
|
20
|
+
if (token === '-r' || token === '--repo' || token.startsWith('--repo=')) {
|
|
21
|
+
const { value, nextIndex } = readFlagValue(tokens, i);
|
|
22
|
+
repoPath = value;
|
|
23
|
+
i = nextIndex;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (token === '-p' || token === '--print' || token.startsWith('--print=')) {
|
|
27
|
+
const { value, nextIndex } = readFlagValue(tokens, i);
|
|
28
|
+
instruction = value;
|
|
29
|
+
i = nextIndex;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (token === '--resume' || token.startsWith('--resume=')) {
|
|
33
|
+
const { value, nextIndex } = readFlagValue(tokens, i);
|
|
34
|
+
resumeSessionId = value;
|
|
35
|
+
i = nextIndex;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (token === '--output-format' || token.startsWith('--output-format=')) {
|
|
39
|
+
const { value, nextIndex } = readFlagValue(tokens, i);
|
|
40
|
+
outputFormat = value;
|
|
41
|
+
i = nextIndex;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (token === '--output-profile' || token.startsWith('--output-profile=')) {
|
|
45
|
+
const { value, nextIndex } = readFlagValue(tokens, i);
|
|
46
|
+
outputProfile = value;
|
|
47
|
+
i = nextIndex;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const normalized = outputFormat === 'json' || outputFormat === 'stream-json' ? outputFormat : null;
|
|
52
|
+
return {
|
|
53
|
+
repoPath,
|
|
54
|
+
instruction,
|
|
55
|
+
resumeSessionId,
|
|
56
|
+
outputFormat: normalized,
|
|
57
|
+
outputProfile,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=headless-detection.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export const CLI_ROOT_COMMANDS = new Set([
|
|
2
|
+
'run',
|
|
3
|
+
'serve',
|
|
4
|
+
'chat',
|
|
5
|
+
'context',
|
|
6
|
+
'restore',
|
|
7
|
+
'checkout',
|
|
8
|
+
'snapshot',
|
|
9
|
+
'snap',
|
|
10
|
+
]);
|
|
11
|
+
const PRINT_MODE_FLAGS_WITH_VALUES = new Set([
|
|
12
|
+
'-p',
|
|
13
|
+
'--print',
|
|
14
|
+
'-r',
|
|
15
|
+
'--repo',
|
|
16
|
+
'--resume',
|
|
17
|
+
'-v',
|
|
18
|
+
'--verify',
|
|
19
|
+
'-cs',
|
|
20
|
+
'--checkpoint-strategy',
|
|
21
|
+
'--llm-output',
|
|
22
|
+
]);
|
|
23
|
+
function startsWithAny(value, prefixes) {
|
|
24
|
+
for (const prefix of prefixes) {
|
|
25
|
+
if (value.startsWith(prefix))
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
export function rewriteArgvForPrintMode(argv) {
|
|
31
|
+
const tokens = argv.slice(2);
|
|
32
|
+
const hasPrint = tokens.some((t) => t === '-p' || t === '--print' || t.startsWith('--print='));
|
|
33
|
+
if (!hasPrint)
|
|
34
|
+
return argv;
|
|
35
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
36
|
+
const token = tokens[i];
|
|
37
|
+
if (token === '--')
|
|
38
|
+
break;
|
|
39
|
+
if (PRINT_MODE_FLAGS_WITH_VALUES.has(token)) {
|
|
40
|
+
i += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (startsWithAny(token, [
|
|
44
|
+
'--print=',
|
|
45
|
+
'--repo=',
|
|
46
|
+
'--resume=',
|
|
47
|
+
'--verify=',
|
|
48
|
+
'--checkpoint-strategy=',
|
|
49
|
+
'--llm-output=',
|
|
50
|
+
])) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (token.startsWith('-'))
|
|
54
|
+
continue;
|
|
55
|
+
if (CLI_ROOT_COMMANDS.has(token))
|
|
56
|
+
return argv;
|
|
57
|
+
}
|
|
58
|
+
return [...argv.slice(0, 2), 'run', ...tokens];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=print-mode.js.map
|