@earendil-works/pi-coding-agent 0.75.2 → 0.75.4
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 +44 -0
- package/README.md +5 -3
- 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.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 +10 -4
- 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 +4 -5
- 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.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 +96 -135
- 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 +1 -1
- 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.map +1 -1
- package/dist/core/export-html/template.js +17 -3
- 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.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 +2 -2
- 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 +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +2 -1
- 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.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.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.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.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 +20 -0
- 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.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 +1 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +2 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.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.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.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.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.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.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/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- 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 +2 -0
- 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.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 +3 -3
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- 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 +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +2 -2
- 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 +33 -10
- 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 +82 -40
- 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.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.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +16 -0
- 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/index.md +13 -3
- package/docs/packages.md +2 -0
- package/docs/quickstart.md +23 -1
- package/docs/termux.md +1 -1
- package/docs/usage.md +2 -0
- 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 +1803 -0
- package/package.json +32 -31
|
@@ -64,7 +64,6 @@ export class AgentSession {
|
|
|
64
64
|
// Event subscription state
|
|
65
65
|
_unsubscribeAgent;
|
|
66
66
|
_eventListeners = [];
|
|
67
|
-
_agentEventQueue = Promise.resolve();
|
|
68
67
|
/** Tracks pending steering messages for UI display. Removed when delivered. */
|
|
69
68
|
_steeringMessages = [];
|
|
70
69
|
/** Tracks pending follow-up messages for UI display. Removed when delivered. */
|
|
@@ -80,8 +79,6 @@ export class AgentSession {
|
|
|
80
79
|
// Retry state
|
|
81
80
|
_retryAbortController = undefined;
|
|
82
81
|
_retryAttempt = 0;
|
|
83
|
-
_retryPromise = undefined;
|
|
84
|
-
_retryResolve = undefined;
|
|
85
82
|
// Bash execution state
|
|
86
83
|
_bashAbortController = undefined;
|
|
87
84
|
_pendingBashMessages = [];
|
|
@@ -99,6 +96,7 @@ export class AgentSession {
|
|
|
99
96
|
_sessionStartEvent;
|
|
100
97
|
_extensionUIContext;
|
|
101
98
|
_extensionCommandContextActions;
|
|
99
|
+
_extensionAbortHandler;
|
|
102
100
|
_extensionShutdownHandler;
|
|
103
101
|
_extensionErrorListener;
|
|
104
102
|
_extensionErrorUnsubscriber;
|
|
@@ -179,7 +177,6 @@ export class AgentSession {
|
|
|
179
177
|
if (!runner.hasHandlers("tool_call")) {
|
|
180
178
|
return undefined;
|
|
181
179
|
}
|
|
182
|
-
await this._agentEventQueue;
|
|
183
180
|
try {
|
|
184
181
|
return await runner.emitToolCall({
|
|
185
182
|
type: "tool_call",
|
|
@@ -238,43 +235,7 @@ export class AgentSession {
|
|
|
238
235
|
// Track last assistant message for auto-compaction check
|
|
239
236
|
_lastAssistantMessage = undefined;
|
|
240
237
|
/** 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) {
|
|
238
|
+
_handleAgentEvent = async (event) => {
|
|
278
239
|
// When a user message starts, check if it's from either queue and remove it BEFORE emitting
|
|
279
240
|
// This ensures the UI sees the updated queue state
|
|
280
241
|
if (event.type === "message_start" && event.message.role === "user") {
|
|
@@ -300,7 +261,7 @@ export class AgentSession {
|
|
|
300
261
|
// Emit to extensions first
|
|
301
262
|
await this._emitExtensionEvent(event);
|
|
302
263
|
// Notify all listeners
|
|
303
|
-
this._emit(event);
|
|
264
|
+
this._emit(event.type === "agent_end" ? { ...event, willRetry: this._willRetryAfterAgentEnd(event) } : event);
|
|
304
265
|
// Handle session persistence
|
|
305
266
|
if (event.type === "message_end") {
|
|
306
267
|
// Check if this is a custom message from extensions
|
|
@@ -334,27 +295,19 @@ export class AgentSession {
|
|
|
334
295
|
}
|
|
335
296
|
}
|
|
336
297
|
}
|
|
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);
|
|
298
|
+
};
|
|
299
|
+
_willRetryAfterAgentEnd(event) {
|
|
300
|
+
const settings = this.settingsManager.getRetrySettings();
|
|
301
|
+
if (!settings.enabled || this._retryAttempt >= settings.maxRetries) {
|
|
302
|
+
return false;
|
|
349
303
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
this._retryResolve = undefined;
|
|
356
|
-
this._retryPromise = undefined;
|
|
304
|
+
for (let i = event.messages.length - 1; i >= 0; i--) {
|
|
305
|
+
const message = event.messages[i];
|
|
306
|
+
if (message.role === "assistant") {
|
|
307
|
+
return this._isRetryableError(message);
|
|
308
|
+
}
|
|
357
309
|
}
|
|
310
|
+
return false;
|
|
358
311
|
}
|
|
359
312
|
/** Extract text content from a message */
|
|
360
313
|
_getUserMessageText(message) {
|
|
@@ -379,7 +332,7 @@ export class AgentSession {
|
|
|
379
332
|
}
|
|
380
333
|
_replaceMessageInPlace(target, replacement) {
|
|
381
334
|
// Agent-core stores the finalized message object in its state before emitting message_end.
|
|
382
|
-
// SessionManager persistence happens later in
|
|
335
|
+
// SessionManager persistence happens later in _handleAgentEvent() with event.message.
|
|
383
336
|
// Mutating this object in place keeps agent state, later turn/agent events, listeners,
|
|
384
337
|
// and the eventual SessionManager.appendMessage(event.message) persistence in sync.
|
|
385
338
|
if (target === replacement) {
|
|
@@ -685,6 +638,37 @@ export class AgentSession {
|
|
|
685
638
|
// =========================================================================
|
|
686
639
|
// Prompting
|
|
687
640
|
// =========================================================================
|
|
641
|
+
async _runAgentPrompt(messages) {
|
|
642
|
+
try {
|
|
643
|
+
await this.agent.prompt(messages);
|
|
644
|
+
while (await this._handlePostAgentRun()) {
|
|
645
|
+
await this.agent.continue();
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
finally {
|
|
649
|
+
this._flushPendingBashMessages();
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
async _handlePostAgentRun() {
|
|
653
|
+
const msg = this._lastAssistantMessage;
|
|
654
|
+
this._lastAssistantMessage = undefined;
|
|
655
|
+
if (!msg) {
|
|
656
|
+
return false;
|
|
657
|
+
}
|
|
658
|
+
if (this._isRetryableError(msg) && (await this._prepareRetry(msg))) {
|
|
659
|
+
return true;
|
|
660
|
+
}
|
|
661
|
+
if (msg.stopReason === "error" && this._retryAttempt > 0) {
|
|
662
|
+
this._emit({
|
|
663
|
+
type: "auto_retry_end",
|
|
664
|
+
success: false,
|
|
665
|
+
attempt: this._retryAttempt,
|
|
666
|
+
finalError: msg.errorMessage,
|
|
667
|
+
});
|
|
668
|
+
this._retryAttempt = 0;
|
|
669
|
+
}
|
|
670
|
+
return await this._checkCompaction(msg);
|
|
671
|
+
}
|
|
688
672
|
/**
|
|
689
673
|
* Send a prompt to the agent.
|
|
690
674
|
* - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming
|
|
@@ -760,8 +744,16 @@ export class AgentSession {
|
|
|
760
744
|
}
|
|
761
745
|
// Check if we need to compact before sending (catches aborted responses)
|
|
762
746
|
const lastAssistant = this._findLastAssistantMessage();
|
|
763
|
-
if (lastAssistant) {
|
|
764
|
-
|
|
747
|
+
if (lastAssistant && (await this._checkCompaction(lastAssistant, false))) {
|
|
748
|
+
try {
|
|
749
|
+
await this.agent.continue();
|
|
750
|
+
while (await this._handlePostAgentRun()) {
|
|
751
|
+
await this.agent.continue();
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
finally {
|
|
755
|
+
this._flushPendingBashMessages();
|
|
756
|
+
}
|
|
765
757
|
}
|
|
766
758
|
// Build messages array (custom message if any, then user message)
|
|
767
759
|
messages = [];
|
|
@@ -812,8 +804,7 @@ export class AgentSession {
|
|
|
812
804
|
return;
|
|
813
805
|
}
|
|
814
806
|
preflightResult?.(true);
|
|
815
|
-
await this.
|
|
816
|
-
await this.waitForRetry();
|
|
807
|
+
await this._runAgentPrompt(messages);
|
|
817
808
|
}
|
|
818
809
|
/**
|
|
819
810
|
* Try to execute an extension command. Returns true if command was found and executed.
|
|
@@ -983,7 +974,7 @@ export class AgentSession {
|
|
|
983
974
|
}
|
|
984
975
|
}
|
|
985
976
|
else if (options?.triggerTurn) {
|
|
986
|
-
await this.
|
|
977
|
+
await this._runAgentPrompt(appMessage);
|
|
987
978
|
}
|
|
988
979
|
else {
|
|
989
980
|
this.agent.state.messages.push(appMessage);
|
|
@@ -1383,10 +1374,10 @@ export class AgentSession {
|
|
|
1383
1374
|
async _checkCompaction(assistantMessage, skipAbortedCheck = true) {
|
|
1384
1375
|
const settings = this.settingsManager.getCompactionSettings();
|
|
1385
1376
|
if (!settings.enabled)
|
|
1386
|
-
return;
|
|
1377
|
+
return false;
|
|
1387
1378
|
// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false
|
|
1388
1379
|
if (skipAbortedCheck && assistantMessage.stopReason === "aborted")
|
|
1389
|
-
return;
|
|
1380
|
+
return false;
|
|
1390
1381
|
const contextWindow = this.model?.contextWindow ?? 0;
|
|
1391
1382
|
// Skip overflow check if the message came from a different model.
|
|
1392
1383
|
// This handles the case where user switched from a smaller-context model (e.g. opus)
|
|
@@ -1399,7 +1390,7 @@ export class AgentSession {
|
|
|
1399
1390
|
const compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());
|
|
1400
1391
|
const assistantIsFromBeforeCompaction = compactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();
|
|
1401
1392
|
if (assistantIsFromBeforeCompaction) {
|
|
1402
|
-
return;
|
|
1393
|
+
return false;
|
|
1403
1394
|
}
|
|
1404
1395
|
// Case 1: Overflow - LLM returned context overflow error
|
|
1405
1396
|
if (sameModel && isContextOverflow(assistantMessage, contextWindow)) {
|
|
@@ -1412,7 +1403,7 @@ export class AgentSession {
|
|
|
1412
1403
|
willRetry: false,
|
|
1413
1404
|
errorMessage: "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.",
|
|
1414
1405
|
});
|
|
1415
|
-
return;
|
|
1406
|
+
return false;
|
|
1416
1407
|
}
|
|
1417
1408
|
this._overflowRecoveryAttempted = true;
|
|
1418
1409
|
// Remove the error message from agent state (it IS saved to session for history,
|
|
@@ -1421,8 +1412,7 @@ export class AgentSession {
|
|
|
1421
1412
|
if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
|
|
1422
1413
|
this.agent.state.messages = messages.slice(0, -1);
|
|
1423
1414
|
}
|
|
1424
|
-
await this._runAutoCompaction("overflow", true);
|
|
1425
|
-
return;
|
|
1415
|
+
return await this._runAutoCompaction("overflow", true);
|
|
1426
1416
|
}
|
|
1427
1417
|
// Case 2: Threshold - context is getting large
|
|
1428
1418
|
// For error messages (no usage data), estimate from last successful response.
|
|
@@ -1432,7 +1422,7 @@ export class AgentSession {
|
|
|
1432
1422
|
const messages = this.agent.state.messages;
|
|
1433
1423
|
const estimate = estimateContextTokens(messages);
|
|
1434
1424
|
if (estimate.lastUsageIndex === null)
|
|
1435
|
-
return; // No usage data at all
|
|
1425
|
+
return false; // No usage data at all
|
|
1436
1426
|
// Verify the usage source is post-compaction. Kept pre-compaction messages
|
|
1437
1427
|
// have stale usage reflecting the old (larger) context and would falsely
|
|
1438
1428
|
// trigger compaction right after one just finished.
|
|
@@ -1440,7 +1430,7 @@ export class AgentSession {
|
|
|
1440
1430
|
if (compactionEntry &&
|
|
1441
1431
|
usageMsg.role === "assistant" &&
|
|
1442
1432
|
usageMsg.timestamp <= new Date(compactionEntry.timestamp).getTime()) {
|
|
1443
|
-
return;
|
|
1433
|
+
return false;
|
|
1444
1434
|
}
|
|
1445
1435
|
contextTokens = estimate.tokens;
|
|
1446
1436
|
}
|
|
@@ -1448,8 +1438,9 @@ export class AgentSession {
|
|
|
1448
1438
|
contextTokens = calculateContextTokens(assistantMessage.usage);
|
|
1449
1439
|
}
|
|
1450
1440
|
if (shouldCompact(contextTokens, contextWindow, settings)) {
|
|
1451
|
-
await this._runAutoCompaction("threshold", false);
|
|
1441
|
+
return await this._runAutoCompaction("threshold", false);
|
|
1452
1442
|
}
|
|
1443
|
+
return false;
|
|
1453
1444
|
}
|
|
1454
1445
|
/**
|
|
1455
1446
|
* Internal: Run auto-compaction with events.
|
|
@@ -1467,7 +1458,7 @@ export class AgentSession {
|
|
|
1467
1458
|
aborted: false,
|
|
1468
1459
|
willRetry: false,
|
|
1469
1460
|
});
|
|
1470
|
-
return;
|
|
1461
|
+
return false;
|
|
1471
1462
|
}
|
|
1472
1463
|
let apiKey;
|
|
1473
1464
|
let headers;
|
|
@@ -1481,7 +1472,7 @@ export class AgentSession {
|
|
|
1481
1472
|
aborted: false,
|
|
1482
1473
|
willRetry: false,
|
|
1483
1474
|
});
|
|
1484
|
-
return;
|
|
1475
|
+
return false;
|
|
1485
1476
|
}
|
|
1486
1477
|
apiKey = authResult.apiKey;
|
|
1487
1478
|
headers = authResult.headers;
|
|
@@ -1499,7 +1490,7 @@ export class AgentSession {
|
|
|
1499
1490
|
aborted: false,
|
|
1500
1491
|
willRetry: false,
|
|
1501
1492
|
});
|
|
1502
|
-
return;
|
|
1493
|
+
return false;
|
|
1503
1494
|
}
|
|
1504
1495
|
let extensionCompaction;
|
|
1505
1496
|
let fromExtension = false;
|
|
@@ -1519,7 +1510,7 @@ export class AgentSession {
|
|
|
1519
1510
|
aborted: true,
|
|
1520
1511
|
willRetry: false,
|
|
1521
1512
|
});
|
|
1522
|
-
return;
|
|
1513
|
+
return false;
|
|
1523
1514
|
}
|
|
1524
1515
|
if (extensionResult?.compaction) {
|
|
1525
1516
|
extensionCompaction = extensionResult.compaction;
|
|
@@ -1553,7 +1544,7 @@ export class AgentSession {
|
|
|
1553
1544
|
aborted: true,
|
|
1554
1545
|
willRetry: false,
|
|
1555
1546
|
});
|
|
1556
|
-
return;
|
|
1547
|
+
return false;
|
|
1557
1548
|
}
|
|
1558
1549
|
this.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);
|
|
1559
1550
|
const newEntries = this.sessionManager.getEntries();
|
|
@@ -1581,17 +1572,11 @@ export class AgentSession {
|
|
|
1581
1572
|
if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
|
|
1582
1573
|
this.agent.state.messages = messages.slice(0, -1);
|
|
1583
1574
|
}
|
|
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);
|
|
1575
|
+
return true;
|
|
1594
1576
|
}
|
|
1577
|
+
// Auto-compaction can complete while follow-up/steering/custom messages are waiting.
|
|
1578
|
+
// Continue once so queued messages are delivered.
|
|
1579
|
+
return this.agent.hasQueuedMessages();
|
|
1595
1580
|
}
|
|
1596
1581
|
catch (error) {
|
|
1597
1582
|
const errorMessage = error instanceof Error ? error.message : "compaction failed";
|
|
@@ -1605,6 +1590,7 @@ export class AgentSession {
|
|
|
1605
1590
|
? `Context overflow recovery failed: ${errorMessage}`
|
|
1606
1591
|
: `Auto-compaction failed: ${errorMessage}`,
|
|
1607
1592
|
});
|
|
1593
|
+
return false;
|
|
1608
1594
|
}
|
|
1609
1595
|
finally {
|
|
1610
1596
|
this._autoCompactionAbortController = undefined;
|
|
@@ -1627,6 +1613,9 @@ export class AgentSession {
|
|
|
1627
1613
|
if (bindings.commandContextActions !== undefined) {
|
|
1628
1614
|
this._extensionCommandContextActions = bindings.commandContextActions;
|
|
1629
1615
|
}
|
|
1616
|
+
if (bindings.abortHandler !== undefined) {
|
|
1617
|
+
this._extensionAbortHandler = bindings.abortHandler;
|
|
1618
|
+
}
|
|
1630
1619
|
if (bindings.shutdownHandler !== undefined) {
|
|
1631
1620
|
this._extensionShutdownHandler = bindings.shutdownHandler;
|
|
1632
1621
|
}
|
|
@@ -1766,7 +1755,13 @@ export class AgentSession {
|
|
|
1766
1755
|
getModel: () => this.model,
|
|
1767
1756
|
isIdle: () => !this.isStreaming,
|
|
1768
1757
|
getSignal: () => this.agent.signal,
|
|
1769
|
-
abort: () =>
|
|
1758
|
+
abort: () => {
|
|
1759
|
+
if (this._extensionAbortHandler) {
|
|
1760
|
+
this._extensionAbortHandler();
|
|
1761
|
+
return;
|
|
1762
|
+
}
|
|
1763
|
+
void this.abort();
|
|
1764
|
+
},
|
|
1770
1765
|
hasPendingMessages: () => this.pendingMessageCount > 0,
|
|
1771
1766
|
shutdown: () => {
|
|
1772
1767
|
this._extensionShutdownHandler?.();
|
|
@@ -1946,33 +1941,18 @@ export class AgentSession {
|
|
|
1946
1941
|
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
1942
|
}
|
|
1948
1943
|
/**
|
|
1949
|
-
*
|
|
1950
|
-
* @returns true if
|
|
1944
|
+
* Prepare a retryable error for continuation with exponential backoff.
|
|
1945
|
+
* @returns true if the caller should continue the agent, false otherwise
|
|
1951
1946
|
*/
|
|
1952
|
-
async
|
|
1947
|
+
async _prepareRetry(message) {
|
|
1953
1948
|
const settings = this.settingsManager.getRetrySettings();
|
|
1954
1949
|
if (!settings.enabled) {
|
|
1955
|
-
this._resolveRetry();
|
|
1956
1950
|
return false;
|
|
1957
1951
|
}
|
|
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
1952
|
this._retryAttempt++;
|
|
1966
1953
|
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
|
|
1954
|
+
// Preserve the completed attempt count so post-run handling can emit the final failure.
|
|
1955
|
+
this._retryAttempt--;
|
|
1976
1956
|
return false;
|
|
1977
1957
|
}
|
|
1978
1958
|
const delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
|
|
@@ -1997,23 +1977,17 @@ export class AgentSession {
|
|
|
1997
1977
|
// Aborted during sleep - emit end event so UI can clean up
|
|
1998
1978
|
const attempt = this._retryAttempt;
|
|
1999
1979
|
this._retryAttempt = 0;
|
|
2000
|
-
this._retryAbortController = undefined;
|
|
2001
1980
|
this._emit({
|
|
2002
1981
|
type: "auto_retry_end",
|
|
2003
1982
|
success: false,
|
|
2004
1983
|
attempt,
|
|
2005
1984
|
finalError: "Retry cancelled",
|
|
2006
1985
|
});
|
|
2007
|
-
this._resolveRetry();
|
|
2008
1986
|
return false;
|
|
2009
1987
|
}
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
this.agent.continue().catch(() => {
|
|
2014
|
-
// Retry failed - will be caught by next agent_end
|
|
2015
|
-
});
|
|
2016
|
-
}, 0);
|
|
1988
|
+
finally {
|
|
1989
|
+
this._retryAbortController = undefined;
|
|
1990
|
+
}
|
|
2017
1991
|
return true;
|
|
2018
1992
|
}
|
|
2019
1993
|
/**
|
|
@@ -2021,23 +1995,10 @@ export class AgentSession {
|
|
|
2021
1995
|
*/
|
|
2022
1996
|
abortRetry() {
|
|
2023
1997
|
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
1998
|
}
|
|
2038
1999
|
/** Whether auto-retry is currently in progress */
|
|
2039
2000
|
get isRetrying() {
|
|
2040
|
-
return this.
|
|
2001
|
+
return this._retryAbortController !== undefined;
|
|
2041
2002
|
}
|
|
2042
2003
|
/** Whether auto-retry is enabled */
|
|
2043
2004
|
get autoRetryEnabled() {
|