@earendil-works/pi-coding-agent 0.75.3 → 0.75.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -0
- package/README.md +6 -4
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +2 -2
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -3
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -10
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -14
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +9 -9
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +6 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +7 -7
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +3 -2
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +23 -21
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +99 -137
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +3 -3
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts +3 -3
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +8 -6
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.js +23 -6
- package/dist/core/export-html/tool-renderer.d.ts +2 -2
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +8 -8
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +2 -2
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +12 -29
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -6
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +19 -19
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +2 -2
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +21 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +48 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +8 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +4 -4
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +7 -3
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +2 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +48 -32
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +6 -20
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -9
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +38 -31
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +13 -13
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +9 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +32 -24
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +26 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +2 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +8 -22
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +4 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +54 -52
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +3 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +8 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +5 -3
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +44 -81
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +27 -12
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -2
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +2 -3
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -2
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +3 -3
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +17 -17
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +2 -2
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -5
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +3 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +9 -3
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts +2 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +39 -21
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts +2 -2
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +9 -8
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js +12 -2
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +20 -35
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +28 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +7 -6
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +5 -5
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +2 -2
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +2 -2
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +2 -2
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +2 -2
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +4 -3
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +16 -7
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +31 -31
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +10 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +31 -6
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -2
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +3 -3
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +15 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -3
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +37 -14
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +5 -4
- package/dist/modes/interactive/theme/light.json +5 -4
- package/dist/modes/interactive/theme/theme.d.ts +22 -3
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +119 -68
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +5 -5
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +4 -4
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +40 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/changelog.d.ts +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +3 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js +14 -8
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +124 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +7 -27
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +75 -115
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/paths.d.ts +16 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +49 -7
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +6 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +2 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +9 -4
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/custom-provider.md +44 -12
- package/docs/index.md +13 -3
- package/docs/models.md +8 -2
- package/docs/packages.md +7 -4
- package/docs/quickstart.md +23 -1
- package/docs/sdk.md +2 -0
- package/docs/termux.md +1 -1
- package/docs/usage.md +4 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/index.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +97 -66
- package/examples/extensions/overlay-test.ts +7 -4
- package/examples/extensions/plan-mode/index.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/subagent/README.md +3 -0
- package/examples/extensions/subagent/index.ts +42 -20
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +3 -3
- package/npm-shrinkwrap.json +1790 -0
- package/package.json +33 -32
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
* Modes use this class and add their own I/O layer on top.
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
-
import { basename, dirname
|
|
16
|
+
import { basename, dirname } from "node:path";
|
|
17
17
|
import { clampThinkingLevel, cleanupSessionResources, getSupportedThinkingLevels, isContextOverflow, modelsAreEqual, resetApiProviders, streamSimple, } from "@earendil-works/pi-ai";
|
|
18
18
|
import { theme } from "../modes/interactive/theme/theme.js";
|
|
19
19
|
import { stripFrontmatter } from "../utils/frontmatter.js";
|
|
20
|
+
import { resolvePath } from "../utils/paths.js";
|
|
20
21
|
import { sleep } from "../utils/sleep.js";
|
|
21
22
|
import { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from "./auth-guidance.js";
|
|
22
23
|
import { executeBashWithOperations } from "./bash-executor.js";
|
|
@@ -64,7 +65,6 @@ export class AgentSession {
|
|
|
64
65
|
// Event subscription state
|
|
65
66
|
_unsubscribeAgent;
|
|
66
67
|
_eventListeners = [];
|
|
67
|
-
_agentEventQueue = Promise.resolve();
|
|
68
68
|
/** Tracks pending steering messages for UI display. Removed when delivered. */
|
|
69
69
|
_steeringMessages = [];
|
|
70
70
|
/** Tracks pending follow-up messages for UI display. Removed when delivered. */
|
|
@@ -80,8 +80,6 @@ export class AgentSession {
|
|
|
80
80
|
// Retry state
|
|
81
81
|
_retryAbortController = undefined;
|
|
82
82
|
_retryAttempt = 0;
|
|
83
|
-
_retryPromise = undefined;
|
|
84
|
-
_retryResolve = undefined;
|
|
85
83
|
// Bash execution state
|
|
86
84
|
_bashAbortController = undefined;
|
|
87
85
|
_pendingBashMessages = [];
|
|
@@ -99,6 +97,7 @@ export class AgentSession {
|
|
|
99
97
|
_sessionStartEvent;
|
|
100
98
|
_extensionUIContext;
|
|
101
99
|
_extensionCommandContextActions;
|
|
100
|
+
_extensionAbortHandler;
|
|
102
101
|
_extensionShutdownHandler;
|
|
103
102
|
_extensionErrorListener;
|
|
104
103
|
_extensionErrorUnsubscriber;
|
|
@@ -179,7 +178,6 @@ export class AgentSession {
|
|
|
179
178
|
if (!runner.hasHandlers("tool_call")) {
|
|
180
179
|
return undefined;
|
|
181
180
|
}
|
|
182
|
-
await this._agentEventQueue;
|
|
183
181
|
try {
|
|
184
182
|
return await runner.emitToolCall({
|
|
185
183
|
type: "tool_call",
|
|
@@ -238,43 +236,7 @@ export class AgentSession {
|
|
|
238
236
|
// Track last assistant message for auto-compaction check
|
|
239
237
|
_lastAssistantMessage = undefined;
|
|
240
238
|
/** Internal handler for agent events - shared by subscribe and reconnect */
|
|
241
|
-
_handleAgentEvent = (event) => {
|
|
242
|
-
// Create retry promise synchronously before queueing async processing.
|
|
243
|
-
// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()
|
|
244
|
-
// as soon as agent.prompt() resolves. If _retryPromise is created only inside
|
|
245
|
-
// _processAgentEvent, slow earlier queued events can delay agent_end processing
|
|
246
|
-
// and waitForRetry() can miss the in-flight retry.
|
|
247
|
-
this._createRetryPromiseForAgentEnd(event);
|
|
248
|
-
this._agentEventQueue = this._agentEventQueue.then(() => this._processAgentEvent(event), () => this._processAgentEvent(event));
|
|
249
|
-
// Keep queue alive if an event handler fails
|
|
250
|
-
this._agentEventQueue.catch(() => { });
|
|
251
|
-
};
|
|
252
|
-
_createRetryPromiseForAgentEnd(event) {
|
|
253
|
-
if (event.type !== "agent_end" || this._retryPromise) {
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
const settings = this.settingsManager.getRetrySettings();
|
|
257
|
-
if (!settings.enabled) {
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
const lastAssistant = this._findLastAssistantInMessages(event.messages);
|
|
261
|
-
if (!lastAssistant || !this._isRetryableError(lastAssistant)) {
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
this._retryPromise = new Promise((resolve) => {
|
|
265
|
-
this._retryResolve = resolve;
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
_findLastAssistantInMessages(messages) {
|
|
269
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
270
|
-
const message = messages[i];
|
|
271
|
-
if (message.role === "assistant") {
|
|
272
|
-
return message;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
return undefined;
|
|
276
|
-
}
|
|
277
|
-
async _processAgentEvent(event) {
|
|
239
|
+
_handleAgentEvent = async (event) => {
|
|
278
240
|
// When a user message starts, check if it's from either queue and remove it BEFORE emitting
|
|
279
241
|
// This ensures the UI sees the updated queue state
|
|
280
242
|
if (event.type === "message_start" && event.message.role === "user") {
|
|
@@ -300,7 +262,7 @@ export class AgentSession {
|
|
|
300
262
|
// Emit to extensions first
|
|
301
263
|
await this._emitExtensionEvent(event);
|
|
302
264
|
// Notify all listeners
|
|
303
|
-
this._emit(event);
|
|
265
|
+
this._emit(event.type === "agent_end" ? { ...event, willRetry: this._willRetryAfterAgentEnd(event) } : event);
|
|
304
266
|
// Handle session persistence
|
|
305
267
|
if (event.type === "message_end") {
|
|
306
268
|
// Check if this is a custom message from extensions
|
|
@@ -334,27 +296,19 @@ export class AgentSession {
|
|
|
334
296
|
}
|
|
335
297
|
}
|
|
336
298
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
if (this._isRetryableError(msg)) {
|
|
343
|
-
const didRetry = await this._handleRetryableError(msg);
|
|
344
|
-
if (didRetry)
|
|
345
|
-
return; // Retry was initiated, don't proceed to compaction
|
|
346
|
-
}
|
|
347
|
-
this._resolveRetry();
|
|
348
|
-
await this._checkCompaction(msg);
|
|
299
|
+
};
|
|
300
|
+
_willRetryAfterAgentEnd(event) {
|
|
301
|
+
const settings = this.settingsManager.getRetrySettings();
|
|
302
|
+
if (!settings.enabled || this._retryAttempt >= settings.maxRetries) {
|
|
303
|
+
return false;
|
|
349
304
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
this._retryResolve = undefined;
|
|
356
|
-
this._retryPromise = undefined;
|
|
305
|
+
for (let i = event.messages.length - 1; i >= 0; i--) {
|
|
306
|
+
const message = event.messages[i];
|
|
307
|
+
if (message.role === "assistant") {
|
|
308
|
+
return this._isRetryableError(message);
|
|
309
|
+
}
|
|
357
310
|
}
|
|
311
|
+
return false;
|
|
358
312
|
}
|
|
359
313
|
/** Extract text content from a message */
|
|
360
314
|
_getUserMessageText(message) {
|
|
@@ -379,7 +333,7 @@ export class AgentSession {
|
|
|
379
333
|
}
|
|
380
334
|
_replaceMessageInPlace(target, replacement) {
|
|
381
335
|
// Agent-core stores the finalized message object in its state before emitting message_end.
|
|
382
|
-
// SessionManager persistence happens later in
|
|
336
|
+
// SessionManager persistence happens later in _handleAgentEvent() with event.message.
|
|
383
337
|
// Mutating this object in place keeps agent state, later turn/agent events, listeners,
|
|
384
338
|
// and the eventual SessionManager.appendMessage(event.message) persistence in sync.
|
|
385
339
|
if (target === replacement) {
|
|
@@ -685,6 +639,37 @@ export class AgentSession {
|
|
|
685
639
|
// =========================================================================
|
|
686
640
|
// Prompting
|
|
687
641
|
// =========================================================================
|
|
642
|
+
async _runAgentPrompt(messages) {
|
|
643
|
+
try {
|
|
644
|
+
await this.agent.prompt(messages);
|
|
645
|
+
while (await this._handlePostAgentRun()) {
|
|
646
|
+
await this.agent.continue();
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
finally {
|
|
650
|
+
this._flushPendingBashMessages();
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
async _handlePostAgentRun() {
|
|
654
|
+
const msg = this._lastAssistantMessage;
|
|
655
|
+
this._lastAssistantMessage = undefined;
|
|
656
|
+
if (!msg) {
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
if (this._isRetryableError(msg) && (await this._prepareRetry(msg))) {
|
|
660
|
+
return true;
|
|
661
|
+
}
|
|
662
|
+
if (msg.stopReason === "error" && this._retryAttempt > 0) {
|
|
663
|
+
this._emit({
|
|
664
|
+
type: "auto_retry_end",
|
|
665
|
+
success: false,
|
|
666
|
+
attempt: this._retryAttempt,
|
|
667
|
+
finalError: msg.errorMessage,
|
|
668
|
+
});
|
|
669
|
+
this._retryAttempt = 0;
|
|
670
|
+
}
|
|
671
|
+
return await this._checkCompaction(msg);
|
|
672
|
+
}
|
|
688
673
|
/**
|
|
689
674
|
* Send a prompt to the agent.
|
|
690
675
|
* - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming
|
|
@@ -760,8 +745,16 @@ export class AgentSession {
|
|
|
760
745
|
}
|
|
761
746
|
// Check if we need to compact before sending (catches aborted responses)
|
|
762
747
|
const lastAssistant = this._findLastAssistantMessage();
|
|
763
|
-
if (lastAssistant) {
|
|
764
|
-
|
|
748
|
+
if (lastAssistant && (await this._checkCompaction(lastAssistant, false))) {
|
|
749
|
+
try {
|
|
750
|
+
await this.agent.continue();
|
|
751
|
+
while (await this._handlePostAgentRun()) {
|
|
752
|
+
await this.agent.continue();
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
finally {
|
|
756
|
+
this._flushPendingBashMessages();
|
|
757
|
+
}
|
|
765
758
|
}
|
|
766
759
|
// Build messages array (custom message if any, then user message)
|
|
767
760
|
messages = [];
|
|
@@ -812,8 +805,7 @@ export class AgentSession {
|
|
|
812
805
|
return;
|
|
813
806
|
}
|
|
814
807
|
preflightResult?.(true);
|
|
815
|
-
await this.
|
|
816
|
-
await this.waitForRetry();
|
|
808
|
+
await this._runAgentPrompt(messages);
|
|
817
809
|
}
|
|
818
810
|
/**
|
|
819
811
|
* Try to execute an extension command. Returns true if command was found and executed.
|
|
@@ -983,7 +975,7 @@ export class AgentSession {
|
|
|
983
975
|
}
|
|
984
976
|
}
|
|
985
977
|
else if (options?.triggerTurn) {
|
|
986
|
-
await this.
|
|
978
|
+
await this._runAgentPrompt(appMessage);
|
|
987
979
|
}
|
|
988
980
|
else {
|
|
989
981
|
this.agent.state.messages.push(appMessage);
|
|
@@ -1383,10 +1375,10 @@ export class AgentSession {
|
|
|
1383
1375
|
async _checkCompaction(assistantMessage, skipAbortedCheck = true) {
|
|
1384
1376
|
const settings = this.settingsManager.getCompactionSettings();
|
|
1385
1377
|
if (!settings.enabled)
|
|
1386
|
-
return;
|
|
1378
|
+
return false;
|
|
1387
1379
|
// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false
|
|
1388
1380
|
if (skipAbortedCheck && assistantMessage.stopReason === "aborted")
|
|
1389
|
-
return;
|
|
1381
|
+
return false;
|
|
1390
1382
|
const contextWindow = this.model?.contextWindow ?? 0;
|
|
1391
1383
|
// Skip overflow check if the message came from a different model.
|
|
1392
1384
|
// This handles the case where user switched from a smaller-context model (e.g. opus)
|
|
@@ -1399,7 +1391,7 @@ export class AgentSession {
|
|
|
1399
1391
|
const compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());
|
|
1400
1392
|
const assistantIsFromBeforeCompaction = compactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();
|
|
1401
1393
|
if (assistantIsFromBeforeCompaction) {
|
|
1402
|
-
return;
|
|
1394
|
+
return false;
|
|
1403
1395
|
}
|
|
1404
1396
|
// Case 1: Overflow - LLM returned context overflow error
|
|
1405
1397
|
if (sameModel && isContextOverflow(assistantMessage, contextWindow)) {
|
|
@@ -1412,7 +1404,7 @@ export class AgentSession {
|
|
|
1412
1404
|
willRetry: false,
|
|
1413
1405
|
errorMessage: "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.",
|
|
1414
1406
|
});
|
|
1415
|
-
return;
|
|
1407
|
+
return false;
|
|
1416
1408
|
}
|
|
1417
1409
|
this._overflowRecoveryAttempted = true;
|
|
1418
1410
|
// Remove the error message from agent state (it IS saved to session for history,
|
|
@@ -1421,8 +1413,7 @@ export class AgentSession {
|
|
|
1421
1413
|
if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
|
|
1422
1414
|
this.agent.state.messages = messages.slice(0, -1);
|
|
1423
1415
|
}
|
|
1424
|
-
await this._runAutoCompaction("overflow", true);
|
|
1425
|
-
return;
|
|
1416
|
+
return await this._runAutoCompaction("overflow", true);
|
|
1426
1417
|
}
|
|
1427
1418
|
// Case 2: Threshold - context is getting large
|
|
1428
1419
|
// For error messages (no usage data), estimate from last successful response.
|
|
@@ -1432,7 +1423,7 @@ export class AgentSession {
|
|
|
1432
1423
|
const messages = this.agent.state.messages;
|
|
1433
1424
|
const estimate = estimateContextTokens(messages);
|
|
1434
1425
|
if (estimate.lastUsageIndex === null)
|
|
1435
|
-
return; // No usage data at all
|
|
1426
|
+
return false; // No usage data at all
|
|
1436
1427
|
// Verify the usage source is post-compaction. Kept pre-compaction messages
|
|
1437
1428
|
// have stale usage reflecting the old (larger) context and would falsely
|
|
1438
1429
|
// trigger compaction right after one just finished.
|
|
@@ -1440,7 +1431,7 @@ export class AgentSession {
|
|
|
1440
1431
|
if (compactionEntry &&
|
|
1441
1432
|
usageMsg.role === "assistant" &&
|
|
1442
1433
|
usageMsg.timestamp <= new Date(compactionEntry.timestamp).getTime()) {
|
|
1443
|
-
return;
|
|
1434
|
+
return false;
|
|
1444
1435
|
}
|
|
1445
1436
|
contextTokens = estimate.tokens;
|
|
1446
1437
|
}
|
|
@@ -1448,8 +1439,9 @@ export class AgentSession {
|
|
|
1448
1439
|
contextTokens = calculateContextTokens(assistantMessage.usage);
|
|
1449
1440
|
}
|
|
1450
1441
|
if (shouldCompact(contextTokens, contextWindow, settings)) {
|
|
1451
|
-
await this._runAutoCompaction("threshold", false);
|
|
1442
|
+
return await this._runAutoCompaction("threshold", false);
|
|
1452
1443
|
}
|
|
1444
|
+
return false;
|
|
1453
1445
|
}
|
|
1454
1446
|
/**
|
|
1455
1447
|
* Internal: Run auto-compaction with events.
|
|
@@ -1467,7 +1459,7 @@ export class AgentSession {
|
|
|
1467
1459
|
aborted: false,
|
|
1468
1460
|
willRetry: false,
|
|
1469
1461
|
});
|
|
1470
|
-
return;
|
|
1462
|
+
return false;
|
|
1471
1463
|
}
|
|
1472
1464
|
let apiKey;
|
|
1473
1465
|
let headers;
|
|
@@ -1481,7 +1473,7 @@ export class AgentSession {
|
|
|
1481
1473
|
aborted: false,
|
|
1482
1474
|
willRetry: false,
|
|
1483
1475
|
});
|
|
1484
|
-
return;
|
|
1476
|
+
return false;
|
|
1485
1477
|
}
|
|
1486
1478
|
apiKey = authResult.apiKey;
|
|
1487
1479
|
headers = authResult.headers;
|
|
@@ -1499,7 +1491,7 @@ export class AgentSession {
|
|
|
1499
1491
|
aborted: false,
|
|
1500
1492
|
willRetry: false,
|
|
1501
1493
|
});
|
|
1502
|
-
return;
|
|
1494
|
+
return false;
|
|
1503
1495
|
}
|
|
1504
1496
|
let extensionCompaction;
|
|
1505
1497
|
let fromExtension = false;
|
|
@@ -1519,7 +1511,7 @@ export class AgentSession {
|
|
|
1519
1511
|
aborted: true,
|
|
1520
1512
|
willRetry: false,
|
|
1521
1513
|
});
|
|
1522
|
-
return;
|
|
1514
|
+
return false;
|
|
1523
1515
|
}
|
|
1524
1516
|
if (extensionResult?.compaction) {
|
|
1525
1517
|
extensionCompaction = extensionResult.compaction;
|
|
@@ -1553,7 +1545,7 @@ export class AgentSession {
|
|
|
1553
1545
|
aborted: true,
|
|
1554
1546
|
willRetry: false,
|
|
1555
1547
|
});
|
|
1556
|
-
return;
|
|
1548
|
+
return false;
|
|
1557
1549
|
}
|
|
1558
1550
|
this.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);
|
|
1559
1551
|
const newEntries = this.sessionManager.getEntries();
|
|
@@ -1581,17 +1573,11 @@ export class AgentSession {
|
|
|
1581
1573
|
if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
|
|
1582
1574
|
this.agent.state.messages = messages.slice(0, -1);
|
|
1583
1575
|
}
|
|
1584
|
-
|
|
1585
|
-
this.agent.continue().catch(() => { });
|
|
1586
|
-
}, 100);
|
|
1587
|
-
}
|
|
1588
|
-
else if (this.agent.hasQueuedMessages()) {
|
|
1589
|
-
// Auto-compaction can complete while follow-up/steering/custom messages are waiting.
|
|
1590
|
-
// Kick the loop so queued messages are actually delivered.
|
|
1591
|
-
setTimeout(() => {
|
|
1592
|
-
this.agent.continue().catch(() => { });
|
|
1593
|
-
}, 100);
|
|
1576
|
+
return true;
|
|
1594
1577
|
}
|
|
1578
|
+
// Auto-compaction can complete while follow-up/steering/custom messages are waiting.
|
|
1579
|
+
// Continue once so queued messages are delivered.
|
|
1580
|
+
return this.agent.hasQueuedMessages();
|
|
1595
1581
|
}
|
|
1596
1582
|
catch (error) {
|
|
1597
1583
|
const errorMessage = error instanceof Error ? error.message : "compaction failed";
|
|
@@ -1605,6 +1591,7 @@ export class AgentSession {
|
|
|
1605
1591
|
? `Context overflow recovery failed: ${errorMessage}`
|
|
1606
1592
|
: `Auto-compaction failed: ${errorMessage}`,
|
|
1607
1593
|
});
|
|
1594
|
+
return false;
|
|
1608
1595
|
}
|
|
1609
1596
|
finally {
|
|
1610
1597
|
this._autoCompactionAbortController = undefined;
|
|
@@ -1627,6 +1614,9 @@ export class AgentSession {
|
|
|
1627
1614
|
if (bindings.commandContextActions !== undefined) {
|
|
1628
1615
|
this._extensionCommandContextActions = bindings.commandContextActions;
|
|
1629
1616
|
}
|
|
1617
|
+
if (bindings.abortHandler !== undefined) {
|
|
1618
|
+
this._extensionAbortHandler = bindings.abortHandler;
|
|
1619
|
+
}
|
|
1630
1620
|
if (bindings.shutdownHandler !== undefined) {
|
|
1631
1621
|
this._extensionShutdownHandler = bindings.shutdownHandler;
|
|
1632
1622
|
}
|
|
@@ -1766,7 +1756,13 @@ export class AgentSession {
|
|
|
1766
1756
|
getModel: () => this.model,
|
|
1767
1757
|
isIdle: () => !this.isStreaming,
|
|
1768
1758
|
getSignal: () => this.agent.signal,
|
|
1769
|
-
abort: () =>
|
|
1759
|
+
abort: () => {
|
|
1760
|
+
if (this._extensionAbortHandler) {
|
|
1761
|
+
this._extensionAbortHandler();
|
|
1762
|
+
return;
|
|
1763
|
+
}
|
|
1764
|
+
void this.abort();
|
|
1765
|
+
},
|
|
1770
1766
|
hasPendingMessages: () => this.pendingMessageCount > 0,
|
|
1771
1767
|
shutdown: () => {
|
|
1772
1768
|
this._extensionShutdownHandler?.();
|
|
@@ -1946,33 +1942,18 @@ export class AgentSession {
|
|
|
1946
1942
|
return /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|stream ended before message_stop|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i.test(err);
|
|
1947
1943
|
}
|
|
1948
1944
|
/**
|
|
1949
|
-
*
|
|
1950
|
-
* @returns true if
|
|
1945
|
+
* Prepare a retryable error for continuation with exponential backoff.
|
|
1946
|
+
* @returns true if the caller should continue the agent, false otherwise
|
|
1951
1947
|
*/
|
|
1952
|
-
async
|
|
1948
|
+
async _prepareRetry(message) {
|
|
1953
1949
|
const settings = this.settingsManager.getRetrySettings();
|
|
1954
1950
|
if (!settings.enabled) {
|
|
1955
|
-
this._resolveRetry();
|
|
1956
1951
|
return false;
|
|
1957
1952
|
}
|
|
1958
|
-
// Retry promise is created synchronously in _handleAgentEvent for agent_end.
|
|
1959
|
-
// Keep a defensive fallback here in case a future refactor bypasses that path.
|
|
1960
|
-
if (!this._retryPromise) {
|
|
1961
|
-
this._retryPromise = new Promise((resolve) => {
|
|
1962
|
-
this._retryResolve = resolve;
|
|
1963
|
-
});
|
|
1964
|
-
}
|
|
1965
1953
|
this._retryAttempt++;
|
|
1966
1954
|
if (this._retryAttempt > settings.maxRetries) {
|
|
1967
|
-
//
|
|
1968
|
-
this.
|
|
1969
|
-
type: "auto_retry_end",
|
|
1970
|
-
success: false,
|
|
1971
|
-
attempt: this._retryAttempt - 1,
|
|
1972
|
-
finalError: message.errorMessage,
|
|
1973
|
-
});
|
|
1974
|
-
this._retryAttempt = 0;
|
|
1975
|
-
this._resolveRetry(); // Resolve so waitForRetry() completes
|
|
1955
|
+
// Preserve the completed attempt count so post-run handling can emit the final failure.
|
|
1956
|
+
this._retryAttempt--;
|
|
1976
1957
|
return false;
|
|
1977
1958
|
}
|
|
1978
1959
|
const delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
|
|
@@ -1997,23 +1978,17 @@ export class AgentSession {
|
|
|
1997
1978
|
// Aborted during sleep - emit end event so UI can clean up
|
|
1998
1979
|
const attempt = this._retryAttempt;
|
|
1999
1980
|
this._retryAttempt = 0;
|
|
2000
|
-
this._retryAbortController = undefined;
|
|
2001
1981
|
this._emit({
|
|
2002
1982
|
type: "auto_retry_end",
|
|
2003
1983
|
success: false,
|
|
2004
1984
|
attempt,
|
|
2005
1985
|
finalError: "Retry cancelled",
|
|
2006
1986
|
});
|
|
2007
|
-
this._resolveRetry();
|
|
2008
1987
|
return false;
|
|
2009
1988
|
}
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
this.agent.continue().catch(() => {
|
|
2014
|
-
// Retry failed - will be caught by next agent_end
|
|
2015
|
-
});
|
|
2016
|
-
}, 0);
|
|
1989
|
+
finally {
|
|
1990
|
+
this._retryAbortController = undefined;
|
|
1991
|
+
}
|
|
2017
1992
|
return true;
|
|
2018
1993
|
}
|
|
2019
1994
|
/**
|
|
@@ -2021,23 +1996,10 @@ export class AgentSession {
|
|
|
2021
1996
|
*/
|
|
2022
1997
|
abortRetry() {
|
|
2023
1998
|
this._retryAbortController?.abort();
|
|
2024
|
-
// Note: _retryAttempt is reset in the catch block of _autoRetry
|
|
2025
|
-
this._resolveRetry();
|
|
2026
|
-
}
|
|
2027
|
-
/**
|
|
2028
|
-
* Wait for any in-progress retry to complete.
|
|
2029
|
-
* Returns immediately if no retry is in progress.
|
|
2030
|
-
*/
|
|
2031
|
-
async waitForRetry() {
|
|
2032
|
-
if (!this._retryPromise) {
|
|
2033
|
-
return;
|
|
2034
|
-
}
|
|
2035
|
-
await this._retryPromise;
|
|
2036
|
-
await this.agent.waitForIdle();
|
|
2037
1999
|
}
|
|
2038
2000
|
/** Whether auto-retry is currently in progress */
|
|
2039
2001
|
get isRetrying() {
|
|
2040
|
-
return this.
|
|
2002
|
+
return this._retryAbortController !== undefined;
|
|
2041
2003
|
}
|
|
2042
2004
|
/** Whether auto-retry is enabled */
|
|
2043
2005
|
get autoRetryEnabled() {
|
|
@@ -2456,7 +2418,7 @@ export class AgentSession {
|
|
|
2456
2418
|
* @returns The resolved output file path.
|
|
2457
2419
|
*/
|
|
2458
2420
|
exportToJsonl(outputPath) {
|
|
2459
|
-
const filePath =
|
|
2421
|
+
const filePath = resolvePath(outputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, "-")}.jsonl`, process.cwd());
|
|
2460
2422
|
const dir = dirname(filePath);
|
|
2461
2423
|
if (!existsSync(dir)) {
|
|
2462
2424
|
mkdirSync(dir, { recursive: true });
|