@wahack/pi-coding-agent 15.11.0
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 +10031 -0
- package/README.md +36 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +79 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +172 -0
- package/package.json +554 -0
- package/scripts/build-binary.ts +100 -0
- package/scripts/bundle-dist.ts +90 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +33 -0
- package/scripts/omp +42 -0
- package/scripts/omp.ts +19 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +625 -0
- package/src/auto-thinking/classifier.ts +185 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +319 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +536 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +699 -0
- package/src/autoresearch/tools/init-experiment.ts +272 -0
- package/src/autoresearch/tools/log-experiment.ts +524 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/bun-imports.d.ts +28 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +436 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +74 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +261 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +63 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +168 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +340 -0
- package/src/cli/auth-broker-cli.ts +895 -0
- package/src/cli/auth-gateway-cli.ts +611 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +418 -0
- package/src/cli/dry-balance-cli.ts +856 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +133 -0
- package/src/cli/gallery-cli.ts +230 -0
- package/src/cli/gallery-fixtures/agentic.ts +407 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +194 -0
- package/src/cli/gallery-fixtures/fs.ts +220 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +49 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +250 -0
- package/src/cli/gallery-fixtures/search.ts +213 -0
- package/src/cli/gallery-fixtures/shell.ts +167 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/grep-cli.ts +160 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/list-models.ts +194 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/read-cli.ts +57 -0
- package/src/cli/session-picker.ts +79 -0
- package/src/cli/setup-cli.ts +231 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +68 -0
- package/src/cli/stats-cli.ts +238 -0
- package/src/cli/tiny-models-cli.ts +127 -0
- package/src/cli/update-cli.ts +611 -0
- package/src/cli/usage-cli.ts +603 -0
- package/src/cli/web-search-cli.ts +132 -0
- package/src/cli/worktree-cli.ts +291 -0
- package/src/cli-commands.ts +79 -0
- package/src/cli.ts +200 -0
- package/src/commands/acp.ts +24 -0
- package/src/commands/agents.ts +57 -0
- package/src/commands/auth-broker.ts +99 -0
- package/src/commands/auth-gateway.ts +69 -0
- package/src/commands/commit.ts +46 -0
- package/src/commands/complete.ts +66 -0
- package/src/commands/completions.ts +60 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +52 -0
- package/src/commands/grep.ts +48 -0
- package/src/commands/grievances.ts +51 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/launch.ts +169 -0
- package/src/commands/plugin.ts +78 -0
- package/src/commands/read.ts +38 -0
- package/src/commands/setup.ts +67 -0
- package/src/commands/shell.ts +29 -0
- package/src/commands/ssh.ts +60 -0
- package/src/commands/stats.ts +29 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/update.ts +21 -0
- package/src/commands/usage.ts +35 -0
- package/src/commands/web-search.ts +42 -0
- package/src/commands/worktree.ts +56 -0
- package/src/commit/agentic/agent.ts +317 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +355 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +146 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +81 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +144 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +23 -0
- package/src/commit/agentic/tools/split-commit.ts +245 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +105 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +97 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +92 -0
- package/src/commit/pipeline.ts +243 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +77 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +60 -0
- package/src/config/append-only-context-mode.ts +31 -0
- package/src/config/config-file.ts +317 -0
- package/src/config/file-lock.ts +164 -0
- package/src/config/keybindings.ts +628 -0
- package/src/config/mcp-schema.json +230 -0
- package/src/config/model-discovery.ts +554 -0
- package/src/config/model-registry.ts +2090 -0
- package/src/config/model-resolver.ts +1502 -0
- package/src/config/model-roles.ts +74 -0
- package/src/config/models-config-schema.ts +226 -0
- package/src/config/models-config.ts +129 -0
- package/src/config/prompt-templates.ts +185 -0
- package/src/config/resolve-config-value.ts +94 -0
- package/src/config/settings-schema.ts +3530 -0
- package/src/config/settings.ts +1178 -0
- package/src/config.ts +242 -0
- package/src/cursor.ts +340 -0
- package/src/dap/client.ts +760 -0
- package/src/dap/config.ts +189 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1441 -0
- package/src/dap/types.ts +610 -0
- package/src/debug/index.ts +515 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +908 -0
- package/src/debug/profiler.ts +162 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +273 -0
- package/src/debug/raw-sse.ts +292 -0
- package/src/debug/report-bundle.ts +374 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +230 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/index.ts +54 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
- package/src/discovery/builtin-rules/rs-result-type.md +19 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
- package/src/discovery/builtin-rules/ts-import-type.md +42 -0
- package/src/discovery/builtin-rules/ts-no-any.md +56 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +65 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +906 -0
- package/src/discovery/claude-plugins.ts +386 -0
- package/src/discovery/claude.ts +584 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +522 -0
- package/src/discovery/cursor.ts +220 -0
- package/src/discovery/gemini.ts +383 -0
- package/src/discovery/github.ts +154 -0
- package/src/discovery/helpers.ts +1016 -0
- package/src/discovery/index.ts +81 -0
- package/src/discovery/mcp-json.ts +171 -0
- package/src/discovery/omp-extension-roots.ts +190 -0
- package/src/discovery/omp-plugins.ts +383 -0
- package/src/discovery/opencode.ts +398 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +29 -0
- package/src/discovery/vscode.ts +105 -0
- package/src/discovery/windsurf.ts +147 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +999 -0
- package/src/edit/file-snapshot-store.ts +91 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +290 -0
- package/src/edit/hashline/execute.ts +242 -0
- package/src/edit/hashline/filesystem.ts +130 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +18 -0
- package/src/edit/index.ts +571 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1891 -0
- package/src/edit/modes/replace.ts +1137 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +769 -0
- package/src/edit/streaming.ts +517 -0
- package/src/eval/__tests__/agent-bridge.test.ts +708 -0
- package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
- package/src/eval/__tests__/budget-bridge.test.ts +69 -0
- package/src/eval/__tests__/completion-bridge.test.ts +412 -0
- package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
- package/src/eval/__tests__/idle-timeout.test.ts +80 -0
- package/src/eval/__tests__/js-context-manager.test.ts +241 -0
- package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
- package/src/eval/agent-bridge.ts +319 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +44 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +207 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +4 -0
- package/src/eval/js/context-manager.ts +502 -0
- package/src/eval/js/executor.ts +173 -0
- package/src/eval/js/index.ts +51 -0
- package/src/eval/js/shared/helpers.ts +283 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +342 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +246 -0
- package/src/eval/js/shared/rewrite-imports.ts +532 -0
- package/src/eval/js/shared/runtime.ts +352 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +162 -0
- package/src/eval/js/worker-core.ts +132 -0
- package/src/eval/js/worker-entry.ts +30 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/py/__tests__/prelude.test.ts +19 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +742 -0
- package/src/eval/py/index.ts +68 -0
- package/src/eval/py/kernel.ts +748 -0
- package/src/eval/py/prelude.py +658 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1133 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +126 -0
- package/src/eval/py/tool-bridge.ts +182 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +419 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +48 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +164 -0
- package/src/export/html/template.css +1051 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +46 -0
- package/src/export/html/template.js +2271 -0
- package/src/export/html/template.macro.ts +25 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/ttsr.ts +583 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +489 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +238 -0
- package/src/extensibility/custom-commands/types.ts +113 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +269 -0
- package/src/extensibility/custom-tools/types.ts +270 -0
- package/src/extensibility/custom-tools/wrapper.ts +47 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/loader.ts +572 -0
- package/src/extensibility/extensions/runner.ts +922 -0
- package/src/extensibility/extensions/types.ts +1322 -0
- package/src/extensibility/extensions/wrapper.ts +223 -0
- package/src/extensibility/hooks/index.ts +5 -0
- package/src/extensibility/hooks/loader.ts +257 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +107 -0
- package/src/extensibility/hooks/types.ts +606 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +24 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +15 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +192 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +682 -0
- package/src/extensibility/plugins/loader.ts +313 -0
- package/src/extensibility/plugins/manager.ts +827 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +317 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +770 -0
- package/src/extensibility/plugins/marketplace/registry.ts +196 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +191 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/shared-events.ts +343 -0
- package/src/extensibility/skills.ts +312 -0
- package/src/extensibility/slash-commands.ts +227 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/extensibility/typebox.ts +418 -0
- package/src/extensibility/utils.ts +44 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +528 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +598 -0
- package/src/hindsight/config.ts +175 -0
- package/src/hindsight/content.ts +210 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +488 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +59 -0
- package/src/internal-urls/agent-protocol.ts +146 -0
- package/src/internal-urls/artifact-protocol.ts +107 -0
- package/src/internal-urls/docs-index.generated.ts +106 -0
- package/src/internal-urls/history-protocol.ts +113 -0
- package/src/internal-urls/index.ts +25 -0
- package/src/internal-urls/issue-pr-protocol.ts +584 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +287 -0
- package/src/internal-urls/mcp-protocol.ts +151 -0
- package/src/internal-urls/memory-protocol.ts +169 -0
- package/src/internal-urls/omp-protocol.ts +93 -0
- package/src/internal-urls/parse.ts +72 -0
- package/src/internal-urls/registry-helpers.ts +25 -0
- package/src/internal-urls/router.ts +105 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/skill-protocol.ts +96 -0
- package/src/internal-urls/types.ts +152 -0
- package/src/internal-urls/vault-protocol.ts +936 -0
- package/src/irc/bus.ts +292 -0
- package/src/lib/xai-http.ts +124 -0
- package/src/lsp/client.ts +1193 -0
- package/src/lsp/clients/biome-client.ts +264 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +93 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +502 -0
- package/src/lsp/defaults.json +493 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +267 -0
- package/src/lsp/index.ts +2477 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/render.ts +694 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +455 -0
- package/src/lsp/utils.ts +718 -0
- package/src/main.ts +1325 -0
- package/src/mcp/client.ts +484 -0
- package/src/mcp/config-writer.ts +225 -0
- package/src/mcp/config.ts +365 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +1275 -0
- package/src/mcp/oauth-discovery.ts +442 -0
- package/src/mcp/oauth-flow.ts +442 -0
- package/src/mcp/render.ts +132 -0
- package/src/mcp/smithery-auth.ts +104 -0
- package/src/mcp/smithery-connect.ts +145 -0
- package/src/mcp/smithery-registry.ts +477 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +426 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/http.ts +519 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +528 -0
- package/src/mcp/types.ts +423 -0
- package/src/memories/index.ts +1150 -0
- package/src/memories/storage.ts +577 -0
- package/src/memory-backend/index.ts +18 -0
- package/src/memory-backend/local-backend.ts +39 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +547 -0
- package/src/mnemopi/config.ts +160 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +584 -0
- package/src/modes/acp/acp-agent.ts +2407 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +929 -0
- package/src/modes/acp/acp-mode.ts +23 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/agent-dashboard.ts +1206 -0
- package/src/modes/components/agent-hub.ts +1071 -0
- package/src/modes/components/assistant-message.ts +307 -0
- package/src/modes/components/bash-execution.ts +220 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/btw-panel.ts +104 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/compaction-summary-message.ts +87 -0
- package/src/modes/components/copy-selector.ts +206 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +398 -0
- package/src/modes/components/custom-message.ts +63 -0
- package/src/modes/components/diff.ts +277 -0
- package/src/modes/components/dynamic-border.ts +34 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +158 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +399 -0
- package/src/modes/components/extensions/extension-list.ts +502 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +317 -0
- package/src/modes/components/extensions/state-manager.ts +627 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +280 -0
- package/src/modes/components/hook-editor.ts +167 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +66 -0
- package/src/modes/components/hook-selector.ts +660 -0
- package/src/modes/components/index.ts +38 -0
- package/src/modes/components/keybinding-hints.ts +65 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +164 -0
- package/src/modes/components/mcp-add-wizard.ts +1340 -0
- package/src/modes/components/message-frame.ts +88 -0
- package/src/modes/components/model-selector.ts +1271 -0
- package/src/modes/components/oauth-selector.ts +368 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +108 -0
- package/src/modes/components/plan-review-overlay.ts +820 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +95 -0
- package/src/modes/components/plugin-settings.ts +722 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +670 -0
- package/src/modes/components/segment-track.ts +52 -0
- package/src/modes/components/session-selector.ts +625 -0
- package/src/modes/components/settings-defs.ts +189 -0
- package/src/modes/components/settings-selector.ts +651 -0
- package/src/modes/components/show-images-selector.ts +45 -0
- package/src/modes/components/skill-message.ts +89 -0
- package/src/modes/components/status-line/component.ts +869 -0
- package/src/modes/components/status-line/context-thresholds.ts +79 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +584 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/token-rate.ts +66 -0
- package/src/modes/components/status-line/types.ts +108 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +52 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +19 -0
- package/src/modes/components/todo-reminder.ts +38 -0
- package/src/modes/components/tool-execution.ts +1024 -0
- package/src/modes/components/transcript-container.ts +608 -0
- package/src/modes/components/tree-selector.ts +978 -0
- package/src/modes/components/ttsr-notification.ts +122 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +66 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +493 -0
- package/src/modes/controllers/btw-controller.ts +105 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +1566 -0
- package/src/modes/controllers/event-controller.ts +1054 -0
- package/src/modes/controllers/extension-ui-controller.ts +886 -0
- package/src/modes/controllers/input-controller.ts +1073 -0
- package/src/modes/controllers/mcp-command-controller.ts +2017 -0
- package/src/modes/controllers/omfg-controller.ts +283 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +1108 -0
- package/src/modes/controllers/ssh-command-controller.ts +384 -0
- package/src/modes/controllers/streaming-reveal.ts +279 -0
- package/src/modes/controllers/tan-command-controller.ts +173 -0
- package/src/modes/controllers/todo-command-controller.ts +485 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/gradient-highlight.ts +87 -0
- package/src/modes/image-references.ts +117 -0
- package/src/modes/index.ts +17 -0
- package/src/modes/interactive-mode.ts +3370 -0
- package/src/modes/internal-url-autocomplete.ts +143 -0
- package/src/modes/loop-limit.ts +140 -0
- package/src/modes/magic-keywords.ts +20 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +42 -0
- package/src/modes/print-mode.ts +126 -0
- package/src/modes/prompt-action-autocomplete.ts +260 -0
- package/src/modes/rpc/host-tools.ts +186 -0
- package/src/modes/rpc/host-uris.ts +235 -0
- package/src/modes/rpc/rpc-client.ts +963 -0
- package/src/modes/rpc/rpc-mode.ts +947 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +458 -0
- package/src/modes/runtime-init.ts +116 -0
- package/src/modes/session-observer-registry.ts +146 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +99 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +96 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +69 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +205 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +299 -0
- package/src/modes/setup-wizard/scenes/types.ts +48 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +129 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +275 -0
- package/src/modes/shared.ts +47 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +142 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +142 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +29 -0
- package/src/modes/theme/shimmer.ts +235 -0
- package/src/modes/theme/theme-schema.json +459 -0
- package/src/modes/theme/theme.ts +2676 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +359 -0
- package/src/modes/ultrathink.ts +41 -0
- package/src/modes/utils/context-usage.ts +339 -0
- package/src/modes/utils/copy-targets.ts +360 -0
- package/src/modes/utils/hotkeys-markdown.ts +61 -0
- package/src/modes/utils/keybinding-matchers.ts +51 -0
- package/src/modes/utils/tools-markdown.ts +27 -0
- package/src/modes/utils/ui-helpers.ts +801 -0
- package/src/modes/workflow.ts +42 -0
- package/src/plan-mode/approved-plan.ts +186 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +41 -0
- package/src/prompts/agents/designer.md +66 -0
- package/src/prompts/agents/explore.md +58 -0
- package/src/prompts/agents/frontmatter.md +11 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/oracle.md +55 -0
- package/src/prompts/agents/plan.md +48 -0
- package/src/prompts/agents/reviewer.md +140 -0
- package/src/prompts/agents/task.md +16 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/read-path.md +11 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +22 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +69 -0
- package/src/prompts/steering/user-interjection.md +10 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +12 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-todo.md +13 -0
- package/src/prompts/system/empty-stop-retry.md +6 -0
- package/src/prompts/system/irc-incoming.md +7 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/plan-mode-active.md +109 -0
- package/src/prompts/system/plan-mode-approved.md +25 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
- package/src/prompts/system/plan-mode-reference.md +11 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/project-prompt.md +52 -0
- package/src/prompts/system/subagent-system-prompt.md +64 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +12 -0
- package/src/prompts/system/system-prompt.md +258 -0
- package/src/prompts/system/tiny-title-system.md +8 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +70 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +30 -0
- package/src/prompts/tools/ast-edit.md +39 -0
- package/src/prompts/tools/ast-grep.md +42 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +46 -0
- package/src/prompts/tools/browser.md +73 -0
- package/src/prompts/tools/checkpoint.md +16 -0
- package/src/prompts/tools/debug.md +34 -0
- package/src/prompts/tools/eval.md +92 -0
- package/src/prompts/tools/find.md +36 -0
- package/src/prompts/tools/github.md +21 -0
- package/src/prompts/tools/goal.md +18 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +32 -0
- package/src/prompts/tools/irc.md +59 -0
- package/src/prompts/tools/job.md +19 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +42 -0
- package/src/prompts/tools/memory-edit.md +8 -0
- package/src/prompts/tools/patch.md +70 -0
- package/src/prompts/tools/read.md +84 -0
- package/src/prompts/tools/recall.md +5 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/render-mermaid.md +9 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/resolve.md +9 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +13 -0
- package/src/prompts/tools/search-tool-bm25.md +32 -0
- package/src/prompts/tools/search.md +24 -0
- package/src/prompts/tools/ssh.md +31 -0
- package/src/prompts/tools/task-summary.md +17 -0
- package/src/prompts/tools/task.md +88 -0
- package/src/prompts/tools/todo.md +62 -0
- package/src/prompts/tools/web-search.md +10 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +218 -0
- package/src/registry/agent-registry.ts +151 -0
- package/src/sdk.ts +2558 -0
- package/src/secrets/index.ts +123 -0
- package/src/secrets/obfuscator.ts +298 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +10121 -0
- package/src/session/agent-storage.ts +455 -0
- package/src/session/artifacts.ts +135 -0
- package/src/session/auth-broker-config.ts +131 -0
- package/src/session/auth-storage.ts +29 -0
- package/src/session/blob-store.ts +255 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/history-storage.ts +348 -0
- package/src/session/indexed-session-storage.ts +430 -0
- package/src/session/messages.ts +541 -0
- package/src/session/redis-session-storage.ts +170 -0
- package/src/session/session-dump-format.ts +209 -0
- package/src/session/session-history-format.ts +246 -0
- package/src/session/session-manager.ts +3676 -0
- package/src/session/session-storage.ts +529 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/sql-session-storage.ts +314 -0
- package/src/session/streaming-output.ts +1330 -0
- package/src/session/tool-choice-queue.ts +213 -0
- package/src/session/yield-queue.ts +173 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/builtin-registry.ts +1798 -0
- package/src/slash-commands/helpers/context-report.ts +39 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +532 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/ssh.ts +195 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
- package/src/slash-commands/helpers/todo.ts +279 -0
- package/src/slash-commands/helpers/usage-report.ts +95 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +135 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +509 -0
- package/src/ssh/ssh-executor.ts +189 -0
- package/src/ssh/sshfs-mount.ts +140 -0
- package/src/ssh/utils.ts +8 -0
- package/src/stt/downloader.ts +71 -0
- package/src/stt/index.ts +3 -0
- package/src/stt/recorder.ts +351 -0
- package/src/stt/setup.ts +52 -0
- package/src/stt/stt-controller.ts +160 -0
- package/src/stt/transcribe.py +70 -0
- package/src/stt/transcriber.ts +91 -0
- package/src/stubs/natives/index.ts +814 -0
- package/src/stubs/natives/package.json +7 -0
- package/src/stubs/tui/index.ts +282 -0
- package/src/stubs/tui/package.json +7 -0
- package/src/system-prompt.ts +611 -0
- package/src/task/agents.ts +167 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +122 -0
- package/src/task/executor.ts +2133 -0
- package/src/task/index.ts +1419 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +88 -0
- package/src/task/parallel.ts +116 -0
- package/src/task/render.ts +1381 -0
- package/src/task/repair-args.ts +129 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +336 -0
- package/src/task/worktree.ts +514 -0
- package/src/telemetry-export.ts +144 -0
- package/src/thinking.ts +167 -0
- package/src/tiny/compiled-runtime.ts +179 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/models.ts +242 -0
- package/src/tiny/text.ts +165 -0
- package/src/tiny/title-client.ts +543 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +568 -0
- package/src/tool-discovery/mode.ts +24 -0
- package/src/tool-discovery/tool-index.ts +256 -0
- package/src/tools/approval.ts +189 -0
- package/src/tools/archive-reader.ts +721 -0
- package/src/tools/ask.ts +928 -0
- package/src/tools/ast-edit.ts +642 -0
- package/src/tools/ast-grep.ts +452 -0
- package/src/tools/auto-generated-guard.ts +322 -0
- package/src/tools/bash-command-fixup.ts +37 -0
- package/src/tools/bash-interactive.ts +408 -0
- package/src/tools/bash-interceptor.ts +67 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +248 -0
- package/src/tools/bash.ts +1386 -0
- package/src/tools/browser/attach.ts +175 -0
- package/src/tools/browser/launch.ts +660 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +197 -0
- package/src/tools/browser/render.ts +216 -0
- package/src/tools/browser/tab-protocol.ts +105 -0
- package/src/tools/browser/tab-supervisor.ts +628 -0
- package/src/tools/browser/tab-worker-entry.ts +21 -0
- package/src/tools/browser/tab-worker.ts +1226 -0
- package/src/tools/browser.ts +343 -0
- package/src/tools/checkpoint.ts +136 -0
- package/src/tools/conflict-detect.ts +718 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/debug.ts +1067 -0
- package/src/tools/eval-backends.ts +27 -0
- package/src/tools/eval-render.ts +752 -0
- package/src/tools/eval.ts +577 -0
- package/src/tools/fetch.ts +1926 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/find.ts +609 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +255 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +481 -0
- package/src/tools/gh.ts +3720 -0
- package/src/tools/github-cache.ts +637 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/image-gen.ts +1517 -0
- package/src/tools/index.ts +599 -0
- package/src/tools/inspect-image-renderer.ts +132 -0
- package/src/tools/inspect-image.ts +174 -0
- package/src/tools/irc.ts +723 -0
- package/src/tools/job.ts +557 -0
- package/src/tools/json-tree.ts +243 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +59 -0
- package/src/tools/memory-recall.ts +100 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +202 -0
- package/src/tools/memory-retain.ts +91 -0
- package/src/tools/output-meta.ts +754 -0
- package/src/tools/output-schema-validator.ts +132 -0
- package/src/tools/path-utils.ts +1054 -0
- package/src/tools/plan-mode-guard.ts +108 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
- package/src/tools/read.ts +2929 -0
- package/src/tools/render-mermaid.ts +69 -0
- package/src/tools/render-utils.ts +838 -0
- package/src/tools/renderers.ts +77 -0
- package/src/tools/report-tool-issue.ts +534 -0
- package/src/tools/resolve.ts +276 -0
- package/src/tools/review.ts +253 -0
- package/src/tools/search-tool-bm25.ts +351 -0
- package/src/tools/search.ts +1580 -0
- package/src/tools/sqlite-reader.ts +828 -0
- package/src/tools/ssh.ts +349 -0
- package/src/tools/todo.ts +982 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +94 -0
- package/src/tools/tool-timeouts.ts +30 -0
- package/src/tools/tts.ts +133 -0
- package/src/tools/write.ts +1217 -0
- package/src/tools/yield.ts +269 -0
- package/src/tui/code-cell.ts +216 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +175 -0
- package/src/tui/index.ts +12 -0
- package/src/tui/output-block.ts +240 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +84 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +132 -0
- package/src/utils/clipboard.ts +193 -0
- package/src/utils/command-args.ts +76 -0
- package/src/utils/commit-message-generator.ts +151 -0
- package/src/utils/edit-mode.ts +41 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +65 -0
- package/src/utils/file-display-mode.ts +45 -0
- package/src/utils/file-mentions.ts +281 -0
- package/src/utils/git.ts +1833 -0
- package/src/utils/image-loading.ts +132 -0
- package/src/utils/image-resize.ts +309 -0
- package/src/utils/jj.ts +248 -0
- package/src/utils/lang-from-path.ts +239 -0
- package/src/utils/markit.ts +89 -0
- package/src/utils/open.ts +55 -0
- package/src/utils/session-color.ts +68 -0
- package/src/utils/shell-snapshot.ts +187 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/title-generator.ts +373 -0
- package/src/utils/tool-choice.ts +33 -0
- package/src/utils/tools-manager.ts +363 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +353 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +653 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +704 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +140 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +120 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +397 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +292 -0
- package/src/web/search/provider.ts +157 -0
- package/src/web/search/providers/anthropic.ts +318 -0
- package/src/web/search/providers/base.ts +89 -0
- package/src/web/search/providers/brave.ts +152 -0
- package/src/web/search/providers/codex.ts +591 -0
- package/src/web/search/providers/exa.ts +400 -0
- package/src/web/search/providers/gemini.ts +460 -0
- package/src/web/search/providers/jina.ts +111 -0
- package/src/web/search/providers/kagi.ts +86 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/parallel.ts +225 -0
- package/src/web/search/providers/perplexity.ts +730 -0
- package/src/web/search/providers/searxng.ts +313 -0
- package/src/web/search/providers/synthetic.ts +114 -0
- package/src/web/search/providers/tavily.ts +176 -0
- package/src/web/search/providers/utils.ts +128 -0
- package/src/web/search/providers/zai.ts +333 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +482 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +286 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-bound file snapshot store.
|
|
3
|
+
*
|
|
4
|
+
* Used by `read` and `search` to record exactly what the model saw, and by
|
|
5
|
+
* the hashline patcher to verify or recover from stale section tags (file
|
|
6
|
+
* changed externally between read and edit, or a prior in-session edit
|
|
7
|
+
* advanced the tag). The store is the {@link InMemorySnapshotStore}
|
|
8
|
+
* from `@oh-my-pi/hashline`; the only coding-agent-specific concern here
|
|
9
|
+
* is wiring it onto the per-session owner object.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { InMemorySnapshotStore } from "@oh-my-pi/hashline";
|
|
14
|
+
import { normalizeToLF } from "./normalize";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Upper bound on the file size we snapshot. A section tag is a content hash of
|
|
18
|
+
* the *whole* file, so minting one means holding the full normalized text in
|
|
19
|
+
* the store. Files above this cap emit no `[path#tag]` header — line-anchored
|
|
20
|
+
* editing of multi-megabyte files is out of scope under the full-content model.
|
|
21
|
+
*/
|
|
22
|
+
export const SNAPSHOT_MAX_BYTES = 4 * 1024 * 1024;
|
|
23
|
+
|
|
24
|
+
interface FileSnapshotStoreOwner {
|
|
25
|
+
fileSnapshotStore?: InMemorySnapshotStore;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Look up (or lazily create) the file snapshot store attached to a session.
|
|
30
|
+
* Storage lives on `session.fileSnapshotStore` so it ages out exactly with
|
|
31
|
+
* the session itself.
|
|
32
|
+
*/
|
|
33
|
+
export function getFileSnapshotStore(session: FileSnapshotStoreOwner): InMemorySnapshotStore {
|
|
34
|
+
if (!session.fileSnapshotStore) session.fileSnapshotStore = new InMemorySnapshotStore();
|
|
35
|
+
return session.fileSnapshotStore;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Canonicalize an absolute path into the stable key the snapshot store uses.
|
|
40
|
+
*
|
|
41
|
+
* Different code paths reach the snapshot store via different path forms:
|
|
42
|
+
* `read local://foo.md` records under the file's `fs.realpath` (the local
|
|
43
|
+
* protocol handler resolves symlinks); a subsequent `edit` may address the
|
|
44
|
+
* same artifact via `local://foo.md`, whose resolver does NOT realpath, or
|
|
45
|
+
* via the absolute path returned in the `[path#tag]` header. macOS adds the
|
|
46
|
+
* same hazard at the working-tree level (`/tmp/...` vs `/private/tmp/...`).
|
|
47
|
+
* Collapsing every key through `realpath` makes those forms fuse onto one
|
|
48
|
+
* snapshot entry, so a freshly-minted tag is never rejected as stale just
|
|
49
|
+
* because the lookup spelled the same file differently.
|
|
50
|
+
*
|
|
51
|
+
* Non-existent paths (new-file writes) fall back to a realpath of the parent
|
|
52
|
+
* directory + basename, then to the input. This keeps creates and updates on
|
|
53
|
+
* the same canonical key.
|
|
54
|
+
*/
|
|
55
|
+
export function canonicalSnapshotKey(absolutePath: string): string {
|
|
56
|
+
try {
|
|
57
|
+
return fs.realpathSync.native(absolutePath);
|
|
58
|
+
} catch {
|
|
59
|
+
try {
|
|
60
|
+
const parent = fs.realpathSync.native(path.dirname(absolutePath));
|
|
61
|
+
return path.join(parent, path.basename(absolutePath));
|
|
62
|
+
} catch {
|
|
63
|
+
return absolutePath;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Read the full text of `absolutePath` (within {@link SNAPSHOT_MAX_BYTES}),
|
|
70
|
+
* record it as a version snapshot, and return its content-hash tag. Returns
|
|
71
|
+
* `undefined` when the file exceeds the cap or cannot be read — callers then
|
|
72
|
+
* omit the section header so the model never sees a tag it can't anchor against.
|
|
73
|
+
*
|
|
74
|
+
* Producers that only displayed a slice of the file (range reads, search hits)
|
|
75
|
+
* use this to mint a whole-file tag: the displayed lines stay partial, but the
|
|
76
|
+
* tag fingerprints the entire file so a follow-up edit anchored at any line
|
|
77
|
+
* validates whenever the live file is byte-identical to what was read.
|
|
78
|
+
*/
|
|
79
|
+
export async function recordFileSnapshot(
|
|
80
|
+
session: FileSnapshotStoreOwner,
|
|
81
|
+
absolutePath: string,
|
|
82
|
+
): Promise<string | undefined> {
|
|
83
|
+
try {
|
|
84
|
+
const file = Bun.file(absolutePath);
|
|
85
|
+
if (file.size > SNAPSHOT_MAX_BYTES) return undefined;
|
|
86
|
+
const normalized = normalizeToLF(await file.text());
|
|
87
|
+
return getFileSnapshotStore(session).record(canonicalSnapshotKey(absolutePath), normalized);
|
|
88
|
+
} catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-sitter-backed {@link BlockResolver} for the hashline `replace block N:`
|
|
3
|
+
* operator. Bridges the pure hashline seam to the native `blockRangeAt`
|
|
4
|
+
* primitive in `@oh-my-pi/pi-natives`, which infers the language from the file
|
|
5
|
+
* path and returns the 1-indexed line span of the syntactic block beginning on
|
|
6
|
+
* the requested line (or `null` when none can be resolved).
|
|
7
|
+
*/
|
|
8
|
+
import type { BlockResolver } from "@oh-my-pi/hashline";
|
|
9
|
+
import { blockRangeAt } from './stubs/natives/index.ts';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* `blockRangeAt` runs a full synchronous tree-sitter parse of `text` per
|
|
13
|
+
* call, and streaming previews re-resolve the same (text, line) every
|
|
14
|
+
* streamed chunk. Memoize by content: identical text + line always yields the
|
|
15
|
+
* same span. FIFO-bounded; hashing the text is orders of magnitude cheaper
|
|
16
|
+
* than re-parsing it.
|
|
17
|
+
*/
|
|
18
|
+
const resolutionCache = new Map<string, { start: number; end: number } | null>();
|
|
19
|
+
const RESOLUTION_CACHE_MAX = 512;
|
|
20
|
+
|
|
21
|
+
export const nativeBlockResolver: BlockResolver = ({ path, text, line }) => {
|
|
22
|
+
const key = `${Bun.hash(text).toString(36)}:${text.length}:${line}:${path}`;
|
|
23
|
+
const cached = resolutionCache.get(key);
|
|
24
|
+
if (cached !== undefined) return cached;
|
|
25
|
+
const range = blockRangeAt({ code: text, path, line });
|
|
26
|
+
const result = range ? { start: range.startLine, end: range.endLine } : null;
|
|
27
|
+
if (resolutionCache.size >= RESOLUTION_CACHE_MAX) {
|
|
28
|
+
const oldest = resolutionCache.keys().next().value;
|
|
29
|
+
if (oldest !== undefined) resolutionCache.delete(oldest);
|
|
30
|
+
}
|
|
31
|
+
resolutionCache.set(key, result);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only hashline diff preview helpers used by the streaming edit
|
|
3
|
+
* renderer. Reads the target file, parses + applies the section's edits in
|
|
4
|
+
* memory (no FS write, no LSP writethrough), then hands the before/after
|
|
5
|
+
* pair to {@link generateDiffString} so the renderer can show the diff
|
|
6
|
+
* while the tool call is still streaming.
|
|
7
|
+
*
|
|
8
|
+
* Uses the same snapshot-tag semantics as the apply path: a live content-hash
|
|
9
|
+
* match is accepted even when the tag was minted by a source that did not keep
|
|
10
|
+
* history, and stale tags recover through the session snapshot store when possible.
|
|
11
|
+
*/
|
|
12
|
+
import {
|
|
13
|
+
type ApplyResult,
|
|
14
|
+
applyEdits,
|
|
15
|
+
type Cursor,
|
|
16
|
+
computeFileHash,
|
|
17
|
+
type Edit,
|
|
18
|
+
Patch as HashlinePatch,
|
|
19
|
+
hasBlockEdit,
|
|
20
|
+
MismatchError,
|
|
21
|
+
missingSnapshotTagMessage,
|
|
22
|
+
normalizeToLF,
|
|
23
|
+
type Patch,
|
|
24
|
+
type PatchSection,
|
|
25
|
+
parsePatchStreaming,
|
|
26
|
+
Recovery,
|
|
27
|
+
resolveBlockEdits,
|
|
28
|
+
type SnapshotStore,
|
|
29
|
+
stripBom,
|
|
30
|
+
} from "@oh-my-pi/hashline";
|
|
31
|
+
import { resolveToCwd } from "../../tools/path-utils";
|
|
32
|
+
import { generateDiffString } from "../diff";
|
|
33
|
+
import { readEditFileText } from "../read-file";
|
|
34
|
+
import { nativeBlockResolver } from "./block-resolver";
|
|
35
|
+
|
|
36
|
+
export interface HashlineDiffOptions {
|
|
37
|
+
/**
|
|
38
|
+
* Use the streaming-tolerant applier ({@link PatchSection.applyPartialTo})
|
|
39
|
+
* so trailing in-flight ops do not throw or emit phantom edits. Streaming
|
|
40
|
+
* preview path only.
|
|
41
|
+
*/
|
|
42
|
+
streaming?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Skip snapshot-tag validation. Streaming previews use this so transient
|
|
45
|
+
* stale/missing tags do not flash re-read errors while the model is still
|
|
46
|
+
* authoring input; the final apply path still validates through Patcher.
|
|
47
|
+
*/
|
|
48
|
+
skipHashValidation?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function readSectionText(absolutePath: string, sectionPath: string): Promise<string> {
|
|
52
|
+
try {
|
|
53
|
+
return await readEditFileText(absolutePath, sectionPath);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56
|
+
throw new Error(message || `Unable to read ${sectionPath}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Streaming previews recompute on every streamed chunk; re-reading the target
|
|
62
|
+
* file from disk each tick dominates the cost on large files. Cache the raw
|
|
63
|
+
* section text keyed by mtime+size so any on-disk change invalidates
|
|
64
|
+
* naturally. Used by the streaming path only — the args-complete pass always
|
|
65
|
+
* reads fresh.
|
|
66
|
+
*/
|
|
67
|
+
const streamingTextCache = new Map<string, { mtimeMs: number; size: number; rawContent: string }>();
|
|
68
|
+
const STREAMING_TEXT_CACHE_MAX = 8;
|
|
69
|
+
|
|
70
|
+
async function readSectionTextCached(absolutePath: string, sectionPath: string): Promise<string> {
|
|
71
|
+
let stamp: { mtimeMs: number; size: number } | undefined;
|
|
72
|
+
try {
|
|
73
|
+
const stat = await Bun.file(absolutePath).stat();
|
|
74
|
+
stamp = { mtimeMs: stat.mtimeMs, size: stat.size };
|
|
75
|
+
} catch {
|
|
76
|
+
stamp = undefined;
|
|
77
|
+
}
|
|
78
|
+
if (stamp) {
|
|
79
|
+
const cached = streamingTextCache.get(absolutePath);
|
|
80
|
+
if (cached && cached.mtimeMs === stamp.mtimeMs && cached.size === stamp.size) return cached.rawContent;
|
|
81
|
+
}
|
|
82
|
+
const rawContent = await readSectionText(absolutePath, sectionPath);
|
|
83
|
+
if (stamp) {
|
|
84
|
+
if (streamingTextCache.size >= STREAMING_TEXT_CACHE_MAX && !streamingTextCache.has(absolutePath)) {
|
|
85
|
+
const oldest = streamingTextCache.keys().next().value;
|
|
86
|
+
if (oldest !== undefined) streamingTextCache.delete(oldest);
|
|
87
|
+
}
|
|
88
|
+
streamingTextCache.set(absolutePath, { mtimeMs: stamp.mtimeMs, size: stamp.size, rawContent });
|
|
89
|
+
}
|
|
90
|
+
return rawContent;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function hasAnchorScopedEdit(edits: readonly Edit[]): boolean {
|
|
94
|
+
return edits.some(edit => {
|
|
95
|
+
if (edit.kind === "delete") return true;
|
|
96
|
+
if (edit.kind === "block") return true;
|
|
97
|
+
return edit.cursor.kind === "before_anchor" || edit.cursor.kind === "after_anchor";
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function createMismatchError(
|
|
102
|
+
section: PatchSection,
|
|
103
|
+
absolutePath: string,
|
|
104
|
+
normalized: string,
|
|
105
|
+
snapshots: SnapshotStore,
|
|
106
|
+
expected: string,
|
|
107
|
+
): MismatchError {
|
|
108
|
+
return new MismatchError({
|
|
109
|
+
path: section.path,
|
|
110
|
+
expectedFileHash: expected,
|
|
111
|
+
actualFileHash: computeFileHash(normalized),
|
|
112
|
+
fileLines: normalized.split("\n"),
|
|
113
|
+
anchorLines: section.collectAnchorLines(),
|
|
114
|
+
hashRecognized: snapshots.byHash(absolutePath, expected) !== null,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function parsePreviewEdits(section: PatchSection, streaming: boolean | undefined): readonly Edit[] {
|
|
119
|
+
return streaming ? parsePatchStreaming(section.diff).edits : section.edits;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function resolvePreviewEdits(args: {
|
|
123
|
+
section: PatchSection;
|
|
124
|
+
absolutePath: string;
|
|
125
|
+
normalized: string;
|
|
126
|
+
snapshots: SnapshotStore;
|
|
127
|
+
expected: string | undefined;
|
|
128
|
+
liveMatches: boolean;
|
|
129
|
+
edits: readonly Edit[];
|
|
130
|
+
}): readonly Edit[] {
|
|
131
|
+
const { section, absolutePath, normalized, snapshots, expected, liveMatches, edits } = args;
|
|
132
|
+
if (!hasBlockEdit(edits)) return edits;
|
|
133
|
+
const baseText = expected === undefined || liveMatches ? normalized : snapshots.byHash(absolutePath, expected)?.text;
|
|
134
|
+
if (baseText === undefined) {
|
|
135
|
+
throw createMismatchError(section, absolutePath, normalized, snapshots, expected ?? "");
|
|
136
|
+
}
|
|
137
|
+
return resolveBlockEdits(edits, baseText, section.path, nativeBlockResolver, { onUnresolved: "throw" });
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function applyPreviewEdits(args: {
|
|
141
|
+
section: PatchSection;
|
|
142
|
+
absolutePath: string;
|
|
143
|
+
normalized: string;
|
|
144
|
+
snapshots: SnapshotStore;
|
|
145
|
+
options: HashlineDiffOptions;
|
|
146
|
+
}): ApplyResult {
|
|
147
|
+
const { section, absolutePath, normalized, snapshots, options } = args;
|
|
148
|
+
const expected = section.fileHash;
|
|
149
|
+
if (!options.skipHashValidation && expected === undefined) {
|
|
150
|
+
throw new Error(missingSnapshotTagMessage(section.path));
|
|
151
|
+
}
|
|
152
|
+
const liveMatches = expected !== undefined && computeFileHash(normalized) === expected;
|
|
153
|
+
const edits = parsePreviewEdits(section, options.streaming);
|
|
154
|
+
const resolved = resolvePreviewEdits({ section, absolutePath, normalized, snapshots, expected, liveMatches, edits });
|
|
155
|
+
if (options.skipHashValidation || expected === undefined || liveMatches) return applyEdits(normalized, resolved);
|
|
156
|
+
if (!hasAnchorScopedEdit(resolved)) return applyEdits(normalized, resolved);
|
|
157
|
+
|
|
158
|
+
const recovered = new Recovery(snapshots).tryRecover({
|
|
159
|
+
path: absolutePath,
|
|
160
|
+
currentText: normalized,
|
|
161
|
+
fileHash: expected,
|
|
162
|
+
edits: resolved,
|
|
163
|
+
});
|
|
164
|
+
if (recovered) return recovered;
|
|
165
|
+
throw createMismatchError(section, absolutePath, normalized, snapshots, expected);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Map an insert cursor to the 1-indexed line where its payload lands, used to
|
|
170
|
+
* number the `+` rows of a streaming preview. Deliberately approximate: it
|
|
171
|
+
* ignores line shifts introduced by sibling ops, because the args-complete
|
|
172
|
+
* pass renumbers everything through the real unified diff.
|
|
173
|
+
*/
|
|
174
|
+
function insertCursorLine(cursor: Cursor, fileLineCount: number): number {
|
|
175
|
+
switch (cursor.kind) {
|
|
176
|
+
case "bof":
|
|
177
|
+
return 1;
|
|
178
|
+
case "eof":
|
|
179
|
+
return fileLineCount + 1;
|
|
180
|
+
case "before_anchor":
|
|
181
|
+
return cursor.anchor.line;
|
|
182
|
+
case "after_anchor":
|
|
183
|
+
return cursor.anchor.line + 1;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Build a streaming diff preview by emitting, per op in patch order, the
|
|
189
|
+
* removed file lines followed by the op's `+` payload rows — never a whole-file
|
|
190
|
+
* Myers re-diff. {@link generateDiffString} re-aligns the in-flight payload
|
|
191
|
+
* against the removed block on every streamed chunk (it greedily matches shared
|
|
192
|
+
* `}`/blank/`return` rows), so additions jump between hunks and the tail window
|
|
193
|
+
* the renderer pins stutters tick to tick. Natural order keeps the removed
|
|
194
|
+
* block fixed and grows the payload monotonically at the bottom so the streamed
|
|
195
|
+
* cursor stays put. Mirrors the apply_patch streaming strategy; the
|
|
196
|
+
* args-complete pass still produces the real unified diff.
|
|
197
|
+
*/
|
|
198
|
+
function buildStreamingSectionDiff(
|
|
199
|
+
section: PatchSection,
|
|
200
|
+
normalized: string,
|
|
201
|
+
): { diff: string; firstChangedLine: number | undefined } | { error: string } {
|
|
202
|
+
const { edits } = parsePatchStreaming(section.diff);
|
|
203
|
+
const resolved = resolveBlockEdits(edits, normalized, section.path, nativeBlockResolver, { onUnresolved: "drop" });
|
|
204
|
+
if (resolved.length === 0) return { error: `No changes would be made to ${section.path}.` };
|
|
205
|
+
|
|
206
|
+
const fileLines = normalized.split("\n");
|
|
207
|
+
const rows: string[] = [];
|
|
208
|
+
let firstChangedLine: number | undefined;
|
|
209
|
+
|
|
210
|
+
// Every edit emitted from one op header carries that header's patch line
|
|
211
|
+
// number and the edits sit contiguously (a replace lays down its replacement
|
|
212
|
+
// inserts then its range deletes; block ops expand to the same shape). Group
|
|
213
|
+
// on that boundary so each op stays intact and ordered.
|
|
214
|
+
for (let i = 0; i < resolved.length; ) {
|
|
215
|
+
const opLine = resolved[i].lineNum;
|
|
216
|
+
const deletes: number[] = [];
|
|
217
|
+
const inserts: string[] = [];
|
|
218
|
+
let insertBase: number | undefined;
|
|
219
|
+
while (i < resolved.length && resolved[i].lineNum === opLine) {
|
|
220
|
+
const edit = resolved[i];
|
|
221
|
+
if (edit.kind === "delete") deletes.push(edit.anchor.line);
|
|
222
|
+
else if (edit.kind === "insert") {
|
|
223
|
+
insertBase ??= insertCursorLine(edit.cursor, fileLines.length);
|
|
224
|
+
inserts.push(edit.text);
|
|
225
|
+
}
|
|
226
|
+
i++;
|
|
227
|
+
}
|
|
228
|
+
// Removed lines first (a fixed block), payload second (grows at the
|
|
229
|
+
// bottom = the streamed cursor).
|
|
230
|
+
deletes.sort((a, b) => a - b);
|
|
231
|
+
for (const line of deletes) {
|
|
232
|
+
firstChangedLine ??= line;
|
|
233
|
+
const content = line >= 1 && line <= fileLines.length ? fileLines[line - 1] : "";
|
|
234
|
+
rows.push(`-${line}|${content}`);
|
|
235
|
+
}
|
|
236
|
+
let newLine = insertBase ?? deletes[0] ?? 1;
|
|
237
|
+
for (const text of inserts) {
|
|
238
|
+
firstChangedLine ??= newLine;
|
|
239
|
+
rows.push(`+${newLine}|${text}`);
|
|
240
|
+
newLine++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (rows.length === 0) return { error: `No changes would be made to ${section.path}.` };
|
|
245
|
+
return { diff: rows.join("\n"), firstChangedLine };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export async function computeHashlineSectionDiff(
|
|
249
|
+
section: PatchSection,
|
|
250
|
+
cwd: string,
|
|
251
|
+
snapshots: SnapshotStore,
|
|
252
|
+
options: HashlineDiffOptions = {},
|
|
253
|
+
): Promise<{ diff: string; firstChangedLine: number | undefined } | { error: string }> {
|
|
254
|
+
try {
|
|
255
|
+
const absolutePath = resolveToCwd(section.path, cwd);
|
|
256
|
+
const rawContent = options.streaming
|
|
257
|
+
? await readSectionTextCached(absolutePath, section.path)
|
|
258
|
+
: await readSectionText(absolutePath, section.path);
|
|
259
|
+
const { text: content } = stripBom(rawContent);
|
|
260
|
+
const normalized = normalizeToLF(content);
|
|
261
|
+
// Streaming favors a stable, monotonic preview over an exact unified
|
|
262
|
+
// diff: feed the in-flight ops through the natural-order builder so the
|
|
263
|
+
// streamed cursor stays pinned to the bottom. The args-complete pass
|
|
264
|
+
// (`streaming` unset) falls through to the real Myers diff below.
|
|
265
|
+
if (options.streaming) return buildStreamingSectionDiff(section, normalized);
|
|
266
|
+
const result = applyPreviewEdits({ section, absolutePath, normalized, snapshots, options });
|
|
267
|
+
if (normalized === result.text) return { error: `No changes would be made to ${section.path}.` };
|
|
268
|
+
return generateDiffString(normalized, result.text, undefined, { path: section.path });
|
|
269
|
+
} catch (err) {
|
|
270
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export async function computeHashlineDiff(
|
|
275
|
+
input: { input: string },
|
|
276
|
+
cwd: string,
|
|
277
|
+
snapshots: SnapshotStore,
|
|
278
|
+
options: HashlineDiffOptions = {},
|
|
279
|
+
): Promise<{ diff: string; firstChangedLine: number | undefined } | { error: string }> {
|
|
280
|
+
let patch: Patch;
|
|
281
|
+
try {
|
|
282
|
+
patch = HashlinePatch.parse(input.input, { cwd });
|
|
283
|
+
} catch (err) {
|
|
284
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
285
|
+
}
|
|
286
|
+
if (patch.sections.length !== 1) {
|
|
287
|
+
return { error: "Streaming diff preview supports exactly one hashline section." };
|
|
288
|
+
}
|
|
289
|
+
return computeHashlineSectionDiff(patch.sections[0], cwd, snapshots, options);
|
|
290
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coding-agent runner that drives the hashline {@link Patcher} on behalf of
|
|
3
|
+
* the `edit` tool. Converts a `{input}` tool-call payload into a
|
|
4
|
+
* fully-applied patch, wraps the result in the agent's
|
|
5
|
+
* {@link AgentToolResult} shape, and attaches LSP diagnostics + `outputMeta`
|
|
6
|
+
* for the renderer.
|
|
7
|
+
*
|
|
8
|
+
* Multi-section patches are preflighted up front via {@link Patcher.prepare}
|
|
9
|
+
* so a partial batch never lands; the commit loop then narrows the LSP
|
|
10
|
+
* batch's `flush` flag to true only for the final write so diagnostics
|
|
11
|
+
* round-trip once.
|
|
12
|
+
*/
|
|
13
|
+
import {
|
|
14
|
+
type BlockResolution,
|
|
15
|
+
buildCompactDiffPreview,
|
|
16
|
+
MismatchError as HashlineMismatchError,
|
|
17
|
+
Patch,
|
|
18
|
+
Patcher,
|
|
19
|
+
type PatchSectionResult,
|
|
20
|
+
type PreparedSection,
|
|
21
|
+
} from "@oh-my-pi/hashline";
|
|
22
|
+
import type { AgentToolResult } from "@oh-my-pi/pi-agent-core";
|
|
23
|
+
import type { FileDiagnosticsResult, WritethroughCallback, WritethroughDeferredHandle } from "../../lsp";
|
|
24
|
+
import type { ToolSession } from "../../tools";
|
|
25
|
+
import { outputMeta } from "../../tools/output-meta";
|
|
26
|
+
import { ToolError } from "../../tools/tool-errors";
|
|
27
|
+
import { generateDiffString } from "../diff";
|
|
28
|
+
import { getFileSnapshotStore } from "../file-snapshot-store";
|
|
29
|
+
import type { EditToolDetails, EditToolPerFileResult, LspBatchRequest } from "../renderer";
|
|
30
|
+
import { nativeBlockResolver } from "./block-resolver";
|
|
31
|
+
import { HashlineFilesystem } from "./filesystem";
|
|
32
|
+
import { hashPatchInput, NOOP_HARD_LIMIT, recordNoopEdit, resetNoopEdit } from "./noop-loop-guard";
|
|
33
|
+
import { type HashlineParams, hashlineEditParamsSchema } from "./params";
|
|
34
|
+
|
|
35
|
+
export interface ExecuteHashlineSingleOptions {
|
|
36
|
+
session: ToolSession;
|
|
37
|
+
input: string;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
batchRequest?: LspBatchRequest;
|
|
40
|
+
writethrough: WritethroughCallback;
|
|
41
|
+
beginDeferredDiagnosticsForPath: (path: string) => WritethroughDeferredHandle;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function noChangeDiagnostic(path: string): string {
|
|
45
|
+
// The patch parsed and applied cleanly but produced no change — the
|
|
46
|
+
// `|literal` body rows matched the file content at the targeted lines
|
|
47
|
+
// byte-for-byte. The model usually misreads this as "wrong anchor, try
|
|
48
|
+
// again with a bigger payload" and starts duplicating content; the
|
|
49
|
+
// message below names the cause directly so the next turn can re-read
|
|
50
|
+
// instead of expanding the patch.
|
|
51
|
+
return (
|
|
52
|
+
`Edits to ${path} parsed and applied cleanly, but produced no change: ` +
|
|
53
|
+
`your body row(s) are byte-identical to the file at the targeted lines. ` +
|
|
54
|
+
`The bug is somewhere else — re-read the file before issuing another edit. ` +
|
|
55
|
+
`Do NOT widen the payload or add lines; verify the anchor first.`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Escalated diagnostic surfaced once the same payload has no-op'd
|
|
61
|
+
* {@link NOOP_HARD_LIMIT} times in a row on the same canonical path. Thrown as
|
|
62
|
+
* a {@link ToolError} so the agent loop sees a tool *failure* — empirically
|
|
63
|
+
* far more effective at breaking a no-op edit loop than the soft hint alone
|
|
64
|
+
* (issue #2081 saw 182 byte-identical no-op results in 205 calls before the
|
|
65
|
+
* user aborted).
|
|
66
|
+
*/
|
|
67
|
+
function noChangeLoopDiagnostic(path: string, count: number): string {
|
|
68
|
+
return (
|
|
69
|
+
`STOP. Edits to ${path} have been a byte-identical no-op ${count} times in a row — ` +
|
|
70
|
+
`the patch body matches the file at the targeted lines and the soft hint did not break the cycle. ` +
|
|
71
|
+
`Cease re-issuing this payload. Either the intended change is already on disk (move on), ` +
|
|
72
|
+
`or your anchor is wrong (re-read the file with \`read\` to observe the current line numbers and ` +
|
|
73
|
+
`tag, then author a different edit). This exact payload will keep being rejected until it changes.`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function assertUniqueCanonicalPaths(prepared: readonly PreparedSection[]): void {
|
|
78
|
+
const seen = new Map<string, string>();
|
|
79
|
+
for (const entry of prepared) {
|
|
80
|
+
const previous = seen.get(entry.canonicalPath);
|
|
81
|
+
if (previous !== undefined) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Multiple hashline sections resolve to the same file (${previous} and ${entry.section.path}). Merge their ops under one header before applying.`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
seen.set(entry.canonicalPath, entry.section.path);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function narrowBatchRequest(outer: LspBatchRequest | undefined, isLast: boolean): LspBatchRequest | undefined {
|
|
91
|
+
if (!outer) return undefined;
|
|
92
|
+
return { id: outer.id, flush: isLast && outer.flush };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface RenderedSection {
|
|
96
|
+
toolResult: AgentToolResult<EditToolDetails, typeof hashlineEditParamsSchema>;
|
|
97
|
+
perFileResult: EditToolPerFileResult;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function formatBlockResolution(resolution: BlockResolution): string {
|
|
101
|
+
const op =
|
|
102
|
+
resolution.op === "delete"
|
|
103
|
+
? "delete block"
|
|
104
|
+
: resolution.op === "insert_after"
|
|
105
|
+
? "insert after block"
|
|
106
|
+
: "replace block";
|
|
107
|
+
const lines = resolution.end - resolution.start + 1;
|
|
108
|
+
const span =
|
|
109
|
+
resolution.start === resolution.end ? `line ${resolution.start}` : `lines ${resolution.start}-${resolution.end}`;
|
|
110
|
+
const suffix = resolution.op === "insert_after" ? `; body lands after line ${resolution.end}` : "";
|
|
111
|
+
return `${op} ${resolution.anchorLine} → resolved ${span} (${lines} line${lines === 1 ? "" : "s"})${suffix}`;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function renderSection(result: PatchSectionResult, diagnostics: FileDiagnosticsResult | undefined): RenderedSection {
|
|
115
|
+
if (result.op === "noop") {
|
|
116
|
+
const toolResult: AgentToolResult<EditToolDetails, typeof hashlineEditParamsSchema> = {
|
|
117
|
+
content: [{ type: "text", text: noChangeDiagnostic(result.path) }],
|
|
118
|
+
details: { diff: "", op: "update", meta: outputMeta().get() },
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
toolResult,
|
|
122
|
+
perFileResult: { path: result.path, diff: "", op: "update" },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const diff = generateDiffString(result.before, result.after, undefined, { path: result.path });
|
|
127
|
+
const preview = buildCompactDiffPreview(diff.diff);
|
|
128
|
+
const meta = outputMeta()
|
|
129
|
+
.diagnostics(diagnostics?.summary ?? "", diagnostics?.messages ?? [])
|
|
130
|
+
.get();
|
|
131
|
+
|
|
132
|
+
const warningsBlock = result.warnings.length > 0 ? `\n\nWarnings:\n${result.warnings.join("\n")}` : "";
|
|
133
|
+
const previewBlock = preview.preview ? `\n${preview.preview}` : "";
|
|
134
|
+
const blockBlock =
|
|
135
|
+
result.blockResolutions && result.blockResolutions.length > 0
|
|
136
|
+
? `\n${result.blockResolutions.map(formatBlockResolution).join("\n")}`
|
|
137
|
+
: "";
|
|
138
|
+
const firstChangedLine = result.firstChangedLine ?? diff.firstChangedLine;
|
|
139
|
+
return {
|
|
140
|
+
toolResult: {
|
|
141
|
+
content: [{ type: "text", text: `${result.header}${blockBlock}${previewBlock}${warningsBlock}` }],
|
|
142
|
+
details: {
|
|
143
|
+
diff: diff.diff,
|
|
144
|
+
firstChangedLine,
|
|
145
|
+
diagnostics,
|
|
146
|
+
op: result.op,
|
|
147
|
+
meta,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
perFileResult: {
|
|
151
|
+
path: result.path,
|
|
152
|
+
diff: diff.diff,
|
|
153
|
+
firstChangedLine,
|
|
154
|
+
diagnostics,
|
|
155
|
+
op: result.op,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export async function executeHashlineSingle(
|
|
161
|
+
options: ExecuteHashlineSingleOptions,
|
|
162
|
+
): Promise<AgentToolResult<EditToolDetails, typeof hashlineEditParamsSchema>> {
|
|
163
|
+
const patch = Patch.parse(options.input, { cwd: options.session.cwd });
|
|
164
|
+
if (patch.sections.length === 0) {
|
|
165
|
+
throw new Error("No hashline sections found in input.");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const fs = new HashlineFilesystem({
|
|
169
|
+
session: options.session,
|
|
170
|
+
writethrough: options.writethrough,
|
|
171
|
+
beginDeferredDiagnosticsForPath: options.beginDeferredDiagnosticsForPath,
|
|
172
|
+
signal: options.signal,
|
|
173
|
+
batchRequest: options.batchRequest,
|
|
174
|
+
});
|
|
175
|
+
const snapshots = getFileSnapshotStore(options.session);
|
|
176
|
+
const patcher = new Patcher({ fs, snapshots, blockResolver: nativeBlockResolver });
|
|
177
|
+
|
|
178
|
+
// Single-section fast path: prepare, commit, render.
|
|
179
|
+
const inputHash = hashPatchInput(options.input);
|
|
180
|
+
if (patch.sections.length === 1) {
|
|
181
|
+
fs.setBatchRequest(narrowBatchRequest(options.batchRequest, true));
|
|
182
|
+
const prepared = await patcher.prepare(patch.sections[0]);
|
|
183
|
+
const sectionResult = await patcher.commit(prepared);
|
|
184
|
+
if (sectionResult.op === "noop") {
|
|
185
|
+
const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash);
|
|
186
|
+
if (escalate) {
|
|
187
|
+
throw new ToolError(noChangeLoopDiagnostic(sectionResult.path, count));
|
|
188
|
+
}
|
|
189
|
+
return renderSection(sectionResult, undefined).toolResult;
|
|
190
|
+
}
|
|
191
|
+
resetNoopEdit(options.session, sectionResult.canonicalPath);
|
|
192
|
+
return renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path)).toolResult;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Multi-section: prepare every section up front so we fail fast before
|
|
196
|
+
// any write hits the filesystem.
|
|
197
|
+
const prepared: PreparedSection[] = [];
|
|
198
|
+
for (const section of patch.sections) prepared.push(await patcher.prepare(section));
|
|
199
|
+
assertUniqueCanonicalPaths(prepared);
|
|
200
|
+
for (const entry of prepared) {
|
|
201
|
+
if (entry.isNoop) {
|
|
202
|
+
const { count, escalate } = recordNoopEdit(options.session, entry.canonicalPath, inputHash);
|
|
203
|
+
throw escalate
|
|
204
|
+
? new ToolError(noChangeLoopDiagnostic(entry.section.path, count))
|
|
205
|
+
: new ToolError(noChangeDiagnostic(entry.section.path));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Then commit each one, narrowing the LSP batch flush flag to the final
|
|
209
|
+
// section only. A no-op apply mid-batch is treated as a hard failure —
|
|
210
|
+
// the model authored anchors that match the current file content.
|
|
211
|
+
const rendered: RenderedSection[] = [];
|
|
212
|
+
for (let i = 0; i < prepared.length; i++) {
|
|
213
|
+
const isLast = i === prepared.length - 1;
|
|
214
|
+
fs.setBatchRequest(narrowBatchRequest(options.batchRequest, isLast));
|
|
215
|
+
const sectionResult = await patcher.commit(prepared[i]);
|
|
216
|
+
if (sectionResult.op === "noop") {
|
|
217
|
+
const { count, escalate } = recordNoopEdit(options.session, sectionResult.canonicalPath, inputHash);
|
|
218
|
+
throw escalate
|
|
219
|
+
? new ToolError(noChangeLoopDiagnostic(sectionResult.path, count))
|
|
220
|
+
: new ToolError(noChangeDiagnostic(sectionResult.path));
|
|
221
|
+
}
|
|
222
|
+
resetNoopEdit(options.session, sectionResult.canonicalPath);
|
|
223
|
+
rendered.push(renderSection(sectionResult, fs.consumeDiagnostics(sectionResult.path)));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return {
|
|
227
|
+
content: [
|
|
228
|
+
{
|
|
229
|
+
type: "text",
|
|
230
|
+
text: rendered
|
|
231
|
+
.map(r => r.toolResult.content.map(part => (part.type === "text" ? part.text : "")).join("\n"))
|
|
232
|
+
.join("\n\n"),
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
details: {
|
|
236
|
+
diff: rendered.map(r => r.toolResult.details?.diff ?? "").join("\n"),
|
|
237
|
+
perFileResults: rendered.map(r => r.perFileResult),
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export { HashlineMismatchError, type HashlineParams, hashlineEditParamsSchema };
|