@greppleai/grip 0.0.0-stage → 0.0.1
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/CHANGELOG.md +22 -0
- package/README.md +725 -2
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +11 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +70 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +441 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +60 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +35 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +406 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +970 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +5176 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +150 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +557 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +26 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +99 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +83 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +220 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +65 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +550 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
- package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
- package/dist/core/compaction/compression-detection-ledger.js +52 -0
- package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
- package/dist/core/compaction/compression-detector.d.ts +71 -0
- package/dist/core/compaction/compression-detector.d.ts.map +1 -0
- package/dist/core/compaction/compression-detector.js +407 -0
- package/dist/core/compaction/compression-detector.js.map +1 -0
- package/dist/core/compaction/compression-economics.d.ts +55 -0
- package/dist/core/compaction/compression-economics.d.ts.map +1 -0
- package/dist/core/compaction/compression-economics.js +151 -0
- package/dist/core/compaction/compression-economics.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +28 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +165 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +18 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +245 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +21 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +230 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/tool-renderer.d.ts +32 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +78 -0
- package/dist/core/extensions/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +613 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +160 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +962 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1311 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +51 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +52 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +318 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/grip-agent.d.ts +240 -0
- package/dist/core/grip-agent.d.ts.map +1 -0
- package/dist/core/grip-agent.js +1243 -0
- package/dist/core/grip-agent.js.map +1 -0
- package/dist/core/grip-manifest.d.ts +9 -0
- package/dist/core/grip-manifest.d.ts.map +1 -0
- package/dist/core/grip-manifest.js +25 -0
- package/dist/core/grip-manifest.js.map +1 -0
- package/dist/core/hooks/aggregate.d.ts +5 -0
- package/dist/core/hooks/aggregate.d.ts.map +1 -0
- package/dist/core/hooks/aggregate.js +226 -0
- package/dist/core/hooks/aggregate.js.map +1 -0
- package/dist/core/hooks/config.d.ts +14 -0
- package/dist/core/hooks/config.d.ts.map +1 -0
- package/dist/core/hooks/config.js +372 -0
- package/dist/core/hooks/config.js.map +1 -0
- package/dist/core/hooks/executor.d.ts +12 -0
- package/dist/core/hooks/executor.d.ts.map +1 -0
- package/dist/core/hooks/executor.js +708 -0
- package/dist/core/hooks/executor.js.map +1 -0
- package/dist/core/hooks/index.d.ts +9 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +14 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/matcher.d.ts +10 -0
- package/dist/core/hooks/matcher.d.ts.map +1 -0
- package/dist/core/hooks/matcher.js +70 -0
- package/dist/core/hooks/matcher.js.map +1 -0
- package/dist/core/hooks/trust-store.d.ts +38 -0
- package/dist/core/hooks/trust-store.d.ts.map +1 -0
- package/dist/core/hooks/trust-store.js +167 -0
- package/dist/core/hooks/trust-store.js.map +1 -0
- package/dist/core/hooks/types.d.ts +234 -0
- package/dist/core/hooks/types.d.ts.map +1 -0
- package/dist/core/hooks/types.js +52 -0
- package/dist/core/hooks/types.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +21 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +82 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/instruction-resource-loader.d.ts +81 -0
- package/dist/core/instruction-resource-loader.d.ts.map +1 -0
- package/dist/core/instruction-resource-loader.js +574 -0
- package/dist/core/instruction-resource-loader.js.map +1 -0
- package/dist/core/keybindings.d.ts +399 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +299 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/lsp/abort.d.ts +3 -0
- package/dist/core/lsp/abort.d.ts.map +1 -0
- package/dist/core/lsp/abort.js +28 -0
- package/dist/core/lsp/abort.js.map +1 -0
- package/dist/core/lsp/client.d.ts +108 -0
- package/dist/core/lsp/client.d.ts.map +1 -0
- package/dist/core/lsp/client.js +586 -0
- package/dist/core/lsp/client.js.map +1 -0
- package/dist/core/lsp/config-loader.d.ts +44 -0
- package/dist/core/lsp/config-loader.d.ts.map +1 -0
- package/dist/core/lsp/config-loader.js +223 -0
- package/dist/core/lsp/config-loader.js.map +1 -0
- package/dist/core/lsp/config.d.ts +134 -0
- package/dist/core/lsp/config.d.ts.map +1 -0
- package/dist/core/lsp/config.js +682 -0
- package/dist/core/lsp/config.js.map +1 -0
- package/dist/core/lsp/diagnostics.d.ts +18 -0
- package/dist/core/lsp/diagnostics.d.ts.map +1 -0
- package/dist/core/lsp/diagnostics.js +311 -0
- package/dist/core/lsp/diagnostics.js.map +1 -0
- package/dist/core/lsp/file-sync.d.ts +58 -0
- package/dist/core/lsp/file-sync.d.ts.map +1 -0
- package/dist/core/lsp/file-sync.js +432 -0
- package/dist/core/lsp/file-sync.js.map +1 -0
- package/dist/core/lsp/integration.d.ts +62 -0
- package/dist/core/lsp/integration.d.ts.map +1 -0
- package/dist/core/lsp/integration.js +145 -0
- package/dist/core/lsp/integration.js.map +1 -0
- package/dist/core/lsp/language-map.d.ts +54 -0
- package/dist/core/lsp/language-map.d.ts.map +1 -0
- package/dist/core/lsp/language-map.js +300 -0
- package/dist/core/lsp/language-map.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +120 -0
- package/dist/core/lsp/manager.d.ts.map +1 -0
- package/dist/core/lsp/manager.js +636 -0
- package/dist/core/lsp/manager.js.map +1 -0
- package/dist/core/lsp/navigation.d.ts +32 -0
- package/dist/core/lsp/navigation.d.ts.map +1 -0
- package/dist/core/lsp/navigation.js +327 -0
- package/dist/core/lsp/navigation.js.map +1 -0
- package/dist/core/lsp/portable-path.d.ts +18 -0
- package/dist/core/lsp/portable-path.d.ts.map +1 -0
- package/dist/core/lsp/portable-path.js +83 -0
- package/dist/core/lsp/portable-path.js.map +1 -0
- package/dist/core/lsp/refactor.d.ts +32 -0
- package/dist/core/lsp/refactor.d.ts.map +1 -0
- package/dist/core/lsp/refactor.js +519 -0
- package/dist/core/lsp/refactor.js.map +1 -0
- package/dist/core/lsp/transport.d.ts +39 -0
- package/dist/core/lsp/transport.d.ts.map +1 -0
- package/dist/core/lsp/transport.js +261 -0
- package/dist/core/lsp/transport.js.map +1 -0
- package/dist/core/messages.d.ts +34 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +140 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +148 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +812 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +115 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +498 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +89 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +209 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2341 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +57 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +353 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +33 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/remote-workspace-protocol/contract.d.ts +456 -0
- package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/contract.js +809 -0
- package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
- package/dist/core/remote-workspace-protocol/session.d.ts +247 -0
- package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/session.js +1839 -0
- package/dist/core/remote-workspace-protocol/session.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +32 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +257 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +200 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +1209 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/rules.d.ts +40 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +57 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/sandbox/command.d.ts +27 -0
- package/dist/core/sandbox/command.d.ts.map +1 -0
- package/dist/core/sandbox/command.js +124 -0
- package/dist/core/sandbox/command.js.map +1 -0
- package/dist/core/sandbox/docker.d.ts +169 -0
- package/dist/core/sandbox/docker.d.ts.map +1 -0
- package/dist/core/sandbox/docker.js +633 -0
- package/dist/core/sandbox/docker.js.map +1 -0
- package/dist/core/sandbox/lima.d.ts +38 -0
- package/dist/core/sandbox/lima.d.ts.map +1 -0
- package/dist/core/sandbox/lima.js +324 -0
- package/dist/core/sandbox/lima.js.map +1 -0
- package/dist/core/session/constants.d.ts +2 -0
- package/dist/core/session/constants.d.ts.map +1 -0
- package/dist/core/session/constants.js +2 -0
- package/dist/core/session/constants.js.map +1 -0
- package/dist/core/session/context-metadata.d.ts +5 -0
- package/dist/core/session/context-metadata.d.ts.map +1 -0
- package/dist/core/session/context-metadata.js +55 -0
- package/dist/core/session/context-metadata.js.map +1 -0
- package/dist/core/session/context.d.ts +14 -0
- package/dist/core/session/context.d.ts.map +1 -0
- package/dist/core/session/context.js +117 -0
- package/dist/core/session/context.js.map +1 -0
- package/dist/core/session/ids.d.ts +9 -0
- package/dist/core/session/ids.d.ts.map +1 -0
- package/dist/core/session/ids.js +21 -0
- package/dist/core/session/ids.js.map +1 -0
- package/dist/core/session/in-memory-session-manager.d.ts +17 -0
- package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
- package/dist/core/session/in-memory-session-manager.js +40 -0
- package/dist/core/session/in-memory-session-manager.js.map +1 -0
- package/dist/core/session/in-memory-session.d.ts +7 -0
- package/dist/core/session/in-memory-session.d.ts.map +1 -0
- package/dist/core/session/in-memory-session.js +11 -0
- package/dist/core/session/in-memory-session.js.map +1 -0
- package/dist/core/session/jsonl-errors.d.ts +36 -0
- package/dist/core/session/jsonl-errors.d.ts.map +1 -0
- package/dist/core/session/jsonl-errors.js +49 -0
- package/dist/core/session/jsonl-errors.js.map +1 -0
- package/dist/core/session/jsonl-helpers.d.ts +20 -0
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
- package/dist/core/session/jsonl-helpers.js +21 -0
- package/dist/core/session/jsonl-helpers.js.map +1 -0
- package/dist/core/session/local-session-manager.d.ts +30 -0
- package/dist/core/session/local-session-manager.d.ts.map +1 -0
- package/dist/core/session/local-session-manager.js +205 -0
- package/dist/core/session/local-session-manager.js.map +1 -0
- package/dist/core/session/local-session.d.ts +9 -0
- package/dist/core/session/local-session.d.ts.map +1 -0
- package/dist/core/session/local-session.js +15 -0
- package/dist/core/session/local-session.js.map +1 -0
- package/dist/core/session/migrations.d.ts +11 -0
- package/dist/core/session/migrations.d.ts.map +1 -0
- package/dist/core/session/migrations.js +78 -0
- package/dist/core/session/migrations.js.map +1 -0
- package/dist/core/session/remote-session-client.d.ts +83 -0
- package/dist/core/session/remote-session-client.d.ts.map +1 -0
- package/dist/core/session/remote-session-client.js +224 -0
- package/dist/core/session/remote-session-client.js.map +1 -0
- package/dist/core/session/remote-session-manager.d.ts +32 -0
- package/dist/core/session/remote-session-manager.d.ts.map +1 -0
- package/dist/core/session/remote-session-manager.js +124 -0
- package/dist/core/session/remote-session-manager.js.map +1 -0
- package/dist/core/session/remote-session.d.ts +20 -0
- package/dist/core/session/remote-session.d.ts.map +1 -0
- package/dist/core/session/remote-session.js +33 -0
- package/dist/core/session/remote-session.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +18 -0
- package/dist/core/session/session-manager.d.ts.map +1 -0
- package/dist/core/session/session-manager.js +2 -0
- package/dist/core/session/session-manager.js.map +1 -0
- package/dist/core/session/session.d.ts +140 -0
- package/dist/core/session/session.d.ts.map +1 -0
- package/dist/core/session/session.js +461 -0
- package/dist/core/session/session.js.map +1 -0
- package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
- package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/in-memory-session-store.js +168 -0
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.js +1140 -0
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
- package/dist/core/session/stores/remote-session-store.d.ts +44 -0
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/remote-session-store.js +159 -0
- package/dist/core/session/stores/remote-session-store.js.map +1 -0
- package/dist/core/session/stores/session-store.d.ts +42 -0
- package/dist/core/session/stores/session-store.d.ts.map +1 -0
- package/dist/core/session/stores/session-store.js +2 -0
- package/dist/core/session/stores/session-store.js.map +1 -0
- package/dist/core/session/types.d.ts +141 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/session/usage-ledger.d.ts +18 -0
- package/dist/core/session/usage-ledger.d.ts.map +1 -0
- package/dist/core/session/usage-ledger.js +68 -0
- package/dist/core/session/usage-ledger.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/settings-manager.d.ts +318 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +991 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +40 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +57 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +36 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +26 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +27 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +32 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +131 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +10 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +41 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +51 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +310 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/compress-context.d.ts +27 -0
- package/dist/core/tools/compress-context.d.ts.map +1 -0
- package/dist/core/tools/compress-context.js +142 -0
- package/dist/core/tools/compress-context.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +82 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +327 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +50 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +324 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +60 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +22 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +268 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +27 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +332 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/hash-store.d.ts +12 -0
- package/dist/core/tools/hash-store.d.ts.map +1 -0
- package/dist/core/tools/hash-store.js +48 -0
- package/dist/core/tools/hash-store.js.map +1 -0
- package/dist/core/tools/hashline/apply.d.ts +40 -0
- package/dist/core/tools/hashline/apply.d.ts.map +1 -0
- package/dist/core/tools/hashline/apply.js +261 -0
- package/dist/core/tools/hashline/apply.js.map +1 -0
- package/dist/core/tools/hashline/hash.d.ts +56 -0
- package/dist/core/tools/hashline/hash.d.ts.map +1 -0
- package/dist/core/tools/hashline/hash.js +196 -0
- package/dist/core/tools/hashline/hash.js.map +1 -0
- package/dist/core/tools/hashline/parse.d.ts +8 -0
- package/dist/core/tools/hashline/parse.d.ts.map +1 -0
- package/dist/core/tools/hashline/parse.js +41 -0
- package/dist/core/tools/hashline/parse.js.map +1 -0
- package/dist/core/tools/hashline/resolve.d.ts +51 -0
- package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
- package/dist/core/tools/hashline/resolve.js +187 -0
- package/dist/core/tools/hashline/resolve.js.map +1 -0
- package/dist/core/tools/hashline-utils.d.ts +6 -0
- package/dist/core/tools/hashline-utils.d.ts.map +1 -0
- package/dist/core/tools/hashline-utils.js +23 -0
- package/dist/core/tools/hashline-utils.js.map +1 -0
- package/dist/core/tools/index.d.ts +36 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +141 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +21 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +156 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/operations.d.ts +201 -0
- package/dist/core/tools/operations.d.ts.map +1 -0
- package/dist/core/tools/operations.js +697 -0
- package/dist/core/tools/operations.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +54 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +9 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +32 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +318 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +33 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +61 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/replace-diff.d.ts +16 -0
- package/dist/core/tools/replace-diff.d.ts.map +1 -0
- package/dist/core/tools/replace-diff.js +117 -0
- package/dist/core/tools/replace-diff.js.map +1 -0
- package/dist/core/tools/replace-normalize.d.ts +2 -0
- package/dist/core/tools/replace-normalize.d.ts.map +1 -0
- package/dist/core/tools/replace-normalize.js +73 -0
- package/dist/core/tools/replace-normalize.js.map +1 -0
- package/dist/core/tools/replace-render.d.ts +51 -0
- package/dist/core/tools/replace-render.d.ts.map +1 -0
- package/dist/core/tools/replace-render.js +162 -0
- package/dist/core/tools/replace-render.js.map +1 -0
- package/dist/core/tools/runtime.d.ts +2 -0
- package/dist/core/tools/runtime.d.ts.map +1 -0
- package/dist/core/tools/runtime.js +6 -0
- package/dist/core/tools/runtime.js.map +1 -0
- package/dist/core/tools/session-history.d.ts +55 -0
- package/dist/core/tools/session-history.d.ts.map +1 -0
- package/dist/core/tools/session-history.js +649 -0
- package/dist/core/tools/session-history.js.map +1 -0
- package/dist/core/tools/subagent-agents.d.ts +29 -0
- package/dist/core/tools/subagent-agents.d.ts.map +1 -0
- package/dist/core/tools/subagent-agents.js +223 -0
- package/dist/core/tools/subagent-agents.js.map +1 -0
- package/dist/core/tools/subagent.d.ts +185 -0
- package/dist/core/tools/subagent.d.ts.map +1 -0
- package/dist/core/tools/subagent.js +1309 -0
- package/dist/core/tools/subagent.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +39 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/websearch.d.ts +33 -0
- package/dist/core/tools/websearch.d.ts.map +1 -0
- package/dist/core/tools/websearch.js +341 -0
- package/dist/core/tools/websearch.js.map +1 -0
- package/dist/core/tools/workspace-tool-host.d.ts +102 -0
- package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
- package/dist/core/tools/workspace-tool-host.js +348 -0
- package/dist/core/tools/workspace-tool-host.js.map +1 -0
- package/dist/core/tools/write.d.ts +16 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +204 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/workspace-identity.d.ts +7 -0
- package/dist/core/workspace-identity.d.ts.map +1 -0
- package/dist/core/workspace-identity.js +2 -0
- package/dist/core/workspace-identity.js.map +1 -0
- package/dist/daemon/command.d.ts +6 -0
- package/dist/daemon/command.d.ts.map +1 -0
- package/dist/daemon/command.js +58 -0
- package/dist/daemon/command.js.map +1 -0
- package/dist/daemon/config.d.ts +43 -0
- package/dist/daemon/config.d.ts.map +1 -0
- package/dist/daemon/config.js +304 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/help.d.ts +2 -0
- package/dist/daemon/help.d.ts.map +1 -0
- package/dist/daemon/help.js +42 -0
- package/dist/daemon/help.js.map +1 -0
- package/dist/daemon/lsp-config.d.ts +4 -0
- package/dist/daemon/lsp-config.d.ts.map +1 -0
- package/dist/daemon/lsp-config.js +155 -0
- package/dist/daemon/lsp-config.js.map +1 -0
- package/dist/daemon/security.d.ts +19 -0
- package/dist/daemon/security.d.ts.map +1 -0
- package/dist/daemon/security.js +175 -0
- package/dist/daemon/security.js.map +1 -0
- package/dist/daemon/server.d.ts +20 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +400 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/workspace-runtime.d.ts +46 -0
- package/dist/daemon/workspace-runtime.d.ts.map +1 -0
- package/dist/daemon/workspace-runtime.js +673 -0
- package/dist/daemon/workspace-runtime.js.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +39 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +763 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +35 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +412 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +149 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +173 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +74 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +514 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +25 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +85 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +80 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +118 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +128 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +83 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +36 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +227 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
- package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/hook-execution.js +184 -0
- package/dist/modes/interactive/components/hook-execution.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +176 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +14 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +228 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +52 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +296 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +50 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +144 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +108 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +835 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +455 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +51 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +306 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1098 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +16 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +49 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +557 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +5859 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +86 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +106 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1030 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/json-event.d.ts +28 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +12 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts +29 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +142 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +321 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +755 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +963 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +652 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +488 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +25 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +23 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +74 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +15 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +88 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +13 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +248 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +20 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +4 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +171 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/directory-completions.d.ts +5 -0
- package/dist/utils/directory-completions.d.ts.map +1 -0
- package/dist/utils/directory-completions.js +64 -0
- package/dist/utils/directory-completions.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +6 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +166 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +27 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +237 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/grip-user-agent.d.ts +2 -0
- package/dist/utils/grip-user-agent.d.ts.map +1 -0
- package/dist/utils/grip-user-agent.js +5 -0
- package/dist/utils/grip-user-agent.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +12 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +43 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +83 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +133 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +19 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +81 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +110 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +31 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +87 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +22 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +125 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +28 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +188 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +125 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +5 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +329 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +91 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +408 -0
- package/docs/custom-provider.md +714 -0
- package/docs/daemon-architecture.md +399 -0
- package/docs/daemon.md +110 -0
- package/docs/development.md +72 -0
- package/docs/docs.json +164 -0
- package/docs/extensions.md +2745 -0
- package/docs/hooks.md +85 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +81 -0
- package/docs/json.md +89 -0
- package/docs/keybindings.md +230 -0
- package/docs/lsp.md +499 -0
- package/docs/migrating-to-grip.md +18 -0
- package/docs/models.md +496 -0
- package/docs/packages.md +228 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +251 -0
- package/docs/quickstart.md +167 -0
- package/docs/rpc.md +1492 -0
- package/docs/rules.md +117 -0
- package/docs/sandbox.md +181 -0
- package/docs/sdk.md +360 -0
- package/docs/session-format.md +414 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +371 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +246 -0
- package/docs/terminal-setup.md +112 -0
- package/docs/termux.md +129 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +304 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +31 -0
- package/examples/daemon-docker/Dockerfile +43 -0
- package/examples/daemon-docker/README.md +45 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +46 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +145 -0
- package/examples/extensions/built-in-tool-renderer.ts +259 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +82 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +131 -0
- package/examples/extensions/custom-footer.ts +79 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +707 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +402 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
- package/examples/extensions/dirty-repo-guard.ts +59 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +133 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/RULES.md +8 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +16 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/git-merge-and-resolve.ts +125 -0
- package/examples/extensions/github-issue-autocomplete.ts +191 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +104 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +194 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +428 -0
- package/examples/extensions/modal-editor.ts +86 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1374 -0
- package/examples/extensions/overlay-test.ts +171 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +346 -0
- package/examples/extensions/plan-mode/utils.ts +172 -0
- package/examples/extensions/preset.ts +426 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +29 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +125 -0
- package/examples/extensions/question.ts +294 -0
- package/examples/extensions/questionnaire.ts +459 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +320 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +381 -0
- package/examples/extensions/space-invaders.ts +597 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +175 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +1083 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +186 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1091 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +306 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +200 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/remote-session-server/README.md +71 -0
- package/examples/remote-session-server/server.ts +353 -0
- package/examples/rpc-extension-ui.ts +642 -0
- package/examples/sandbox-docker/Dockerfile +274 -0
- package/examples/sandbox-docker/README.md +88 -0
- package/examples/sdk/01-minimal.ts +27 -0
- package/examples/sdk/02-custom-model.ts +54 -0
- package/examples/sdk/03-custom-prompt.ts +76 -0
- package/examples/sdk/04-skills.ts +60 -0
- package/examples/sdk/05-tools.ts +55 -0
- package/examples/sdk/06-extensions.ts +94 -0
- package/examples/sdk/07-context-files.ts +47 -0
- package/examples/sdk/08-prompt-templates.ts +56 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
- package/examples/sdk/10-settings.ts +58 -0
- package/examples/sdk/11-sessions.ts +54 -0
- package/examples/sdk/12-full-control.ts +79 -0
- package/examples/sdk/13-session-runtime.ts +49 -0
- package/examples/sdk/README.md +94 -0
- package/npm-shrinkwrap.json +1878 -0
- package/package.json +102 -5
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import { Text } from "@greppleai/grip-tui";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
|
|
7
|
+
import { ensureTool } from "../../utils/tools-manager.js";
|
|
8
|
+
import { resolveToCwd } from "./path-utils.js";
|
|
9
|
+
import { formatBackendIcon, getTextOutput, invalidArgText, shortenPath, str } from "./render-utils.js";
|
|
10
|
+
import { wrapToolDefinition } from "./tool-definition-wrapper.js";
|
|
11
|
+
import { DEFAULT_MAX_BYTES, formatSize, GREP_MAX_LINE_LENGTH, truncateHead, truncateLine, } from "./truncate.js";
|
|
12
|
+
const grepSchema = Type.Object({
|
|
13
|
+
pattern: Type.String({ description: "Search pattern (regex or literal string)" }),
|
|
14
|
+
path: Type.Optional(Type.String({ description: "Directory or file to search (default: current directory)" })),
|
|
15
|
+
glob: Type.Optional(Type.String({ description: "Filter files by glob pattern, e.g. '*.ts' or '**/*.spec.ts'" })),
|
|
16
|
+
ignoreCase: Type.Optional(Type.Boolean({ description: "Case-insensitive search (default: false)" })),
|
|
17
|
+
literal: Type.Optional(Type.Boolean({ description: "Treat pattern as literal string instead of regex (default: false)" })),
|
|
18
|
+
context: Type.Optional(Type.Number({ description: "Number of lines to show before and after each match (default: 0)" })),
|
|
19
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of matches to return (default: 100)" })),
|
|
20
|
+
});
|
|
21
|
+
const DEFAULT_LIMIT = 100;
|
|
22
|
+
function formatGrepCall(args, theme) {
|
|
23
|
+
const pattern = str(args?.pattern);
|
|
24
|
+
const rawPath = str(args?.path);
|
|
25
|
+
const path = rawPath !== null ? shortenPath(rawPath || ".") : null;
|
|
26
|
+
const glob = str(args?.glob);
|
|
27
|
+
const limit = args?.limit;
|
|
28
|
+
const invalidArg = invalidArgText(theme);
|
|
29
|
+
let text = theme.fg("toolTitle", theme.bold("grep")) +
|
|
30
|
+
" " +
|
|
31
|
+
(pattern === null ? invalidArg : theme.fg("accent", `/${pattern || ""}/`)) +
|
|
32
|
+
theme.fg("toolOutput", ` in ${path === null ? invalidArg : path}`);
|
|
33
|
+
if (glob)
|
|
34
|
+
text += theme.fg("toolOutput", ` (${glob})`);
|
|
35
|
+
if (limit !== undefined)
|
|
36
|
+
text += theme.fg("toolOutput", ` limit ${limit}`);
|
|
37
|
+
return text;
|
|
38
|
+
}
|
|
39
|
+
function formatGrepResult(result, options, theme, showImages) {
|
|
40
|
+
const output = getTextOutput(result, showImages).trim();
|
|
41
|
+
let text = "";
|
|
42
|
+
if (output) {
|
|
43
|
+
const lines = output.split("\n");
|
|
44
|
+
const maxLines = options.expanded ? lines.length : 15;
|
|
45
|
+
const displayLines = lines.slice(0, maxLines);
|
|
46
|
+
const remaining = lines.length - maxLines;
|
|
47
|
+
text += `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
|
|
48
|
+
if (remaining > 0) {
|
|
49
|
+
text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")})`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const matchLimit = result.details?.matchLimitReached;
|
|
53
|
+
const truncation = result.details?.truncation;
|
|
54
|
+
const linesTruncated = result.details?.linesTruncated;
|
|
55
|
+
if (matchLimit || truncation?.truncated || linesTruncated) {
|
|
56
|
+
const warnings = [];
|
|
57
|
+
if (matchLimit)
|
|
58
|
+
warnings.push(`${matchLimit} matches limit`);
|
|
59
|
+
if (truncation?.truncated)
|
|
60
|
+
warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);
|
|
61
|
+
if (linesTruncated)
|
|
62
|
+
warnings.push("some lines truncated");
|
|
63
|
+
text += `\n${theme.fg("warning", `[Truncated: ${warnings.join(", ")}]`)}`;
|
|
64
|
+
}
|
|
65
|
+
return text;
|
|
66
|
+
}
|
|
67
|
+
function noGrepMatchesResult() {
|
|
68
|
+
return { content: [{ type: "text", text: "No matches found" }], details: undefined };
|
|
69
|
+
}
|
|
70
|
+
function formatMatchedFilePath(state, filePath) {
|
|
71
|
+
if (state.isDirectory) {
|
|
72
|
+
const relative = path.relative(state.searchPath, filePath);
|
|
73
|
+
if (relative && !relative.startsWith(".."))
|
|
74
|
+
return relative.replace(/\\/g, "/");
|
|
75
|
+
}
|
|
76
|
+
return path.basename(filePath);
|
|
77
|
+
}
|
|
78
|
+
async function getGrepFileLines(state, filePath) {
|
|
79
|
+
const cached = state.fileCache.get(filePath);
|
|
80
|
+
if (cached)
|
|
81
|
+
return cached;
|
|
82
|
+
let lines;
|
|
83
|
+
try {
|
|
84
|
+
const content = (await state.operations.readFile(filePath)).toString("utf-8");
|
|
85
|
+
lines = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
lines = [];
|
|
89
|
+
}
|
|
90
|
+
state.fileCache.set(filePath, lines);
|
|
91
|
+
return lines;
|
|
92
|
+
}
|
|
93
|
+
async function formatGrepContextBlock(state, match) {
|
|
94
|
+
const relativePath = formatMatchedFilePath(state, match.filePath);
|
|
95
|
+
const lines = await getGrepFileLines(state, match.filePath);
|
|
96
|
+
if (!lines.length)
|
|
97
|
+
return [`${relativePath}:${match.lineNumber}: (unable to read file)`];
|
|
98
|
+
const block = [];
|
|
99
|
+
const start = state.context > 0 ? Math.max(1, match.lineNumber - state.context) : match.lineNumber;
|
|
100
|
+
const end = state.context > 0 ? Math.min(lines.length, match.lineNumber + state.context) : match.lineNumber;
|
|
101
|
+
for (let current = start; current <= end; current++) {
|
|
102
|
+
const sanitized = (lines[current - 1] ?? "").replace(/\r/g, "");
|
|
103
|
+
const { text, wasTruncated } = truncateLine(sanitized);
|
|
104
|
+
if (wasTruncated)
|
|
105
|
+
state.linesTruncated = true;
|
|
106
|
+
block.push(current === match.lineNumber ? `${relativePath}:${current}: ${text}` : `${relativePath}-${current}- ${text}`);
|
|
107
|
+
}
|
|
108
|
+
return block;
|
|
109
|
+
}
|
|
110
|
+
async function formatGrepMatch(state, match) {
|
|
111
|
+
if (state.context !== 0 || match.lineText === undefined)
|
|
112
|
+
return formatGrepContextBlock(state, match);
|
|
113
|
+
const sanitized = match.lineText.replace(/\r\n/g, "\n").replace(/\r/g, "").replace(/\n$/, "");
|
|
114
|
+
const { text, wasTruncated } = truncateLine(sanitized);
|
|
115
|
+
if (wasTruncated)
|
|
116
|
+
state.linesTruncated = true;
|
|
117
|
+
return [`${formatMatchedFilePath(state, match.filePath)}:${match.lineNumber}: ${text}`];
|
|
118
|
+
}
|
|
119
|
+
async function formatGrepMatches(state, matches) {
|
|
120
|
+
const outputLines = [];
|
|
121
|
+
for (const match of matches)
|
|
122
|
+
outputLines.push(...(await formatGrepMatch(state, match)));
|
|
123
|
+
return outputLines;
|
|
124
|
+
}
|
|
125
|
+
function buildGrepResult(state, outputLines, matchLimitReached) {
|
|
126
|
+
const truncation = truncateHead(outputLines.join("\n"), { maxLines: Number.MAX_SAFE_INTEGER });
|
|
127
|
+
let output = truncation.content;
|
|
128
|
+
const details = {};
|
|
129
|
+
const notices = [];
|
|
130
|
+
if (matchLimitReached !== undefined) {
|
|
131
|
+
notices.push(`${matchLimitReached} matches limit reached. Use limit=${matchLimitReached * 2} for more, or refine pattern`);
|
|
132
|
+
details.matchLimitReached = matchLimitReached;
|
|
133
|
+
}
|
|
134
|
+
if (truncation.truncated) {
|
|
135
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
136
|
+
details.truncation = truncation;
|
|
137
|
+
}
|
|
138
|
+
if (state.linesTruncated) {
|
|
139
|
+
notices.push(`Some lines truncated to ${GREP_MAX_LINE_LENGTH} chars. Use read tool to see full lines`);
|
|
140
|
+
details.linesTruncated = true;
|
|
141
|
+
}
|
|
142
|
+
if (notices.length > 0)
|
|
143
|
+
output += `\n\n[${notices.join(". ")}]`;
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: "text", text: output }],
|
|
146
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async function executeOperationsGrep(operations, input, formatState) {
|
|
150
|
+
const result = await operations.grep({
|
|
151
|
+
pattern: input.pattern,
|
|
152
|
+
path: input.searchPath,
|
|
153
|
+
glob: input.glob,
|
|
154
|
+
ignoreCase: input.ignoreCase,
|
|
155
|
+
literal: input.literal,
|
|
156
|
+
limit: input.limit,
|
|
157
|
+
});
|
|
158
|
+
formatState.isDirectory = result.isDirectory;
|
|
159
|
+
if (result.matches.length === 0)
|
|
160
|
+
return noGrepMatchesResult();
|
|
161
|
+
const outputLines = await formatGrepMatches(formatState, result.matches);
|
|
162
|
+
return buildGrepResult(formatState, outputLines, result.matches.length >= input.limit ? input.limit : undefined);
|
|
163
|
+
}
|
|
164
|
+
function buildRipgrepArgs(input) {
|
|
165
|
+
const args = ["--json", "--line-number", "--color=never", "--hidden"];
|
|
166
|
+
if (input.ignoreCase)
|
|
167
|
+
args.push("--ignore-case");
|
|
168
|
+
if (input.literal)
|
|
169
|
+
args.push("--fixed-strings");
|
|
170
|
+
if (input.glob)
|
|
171
|
+
args.push("--glob", input.glob);
|
|
172
|
+
args.push("--", input.pattern, input.searchPath);
|
|
173
|
+
return args;
|
|
174
|
+
}
|
|
175
|
+
function isUnknownRecord(value) {
|
|
176
|
+
return typeof value === "object" && value !== null;
|
|
177
|
+
}
|
|
178
|
+
function getRecordText(value) {
|
|
179
|
+
return isUnknownRecord(value) ? value.text : undefined;
|
|
180
|
+
}
|
|
181
|
+
function parseRipgrepLine(line) {
|
|
182
|
+
if (!line.trim())
|
|
183
|
+
return { matchedEvent: false };
|
|
184
|
+
let event;
|
|
185
|
+
try {
|
|
186
|
+
event = JSON.parse(line);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return { matchedEvent: false };
|
|
190
|
+
}
|
|
191
|
+
if (!isUnknownRecord(event) || event.type !== "match")
|
|
192
|
+
return { matchedEvent: false };
|
|
193
|
+
const data = isUnknownRecord(event.data) ? event.data : undefined;
|
|
194
|
+
const filePath = getRecordText(data?.path);
|
|
195
|
+
const lineNumber = data?.line_number;
|
|
196
|
+
const lineText = getRecordText(data?.lines);
|
|
197
|
+
return {
|
|
198
|
+
matchedEvent: true,
|
|
199
|
+
...(typeof filePath === "string" && typeof lineNumber === "number"
|
|
200
|
+
? { match: { filePath, lineNumber, ...(typeof lineText === "string" ? { lineText } : {}) } }
|
|
201
|
+
: {}),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function collectRipgrepLine(line, state, limit, stopChild) {
|
|
205
|
+
if (state.matchCount >= limit)
|
|
206
|
+
return;
|
|
207
|
+
const parsed = parseRipgrepLine(line);
|
|
208
|
+
if (!parsed.matchedEvent)
|
|
209
|
+
return;
|
|
210
|
+
state.matchCount++;
|
|
211
|
+
if (parsed.match)
|
|
212
|
+
state.matches.push(parsed.match);
|
|
213
|
+
if (state.matchCount >= limit) {
|
|
214
|
+
state.matchLimitReached = true;
|
|
215
|
+
stopChild(true);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async function finishRipgrepExecution(code, state, formatState, limit) {
|
|
219
|
+
if (state.aborted)
|
|
220
|
+
throw new Error("Operation aborted");
|
|
221
|
+
if (!state.killedDueToLimit && code !== 0 && code !== 1) {
|
|
222
|
+
throw new Error(state.stderr.trim() || `ripgrep exited with code ${code}`);
|
|
223
|
+
}
|
|
224
|
+
if (state.matchCount === 0)
|
|
225
|
+
return noGrepMatchesResult();
|
|
226
|
+
const outputLines = await formatGrepMatches(formatState, state.matches);
|
|
227
|
+
return buildGrepResult(formatState, outputLines, state.matchLimitReached ? limit : undefined);
|
|
228
|
+
}
|
|
229
|
+
function executeRipgrep(rgPath, input, formatState, signal) {
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
const child = spawn(rgPath, buildRipgrepArgs(input), { stdio: ["ignore", "pipe", "pipe"] });
|
|
232
|
+
const rl = createInterface({ input: child.stdout });
|
|
233
|
+
const state = {
|
|
234
|
+
stderr: "",
|
|
235
|
+
matchCount: 0,
|
|
236
|
+
matchLimitReached: false,
|
|
237
|
+
aborted: false,
|
|
238
|
+
killedDueToLimit: false,
|
|
239
|
+
matches: [],
|
|
240
|
+
};
|
|
241
|
+
const cleanup = () => {
|
|
242
|
+
rl.close();
|
|
243
|
+
signal?.removeEventListener("abort", onAbort);
|
|
244
|
+
};
|
|
245
|
+
const stopChild = (dueToLimit = false) => {
|
|
246
|
+
if (child.killed)
|
|
247
|
+
return;
|
|
248
|
+
state.killedDueToLimit = dueToLimit;
|
|
249
|
+
child.kill();
|
|
250
|
+
};
|
|
251
|
+
const onAbort = () => {
|
|
252
|
+
state.aborted = true;
|
|
253
|
+
stopChild();
|
|
254
|
+
};
|
|
255
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
256
|
+
child.stderr.on("data", (chunk) => {
|
|
257
|
+
state.stderr += chunk.toString();
|
|
258
|
+
});
|
|
259
|
+
rl.on("line", (line) => collectRipgrepLine(line, state, input.limit, stopChild));
|
|
260
|
+
child.on("error", (error) => {
|
|
261
|
+
cleanup();
|
|
262
|
+
reject(new Error(`Failed to run ripgrep: ${error.message}`));
|
|
263
|
+
});
|
|
264
|
+
child.on("close", (code) => {
|
|
265
|
+
cleanup();
|
|
266
|
+
void finishRipgrepExecution(code, state, formatState, input.limit).then(resolve, reject);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async function executeGrep(operations, cwd, input, signal) {
|
|
271
|
+
if (signal?.aborted)
|
|
272
|
+
throw new Error("Operation aborted");
|
|
273
|
+
const searchPath = resolveToCwd(input.path || ".", cwd);
|
|
274
|
+
let isDirectory;
|
|
275
|
+
try {
|
|
276
|
+
isDirectory = (await operations.stat(searchPath)).isDirectory();
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
throw new Error(`Path not found: ${searchPath}`);
|
|
280
|
+
}
|
|
281
|
+
const executionInput = {
|
|
282
|
+
pattern: input.pattern,
|
|
283
|
+
searchPath,
|
|
284
|
+
glob: input.glob,
|
|
285
|
+
ignoreCase: input.ignoreCase,
|
|
286
|
+
literal: input.literal,
|
|
287
|
+
context: input.context && input.context > 0 ? input.context : 0,
|
|
288
|
+
limit: Math.max(1, input.limit ?? DEFAULT_LIMIT),
|
|
289
|
+
};
|
|
290
|
+
const formatState = {
|
|
291
|
+
operations,
|
|
292
|
+
searchPath,
|
|
293
|
+
isDirectory,
|
|
294
|
+
context: executionInput.context,
|
|
295
|
+
fileCache: new Map(),
|
|
296
|
+
linesTruncated: false,
|
|
297
|
+
};
|
|
298
|
+
if (operations.grep)
|
|
299
|
+
return executeOperationsGrep(operations, executionInput, formatState);
|
|
300
|
+
const rgPath = await ensureTool("rg", true);
|
|
301
|
+
if (!rgPath)
|
|
302
|
+
throw new Error("ripgrep (rg) is not available and could not be downloaded");
|
|
303
|
+
return executeRipgrep(rgPath, executionInput, formatState, signal);
|
|
304
|
+
}
|
|
305
|
+
export function createGrepToolDefinition(operations, _options) {
|
|
306
|
+
const ops = operations;
|
|
307
|
+
const cwd = operations.cwd;
|
|
308
|
+
return {
|
|
309
|
+
name: "grep",
|
|
310
|
+
label: "grep",
|
|
311
|
+
description: `Search file contents for a pattern. Returns matching lines with file paths and line numbers. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} matches or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Long lines are truncated to ${GREP_MAX_LINE_LENGTH} chars.`,
|
|
312
|
+
promptSnippet: "Search file contents for patterns (respects .gitignore)",
|
|
313
|
+
parameters: grepSchema,
|
|
314
|
+
async execute(_toolCallId, input, signal) {
|
|
315
|
+
return executeGrep(ops, cwd, input, signal);
|
|
316
|
+
},
|
|
317
|
+
renderCall(args, theme, context) {
|
|
318
|
+
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
319
|
+
text.setText(formatBackendIcon(ops.getBackendInfo?.(), theme) + formatGrepCall(args, theme));
|
|
320
|
+
return text;
|
|
321
|
+
},
|
|
322
|
+
renderResult(result, options, theme, context) {
|
|
323
|
+
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
324
|
+
text.setText(formatGrepResult(result, options, theme, context.showImages));
|
|
325
|
+
return text;
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
export function createGrepTool(operations, options) {
|
|
330
|
+
return wrapToolDefinition(createGrepToolDefinition(operations, options));
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/core/tools/grep.ts"],"names":[],"mappings":"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","sourcesContent":["import { createInterface } from \"node:readline\";\nimport type { AgentTool, AgentToolResult } from \"@greppleai/grip-agent-core\";\nimport { Text } from \"@greppleai/grip-tui\";\nimport { spawn } from \"child_process\";\nimport path from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ensureTool } from \"../../utils/tools-manager.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport type { ToolGrepMatch, ToolOperations } from \"./operations.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { formatBackendIcon, getTextOutput, invalidArgText, shortenPath, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport {\n\tDEFAULT_MAX_BYTES,\n\tformatSize,\n\tGREP_MAX_LINE_LENGTH,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateLine,\n} from \"./truncate.ts\";\n\nconst grepSchema = Type.Object({\n\tpattern: Type.String({ description: \"Search pattern (regex or literal string)\" }),\n\tpath: Type.Optional(Type.String({ description: \"Directory or file to search (default: current directory)\" })),\n\tglob: Type.Optional(Type.String({ description: \"Filter files by glob pattern, e.g. '*.ts' or '**/*.spec.ts'\" })),\n\tignoreCase: Type.Optional(Type.Boolean({ description: \"Case-insensitive search (default: false)\" })),\n\tliteral: Type.Optional(\n\t\tType.Boolean({ description: \"Treat pattern as literal string instead of regex (default: false)\" }),\n\t),\n\tcontext: Type.Optional(\n\t\tType.Number({ description: \"Number of lines to show before and after each match (default: 0)\" }),\n\t),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of matches to return (default: 100)\" })),\n});\n\nexport type GrepToolInput = Static<typeof grepSchema>;\nconst DEFAULT_LIMIT = 100;\n\nexport interface GrepToolDetails {\n\ttruncation?: TruncationResult;\n\tmatchLimitReached?: number;\n\tlinesTruncated?: boolean;\n}\n\nexport interface GrepToolOptions {}\n\nfunction formatGrepCall(args: Partial<GrepToolInput> | undefined, theme: Theme): string {\n\tconst pattern = str(args?.pattern);\n\tconst rawPath = str(args?.path);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst glob = str(args?.glob);\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"grep\")) +\n\t\t\" \" +\n\t\t(pattern === null ? invalidArg : theme.fg(\"accent\", `/${pattern || \"\"}/`)) +\n\t\ttheme.fg(\"toolOutput\", ` in ${path === null ? invalidArg : path}`);\n\tif (glob) text += theme.fg(\"toolOutput\", ` (${glob})`);\n\tif (limit !== undefined) text += theme.fg(\"toolOutput\", ` limit ${limit}`);\n\treturn text;\n}\n\nfunction formatGrepResult(\n\tresult: AgentToolResult<GrepToolDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n): string {\n\tconst output = getTextOutput(result, showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = options.expanded ? lines.length : 15;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\tconst matchLimit = result.details?.matchLimitReached;\n\tconst truncation = result.details?.truncation;\n\tconst linesTruncated = result.details?.linesTruncated;\n\tif (matchLimit || truncation?.truncated || linesTruncated) {\n\t\tconst warnings: string[] = [];\n\t\tif (matchLimit) warnings.push(`${matchLimit} matches limit`);\n\t\tif (truncation?.truncated) warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);\n\t\tif (linesTruncated) warnings.push(\"some lines truncated\");\n\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\t}\n\treturn text;\n}\ninterface GrepFormatState {\n\toperations: ToolOperations;\n\tsearchPath: string;\n\tisDirectory: boolean;\n\tcontext: number;\n\tfileCache: Map<string, string[]>;\n\tlinesTruncated: boolean;\n}\n\ninterface GrepExecutionInput {\n\tpattern: string;\n\tsearchPath: string;\n\tglob?: string;\n\tignoreCase?: boolean;\n\tliteral?: boolean;\n\tcontext: number;\n\tlimit: number;\n}\n\ninterface RipgrepCollectionState {\n\tstderr: string;\n\tmatchCount: number;\n\tmatchLimitReached: boolean;\n\taborted: boolean;\n\tkilledDueToLimit: boolean;\n\tmatches: ToolGrepMatch[];\n}\n\nfunction noGrepMatchesResult(): AgentToolResult<GrepToolDetails | undefined> {\n\treturn { content: [{ type: \"text\", text: \"No matches found\" }], details: undefined };\n}\n\nfunction formatMatchedFilePath(state: GrepFormatState, filePath: string): string {\n\tif (state.isDirectory) {\n\t\tconst relative = path.relative(state.searchPath, filePath);\n\t\tif (relative && !relative.startsWith(\"..\")) return relative.replace(/\\\\/g, \"/\");\n\t}\n\treturn path.basename(filePath);\n}\n\nasync function getGrepFileLines(state: GrepFormatState, filePath: string): Promise<string[]> {\n\tconst cached = state.fileCache.get(filePath);\n\tif (cached) return cached;\n\tlet lines: string[];\n\ttry {\n\t\tconst content = (await state.operations.readFile(filePath)).toString(\"utf-8\");\n\t\tlines = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n\t} catch {\n\t\tlines = [];\n\t}\n\tstate.fileCache.set(filePath, lines);\n\treturn lines;\n}\n\nasync function formatGrepContextBlock(state: GrepFormatState, match: ToolGrepMatch): Promise<string[]> {\n\tconst relativePath = formatMatchedFilePath(state, match.filePath);\n\tconst lines = await getGrepFileLines(state, match.filePath);\n\tif (!lines.length) return [`${relativePath}:${match.lineNumber}: (unable to read file)`];\n\tconst block: string[] = [];\n\tconst start = state.context > 0 ? Math.max(1, match.lineNumber - state.context) : match.lineNumber;\n\tconst end = state.context > 0 ? Math.min(lines.length, match.lineNumber + state.context) : match.lineNumber;\n\tfor (let current = start; current <= end; current++) {\n\t\tconst sanitized = (lines[current - 1] ?? \"\").replace(/\\r/g, \"\");\n\t\tconst { text, wasTruncated } = truncateLine(sanitized);\n\t\tif (wasTruncated) state.linesTruncated = true;\n\t\tblock.push(\n\t\t\tcurrent === match.lineNumber ? `${relativePath}:${current}: ${text}` : `${relativePath}-${current}- ${text}`,\n\t\t);\n\t}\n\treturn block;\n}\n\nasync function formatGrepMatch(state: GrepFormatState, match: ToolGrepMatch): Promise<string[]> {\n\tif (state.context !== 0 || match.lineText === undefined) return formatGrepContextBlock(state, match);\n\tconst sanitized = match.lineText.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\").replace(/\\n$/, \"\");\n\tconst { text, wasTruncated } = truncateLine(sanitized);\n\tif (wasTruncated) state.linesTruncated = true;\n\treturn [`${formatMatchedFilePath(state, match.filePath)}:${match.lineNumber}: ${text}`];\n}\n\nasync function formatGrepMatches(state: GrepFormatState, matches: ToolGrepMatch[]): Promise<string[]> {\n\tconst outputLines: string[] = [];\n\tfor (const match of matches) outputLines.push(...(await formatGrepMatch(state, match)));\n\treturn outputLines;\n}\n\nfunction buildGrepResult(\n\tstate: GrepFormatState,\n\toutputLines: string[],\n\tmatchLimitReached: number | undefined,\n): AgentToolResult<GrepToolDetails | undefined> {\n\tconst truncation = truncateHead(outputLines.join(\"\\n\"), { maxLines: Number.MAX_SAFE_INTEGER });\n\tlet output = truncation.content;\n\tconst details: GrepToolDetails = {};\n\tconst notices: string[] = [];\n\tif (matchLimitReached !== undefined) {\n\t\tnotices.push(\n\t\t\t`${matchLimitReached} matches limit reached. Use limit=${matchLimitReached * 2} for more, or refine pattern`,\n\t\t);\n\t\tdetails.matchLimitReached = matchLimitReached;\n\t}\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\tdetails.truncation = truncation;\n\t}\n\tif (state.linesTruncated) {\n\t\tnotices.push(`Some lines truncated to ${GREP_MAX_LINE_LENGTH} chars. Use read tool to see full lines`);\n\t\tdetails.linesTruncated = true;\n\t}\n\tif (notices.length > 0) output += `\\n\\n[${notices.join(\". \")}]`;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: output }],\n\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t};\n}\n\nasync function executeOperationsGrep(\n\toperations: ToolOperations,\n\tinput: GrepExecutionInput,\n\tformatState: GrepFormatState,\n): Promise<AgentToolResult<GrepToolDetails | undefined>> {\n\tconst result = await operations.grep!({\n\t\tpattern: input.pattern,\n\t\tpath: input.searchPath,\n\t\tglob: input.glob,\n\t\tignoreCase: input.ignoreCase,\n\t\tliteral: input.literal,\n\t\tlimit: input.limit,\n\t});\n\tformatState.isDirectory = result.isDirectory;\n\tif (result.matches.length === 0) return noGrepMatchesResult();\n\tconst outputLines = await formatGrepMatches(formatState, result.matches);\n\treturn buildGrepResult(formatState, outputLines, result.matches.length >= input.limit ? input.limit : undefined);\n}\n\nfunction buildRipgrepArgs(input: GrepExecutionInput): string[] {\n\tconst args: string[] = [\"--json\", \"--line-number\", \"--color=never\", \"--hidden\"];\n\tif (input.ignoreCase) args.push(\"--ignore-case\");\n\tif (input.literal) args.push(\"--fixed-strings\");\n\tif (input.glob) args.push(\"--glob\", input.glob);\n\targs.push(\"--\", input.pattern, input.searchPath);\n\treturn args;\n}\n\ninterface ParsedRipgrepLine {\n\tmatchedEvent: boolean;\n\tmatch?: ToolGrepMatch;\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction getRecordText(value: unknown): unknown {\n\treturn isUnknownRecord(value) ? value.text : undefined;\n}\n\nfunction parseRipgrepLine(line: string): ParsedRipgrepLine {\n\tif (!line.trim()) return { matchedEvent: false };\n\tlet event: unknown;\n\ttry {\n\t\tevent = JSON.parse(line) as unknown;\n\t} catch {\n\t\treturn { matchedEvent: false };\n\t}\n\tif (!isUnknownRecord(event) || event.type !== \"match\") return { matchedEvent: false };\n\tconst data = isUnknownRecord(event.data) ? event.data : undefined;\n\tconst filePath = getRecordText(data?.path);\n\tconst lineNumber = data?.line_number;\n\tconst lineText = getRecordText(data?.lines);\n\treturn {\n\t\tmatchedEvent: true,\n\t\t...(typeof filePath === \"string\" && typeof lineNumber === \"number\"\n\t\t\t? { match: { filePath, lineNumber, ...(typeof lineText === \"string\" ? { lineText } : {}) } }\n\t\t\t: {}),\n\t};\n}\n\nfunction collectRipgrepLine(\n\tline: string,\n\tstate: RipgrepCollectionState,\n\tlimit: number,\n\tstopChild: (dueToLimit?: boolean) => void,\n): void {\n\tif (state.matchCount >= limit) return;\n\tconst parsed = parseRipgrepLine(line);\n\tif (!parsed.matchedEvent) return;\n\tstate.matchCount++;\n\tif (parsed.match) state.matches.push(parsed.match);\n\tif (state.matchCount >= limit) {\n\t\tstate.matchLimitReached = true;\n\t\tstopChild(true);\n\t}\n}\n\nasync function finishRipgrepExecution(\n\tcode: number | null,\n\tstate: RipgrepCollectionState,\n\tformatState: GrepFormatState,\n\tlimit: number,\n): Promise<AgentToolResult<GrepToolDetails | undefined>> {\n\tif (state.aborted) throw new Error(\"Operation aborted\");\n\tif (!state.killedDueToLimit && code !== 0 && code !== 1) {\n\t\tthrow new Error(state.stderr.trim() || `ripgrep exited with code ${code}`);\n\t}\n\tif (state.matchCount === 0) return noGrepMatchesResult();\n\tconst outputLines = await formatGrepMatches(formatState, state.matches);\n\treturn buildGrepResult(formatState, outputLines, state.matchLimitReached ? limit : undefined);\n}\n\nfunction executeRipgrep(\n\trgPath: string,\n\tinput: GrepExecutionInput,\n\tformatState: GrepFormatState,\n\tsignal?: AbortSignal,\n): Promise<AgentToolResult<GrepToolDetails | undefined>> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(rgPath, buildRipgrepArgs(input), { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\tconst rl = createInterface({ input: child.stdout });\n\t\tconst state: RipgrepCollectionState = {\n\t\t\tstderr: \"\",\n\t\t\tmatchCount: 0,\n\t\t\tmatchLimitReached: false,\n\t\t\taborted: false,\n\t\t\tkilledDueToLimit: false,\n\t\t\tmatches: [],\n\t\t};\n\t\tconst cleanup = (): void => {\n\t\t\trl.close();\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst stopChild = (dueToLimit = false): void => {\n\t\t\tif (child.killed) return;\n\t\t\tstate.killedDueToLimit = dueToLimit;\n\t\t\tchild.kill();\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tstate.aborted = true;\n\t\t\tstopChild();\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tchild.stderr.on(\"data\", (chunk) => {\n\t\t\tstate.stderr += chunk.toString();\n\t\t});\n\t\trl.on(\"line\", (line) => collectRipgrepLine(line, state, input.limit, stopChild));\n\t\tchild.on(\"error\", (error) => {\n\t\t\tcleanup();\n\t\t\treject(new Error(`Failed to run ripgrep: ${error.message}`));\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tcleanup();\n\t\t\tvoid finishRipgrepExecution(code, state, formatState, input.limit).then(resolve, reject);\n\t\t});\n\t});\n}\n\nasync function executeGrep(\n\toperations: ToolOperations,\n\tcwd: string,\n\tinput: GrepToolInput,\n\tsignal?: AbortSignal,\n): Promise<AgentToolResult<GrepToolDetails | undefined>> {\n\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\tconst searchPath = resolveToCwd(input.path || \".\", cwd);\n\tlet isDirectory: boolean;\n\ttry {\n\t\tisDirectory = (await operations.stat(searchPath)).isDirectory();\n\t} catch {\n\t\tthrow new Error(`Path not found: ${searchPath}`);\n\t}\n\tconst executionInput: GrepExecutionInput = {\n\t\tpattern: input.pattern,\n\t\tsearchPath,\n\t\tglob: input.glob,\n\t\tignoreCase: input.ignoreCase,\n\t\tliteral: input.literal,\n\t\tcontext: input.context && input.context > 0 ? input.context : 0,\n\t\tlimit: Math.max(1, input.limit ?? DEFAULT_LIMIT),\n\t};\n\tconst formatState: GrepFormatState = {\n\t\toperations,\n\t\tsearchPath,\n\t\tisDirectory,\n\t\tcontext: executionInput.context,\n\t\tfileCache: new Map(),\n\t\tlinesTruncated: false,\n\t};\n\tif (operations.grep) return executeOperationsGrep(operations, executionInput, formatState);\n\tconst rgPath = await ensureTool(\"rg\", true);\n\tif (!rgPath) throw new Error(\"ripgrep (rg) is not available and could not be downloaded\");\n\treturn executeRipgrep(rgPath, executionInput, formatState, signal);\n}\n\nexport type GrepToolDefinition = ToolDefinition<typeof grepSchema, GrepToolDetails | undefined>;\n\nexport function createGrepToolDefinition(operations: ToolOperations, _options?: GrepToolOptions): GrepToolDefinition {\n\tconst ops = operations;\n\tconst cwd = operations.cwd;\n\treturn {\n\t\tname: \"grep\",\n\t\tlabel: \"grep\",\n\t\tdescription: `Search file contents for a pattern. Returns matching lines with file paths and line numbers. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} matches or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Long lines are truncated to ${GREP_MAX_LINE_LENGTH} chars.`,\n\t\tpromptSnippet: \"Search file contents for patterns (respects .gitignore)\",\n\t\tparameters: grepSchema,\n\t\tasync execute(_toolCallId, input: GrepToolInput, signal?: AbortSignal) {\n\t\t\treturn executeGrep(ops, cwd, input, signal);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatBackendIcon(ops.getBackendInfo?.(), theme) + formatGrepCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatGrepResult(result, options, theme, context.showImages));\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createGrepTool(operations: ToolOperations, options?: GrepToolOptions): AgentTool<typeof grepSchema> {\n\treturn wrapToolDefinition(createGrepToolDefinition(operations, options));\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface FileSnapshot {
|
|
2
|
+
content: string;
|
|
3
|
+
hashes: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface HashStore {
|
|
6
|
+
version: 1;
|
|
7
|
+
snapshots: Record<string, FileSnapshot>;
|
|
8
|
+
}
|
|
9
|
+
export declare function loadHashStore(): Promise<HashStore>;
|
|
10
|
+
export declare function saveHashStore(store: HashStore): Promise<void>;
|
|
11
|
+
export declare function pruneHashStore(store: HashStore): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=hash-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-store.d.ts","sourceRoot":"","sources":["../../../src/core/tools/hash-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACxC;AAUD,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAiBxD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE","sourcesContent":["import { mkdir, readFile, stat, writeFile } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\n\nexport interface FileSnapshot {\n\tcontent: string;\n\thashes: string[];\n}\n\nexport interface HashStore {\n\tversion: 1;\n\tsnapshots: Record<string, FileSnapshot>;\n}\n\nfunction storePath(): string {\n\treturn join(homedir(), \".config\", \"grip-hashline-edit-pro\", \"hash-store.json\");\n}\n\nfunction storeDir(): string {\n\treturn dirname(storePath());\n}\n\nexport async function loadHashStore(): Promise<HashStore> {\n\ttry {\n\t\tconst content = await readFile(storePath(), \"utf-8\");\n\t\tconst parsed = JSON.parse(content) as Partial<HashStore>;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tsnapshots: parsed.snapshots ?? {},\n\t\t};\n\t} catch {\n\t\tawait mkdir(storeDir(), { recursive: true });\n\t\tconst defaultStore: HashStore = {\n\t\t\tversion: 1,\n\t\t\tsnapshots: {},\n\t\t};\n\t\tawait writeFile(storePath(), JSON.stringify(defaultStore), \"utf-8\");\n\t\treturn defaultStore;\n\t}\n}\n\nexport async function saveHashStore(store: HashStore): Promise<void> {\n\tawait mkdir(storeDir(), { recursive: true });\n\tawait writeFile(storePath(), JSON.stringify(store, null, 2), \"utf-8\");\n}\n\nexport async function pruneHashStore(store: HashStore): Promise<void> {\n\tlet changed = false;\n\tfor (const filePath of Object.keys(store.snapshots)) {\n\t\ttry {\n\t\t\tawait stat(filePath);\n\t\t} catch {\n\t\t\tdelete store.snapshots[filePath];\n\t\t\tchanged = true;\n\t\t}\n\t}\n\tif (changed) {\n\t\tawait saveHashStore(store);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { mkdir, readFile, stat, writeFile } from "fs/promises";
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { dirname, join } from "path";
|
|
4
|
+
function storePath() {
|
|
5
|
+
return join(homedir(), ".config", "grip-hashline-edit-pro", "hash-store.json");
|
|
6
|
+
}
|
|
7
|
+
function storeDir() {
|
|
8
|
+
return dirname(storePath());
|
|
9
|
+
}
|
|
10
|
+
export async function loadHashStore() {
|
|
11
|
+
try {
|
|
12
|
+
const content = await readFile(storePath(), "utf-8");
|
|
13
|
+
const parsed = JSON.parse(content);
|
|
14
|
+
return {
|
|
15
|
+
version: 1,
|
|
16
|
+
snapshots: parsed.snapshots ?? {},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
await mkdir(storeDir(), { recursive: true });
|
|
21
|
+
const defaultStore = {
|
|
22
|
+
version: 1,
|
|
23
|
+
snapshots: {},
|
|
24
|
+
};
|
|
25
|
+
await writeFile(storePath(), JSON.stringify(defaultStore), "utf-8");
|
|
26
|
+
return defaultStore;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function saveHashStore(store) {
|
|
30
|
+
await mkdir(storeDir(), { recursive: true });
|
|
31
|
+
await writeFile(storePath(), JSON.stringify(store, null, 2), "utf-8");
|
|
32
|
+
}
|
|
33
|
+
export async function pruneHashStore(store) {
|
|
34
|
+
let changed = false;
|
|
35
|
+
for (const filePath of Object.keys(store.snapshots)) {
|
|
36
|
+
try {
|
|
37
|
+
await stat(filePath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
delete store.snapshots[filePath];
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (changed) {
|
|
45
|
+
await saveHashStore(store);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=hash-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-store.js","sourceRoot":"","sources":["../../../src/core/tools/hash-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAYrC,SAAS,SAAS,GAAW;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;AAAA,CAC/E;AAED,SAAS,QAAQ,GAAW;IAC3B,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAAA,CAC5B;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,GAAuB;IACzD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACzD,OAAO;YACN,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;SACjC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAc;YAC/B,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE;SACb,CAAC;QACF,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,OAAO,YAAY,CAAC;IACrB,CAAC;AAAA,CACD;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAgB,EAAiB;IACpE,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAAA,CACtE;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAgB,EAAiB;IACrE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;IACF,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AAAA,CACD","sourcesContent":["import { mkdir, readFile, stat, writeFile } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\n\nexport interface FileSnapshot {\n\tcontent: string;\n\thashes: string[];\n}\n\nexport interface HashStore {\n\tversion: 1;\n\tsnapshots: Record<string, FileSnapshot>;\n}\n\nfunction storePath(): string {\n\treturn join(homedir(), \".config\", \"grip-hashline-edit-pro\", \"hash-store.json\");\n}\n\nfunction storeDir(): string {\n\treturn dirname(storePath());\n}\n\nexport async function loadHashStore(): Promise<HashStore> {\n\ttry {\n\t\tconst content = await readFile(storePath(), \"utf-8\");\n\t\tconst parsed = JSON.parse(content) as Partial<HashStore>;\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tsnapshots: parsed.snapshots ?? {},\n\t\t};\n\t} catch {\n\t\tawait mkdir(storeDir(), { recursive: true });\n\t\tconst defaultStore: HashStore = {\n\t\t\tversion: 1,\n\t\t\tsnapshots: {},\n\t\t};\n\t\tawait writeFile(storePath(), JSON.stringify(defaultStore), \"utf-8\");\n\t\treturn defaultStore;\n\t}\n}\n\nexport async function saveHashStore(store: HashStore): Promise<void> {\n\tawait mkdir(storeDir(), { recursive: true });\n\tawait writeFile(storePath(), JSON.stringify(store, null, 2), \"utf-8\");\n}\n\nexport async function pruneHashStore(store: HashStore): Promise<void> {\n\tlet changed = false;\n\tfor (const filePath of Object.keys(store.snapshots)) {\n\t\ttry {\n\t\t\tawait stat(filePath);\n\t\t} catch {\n\t\t\tdelete store.snapshots[filePath];\n\t\t\tchanged = true;\n\t\t}\n\t}\n\tif (changed) {\n\t\tawait saveHashStore(store);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type BDupWarn, type BoundaryDuplicateKind, type HEdit, type NEdit } from "./resolve.ts";
|
|
2
|
+
type LIdx = {
|
|
3
|
+
fileLines: string[];
|
|
4
|
+
lineStarts: number[];
|
|
5
|
+
hasTerminalNewline: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function buildIdx(content: string): LIdx;
|
|
8
|
+
interface BoundaryWarningFormatOptions {
|
|
9
|
+
kind: BoundaryDuplicateKind;
|
|
10
|
+
survivingContent: string;
|
|
11
|
+
matchIndex: number;
|
|
12
|
+
resultLines: string[];
|
|
13
|
+
resultHashes: string[];
|
|
14
|
+
}
|
|
15
|
+
interface ChangedLineRange {
|
|
16
|
+
firstChangedLine: number;
|
|
17
|
+
lastChangedLine: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ApplyEditsResult {
|
|
20
|
+
content: string;
|
|
21
|
+
firstChangedLine: ChangedLineRange["firstChangedLine"] | undefined;
|
|
22
|
+
lastChangedLine: ChangedLineRange["lastChangedLine"] | undefined;
|
|
23
|
+
warnings?: string[];
|
|
24
|
+
noopEdits?: NEdit[];
|
|
25
|
+
boundaryWarnings?: BDupWarn[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the boundary-duplication warning shown after an edit. A minimal header
|
|
29
|
+
* is followed by a hashline-anchored window: 2 lines of context before the
|
|
30
|
+
* duplicated pair, the pair itself, and 2 lines after. The window carries the
|
|
31
|
+
* post-edit hashes the model needs to remove the duplicate in a follow-up
|
|
32
|
+
* `replace` (no `read` round-trip required, since the hashes are current and
|
|
33
|
+
* staleness is per-line). Rows are plain `HASH│content` — no annotations.
|
|
34
|
+
*/
|
|
35
|
+
export declare function fmtBoundaryWarning(params: BoundaryWarningFormatOptions): string;
|
|
36
|
+
export declare function applyEdits(content: string, edits: HEdit[], signal?: AbortSignal, precomputedHashes?: string[], filePath?: string): ApplyEditsResult;
|
|
37
|
+
export declare function fmtRegion(hashes: string[], lines: string[]): string;
|
|
38
|
+
export declare function changedRange(original: string, result: string): ChangedLineRange | null;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAG1B,KAAK,KAAK,EACV,KAAK,KAAK,EAIV,MAAM,cAAc,CAAC;AAEtB,KAAK,IAAI,GAAG;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAkB9C;AAgBD,UAAU,4BAA4B;IACrC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,gBAAgB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;IACnE,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC9B;AAwID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,GAAG,MAAM,CA+B/E;AAED,wBAAgB,UAAU,CACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAC5B,QAAQ,CAAC,EAAE,MAAM,GACf,gBAAgB,CA8ClB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAKnE;AA0BD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAyCtF","sourcesContent":["import { cntLines } from \"../hashline-utils.ts\";\nimport { abortIf } from \"../runtime.ts\";\nimport { _lineHashesPure, HASH_SEP } from \"./hash.ts\";\nimport {\n\tassertNoBarePrefix,\n\ttype BDupWarn,\n\ttype BoundaryDuplicateKind,\n\tdescEdit,\n\tfmtMismatch,\n\ttype HEdit,\n\ttype NEdit,\n\ttype RHEdit,\n\tvalEdits,\n\twarnUnicodeEsc,\n} from \"./resolve.ts\";\n\ntype LIdx = {\n\tfileLines: string[];\n\tlineStarts: number[];\n\thasTerminalNewline: boolean;\n};\n\nexport function buildIdx(content: string): LIdx {\n\tconst fileLines = content.split(\"\\n\");\n\tconst lineStarts: number[] = [];\n\tlet offset = 0;\n\n\tfor (let index = 0; index < fileLines.length; index++) {\n\t\tlineStarts.push(offset);\n\t\toffset += fileLines[index]!.length;\n\t\tif (index < fileLines.length - 1) {\n\t\t\toffset += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\tfileLines,\n\t\tlineStarts,\n\t\thasTerminalNewline: content.endsWith(\"\\n\"),\n\t};\n}\n\ntype RESpan = {\n\tkind: \"replace\";\n\tindex: number;\n\tlabel: string;\n\tstart: number;\n\tend: number;\n\treplacement: string;\n};\n\ninterface EditConflictSide {\n\tindex: number;\n\tlabel: string;\n}\n\ninterface BoundaryWarningFormatOptions {\n\tkind: BoundaryDuplicateKind;\n\tsurvivingContent: string;\n\tmatchIndex: number;\n\tresultLines: string[];\n\tresultHashes: string[];\n}\n\ninterface ChangedLineRange {\n\tfirstChangedLine: number;\n\tlastChangedLine: number;\n}\n\nexport interface ApplyEditsResult {\n\tcontent: string;\n\tfirstChangedLine: ChangedLineRange[\"firstChangedLine\"] | undefined;\n\tlastChangedLine: ChangedLineRange[\"lastChangedLine\"] | undefined;\n\twarnings?: string[];\n\tnoopEdits?: NEdit[];\n\tboundaryWarnings?: BDupWarn[];\n}\n\nfunction assertNotEmpty(originalContent: string, result: string): void {\n\tif (originalContent.length > 0 && result.length === 0) {\n\t\tthrow new Error(\"[E_WOULD_EMPTY] Cannot empty a non-empty file via edit.\");\n\t}\n}\n\nfunction throwConflict(left: EditConflictSide, right: EditConflictSide, reason: string): never {\n\tthrow new Error(\n\t\t`[E_EDIT_CONFLICT] Edit ${left.index} (${left.label}) and edit ${right.index} (${right.label}) ${reason}.`,\n\t);\n}\n\nfunction resToSpan(edit: RHEdit, index: number, content: string, lineIndex: LIdx, noopEdits: NEdit[]): RESpan | null {\n\tconst { fileLines, lineStarts } = lineIndex;\n\n\tconst startLine = edit.hash_range_inclusive[0].line;\n\tconst endLine = edit.hash_range_inclusive[1].line;\n\tconst originalLines = fileLines.slice(startLine - 1, endLine);\n\tif (\n\t\toriginalLines.length === edit.content_lines.length &&\n\t\toriginalLines.every((line, lineIndex) => line === edit.content_lines[lineIndex])\n\t) {\n\t\tnoopEdits.push({\n\t\t\teditIndex: index,\n\t\t\tloc: edit.hash_range_inclusive[0].hash,\n\t\t\tcurrentContent: originalLines.join(\"\\n\"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst label = descEdit(edit);\n\n\tif (edit.content_lines.length > 0) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: lineStarts[startLine - 1]!,\n\t\t\tend: lineStarts[endLine - 1]! + fileLines[endLine - 1]!.length,\n\t\t\treplacement: edit.content_lines.join(\"\\n\"),\n\t\t};\n\t}\n\n\tif (startLine === 1 && endLine === fileLines.length) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: 0,\n\t\t\tend: content.length,\n\t\t\treplacement: \"\",\n\t\t};\n\t}\n\n\tif (endLine < fileLines.length) {\n\t\treturn {\n\t\t\tkind: \"replace\",\n\t\t\tindex,\n\t\t\tlabel,\n\t\t\tstart: lineStarts[startLine - 1]!,\n\t\t\tend: lineStarts[endLine]!,\n\t\t\treplacement: \"\",\n\t\t};\n\t}\n\n\treturn {\n\t\tkind: \"replace\",\n\t\tindex,\n\t\tlabel,\n\t\tstart: Math.max(0, lineStarts[startLine - 1]! - 1),\n\t\tend: lineStarts[endLine - 1]! + fileLines[endLine - 1]!.length,\n\t\treplacement: \"\",\n\t};\n}\n\nfunction assertNoConflict(spans: RESpan[]): void {\n\tif (spans.length < 2) return;\n\tconst ordered = [...spans].sort(\n\t\t(left, right) => left.start - right.start || right.end - left.end || left.index - right.index,\n\t);\n\tlet furthestEndSpan = ordered[0]!;\n\tfor (let index = 1; index < ordered.length; index++) {\n\t\tconst current = ordered[index]!;\n\t\tif (furthestEndSpan.start < current.end && current.start < furthestEndSpan.end) {\n\t\t\tconst [left, right] =\n\t\t\t\tfurthestEndSpan.index < current.index ? [furthestEndSpan, current] : [current, furthestEndSpan];\n\t\t\tthrowConflict(left, right, \"overlap on the same original line range\");\n\t\t}\n\t\tif (current.end > furthestEndSpan.end) furthestEndSpan = current;\n\t}\n}\n\nfunction resSpans(\n\tedits: RHEdit[],\n\tcontent: string,\n\tlineIndex: LIdx,\n\tnoopEdits: NEdit[],\n\tsignal: AbortSignal | undefined,\n): RESpan[] {\n\tconst seenSpanKeys = new Set<string>();\n\tconst resolvedSpans: RESpan[] = [];\n\tfor (const [index, edit] of edits.entries()) {\n\t\tabortIf(signal);\n\t\tconst span = resToSpan(edit, index, content, lineIndex, noopEdits);\n\t\tif (!span) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst spanKey = `replace:${span.start}:${span.end}:${span.replacement}`;\n\t\tif (seenSpanKeys.has(spanKey)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseenSpanKeys.add(spanKey);\n\t\tresolvedSpans.push(span);\n\t}\n\n\tassertNoConflict(resolvedSpans);\n\treturn [...resolvedSpans].sort((left, right) => {\n\t\tif (right.end !== left.end) {\n\t\t\treturn right.end - left.end;\n\t\t}\n\t\treturn left.index - right.index;\n\t});\n}\n\nfunction assemble(content: string, spans: RESpan[], signal: AbortSignal | undefined): string {\n\tlet result = content;\n\tfor (const span of spans) {\n\t\tabortIf(signal);\n\t\tresult = result.slice(0, span.start) + span.replacement + result.slice(span.end);\n\t}\n\treturn result;\n}\n\n/**\n * Builds the boundary-duplication warning shown after an edit. A minimal header\n * is followed by a hashline-anchored window: 2 lines of context before the\n * duplicated pair, the pair itself, and 2 lines after. The window carries the\n * post-edit hashes the model needs to remove the duplicate in a follow-up\n * `replace` (no `read` round-trip required, since the hashes are current and\n * staleness is per-line). Rows are plain `HASH│content` — no annotations.\n */\nexport function fmtBoundaryWarning(params: BoundaryWarningFormatOptions): string {\n\tconst header =\n\t\tparams.kind === \"trailing\"\n\t\t\t? \"Boundary duplication (trailing): the last replacement line duplicated the next line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there.\"\n\t\t\t: \"Boundary duplication (leading): the first replacement line duplicated the previous line. This happens when `content_lines` includes a line that was already outside the replaced range. Delete the duplicate — the original line outside the range is still there.\";\n\n\t// Locate the adjacent duplicated pair (two identical neighboring lines). The\n\t// occurrence-based matchIndex usually lands inside the pair; when a file has\n\t// several identical lines we pick the pair nearest matchIndex so the window\n\t// frames the duplication this edit introduced, not an unrelated one.\n\tlet pairStart = -1;\n\tlet bestDist = Infinity;\n\tfor (let i = 0; i < params.resultLines.length - 1; i++) {\n\t\tif (params.resultLines[i] === params.survivingContent && params.resultLines[i + 1] === params.survivingContent) {\n\t\t\tconst dist = Math.abs(i - params.matchIndex);\n\t\t\tif (dist < bestDist) {\n\t\t\t\tbestDist = dist;\n\t\t\t\tpairStart = i;\n\t\t\t}\n\t\t}\n\t}\n\tif (pairStart < 0) pairStart = params.matchIndex;\n\n\tconst winStart = Math.max(0, pairStart - 2);\n\tconst winEnd = Math.min(params.resultLines.length - 1, pairStart + 3);\n\n\tconst rows: string[] = [];\n\tfor (let i = winStart; i <= winEnd; i++) {\n\t\trows.push(`${params.resultHashes[i]}${HASH_SEP}${params.resultLines[i]}`);\n\t}\n\treturn `${header}\\n\\n${rows.join(\"\\n\")}`;\n}\n\nexport function applyEdits(\n\tcontent: string,\n\tedits: HEdit[],\n\tsignal?: AbortSignal,\n\tprecomputedHashes?: string[],\n\tfilePath?: string,\n): ApplyEditsResult {\n\tabortIf(signal);\n\tif (!edits.length)\n\t\treturn {\n\t\t\tcontent,\n\t\t\tfirstChangedLine: undefined,\n\t\t\tlastChangedLine: undefined,\n\t\t};\n\n\tedits = edits.map((edit) =>\n\t\tedit.content_lines.length === 1 && edit.content_lines[0] === \"\" ? { ...edit, content_lines: [] } : edit,\n\t);\n\n\tconst lineIndex = buildIdx(content);\n\tconst fileHashes = precomputedHashes ?? _lineHashesPure(content);\n\tconst noopEdits: NEdit[] = [];\n\tconst warnings: string[] = [];\n\n\tconst { resolved, mismatches, boundaryWarnings } = valEdits(\n\t\tedits,\n\t\tlineIndex.fileLines,\n\t\tfileHashes,\n\t\twarnings,\n\t\tsignal,\n\t);\n\tif (mismatches.length) {\n\t\tthrow new Error(fmtMismatch(mismatches, lineIndex.fileLines, fileHashes, filePath));\n\t}\n\n\tassertNoBarePrefix(edits, lineIndex.fileLines, fileHashes);\n\twarnUnicodeEsc(edits, warnings);\n\n\tconst orderedSpans = resSpans(resolved, content, lineIndex, noopEdits, signal);\n\n\tconst result = assemble(content, orderedSpans, signal);\n\tassertNotEmpty(content, result);\n\tconst range = changedRange(content, result);\n\n\treturn {\n\t\tcontent: result,\n\t\tfirstChangedLine: range?.firstChangedLine,\n\t\tlastChangedLine: range?.lastChangedLine,\n\t\t...(warnings.length ? { warnings } : {}),\n\t\t...(noopEdits.length ? { noopEdits } : {}),\n\t\t...(boundaryWarnings.length ? { boundaryWarnings } : {}),\n\t};\n}\n\nexport function fmtRegion(hashes: string[], lines: string[]): string {\n\tif (hashes.length !== lines.length) {\n\t\tthrow new Error(`fmtRegion: hashes.length (${hashes.length}) must match lines.length (${lines.length}).`);\n\t}\n\treturn lines.map((line, index) => `${hashes[index]}${HASH_SEP}${line}`).join(\"\\n\");\n}\nfunction characterIndexToLineNumber(characterIndex: number, text: string): number {\n\tlet line = 1;\n\tfor (let index = 0; index < characterIndex && index < text.length; index++) {\n\t\tif (text[index] === \"\\n\") line++;\n\t}\n\treturn line;\n}\ninterface ChangedRangeScan {\n\toriginal: string;\n\tresult: string;\n\tfirstDifferenceIndex: number;\n\tlastResultDifferenceIndex: number;\n\tfirstChangedLine: number;\n}\n\nfunction resolveLastChangedLine(scan: ChangedRangeScan): number {\n\tif (scan.lastResultDifferenceIndex < scan.firstDifferenceIndex) {\n\t\treturn scan.result.length === 0 ? 1 : cntLines(scan.result);\n\t}\n\tif (scan.firstDifferenceIndex === 0 && scan.original.length > 0 && scan.result.endsWith(scan.original)) {\n\t\treturn scan.firstChangedLine;\n\t}\n\treturn characterIndexToLineNumber(scan.lastResultDifferenceIndex + 1, scan.result);\n}\n\nexport function changedRange(original: string, result: string): ChangedLineRange | null {\n\tif (original === result) return null;\n\n\tif (original.length === 0) {\n\t\treturn {\n\t\t\tfirstChangedLine: 1,\n\t\t\tlastChangedLine: cntLines(result),\n\t\t};\n\t}\n\n\tif (result.startsWith(original) && original.endsWith(\"\\n\")) {\n\t\treturn {\n\t\t\tfirstChangedLine: cntLines(original) + 1,\n\t\t\tlastChangedLine: cntLines(result),\n\t\t};\n\t}\n\n\tlet firstDiff = 0;\n\tconst minLen = Math.min(original.length, result.length);\n\twhile (firstDiff < minLen && original[firstDiff] === result[firstDiff]) {\n\t\tfirstDiff++;\n\t}\n\tif (firstDiff === minLen && original.length === result.length) return null;\n\n\tlet lastOrig = original.length - 1;\n\tlet lastRes = result.length - 1;\n\twhile (lastOrig >= firstDiff && lastRes >= firstDiff && original[lastOrig] === result[lastRes]) {\n\t\tlastOrig--;\n\t\tlastRes--;\n\t}\n\n\tconst firstChangedLine = characterIndexToLineNumber(firstDiff + 1, result);\n\tconst lastChangedLine = resolveLastChangedLine({\n\t\toriginal,\n\t\tresult,\n\t\tfirstDifferenceIndex: firstDiff,\n\t\tlastResultDifferenceIndex: lastRes,\n\t\tfirstChangedLine,\n\t});\n\n\treturn { firstChangedLine, lastChangedLine };\n}\n"]}
|