indusagi-coding-agent 0.1.38 → 0.1.40
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 +22 -7
- package/{LICENSE.md → LICENSE} +0 -1
- package/README.md +2 -4
- package/dist/cli/args.d.ts +6 -128
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +277 -472
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +9 -62
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +31 -146
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +1 -69
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +36 -267
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/list-models.d.ts +0 -60
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +53 -246
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts +1 -72
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +57 -231
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.js +25 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +0 -42
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +62 -97
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +26 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +78 -66
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -95
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +233 -288
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +0 -323
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +126 -359
- 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.js +16 -16
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -3
- package/dist/core/compaction/compaction.js +40 -40
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts +32 -4
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +30 -4
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +1 -19
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +92 -113
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/discover-packages.d.ts +0 -4
- package/dist/core/discover-packages.d.ts.map +1 -1
- package/dist/core/discover-packages.js +41 -44
- package/dist/core/discover-packages.js.map +1 -1
- package/dist/core/event-bus.d.ts +1 -147
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +17 -106
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts +0 -16
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +18 -27
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.ts +262 -0
- package/dist/core/export-html/index.ts +433 -0
- package/dist/core/export-html/template.html +48 -26
- package/dist/core/export-html/tool-renderer.d.ts +0 -21
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +35 -51
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/export-html/tool-renderer.ts +80 -0
- package/dist/core/export-html/vendor/highlight.min.js +401 -370
- package/dist/core/export-html/vendor/marked.min.js +71 -3
- package/dist/core/extensions/index.d.ts +7 -4
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +17 -3
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +0 -6
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +60 -56
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +48 -80
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +50 -23
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/footer-data-provider.d.ts +2 -15
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +21 -33
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/hooks/loader.js +2 -2
- package/dist/core/hooks/loader.js.map +1 -1
- package/dist/core/index.d.ts +29 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +29 -10
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +2 -179
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +64 -238
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +26 -181
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +228 -407
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +0 -139
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +34 -215
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +25 -57
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +326 -964
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +2 -34
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +122 -170
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resource-loader.d.ts +19 -12
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +353 -467
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -61
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +184 -252
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +447 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1176 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +9 -12
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +170 -398
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +2 -27
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +149 -212
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagents.d.ts +2 -2
- package/dist/core/subagents.d.ts.map +1 -1
- package/dist/core/subagents.js +21 -14
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/system-prompt.d.ts +0 -11
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +168 -139
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/timings.d.ts +1 -4
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +34 -18
- package/dist/core/timings.js.map +1 -1
- package/dist/core/todo-store.d.ts +20 -0
- package/dist/core/todo-store.d.ts.map +1 -0
- package/dist/core/todo-store.js +60 -0
- package/dist/core/todo-store.js.map +1 -0
- package/dist/core/tools/bash.d.ts +2 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/bg-process.d.ts +1 -6
- package/dist/core/tools/bg-process.d.ts.map +1 -1
- package/dist/core/tools/bg-process.js +4 -18
- package/dist/core/tools/bg-process.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +9 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +2 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +2 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +2 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +2 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +2 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +2 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +8 -2
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/ls.d.ts +2 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +2 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/memory.d.ts +50 -1
- package/dist/core/tools/memory.d.ts.map +1 -1
- package/dist/core/tools/memory.js +11 -7
- package/dist/core/tools/memory.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts +2 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +2 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +2 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/registry.d.ts +0 -15
- package/dist/core/tools/registry.d.ts.map +1 -1
- package/dist/core/tools/registry.js +13 -37
- package/dist/core/tools/registry.js.map +1 -1
- package/dist/core/tools/task.d.ts +17 -23
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +43 -82
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/todo.d.ts +17 -20
- package/dist/core/tools/todo.d.ts.map +1 -1
- package/dist/core/tools/todo.js +79 -58
- package/dist/core/tools/todo.js.map +1 -1
- package/dist/core/tools/truncate.d.ts +2 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +2 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/webfetch.d.ts +2 -0
- package/dist/core/tools/webfetch.d.ts.map +1 -0
- package/dist/core/tools/webfetch.js +2 -0
- package/dist/core/tools/webfetch.js.map +1 -0
- package/dist/core/tools/websearch.d.ts +2 -0
- package/dist/core/tools/websearch.d.ts.map +1 -0
- package/dist/core/tools/websearch.js +2 -0
- package/dist/core/tools/websearch.js.map +1 -0
- package/dist/core/tools/write.d.ts +2 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +35 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -41
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +237 -225
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +0 -25
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +129 -180
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +13 -6
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +11 -5
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +8 -23
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +217 -266
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -168
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +61 -216
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +6 -313
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +86 -403
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -3
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +59 -29
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +30 -17
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -3
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +35 -18
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +60 -68
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +2 -6
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +32 -18
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -5
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +45 -37
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +5 -6
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +43 -53
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts +0 -3
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +101 -108
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +7 -2
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +24 -4
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +5 -9
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +43 -46
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +4 -9
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +45 -28
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +7 -12
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +54 -32
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +2 -11
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +135 -183
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +79 -30
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +73 -31
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -18
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +24 -31
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +11 -24
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +89 -86
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +15 -19
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +104 -157
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +5 -5
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +12 -22
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +111 -132
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +3 -3
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +92 -103
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +28 -39
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +111 -203
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +17 -19
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +3 -3
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +29 -19
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +2 -2
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +20 -25
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +19 -20
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +12 -10
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +14 -8
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +53 -60
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +3 -9
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +57 -68
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts +0 -12
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +14 -22
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +6 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +118 -113
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +189 -39
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +8 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +88 -59
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +24 -46
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +75 -409
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +21 -360
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/observability/core/config.d.ts +28 -0
- package/dist/observability/core/config.d.ts.map +1 -0
- package/dist/observability/core/config.js +150 -0
- package/dist/observability/core/config.js.map +1 -0
- package/dist/observability/core/event-bus.d.ts +15 -0
- package/dist/observability/core/event-bus.d.ts.map +1 -0
- package/dist/observability/core/event-bus.js +37 -0
- package/dist/observability/core/event-bus.js.map +1 -0
- package/dist/observability/core/index.d.ts +12 -0
- package/dist/observability/core/index.d.ts.map +1 -0
- package/dist/observability/core/index.js +14 -0
- package/dist/observability/core/index.js.map +1 -0
- package/dist/observability/core/observability.d.ts +63 -0
- package/dist/observability/core/observability.d.ts.map +1 -0
- package/dist/observability/core/observability.js +127 -0
- package/dist/observability/core/observability.js.map +1 -0
- package/dist/observability/core/span.d.ts +37 -0
- package/dist/observability/core/span.d.ts.map +1 -0
- package/dist/observability/core/span.js +90 -0
- package/dist/observability/core/span.js.map +1 -0
- package/dist/observability/core/tracer.d.ts +22 -0
- package/dist/observability/core/tracer.d.ts.map +1 -0
- package/dist/observability/core/tracer.js +79 -0
- package/dist/observability/core/tracer.js.map +1 -0
- package/dist/observability/core/types.d.ts +155 -0
- package/dist/observability/core/types.d.ts.map +1 -0
- package/dist/observability/core/types.js +38 -0
- package/dist/observability/core/types.js.map +1 -0
- package/dist/observability/exporters/base-exporter.d.ts +16 -0
- package/dist/observability/exporters/base-exporter.d.ts.map +1 -0
- package/dist/observability/exporters/base-exporter.js +26 -0
- package/dist/observability/exporters/base-exporter.js.map +1 -0
- package/dist/observability/exporters/console-exporter.d.ts +22 -0
- package/dist/observability/exporters/console-exporter.d.ts.map +1 -0
- package/dist/observability/exporters/console-exporter.js +80 -0
- package/dist/observability/exporters/console-exporter.js.map +1 -0
- package/dist/observability/exporters/file-exporter.d.ts +31 -0
- package/dist/observability/exporters/file-exporter.d.ts.map +1 -0
- package/dist/observability/exporters/file-exporter.js +120 -0
- package/dist/observability/exporters/file-exporter.js.map +1 -0
- package/dist/observability/exporters/index.d.ts +12 -0
- package/dist/observability/exporters/index.d.ts.map +1 -0
- package/dist/observability/exporters/index.js +11 -0
- package/dist/observability/exporters/index.js.map +1 -0
- package/dist/observability/exporters/langfuse-exporter.d.ts +27 -0
- package/dist/observability/exporters/langfuse-exporter.d.ts.map +1 -0
- package/dist/observability/exporters/langfuse-exporter.js +146 -0
- package/dist/observability/exporters/langfuse-exporter.js.map +1 -0
- package/dist/observability/exporters/sentry-exporter.d.ts +22 -0
- package/dist/observability/exporters/sentry-exporter.d.ts.map +1 -0
- package/dist/observability/exporters/sentry-exporter.js +121 -0
- package/dist/observability/exporters/sentry-exporter.js.map +1 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +3 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/utils/changelog.d.ts +1 -2
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +53 -61
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +77 -83
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +62 -49
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-convert.d.ts +6 -6
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +29 -23
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize.d.ts +0 -17
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +100 -138
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/mime.d.ts +1 -0
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js +35 -15
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/photon.d.ts +4 -15
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +71 -60
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/shell.d.ts +4 -21
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +101 -124
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +32 -8
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +4 -2
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +96 -122
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/PI_MONO_MIT_REMOVAL_GUIDE.md +2132 -0
- package/docs/SAME_TO_SAME_PARITY_REPORT.md +312 -0
- package/examples/README.md +12 -0
- package/package.json +62 -88
- package/dist/modes/interactive/theme/dark.json +0 -85
- package/dist/modes/interactive/theme/light.json +0 -84
- package/dist/modes/interactive/theme/theme-schema.json +0 -335
- package/docs/FEATURES.md +0 -306
- package/docs/MCP.md +0 -341
- package/docs/MEMORY.md +0 -443
- package/examples/mcp-servers.example.json +0 -50
|
@@ -1,273 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
* Bash Command Execution - Safe and isolated subprocess management
|
|
3
|
-
*
|
|
4
|
-
* @module core/bash-executor
|
|
5
|
-
* @description
|
|
6
|
-
* Provides safe bash command execution with streaming support, cancellation,
|
|
7
|
-
* and automatic output handling. Designed for use by AgentSession and direct callers.
|
|
8
|
-
*
|
|
9
|
-
* Based on the child_process module from Node.js (https://nodejs.org/api/child_process.html)
|
|
10
|
-
* Refactored for agent security and output streaming.
|
|
11
|
-
*
|
|
12
|
-
* ## Responsibilities
|
|
13
|
-
*
|
|
14
|
-
* **Command Execution:**
|
|
15
|
-
* - Execute bash commands in isolated subprocess
|
|
16
|
-
* - Stream output via callbacks for real-time feedback
|
|
17
|
-
* - Capture exit codes and cancellation status
|
|
18
|
-
* - Support timeout enforcement
|
|
19
|
-
*
|
|
20
|
-
* **Output Handling:**
|
|
21
|
-
* - Sanitize output (strip ANSI, remove binary garbage)
|
|
22
|
-
* - Normalize line endings
|
|
23
|
-
* - Truncate large output (keep last N bytes)
|
|
24
|
-
* - Write large output to temp files for retrieval
|
|
25
|
-
*
|
|
26
|
-
* **Process Management:**
|
|
27
|
-
* - Kill process tree on cancellation (handles child processes)
|
|
28
|
-
* - Support AbortSignal for clean cancellation
|
|
29
|
-
* - Automatic resource cleanup
|
|
30
|
-
* - Environment variable merging
|
|
31
|
-
*
|
|
32
|
-
* ## SECURITY CRITICAL
|
|
33
|
-
*
|
|
34
|
-
* ### Input Validation
|
|
35
|
-
* - Commands are NOT validated for content - any bash is allowed
|
|
36
|
-
* - Input validation must be done by caller (AgentSession)
|
|
37
|
-
* - No shell injection vectors: spawn() used, not shell interpolation
|
|
38
|
-
*
|
|
39
|
-
* ### Execution Isolation
|
|
40
|
-
* - Runs in separate process, not caller's process
|
|
41
|
-
* - Uses spawn() with array args, not shell=true
|
|
42
|
-
* - Process killed on signal, no lingering processes
|
|
43
|
-
* - Stdout/stderr captured separately
|
|
44
|
-
*
|
|
45
|
-
* ### Output Safety
|
|
46
|
-
* - ANSI escape codes stripped before display
|
|
47
|
-
* - Binary data sanitized (unprintable chars replaced)
|
|
48
|
-
* - Large outputs dumped to temp files, not memory
|
|
49
|
-
* - Newlines normalized for consistent output
|
|
50
|
-
*
|
|
51
|
-
* ### Resource Limits
|
|
52
|
-
* - Output truncation prevents OOM
|
|
53
|
-
* - No automatic timeout (caller must set timeout option)
|
|
54
|
-
* - Process cleanup on error
|
|
55
|
-
* - Temp file cleanup responsibility of caller
|
|
56
|
-
*
|
|
57
|
-
* ### Environment Safety
|
|
58
|
-
* - Only merges provided env vars (doesn't expose sensitive ones)
|
|
59
|
-
* - Caller responsible for filtering sensitive env vars
|
|
60
|
-
* - Shell config resolved from system (safe defaults)
|
|
61
|
-
*
|
|
62
|
-
* ## Usage
|
|
63
|
-
*
|
|
64
|
-
* ### Basic execution
|
|
65
|
-
* ```typescript
|
|
66
|
-
* const result = await executeBash("npm test");
|
|
67
|
-
* console.log("Output:", result.output);
|
|
68
|
-
* console.log("Exit code:", result.exitCode);
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* ### With streaming
|
|
72
|
-
* ```typescript
|
|
73
|
-
* const result = await executeBash("npm test", {
|
|
74
|
-
* onChunk: (chunk) => process.stdout.write(chunk),
|
|
75
|
-
* });
|
|
76
|
-
* ```
|
|
77
|
-
*
|
|
78
|
-
* ### With timeout and cancellation
|
|
79
|
-
* ```typescript
|
|
80
|
-
* const controller = new AbortSignal();
|
|
81
|
-
* const timeoutHandle = setTimeout(() => controller.abort(), 30000);
|
|
82
|
-
*
|
|
83
|
-
* try {
|
|
84
|
-
* const result = await executeBash("long-running-command", {
|
|
85
|
-
* signal: controller.signal,
|
|
86
|
-
* });
|
|
87
|
-
* } finally {
|
|
88
|
-
* clearTimeout(timeoutHandle);
|
|
89
|
-
* }
|
|
90
|
-
* ```
|
|
91
|
-
*
|
|
92
|
-
* ### With custom environment
|
|
93
|
-
* ```typescript
|
|
94
|
-
* const result = await executeBash("npm test", {
|
|
95
|
-
* env: { NODE_ENV: "test" },
|
|
96
|
-
* });
|
|
97
|
-
* ```
|
|
98
|
-
*
|
|
99
|
-
* ### Handling large output
|
|
100
|
-
* ```typescript
|
|
101
|
-
* const result = await executeBash("npm test");
|
|
102
|
-
* if (result.truncated) {
|
|
103
|
-
* console.log("Output truncated, see:", result.fullOutputPath);
|
|
104
|
-
* // Read from temp file: readFileSync(result.fullOutputPath)
|
|
105
|
-
* }
|
|
106
|
-
* ```
|
|
107
|
-
*
|
|
108
|
-
* ## Exit Codes
|
|
109
|
-
*
|
|
110
|
-
* - **0**: Command succeeded
|
|
111
|
-
* - **1-127**: Command failed with exit code
|
|
112
|
-
* - **undefined**: Command killed (cancelled via signal)
|
|
113
|
-
*
|
|
114
|
-
* ## Truncation Behavior
|
|
115
|
-
*
|
|
116
|
-
* Large outputs are handled in two stages:
|
|
117
|
-
*
|
|
118
|
-
* 1. **Rolling Buffer** (in memory):
|
|
119
|
-
* - Keep last 100KB of output (2x DEFAULT_MAX_BYTES)
|
|
120
|
-
* - Allows streaming recent output to callbacks
|
|
121
|
-
*
|
|
122
|
-
* 2. **Temp File** (on disk):
|
|
123
|
-
* - Created if output exceeds 50KB (DEFAULT_MAX_BYTES)
|
|
124
|
-
* - Contains full output for later retrieval
|
|
125
|
-
* - Path returned in result.fullOutputPath
|
|
126
|
-
*
|
|
127
|
-
* 3. **Final Truncation**:
|
|
128
|
-
* - If output still exceeds 100KB after capture, tail is kept
|
|
129
|
-
* - result.truncated = true indicates this happened
|
|
130
|
-
*
|
|
131
|
-
* ## Performance
|
|
132
|
-
*
|
|
133
|
-
* - Streaming output via callbacks prevents memory bloat
|
|
134
|
-
* - ANSI stripping happens at capture time (single pass)
|
|
135
|
-
* - Binary sanitization integrated into stream processing
|
|
136
|
-
* - Temp file writing non-blocking
|
|
137
|
-
*
|
|
138
|
-
* ## Error Handling
|
|
139
|
-
*
|
|
140
|
-
* **Errors thrown:**
|
|
141
|
-
* - `ENOENT`: Shell not found (system misconfiguration)
|
|
142
|
-
* - `EPERM`: No permission to execute (system configuration)
|
|
143
|
-
* - `EACCES`: Access denied (file permissions)
|
|
144
|
-
* - Other OS errors from spawn()
|
|
145
|
-
*
|
|
146
|
-
* **Handled gracefully:**
|
|
147
|
-
* - Process killed → cancelled: true, exitCode: undefined
|
|
148
|
-
* - Large output → truncated: true, fullOutputPath: "..."
|
|
149
|
-
* - Signal abort → immediate cleanup
|
|
150
|
-
*
|
|
151
|
-
* ## Vendors & Attribution
|
|
152
|
-
*
|
|
153
|
-
* Based on: indusagi-agent bash-executor
|
|
154
|
-
* - Process management: node child_process.spawn
|
|
155
|
-
* - ANSI stripping: strip-ansi library
|
|
156
|
-
* - Process tree killing: killProcessTree utility
|
|
157
|
-
* - Output sanitization: sanitizeBinaryOutput utility
|
|
158
|
-
*
|
|
159
|
-
* Modifications:
|
|
160
|
-
* - Added streaming output support
|
|
161
|
-
* - Added temp file handling for large output
|
|
162
|
-
* - Added AbortSignal support for cancellation
|
|
163
|
-
* - Separated logic for standard vs custom operations
|
|
164
|
-
*/
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
165
2
|
import { randomBytes } from "node:crypto";
|
|
166
|
-
import { createWriteStream } from "node:fs";
|
|
3
|
+
import { createWriteStream, existsSync } from "node:fs";
|
|
167
4
|
import { tmpdir } from "node:os";
|
|
168
|
-
import { join } from "node:path";
|
|
169
|
-
import { spawn } from "child_process";
|
|
5
|
+
import { delimiter, join } from "node:path";
|
|
170
6
|
import stripAnsi from "strip-ansi";
|
|
171
|
-
import { getShellConfig, getShellEnv, killProcessTree, sanitizeBinaryOutput } from "../utils/shell.js";
|
|
172
7
|
import { DEFAULT_MAX_BYTES, truncateTail } from "indusagi/agent";
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
8
|
+
import { getBinDir } from "../config.js";
|
|
9
|
+
let cachedShellConfig = null;
|
|
10
|
+
function findBashOnPath() {
|
|
11
|
+
try {
|
|
12
|
+
const result = spawnSync("where", ["bash.exe"], { encoding: "utf-8", timeout: 5000 });
|
|
13
|
+
if (result.status === 0 && result.stdout) {
|
|
14
|
+
const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
|
|
15
|
+
if (firstMatch && existsSync(firstMatch)) {
|
|
16
|
+
return firstMatch;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Ignore lookup failures.
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function getShellConfig() {
|
|
26
|
+
if (cachedShellConfig) {
|
|
27
|
+
return cachedShellConfig;
|
|
28
|
+
}
|
|
29
|
+
if (process.platform === "win32") {
|
|
30
|
+
const paths = [];
|
|
31
|
+
const programFiles = process.env.ProgramFiles;
|
|
32
|
+
if (programFiles) {
|
|
33
|
+
paths.push(`${programFiles}\\Git\\bin\\bash.exe`);
|
|
34
|
+
}
|
|
35
|
+
const programFilesX86 = process.env["ProgramFiles(x86)"];
|
|
36
|
+
if (programFilesX86) {
|
|
37
|
+
paths.push(`${programFilesX86}\\Git\\bin\\bash.exe`);
|
|
38
|
+
}
|
|
39
|
+
for (const path of paths) {
|
|
40
|
+
if (existsSync(path)) {
|
|
41
|
+
cachedShellConfig = { shell: path, args: ["-c"] };
|
|
42
|
+
return cachedShellConfig;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const bashOnPath = findBashOnPath();
|
|
46
|
+
if (bashOnPath) {
|
|
47
|
+
cachedShellConfig = { shell: bashOnPath, args: ["-c"] };
|
|
48
|
+
return cachedShellConfig;
|
|
49
|
+
}
|
|
50
|
+
throw new Error("No bash shell found on this system.");
|
|
51
|
+
}
|
|
52
|
+
if (existsSync("/bin/bash")) {
|
|
53
|
+
cachedShellConfig = { shell: "/bin/bash", args: ["-c"] };
|
|
54
|
+
return cachedShellConfig;
|
|
55
|
+
}
|
|
56
|
+
cachedShellConfig = { shell: "sh", args: ["-c"] };
|
|
57
|
+
return cachedShellConfig;
|
|
58
|
+
}
|
|
59
|
+
function getShellEnv() {
|
|
60
|
+
const binDir = getBinDir();
|
|
61
|
+
const pathKey = Object.keys(process.env).find((key) => key.toLowerCase() === "path") ?? "PATH";
|
|
62
|
+
const currentPath = process.env[pathKey] ?? "";
|
|
63
|
+
const pathEntries = currentPath.split(delimiter).filter(Boolean);
|
|
64
|
+
const hasBinDir = pathEntries.includes(binDir);
|
|
65
|
+
const updatedPath = hasBinDir ? currentPath : [binDir, currentPath].filter(Boolean).join(delimiter);
|
|
66
|
+
return {
|
|
67
|
+
...process.env,
|
|
68
|
+
[pathKey]: updatedPath,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function sanitizeBinaryOutput(str) {
|
|
72
|
+
return Array.from(str)
|
|
73
|
+
.filter((char) => {
|
|
74
|
+
const code = char.codePointAt(0);
|
|
75
|
+
if (code === undefined) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (code === 0x09 || code === 0x0a || code === 0x0d) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (code <= 0x1f) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (code >= 0xfff9 && code <= 0xfffb) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
})
|
|
89
|
+
.join("");
|
|
90
|
+
}
|
|
91
|
+
function killProcessTree(pid) {
|
|
92
|
+
if (process.platform === "win32") {
|
|
93
|
+
try {
|
|
94
|
+
spawn("taskkill", ["/F", "/T", "/PID", String(pid)], {
|
|
95
|
+
stdio: "ignore",
|
|
96
|
+
detached: true,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Ignore taskkill errors.
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
process.kill(-pid, "SIGKILL");
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
try {
|
|
109
|
+
process.kill(pid, "SIGKILL");
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Process already exited.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
271
116
|
export function executeBash(command, options) {
|
|
272
117
|
return new Promise((resolve, reject) => {
|
|
273
118
|
const { shell, args } = getShellConfig();
|
|
@@ -276,15 +121,12 @@ export function executeBash(command, options) {
|
|
|
276
121
|
env: { ...getShellEnv(), ...(options?.env ?? {}) },
|
|
277
122
|
stdio: ["ignore", "pipe", "pipe"],
|
|
278
123
|
});
|
|
279
|
-
// Track sanitized output for truncation
|
|
280
124
|
const outputChunks = [];
|
|
281
125
|
let outputBytes = 0;
|
|
282
126
|
const maxOutputBytes = DEFAULT_MAX_BYTES * 2;
|
|
283
|
-
// Temp file for large output
|
|
284
127
|
let tempFilePath;
|
|
285
128
|
let tempFileStream;
|
|
286
129
|
let totalBytes = 0;
|
|
287
|
-
// Handle abort signal
|
|
288
130
|
const abortHandler = () => {
|
|
289
131
|
if (child.pid) {
|
|
290
132
|
killProcessTree(child.pid);
|
|
@@ -292,7 +134,6 @@ export function executeBash(command, options) {
|
|
|
292
134
|
};
|
|
293
135
|
if (options?.signal) {
|
|
294
136
|
if (options.signal.aborted) {
|
|
295
|
-
// Already aborted, don't even start
|
|
296
137
|
child.kill();
|
|
297
138
|
resolve({
|
|
298
139
|
output: "",
|
|
@@ -307,14 +148,11 @@ export function executeBash(command, options) {
|
|
|
307
148
|
const decoder = new TextDecoder();
|
|
308
149
|
const handleData = (data) => {
|
|
309
150
|
totalBytes += data.length;
|
|
310
|
-
// Sanitize once at the source: strip ANSI, replace binary garbage, normalize newlines
|
|
311
151
|
const text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\r/g, "");
|
|
312
|
-
// Start writing to temp file if exceeds threshold
|
|
313
152
|
if (totalBytes > DEFAULT_MAX_BYTES && !tempFilePath) {
|
|
314
153
|
const id = randomBytes(8).toString("hex");
|
|
315
154
|
tempFilePath = join(tmpdir(), `indusagi-bash-${id}.log`);
|
|
316
155
|
tempFileStream = createWriteStream(tempFilePath);
|
|
317
|
-
// Write already-buffered chunks to temp file
|
|
318
156
|
for (const chunk of outputChunks) {
|
|
319
157
|
tempFileStream.write(chunk);
|
|
320
158
|
}
|
|
@@ -322,109 +160,45 @@ export function executeBash(command, options) {
|
|
|
322
160
|
if (tempFileStream) {
|
|
323
161
|
tempFileStream.write(text);
|
|
324
162
|
}
|
|
325
|
-
// Keep rolling buffer of sanitized text
|
|
326
163
|
outputChunks.push(text);
|
|
327
164
|
outputBytes += text.length;
|
|
328
165
|
while (outputBytes > maxOutputBytes && outputChunks.length > 1) {
|
|
329
166
|
const removed = outputChunks.shift();
|
|
330
167
|
outputBytes -= removed.length;
|
|
331
168
|
}
|
|
332
|
-
|
|
333
|
-
if (options?.onChunk) {
|
|
334
|
-
options.onChunk(text);
|
|
335
|
-
}
|
|
169
|
+
options?.onChunk?.(text);
|
|
336
170
|
};
|
|
337
171
|
child.stdout?.on("data", handleData);
|
|
338
172
|
child.stderr?.on("data", handleData);
|
|
339
173
|
child.on("close", (code) => {
|
|
340
|
-
// Clean up abort listener
|
|
341
174
|
if (options?.signal) {
|
|
342
175
|
options.signal.removeEventListener("abort", abortHandler);
|
|
343
176
|
}
|
|
344
177
|
if (tempFileStream) {
|
|
345
178
|
tempFileStream.end();
|
|
346
179
|
}
|
|
347
|
-
// Combine buffered chunks for truncation (already sanitized)
|
|
348
180
|
const fullOutput = outputChunks.join("");
|
|
349
|
-
const
|
|
350
|
-
// code === null means killed (cancelled)
|
|
181
|
+
const truncation = truncateTail(fullOutput);
|
|
351
182
|
const cancelled = code === null;
|
|
352
183
|
resolve({
|
|
353
|
-
output:
|
|
184
|
+
output: truncation.truncated ? truncation.content : fullOutput,
|
|
354
185
|
exitCode: cancelled ? undefined : code,
|
|
355
186
|
cancelled,
|
|
356
|
-
truncated:
|
|
187
|
+
truncated: truncation.truncated,
|
|
357
188
|
fullOutputPath: tempFilePath,
|
|
358
189
|
});
|
|
359
190
|
});
|
|
360
|
-
child.on("error", (
|
|
361
|
-
// Clean up abort listener
|
|
191
|
+
child.on("error", (error) => {
|
|
362
192
|
if (options?.signal) {
|
|
363
193
|
options.signal.removeEventListener("abort", abortHandler);
|
|
364
194
|
}
|
|
365
195
|
if (tempFileStream) {
|
|
366
196
|
tempFileStream.end();
|
|
367
197
|
}
|
|
368
|
-
reject(
|
|
198
|
+
reject(error);
|
|
369
199
|
});
|
|
370
200
|
});
|
|
371
201
|
}
|
|
372
|
-
/**
|
|
373
|
-
* Execute a bash command using custom BashOperations.
|
|
374
|
-
*
|
|
375
|
-
* ## Purpose
|
|
376
|
-
* Allows delegation of command execution to remote systems:
|
|
377
|
-
* - SSH execution on remote servers
|
|
378
|
-
* - Container execution (Docker, Podman)
|
|
379
|
-
* - Custom runtime environments
|
|
380
|
-
* - Testing with mocked command execution
|
|
381
|
-
*
|
|
382
|
-
* ## Flow
|
|
383
|
-
* 1. Provides streaming callback to operations.exec()
|
|
384
|
-
* 2. Operations call callback as output becomes available
|
|
385
|
-
* 3. Sanitizes output (strip ANSI, remove binary, normalize newlines)
|
|
386
|
-
* 4. Buffers last 100KB in memory
|
|
387
|
-
* 5. Writes to temp file if output exceeds 50KB
|
|
388
|
-
* 6. Truncates output tail if exceeds max bytes
|
|
389
|
-
* 7. Returns same result format as executeBash()
|
|
390
|
-
*
|
|
391
|
-
* ## Error Handling
|
|
392
|
-
* - Errors from operations.exec() are rejected
|
|
393
|
-
* - Aborted during execution → cancelled: true
|
|
394
|
-
* - Large outputs handled same as executeBash()
|
|
395
|
-
*
|
|
396
|
-
* @param command - The bash command to execute
|
|
397
|
-
* @param cwd - Working directory for command execution
|
|
398
|
-
* @param operations - Custom execution operations (e.g., SSH, Docker)
|
|
399
|
-
* @param options - Optional streaming callback and abort signal
|
|
400
|
-
*
|
|
401
|
-
* @returns Promise<BashResult>
|
|
402
|
-
* - output: Combined output (sanitized, possibly truncated)
|
|
403
|
-
* - exitCode: Process exit code from operations.exec()
|
|
404
|
-
* - cancelled: Whether execution was aborted
|
|
405
|
-
* - truncated: Whether output was truncated
|
|
406
|
-
* - fullOutputPath: Path to temp file if truncated
|
|
407
|
-
*
|
|
408
|
-
* @throws Error if operations.exec() throws
|
|
409
|
-
* - Propagates any errors from the custom operations
|
|
410
|
-
* - Caller responsible for interpreting operation-specific errors
|
|
411
|
-
*
|
|
412
|
-
* @example
|
|
413
|
-
* // SSH execution
|
|
414
|
-
* const sshOps: BashOperations = {
|
|
415
|
-
* exec: async (cmd, cwd, opts) => {
|
|
416
|
-
* const { execSync } = require('child_process');
|
|
417
|
-
* const output = execSync(`ssh user@host "cd ${cwd} && ${cmd}"`, {
|
|
418
|
-
* stdio: ['pipe', 'pipe', 'pipe'],
|
|
419
|
-
* });
|
|
420
|
-
* // Stream output via opts.onData()
|
|
421
|
-
* opts.onData(output);
|
|
422
|
-
* return { exitCode: 0 };
|
|
423
|
-
* },
|
|
424
|
-
* };
|
|
425
|
-
*
|
|
426
|
-
* const result = await executeBashWithOperations("npm test", ".", sshOps);
|
|
427
|
-
*/
|
|
428
202
|
export async function executeBashWithOperations(command, cwd, operations, options) {
|
|
429
203
|
const outputChunks = [];
|
|
430
204
|
let outputBytes = 0;
|
|
@@ -435,9 +209,7 @@ export async function executeBashWithOperations(command, cwd, operations, option
|
|
|
435
209
|
const decoder = new TextDecoder();
|
|
436
210
|
const onData = (data) => {
|
|
437
211
|
totalBytes += data.length;
|
|
438
|
-
// Sanitize: strip ANSI, replace binary garbage, normalize newlines
|
|
439
212
|
const text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\r/g, "");
|
|
440
|
-
// Start writing to temp file if exceeds threshold
|
|
441
213
|
if (totalBytes > DEFAULT_MAX_BYTES && !tempFilePath) {
|
|
442
214
|
const id = randomBytes(8).toString("hex");
|
|
443
215
|
tempFilePath = join(tmpdir(), `indusagi-bash-${id}.log`);
|
|
@@ -449,17 +221,13 @@ export async function executeBashWithOperations(command, cwd, operations, option
|
|
|
449
221
|
if (tempFileStream) {
|
|
450
222
|
tempFileStream.write(text);
|
|
451
223
|
}
|
|
452
|
-
// Keep rolling buffer
|
|
453
224
|
outputChunks.push(text);
|
|
454
225
|
outputBytes += text.length;
|
|
455
226
|
while (outputBytes > maxOutputBytes && outputChunks.length > 1) {
|
|
456
227
|
const removed = outputChunks.shift();
|
|
457
228
|
outputBytes -= removed.length;
|
|
458
229
|
}
|
|
459
|
-
|
|
460
|
-
if (options?.onChunk) {
|
|
461
|
-
options.onChunk(text);
|
|
462
|
-
}
|
|
230
|
+
options?.onChunk?.(text);
|
|
463
231
|
};
|
|
464
232
|
try {
|
|
465
233
|
const result = await operations.exec(command, cwd, {
|
|
@@ -471,33 +239,32 @@ export async function executeBashWithOperations(command, cwd, operations, option
|
|
|
471
239
|
tempFileStream.end();
|
|
472
240
|
}
|
|
473
241
|
const fullOutput = outputChunks.join("");
|
|
474
|
-
const
|
|
242
|
+
const truncation = truncateTail(fullOutput);
|
|
475
243
|
const cancelled = options?.signal?.aborted ?? false;
|
|
476
244
|
return {
|
|
477
|
-
output:
|
|
245
|
+
output: truncation.truncated ? truncation.content : fullOutput,
|
|
478
246
|
exitCode: cancelled ? undefined : (result.exitCode ?? undefined),
|
|
479
247
|
cancelled,
|
|
480
|
-
truncated:
|
|
248
|
+
truncated: truncation.truncated,
|
|
481
249
|
fullOutputPath: tempFilePath,
|
|
482
250
|
};
|
|
483
251
|
}
|
|
484
|
-
catch (
|
|
252
|
+
catch (error) {
|
|
485
253
|
if (tempFileStream) {
|
|
486
254
|
tempFileStream.end();
|
|
487
255
|
}
|
|
488
|
-
// Check if it was an abort
|
|
489
256
|
if (options?.signal?.aborted) {
|
|
490
257
|
const fullOutput = outputChunks.join("");
|
|
491
|
-
const
|
|
258
|
+
const truncation = truncateTail(fullOutput);
|
|
492
259
|
return {
|
|
493
|
-
output:
|
|
260
|
+
output: truncation.truncated ? truncation.content : fullOutput,
|
|
494
261
|
exitCode: undefined,
|
|
495
262
|
cancelled: true,
|
|
496
|
-
truncated:
|
|
263
|
+
truncated: truncation.truncated,
|
|
497
264
|
fullOutputPath: tempFilePath,
|
|
498
265
|
};
|
|
499
266
|
}
|
|
500
|
-
throw
|
|
267
|
+
throw error;
|
|
501
268
|
}
|
|
502
269
|
}
|
|
503
270
|
//# sourceMappingURL=bash-executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAoB,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAgBzC,IAAI,iBAAiB,GAA6C,IAAI,CAAC;AAEvE,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,sBAAsB,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzD,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,sBAAsB,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,iBAAiB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,iBAAiB,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,iBAAiB,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,iBAAiB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IAClD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpG,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,CAAC,OAAO,CAAC,EAAE,WAAW;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACnD,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAA6B;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;QACzC,MAAM,KAAK,GAAiB,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE;YAC3D,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;YAClD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,cAAc,GAAG,iBAAiB,GAAG,CAAC,CAAC;QAE7C,IAAI,YAAgC,CAAC;QACrC,IAAI,cAAuC,CAAC;QAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,OAAO,CAAC;oBACN,MAAM,EAAE,EAAE;oBACV,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAElC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;YAClC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAExG,IAAI,UAAU,GAAG,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1C,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACzD,cAAc,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACjD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;YAC3B,OAAO,WAAW,GAAG,cAAc,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAG,CAAC;gBACtC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;YAChC,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAErC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;YAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;YAEhC,OAAO,CAAC;gBACN,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;gBAC9D,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;gBACtC,SAAS;gBACT,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,cAAc,EAAE,YAAY;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAe,EACf,GAAW,EACX,UAA0B,EAC1B,OAA6B;IAE7B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,cAAc,GAAG,iBAAiB,GAAG,CAAC,CAAC;IAE7C,IAAI,YAAgC,CAAC;IACrC,IAAI,cAAuC,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9B,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAExG,IAAI,UAAU,GAAG,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1C,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACzD,cAAc,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,WAAW,GAAG,cAAc,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAG,CAAC;YACtC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;QAChC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACjD,MAAM;YACN,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,GAAG,EAAE,OAAO,EAAE,GAAG;SAClB,CAAC,CAAC;QAEH,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;QAEpD,OAAO;YACL,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;YAC9D,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;YAChE,SAAS;YACT,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,cAAc,EAAE,YAAY;SAC7B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;gBAC9D,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,cAAc,EAAE,YAAY;aAC7B,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|