@vaclav-synacek/pi-coding-agent-termux 0.45.7
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 +1961 -0
- package/README.md +1392 -0
- package/dist/cli/args.d.ts +42 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +248 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +32 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +141 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +523 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +1795 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-storage.d.ts +112 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +297 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +47 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +211 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +84 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +235 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +110 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +559 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +35 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +138 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/index.d.ts +17 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +193 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +910 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1329 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +10 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +383 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +89 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +406 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +654 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +32 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +27 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +25 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +121 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +59 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +151 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +57 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +314 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +76 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +308 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +40 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +197 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/sdk.d.ts +181 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +466 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +313 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +996 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +138 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +327 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +50 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +338 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +48 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +224 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +25 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +42 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +223 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +33 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +171 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +37 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +143 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +37 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +206 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +43 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +239 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +70 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +56 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +38 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +118 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +53 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +37 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +165 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +27 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +78 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +354 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +261 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +15 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +89 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +161 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +12 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +30 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +39 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +40 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +69 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +19 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +84 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +15 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +96 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +20 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +51 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +73 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +26 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +207 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +29 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +30 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +39 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +135 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +35 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +211 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +98 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +258 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +44 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +311 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +43 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +219 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +35 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +46 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +47 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +606 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +52 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +745 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +113 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +8 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +16 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +261 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +3194 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +308 -0
- package/dist/modes/interactive/theme/theme.d.ts +71 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +893 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +140 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +209 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +392 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +486 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +372 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +129 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +73 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +31 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +188 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +151 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +187 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/vips.d.ts +11 -0
- package/dist/utils/vips.d.ts.map +1 -0
- package/dist/utils/vips.js +35 -0
- package/dist/utils/vips.js.map +1 -0
- package/docs/compaction.md +388 -0
- package/docs/extensions.md +1524 -0
- package/docs/rpc.md +1046 -0
- package/docs/sdk.md +1024 -0
- package/docs/session.md +255 -0
- package/docs/skills.md +317 -0
- package/docs/theme.md +617 -0
- package/docs/tree.md +201 -0
- package/docs/tui.md +797 -0
- package/examples/README.md +24 -0
- package/examples/extensions/README.md +168 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/chalk-logger.ts +26 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +114 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +72 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +150 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +25 -0
- package/examples/extensions/overlay-qa-tests.ts +881 -0
- package/examples/extensions/overlay-test.ts +145 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +277 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +95 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +156 -0
- package/examples/extensions/subagent/index.ts +963 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +195 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/todo.ts +299 -0
- package/examples/extensions/tool-override.ts +143 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +44 -0
- package/examples/sdk/04-skills.ts +47 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +79 -0
- package/examples/sdk/07-context-files.ts +36 -0
- package/examples/sdk/08-prompt-templates.ts +42 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
- package/examples/sdk/10-settings.ts +38 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +72 -0
- package/examples/sdk/README.md +150 -0
- package/package.json +88 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC mode: Headless operation with JSON stdin/stdout protocol.
|
|
3
|
+
*
|
|
4
|
+
* Used for embedding the agent in other applications.
|
|
5
|
+
* Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
|
|
6
|
+
*
|
|
7
|
+
* Protocol:
|
|
8
|
+
* - Commands: JSON objects with `type` field, optional `id` for correlation
|
|
9
|
+
* - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
|
|
10
|
+
* - Events: AgentSessionEvent objects streamed as they occur
|
|
11
|
+
* - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
|
|
12
|
+
*/
|
|
13
|
+
import * as crypto from "node:crypto";
|
|
14
|
+
import * as readline from "readline";
|
|
15
|
+
import { theme } from "../interactive/theme/theme.js";
|
|
16
|
+
/**
|
|
17
|
+
* Run in RPC mode.
|
|
18
|
+
* Listens for JSON commands on stdin, outputs events and responses on stdout.
|
|
19
|
+
*/
|
|
20
|
+
export async function runRpcMode(session) {
|
|
21
|
+
const output = (obj) => {
|
|
22
|
+
console.log(JSON.stringify(obj));
|
|
23
|
+
};
|
|
24
|
+
const success = (id, command, data) => {
|
|
25
|
+
if (data === undefined) {
|
|
26
|
+
return { id, type: "response", command, success: true };
|
|
27
|
+
}
|
|
28
|
+
return { id, type: "response", command, success: true, data };
|
|
29
|
+
};
|
|
30
|
+
const error = (id, command, message) => {
|
|
31
|
+
return { id, type: "response", command, success: false, error: message };
|
|
32
|
+
};
|
|
33
|
+
// Pending extension UI requests waiting for response
|
|
34
|
+
const pendingExtensionRequests = new Map();
|
|
35
|
+
// Shutdown request flag
|
|
36
|
+
let shutdownRequested = false;
|
|
37
|
+
/** Helper for dialog methods with signal/timeout support */
|
|
38
|
+
function createDialogPromise(opts, defaultValue, request, parseResponse) {
|
|
39
|
+
if (opts?.signal?.aborted)
|
|
40
|
+
return Promise.resolve(defaultValue);
|
|
41
|
+
const id = crypto.randomUUID();
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
let timeoutId;
|
|
44
|
+
const cleanup = () => {
|
|
45
|
+
if (timeoutId)
|
|
46
|
+
clearTimeout(timeoutId);
|
|
47
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
48
|
+
pendingExtensionRequests.delete(id);
|
|
49
|
+
};
|
|
50
|
+
const onAbort = () => {
|
|
51
|
+
cleanup();
|
|
52
|
+
resolve(defaultValue);
|
|
53
|
+
};
|
|
54
|
+
opts?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
55
|
+
if (opts?.timeout) {
|
|
56
|
+
timeoutId = setTimeout(() => {
|
|
57
|
+
cleanup();
|
|
58
|
+
resolve(defaultValue);
|
|
59
|
+
}, opts.timeout);
|
|
60
|
+
}
|
|
61
|
+
pendingExtensionRequests.set(id, {
|
|
62
|
+
resolve: (response) => {
|
|
63
|
+
cleanup();
|
|
64
|
+
resolve(parseResponse(response));
|
|
65
|
+
},
|
|
66
|
+
reject,
|
|
67
|
+
});
|
|
68
|
+
output({ type: "extension_ui_request", id, ...request });
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create an extension UI context that uses the RPC protocol.
|
|
73
|
+
*/
|
|
74
|
+
const createExtensionUIContext = () => ({
|
|
75
|
+
select: (title, options, opts) => createDialogPromise(opts, undefined, { method: "select", title, options, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? undefined : "value" in r ? r.value : undefined),
|
|
76
|
+
confirm: (title, message, opts) => createDialogPromise(opts, false, { method: "confirm", title, message, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? false : "confirmed" in r ? r.confirmed : false),
|
|
77
|
+
input: (title, placeholder, opts) => createDialogPromise(opts, undefined, { method: "input", title, placeholder, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? undefined : "value" in r ? r.value : undefined),
|
|
78
|
+
notify(message, type) {
|
|
79
|
+
// Fire and forget - no response needed
|
|
80
|
+
output({
|
|
81
|
+
type: "extension_ui_request",
|
|
82
|
+
id: crypto.randomUUID(),
|
|
83
|
+
method: "notify",
|
|
84
|
+
message,
|
|
85
|
+
notifyType: type,
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
setStatus(key, text) {
|
|
89
|
+
// Fire and forget - no response needed
|
|
90
|
+
output({
|
|
91
|
+
type: "extension_ui_request",
|
|
92
|
+
id: crypto.randomUUID(),
|
|
93
|
+
method: "setStatus",
|
|
94
|
+
statusKey: key,
|
|
95
|
+
statusText: text,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
setWorkingMessage(_message) {
|
|
99
|
+
// Working message not supported in RPC mode - requires TUI loader access
|
|
100
|
+
},
|
|
101
|
+
setWidget(key, content) {
|
|
102
|
+
// Only support string arrays in RPC mode - factory functions are ignored
|
|
103
|
+
if (content === undefined || Array.isArray(content)) {
|
|
104
|
+
output({
|
|
105
|
+
type: "extension_ui_request",
|
|
106
|
+
id: crypto.randomUUID(),
|
|
107
|
+
method: "setWidget",
|
|
108
|
+
widgetKey: key,
|
|
109
|
+
widgetLines: content,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Component factories are not supported in RPC mode - would need TUI access
|
|
113
|
+
},
|
|
114
|
+
setFooter(_factory) {
|
|
115
|
+
// Custom footer not supported in RPC mode - requires TUI access
|
|
116
|
+
},
|
|
117
|
+
setHeader(_factory) {
|
|
118
|
+
// Custom header not supported in RPC mode - requires TUI access
|
|
119
|
+
},
|
|
120
|
+
setTitle(title) {
|
|
121
|
+
// Fire and forget - host can implement terminal title control
|
|
122
|
+
output({
|
|
123
|
+
type: "extension_ui_request",
|
|
124
|
+
id: crypto.randomUUID(),
|
|
125
|
+
method: "setTitle",
|
|
126
|
+
title,
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
async custom() {
|
|
130
|
+
// Custom UI not supported in RPC mode
|
|
131
|
+
return undefined;
|
|
132
|
+
},
|
|
133
|
+
setEditorText(text) {
|
|
134
|
+
// Fire and forget - host can implement editor control
|
|
135
|
+
output({
|
|
136
|
+
type: "extension_ui_request",
|
|
137
|
+
id: crypto.randomUUID(),
|
|
138
|
+
method: "set_editor_text",
|
|
139
|
+
text,
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
getEditorText() {
|
|
143
|
+
// Synchronous method can't wait for RPC response
|
|
144
|
+
// Host should track editor state locally if needed
|
|
145
|
+
return "";
|
|
146
|
+
},
|
|
147
|
+
async editor(title, prefill) {
|
|
148
|
+
const id = crypto.randomUUID();
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
pendingExtensionRequests.set(id, {
|
|
151
|
+
resolve: (response) => {
|
|
152
|
+
if ("cancelled" in response && response.cancelled) {
|
|
153
|
+
resolve(undefined);
|
|
154
|
+
}
|
|
155
|
+
else if ("value" in response) {
|
|
156
|
+
resolve(response.value);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
resolve(undefined);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
reject,
|
|
163
|
+
});
|
|
164
|
+
output({ type: "extension_ui_request", id, method: "editor", title, prefill });
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
setEditorComponent() {
|
|
168
|
+
// Custom editor components not supported in RPC mode
|
|
169
|
+
},
|
|
170
|
+
get theme() {
|
|
171
|
+
return theme;
|
|
172
|
+
},
|
|
173
|
+
getAllThemes() {
|
|
174
|
+
return [];
|
|
175
|
+
},
|
|
176
|
+
getTheme(_name) {
|
|
177
|
+
return undefined;
|
|
178
|
+
},
|
|
179
|
+
setTheme(_theme) {
|
|
180
|
+
// Theme switching not supported in RPC mode
|
|
181
|
+
return { success: false, error: "Theme switching not supported in RPC mode" };
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
// Set up extensions with RPC-based UI context
|
|
185
|
+
const extensionRunner = session.extensionRunner;
|
|
186
|
+
if (extensionRunner) {
|
|
187
|
+
extensionRunner.initialize(
|
|
188
|
+
// ExtensionActions
|
|
189
|
+
{
|
|
190
|
+
sendMessage: (message, options) => {
|
|
191
|
+
session.sendCustomMessage(message, options).catch((e) => {
|
|
192
|
+
output(error(undefined, "extension_send", e.message));
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
sendUserMessage: (content, options) => {
|
|
196
|
+
session.sendUserMessage(content, options).catch((e) => {
|
|
197
|
+
output(error(undefined, "extension_send_user", e.message));
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
appendEntry: (customType, data) => {
|
|
201
|
+
session.sessionManager.appendCustomEntry(customType, data);
|
|
202
|
+
},
|
|
203
|
+
setSessionName: (name) => {
|
|
204
|
+
session.sessionManager.appendSessionInfo(name);
|
|
205
|
+
},
|
|
206
|
+
getSessionName: () => {
|
|
207
|
+
return session.sessionManager.getSessionName();
|
|
208
|
+
},
|
|
209
|
+
getActiveTools: () => session.getActiveToolNames(),
|
|
210
|
+
getAllTools: () => session.getAllTools(),
|
|
211
|
+
setActiveTools: (toolNames) => session.setActiveToolsByName(toolNames),
|
|
212
|
+
setModel: async (model) => {
|
|
213
|
+
const key = await session.modelRegistry.getApiKey(model);
|
|
214
|
+
if (!key)
|
|
215
|
+
return false;
|
|
216
|
+
await session.setModel(model);
|
|
217
|
+
return true;
|
|
218
|
+
},
|
|
219
|
+
getThinkingLevel: () => session.thinkingLevel,
|
|
220
|
+
setThinkingLevel: (level) => session.setThinkingLevel(level),
|
|
221
|
+
},
|
|
222
|
+
// ExtensionContextActions
|
|
223
|
+
{
|
|
224
|
+
getModel: () => session.agent.state.model,
|
|
225
|
+
isIdle: () => !session.isStreaming,
|
|
226
|
+
abort: () => session.abort(),
|
|
227
|
+
hasPendingMessages: () => session.pendingMessageCount > 0,
|
|
228
|
+
shutdown: () => {
|
|
229
|
+
shutdownRequested = true;
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
// ExtensionCommandContextActions - commands invokable via prompt("/command")
|
|
233
|
+
{
|
|
234
|
+
waitForIdle: () => session.agent.waitForIdle(),
|
|
235
|
+
newSession: async (options) => {
|
|
236
|
+
const success = await session.newSession({ parentSession: options?.parentSession });
|
|
237
|
+
// Note: setup callback runs but no UI feedback in RPC mode
|
|
238
|
+
if (success && options?.setup) {
|
|
239
|
+
await options.setup(session.sessionManager);
|
|
240
|
+
}
|
|
241
|
+
return { cancelled: !success };
|
|
242
|
+
},
|
|
243
|
+
fork: async (entryId) => {
|
|
244
|
+
const result = await session.fork(entryId);
|
|
245
|
+
return { cancelled: result.cancelled };
|
|
246
|
+
},
|
|
247
|
+
navigateTree: async (targetId, options) => {
|
|
248
|
+
const result = await session.navigateTree(targetId, { summarize: options?.summarize });
|
|
249
|
+
return { cancelled: result.cancelled };
|
|
250
|
+
},
|
|
251
|
+
}, createExtensionUIContext());
|
|
252
|
+
extensionRunner.onError((err) => {
|
|
253
|
+
output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
|
|
254
|
+
});
|
|
255
|
+
// Emit session_start event
|
|
256
|
+
await extensionRunner.emit({
|
|
257
|
+
type: "session_start",
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// Output all agent events as JSON
|
|
261
|
+
session.subscribe((event) => {
|
|
262
|
+
output(event);
|
|
263
|
+
});
|
|
264
|
+
// Handle a single command
|
|
265
|
+
const handleCommand = async (command) => {
|
|
266
|
+
const id = command.id;
|
|
267
|
+
switch (command.type) {
|
|
268
|
+
// =================================================================
|
|
269
|
+
// Prompting
|
|
270
|
+
// =================================================================
|
|
271
|
+
case "prompt": {
|
|
272
|
+
// Don't await - events will stream
|
|
273
|
+
// Extension commands are executed immediately, file prompt templates are expanded
|
|
274
|
+
// If streaming and streamingBehavior specified, queues via steer/followUp
|
|
275
|
+
session
|
|
276
|
+
.prompt(command.message, {
|
|
277
|
+
images: command.images,
|
|
278
|
+
streamingBehavior: command.streamingBehavior,
|
|
279
|
+
})
|
|
280
|
+
.catch((e) => output(error(id, "prompt", e.message)));
|
|
281
|
+
return success(id, "prompt");
|
|
282
|
+
}
|
|
283
|
+
case "steer": {
|
|
284
|
+
await session.steer(command.message);
|
|
285
|
+
return success(id, "steer");
|
|
286
|
+
}
|
|
287
|
+
case "follow_up": {
|
|
288
|
+
await session.followUp(command.message);
|
|
289
|
+
return success(id, "follow_up");
|
|
290
|
+
}
|
|
291
|
+
case "abort": {
|
|
292
|
+
await session.abort();
|
|
293
|
+
return success(id, "abort");
|
|
294
|
+
}
|
|
295
|
+
case "new_session": {
|
|
296
|
+
const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
|
|
297
|
+
const cancelled = !(await session.newSession(options));
|
|
298
|
+
return success(id, "new_session", { cancelled });
|
|
299
|
+
}
|
|
300
|
+
// =================================================================
|
|
301
|
+
// State
|
|
302
|
+
// =================================================================
|
|
303
|
+
case "get_state": {
|
|
304
|
+
const state = {
|
|
305
|
+
model: session.model,
|
|
306
|
+
thinkingLevel: session.thinkingLevel,
|
|
307
|
+
isStreaming: session.isStreaming,
|
|
308
|
+
isCompacting: session.isCompacting,
|
|
309
|
+
steeringMode: session.steeringMode,
|
|
310
|
+
followUpMode: session.followUpMode,
|
|
311
|
+
sessionFile: session.sessionFile,
|
|
312
|
+
sessionId: session.sessionId,
|
|
313
|
+
autoCompactionEnabled: session.autoCompactionEnabled,
|
|
314
|
+
messageCount: session.messages.length,
|
|
315
|
+
pendingMessageCount: session.pendingMessageCount,
|
|
316
|
+
};
|
|
317
|
+
return success(id, "get_state", state);
|
|
318
|
+
}
|
|
319
|
+
// =================================================================
|
|
320
|
+
// Model
|
|
321
|
+
// =================================================================
|
|
322
|
+
case "set_model": {
|
|
323
|
+
const models = await session.getAvailableModels();
|
|
324
|
+
const model = models.find((m) => m.provider === command.provider && m.id === command.modelId);
|
|
325
|
+
if (!model) {
|
|
326
|
+
return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
|
|
327
|
+
}
|
|
328
|
+
await session.setModel(model);
|
|
329
|
+
return success(id, "set_model", model);
|
|
330
|
+
}
|
|
331
|
+
case "cycle_model": {
|
|
332
|
+
const result = await session.cycleModel();
|
|
333
|
+
if (!result) {
|
|
334
|
+
return success(id, "cycle_model", null);
|
|
335
|
+
}
|
|
336
|
+
return success(id, "cycle_model", result);
|
|
337
|
+
}
|
|
338
|
+
case "get_available_models": {
|
|
339
|
+
const models = await session.getAvailableModels();
|
|
340
|
+
return success(id, "get_available_models", { models });
|
|
341
|
+
}
|
|
342
|
+
// =================================================================
|
|
343
|
+
// Thinking
|
|
344
|
+
// =================================================================
|
|
345
|
+
case "set_thinking_level": {
|
|
346
|
+
session.setThinkingLevel(command.level);
|
|
347
|
+
return success(id, "set_thinking_level");
|
|
348
|
+
}
|
|
349
|
+
case "cycle_thinking_level": {
|
|
350
|
+
const level = session.cycleThinkingLevel();
|
|
351
|
+
if (!level) {
|
|
352
|
+
return success(id, "cycle_thinking_level", null);
|
|
353
|
+
}
|
|
354
|
+
return success(id, "cycle_thinking_level", { level });
|
|
355
|
+
}
|
|
356
|
+
// =================================================================
|
|
357
|
+
// Queue Modes
|
|
358
|
+
// =================================================================
|
|
359
|
+
case "set_steering_mode": {
|
|
360
|
+
session.setSteeringMode(command.mode);
|
|
361
|
+
return success(id, "set_steering_mode");
|
|
362
|
+
}
|
|
363
|
+
case "set_follow_up_mode": {
|
|
364
|
+
session.setFollowUpMode(command.mode);
|
|
365
|
+
return success(id, "set_follow_up_mode");
|
|
366
|
+
}
|
|
367
|
+
// =================================================================
|
|
368
|
+
// Compaction
|
|
369
|
+
// =================================================================
|
|
370
|
+
case "compact": {
|
|
371
|
+
const result = await session.compact(command.customInstructions);
|
|
372
|
+
return success(id, "compact", result);
|
|
373
|
+
}
|
|
374
|
+
case "set_auto_compaction": {
|
|
375
|
+
session.setAutoCompactionEnabled(command.enabled);
|
|
376
|
+
return success(id, "set_auto_compaction");
|
|
377
|
+
}
|
|
378
|
+
// =================================================================
|
|
379
|
+
// Retry
|
|
380
|
+
// =================================================================
|
|
381
|
+
case "set_auto_retry": {
|
|
382
|
+
session.setAutoRetryEnabled(command.enabled);
|
|
383
|
+
return success(id, "set_auto_retry");
|
|
384
|
+
}
|
|
385
|
+
case "abort_retry": {
|
|
386
|
+
session.abortRetry();
|
|
387
|
+
return success(id, "abort_retry");
|
|
388
|
+
}
|
|
389
|
+
// =================================================================
|
|
390
|
+
// Bash
|
|
391
|
+
// =================================================================
|
|
392
|
+
case "bash": {
|
|
393
|
+
const result = await session.executeBash(command.command);
|
|
394
|
+
return success(id, "bash", result);
|
|
395
|
+
}
|
|
396
|
+
case "abort_bash": {
|
|
397
|
+
session.abortBash();
|
|
398
|
+
return success(id, "abort_bash");
|
|
399
|
+
}
|
|
400
|
+
// =================================================================
|
|
401
|
+
// Session
|
|
402
|
+
// =================================================================
|
|
403
|
+
case "get_session_stats": {
|
|
404
|
+
const stats = session.getSessionStats();
|
|
405
|
+
return success(id, "get_session_stats", stats);
|
|
406
|
+
}
|
|
407
|
+
case "export_html": {
|
|
408
|
+
const path = await session.exportToHtml(command.outputPath);
|
|
409
|
+
return success(id, "export_html", { path });
|
|
410
|
+
}
|
|
411
|
+
case "switch_session": {
|
|
412
|
+
const cancelled = !(await session.switchSession(command.sessionPath));
|
|
413
|
+
return success(id, "switch_session", { cancelled });
|
|
414
|
+
}
|
|
415
|
+
case "fork": {
|
|
416
|
+
const result = await session.fork(command.entryId);
|
|
417
|
+
return success(id, "fork", { text: result.selectedText, cancelled: result.cancelled });
|
|
418
|
+
}
|
|
419
|
+
case "get_fork_messages": {
|
|
420
|
+
const messages = session.getUserMessagesForForking();
|
|
421
|
+
return success(id, "get_fork_messages", { messages });
|
|
422
|
+
}
|
|
423
|
+
case "get_last_assistant_text": {
|
|
424
|
+
const text = session.getLastAssistantText();
|
|
425
|
+
return success(id, "get_last_assistant_text", { text });
|
|
426
|
+
}
|
|
427
|
+
// =================================================================
|
|
428
|
+
// Messages
|
|
429
|
+
// =================================================================
|
|
430
|
+
case "get_messages": {
|
|
431
|
+
return success(id, "get_messages", { messages: session.messages });
|
|
432
|
+
}
|
|
433
|
+
default: {
|
|
434
|
+
const unknownCommand = command;
|
|
435
|
+
return error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
/**
|
|
440
|
+
* Check if shutdown was requested and perform shutdown if so.
|
|
441
|
+
* Called after handling each command when waiting for the next command.
|
|
442
|
+
*/
|
|
443
|
+
async function checkShutdownRequested() {
|
|
444
|
+
if (!shutdownRequested)
|
|
445
|
+
return;
|
|
446
|
+
if (extensionRunner?.hasHandlers("session_shutdown")) {
|
|
447
|
+
await extensionRunner.emit({ type: "session_shutdown" });
|
|
448
|
+
}
|
|
449
|
+
// Close readline interface to stop waiting for input
|
|
450
|
+
rl.close();
|
|
451
|
+
process.exit(0);
|
|
452
|
+
}
|
|
453
|
+
// Listen for JSON input
|
|
454
|
+
const rl = readline.createInterface({
|
|
455
|
+
input: process.stdin,
|
|
456
|
+
output: process.stdout,
|
|
457
|
+
terminal: false,
|
|
458
|
+
});
|
|
459
|
+
rl.on("line", async (line) => {
|
|
460
|
+
try {
|
|
461
|
+
const parsed = JSON.parse(line);
|
|
462
|
+
// Handle extension UI responses
|
|
463
|
+
if (parsed.type === "extension_ui_response") {
|
|
464
|
+
const response = parsed;
|
|
465
|
+
const pending = pendingExtensionRequests.get(response.id);
|
|
466
|
+
if (pending) {
|
|
467
|
+
pendingExtensionRequests.delete(response.id);
|
|
468
|
+
pending.resolve(response);
|
|
469
|
+
}
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
// Handle regular commands
|
|
473
|
+
const command = parsed;
|
|
474
|
+
const response = await handleCommand(command);
|
|
475
|
+
output(response);
|
|
476
|
+
// Check for deferred shutdown request (idle between commands)
|
|
477
|
+
await checkShutdownRequested();
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
output(error(undefined, "parse", `Failed to parse command: ${e.message}`));
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
// Keep process alive forever
|
|
484
|
+
return new Promise(() => { });
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=rpc-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as readline from \"readline\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type { ExtensionUIContext, ExtensionUIDialogOptions } from \"../../core/extensions/index.js\";\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.js\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.js\";\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(session: AgentSession): Promise<never> {\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\tconsole.log(JSON.stringify(obj));\n\t};\n\n\tconst success = <T extends RpcCommand[\"type\"]>(\n\t\tid: string | undefined,\n\t\tcommand: T,\n\t\tdata?: object | null,\n\t): RpcResponse => {\n\t\tif (data === undefined) {\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t\t}\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n\t};\n\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\n\t\treturn { id, type: \"response\", command, success: false, error: message };\n\t};\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\n\t>();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tsetWorkingMessage(_message?: string): void {\n\t\t\t// Working message not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown): void {\n\t\t\t// Only support string arrays in RPC mode - factory functions are ignored\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\t// Component factories are not supported in RPC mode - would need TUI access\n\t\t},\n\n\t\tsetFooter(_factory: unknown): void {\n\t\t\t// Custom footer not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetHeader(_factory: unknown): void {\n\t\t\t// Custom header not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\treject,\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn [];\n\t\t},\n\n\t\tgetTheme(_name: string) {\n\t\t\treturn undefined;\n\t\t},\n\n\t\tsetTheme(_theme: string | Theme) {\n\t\t\t// Theme switching not supported in RPC mode\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\n\t\t},\n\t});\n\n\t// Set up extensions with RPC-based UI context\n\tconst extensionRunner = session.extensionRunner;\n\tif (extensionRunner) {\n\t\textensionRunner.initialize(\n\t\t\t// ExtensionActions\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tsession.sendCustomMessage(message, options).catch((e) => {\n\t\t\t\t\t\toutput(error(undefined, \"extension_send\", e.message));\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tsession.sendUserMessage(content, options).catch((e) => {\n\t\t\t\t\t\toutput(error(undefined, \"extension_send_user\", e.message));\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tsession.sessionManager.appendCustomEntry(customType, data);\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tsession.sessionManager.appendSessionInfo(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn session.sessionManager.getSessionName();\n\t\t\t\t},\n\t\t\t\tgetActiveTools: () => session.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => session.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tconst key = await session.modelRegistry.getApiKey(model);\n\t\t\t\t\tif (!key) return false;\n\t\t\t\t\tawait session.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => session.thinkingLevel,\n\t\t\t\tsetThinkingLevel: (level) => session.setThinkingLevel(level),\n\t\t\t},\n\t\t\t// ExtensionContextActions\n\t\t\t{\n\t\t\t\tgetModel: () => session.agent.state.model,\n\t\t\t\tisIdle: () => !session.isStreaming,\n\t\t\t\tabort: () => session.abort(),\n\t\t\t\thasPendingMessages: () => session.pendingMessageCount > 0,\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tshutdownRequested = true;\n\t\t\t\t},\n\t\t\t},\n\t\t\t// ExtensionCommandContextActions - commands invokable via prompt(\"/command\")\n\t\t\t{\n\t\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\t\tnewSession: async (options) => {\n\t\t\t\t\tconst success = await session.newSession({ parentSession: options?.parentSession });\n\t\t\t\t\t// Note: setup callback runs but no UI feedback in RPC mode\n\t\t\t\t\tif (success && options?.setup) {\n\t\t\t\t\t\tawait options.setup(session.sessionManager);\n\t\t\t\t\t}\n\t\t\t\t\treturn { cancelled: !success };\n\t\t\t\t},\n\t\t\t\tfork: async (entryId) => {\n\t\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, { summarize: options?.summarize });\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateExtensionUIContext(),\n\t\t);\n\t\textensionRunner.onError((err) => {\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t});\n\t\t// Emit session_start event\n\t\tawait extensionRunner.emit({\n\t\t\ttype: \"session_start\",\n\t\t});\n\t}\n\n\t// Output all agent events as JSON\n\tsession.subscribe((event) => {\n\t\toutput(event);\n\t});\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\n\t\tconst id = command.id;\n\n\t\tswitch (command.type) {\n\t\t\t// =================================================================\n\t\t\t// Prompting\n\t\t\t// =================================================================\n\n\t\t\tcase \"prompt\": {\n\t\t\t\t// Don't await - events will stream\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\n\t\t\t\tsession\n\t\t\t\t\t.prompt(command.message, {\n\t\t\t\t\t\timages: command.images,\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\t})\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\n\t\t\t\treturn success(id, \"prompt\");\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\tawait session.steer(command.message);\n\t\t\t\treturn success(id, \"steer\");\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\tawait session.followUp(command.message);\n\t\t\t\treturn success(id, \"follow_up\");\n\t\t\t}\n\n\t\t\tcase \"abort\": {\n\t\t\t\tawait session.abort();\n\t\t\t\treturn success(id, \"abort\");\n\t\t\t}\n\n\t\t\tcase \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst cancelled = !(await session.newSession(options));\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// State\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_state\": {\n\t\t\t\tconst state: RpcSessionState = {\n\t\t\t\t\tmodel: session.model,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t};\n\t\t\t\treturn success(id, \"get_state\", state);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Model\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_model\": {\n\t\t\t\tconst models = await session.getAvailableModels();\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t\t}\n\t\t\t\tawait session.setModel(model);\n\t\t\t\treturn success(id, \"set_model\", model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel();\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_model\", result);\n\t\t\t}\n\n\t\t\tcase \"get_available_models\": {\n\t\t\t\tconst models = await session.getAvailableModels();\n\t\t\t\treturn success(id, \"get_available_models\", { models });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Thinking\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_thinking_level\": {\n\t\t\t\tsession.setThinkingLevel(command.level);\n\t\t\t\treturn success(id, \"set_thinking_level\");\n\t\t\t}\n\n\t\t\tcase \"cycle_thinking_level\": {\n\t\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\t\tif (!level) {\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Queue Modes\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_steering_mode\": {\n\t\t\t\tsession.setSteeringMode(command.mode);\n\t\t\t\treturn success(id, \"set_steering_mode\");\n\t\t\t}\n\n\t\t\tcase \"set_follow_up_mode\": {\n\t\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Compaction\n\t\t\t// =================================================================\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact(command.customInstructions);\n\t\t\t\treturn success(id, \"compact\", result);\n\t\t\t}\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Retry\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_auto_retry\": {\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_retry\");\n\t\t\t}\n\n\t\t\tcase \"abort_retry\": {\n\t\t\t\tsession.abortRetry();\n\t\t\t\treturn success(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Bash\n\t\t\t// =================================================================\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst result = await session.executeBash(command.command);\n\t\t\t\treturn success(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn success(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Session\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\n\t\t\t}\n\n\t\t\tcase \"export_html\": {\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\t\treturn success(id, \"export_html\", { path });\n\t\t\t}\n\n\t\t\tcase \"switch_session\": {\n\t\t\t\tconst cancelled = !(await session.switchSession(command.sessionPath));\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await session.fork(command.entryId);\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"get_fork_messages\": {\n\t\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_last_assistant_text\": {\n\t\t\t\tconst text = session.getLastAssistantText();\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Messages\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst unknownCommand = command as { type: string };\n\t\t\t\treturn error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\n\t\tif (extensionRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait extensionRunner.emit({ type: \"session_shutdown\" });\n\t\t}\n\n\t\t// Close readline interface to stop waiting for input\n\t\trl.close();\n\t\tprocess.exit(0);\n\t}\n\n\t// Listen for JSON input\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tterminal: false,\n\t});\n\n\trl.on(\"line\", async (line: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(line);\n\n\t\t\t// Handle extension UI responses\n\t\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\t\tif (pending) {\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\t\tpending.resolve(response);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle regular commands\n\t\t\tconst command = parsed as RpcCommand;\n\t\t\tconst response = await handleCommand(command);\n\t\t\toutput(response);\n\n\t\t\t// Check for deferred shutdown request (idle between commands)\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (e: any) {\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\n\t\t}\n\t});\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
|