@ck123pm/paseo-server 0.1.80
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/.env.example +23 -0
- package/README.md +111 -0
- package/dist/scripts/dev-runner.js +49 -0
- package/dist/scripts/dev-runner.js.map +1 -0
- package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
- package/dist/scripts/supervisor-entrypoint.js +126 -0
- package/dist/scripts/supervisor-entrypoint.js.map +1 -0
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor-log-config.js.map +1 -0
- package/dist/scripts/supervisor.js +213 -0
- package/dist/scripts/supervisor.js.map +1 -0
- package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts +8 -0
- package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts.map +1 -0
- package/dist/server/client/daemon-client-relay-e2ee-transport.js +161 -0
- package/dist/server/client/daemon-client-relay-e2ee-transport.js.map +1 -0
- package/dist/server/client/daemon-client-runtime-metrics.d.ts +39 -0
- package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -0
- package/dist/server/client/daemon-client-runtime-metrics.js +173 -0
- package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -0
- package/dist/server/client/daemon-client-transport-types.d.ts +36 -0
- package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -0
- package/dist/server/client/daemon-client-transport-types.js +2 -0
- package/dist/server/client/daemon-client-transport-types.js.map +1 -0
- package/dist/server/client/daemon-client-transport-utils.d.ts +9 -0
- package/dist/server/client/daemon-client-transport-utils.d.ts.map +1 -0
- package/dist/server/client/daemon-client-transport-utils.js +121 -0
- package/dist/server/client/daemon-client-transport-utils.js.map +1 -0
- package/dist/server/client/daemon-client-transport.d.ts +5 -0
- package/dist/server/client/daemon-client-transport.d.ts.map +1 -0
- package/dist/server/client/daemon-client-transport.js +4 -0
- package/dist/server/client/daemon-client-transport.js.map +1 -0
- package/dist/server/client/daemon-client-websocket-transport.d.ts +8 -0
- package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -0
- package/dist/server/client/daemon-client-websocket-transport.js +120 -0
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -0
- package/dist/server/client/daemon-client.d.ts +862 -0
- package/dist/server/client/daemon-client.d.ts.map +1 -0
- package/dist/server/client/daemon-client.js +3376 -0
- package/dist/server/client/daemon-client.js.map +1 -0
- package/dist/server/client/terminal-stream-router.d.ts +24 -0
- package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
- package/dist/server/client/terminal-stream-router.js +100 -0
- package/dist/server/client/terminal-stream-router.js.map +1 -0
- package/dist/server/server/agent/activity-curator.d.ts +11 -0
- package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
- package/dist/server/server/agent/activity-curator.js +150 -0
- package/dist/server/server/agent/activity-curator.js.map +1 -0
- package/dist/server/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-archive.js.map +1 -0
- package/dist/server/server/agent/agent-loading.d.ts +12 -0
- package/dist/server/server/agent/agent-loading.d.ts.map +1 -0
- package/dist/server/server/agent/agent-loading.js +51 -0
- package/dist/server/server/agent/agent-loading.js.map +1 -0
- package/dist/server/server/agent/agent-manager.d.ts +342 -0
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
- package/dist/server/server/agent/agent-manager.js +2572 -0
- package/dist/server/server/agent/agent-manager.js.map +1 -0
- package/dist/server/server/agent/agent-metadata-generator.d.ts +27 -0
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
- package/dist/server/server/agent/agent-metadata-generator.js +104 -0
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
- package/dist/server/server/agent/agent-projections.d.ts +24 -0
- package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
- package/dist/server/server/agent/agent-projections.js +406 -0
- package/dist/server/server/agent/agent-projections.js.map +1 -0
- package/dist/server/server/agent/agent-prompt.d.ts +72 -0
- package/dist/server/server/agent/agent-prompt.d.ts.map +1 -0
- package/dist/server/server/agent/agent-prompt.js +196 -0
- package/dist/server/server/agent/agent-prompt.js.map +1 -0
- package/dist/server/server/agent/agent-response-loop.d.ts +62 -0
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
- package/dist/server/server/agent/agent-response-loop.js +321 -0
- package/dist/server/server/agent/agent-response-loop.js.map +1 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +540 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
- package/dist/server/server/agent/agent-sdk-types.js +22 -0
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
- package/dist/server/server/agent/agent-storage.d.ts +346 -0
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
- package/dist/server/server/agent/agent-storage.js +340 -0
- package/dist/server/server/agent/agent-storage.js.map +1 -0
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -0
- package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
- package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -0
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
- package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -0
- package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
- package/dist/server/server/agent/agent-timeline-store-types.js.map +1 -0
- package/dist/server/server/agent/agent-timeline-store.d.ts +32 -0
- package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -0
- package/dist/server/server/agent/agent-timeline-store.js +263 -0
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -0
- package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
- package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
- package/dist/server/server/agent/agent-title-limits.js +3 -0
- package/dist/server/server/agent/agent-title-limits.js.map +1 -0
- package/dist/server/server/agent/audio-utils.d.ts +3 -0
- package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
- package/dist/server/server/agent/audio-utils.js +19 -0
- package/dist/server/server/agent/audio-utils.js.map +1 -0
- package/dist/server/server/agent/create-agent-mode.d.ts +16 -0
- package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
- package/dist/server/server/agent/create-agent-mode.js +26 -0
- package/dist/server/server/agent/create-agent-mode.js.map +1 -0
- package/dist/server/server/agent/create-agent-title.d.ts +8 -0
- package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
- package/dist/server/server/agent/create-agent-title.js +29 -0
- package/dist/server/server/agent/create-agent-title.js.map +1 -0
- package/dist/server/server/agent/dictation-debug.d.ts +13 -0
- package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
- package/dist/server/server/agent/dictation-debug.js +50 -0
- package/dist/server/server/agent/dictation-debug.js.map +1 -0
- package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
- package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
- package/dist/server/server/agent/foreground-run-state.js +160 -0
- package/dist/server/server/agent/foreground-run-state.js.map +1 -0
- package/dist/server/server/agent/import-sessions.d.ts +52 -0
- package/dist/server/server/agent/import-sessions.d.ts.map +1 -0
- package/dist/server/server/agent/import-sessions.js +212 -0
- package/dist/server/server/agent/import-sessions.js.map +1 -0
- package/dist/server/server/agent/mcp-server.d.ts +46 -0
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
- package/dist/server/server/agent/mcp-server.js +1962 -0
- package/dist/server/server/agent/mcp-server.js.map +1 -0
- package/dist/server/server/agent/mcp-shared.d.ts +316 -0
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -0
- package/dist/server/server/agent/mcp-shared.js +194 -0
- package/dist/server/server/agent/mcp-shared.js.map +1 -0
- package/dist/server/server/agent/model-resolver.d.ts +11 -0
- package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
- package/dist/server/server/agent/model-resolver.js +27 -0
- package/dist/server/server/agent/model-resolver.js.map +1 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
- package/dist/server/server/agent/pcm16-resampler.js +63 -0
- package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
- package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
- package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -0
- package/dist/server/server/agent/prompt-attachments.js +72 -0
- package/dist/server/server/agent/prompt-attachments.js.map +1 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
- package/dist/server/server/agent/provider-history-timestamps.js +16 -0
- package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
- package/dist/server/server/agent/provider-launch-config.d.ts +368 -0
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
- package/dist/server/server/agent/provider-launch-config.js +190 -0
- package/dist/server/server/agent/provider-launch-config.js.map +1 -0
- package/dist/server/server/agent/provider-manifest.d.ts +33 -0
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
- package/dist/server/server/agent/provider-manifest.js +211 -0
- package/dist/server/server/agent/provider-manifest.js.map +1 -0
- package/dist/server/server/agent/provider-registry.d.ts +33 -0
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
- package/dist/server/server/agent/provider-registry.js +396 -0
- package/dist/server/server/agent/provider-registry.js.map +1 -0
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +49 -0
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +348 -0
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts +286 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/acp-agent.js +2070 -0
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts +60 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/agent.js +3815 -0
- package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
- package/dist/server/server/agent/providers/claude/models.d.ts +10 -0
- package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/models.js +170 -0
- package/dist/server/server/agent/providers/claude/models.js.map +1 -0
- package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/partial-json.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
- package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -0
- package/dist/server/server/agent/providers/claude/project-dir.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/project-dir.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/project-dir.js +40 -0
- package/dist/server/server/agent/providers/claude/project-dir.js.map +1 -0
- package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
- package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/query.js +84 -0
- package/dist/server/server/agent/providers/claude/query.js.map +1 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +55 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +32 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +214 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +791 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +307 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js +4364 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js.map +1 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +555 -0
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +25 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js +203 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js +95 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +17 -0
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +127 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +33 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +234 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +68 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js +770 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
- package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
- package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +256 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +83 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +225 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +131 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +231 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.js +2443 -0
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +84 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/agent.js +828 -0
- package/dist/server/server/agent/providers/pi/agent.js.map +1 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +18 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +211 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js.map +1 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts +5 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/history-mapper.js +139 -0
- package/dist/server/server/agent/providers/pi/history-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +185 -0
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
- package/dist/server/server/agent/providers/pi/rpc-types.js.map +1 -0
- package/dist/server/server/agent/providers/pi/runtime.d.ts +47 -0
- package/dist/server/server/agent/providers/pi/runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/runtime.js +47 -0
- package/dist/server/server/agent/providers/pi/runtime.js.map +1 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +10 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.js +300 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.js.map +1 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +52 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +109 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js.map +1 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
- package/dist/server/server/agent/providers/provider-image-output.js +51 -0
- package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
- package/dist/server/server/agent/providers/provider-runner.js +81 -0
- package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1751 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +709 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +20 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +146 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
- package/dist/server/server/agent/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/recordings-debug.js.map +1 -0
- package/dist/server/server/agent/stt-debug.d.ts +10 -0
- package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
- package/dist/server/server/agent/stt-debug.js +33 -0
- package/dist/server/server/agent/stt-debug.js.map +1 -0
- package/dist/server/server/agent/stt-manager.d.ts +38 -0
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
- package/dist/server/server/agent/stt-manager.js +246 -0
- package/dist/server/server/agent/stt-manager.js.map +1 -0
- package/dist/server/server/agent/system-prompt.d.ts +2 -0
- package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
- package/dist/server/server/agent/system-prompt.js +8 -0
- package/dist/server/server/agent/system-prompt.js.map +1 -0
- package/dist/server/server/agent/timeline-append.d.ts +10 -0
- package/dist/server/server/agent/timeline-append.d.ts.map +1 -0
- package/dist/server/server/agent/timeline-append.js +27 -0
- package/dist/server/server/agent/timeline-append.js.map +1 -0
- package/dist/server/server/agent/timeline-projection.d.ts +55 -0
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -0
- package/dist/server/server/agent/timeline-projection.js +279 -0
- package/dist/server/server/agent/timeline-projection.js.map +1 -0
- package/dist/server/server/agent/tool-name-normalization.d.ts +9 -0
- package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
- package/dist/server/server/agent/tool-name-normalization.js +82 -0
- package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
- package/dist/server/server/agent/tts-debug.d.ts +8 -0
- package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
- package/dist/server/server/agent/tts-debug.js +24 -0
- package/dist/server/server/agent/tts-debug.js.map +1 -0
- package/dist/server/server/agent/tts-manager.d.ts +41 -0
- package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
- package/dist/server/server/agent/tts-manager.js +375 -0
- package/dist/server/server/agent/tts-manager.js.map +1 -0
- package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
- package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
- package/dist/server/server/agent-attention-policy.d.ts +20 -0
- package/dist/server/server/agent-attention-policy.d.ts.map +1 -0
- package/dist/server/server/agent-attention-policy.js +24 -0
- package/dist/server/server/agent-attention-policy.js.map +1 -0
- package/dist/server/server/auth.d.ts +25 -0
- package/dist/server/server/auth.d.ts.map +1 -0
- package/dist/server/server/auth.js +93 -0
- package/dist/server/server/auth.js.map +1 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
- package/dist/server/server/auto-archive-on-merge/index.js +15 -0
- package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
- package/dist/server/server/bootstrap.d.ts +98 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -0
- package/dist/server/server/bootstrap.js +800 -0
- package/dist/server/server/bootstrap.js.map +1 -0
- package/dist/server/server/chat/chat-mentions.d.ts +47 -0
- package/dist/server/server/chat/chat-mentions.d.ts.map +1 -0
- package/dist/server/server/chat/chat-mentions.js +113 -0
- package/dist/server/server/chat/chat-mentions.js.map +1 -0
- package/dist/server/server/chat/chat-rpc-schemas.d.ts +728 -0
- package/dist/server/server/chat/chat-rpc-schemas.d.ts.map +1 -0
- package/dist/server/server/chat/chat-rpc-schemas.js +103 -0
- package/dist/server/server/chat/chat-rpc-schemas.js.map +1 -0
- package/dist/server/server/chat/chat-service.d.ts +78 -0
- package/dist/server/server/chat/chat-service.d.ts.map +1 -0
- package/dist/server/server/chat/chat-service.js +339 -0
- package/dist/server/server/chat/chat-service.js.map +1 -0
- package/dist/server/server/chat/chat-types.d.ts +75 -0
- package/dist/server/server/chat/chat-types.d.ts.map +1 -0
- package/dist/server/server/chat/chat-types.js +22 -0
- package/dist/server/server/chat/chat-types.js.map +1 -0
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
- package/dist/server/server/checkout/status-projection.js +102 -0
- package/dist/server/server/checkout/status-projection.js.map +1 -0
- package/dist/server/server/checkout-diff-manager.d.ts +41 -0
- package/dist/server/server/checkout-diff-manager.d.ts.map +1 -0
- package/dist/server/server/checkout-diff-manager.js +189 -0
- package/dist/server/server/checkout-diff-manager.js.map +1 -0
- package/dist/server/server/checkout-git-utils.d.ts +11 -0
- package/dist/server/server/checkout-git-utils.d.ts.map +1 -0
- package/dist/server/server/checkout-git-utils.js +34 -0
- package/dist/server/server/checkout-git-utils.js.map +1 -0
- package/dist/server/server/client-message-id.d.ts +3 -0
- package/dist/server/server/client-message-id.d.ts.map +1 -0
- package/dist/server/server/client-message-id.js +12 -0
- package/dist/server/server/client-message-id.js.map +1 -0
- package/dist/server/server/config.d.ts +23 -0
- package/dist/server/server/config.d.ts.map +1 -0
- package/dist/server/server/config.js +233 -0
- package/dist/server/server/config.js.map +1 -0
- package/dist/server/server/connection-offer.d.ts +20 -0
- package/dist/server/server/connection-offer.d.ts.map +1 -0
- package/dist/server/server/connection-offer.js +59 -0
- package/dist/server/server/connection-offer.js.map +1 -0
- package/dist/server/server/daemon-config-store.d.ts +25 -0
- package/dist/server/server/daemon-config-store.d.ts.map +1 -0
- package/dist/server/server/daemon-config-store.js +138 -0
- package/dist/server/server/daemon-config-store.js.map +1 -0
- package/dist/server/server/daemon-keypair.d.ts +8 -0
- package/dist/server/server/daemon-keypair.d.ts.map +1 -0
- package/dist/server/server/daemon-keypair.js +42 -0
- package/dist/server/server/daemon-keypair.js.map +1 -0
- package/dist/server/server/daemon-version.d.ts +5 -0
- package/dist/server/server/daemon-version.d.ts.map +1 -0
- package/dist/server/server/daemon-version.js +22 -0
- package/dist/server/server/daemon-version.js.map +1 -0
- package/dist/server/server/daemon-worker.d.ts +2 -0
- package/dist/server/server/daemon-worker.d.ts.map +1 -0
- package/dist/server/server/daemon-worker.js +155 -0
- package/dist/server/server/daemon-worker.js.map +1 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
- package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
- package/dist/server/server/editor-targets.d.ts +18 -0
- package/dist/server/server/editor-targets.d.ts.map +1 -0
- package/dist/server/server/editor-targets.js +109 -0
- package/dist/server/server/editor-targets.js.map +1 -0
- package/dist/server/server/exports.d.ts +26 -0
- package/dist/server/server/exports.d.ts.map +1 -0
- package/dist/server/server/exports.js +25 -0
- package/dist/server/server/exports.js.map +1 -0
- package/dist/server/server/file-download/token-store.d.ts +24 -0
- package/dist/server/server/file-download/token-store.d.ts.map +1 -0
- package/dist/server/server/file-download/token-store.js +40 -0
- package/dist/server/server/file-download/token-store.js.map +1 -0
- package/dist/server/server/file-explorer/service.d.ts +51 -0
- package/dist/server/server/file-explorer/service.d.ts.map +1 -0
- package/dist/server/server/file-explorer/service.js +246 -0
- package/dist/server/server/file-explorer/service.js.map +1 -0
- package/dist/server/server/hostnames.d.ts +13 -0
- package/dist/server/server/hostnames.d.ts.map +1 -0
- package/dist/server/server/hostnames.js +94 -0
- package/dist/server/server/hostnames.js.map +1 -0
- package/dist/server/server/json-utils.d.ts +11 -0
- package/dist/server/server/json-utils.d.ts.map +1 -0
- package/dist/server/server/json-utils.js +45 -0
- package/dist/server/server/json-utils.js.map +1 -0
- package/dist/server/server/logger.d.ts +29 -0
- package/dist/server/server/logger.d.ts.map +1 -0
- package/dist/server/server/logger.js +125 -0
- package/dist/server/server/logger.js.map +1 -0
- package/dist/server/server/loop/rpc-schemas.d.ts +3005 -0
- package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -0
- package/dist/server/server/loop/rpc-schemas.js +163 -0
- package/dist/server/server/loop/rpc-schemas.js.map +1 -0
- package/dist/server/server/loop-service.d.ts +529 -0
- package/dist/server/server/loop-service.d.ts.map +1 -0
- package/dist/server/server/loop-service.js +751 -0
- package/dist/server/server/loop-service.js.map +1 -0
- package/dist/server/server/messages.d.ts +9 -0
- package/dist/server/server/messages.d.ts.map +1 -0
- package/dist/server/server/messages.js +29 -0
- package/dist/server/server/messages.js.map +1 -0
- package/dist/server/server/package-version.d.ts +25 -0
- package/dist/server/server/package-version.d.ts.map +1 -0
- package/dist/server/server/package-version.js +60 -0
- package/dist/server/server/package-version.js.map +1 -0
- package/dist/server/server/pagination/cursor.d.ts +16 -0
- package/dist/server/server/pagination/cursor.d.ts.map +1 -0
- package/dist/server/server/pagination/cursor.js +62 -0
- package/dist/server/server/pagination/cursor.js.map +1 -0
- package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
- package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
- package/dist/server/server/pagination/sortable-pager.js +68 -0
- package/dist/server/server/pagination/sortable-pager.js.map +1 -0
- package/dist/server/server/pairing-offer.d.ts +18 -0
- package/dist/server/server/pairing-offer.d.ts.map +1 -0
- package/dist/server/server/pairing-offer.js +47 -0
- package/dist/server/server/pairing-offer.js.map +1 -0
- package/dist/server/server/pairing-qr.d.ts +7 -0
- package/dist/server/server/pairing-qr.d.ts.map +1 -0
- package/dist/server/server/pairing-qr.js +45 -0
- package/dist/server/server/pairing-qr.js.map +1 -0
- package/dist/server/server/paseo-env.d.ts +13 -0
- package/dist/server/server/paseo-env.d.ts.map +1 -0
- package/dist/server/server/paseo-env.js +53 -0
- package/dist/server/server/paseo-env.js.map +1 -0
- package/dist/server/server/paseo-home.d.ts +2 -0
- package/dist/server/server/paseo-home.d.ts.map +1 -0
- package/dist/server/server/paseo-home.js +19 -0
- package/dist/server/server/paseo-home.js.map +1 -0
- package/dist/server/server/paseo-worktree-archive-service.d.ts +43 -0
- package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -0
- package/dist/server/server/paseo-worktree-archive-service.js +145 -0
- package/dist/server/server/paseo-worktree-archive-service.js.map +1 -0
- package/dist/server/server/paseo-worktree-service.d.ts +43 -0
- package/dist/server/server/paseo-worktree-service.d.ts.map +1 -0
- package/dist/server/server/paseo-worktree-service.js +218 -0
- package/dist/server/server/paseo-worktree-service.js.map +1 -0
- package/dist/server/server/path-utils.d.ts +4 -0
- package/dist/server/server/path-utils.d.ts.map +1 -0
- package/dist/server/server/path-utils.js +29 -0
- package/dist/server/server/path-utils.js.map +1 -0
- package/dist/server/server/persisted-config.d.ts +1056 -0
- package/dist/server/server/persisted-config.d.ts.map +1 -0
- package/dist/server/server/persisted-config.js +398 -0
- package/dist/server/server/persisted-config.js.map +1 -0
- package/dist/server/server/persistence-hooks.d.ts +33 -0
- package/dist/server/server/persistence-hooks.d.ts.map +1 -0
- package/dist/server/server/persistence-hooks.js +99 -0
- package/dist/server/server/persistence-hooks.js.map +1 -0
- package/dist/server/server/pid-lock.d.ts +46 -0
- package/dist/server/server/pid-lock.d.ts.map +1 -0
- package/dist/server/server/pid-lock.js +170 -0
- package/dist/server/server/pid-lock.js.map +1 -0
- package/dist/server/server/private-files.d.ts +7 -0
- package/dist/server/server/private-files.d.ts.map +1 -0
- package/dist/server/server/private-files.js +42 -0
- package/dist/server/server/private-files.js.map +1 -0
- package/dist/server/server/push/notifications.d.ts +9 -0
- package/dist/server/server/push/notifications.d.ts.map +1 -0
- package/dist/server/server/push/notifications.js +15 -0
- package/dist/server/server/push/notifications.js.map +1 -0
- package/dist/server/server/push/push-service.d.ts +20 -0
- package/dist/server/server/push/push-service.d.ts.map +1 -0
- package/dist/server/server/push/push-service.js +66 -0
- package/dist/server/server/push/push-service.js.map +1 -0
- package/dist/server/server/push/token-store.d.ts +18 -0
- package/dist/server/server/push/token-store.d.ts.map +1 -0
- package/dist/server/server/push/token-store.js +68 -0
- package/dist/server/server/push/token-store.js.map +1 -0
- package/dist/server/server/relay-transport.d.ts +31 -0
- package/dist/server/server/relay-transport.d.ts.map +1 -0
- package/dist/server/server/relay-transport.js +514 -0
- package/dist/server/server/relay-transport.js.map +1 -0
- package/dist/server/server/resolve-worktree-creation-intent.d.ts +29 -0
- package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +119 -0
- package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -0
- package/dist/server/server/schedule/cron.d.ts +4 -0
- package/dist/server/server/schedule/cron.d.ts.map +1 -0
- package/dist/server/server/schedule/cron.js +103 -0
- package/dist/server/server/schedule/cron.js.map +1 -0
- package/dist/server/server/schedule/rpc-schemas.d.ts +3909 -0
- package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -0
- package/dist/server/server/schedule/rpc-schemas.js +151 -0
- package/dist/server/server/schedule/rpc-schemas.js.map +1 -0
- package/dist/server/server/schedule/service.d.ts +40 -0
- package/dist/server/server/schedule/service.d.ts.map +1 -0
- package/dist/server/server/schedule/service.js +476 -0
- package/dist/server/server/schedule/service.js.map +1 -0
- package/dist/server/server/schedule/store.d.ts +13 -0
- package/dist/server/server/schedule/store.d.ts.map +1 -0
- package/dist/server/server/schedule/store.js +56 -0
- package/dist/server/server/schedule/store.js.map +1 -0
- package/dist/server/server/schedule/types.d.ts +726 -0
- package/dist/server/server/schedule/types.d.ts.map +1 -0
- package/dist/server/server/schedule/types.js +73 -0
- package/dist/server/server/schedule/types.js.map +1 -0
- package/dist/server/server/script-health-monitor.d.ts +39 -0
- package/dist/server/server/script-health-monitor.d.ts.map +1 -0
- package/dist/server/server/script-health-monitor.js +159 -0
- package/dist/server/server/script-health-monitor.js.map +1 -0
- package/dist/server/server/script-proxy.d.ts +40 -0
- package/dist/server/server/script-proxy.d.ts.map +1 -0
- package/dist/server/server/script-proxy.js +245 -0
- package/dist/server/server/script-proxy.js.map +1 -0
- package/dist/server/server/script-route-branch-handler.d.ts +10 -0
- package/dist/server/server/script-route-branch-handler.d.ts.map +1 -0
- package/dist/server/server/script-route-branch-handler.js +45 -0
- package/dist/server/server/script-route-branch-handler.js.map +1 -0
- package/dist/server/server/script-status-projection.d.ts +34 -0
- package/dist/server/server/script-status-projection.d.ts.map +1 -0
- package/dist/server/server/script-status-projection.js +152 -0
- package/dist/server/server/script-status-projection.js.map +1 -0
- package/dist/server/server/server-id.d.ts +17 -0
- package/dist/server/server/server-id.d.ts.map +1 -0
- package/dist/server/server/server-id.js +68 -0
- package/dist/server/server/server-id.js.map +1 -0
- package/dist/server/server/session.d.ts +586 -0
- package/dist/server/server/session.d.ts.map +1 -0
- package/dist/server/server/session.js +7072 -0
- package/dist/server/server/session.js.map +1 -0
- package/dist/server/server/speech/audio.d.ts +10 -0
- package/dist/server/server/speech/audio.d.ts.map +1 -0
- package/dist/server/server/speech/audio.js +101 -0
- package/dist/server/server/speech/audio.js.map +1 -0
- package/dist/server/server/speech/provider-resolver.d.ts +3 -0
- package/dist/server/server/speech/provider-resolver.d.ts.map +1 -0
- package/dist/server/server/speech/provider-resolver.js +7 -0
- package/dist/server/server/speech/provider-resolver.js.map +1 -0
- package/dist/server/server/speech/providers/local/config.d.ts +30 -0
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/config.js +134 -0
- package/dist/server/server/speech/providers/local/config.js.map +1 -0
- package/dist/server/server/speech/providers/local/models.d.ts +11 -0
- package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/models.js +17 -0
- package/dist/server/server/speech/providers/local/models.js.map +1 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +459 -0
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/runtime.js +278 -0
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +169 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +167 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +56 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +91 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +116 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +141 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +115 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js.map +1 -0
- package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
- package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/config.js +107 -0
- package/dist/server/server/speech/providers/openai/config.js.map +1 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +168 -0
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/runtime.js +117 -0
- package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/stt.js +207 -0
- package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
- package/dist/server/server/speech/providers/openai/tts.js +47 -0
- package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
- package/dist/server/server/speech/speech-config-resolver.js +132 -0
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
- package/dist/server/server/speech/speech-provider.d.ts +59 -0
- package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-provider.js.map +1 -0
- package/dist/server/server/speech/speech-runtime.d.ts +45 -0
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
- package/dist/server/server/speech/speech-runtime.js +562 -0
- package/dist/server/server/speech/speech-runtime.js.map +1 -0
- package/dist/server/server/speech/speech-types.d.ts +24 -0
- package/dist/server/server/speech/speech-types.d.ts.map +1 -0
- package/dist/server/server/speech/speech-types.js +8 -0
- package/dist/server/server/speech/speech-types.js.map +1 -0
- package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
- package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -0
- package/dist/server/server/speech/turn-detection-provider.js +2 -0
- package/dist/server/server/speech/turn-detection-provider.js.map +1 -0
- package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
- package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
- package/dist/server/server/utils/diff-highlighter.js +279 -0
- package/dist/server/server/utils/diff-highlighter.js.map +1 -0
- package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -0
- package/dist/server/server/voice/voice-turn-controller.js +393 -0
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -0
- package/dist/server/server/voice-config.d.ts +15 -0
- package/dist/server/server/voice-config.d.ts.map +1 -0
- package/dist/server/server/voice-config.js +54 -0
- package/dist/server/server/voice-config.js.map +1 -0
- package/dist/server/server/voice-permission-policy.d.ts +4 -0
- package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
- package/dist/server/server/voice-permission-policy.js +13 -0
- package/dist/server/server/voice-permission-policy.js.map +1 -0
- package/dist/server/server/voice-types.d.ts +12 -0
- package/dist/server/server/voice-types.d.ts.map +1 -0
- package/dist/server/server/voice-types.js +2 -0
- package/dist/server/server/voice-types.js.map +1 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
- package/dist/server/server/websocket-server.d.ts +153 -0
- package/dist/server/server/websocket-server.d.ts.map +1 -0
- package/dist/server/server/websocket-server.js +1300 -0
- package/dist/server/server/websocket-server.js.map +1 -0
- package/dist/server/server/workspace-archive-service.d.ts +8 -0
- package/dist/server/server/workspace-archive-service.d.ts.map +1 -0
- package/dist/server/server/workspace-archive-service.js +17 -0
- package/dist/server/server/workspace-archive-service.js.map +1 -0
- package/dist/server/server/workspace-directory.d.ts +67 -0
- package/dist/server/server/workspace-directory.d.ts.map +1 -0
- package/dist/server/server/workspace-directory.js +214 -0
- package/dist/server/server/workspace-directory.js.map +1 -0
- package/dist/server/server/workspace-git-metadata.d.ts +24 -0
- package/dist/server/server/workspace-git-metadata.d.ts.map +1 -0
- package/dist/server/server/workspace-git-metadata.js +55 -0
- package/dist/server/server/workspace-git-metadata.js.map +1 -0
- package/dist/server/server/workspace-git-service.d.ts +257 -0
- package/dist/server/server/workspace-git-service.d.ts.map +1 -0
- package/dist/server/server/workspace-git-service.js +1277 -0
- package/dist/server/server/workspace-git-service.js.map +1 -0
- package/dist/server/server/workspace-reconciliation-service.d.ts +58 -0
- package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -0
- package/dist/server/server/workspace-reconciliation-service.js +274 -0
- package/dist/server/server/workspace-reconciliation-service.js.map +1 -0
- package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
- package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -0
- package/dist/server/server/workspace-registry-bootstrap.js +108 -0
- package/dist/server/server/workspace-registry-bootstrap.js.map +1 -0
- package/dist/server/server/workspace-registry-model.d.ts +55 -0
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -0
- package/dist/server/server/workspace-registry-model.js +191 -0
- package/dist/server/server/workspace-registry-model.js.map +1 -0
- package/dist/server/server/workspace-registry.d.ts +135 -0
- package/dist/server/server/workspace-registry.d.ts.map +1 -0
- package/dist/server/server/workspace-registry.js +162 -0
- package/dist/server/server/workspace-registry.js.map +1 -0
- package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
- package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -0
- package/dist/server/server/workspace-script-runtime-store.js +78 -0
- package/dist/server/server/workspace-script-runtime-store.js.map +1 -0
- package/dist/server/server/workspace-service-env.d.ts +17 -0
- package/dist/server/server/workspace-service-env.d.ts.map +1 -0
- package/dist/server/server/workspace-service-env.js +80 -0
- package/dist/server/server/workspace-service-env.js.map +1 -0
- package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
- package/dist/server/server/workspace-service-port-registry.d.ts.map +1 -0
- package/dist/server/server/workspace-service-port-registry.js +59 -0
- package/dist/server/server/workspace-service-port-registry.js.map +1 -0
- package/dist/server/server/worktree-bootstrap.d.ts +74 -0
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -0
- package/dist/server/server/worktree-bootstrap.js +716 -0
- package/dist/server/server/worktree-bootstrap.js.map +1 -0
- package/dist/server/server/worktree-branch-name-generator.d.ts +21 -0
- package/dist/server/server/worktree-branch-name-generator.d.ts.map +1 -0
- package/dist/server/server/worktree-branch-name-generator.js +59 -0
- package/dist/server/server/worktree-branch-name-generator.js.map +1 -0
- package/dist/server/server/worktree-core.d.ts +29 -0
- package/dist/server/server/worktree-core.d.ts.map +1 -0
- package/dist/server/server/worktree-core.js +99 -0
- package/dist/server/server/worktree-core.js.map +1 -0
- package/dist/server/server/worktree-errors.d.ts +12 -0
- package/dist/server/server/worktree-errors.d.ts.map +1 -0
- package/dist/server/server/worktree-errors.js +28 -0
- package/dist/server/server/worktree-errors.js.map +1 -0
- package/dist/server/server/worktree-session.d.ts +149 -0
- package/dist/server/server/worktree-session.d.ts.map +1 -0
- package/dist/server/server/worktree-session.js +464 -0
- package/dist/server/server/worktree-session.js.map +1 -0
- package/dist/server/services/github-service.d.ts +279 -0
- package/dist/server/services/github-service.d.ts.map +1 -0
- package/dist/server/services/github-service.js +1666 -0
- package/dist/server/services/github-service.js.map +1 -0
- package/dist/server/shared/agent-attention-notification.d.ts +41 -0
- package/dist/server/shared/agent-attention-notification.d.ts.map +1 -0
- package/dist/server/shared/agent-attention-notification.js +140 -0
- package/dist/server/shared/agent-attention-notification.js.map +1 -0
- package/dist/server/shared/agent-labels.d.ts +2 -0
- package/dist/server/shared/agent-labels.d.ts.map +1 -0
- package/dist/server/shared/agent-labels.js +2 -0
- package/dist/server/shared/agent-labels.js.map +1 -0
- package/dist/server/shared/agent-lifecycle.d.ts +3 -0
- package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
- package/dist/server/shared/agent-lifecycle.js +8 -0
- package/dist/server/shared/agent-lifecycle.js.map +1 -0
- package/dist/server/shared/agent-state-bucket.d.ts +13 -0
- package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
- package/dist/server/shared/agent-state-bucket.js +41 -0
- package/dist/server/shared/agent-state-bucket.js.map +1 -0
- package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
- package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
- package/dist/server/shared/binary-frames/file-transfer.js +108 -0
- package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
- package/dist/server/shared/binary-frames/index.d.ts +3 -0
- package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
- package/dist/server/shared/binary-frames/index.js +3 -0
- package/dist/server/shared/binary-frames/index.js.map +1 -0
- package/dist/server/shared/binary-frames/terminal.d.ts +36 -0
- package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
- package/dist/server/shared/binary-frames/terminal.js +99 -0
- package/dist/server/shared/binary-frames/terminal.js.map +1 -0
- package/dist/server/shared/client-capabilities.d.ts +5 -0
- package/dist/server/shared/client-capabilities.d.ts.map +1 -0
- package/dist/server/shared/client-capabilities.js +4 -0
- package/dist/server/shared/client-capabilities.js.map +1 -0
- package/dist/server/shared/connection-offer.d.ts +80 -0
- package/dist/server/shared/connection-offer.d.ts.map +1 -0
- package/dist/server/shared/connection-offer.js +53 -0
- package/dist/server/shared/connection-offer.js.map +1 -0
- package/dist/server/shared/daemon-endpoints.d.ts +47 -0
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
- package/dist/server/shared/daemon-endpoints.js +201 -0
- package/dist/server/shared/daemon-endpoints.js.map +1 -0
- package/dist/server/shared/error-utils.d.ts +11 -0
- package/dist/server/shared/error-utils.d.ts.map +1 -0
- package/dist/server/shared/error-utils.js +27 -0
- package/dist/server/shared/error-utils.js.map +1 -0
- package/dist/server/shared/git-remote.d.ts +16 -0
- package/dist/server/shared/git-remote.d.ts.map +1 -0
- package/dist/server/shared/git-remote.js +72 -0
- package/dist/server/shared/git-remote.js.map +1 -0
- package/dist/server/shared/host-connection-schema.d.ts +23 -0
- package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
- package/dist/server/shared/host-connection-schema.js +9 -0
- package/dist/server/shared/host-connection-schema.js.map +1 -0
- package/dist/server/shared/importable-providers.d.ts +7 -0
- package/dist/server/shared/importable-providers.d.ts.map +1 -0
- package/dist/server/shared/importable-providers.js +7 -0
- package/dist/server/shared/importable-providers.js.map +1 -0
- package/dist/server/shared/literal-union.d.ts +2 -0
- package/dist/server/shared/literal-union.d.ts.map +1 -0
- package/dist/server/shared/literal-union.js +2 -0
- package/dist/server/shared/literal-union.js.map +1 -0
- package/dist/server/shared/messages.d.ts +140180 -0
- package/dist/server/shared/messages.d.ts.map +1 -0
- package/dist/server/shared/messages.js +3259 -0
- package/dist/server/shared/messages.js.map +1 -0
- package/dist/server/shared/path-utils.d.ts +2 -0
- package/dist/server/shared/path-utils.d.ts.map +1 -0
- package/dist/server/shared/path-utils.js +16 -0
- package/dist/server/shared/path-utils.js.map +1 -0
- package/dist/server/shared/terminal-input-mode.d.ts +26 -0
- package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
- package/dist/server/shared/terminal-input-mode.js +151 -0
- package/dist/server/shared/terminal-input-mode.js.map +1 -0
- package/dist/server/shared/tool-call-display.d.ts +11 -0
- package/dist/server/shared/tool-call-display.d.ts.map +1 -0
- package/dist/server/shared/tool-call-display.js +135 -0
- package/dist/server/shared/tool-call-display.js.map +1 -0
- package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/server/terminal/terminal-capture.d.ts +12 -0
- package/dist/server/terminal/terminal-capture.d.ts.map +1 -0
- package/dist/server/terminal/terminal-capture.js +43 -0
- package/dist/server/terminal/terminal-capture.js.map +1 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts +3 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
- package/dist/server/terminal/terminal-manager-factory.js +5 -0
- package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
- package/dist/server/terminal/terminal-manager.d.ts +47 -0
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
- package/dist/server/terminal/terminal-manager.js +183 -0
- package/dist/server/terminal/terminal-manager.js.map +1 -0
- package/dist/server/terminal/terminal-output-coalescer.d.ts +30 -0
- package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -0
- package/dist/server/terminal/terminal-output-coalescer.js +55 -0
- package/dist/server/terminal/terminal-output-coalescer.js.map +1 -0
- package/dist/server/terminal/terminal-session-controller.d.ts +64 -0
- package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
- package/dist/server/terminal/terminal-session-controller.js +653 -0
- package/dist/server/terminal/terminal-session-controller.js.map +1 -0
- package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
- package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
- package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
- package/dist/server/terminal/terminal-worker-process.js +221 -0
- package/dist/server/terminal/terminal-worker-process.js.map +1 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
- package/dist/server/terminal/terminal-worker-protocol.js +2 -0
- package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
- package/dist/server/terminal/terminal.d.ts +99 -0
- package/dist/server/terminal/terminal.d.ts.map +1 -0
- package/dist/server/terminal/terminal.js +877 -0
- package/dist/server/terminal/terminal.js.map +1 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
- package/dist/server/terminal/worker-terminal-manager.js +492 -0
- package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
- package/dist/server/utils/branch-slug.d.ts +14 -0
- package/dist/server/utils/branch-slug.d.ts.map +1 -0
- package/dist/server/utils/branch-slug.js +49 -0
- package/dist/server/utils/branch-slug.js.map +1 -0
- package/dist/server/utils/build-metadata-prompt.d.ts +14 -0
- package/dist/server/utils/build-metadata-prompt.d.ts.map +1 -0
- package/dist/server/utils/build-metadata-prompt.js +28 -0
- package/dist/server/utils/build-metadata-prompt.js.map +1 -0
- package/dist/server/utils/checkout-git.d.ts +213 -0
- package/dist/server/utils/checkout-git.d.ts.map +1 -0
- package/dist/server/utils/checkout-git.js +1885 -0
- package/dist/server/utils/checkout-git.js.map +1 -0
- package/dist/server/utils/directory-suggestions.d.ts +26 -0
- package/dist/server/utils/directory-suggestions.d.ts.map +1 -0
- package/dist/server/utils/directory-suggestions.js +732 -0
- package/dist/server/utils/directory-suggestions.js.map +1 -0
- package/dist/server/utils/executable.d.ts +10 -0
- package/dist/server/utils/executable.d.ts.map +1 -0
- package/dist/server/utils/executable.js +116 -0
- package/dist/server/utils/executable.js.map +1 -0
- package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
- package/dist/server/utils/git-rev-parse-path.d.ts.map +1 -0
- package/dist/server/utils/git-rev-parse-path.js +21 -0
- package/dist/server/utils/git-rev-parse-path.js.map +1 -0
- package/dist/server/utils/github-remote.d.ts +9 -0
- package/dist/server/utils/github-remote.d.ts.map +1 -0
- package/dist/server/utils/github-remote.js +62 -0
- package/dist/server/utils/github-remote.js.map +1 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/paseo-config-file.js.map +1 -0
- package/dist/server/utils/paseo-config-schema.d.ts +915 -0
- package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-schema.js +77 -0
- package/dist/server/utils/paseo-config-schema.js.map +1 -0
- package/dist/server/utils/path.d.ts +16 -0
- package/dist/server/utils/path.d.ts.map +1 -0
- package/dist/server/utils/path.js +110 -0
- package/dist/server/utils/path.js.map +1 -0
- package/dist/server/utils/project-icon.d.ts +39 -0
- package/dist/server/utils/project-icon.d.ts.map +1 -0
- package/dist/server/utils/project-icon.js +364 -0
- package/dist/server/utils/project-icon.js.map +1 -0
- package/dist/server/utils/promise-timeout.d.ts +9 -0
- package/dist/server/utils/promise-timeout.d.ts.map +1 -0
- package/dist/server/utils/promise-timeout.js +25 -0
- package/dist/server/utils/promise-timeout.js.map +1 -0
- package/dist/server/utils/run-git-command.d.ts +20 -0
- package/dist/server/utils/run-git-command.d.ts.map +1 -0
- package/dist/server/utils/run-git-command.js +146 -0
- package/dist/server/utils/run-git-command.js.map +1 -0
- package/dist/server/utils/script-hostname.d.ts +8 -0
- package/dist/server/utils/script-hostname.d.ts.map +1 -0
- package/dist/server/utils/script-hostname.js +14 -0
- package/dist/server/utils/script-hostname.js.map +1 -0
- package/dist/server/utils/spawn.d.ts +33 -0
- package/dist/server/utils/spawn.d.ts.map +1 -0
- package/dist/server/utils/spawn.js +71 -0
- package/dist/server/utils/spawn.js.map +1 -0
- package/dist/server/utils/string-command-shell.d.ts +10 -0
- package/dist/server/utils/string-command-shell.d.ts.map +1 -0
- package/dist/server/utils/string-command-shell.js +21 -0
- package/dist/server/utils/string-command-shell.js.map +1 -0
- package/dist/server/utils/tree-kill.d.ts +18 -0
- package/dist/server/utils/tree-kill.d.ts.map +1 -0
- package/dist/server/utils/tree-kill.js +77 -0
- package/dist/server/utils/tree-kill.js.map +1 -0
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.d.ts.map +1 -0
- package/dist/server/utils/windows-command.js +41 -0
- package/dist/server/utils/windows-command.js.map +1 -0
- package/dist/server/utils/worktree-metadata.d.ts +91 -0
- package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
- package/dist/server/utils/worktree-metadata.js +174 -0
- package/dist/server/utils/worktree-metadata.js.map +1 -0
- package/dist/server/utils/worktree.d.ts +195 -0
- package/dist/server/utils/worktree.d.ts.map +1 -0
- package/dist/server/utils/worktree.js +1004 -0
- package/dist/server/utils/worktree.js.map +1 -0
- package/dist/server/utils/wrap-user-instructions.d.ts +2 -0
- package/dist/server/utils/wrap-user-instructions.d.ts.map +1 -0
- package/dist/server/utils/wrap-user-instructions.js +13 -0
- package/dist/server/utils/wrap-user-instructions.js.map +1 -0
- package/dist/src/server/agent/agent-sdk-types.js +22 -0
- package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
- package/dist/src/server/agent/agent-title-limits.js +3 -0
- package/dist/src/server/agent/agent-title-limits.js.map +1 -0
- package/dist/src/server/agent/provider-launch-config.js +190 -0
- package/dist/src/server/agent/provider-launch-config.js.map +1 -0
- package/dist/src/server/agent/provider-manifest.js +211 -0
- package/dist/src/server/agent/provider-manifest.js.map +1 -0
- package/dist/src/server/chat/chat-rpc-schemas.js +103 -0
- package/dist/src/server/chat/chat-rpc-schemas.js.map +1 -0
- package/dist/src/server/chat/chat-types.js +22 -0
- package/dist/src/server/chat/chat-types.js.map +1 -0
- package/dist/src/server/loop/rpc-schemas.js +163 -0
- package/dist/src/server/loop/rpc-schemas.js.map +1 -0
- package/dist/src/server/paseo-env.js +53 -0
- package/dist/src/server/paseo-env.js.map +1 -0
- package/dist/src/server/paseo-home.js +19 -0
- package/dist/src/server/paseo-home.js.map +1 -0
- package/dist/src/server/persisted-config.js +398 -0
- package/dist/src/server/persisted-config.js.map +1 -0
- package/dist/src/server/pid-lock.js +170 -0
- package/dist/src/server/pid-lock.js.map +1 -0
- package/dist/src/server/private-files.js +42 -0
- package/dist/src/server/private-files.js.map +1 -0
- package/dist/src/server/schedule/rpc-schemas.js +151 -0
- package/dist/src/server/schedule/rpc-schemas.js.map +1 -0
- package/dist/src/server/schedule/types.js +73 -0
- package/dist/src/server/schedule/types.js.map +1 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
- package/dist/src/shared/agent-lifecycle.js +8 -0
- package/dist/src/shared/agent-lifecycle.js.map +1 -0
- package/dist/src/shared/client-capabilities.js +4 -0
- package/dist/src/shared/client-capabilities.js.map +1 -0
- package/dist/src/shared/literal-union.js +2 -0
- package/dist/src/shared/literal-union.js.map +1 -0
- package/dist/src/shared/messages.js +3259 -0
- package/dist/src/shared/messages.js.map +1 -0
- package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/src/utils/executable.js +116 -0
- package/dist/src/utils/executable.js.map +1 -0
- package/dist/src/utils/paseo-config-schema.js +77 -0
- package/dist/src/utils/paseo-config-schema.js.map +1 -0
- package/dist/src/utils/spawn.js +71 -0
- package/dist/src/utils/spawn.js.map +1 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/dist/src/utils/windows-command.js.map +1 -0
- package/package.json +115 -0
- package/src/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
|
@@ -0,0 +1,1885 @@
|
|
|
1
|
+
import { resolve, dirname, basename } from "path";
|
|
2
|
+
import { existsSync, realpathSync } from "fs";
|
|
3
|
+
import { open as openFile, readFile, stat as statFile } from "fs/promises";
|
|
4
|
+
import { TTLCache } from "@isaacs/ttlcache";
|
|
5
|
+
import { parseAndHighlightDiff } from "../server/utils/diff-highlighter.js";
|
|
6
|
+
import { parseGitHubRepoFromRemote } from "../server/workspace-git-metadata.js";
|
|
7
|
+
import { GitHubAuthenticationError, GitHubCliMissingError, GitHubCommandError, createGitHubService, resolveGitHubRepo, } from "../services/github-service.js";
|
|
8
|
+
import { parseGitRevParsePath, resolveGitRevParsePath } from "./git-rev-parse-path.js";
|
|
9
|
+
import { runGitCommand } from "./run-git-command.js";
|
|
10
|
+
import { isPaseoOwnedWorktreeCwd } from "./worktree.js";
|
|
11
|
+
import { readPaseoWorktreeMetadata } from "./worktree-metadata.js";
|
|
12
|
+
const READ_ONLY_GIT_ENV = {
|
|
13
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
14
|
+
};
|
|
15
|
+
const DEFAULT_PULL_REQUEST_STATUS_CACHE_TTL_MS = 30000;
|
|
16
|
+
const PULL_REQUEST_STATUS_CACHE_MAX = 1000;
|
|
17
|
+
const DEFAULT_SHORTSTAT_CACHE_TTL_MS = 15000;
|
|
18
|
+
const SHORTSTAT_CACHE_MAX = 1000;
|
|
19
|
+
let pullRequestStatusCacheTtlMs = DEFAULT_PULL_REQUEST_STATUS_CACHE_TTL_MS;
|
|
20
|
+
let pullRequestStatusCache = createPullRequestStatusCache(pullRequestStatusCacheTtlMs);
|
|
21
|
+
const pullRequestStatusInFlight = new Map();
|
|
22
|
+
const lastSuccessfulPullRequestStatus = new Map();
|
|
23
|
+
let shortstatCacheTtlMs = DEFAULT_SHORTSTAT_CACHE_TTL_MS;
|
|
24
|
+
let shortstatCache = createShortstatCache(shortstatCacheTtlMs);
|
|
25
|
+
const shortstatInFlight = new Map();
|
|
26
|
+
function getErrorStderr(error) {
|
|
27
|
+
return "stderr" in error && typeof error.stderr === "string" ? error.stderr : "";
|
|
28
|
+
}
|
|
29
|
+
function getErrorStdout(error) {
|
|
30
|
+
return "stdout" in error && typeof error.stdout === "string" ? error.stdout : "";
|
|
31
|
+
}
|
|
32
|
+
function throwBranchNotFound(branch) {
|
|
33
|
+
throw new Error(`Branch not found: ${branch ?? "unknown"}`);
|
|
34
|
+
}
|
|
35
|
+
function createPullRequestStatusCache(ttlMs) {
|
|
36
|
+
return new TTLCache({
|
|
37
|
+
ttl: ttlMs,
|
|
38
|
+
max: PULL_REQUEST_STATUS_CACHE_MAX,
|
|
39
|
+
checkAgeOnGet: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function createShortstatCache(ttlMs) {
|
|
43
|
+
return new TTLCache({
|
|
44
|
+
ttl: ttlMs,
|
|
45
|
+
max: SHORTSTAT_CACHE_MAX,
|
|
46
|
+
checkAgeOnGet: true,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function getPullRequestStatusCacheKey(cwd) {
|
|
50
|
+
return resolve(cwd);
|
|
51
|
+
}
|
|
52
|
+
function rememberPullRequestStatus(cacheKey, status) {
|
|
53
|
+
lastSuccessfulPullRequestStatus.set(cacheKey, status);
|
|
54
|
+
if (lastSuccessfulPullRequestStatus.size <= PULL_REQUEST_STATUS_CACHE_MAX) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const oldest = lastSuccessfulPullRequestStatus.keys().next();
|
|
58
|
+
if (!oldest.done) {
|
|
59
|
+
lastSuccessfulPullRequestStatus.delete(oldest.value);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getShortstatCacheKey(cwd) {
|
|
63
|
+
return resolve(cwd);
|
|
64
|
+
}
|
|
65
|
+
export function __resetPullRequestStatusCacheForTests() {
|
|
66
|
+
pullRequestStatusCache.clear();
|
|
67
|
+
pullRequestStatusCache.cancelTimer();
|
|
68
|
+
pullRequestStatusCacheTtlMs = DEFAULT_PULL_REQUEST_STATUS_CACHE_TTL_MS;
|
|
69
|
+
pullRequestStatusCache = createPullRequestStatusCache(pullRequestStatusCacheTtlMs);
|
|
70
|
+
pullRequestStatusInFlight.clear();
|
|
71
|
+
lastSuccessfulPullRequestStatus.clear();
|
|
72
|
+
}
|
|
73
|
+
export function __setPullRequestStatusCacheTtlForTests(ttlMs) {
|
|
74
|
+
pullRequestStatusCache.clear();
|
|
75
|
+
pullRequestStatusCache.cancelTimer();
|
|
76
|
+
pullRequestStatusCacheTtlMs = ttlMs;
|
|
77
|
+
pullRequestStatusCache = createPullRequestStatusCache(ttlMs);
|
|
78
|
+
pullRequestStatusInFlight.clear();
|
|
79
|
+
lastSuccessfulPullRequestStatus.clear();
|
|
80
|
+
}
|
|
81
|
+
export function __resetCheckoutShortstatCacheForTests() {
|
|
82
|
+
shortstatCache.clear();
|
|
83
|
+
shortstatCache.cancelTimer();
|
|
84
|
+
shortstatCacheTtlMs = DEFAULT_SHORTSTAT_CACHE_TTL_MS;
|
|
85
|
+
shortstatCache = createShortstatCache(shortstatCacheTtlMs);
|
|
86
|
+
shortstatInFlight.clear();
|
|
87
|
+
}
|
|
88
|
+
export function __setCheckoutShortstatCacheTtlForTests(ttlMs) {
|
|
89
|
+
shortstatCache.clear();
|
|
90
|
+
shortstatCache.cancelTimer();
|
|
91
|
+
shortstatCacheTtlMs = ttlMs;
|
|
92
|
+
shortstatCache = createShortstatCache(ttlMs);
|
|
93
|
+
shortstatInFlight.clear();
|
|
94
|
+
}
|
|
95
|
+
function getCheckoutDiffRefArgs(refs) {
|
|
96
|
+
return [refs.baseRef, ...(refs.targetRef ? [refs.targetRef] : [])];
|
|
97
|
+
}
|
|
98
|
+
function normalizeBranchSuggestionName(raw) {
|
|
99
|
+
const trimmed = raw.trim();
|
|
100
|
+
if (!trimmed) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
let normalized = trimmed;
|
|
104
|
+
if (normalized.startsWith("refs/heads/")) {
|
|
105
|
+
normalized = normalized.slice("refs/heads/".length);
|
|
106
|
+
}
|
|
107
|
+
else if (normalized.startsWith("refs/remotes/")) {
|
|
108
|
+
normalized = normalized.slice("refs/remotes/".length);
|
|
109
|
+
}
|
|
110
|
+
if (normalized.startsWith("origin/")) {
|
|
111
|
+
normalized = normalized.slice("origin/".length);
|
|
112
|
+
}
|
|
113
|
+
if (!normalized || normalized === "HEAD" || normalized === "origin") {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return normalized;
|
|
117
|
+
}
|
|
118
|
+
async function listGitRefs(cwd, refPrefix) {
|
|
119
|
+
const { stdout } = await runGitCommand([
|
|
120
|
+
"for-each-ref",
|
|
121
|
+
"--sort=-committerdate",
|
|
122
|
+
"--format=%(refname)%09%(committerdate:unix)",
|
|
123
|
+
refPrefix,
|
|
124
|
+
], { cwd, envOverlay: READ_ONLY_GIT_ENV });
|
|
125
|
+
return stdout
|
|
126
|
+
.split("\n")
|
|
127
|
+
.map((line) => {
|
|
128
|
+
const trimmed = line.trim();
|
|
129
|
+
if (!trimmed)
|
|
130
|
+
return null;
|
|
131
|
+
const [name, dateStr] = trimmed.split("\t");
|
|
132
|
+
if (!name)
|
|
133
|
+
return null;
|
|
134
|
+
return { name, committerDate: Number(dateStr) || 0 };
|
|
135
|
+
})
|
|
136
|
+
.filter((ref) => ref !== null);
|
|
137
|
+
}
|
|
138
|
+
function sortBranchSuggestions(branchNames, branchMeta, query) {
|
|
139
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
140
|
+
const hasQuery = normalizedQuery.length > 0;
|
|
141
|
+
return branchNames.sort((a, b) => {
|
|
142
|
+
if (hasQuery) {
|
|
143
|
+
const aPrefix = a.toLowerCase().startsWith(normalizedQuery);
|
|
144
|
+
const bPrefix = b.toLowerCase().startsWith(normalizedQuery);
|
|
145
|
+
if (aPrefix !== bPrefix) {
|
|
146
|
+
return aPrefix ? -1 : 1;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const aMeta = branchMeta.get(a);
|
|
150
|
+
const bMeta = branchMeta.get(b);
|
|
151
|
+
const aDate = aMeta?.committerDate ?? 0;
|
|
152
|
+
const bDate = bMeta?.committerDate ?? 0;
|
|
153
|
+
if (aDate !== bDate) {
|
|
154
|
+
return bDate - aDate;
|
|
155
|
+
}
|
|
156
|
+
return a.localeCompare(b);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
export async function listBranchSuggestions(cwd, options) {
|
|
160
|
+
await requireGitRepo(cwd);
|
|
161
|
+
const requestedLimit = options?.limit ?? 50;
|
|
162
|
+
const limit = Math.max(1, Math.min(200, requestedLimit));
|
|
163
|
+
const query = options?.query?.trim().toLowerCase() ?? "";
|
|
164
|
+
const [localRefs, remoteRefs] = await Promise.all([
|
|
165
|
+
listGitRefs(cwd, "refs/heads"),
|
|
166
|
+
listGitRefs(cwd, "refs/remotes/origin"),
|
|
167
|
+
]);
|
|
168
|
+
const branchMeta = new Map();
|
|
169
|
+
for (const ref of localRefs) {
|
|
170
|
+
const normalized = normalizeBranchSuggestionName(ref.name);
|
|
171
|
+
if (!normalized)
|
|
172
|
+
continue;
|
|
173
|
+
const existing = branchMeta.get(normalized);
|
|
174
|
+
branchMeta.set(normalized, {
|
|
175
|
+
hasLocal: true,
|
|
176
|
+
hasRemote: existing?.hasRemote ?? false,
|
|
177
|
+
committerDate: Math.max(ref.committerDate, existing?.committerDate ?? 0),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
for (const ref of remoteRefs) {
|
|
181
|
+
const normalized = normalizeBranchSuggestionName(ref.name);
|
|
182
|
+
if (!normalized)
|
|
183
|
+
continue;
|
|
184
|
+
const existing = branchMeta.get(normalized);
|
|
185
|
+
if (!existing) {
|
|
186
|
+
branchMeta.set(normalized, {
|
|
187
|
+
hasLocal: false,
|
|
188
|
+
hasRemote: true,
|
|
189
|
+
committerDate: ref.committerDate,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
branchMeta.set(normalized, {
|
|
194
|
+
...existing,
|
|
195
|
+
hasRemote: true,
|
|
196
|
+
committerDate: Math.max(ref.committerDate, existing.committerDate),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const filteredNames = Array.from(branchMeta.keys()).filter((name) => query ? name.toLowerCase().includes(query) : true);
|
|
201
|
+
if (filteredNames.length === 0) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
const ordered = sortBranchSuggestions(filteredNames, branchMeta, query);
|
|
205
|
+
return ordered.slice(0, limit).map((name) => {
|
|
206
|
+
const meta = branchMeta.get(name);
|
|
207
|
+
return {
|
|
208
|
+
name,
|
|
209
|
+
committerDate: meta?.committerDate ?? 0,
|
|
210
|
+
hasLocal: meta?.hasLocal ?? false,
|
|
211
|
+
hasRemote: meta?.hasRemote ?? false,
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
export async function resolveBranchCheckout(cwd, name) {
|
|
216
|
+
await requireGitRepo(cwd);
|
|
217
|
+
const normalized = normalizeBranchSuggestionName(name);
|
|
218
|
+
if (!normalized) {
|
|
219
|
+
return { kind: "not-found" };
|
|
220
|
+
}
|
|
221
|
+
const localRef = `refs/heads/${normalized}`;
|
|
222
|
+
const localResult = await runGitCommand(["rev-parse", "--verify", "--quiet", localRef], {
|
|
223
|
+
cwd,
|
|
224
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
225
|
+
acceptExitCodes: [0, 1],
|
|
226
|
+
});
|
|
227
|
+
const hasLocal = localResult.exitCode === 0;
|
|
228
|
+
if (hasLocal) {
|
|
229
|
+
return { kind: "local", name: normalized };
|
|
230
|
+
}
|
|
231
|
+
const remoteRef = `origin/${normalized}`;
|
|
232
|
+
const remoteRefPath = `refs/remotes/${remoteRef}`;
|
|
233
|
+
const remoteResult = await runGitCommand(["rev-parse", "--verify", "--quiet", remoteRefPath], {
|
|
234
|
+
cwd,
|
|
235
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
236
|
+
acceptExitCodes: [0, 1],
|
|
237
|
+
});
|
|
238
|
+
const hasRemote = remoteResult.exitCode === 0;
|
|
239
|
+
if (hasRemote) {
|
|
240
|
+
return { kind: "remote-only", name: normalized, remoteRef };
|
|
241
|
+
}
|
|
242
|
+
return { kind: "not-found" };
|
|
243
|
+
}
|
|
244
|
+
export async function checkoutResolvedBranch(input) {
|
|
245
|
+
const { cwd, resolution } = input;
|
|
246
|
+
switch (resolution.kind) {
|
|
247
|
+
case "local": {
|
|
248
|
+
const { stdout } = await runGitCommand(["rev-parse", "--abbrev-ref", "HEAD"], { cwd });
|
|
249
|
+
const current = stdout.trim();
|
|
250
|
+
if (current === resolution.name) {
|
|
251
|
+
return { source: "local" };
|
|
252
|
+
}
|
|
253
|
+
await runGitCommand(["checkout", resolution.name], { cwd });
|
|
254
|
+
return { source: "local" };
|
|
255
|
+
}
|
|
256
|
+
case "remote-only":
|
|
257
|
+
await runGitCommand(["checkout", "-b", resolution.name, "--track", resolution.remoteRef], {
|
|
258
|
+
cwd,
|
|
259
|
+
});
|
|
260
|
+
return { source: "remote" };
|
|
261
|
+
default:
|
|
262
|
+
return throwBranchNotFound(input.requestedBranch);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async function listCheckoutFileChanges(cwd, refs, ignoreWhitespace = false) {
|
|
266
|
+
const changes = [];
|
|
267
|
+
const { stdout: nameStatusOut } = await runGitCommand(buildGitDiffArgs({
|
|
268
|
+
ignoreWhitespace,
|
|
269
|
+
extra: ["--name-status", ...getCheckoutDiffRefArgs(refs)],
|
|
270
|
+
}), { cwd, envOverlay: READ_ONLY_GIT_ENV });
|
|
271
|
+
for (const line of nameStatusOut
|
|
272
|
+
.split("\n")
|
|
273
|
+
.map((l) => l.trim())
|
|
274
|
+
.filter(Boolean)) {
|
|
275
|
+
// `--name-status` uses TAB separators, which preserves filenames with spaces.
|
|
276
|
+
const tabParts = line.split("\t");
|
|
277
|
+
const rawStatus = (tabParts[0] ?? "").trim();
|
|
278
|
+
if (!rawStatus)
|
|
279
|
+
continue;
|
|
280
|
+
if (rawStatus.startsWith("R") || rawStatus.startsWith("C")) {
|
|
281
|
+
const oldPath = tabParts[1];
|
|
282
|
+
const newPath = tabParts[2];
|
|
283
|
+
if (newPath) {
|
|
284
|
+
changes.push({
|
|
285
|
+
path: newPath,
|
|
286
|
+
...(oldPath ? { oldPath } : {}),
|
|
287
|
+
status: rawStatus,
|
|
288
|
+
isNew: false,
|
|
289
|
+
isDeleted: false,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const path = tabParts[1];
|
|
295
|
+
if (!path)
|
|
296
|
+
continue;
|
|
297
|
+
const code = rawStatus[0];
|
|
298
|
+
changes.push({
|
|
299
|
+
path,
|
|
300
|
+
status: rawStatus,
|
|
301
|
+
isNew: code === "A",
|
|
302
|
+
isDeleted: code === "D",
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (refs.includeUntracked) {
|
|
306
|
+
const { stdout: untrackedOut } = await runGitCommand(["ls-files", "--others", "--exclude-standard"], {
|
|
307
|
+
cwd,
|
|
308
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
309
|
+
});
|
|
310
|
+
for (const file of untrackedOut
|
|
311
|
+
.split("\n")
|
|
312
|
+
.map((l) => l.trim())
|
|
313
|
+
.filter(Boolean)) {
|
|
314
|
+
changes.push({
|
|
315
|
+
path: file,
|
|
316
|
+
status: "U",
|
|
317
|
+
isNew: true,
|
|
318
|
+
isDeleted: false,
|
|
319
|
+
isUntracked: true,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Deduplicate by path (prefer tracked status over untracked marker if both appear).
|
|
324
|
+
const byPath = new Map();
|
|
325
|
+
for (const change of changes) {
|
|
326
|
+
const existing = byPath.get(change.path);
|
|
327
|
+
if (!existing) {
|
|
328
|
+
byPath.set(change.path, change);
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (existing.isUntracked && !change.isUntracked) {
|
|
332
|
+
byPath.set(change.path, change);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return Array.from(byPath.values());
|
|
336
|
+
}
|
|
337
|
+
async function readGitFileContentAtRef(cwd, ref, path) {
|
|
338
|
+
try {
|
|
339
|
+
const { stdout } = await runGitCommand(["show", `${ref}:${path}`], {
|
|
340
|
+
cwd,
|
|
341
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
342
|
+
});
|
|
343
|
+
return stdout;
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async function tryResolveMergeBase(cwd, baseRef) {
|
|
350
|
+
try {
|
|
351
|
+
const { stdout } = await runGitCommand(["merge-base", baseRef, "HEAD"], {
|
|
352
|
+
cwd,
|
|
353
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
354
|
+
});
|
|
355
|
+
const sha = stdout.trim();
|
|
356
|
+
return sha.length > 0 ? sha : null;
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
function normalizeNumstatPath(pathField) {
|
|
363
|
+
const braceRenameMatch = pathField.match(/^(.*)\{(.*) => (.*)\}(.*)$/);
|
|
364
|
+
if (braceRenameMatch) {
|
|
365
|
+
const [, prefix, , renamed, suffix] = braceRenameMatch;
|
|
366
|
+
return `${prefix}${renamed}${suffix}`;
|
|
367
|
+
}
|
|
368
|
+
const inlineRenameMatch = pathField.match(/^(.*) => (.*)$/);
|
|
369
|
+
if (inlineRenameMatch) {
|
|
370
|
+
return inlineRenameMatch[2] ?? pathField;
|
|
371
|
+
}
|
|
372
|
+
return pathField;
|
|
373
|
+
}
|
|
374
|
+
function buildGitDiffArgs(args) {
|
|
375
|
+
return ["diff", ...(args.ignoreWhitespace ? ["-w"] : []), ...args.extra];
|
|
376
|
+
}
|
|
377
|
+
const TRACKED_DIFF_NUMSTAT_MAX_BYTES = 2 * 1024 * 1024; // 2MB
|
|
378
|
+
const TRACKED_MAX_CHANGED_LINES = 40000;
|
|
379
|
+
const EMPTY_TREE_OBJECT_ID = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
380
|
+
function isUnbornHeadDiffError(error) {
|
|
381
|
+
return (error instanceof Error &&
|
|
382
|
+
error.message.includes("--name-status HEAD") &&
|
|
383
|
+
error.message.includes("ambiguous argument 'HEAD'"));
|
|
384
|
+
}
|
|
385
|
+
async function getTrackedNumstatByPath(cwd, refs, ignoreWhitespace = false) {
|
|
386
|
+
const result = await runGitCommand(buildGitDiffArgs({
|
|
387
|
+
ignoreWhitespace,
|
|
388
|
+
extra: ["--numstat", ...getCheckoutDiffRefArgs(refs)],
|
|
389
|
+
}), {
|
|
390
|
+
cwd,
|
|
391
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
392
|
+
maxOutputBytes: TRACKED_DIFF_NUMSTAT_MAX_BYTES,
|
|
393
|
+
acceptExitCodes: [0],
|
|
394
|
+
});
|
|
395
|
+
const stats = new Map();
|
|
396
|
+
const lines = result.stdout
|
|
397
|
+
.split("\n")
|
|
398
|
+
.map((line) => line.trim())
|
|
399
|
+
.filter(Boolean);
|
|
400
|
+
for (const line of lines) {
|
|
401
|
+
const parts = line.split("\t");
|
|
402
|
+
if (parts.length < 3) {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
const additionsField = parts[0] ?? "";
|
|
406
|
+
const deletionsField = parts[1] ?? "";
|
|
407
|
+
const rawPath = parts.slice(2).join("\t");
|
|
408
|
+
const path = normalizeNumstatPath(rawPath);
|
|
409
|
+
if (!path) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
if (additionsField === "-" || deletionsField === "-") {
|
|
413
|
+
stats.set(path, { additions: 0, deletions: 0, isBinary: true });
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
const additions = Number.parseInt(additionsField, 10);
|
|
417
|
+
const deletions = Number.parseInt(deletionsField, 10);
|
|
418
|
+
if (Number.isNaN(additions) || Number.isNaN(deletions)) {
|
|
419
|
+
stats.set(path, null);
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
stats.set(path, { additions, deletions, isBinary: false });
|
|
423
|
+
}
|
|
424
|
+
return stats;
|
|
425
|
+
}
|
|
426
|
+
function isTrackedDiffTooLarge(stat) {
|
|
427
|
+
if (!stat || stat.isBinary) {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
return stat.additions + stat.deletions > TRACKED_MAX_CHANGED_LINES;
|
|
431
|
+
}
|
|
432
|
+
export class NotGitRepoError extends Error {
|
|
433
|
+
constructor(cwd) {
|
|
434
|
+
super(`Not a git repository: ${cwd}`);
|
|
435
|
+
this.code = "NOT_GIT_REPO";
|
|
436
|
+
this.name = "NotGitRepoError";
|
|
437
|
+
this.cwd = cwd;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
export class MergeConflictError extends Error {
|
|
441
|
+
constructor(options) {
|
|
442
|
+
super(`Merge conflict while merging ${options.currentBranch} into ${options.baseRef}`);
|
|
443
|
+
this.name = "MergeConflictError";
|
|
444
|
+
this.baseRef = options.baseRef;
|
|
445
|
+
this.currentBranch = options.currentBranch;
|
|
446
|
+
this.conflictFiles = options.conflictFiles;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
export class MergeFromBaseConflictError extends Error {
|
|
450
|
+
constructor(options) {
|
|
451
|
+
super(`Merge conflict while merging ${options.baseRef} into ${options.currentBranch}. Please merge manually.`);
|
|
452
|
+
this.name = "MergeFromBaseConflictError";
|
|
453
|
+
this.baseRef = options.baseRef;
|
|
454
|
+
this.currentBranch = options.currentBranch;
|
|
455
|
+
this.conflictFiles = options.conflictFiles;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
function isGitError(error) {
|
|
459
|
+
if (!(error instanceof Error)) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
return /not a git repository/i.test(error.message) || /git repository/i.test(error.message);
|
|
463
|
+
}
|
|
464
|
+
async function requireGitRepo(cwd) {
|
|
465
|
+
try {
|
|
466
|
+
await runGitCommand(["rev-parse", "--git-dir"], { cwd, envOverlay: READ_ONLY_GIT_ENV });
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
throw new NotGitRepoError(cwd);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
export async function getCurrentBranch(cwd) {
|
|
473
|
+
try {
|
|
474
|
+
const { stdout } = await runGitCommand(["rev-parse", "--abbrev-ref", "HEAD"], {
|
|
475
|
+
cwd,
|
|
476
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
477
|
+
});
|
|
478
|
+
const branch = stdout.trim();
|
|
479
|
+
if (branch === "HEAD") {
|
|
480
|
+
return await getRebaseHeadBranch(cwd);
|
|
481
|
+
}
|
|
482
|
+
return branch.length > 0 ? branch : null;
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
return null;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async function getRebaseHeadBranch(cwd) {
|
|
489
|
+
const paths = ["rebase-merge/head-name", "rebase-apply/head-name"];
|
|
490
|
+
const results = await Promise.all(paths.map(async (path) => {
|
|
491
|
+
try {
|
|
492
|
+
const { stdout } = await runGitCommand(["rev-parse", "--git-path", path], {
|
|
493
|
+
cwd,
|
|
494
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
495
|
+
});
|
|
496
|
+
const headName = (await readFile(resolve(cwd, stdout.trim()), "utf8")).trim();
|
|
497
|
+
if (headName.startsWith("refs/heads/")) {
|
|
498
|
+
return headName.slice("refs/heads/".length) || null;
|
|
499
|
+
}
|
|
500
|
+
return headName || null;
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
}));
|
|
506
|
+
return results.find((result) => result !== null) ?? null;
|
|
507
|
+
}
|
|
508
|
+
async function getWorktreeRoot(cwd, context) {
|
|
509
|
+
try {
|
|
510
|
+
const { stdout } = await runGitCommand(["rev-parse", "--show-toplevel"], {
|
|
511
|
+
cwd,
|
|
512
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
513
|
+
logger: context?.logger,
|
|
514
|
+
});
|
|
515
|
+
return parseGitRevParsePath(stdout);
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
export async function getMainRepoRoot(cwd) {
|
|
522
|
+
const { stdout: commonDirOut } = await runGitCommand(["rev-parse", "--git-common-dir"], {
|
|
523
|
+
cwd,
|
|
524
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
525
|
+
});
|
|
526
|
+
const commonDir = resolveGitRevParsePath(cwd, commonDirOut);
|
|
527
|
+
if (!commonDir) {
|
|
528
|
+
throw new Error("Not in a git repository");
|
|
529
|
+
}
|
|
530
|
+
const normalized = realpathSync(commonDir);
|
|
531
|
+
if (basename(normalized) === ".git") {
|
|
532
|
+
return dirname(normalized);
|
|
533
|
+
}
|
|
534
|
+
const { stdout: worktreeOut } = await runGitCommand(["worktree", "list", "--porcelain"], {
|
|
535
|
+
cwd,
|
|
536
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
537
|
+
});
|
|
538
|
+
const worktrees = parseWorktreeList(worktreeOut);
|
|
539
|
+
const nonBareNonPaseo = worktrees.filter((wt) => !wt.isBare && !isPaseoWorktreePath(wt.path));
|
|
540
|
+
const childrenOfBareRepo = nonBareNonPaseo.filter((wt) => isDescendantPath(wt.path, normalized));
|
|
541
|
+
const mainChild = childrenOfBareRepo.find((wt) => basename(wt.path) === "main");
|
|
542
|
+
return mainChild?.path ?? childrenOfBareRepo[0]?.path ?? nonBareNonPaseo[0]?.path ?? normalized;
|
|
543
|
+
}
|
|
544
|
+
/** Check whether a path contains a `.paseo/worktrees/` segment (both `/` and `\`). */
|
|
545
|
+
export function isPaseoWorktreePath(p) {
|
|
546
|
+
return /[/\\]\.paseo[/\\]worktrees[/\\]/.test(p);
|
|
547
|
+
}
|
|
548
|
+
/** True when `child` is strictly inside `parent` (handles both `/` and `\`). */
|
|
549
|
+
export function isDescendantPath(child, parent) {
|
|
550
|
+
let c = child.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
551
|
+
let p = parent.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
552
|
+
// Case-insensitive on Windows (drive letter like C: or D:)
|
|
553
|
+
if (/^[A-Za-z]:/.test(c) || /^[A-Za-z]:/.test(p)) {
|
|
554
|
+
c = c.toLowerCase();
|
|
555
|
+
p = p.toLowerCase();
|
|
556
|
+
}
|
|
557
|
+
if (!c.startsWith(p))
|
|
558
|
+
return false;
|
|
559
|
+
if (c.length === p.length)
|
|
560
|
+
return false;
|
|
561
|
+
return c[p.length] === "/";
|
|
562
|
+
}
|
|
563
|
+
export function parseWorktreeList(output) {
|
|
564
|
+
const entries = [];
|
|
565
|
+
let current = null;
|
|
566
|
+
for (const line of output.split("\n")) {
|
|
567
|
+
const trimmed = line.trim();
|
|
568
|
+
if (!trimmed) {
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
if (trimmed.startsWith("worktree ")) {
|
|
572
|
+
if (current) {
|
|
573
|
+
entries.push(current);
|
|
574
|
+
}
|
|
575
|
+
current = { path: trimmed.slice("worktree ".length).trim() };
|
|
576
|
+
continue;
|
|
577
|
+
}
|
|
578
|
+
if (current && trimmed.startsWith("branch ")) {
|
|
579
|
+
current.branchRef = trimmed.slice("branch ".length).trim();
|
|
580
|
+
}
|
|
581
|
+
if (current && trimmed === "bare") {
|
|
582
|
+
current.isBare = true;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
if (current) {
|
|
586
|
+
entries.push(current);
|
|
587
|
+
}
|
|
588
|
+
return entries;
|
|
589
|
+
}
|
|
590
|
+
async function getWorktreePathForBranch(cwd, branchName) {
|
|
591
|
+
try {
|
|
592
|
+
const { stdout } = await runGitCommand(["worktree", "list", "--porcelain"], {
|
|
593
|
+
cwd,
|
|
594
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
595
|
+
});
|
|
596
|
+
const entries = parseWorktreeList(stdout);
|
|
597
|
+
const ref = branchName.startsWith("refs/heads/") ? branchName : `refs/heads/${branchName}`;
|
|
598
|
+
return entries.find((entry) => entry.branchRef === ref)?.path ?? null;
|
|
599
|
+
}
|
|
600
|
+
catch {
|
|
601
|
+
return null;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
export async function localBranchExists(cwd, branchName) {
|
|
605
|
+
return doesGitRefExist(cwd, `refs/heads/${branchName}`);
|
|
606
|
+
}
|
|
607
|
+
export async function renameCurrentBranch(cwd, newName) {
|
|
608
|
+
await requireGitRepo(cwd);
|
|
609
|
+
const previousBranch = await getCurrentBranch(cwd);
|
|
610
|
+
if (!previousBranch || previousBranch === "HEAD") {
|
|
611
|
+
throw new Error("Cannot rename branch in detached HEAD state");
|
|
612
|
+
}
|
|
613
|
+
await runGitCommand(["branch", "-m", newName], {
|
|
614
|
+
cwd,
|
|
615
|
+
timeout: 120000,
|
|
616
|
+
});
|
|
617
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
618
|
+
return { previousBranch, currentBranch };
|
|
619
|
+
}
|
|
620
|
+
async function getPaseoWorktreeForCwd(cwd, context) {
|
|
621
|
+
// Fast-path reject: non-worktree paths do not need expensive ownership checks.
|
|
622
|
+
if (!/[\\/]worktrees[\\/]/.test(cwd)) {
|
|
623
|
+
return { isPaseoOwnedWorktree: false };
|
|
624
|
+
}
|
|
625
|
+
const ownership = await isPaseoOwnedWorktreeCwd(cwd, { paseoHome: context?.paseoHome });
|
|
626
|
+
if (!ownership.allowed) {
|
|
627
|
+
return { isPaseoOwnedWorktree: false };
|
|
628
|
+
}
|
|
629
|
+
return {
|
|
630
|
+
isPaseoOwnedWorktree: true,
|
|
631
|
+
worktreeRoot: (await getWorktreeRoot(cwd)) ?? cwd,
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
function readPaseoWorktreeBaseRef(worktreeRoot) {
|
|
635
|
+
return readPaseoWorktreeMetadata(worktreeRoot)?.baseRefName ?? null;
|
|
636
|
+
}
|
|
637
|
+
async function getStoredBaseRefForCwd(cwd, context) {
|
|
638
|
+
const paseoWorktree = await getPaseoWorktreeForCwd(cwd, context);
|
|
639
|
+
if (!paseoWorktree.isPaseoOwnedWorktree) {
|
|
640
|
+
return null;
|
|
641
|
+
}
|
|
642
|
+
return readPaseoWorktreeBaseRef(paseoWorktree.worktreeRoot);
|
|
643
|
+
}
|
|
644
|
+
async function getResolvedBaseRefForCwd(cwd, context) {
|
|
645
|
+
const { resolvedBaseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
646
|
+
return resolvedBaseRef;
|
|
647
|
+
}
|
|
648
|
+
async function resolveBaseRefForCwd(cwd, context) {
|
|
649
|
+
const storedBaseRef = await getStoredBaseRefForCwd(cwd, context);
|
|
650
|
+
return {
|
|
651
|
+
storedBaseRef,
|
|
652
|
+
resolvedBaseRef: storedBaseRef ?? (await resolveBaseRef(cwd)),
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
async function isWorkingTreeDirty(cwd, context) {
|
|
656
|
+
const { stdout } = await runGitCommand(["status", "--porcelain"], {
|
|
657
|
+
cwd,
|
|
658
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
659
|
+
logger: context?.logger,
|
|
660
|
+
});
|
|
661
|
+
return stdout.trim().length > 0;
|
|
662
|
+
}
|
|
663
|
+
export async function getOriginRemoteUrl(cwd) {
|
|
664
|
+
try {
|
|
665
|
+
const { stdout } = await runGitCommand(["config", "--get", "remote.origin.url"], {
|
|
666
|
+
cwd,
|
|
667
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
668
|
+
});
|
|
669
|
+
const url = stdout.trim();
|
|
670
|
+
return url.length > 0 ? url : null;
|
|
671
|
+
}
|
|
672
|
+
catch {
|
|
673
|
+
return null;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
export async function hasOriginRemote(cwd) {
|
|
677
|
+
const url = await getOriginRemoteUrl(cwd);
|
|
678
|
+
return url !== null;
|
|
679
|
+
}
|
|
680
|
+
async function getGitConfigValue(cwd, key, context) {
|
|
681
|
+
try {
|
|
682
|
+
const { stdout } = await runGitCommand(["config", "--get", key], {
|
|
683
|
+
cwd,
|
|
684
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
685
|
+
logger: context?.logger,
|
|
686
|
+
});
|
|
687
|
+
const value = stdout.trim();
|
|
688
|
+
return value.length > 0 ? value : null;
|
|
689
|
+
}
|
|
690
|
+
catch {
|
|
691
|
+
return null;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
function parseBranchMergeHeadRef(mergeRef) {
|
|
695
|
+
const prefix = "refs/heads/";
|
|
696
|
+
if (!mergeRef?.startsWith(prefix)) {
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
699
|
+
const headRef = mergeRef.slice(prefix.length).trim();
|
|
700
|
+
return headRef.length > 0 ? headRef : null;
|
|
701
|
+
}
|
|
702
|
+
async function resolvePullRequestStatusLookupTarget(cwd, currentBranch) {
|
|
703
|
+
const remoteName = await getGitConfigValue(cwd, `branch.${currentBranch}.remote`);
|
|
704
|
+
if (!remoteName?.startsWith("paseo-pr-")) {
|
|
705
|
+
return { headRef: currentBranch };
|
|
706
|
+
}
|
|
707
|
+
const mergeRef = await getGitConfigValue(cwd, `branch.${currentBranch}.merge`);
|
|
708
|
+
const trackedHeadRef = parseBranchMergeHeadRef(mergeRef);
|
|
709
|
+
if (!trackedHeadRef) {
|
|
710
|
+
return { headRef: currentBranch };
|
|
711
|
+
}
|
|
712
|
+
const remoteUrl = await getGitConfigValue(cwd, `remote.${remoteName}.url`);
|
|
713
|
+
const remoteRepo = remoteUrl ? parseGitHubRepoFromRemote(remoteUrl) : null;
|
|
714
|
+
const headRepositoryOwner = remoteRepo?.split("/")[0];
|
|
715
|
+
return {
|
|
716
|
+
headRef: trackedHeadRef,
|
|
717
|
+
...(headRepositoryOwner ? { headRepositoryOwner } : {}),
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
export async function resolveAbsoluteGitDir(cwd) {
|
|
721
|
+
try {
|
|
722
|
+
const { stdout } = await runGitCommand(["rev-parse", "--absolute-git-dir"], {
|
|
723
|
+
cwd,
|
|
724
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
725
|
+
});
|
|
726
|
+
const gitDir = stdout.trim();
|
|
727
|
+
return gitDir.length > 0 ? gitDir : null;
|
|
728
|
+
}
|
|
729
|
+
catch {
|
|
730
|
+
return null;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
async function abortGitPullConflictState(cwd) {
|
|
734
|
+
const gitDir = await resolveAbsoluteGitDir(cwd);
|
|
735
|
+
if (!gitDir) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
const mergeHeadPath = resolve(gitDir, "MERGE_HEAD");
|
|
739
|
+
const rebaseMergePath = resolve(gitDir, "rebase-merge");
|
|
740
|
+
const rebaseApplyPath = resolve(gitDir, "rebase-apply");
|
|
741
|
+
if (existsSync(mergeHeadPath)) {
|
|
742
|
+
try {
|
|
743
|
+
await runGitCommand(["merge", "--abort"], { cwd, timeout: 120000 });
|
|
744
|
+
}
|
|
745
|
+
catch {
|
|
746
|
+
// ignore
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
if (existsSync(rebaseMergePath) || existsSync(rebaseApplyPath)) {
|
|
750
|
+
try {
|
|
751
|
+
await runGitCommand(["rebase", "--abort"], { cwd, timeout: 120000 });
|
|
752
|
+
}
|
|
753
|
+
catch {
|
|
754
|
+
// ignore
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
export async function resolveRepositoryDefaultBranch(repoRoot) {
|
|
759
|
+
try {
|
|
760
|
+
const { stdout } = await runGitCommand(["symbolic-ref", "--quiet", "refs/remotes/origin/HEAD"], {
|
|
761
|
+
cwd: repoRoot,
|
|
762
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
763
|
+
});
|
|
764
|
+
const ref = stdout.trim();
|
|
765
|
+
if (ref) {
|
|
766
|
+
// Prefer a local branch name (e.g. "main") over the remote-tracking ref (e.g. "origin/main")
|
|
767
|
+
// so that status/diff/merge all operate against the same base ref.
|
|
768
|
+
const remoteShort = ref.replace(/^refs\/remotes\//, "");
|
|
769
|
+
const localName = remoteShort.startsWith("origin/")
|
|
770
|
+
? remoteShort.slice("origin/".length)
|
|
771
|
+
: remoteShort;
|
|
772
|
+
try {
|
|
773
|
+
await runGitCommand(["show-ref", "--verify", "--quiet", `refs/heads/${localName}`], {
|
|
774
|
+
cwd: repoRoot,
|
|
775
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
776
|
+
});
|
|
777
|
+
return localName;
|
|
778
|
+
}
|
|
779
|
+
catch {
|
|
780
|
+
return remoteShort;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
catch {
|
|
785
|
+
// ignore
|
|
786
|
+
}
|
|
787
|
+
const { stdout } = await runGitCommand(["branch", "--format=%(refname:short)"], {
|
|
788
|
+
cwd: repoRoot,
|
|
789
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
790
|
+
});
|
|
791
|
+
const branches = new Set(stdout
|
|
792
|
+
.split("\n")
|
|
793
|
+
.map((line) => line.trim())
|
|
794
|
+
.filter((line) => line.length > 0));
|
|
795
|
+
if (branches.has("main")) {
|
|
796
|
+
return "main";
|
|
797
|
+
}
|
|
798
|
+
if (branches.has("master")) {
|
|
799
|
+
return "master";
|
|
800
|
+
}
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
async function resolveBaseRef(repoRoot) {
|
|
804
|
+
return resolveRepositoryDefaultBranch(repoRoot);
|
|
805
|
+
}
|
|
806
|
+
function normalizeLocalBranchRefName(input) {
|
|
807
|
+
if (input.startsWith("refs/remotes/origin/")) {
|
|
808
|
+
return input.slice("refs/remotes/origin/".length);
|
|
809
|
+
}
|
|
810
|
+
if (input.startsWith("refs/heads/")) {
|
|
811
|
+
return input.slice("refs/heads/".length);
|
|
812
|
+
}
|
|
813
|
+
if (input.startsWith("origin/")) {
|
|
814
|
+
return input.slice("origin/".length);
|
|
815
|
+
}
|
|
816
|
+
return input;
|
|
817
|
+
}
|
|
818
|
+
function normalizeComparisonBaseRefName(input) {
|
|
819
|
+
const localName = normalizeLocalBranchRefName(input);
|
|
820
|
+
return { localName, originRef: `origin/${localName}` };
|
|
821
|
+
}
|
|
822
|
+
async function doesGitRefExist(cwd, fullRef, context) {
|
|
823
|
+
const result = await runGitCommand(["show-ref", "--verify", "--quiet", fullRef], {
|
|
824
|
+
cwd,
|
|
825
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
826
|
+
acceptExitCodes: [0, 1],
|
|
827
|
+
logger: context?.logger,
|
|
828
|
+
});
|
|
829
|
+
return result.exitCode === 0;
|
|
830
|
+
}
|
|
831
|
+
async function resolveBestComparisonBaseRef(cwd, baseRef, context) {
|
|
832
|
+
const normalized = normalizeComparisonBaseRefName(baseRef);
|
|
833
|
+
const [hasLocal, hasOrigin] = await Promise.all([
|
|
834
|
+
doesGitRefExist(cwd, `refs/heads/${normalized.localName}`, context),
|
|
835
|
+
doesGitRefExist(cwd, `refs/remotes/origin/${normalized.localName}`, context),
|
|
836
|
+
]);
|
|
837
|
+
if (hasOrigin) {
|
|
838
|
+
return normalized.originRef;
|
|
839
|
+
}
|
|
840
|
+
if (hasLocal) {
|
|
841
|
+
return normalized.localName;
|
|
842
|
+
}
|
|
843
|
+
const refName = baseRef.startsWith("origin/") || baseRef.startsWith("refs/remotes/origin/")
|
|
844
|
+
? normalized.originRef
|
|
845
|
+
: normalized.localName;
|
|
846
|
+
throw new Error(`Base branch not found locally or on origin: ${refName}`);
|
|
847
|
+
}
|
|
848
|
+
async function resolveMostAheadBaseRef(cwd, normalizedBaseRef) {
|
|
849
|
+
const [hasLocal, hasOrigin] = await Promise.all([
|
|
850
|
+
doesGitRefExist(cwd, `refs/heads/${normalizedBaseRef}`),
|
|
851
|
+
doesGitRefExist(cwd, `refs/remotes/origin/${normalizedBaseRef}`),
|
|
852
|
+
]);
|
|
853
|
+
if (hasLocal && !hasOrigin) {
|
|
854
|
+
return normalizedBaseRef;
|
|
855
|
+
}
|
|
856
|
+
if (!hasLocal && hasOrigin) {
|
|
857
|
+
return `origin/${normalizedBaseRef}`;
|
|
858
|
+
}
|
|
859
|
+
if (!hasLocal && !hasOrigin) {
|
|
860
|
+
throw new Error(`Base branch not found locally or on origin: ${normalizedBaseRef}`);
|
|
861
|
+
}
|
|
862
|
+
const { stdout } = await runGitCommand(["rev-list", "--left-right", "--count", `${normalizedBaseRef}...origin/${normalizedBaseRef}`], { cwd, envOverlay: READ_ONLY_GIT_ENV });
|
|
863
|
+
const [localOnlyRaw, originOnlyRaw] = stdout.trim().split(/\s+/);
|
|
864
|
+
const localOnly = Number.parseInt(localOnlyRaw ?? "0", 10);
|
|
865
|
+
const originOnly = Number.parseInt(originOnlyRaw ?? "0", 10);
|
|
866
|
+
if (Number.isNaN(localOnly) || Number.isNaN(originOnly)) {
|
|
867
|
+
return normalizedBaseRef;
|
|
868
|
+
}
|
|
869
|
+
if (originOnly > localOnly) {
|
|
870
|
+
return `origin/${normalizedBaseRef}`;
|
|
871
|
+
}
|
|
872
|
+
return normalizedBaseRef;
|
|
873
|
+
}
|
|
874
|
+
async function getAheadBehind(cwd, baseRef, currentBranch, context) {
|
|
875
|
+
const normalizedBaseRef = normalizeLocalBranchRefName(baseRef);
|
|
876
|
+
if (!normalizedBaseRef || !currentBranch || normalizedBaseRef === currentBranch) {
|
|
877
|
+
return null;
|
|
878
|
+
}
|
|
879
|
+
const comparisonBaseRef = await resolveBestComparisonBaseRef(cwd, baseRef, context);
|
|
880
|
+
const { stdout } = await runGitCommand(["rev-list", "--left-right", "--count", `${comparisonBaseRef}...${currentBranch}`], { cwd, envOverlay: READ_ONLY_GIT_ENV, logger: context?.logger });
|
|
881
|
+
const [behindRaw, aheadRaw] = stdout.trim().split(/\s+/);
|
|
882
|
+
const behind = Number.parseInt(behindRaw ?? "0", 10);
|
|
883
|
+
const ahead = Number.parseInt(aheadRaw ?? "0", 10);
|
|
884
|
+
if (Number.isNaN(behind) || Number.isNaN(ahead)) {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
return { ahead, behind };
|
|
888
|
+
}
|
|
889
|
+
async function getAheadOfOrigin(cwd, currentBranch, context) {
|
|
890
|
+
if (!currentBranch) {
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
const trackedOriginBranch = await getTrackedOriginBranch(cwd, currentBranch, context);
|
|
894
|
+
const originBranch = trackedOriginBranch ?? currentBranch;
|
|
895
|
+
try {
|
|
896
|
+
const { stdout } = await runGitCommand(["rev-list", "--count", `origin/${originBranch}..${currentBranch}`], { cwd, envOverlay: READ_ONLY_GIT_ENV, logger: context?.logger });
|
|
897
|
+
const count = Number.parseInt(stdout.trim(), 10);
|
|
898
|
+
return Number.isNaN(count) ? null : count;
|
|
899
|
+
}
|
|
900
|
+
catch {
|
|
901
|
+
if (trackedOriginBranch) {
|
|
902
|
+
return null;
|
|
903
|
+
}
|
|
904
|
+
try {
|
|
905
|
+
const { stdout } = await runGitCommand(["rev-list", "--count", currentBranch], {
|
|
906
|
+
cwd,
|
|
907
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
908
|
+
logger: context?.logger,
|
|
909
|
+
});
|
|
910
|
+
const count = Number.parseInt(stdout.trim(), 10);
|
|
911
|
+
return Number.isNaN(count) ? null : count;
|
|
912
|
+
}
|
|
913
|
+
catch {
|
|
914
|
+
return null;
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
async function getTrackedOriginBranch(cwd, currentBranch, context) {
|
|
919
|
+
const remoteName = await getGitConfigValue(cwd, `branch.${currentBranch}.remote`, context);
|
|
920
|
+
if (remoteName !== "origin") {
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
const mergeRef = await getGitConfigValue(cwd, `branch.${currentBranch}.merge`, context);
|
|
924
|
+
return parseBranchMergeHeadRef(mergeRef);
|
|
925
|
+
}
|
|
926
|
+
async function getBehindOfOrigin(cwd, currentBranch, context) {
|
|
927
|
+
if (!currentBranch) {
|
|
928
|
+
return null;
|
|
929
|
+
}
|
|
930
|
+
try {
|
|
931
|
+
const { stdout } = await runGitCommand(["rev-list", "--count", `${currentBranch}..origin/${currentBranch}`], { cwd, envOverlay: READ_ONLY_GIT_ENV, logger: context?.logger });
|
|
932
|
+
const count = Number.parseInt(stdout.trim(), 10);
|
|
933
|
+
return Number.isNaN(count) ? null : count;
|
|
934
|
+
}
|
|
935
|
+
catch {
|
|
936
|
+
return null;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
async function inspectCheckoutContext(cwd, context) {
|
|
940
|
+
try {
|
|
941
|
+
const root = await getWorktreeRoot(cwd, context);
|
|
942
|
+
if (!root) {
|
|
943
|
+
return null;
|
|
944
|
+
}
|
|
945
|
+
const [currentBranch, remoteUrl, paseoWorktree] = await Promise.all([
|
|
946
|
+
getCurrentBranch(cwd),
|
|
947
|
+
getOriginRemoteUrl(cwd),
|
|
948
|
+
getPaseoWorktreeForCwd(cwd, context),
|
|
949
|
+
]);
|
|
950
|
+
return {
|
|
951
|
+
worktreeRoot: root,
|
|
952
|
+
currentBranch,
|
|
953
|
+
remoteUrl,
|
|
954
|
+
paseoWorktree,
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
catch (error) {
|
|
958
|
+
if (isGitError(error)) {
|
|
959
|
+
return null;
|
|
960
|
+
}
|
|
961
|
+
throw error;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
const PER_FILE_DIFF_MAX_BYTES = 1024 * 1024; // 1MB
|
|
965
|
+
const TOTAL_DIFF_MAX_BYTES = 2 * 1024 * 1024; // 2MB
|
|
966
|
+
const UNTRACKED_BINARY_SNIFF_BYTES = 16 * 1024;
|
|
967
|
+
async function isLikelyBinaryFile(absolutePath) {
|
|
968
|
+
const handle = await openFile(absolutePath, "r");
|
|
969
|
+
try {
|
|
970
|
+
const buffer = Buffer.allocUnsafe(UNTRACKED_BINARY_SNIFF_BYTES);
|
|
971
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
972
|
+
if (bytesRead === 0) {
|
|
973
|
+
return false;
|
|
974
|
+
}
|
|
975
|
+
let suspicious = 0;
|
|
976
|
+
for (let i = 0; i < bytesRead; i += 1) {
|
|
977
|
+
const byte = buffer[i];
|
|
978
|
+
if (byte === 0) {
|
|
979
|
+
return true;
|
|
980
|
+
}
|
|
981
|
+
// Treat control bytes as suspicious while allowing common whitespace.
|
|
982
|
+
if (byte < 7 || (byte > 14 && byte < 32) || byte === 127) {
|
|
983
|
+
suspicious += 1;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return suspicious / bytesRead > 0.3;
|
|
987
|
+
}
|
|
988
|
+
finally {
|
|
989
|
+
await handle.close();
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
async function inspectUntrackedFile(cwd, relativePath) {
|
|
993
|
+
const absolutePath = resolve(cwd, relativePath);
|
|
994
|
+
const metadata = await statFile(absolutePath);
|
|
995
|
+
if (!metadata.isFile()) {
|
|
996
|
+
return { stat: null, truncated: false };
|
|
997
|
+
}
|
|
998
|
+
if (await isLikelyBinaryFile(absolutePath)) {
|
|
999
|
+
return {
|
|
1000
|
+
stat: { additions: 0, deletions: 0, isBinary: true },
|
|
1001
|
+
truncated: false,
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
if (metadata.size > PER_FILE_DIFF_MAX_BYTES) {
|
|
1005
|
+
return {
|
|
1006
|
+
stat: { additions: 0, deletions: 0, isBinary: false },
|
|
1007
|
+
truncated: true,
|
|
1008
|
+
};
|
|
1009
|
+
}
|
|
1010
|
+
return {
|
|
1011
|
+
stat: { additions: 0, deletions: 0, isBinary: false },
|
|
1012
|
+
truncated: false,
|
|
1013
|
+
};
|
|
1014
|
+
}
|
|
1015
|
+
function buildPlaceholderParsedDiffFile(change, options) {
|
|
1016
|
+
return {
|
|
1017
|
+
path: change.path,
|
|
1018
|
+
isNew: change.isNew,
|
|
1019
|
+
isDeleted: change.isDeleted,
|
|
1020
|
+
additions: options.stat?.additions ?? 0,
|
|
1021
|
+
deletions: options.stat?.deletions ?? 0,
|
|
1022
|
+
hunks: [],
|
|
1023
|
+
status: options.status,
|
|
1024
|
+
};
|
|
1025
|
+
}
|
|
1026
|
+
async function getUntrackedDiffText(cwd, change, ignoreWhitespace = false) {
|
|
1027
|
+
try {
|
|
1028
|
+
const inspected = await inspectUntrackedFile(cwd, change.path);
|
|
1029
|
+
if (inspected.stat?.isBinary || inspected.truncated) {
|
|
1030
|
+
return { text: "", truncated: inspected.truncated, stat: inspected.stat };
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
catch {
|
|
1034
|
+
// Fall through to git diff path if metadata probing fails.
|
|
1035
|
+
}
|
|
1036
|
+
const result = await runGitCommand(buildGitDiffArgs({
|
|
1037
|
+
ignoreWhitespace,
|
|
1038
|
+
extra: ["--no-index", "/dev/null", "--", change.path],
|
|
1039
|
+
}), {
|
|
1040
|
+
cwd,
|
|
1041
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1042
|
+
maxOutputBytes: PER_FILE_DIFF_MAX_BYTES,
|
|
1043
|
+
acceptExitCodes: [0, 1],
|
|
1044
|
+
});
|
|
1045
|
+
return {
|
|
1046
|
+
text: result.stdout,
|
|
1047
|
+
truncated: result.truncated,
|
|
1048
|
+
stat: { additions: 0, deletions: 0, isBinary: false },
|
|
1049
|
+
};
|
|
1050
|
+
}
|
|
1051
|
+
export async function getCheckoutStatus(cwd, context) {
|
|
1052
|
+
const inspected = await inspectCheckoutContext(cwd, context);
|
|
1053
|
+
if (!inspected) {
|
|
1054
|
+
return { isGit: false };
|
|
1055
|
+
}
|
|
1056
|
+
const worktreeRoot = inspected.worktreeRoot;
|
|
1057
|
+
const currentBranch = inspected.currentBranch;
|
|
1058
|
+
const remoteUrl = inspected.remoteUrl;
|
|
1059
|
+
const paseoWorktree = inspected.paseoWorktree;
|
|
1060
|
+
const isDirty = await isWorkingTreeDirty(cwd, context);
|
|
1061
|
+
const hasRemote = remoteUrl !== null;
|
|
1062
|
+
const { resolvedBaseRef: baseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
1063
|
+
const mainRepoRoot = await getMainRepoRoot(cwd).catch(() => null);
|
|
1064
|
+
const [aheadBehind, aheadOfOrigin, behindOfOrigin] = await Promise.all([
|
|
1065
|
+
baseRef && currentBranch
|
|
1066
|
+
? getAheadBehind(cwd, baseRef, currentBranch, context)
|
|
1067
|
+
: Promise.resolve(null),
|
|
1068
|
+
hasRemote && currentBranch
|
|
1069
|
+
? getAheadOfOrigin(cwd, currentBranch, context)
|
|
1070
|
+
: Promise.resolve(null),
|
|
1071
|
+
hasRemote && currentBranch
|
|
1072
|
+
? getBehindOfOrigin(cwd, currentBranch, context)
|
|
1073
|
+
: Promise.resolve(null),
|
|
1074
|
+
]);
|
|
1075
|
+
if (paseoWorktree.isPaseoOwnedWorktree && baseRef) {
|
|
1076
|
+
return {
|
|
1077
|
+
isGit: true,
|
|
1078
|
+
repoRoot: worktreeRoot,
|
|
1079
|
+
mainRepoRoot: mainRepoRoot ?? worktreeRoot,
|
|
1080
|
+
currentBranch,
|
|
1081
|
+
isDirty,
|
|
1082
|
+
baseRef,
|
|
1083
|
+
aheadBehind,
|
|
1084
|
+
aheadOfOrigin,
|
|
1085
|
+
behindOfOrigin,
|
|
1086
|
+
hasRemote,
|
|
1087
|
+
remoteUrl,
|
|
1088
|
+
isPaseoOwnedWorktree: true,
|
|
1089
|
+
};
|
|
1090
|
+
}
|
|
1091
|
+
return {
|
|
1092
|
+
isGit: true,
|
|
1093
|
+
repoRoot: worktreeRoot,
|
|
1094
|
+
mainRepoRoot: mainRepoRoot && resolve(mainRepoRoot) !== resolve(worktreeRoot) ? mainRepoRoot : null,
|
|
1095
|
+
currentBranch,
|
|
1096
|
+
isDirty,
|
|
1097
|
+
baseRef,
|
|
1098
|
+
aheadBehind,
|
|
1099
|
+
aheadOfOrigin,
|
|
1100
|
+
behindOfOrigin,
|
|
1101
|
+
hasRemote,
|
|
1102
|
+
remoteUrl,
|
|
1103
|
+
isPaseoOwnedWorktree: false,
|
|
1104
|
+
};
|
|
1105
|
+
}
|
|
1106
|
+
function parseCheckoutShortstat(text) {
|
|
1107
|
+
const trimmed = text.trim();
|
|
1108
|
+
if (!trimmed) {
|
|
1109
|
+
return null;
|
|
1110
|
+
}
|
|
1111
|
+
let additions = 0;
|
|
1112
|
+
let deletions = 0;
|
|
1113
|
+
const addMatch = trimmed.match(/(\d+)\s+insertion/);
|
|
1114
|
+
if (addMatch) {
|
|
1115
|
+
additions = Number.parseInt(addMatch[1], 10);
|
|
1116
|
+
}
|
|
1117
|
+
const delMatch = trimmed.match(/(\d+)\s+deletion/);
|
|
1118
|
+
if (delMatch) {
|
|
1119
|
+
deletions = Number.parseInt(delMatch[1], 10);
|
|
1120
|
+
}
|
|
1121
|
+
if (additions === 0 && deletions === 0) {
|
|
1122
|
+
return null;
|
|
1123
|
+
}
|
|
1124
|
+
return { additions, deletions };
|
|
1125
|
+
}
|
|
1126
|
+
const UNTRACKED_SHORTSTAT_MAX_FILES = 500;
|
|
1127
|
+
async function countUntrackedAdditions(cwd) {
|
|
1128
|
+
try {
|
|
1129
|
+
const { stdout } = await runGitCommand(["ls-files", "--others", "--exclude-standard"], {
|
|
1130
|
+
cwd,
|
|
1131
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1132
|
+
});
|
|
1133
|
+
const files = stdout
|
|
1134
|
+
.split("\n")
|
|
1135
|
+
.map((l) => l.trim())
|
|
1136
|
+
.filter(Boolean);
|
|
1137
|
+
let additions = 0;
|
|
1138
|
+
for (const file of files.slice(0, UNTRACKED_SHORTSTAT_MAX_FILES)) {
|
|
1139
|
+
const absolutePath = resolve(cwd, file);
|
|
1140
|
+
try {
|
|
1141
|
+
const metadata = await statFile(absolutePath);
|
|
1142
|
+
if (metadata.size > PER_FILE_DIFF_MAX_BYTES)
|
|
1143
|
+
continue;
|
|
1144
|
+
if (await isLikelyBinaryFile(absolutePath))
|
|
1145
|
+
continue;
|
|
1146
|
+
const content = await readFile(absolutePath, "utf-8");
|
|
1147
|
+
if (content.length === 0)
|
|
1148
|
+
continue;
|
|
1149
|
+
const normalized = content.replace(/\r\n/g, "\n");
|
|
1150
|
+
const lineCount = normalized.split("\n").length;
|
|
1151
|
+
additions += normalized.endsWith("\n") ? lineCount - 1 : lineCount;
|
|
1152
|
+
}
|
|
1153
|
+
catch {
|
|
1154
|
+
// Skip unreadable files.
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
return additions;
|
|
1158
|
+
}
|
|
1159
|
+
catch {
|
|
1160
|
+
return 0;
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
async function getCheckoutShortstatUncached(cwd, context) {
|
|
1164
|
+
try {
|
|
1165
|
+
await requireGitRepo(cwd);
|
|
1166
|
+
}
|
|
1167
|
+
catch {
|
|
1168
|
+
return null;
|
|
1169
|
+
}
|
|
1170
|
+
const localBaseRef = await getResolvedBaseRefForCwd(cwd, context);
|
|
1171
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
1172
|
+
let comparisonRef;
|
|
1173
|
+
if (currentBranch && localBaseRef && currentBranch !== localBaseRef) {
|
|
1174
|
+
try {
|
|
1175
|
+
comparisonRef = await resolveBestComparisonBaseRef(cwd, localBaseRef);
|
|
1176
|
+
}
|
|
1177
|
+
catch {
|
|
1178
|
+
return null;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
else if (currentBranch) {
|
|
1182
|
+
const hasOrigin = await doesGitRefExist(cwd, `refs/remotes/origin/${currentBranch}`);
|
|
1183
|
+
if (!hasOrigin) {
|
|
1184
|
+
return null;
|
|
1185
|
+
}
|
|
1186
|
+
comparisonRef = `origin/${currentBranch}`;
|
|
1187
|
+
}
|
|
1188
|
+
else {
|
|
1189
|
+
return null;
|
|
1190
|
+
}
|
|
1191
|
+
try {
|
|
1192
|
+
const { stdout: mergeBaseOut } = await runGitCommand(["merge-base", "HEAD", comparisonRef], {
|
|
1193
|
+
cwd,
|
|
1194
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1195
|
+
});
|
|
1196
|
+
const mergeBase = mergeBaseOut.trim();
|
|
1197
|
+
if (!mergeBase) {
|
|
1198
|
+
return null;
|
|
1199
|
+
}
|
|
1200
|
+
const [{ stdout }, untrackedAdditions] = await Promise.all([
|
|
1201
|
+
runGitCommand(["diff", "--shortstat", mergeBase], {
|
|
1202
|
+
cwd,
|
|
1203
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1204
|
+
}),
|
|
1205
|
+
countUntrackedAdditions(cwd),
|
|
1206
|
+
]);
|
|
1207
|
+
const tracked = parseCheckoutShortstat(stdout);
|
|
1208
|
+
if (tracked) {
|
|
1209
|
+
return { additions: tracked.additions + untrackedAdditions, deletions: tracked.deletions };
|
|
1210
|
+
}
|
|
1211
|
+
if (untrackedAdditions > 0) {
|
|
1212
|
+
return { additions: untrackedAdditions, deletions: 0 };
|
|
1213
|
+
}
|
|
1214
|
+
return null;
|
|
1215
|
+
}
|
|
1216
|
+
catch {
|
|
1217
|
+
return null;
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
function getOrLoadCheckoutShortstat(cwd, context, options) {
|
|
1221
|
+
const cacheKey = getShortstatCacheKey(cwd);
|
|
1222
|
+
if (!options?.force) {
|
|
1223
|
+
const cached = shortstatCache.get(cacheKey);
|
|
1224
|
+
if (cached !== undefined) {
|
|
1225
|
+
return Promise.resolve(cached);
|
|
1226
|
+
}
|
|
1227
|
+
const existing = shortstatInFlight.get(cacheKey);
|
|
1228
|
+
if (existing) {
|
|
1229
|
+
return existing;
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
const load = getCheckoutShortstatUncached(cwd, context)
|
|
1233
|
+
.then((shortstat) => {
|
|
1234
|
+
shortstatCache.set(cacheKey, shortstat);
|
|
1235
|
+
return shortstat;
|
|
1236
|
+
})
|
|
1237
|
+
.finally(() => {
|
|
1238
|
+
shortstatInFlight.delete(cacheKey);
|
|
1239
|
+
});
|
|
1240
|
+
shortstatInFlight.set(cacheKey, load);
|
|
1241
|
+
return load;
|
|
1242
|
+
}
|
|
1243
|
+
export async function getCheckoutShortstat(cwd, context, options) {
|
|
1244
|
+
return getOrLoadCheckoutShortstat(cwd, context, options);
|
|
1245
|
+
}
|
|
1246
|
+
export function getCachedCheckoutShortstat(cwd) {
|
|
1247
|
+
return shortstatCache.get(getShortstatCacheKey(cwd));
|
|
1248
|
+
}
|
|
1249
|
+
export function warmCheckoutShortstatInBackground(cwd, context, onComplete) {
|
|
1250
|
+
const cacheKey = getShortstatCacheKey(cwd);
|
|
1251
|
+
if (shortstatCache.get(cacheKey) !== undefined || shortstatInFlight.has(cacheKey)) {
|
|
1252
|
+
return;
|
|
1253
|
+
}
|
|
1254
|
+
void getOrLoadCheckoutShortstat(cwd, context)
|
|
1255
|
+
.then(() => {
|
|
1256
|
+
onComplete?.();
|
|
1257
|
+
return;
|
|
1258
|
+
})
|
|
1259
|
+
.catch(() => {
|
|
1260
|
+
// Non-critical: keep listing path resilient even if git commands fail.
|
|
1261
|
+
});
|
|
1262
|
+
}
|
|
1263
|
+
async function appendStructuredTrackedDiffs(input) {
|
|
1264
|
+
const { cwd, trackedChanges, trackedChangeByPath, trackedNumstatByPath, trackedPlaceholderByPath, trackedDiffText, trackedDiffTruncated, refsForDiff, ignoreWhitespace, structured, appendTrackedPlaceholderComment, } = input;
|
|
1265
|
+
const parsedTrackedFiles = trackedDiffText.length > 0
|
|
1266
|
+
? await parseAndHighlightDiff(trackedDiffText, cwd, {
|
|
1267
|
+
getOldFileContent: async (file) => {
|
|
1268
|
+
const change = trackedChangeByPath.get(file.path);
|
|
1269
|
+
if (!change || change.isNew) {
|
|
1270
|
+
return null;
|
|
1271
|
+
}
|
|
1272
|
+
const refPath = change.oldPath ?? change.path;
|
|
1273
|
+
return readGitFileContentAtRef(cwd, refsForDiff.baseRef, refPath);
|
|
1274
|
+
},
|
|
1275
|
+
getNewFileContent: async (file) => {
|
|
1276
|
+
if (!refsForDiff.targetRef) {
|
|
1277
|
+
return null;
|
|
1278
|
+
}
|
|
1279
|
+
return readGitFileContentAtRef(cwd, refsForDiff.targetRef, file.path);
|
|
1280
|
+
},
|
|
1281
|
+
})
|
|
1282
|
+
: [];
|
|
1283
|
+
const parsedTrackedByPath = new Map(parsedTrackedFiles.map((file) => [file.path, file]));
|
|
1284
|
+
for (const change of trackedChanges) {
|
|
1285
|
+
const placeholder = trackedPlaceholderByPath.get(change.path);
|
|
1286
|
+
if (placeholder) {
|
|
1287
|
+
structured.push(buildPlaceholderParsedDiffFile(change, {
|
|
1288
|
+
status: placeholder.status,
|
|
1289
|
+
stat: placeholder.stat,
|
|
1290
|
+
}));
|
|
1291
|
+
appendTrackedPlaceholderComment(change, placeholder.status);
|
|
1292
|
+
continue;
|
|
1293
|
+
}
|
|
1294
|
+
const stat = trackedNumstatByPath.get(change.path) ?? null;
|
|
1295
|
+
const parsedFile = parsedTrackedByPath.get(change.path);
|
|
1296
|
+
if (parsedFile) {
|
|
1297
|
+
structured.push({
|
|
1298
|
+
...parsedFile,
|
|
1299
|
+
path: change.path,
|
|
1300
|
+
isNew: change.isNew,
|
|
1301
|
+
isDeleted: change.isDeleted,
|
|
1302
|
+
status: "ok",
|
|
1303
|
+
});
|
|
1304
|
+
continue;
|
|
1305
|
+
}
|
|
1306
|
+
// `git diff -w --name-status` can still report a modified path even when the
|
|
1307
|
+
// whitespace-filtered patch and numstat are both empty. Skip emitting a
|
|
1308
|
+
// structured placeholder in that case so whitespace-only edits truly disappear.
|
|
1309
|
+
if (ignoreWhitespace &&
|
|
1310
|
+
!trackedDiffTruncated &&
|
|
1311
|
+
change.status.startsWith("M") &&
|
|
1312
|
+
(!stat || (!stat.isBinary && stat.additions === 0 && stat.deletions === 0))) {
|
|
1313
|
+
continue;
|
|
1314
|
+
}
|
|
1315
|
+
structured.push({
|
|
1316
|
+
path: change.path,
|
|
1317
|
+
isNew: change.isNew,
|
|
1318
|
+
isDeleted: change.isDeleted,
|
|
1319
|
+
additions: stat?.additions ?? 0,
|
|
1320
|
+
deletions: stat?.deletions ?? 0,
|
|
1321
|
+
hunks: [],
|
|
1322
|
+
status: trackedDiffTruncated ? "too_large" : "ok",
|
|
1323
|
+
});
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
async function processUntrackedChange(input) {
|
|
1327
|
+
const { cwd, change, ignoreWhitespace, includeStructured, structured, appendDiff } = input;
|
|
1328
|
+
const { text, truncated, stat } = await getUntrackedDiffText(cwd, change, ignoreWhitespace);
|
|
1329
|
+
if (!includeStructured) {
|
|
1330
|
+
if (stat?.isBinary) {
|
|
1331
|
+
appendDiff(`# ${change.path}: binary diff omitted\n`);
|
|
1332
|
+
}
|
|
1333
|
+
else if (truncated) {
|
|
1334
|
+
appendDiff(`# ${change.path}: diff too large omitted\n`);
|
|
1335
|
+
}
|
|
1336
|
+
else {
|
|
1337
|
+
appendDiff(text);
|
|
1338
|
+
}
|
|
1339
|
+
return;
|
|
1340
|
+
}
|
|
1341
|
+
if (stat?.isBinary) {
|
|
1342
|
+
structured.push(buildPlaceholderParsedDiffFile(change, { status: "binary", stat }));
|
|
1343
|
+
appendDiff(`# ${change.path}: binary diff omitted\n`);
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
if (truncated) {
|
|
1347
|
+
structured.push(buildPlaceholderParsedDiffFile(change, { status: "too_large", stat }));
|
|
1348
|
+
appendDiff(`# ${change.path}: diff too large omitted\n`);
|
|
1349
|
+
return;
|
|
1350
|
+
}
|
|
1351
|
+
appendDiff(text);
|
|
1352
|
+
const parsed = await parseAndHighlightDiff(text, cwd);
|
|
1353
|
+
const parsedFile = parsed[0] ??
|
|
1354
|
+
{
|
|
1355
|
+
path: change.path,
|
|
1356
|
+
isNew: change.isNew,
|
|
1357
|
+
isDeleted: change.isDeleted,
|
|
1358
|
+
additions: stat?.additions ?? 0,
|
|
1359
|
+
deletions: stat?.deletions ?? 0,
|
|
1360
|
+
hunks: [],
|
|
1361
|
+
};
|
|
1362
|
+
structured.push({
|
|
1363
|
+
...parsedFile,
|
|
1364
|
+
path: change.path,
|
|
1365
|
+
isNew: change.isNew,
|
|
1366
|
+
isDeleted: change.isDeleted,
|
|
1367
|
+
status: "ok",
|
|
1368
|
+
});
|
|
1369
|
+
}
|
|
1370
|
+
async function resolveCheckoutDiffRefs(cwd, compare, context) {
|
|
1371
|
+
if (compare.mode === "uncommitted") {
|
|
1372
|
+
return { baseRef: "HEAD", includeUntracked: true };
|
|
1373
|
+
}
|
|
1374
|
+
const { storedBaseRef, resolvedBaseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
1375
|
+
const baseRef = compare.baseRef ?? resolvedBaseRef;
|
|
1376
|
+
if (!baseRef) {
|
|
1377
|
+
return null;
|
|
1378
|
+
}
|
|
1379
|
+
if (storedBaseRef && compare.baseRef && compare.baseRef !== storedBaseRef) {
|
|
1380
|
+
throw new Error(`Base ref mismatch: expected ${baseRef}, got ${compare.baseRef}`);
|
|
1381
|
+
}
|
|
1382
|
+
const bestBaseRef = await resolveBestComparisonBaseRef(cwd, baseRef);
|
|
1383
|
+
return {
|
|
1384
|
+
baseRef: (await tryResolveMergeBase(cwd, bestBaseRef)) ?? bestBaseRef,
|
|
1385
|
+
targetRef: "HEAD",
|
|
1386
|
+
includeUntracked: false,
|
|
1387
|
+
};
|
|
1388
|
+
}
|
|
1389
|
+
export async function getCheckoutDiff(cwd, compare, context) {
|
|
1390
|
+
await requireGitRepo(cwd);
|
|
1391
|
+
const refsForDiff = await resolveCheckoutDiffRefs(cwd, compare, context);
|
|
1392
|
+
if (!refsForDiff) {
|
|
1393
|
+
return { diff: "" };
|
|
1394
|
+
}
|
|
1395
|
+
const ignoreWhitespace = compare.ignoreWhitespace === true;
|
|
1396
|
+
let effectiveRefsForDiff = refsForDiff;
|
|
1397
|
+
let changes;
|
|
1398
|
+
try {
|
|
1399
|
+
changes = await listCheckoutFileChanges(cwd, effectiveRefsForDiff, ignoreWhitespace);
|
|
1400
|
+
}
|
|
1401
|
+
catch (error) {
|
|
1402
|
+
if (!isUnbornHeadDiffError(error)) {
|
|
1403
|
+
throw error;
|
|
1404
|
+
}
|
|
1405
|
+
effectiveRefsForDiff = { ...refsForDiff, baseRef: EMPTY_TREE_OBJECT_ID };
|
|
1406
|
+
changes = await listCheckoutFileChanges(cwd, effectiveRefsForDiff, ignoreWhitespace);
|
|
1407
|
+
}
|
|
1408
|
+
changes.sort((a, b) => {
|
|
1409
|
+
if (a.path === b.path)
|
|
1410
|
+
return 0;
|
|
1411
|
+
return a.path < b.path ? -1 : 1;
|
|
1412
|
+
});
|
|
1413
|
+
const structured = [];
|
|
1414
|
+
let diffText = "";
|
|
1415
|
+
let diffBytes = 0;
|
|
1416
|
+
const appendDiff = (text) => {
|
|
1417
|
+
if (!text)
|
|
1418
|
+
return;
|
|
1419
|
+
if (diffBytes >= TOTAL_DIFF_MAX_BYTES)
|
|
1420
|
+
return;
|
|
1421
|
+
const buf = Buffer.from(text, "utf8");
|
|
1422
|
+
if (diffBytes + buf.length <= TOTAL_DIFF_MAX_BYTES) {
|
|
1423
|
+
diffText += text;
|
|
1424
|
+
diffBytes += buf.length;
|
|
1425
|
+
return;
|
|
1426
|
+
}
|
|
1427
|
+
const remaining = TOTAL_DIFF_MAX_BYTES - diffBytes;
|
|
1428
|
+
if (remaining > 0) {
|
|
1429
|
+
diffText += buf.subarray(0, remaining).toString("utf8");
|
|
1430
|
+
diffBytes = TOTAL_DIFF_MAX_BYTES;
|
|
1431
|
+
}
|
|
1432
|
+
};
|
|
1433
|
+
const trackedChanges = changes.filter((change) => !change.isUntracked);
|
|
1434
|
+
const untrackedChanges = changes.filter((change) => change.isUntracked === true);
|
|
1435
|
+
const trackedChangeByPath = new Map(trackedChanges.map((change) => [change.path, change]));
|
|
1436
|
+
const trackedNumstatByPath = trackedChanges.length > 0
|
|
1437
|
+
? await getTrackedNumstatByPath(cwd, effectiveRefsForDiff, ignoreWhitespace)
|
|
1438
|
+
: new Map();
|
|
1439
|
+
const trackedDiffPaths = [];
|
|
1440
|
+
const trackedPlaceholderByPath = new Map();
|
|
1441
|
+
for (const change of trackedChanges) {
|
|
1442
|
+
const stat = trackedNumstatByPath.get(change.path) ?? null;
|
|
1443
|
+
if (stat?.isBinary) {
|
|
1444
|
+
trackedPlaceholderByPath.set(change.path, { status: "binary", stat });
|
|
1445
|
+
continue;
|
|
1446
|
+
}
|
|
1447
|
+
if (isTrackedDiffTooLarge(stat)) {
|
|
1448
|
+
trackedPlaceholderByPath.set(change.path, { status: "too_large", stat });
|
|
1449
|
+
continue;
|
|
1450
|
+
}
|
|
1451
|
+
trackedDiffPaths.push(change.path);
|
|
1452
|
+
}
|
|
1453
|
+
let trackedDiffText = "";
|
|
1454
|
+
let trackedDiffTruncated = false;
|
|
1455
|
+
if (trackedDiffPaths.length > 0) {
|
|
1456
|
+
const trackedDiffResult = await runGitCommand(buildGitDiffArgs({
|
|
1457
|
+
ignoreWhitespace,
|
|
1458
|
+
extra: [...getCheckoutDiffRefArgs(effectiveRefsForDiff), "--", ...trackedDiffPaths],
|
|
1459
|
+
}), {
|
|
1460
|
+
cwd,
|
|
1461
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1462
|
+
maxOutputBytes: TOTAL_DIFF_MAX_BYTES,
|
|
1463
|
+
});
|
|
1464
|
+
trackedDiffText = trackedDiffResult.stdout;
|
|
1465
|
+
trackedDiffTruncated = trackedDiffResult.truncated;
|
|
1466
|
+
appendDiff(trackedDiffText);
|
|
1467
|
+
if (trackedDiffTruncated) {
|
|
1468
|
+
appendDiff("# tracked diff truncated\n");
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
const appendTrackedPlaceholderComment = (change, status) => {
|
|
1472
|
+
if (status === "binary") {
|
|
1473
|
+
appendDiff(`# ${change.path}: binary diff omitted\n`);
|
|
1474
|
+
return;
|
|
1475
|
+
}
|
|
1476
|
+
appendDiff(`# ${change.path}: diff too large omitted\n`);
|
|
1477
|
+
};
|
|
1478
|
+
if (compare.includeStructured) {
|
|
1479
|
+
await appendStructuredTrackedDiffs({
|
|
1480
|
+
cwd,
|
|
1481
|
+
trackedChanges,
|
|
1482
|
+
trackedChangeByPath,
|
|
1483
|
+
trackedNumstatByPath,
|
|
1484
|
+
trackedPlaceholderByPath,
|
|
1485
|
+
trackedDiffText,
|
|
1486
|
+
trackedDiffTruncated,
|
|
1487
|
+
refsForDiff: effectiveRefsForDiff,
|
|
1488
|
+
ignoreWhitespace,
|
|
1489
|
+
structured,
|
|
1490
|
+
appendDiff,
|
|
1491
|
+
appendTrackedPlaceholderComment,
|
|
1492
|
+
});
|
|
1493
|
+
}
|
|
1494
|
+
else {
|
|
1495
|
+
for (const change of trackedChanges) {
|
|
1496
|
+
const placeholder = trackedPlaceholderByPath.get(change.path);
|
|
1497
|
+
if (placeholder) {
|
|
1498
|
+
appendTrackedPlaceholderComment(change, placeholder.status);
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
for (const change of untrackedChanges) {
|
|
1503
|
+
if (diffBytes >= TOTAL_DIFF_MAX_BYTES) {
|
|
1504
|
+
break;
|
|
1505
|
+
}
|
|
1506
|
+
await processUntrackedChange({
|
|
1507
|
+
cwd,
|
|
1508
|
+
change,
|
|
1509
|
+
ignoreWhitespace,
|
|
1510
|
+
includeStructured: compare.includeStructured === true,
|
|
1511
|
+
structured,
|
|
1512
|
+
appendDiff,
|
|
1513
|
+
});
|
|
1514
|
+
}
|
|
1515
|
+
if (compare.includeStructured) {
|
|
1516
|
+
return { diff: diffText, structured };
|
|
1517
|
+
}
|
|
1518
|
+
return { diff: diffText };
|
|
1519
|
+
}
|
|
1520
|
+
export async function commitChanges(cwd, options) {
|
|
1521
|
+
await requireGitRepo(cwd);
|
|
1522
|
+
if (options.addAll ?? true) {
|
|
1523
|
+
await runGitCommand(["add", "-A"], { cwd, timeout: 120000 });
|
|
1524
|
+
}
|
|
1525
|
+
await runGitCommand(["-c", "commit.gpgsign=false", "commit", "-m", options.message], {
|
|
1526
|
+
cwd,
|
|
1527
|
+
timeout: 120000,
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1530
|
+
export async function commitAll(cwd, message) {
|
|
1531
|
+
await commitChanges(cwd, { message, addAll: true });
|
|
1532
|
+
}
|
|
1533
|
+
async function detectAndThrowMergeToBaseConflict(input) {
|
|
1534
|
+
const { operationCwd, error, baseRef, currentBranch } = input;
|
|
1535
|
+
const errorDetails = error instanceof Error
|
|
1536
|
+
? `${error.message}\n${getErrorStderr(error)}\n${getErrorStdout(error)}`
|
|
1537
|
+
: String(error);
|
|
1538
|
+
try {
|
|
1539
|
+
const [unmergedOutput, lsFilesOutput, statusOutput] = await Promise.all([
|
|
1540
|
+
runGitCommand(["diff", "--name-only", "--diff-filter=U"], { cwd: operationCwd }),
|
|
1541
|
+
runGitCommand(["ls-files", "-u"], { cwd: operationCwd }),
|
|
1542
|
+
runGitCommand(["status", "--porcelain"], { cwd: operationCwd }),
|
|
1543
|
+
]);
|
|
1544
|
+
const statusConflicts = statusOutput.stdout
|
|
1545
|
+
.split("\n")
|
|
1546
|
+
.map((line) => line.trim())
|
|
1547
|
+
.filter(Boolean)
|
|
1548
|
+
.filter((line) => /^(UU|AA|DD|AU|UA|UD|DU)\s/.test(line))
|
|
1549
|
+
.map((line) => line.slice(3).trim());
|
|
1550
|
+
const conflicts = [
|
|
1551
|
+
...unmergedOutput.stdout
|
|
1552
|
+
.split("\n")
|
|
1553
|
+
.map((line) => line.trim())
|
|
1554
|
+
.filter(Boolean),
|
|
1555
|
+
...lsFilesOutput.stdout
|
|
1556
|
+
.split("\n")
|
|
1557
|
+
.map((line) => line.trim())
|
|
1558
|
+
.filter(Boolean)
|
|
1559
|
+
.map((line) => line.split("\t").at(-1) ?? ""),
|
|
1560
|
+
...statusConflicts,
|
|
1561
|
+
].filter(Boolean);
|
|
1562
|
+
const conflictDetected = conflicts.length > 0 || /CONFLICT|Automatic merge failed/i.test(errorDetails);
|
|
1563
|
+
if (conflictDetected) {
|
|
1564
|
+
try {
|
|
1565
|
+
await runGitCommand(["merge", "--abort"], { cwd: operationCwd, timeout: 120000 });
|
|
1566
|
+
}
|
|
1567
|
+
catch {
|
|
1568
|
+
// ignore
|
|
1569
|
+
}
|
|
1570
|
+
throw new MergeConflictError({
|
|
1571
|
+
baseRef,
|
|
1572
|
+
currentBranch,
|
|
1573
|
+
conflictFiles: conflicts.length > 0 ? conflicts : [],
|
|
1574
|
+
});
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
catch (innerError) {
|
|
1578
|
+
if (innerError instanceof MergeConflictError) {
|
|
1579
|
+
throw innerError;
|
|
1580
|
+
}
|
|
1581
|
+
// ignore detection failures
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
export async function mergeToBase(cwd, options = {}, context) {
|
|
1585
|
+
await requireGitRepo(cwd);
|
|
1586
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
1587
|
+
const { storedBaseRef, resolvedBaseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
1588
|
+
const baseRef = options.baseRef ?? resolvedBaseRef;
|
|
1589
|
+
if (!baseRef) {
|
|
1590
|
+
throw new Error("Unable to determine base branch for merge");
|
|
1591
|
+
}
|
|
1592
|
+
if (storedBaseRef && options.baseRef && options.baseRef !== storedBaseRef) {
|
|
1593
|
+
throw new Error(`Base ref mismatch: expected ${baseRef}, got ${options.baseRef}`);
|
|
1594
|
+
}
|
|
1595
|
+
if (!currentBranch) {
|
|
1596
|
+
throw new Error("Unable to determine current branch for merge");
|
|
1597
|
+
}
|
|
1598
|
+
let normalizedBaseRef = baseRef;
|
|
1599
|
+
normalizedBaseRef = normalizeLocalBranchRefName(normalizedBaseRef);
|
|
1600
|
+
const currentWorktreeRoot = (await getWorktreeRoot(cwd)) ?? cwd;
|
|
1601
|
+
if (normalizedBaseRef === currentBranch) {
|
|
1602
|
+
return currentWorktreeRoot;
|
|
1603
|
+
}
|
|
1604
|
+
const baseWorktree = await getWorktreePathForBranch(cwd, normalizedBaseRef);
|
|
1605
|
+
const operationCwd = baseWorktree ?? currentWorktreeRoot;
|
|
1606
|
+
const isSameCheckout = resolve(operationCwd) === resolve(currentWorktreeRoot);
|
|
1607
|
+
const originalBranch = await getCurrentBranch(operationCwd);
|
|
1608
|
+
const mode = options.mode ?? "merge";
|
|
1609
|
+
try {
|
|
1610
|
+
await runGitCommand(["checkout", normalizedBaseRef], {
|
|
1611
|
+
cwd: operationCwd,
|
|
1612
|
+
timeout: 120000,
|
|
1613
|
+
});
|
|
1614
|
+
if (mode === "squash") {
|
|
1615
|
+
await runGitCommand(["merge", "--squash", currentBranch], {
|
|
1616
|
+
cwd: operationCwd,
|
|
1617
|
+
timeout: 120000,
|
|
1618
|
+
});
|
|
1619
|
+
const message = options.commitMessage ?? `Squash merge ${currentBranch} into ${normalizedBaseRef}`;
|
|
1620
|
+
await runGitCommand(["-c", "commit.gpgsign=false", "commit", "-m", message], {
|
|
1621
|
+
cwd: operationCwd,
|
|
1622
|
+
timeout: 120000,
|
|
1623
|
+
});
|
|
1624
|
+
}
|
|
1625
|
+
else {
|
|
1626
|
+
await runGitCommand(["merge", currentBranch], { cwd: operationCwd, timeout: 120000 });
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
catch (error) {
|
|
1630
|
+
await detectAndThrowMergeToBaseConflict({
|
|
1631
|
+
operationCwd,
|
|
1632
|
+
error,
|
|
1633
|
+
baseRef: normalizedBaseRef,
|
|
1634
|
+
currentBranch,
|
|
1635
|
+
});
|
|
1636
|
+
throw error;
|
|
1637
|
+
}
|
|
1638
|
+
finally {
|
|
1639
|
+
if (isSameCheckout && originalBranch && originalBranch !== normalizedBaseRef) {
|
|
1640
|
+
try {
|
|
1641
|
+
await runGitCommand(["checkout", originalBranch], {
|
|
1642
|
+
cwd: operationCwd,
|
|
1643
|
+
timeout: 120000,
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1646
|
+
catch {
|
|
1647
|
+
// ignore
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
return operationCwd;
|
|
1652
|
+
}
|
|
1653
|
+
export async function mergeFromBase(cwd, options = {}, context) {
|
|
1654
|
+
await requireGitRepo(cwd);
|
|
1655
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
1656
|
+
if (!currentBranch || currentBranch === "HEAD") {
|
|
1657
|
+
throw new Error("Unable to determine current branch for merge");
|
|
1658
|
+
}
|
|
1659
|
+
const { storedBaseRef, resolvedBaseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
1660
|
+
const baseRef = options.baseRef ?? resolvedBaseRef;
|
|
1661
|
+
if (!baseRef) {
|
|
1662
|
+
throw new Error("Unable to determine base branch for merge");
|
|
1663
|
+
}
|
|
1664
|
+
if (storedBaseRef && options.baseRef && options.baseRef !== storedBaseRef) {
|
|
1665
|
+
throw new Error(`Base ref mismatch: expected ${baseRef}, got ${options.baseRef}`);
|
|
1666
|
+
}
|
|
1667
|
+
const requireCleanTarget = options.requireCleanTarget ?? true;
|
|
1668
|
+
if (requireCleanTarget) {
|
|
1669
|
+
const { stdout } = await runGitCommand(["status", "--porcelain"], {
|
|
1670
|
+
cwd,
|
|
1671
|
+
envOverlay: READ_ONLY_GIT_ENV,
|
|
1672
|
+
});
|
|
1673
|
+
if (stdout.trim().length > 0) {
|
|
1674
|
+
throw new Error("Working directory has uncommitted changes.");
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
const normalizedBaseRef = normalizeLocalBranchRefName(baseRef);
|
|
1678
|
+
const bestBaseRef = await resolveMostAheadBaseRef(cwd, normalizedBaseRef);
|
|
1679
|
+
if (bestBaseRef === currentBranch) {
|
|
1680
|
+
return;
|
|
1681
|
+
}
|
|
1682
|
+
try {
|
|
1683
|
+
await runGitCommand(["merge", bestBaseRef], { cwd, timeout: 120000 });
|
|
1684
|
+
}
|
|
1685
|
+
catch (error) {
|
|
1686
|
+
await detectAndThrowMergeFromBaseConflict({
|
|
1687
|
+
cwd,
|
|
1688
|
+
error,
|
|
1689
|
+
baseRef: bestBaseRef,
|
|
1690
|
+
currentBranch,
|
|
1691
|
+
});
|
|
1692
|
+
throw error;
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
async function detectAndThrowMergeFromBaseConflict(input) {
|
|
1696
|
+
const { cwd, error, baseRef, currentBranch } = input;
|
|
1697
|
+
const errorDetails = error instanceof Error
|
|
1698
|
+
? `${error.message}\n${getErrorStderr(error)}\n${getErrorStdout(error)}`
|
|
1699
|
+
: String(error);
|
|
1700
|
+
try {
|
|
1701
|
+
const [unmergedOutput, lsFilesOutput, statusOutput] = await Promise.all([
|
|
1702
|
+
runGitCommand(["diff", "--name-only", "--diff-filter=U"], { cwd }),
|
|
1703
|
+
runGitCommand(["ls-files", "-u"], { cwd }),
|
|
1704
|
+
runGitCommand(["status", "--porcelain"], { cwd }),
|
|
1705
|
+
]);
|
|
1706
|
+
const statusConflicts = statusOutput.stdout
|
|
1707
|
+
.split("\n")
|
|
1708
|
+
.map((line) => line.trim())
|
|
1709
|
+
.filter(Boolean)
|
|
1710
|
+
.filter((line) => /^(UU|AA|DD|AU|UA|UD|DU)\s/.test(line))
|
|
1711
|
+
.map((line) => line.slice(3).trim());
|
|
1712
|
+
const conflicts = [
|
|
1713
|
+
...unmergedOutput.stdout
|
|
1714
|
+
.split("\n")
|
|
1715
|
+
.map((line) => line.trim())
|
|
1716
|
+
.filter(Boolean),
|
|
1717
|
+
...lsFilesOutput.stdout
|
|
1718
|
+
.split("\n")
|
|
1719
|
+
.map((line) => line.trim())
|
|
1720
|
+
.filter(Boolean)
|
|
1721
|
+
.map((line) => line.split("\t").at(-1) ?? ""),
|
|
1722
|
+
...statusConflicts,
|
|
1723
|
+
].filter(Boolean);
|
|
1724
|
+
const conflictDetected = conflicts.length > 0 || /CONFLICT|Automatic merge failed/i.test(errorDetails);
|
|
1725
|
+
if (conflictDetected) {
|
|
1726
|
+
try {
|
|
1727
|
+
await runGitCommand(["merge", "--abort"], { cwd, timeout: 120000 });
|
|
1728
|
+
}
|
|
1729
|
+
catch {
|
|
1730
|
+
// ignore
|
|
1731
|
+
}
|
|
1732
|
+
throw new MergeFromBaseConflictError({
|
|
1733
|
+
baseRef,
|
|
1734
|
+
currentBranch,
|
|
1735
|
+
conflictFiles: conflicts.length > 0 ? conflicts : [],
|
|
1736
|
+
});
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
catch (innerError) {
|
|
1740
|
+
if (innerError instanceof MergeFromBaseConflictError) {
|
|
1741
|
+
throw innerError;
|
|
1742
|
+
}
|
|
1743
|
+
// ignore detection failures
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
export async function pullCurrentBranch(cwd, github) {
|
|
1747
|
+
await requireGitRepo(cwd);
|
|
1748
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
1749
|
+
if (!currentBranch || currentBranch === "HEAD") {
|
|
1750
|
+
throw new Error("Unable to determine current branch for pull");
|
|
1751
|
+
}
|
|
1752
|
+
const hasRemote = await hasOriginRemote(cwd);
|
|
1753
|
+
if (!hasRemote) {
|
|
1754
|
+
throw new Error("Remote 'origin' is not configured.");
|
|
1755
|
+
}
|
|
1756
|
+
try {
|
|
1757
|
+
await runGitCommand(["pull"], { cwd, timeout: 120000 });
|
|
1758
|
+
github?.invalidate({ cwd });
|
|
1759
|
+
}
|
|
1760
|
+
catch (error) {
|
|
1761
|
+
await abortGitPullConflictState(cwd);
|
|
1762
|
+
throw error;
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
export async function pushCurrentBranch(cwd, github) {
|
|
1766
|
+
await requireGitRepo(cwd);
|
|
1767
|
+
const currentBranch = await getCurrentBranch(cwd);
|
|
1768
|
+
if (!currentBranch || currentBranch === "HEAD") {
|
|
1769
|
+
throw new Error("Unable to determine current branch for push");
|
|
1770
|
+
}
|
|
1771
|
+
const hasRemote = await hasOriginRemote(cwd);
|
|
1772
|
+
if (!hasRemote) {
|
|
1773
|
+
throw new Error("Remote 'origin' is not configured.");
|
|
1774
|
+
}
|
|
1775
|
+
await runGitCommand(["push", "-u", "origin", currentBranch], { cwd, timeout: 120000 });
|
|
1776
|
+
github?.invalidate({ cwd });
|
|
1777
|
+
}
|
|
1778
|
+
export async function createPullRequest(cwd, options, github = createGitHubService(), context) {
|
|
1779
|
+
await requireGitRepo(cwd);
|
|
1780
|
+
const repo = await resolveGitHubRepo(cwd);
|
|
1781
|
+
if (!repo) {
|
|
1782
|
+
throw new Error("Unable to determine GitHub repo from git remote");
|
|
1783
|
+
}
|
|
1784
|
+
const head = options.head ?? (await getCurrentBranch(cwd));
|
|
1785
|
+
const { storedBaseRef, resolvedBaseRef } = await resolveBaseRefForCwd(cwd, context);
|
|
1786
|
+
const base = options.base ?? resolvedBaseRef;
|
|
1787
|
+
if (!head) {
|
|
1788
|
+
throw new Error("Unable to determine head branch for PR");
|
|
1789
|
+
}
|
|
1790
|
+
if (!base) {
|
|
1791
|
+
throw new Error("Unable to determine base branch for PR");
|
|
1792
|
+
}
|
|
1793
|
+
const normalizedBase = normalizeLocalBranchRefName(base);
|
|
1794
|
+
if (storedBaseRef && options.base && options.base !== storedBaseRef) {
|
|
1795
|
+
throw new Error(`Base ref mismatch: expected ${base}, got ${options.base}`);
|
|
1796
|
+
}
|
|
1797
|
+
await runGitCommand(["push", "-u", "origin", head], { cwd, timeout: 120000 });
|
|
1798
|
+
const result = await github.createPullRequest({
|
|
1799
|
+
cwd,
|
|
1800
|
+
repo,
|
|
1801
|
+
title: options.title,
|
|
1802
|
+
body: options.body,
|
|
1803
|
+
head,
|
|
1804
|
+
base: normalizedBase,
|
|
1805
|
+
});
|
|
1806
|
+
github.invalidate({ cwd });
|
|
1807
|
+
return result;
|
|
1808
|
+
}
|
|
1809
|
+
export async function getPullRequestStatus(cwd, github = createGitHubService(), options) {
|
|
1810
|
+
const cacheKey = getPullRequestStatusCacheKey(cwd);
|
|
1811
|
+
if (!options?.force) {
|
|
1812
|
+
const cached = pullRequestStatusCache.get(cacheKey);
|
|
1813
|
+
if (cached) {
|
|
1814
|
+
return cached;
|
|
1815
|
+
}
|
|
1816
|
+
const existing = pullRequestStatusInFlight.get(cacheKey);
|
|
1817
|
+
if (existing) {
|
|
1818
|
+
return existing;
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
const lookup = getPullRequestStatusUncached(cwd, github, options)
|
|
1822
|
+
.then((status) => {
|
|
1823
|
+
pullRequestStatusCache.set(cacheKey, status);
|
|
1824
|
+
rememberPullRequestStatus(cacheKey, status);
|
|
1825
|
+
return status;
|
|
1826
|
+
})
|
|
1827
|
+
.catch((error) => {
|
|
1828
|
+
if (!options?.force && error instanceof GitHubCommandError) {
|
|
1829
|
+
const stale = lastSuccessfulPullRequestStatus.get(cacheKey);
|
|
1830
|
+
if (stale) {
|
|
1831
|
+
return stale;
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
throw error;
|
|
1835
|
+
})
|
|
1836
|
+
.finally(() => {
|
|
1837
|
+
pullRequestStatusInFlight.delete(cacheKey);
|
|
1838
|
+
});
|
|
1839
|
+
pullRequestStatusInFlight.set(cacheKey, lookup);
|
|
1840
|
+
return lookup;
|
|
1841
|
+
}
|
|
1842
|
+
async function getPullRequestStatusUncached(cwd, github, options) {
|
|
1843
|
+
await requireGitRepo(cwd);
|
|
1844
|
+
const head = await getCurrentBranch(cwd);
|
|
1845
|
+
if (!head) {
|
|
1846
|
+
return {
|
|
1847
|
+
status: null,
|
|
1848
|
+
githubFeaturesEnabled: false,
|
|
1849
|
+
};
|
|
1850
|
+
}
|
|
1851
|
+
try {
|
|
1852
|
+
const lookupTarget = await resolvePullRequestStatusLookupTarget(cwd, head);
|
|
1853
|
+
let status;
|
|
1854
|
+
if (options?.force) {
|
|
1855
|
+
const reason = options.reason;
|
|
1856
|
+
if (!reason) {
|
|
1857
|
+
throw new Error("Forced PR status read requires a reason");
|
|
1858
|
+
}
|
|
1859
|
+
status = await github.getCurrentPullRequestStatus({
|
|
1860
|
+
cwd,
|
|
1861
|
+
...lookupTarget,
|
|
1862
|
+
force: true,
|
|
1863
|
+
reason,
|
|
1864
|
+
});
|
|
1865
|
+
}
|
|
1866
|
+
else {
|
|
1867
|
+
status = await github.getCurrentPullRequestStatus({
|
|
1868
|
+
cwd,
|
|
1869
|
+
...lookupTarget,
|
|
1870
|
+
reason: options?.reason,
|
|
1871
|
+
});
|
|
1872
|
+
}
|
|
1873
|
+
return {
|
|
1874
|
+
status,
|
|
1875
|
+
githubFeaturesEnabled: true,
|
|
1876
|
+
};
|
|
1877
|
+
}
|
|
1878
|
+
catch (error) {
|
|
1879
|
+
if (error instanceof GitHubCliMissingError || error instanceof GitHubAuthenticationError) {
|
|
1880
|
+
return { status: null, githubFeaturesEnabled: false };
|
|
1881
|
+
}
|
|
1882
|
+
throw error;
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
//# sourceMappingURL=checkout-git.js.map
|