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