openvibe 0.57.1
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 +3041 -0
- package/README.md +569 -0
- package/dist/cli/args.d.ts +44 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +272 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +10 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +26 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +10 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +68 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +3 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +30 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +5 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +30 -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 +31 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +145 -0
- package/dist/config.js.map +1 -0
- package/dist/core/accelerated-client.d.ts +42 -0
- package/dist/core/accelerated-client.d.ts.map +1 -0
- package/dist/core/accelerated-client.js +97 -0
- package/dist/core/accelerated-client.js.map +1 -0
- package/dist/core/accelerated-stream.d.ts +41 -0
- package/dist/core/accelerated-stream.d.ts.map +1 -0
- package/dist/core/accelerated-stream.js +133 -0
- package/dist/core/accelerated-stream.js.map +1 -0
- package/dist/core/agent-session.d.ts +566 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2361 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/api-concurrency.d.ts +37 -0
- package/dist/core/api-concurrency.d.ts.map +1 -0
- package/dist/core/api-concurrency.js +179 -0
- package/dist/core/api-concurrency.js.map +1 -0
- package/dist/core/auth-storage.d.ts +66 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +336 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +15 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +166 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/branded-ai.d.ts +17 -0
- package/dist/core/branded-ai.d.ts.map +1 -0
- package/dist/core/branded-ai.js +123 -0
- package/dist/core/branded-ai.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +37 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +158 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +56 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +501 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +4 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +4 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +17 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +120 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.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 +13 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +61 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +3 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +193 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +22 -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 +971 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1583 -0
- package/dist/core/export-html/tool-renderer.d.ts +21 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +51 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -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 +8 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +5 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +7 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +349 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +124 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +657 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1032 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +35 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +8 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +79 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +19 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +113 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +22 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +124 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +51 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +102 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +26 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +61 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +20 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +47 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/multi-gpu-executor.d.ts +50 -0
- package/dist/core/multi-gpu-executor.d.ts.map +1 -0
- package/dist/core/multi-gpu-executor.js +201 -0
- package/dist/core/multi-gpu-executor.js.map +1 -0
- package/dist/core/onboarding.d.ts +3 -0
- package/dist/core/onboarding.d.ts.map +1 -0
- package/dist/core/onboarding.js +109 -0
- package/dist/core/onboarding.js.map +1 -0
- package/dist/core/package-manager.d.ts +136 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1375 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +18 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +204 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +4 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +45 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +184 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +661 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/response-accelerator.d.ts +51 -0
- package/dist/core/response-accelerator.d.ts.map +1 -0
- package/dist/core/response-accelerator.js +149 -0
- package/dist/core/response-accelerator.js.map +1 -0
- package/dist/core/sdk.d.ts +39 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +151 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +160 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +899 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +220 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +673 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +33 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +326 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +19 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/system-prompt.d.ts +23 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +154 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +3 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +21 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +40 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +212 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +29 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +182 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +28 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +129 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/fast-executor.d.ts +33 -0
- package/dist/core/tools/fast-executor.d.ts.map +1 -0
- package/dist/core/tools/fast-executor.js +83 -0
- package/dist/core/tools/fast-executor.js.map +1 -0
- package/dist/core/tools/find.d.ts +28 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +50 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +233 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +63 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +52 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/local-accelerator.d.ts +65 -0
- package/dist/core/tools/local-accelerator.d.ts.map +1 -0
- package/dist/core/tools/local-accelerator.js +198 -0
- package/dist/core/tools/local-accelerator.js.map +1 -0
- package/dist/core/tools/ls.d.ts +31 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +109 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/parallel-executor.d.ts +60 -0
- package/dist/core/tools/parallel-executor.d.ts.map +1 -0
- package/dist/core/tools/parallel-executor.js +257 -0
- package/dist/core/tools/parallel-executor.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +4 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +70 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +29 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +146 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +28 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +161 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +21 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +69 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/user-config.d.ts +26 -0
- package/dist/core/user-config.d.ts.map +1 -0
- package/dist/core/user-config.js +75 -0
- package/dist/core/user-config.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +609 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +8 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +197 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +6 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +5 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +31 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +306 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +13 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +82 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +23 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +126 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +50 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +12 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +40 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +12 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +41 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +68 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +451 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +11 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +30 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +14 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +52 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +16 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +66 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +18 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +130 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +5 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +106 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +8 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +12 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +16 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +95 -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 +57 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +20 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +74 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +14 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +78 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +28 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +28 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +25 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/onboarding-wizard.d.ts +23 -0
- package/dist/modes/interactive/components/onboarding-wizard.d.ts.map +1 -0
- package/dist/modes/interactive/components/onboarding-wizard.js +250 -0
- package/dist/modes/interactive/components/onboarding-wizard.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +21 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +149 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +89 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +786 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +55 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +273 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +7 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +28 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +12 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +40 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +8 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +38 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +40 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +54 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +704 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +59 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +929 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +24 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +89 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +6 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +24 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +6 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +15 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +177 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +3037 -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 +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +60 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +852 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +10 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +80 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +4 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +36 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +94 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +262 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +3 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +227 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +395 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +2 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +11 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +69 -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 +157 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +7 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.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 +55 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/git.d.ts +10 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +156 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image-convert.d.ts +5 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +28 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +19 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +152 -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/photon.d.ts +3 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +102 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +8 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +135 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +2 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +14 -0
- package/dist/utils/sleep.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 +227 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/docs/compaction.md +392 -0
- package/docs/custom-provider.md +592 -0
- package/docs/development.md +69 -0
- package/docs/extensions.md +2023 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/json.md +79 -0
- package/docs/keybindings.md +182 -0
- package/docs/models.md +297 -0
- package/docs/packages.md +209 -0
- package/docs/prompt-templates.md +67 -0
- package/docs/providers.md +188 -0
- package/docs/rpc.md +1354 -0
- package/docs/sdk.md +968 -0
- package/docs/session.md +412 -0
- package/docs/settings.md +225 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +87 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tree.md +228 -0
- package/docs/tui.md +887 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +205 -0
- package/examples/extensions/antigravity-image-gen.ts +415 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/built-in-tool-renderer.ts +246 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -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 +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/examples/extensions/custom-provider-qwen-cli/package.json +16 -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/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -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/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/examples/extensions/overlay-test.ts +150 -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/provider-payload.ts +14 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +124 -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/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -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 +126 -0
- package/examples/extensions/subagent/index.ts +964 -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/system-prompt-header.ts +17 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -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/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/rpc-extension-ui.ts +632 -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 +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +51 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-accelerator.d.ts","sourceRoot":"","sources":["../../../src/core/tools/local-accelerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile as fsReadFile, writeFile as fsWriteFile, mkdir } from \"fs/promises\";\nimport { cpus, freemem, totalmem } from \"os\";\nimport { dirname, join } from \"path\";\nimport { parallelExecute as parallelExec } from \"./parallel-executor.js\";\n\ninterface SystemResources {\n\tcpus: number;\n\ttotalMemory: number;\n\tfreeMemory: number;\n\tgpuAvailable: boolean;\n\tgpuType?: string;\n}\ninterface CacheEntry {\n\tdata: string;\n\ttimestamp: number;\n\tsize: number;\n}\nfunction getSystemResources(): SystemResources {\n\tconst cpuCount = cpus().length;\n\tconst totalMem = totalmem();\n\tconst freeMem = freemem();\n\tlet gpuAvailable = false;\n\tlet gpuType: string | undefined;\n\tif (process.env.CUDA_VISIBLE_DEVICES !== undefined) {\n\t\tgpuAvailable = true;\n\t\tgpuType = \"cuda\";\n\t} else if (process.platform === \"darwin\" && process.arch === \"arm64\") {\n\t\tgpuAvailable = true;\n\t\tgpuType = \"metal\";\n\t}\n\treturn {\n\t\tcpus: cpuCount,\n\t\ttotalMemory: totalMem,\n\t\tfreeMemory: freeMem,\n\t\tgpuAvailable,\n\t\tgpuType,\n\t};\n}\nclass FileCache {\n\tprivate cache = new Map<string, CacheEntry>();\n\tprivate maxSize: number;\n\tprivate currentSize = 0;\n\tprivate enabled: boolean;\n\tconstructor(maxMemoryMB: number = 512, enabled: boolean = true) {\n\t\tthis.maxSize = maxMemoryMB * 1024 * 1024;\n\t\tthis.enabled = enabled;\n\t}\n\tget(key: string): string | undefined {\n\t\tif (!this.enabled) return undefined;\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tentry.timestamp = Date.now();\n\t\t\treturn entry.data;\n\t\t}\n\t\treturn undefined;\n\t}\n\tset(key: string, data: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst size = Buffer.byteLength(data, \"utf-8\");\n\t\tif (size > this.maxSize / 4) return;\n\t\twhile (this.currentSize + size > this.maxSize && this.cache.size > 0) {\n\t\t\tthis.evictLRU();\n\t\t}\n\t\tthis.cache.set(key, {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t\tsize,\n\t\t});\n\t\tthis.currentSize += size;\n\t}\n\tinvalidate(key: string): void {\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tthis.currentSize -= entry.size;\n\t\t\tthis.cache.delete(key);\n\t\t}\n\t}\n\tclear(): void {\n\t\tthis.cache.clear();\n\t\tthis.currentSize = 0;\n\t}\n\tprivate evictLRU(): void {\n\t\tlet oldest: { key: string; timestamp: number } | null = null;\n\t\tfor (const [key, entry] of this.cache) {\n\t\t\tif (!oldest || entry.timestamp < oldest.timestamp) {\n\t\t\t\toldest = { key, timestamp: entry.timestamp };\n\t\t\t}\n\t\t}\n\t\tif (oldest) {\n\t\t\tconst entry = this.cache.get(oldest.key);\n\t\t\tif (entry) {\n\t\t\t\tthis.currentSize -= entry.size;\n\t\t\t\tthis.cache.delete(oldest.key);\n\t\t\t}\n\t\t}\n\t}\n\tgetStats(): { entries: number; sizeMB: number } {\n\t\treturn {\n\t\t\tentries: this.cache.size,\n\t\t\tsizeMB: Math.round((this.currentSize / 1024 / 1024) * 100) / 100,\n\t\t};\n\t}\n}\nconst globalFileCache = new FileCache(512, true);\nasync function parallelExecute<T, R>(items: T[], workerCount: number, taskFn: (item: T) => Promise<R>): Promise<R[]> {\n\treturn parallelExec(items, taskFn, {\n\t\tconcurrency: workerCount,\n\t\tpriority: 5,\n\t});\n}\nexport async function acceleratedReadFile(absolutePath: string, useCache: boolean = true): Promise<Buffer> {\n\tconst cached = useCache ? globalFileCache.get(absolutePath) : undefined;\n\tif (cached !== undefined) {\n\t\treturn Buffer.from(cached, \"utf-8\");\n\t}\n\tconst content = await fsReadFile(absolutePath);\n\tif (useCache && content.length < 1024 * 1024) {\n\t\tglobalFileCache.set(absolutePath, content.toString(\"utf-8\"));\n\t}\n\treturn content;\n}\nexport async function acceleratedWriteFile(absolutePath: string, content: string): Promise<void> {\n\tconst dir = dirname(absolutePath);\n\tawait mkdir(dir, { recursive: true });\n\tawait fsWriteFile(absolutePath, content, \"utf-8\");\n\tglobalFileCache.invalidate(absolutePath);\n}\nexport async function parallelReadFiles(\n\tpaths: string[],\n\tuseCache: boolean = true,\n): Promise<{ path: string; content: Buffer }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\treturn parallelExecute(paths, workerCount, async (path) => ({\n\t\tpath,\n\t\tcontent: await acceleratedReadFile(path, useCache),\n\t}));\n}\nexport async function parallelWriteFiles(\n\tfiles: { path: string; content: string }[],\n): Promise<{ path: string; bytesWritten: number }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, files.length, 8);\n\tconst dirs = new Set(files.map((f) => dirname(f.path)));\n\tawait parallelExecute(Array.from(dirs), workerCount, async (dir) => mkdir(dir, { recursive: true }));\n\treturn parallelExecute(files, workerCount, async (file) => {\n\t\tawait acceleratedWriteFile(file.path, file.content);\n\t\treturn {\n\t\t\tpath: file.path,\n\t\t\tbytesWritten: Buffer.byteLength(file.content, \"utf-8\"),\n\t\t};\n\t});\n}\nexport async function parallelGrep(\n\tpaths: string[],\n\tpattern: string,\n): Promise<{ path: string; matches: { line: number; content: string }[] }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\tconst regex = new RegExp(pattern, \"g\");\n\treturn parallelExecute(paths, workerCount, async (path) => {\n\t\tconst content = await acceleratedReadFile(path, true);\n\t\tconst text = content.toString(\"utf-8\");\n\t\tconst lines = text.split(\"\\n\");\n\t\tconst matches: { line: number; content: string }[] = [];\n\t\tlines.forEach((line, index) => {\n\t\t\tregex.lastIndex = 0;\n\t\t\tif (regex.test(line)) {\n\t\t\t\tmatches.push({ line: index + 1, content: line });\n\t\t\t}\n\t\t});\n\t\treturn { path, matches };\n\t});\n}\nexport async function parallelReplace(\n\tpaths: string[],\n\tpattern: string,\n\treplacement: string,\n): Promise<{ path: string; replacements: number }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\tconst regex = new RegExp(pattern, \"g\");\n\treturn parallelExecute(paths, workerCount, async (path) => {\n\t\tconst buffer = await acceleratedReadFile(path, false);\n\t\tconst content = buffer.toString(\"utf-8\");\n\t\tlet matchCount = 0;\n\t\tconst newContent = content.replace(regex, (match) => {\n\t\t\tmatchCount++;\n\t\t\treturn replacement;\n\t\t});\n\t\tif (matchCount > 0) {\n\t\t\tawait acceleratedWriteFile(path, newContent);\n\t\t}\n\t\treturn { path, replacements: matchCount };\n\t});\n}\nexport function getCacheStats(): { entries: number; sizeMB: number } {\n\treturn globalFileCache.getStats();\n}\nexport function clearFileCache(): void {\n\tglobalFileCache.clear();\n}\nexport function getAcceleratorResources(): SystemResources {\n\treturn getSystemResources();\n}\nexport interface AcceleratorConfig {\n\tenabled: boolean;\n\tcacheEnabled: boolean;\n\tmaxCacheSizeMB: number;\n\tmaxWorkers: number;\n}\nlet acceleratorConfig: AcceleratorConfig = {\n\tenabled: true,\n\tcacheEnabled: true,\n\tmaxCacheSizeMB: 256,\n\tmaxWorkers: Math.min(cpus().length, 8),\n};\nexport function configureAccelerator(config: Partial<AcceleratorConfig>): void {\n\tacceleratorConfig = { ...acceleratorConfig, ...config };\n}\nexport function isAcceleratorEnabled(): boolean {\n\treturn acceleratorConfig.enabled;\n}\nexport { globalFileCache, getSystemResources };\n"]}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { readFile as fsReadFile, writeFile as fsWriteFile, mkdir } from "fs/promises";
|
|
2
|
+
import { cpus, freemem, totalmem } from "os";
|
|
3
|
+
import { dirname } from "path";
|
|
4
|
+
import { parallelExecute as parallelExec } from "./parallel-executor.js";
|
|
5
|
+
function getSystemResources() {
|
|
6
|
+
const cpuCount = cpus().length;
|
|
7
|
+
const totalMem = totalmem();
|
|
8
|
+
const freeMem = freemem();
|
|
9
|
+
let gpuAvailable = false;
|
|
10
|
+
let gpuType;
|
|
11
|
+
if (process.env.CUDA_VISIBLE_DEVICES !== undefined) {
|
|
12
|
+
gpuAvailable = true;
|
|
13
|
+
gpuType = "cuda";
|
|
14
|
+
}
|
|
15
|
+
else if (process.platform === "darwin" && process.arch === "arm64") {
|
|
16
|
+
gpuAvailable = true;
|
|
17
|
+
gpuType = "metal";
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
cpus: cpuCount,
|
|
21
|
+
totalMemory: totalMem,
|
|
22
|
+
freeMemory: freeMem,
|
|
23
|
+
gpuAvailable,
|
|
24
|
+
gpuType,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
class FileCache {
|
|
28
|
+
cache = new Map();
|
|
29
|
+
maxSize;
|
|
30
|
+
currentSize = 0;
|
|
31
|
+
enabled;
|
|
32
|
+
constructor(maxMemoryMB = 512, enabled = true) {
|
|
33
|
+
this.maxSize = maxMemoryMB * 1024 * 1024;
|
|
34
|
+
this.enabled = enabled;
|
|
35
|
+
}
|
|
36
|
+
get(key) {
|
|
37
|
+
if (!this.enabled)
|
|
38
|
+
return undefined;
|
|
39
|
+
const entry = this.cache.get(key);
|
|
40
|
+
if (entry) {
|
|
41
|
+
entry.timestamp = Date.now();
|
|
42
|
+
return entry.data;
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
set(key, data) {
|
|
47
|
+
if (!this.enabled)
|
|
48
|
+
return;
|
|
49
|
+
const size = Buffer.byteLength(data, "utf-8");
|
|
50
|
+
if (size > this.maxSize / 4)
|
|
51
|
+
return;
|
|
52
|
+
while (this.currentSize + size > this.maxSize && this.cache.size > 0) {
|
|
53
|
+
this.evictLRU();
|
|
54
|
+
}
|
|
55
|
+
this.cache.set(key, {
|
|
56
|
+
data,
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
size,
|
|
59
|
+
});
|
|
60
|
+
this.currentSize += size;
|
|
61
|
+
}
|
|
62
|
+
invalidate(key) {
|
|
63
|
+
const entry = this.cache.get(key);
|
|
64
|
+
if (entry) {
|
|
65
|
+
this.currentSize -= entry.size;
|
|
66
|
+
this.cache.delete(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
clear() {
|
|
70
|
+
this.cache.clear();
|
|
71
|
+
this.currentSize = 0;
|
|
72
|
+
}
|
|
73
|
+
evictLRU() {
|
|
74
|
+
let oldest = null;
|
|
75
|
+
for (const [key, entry] of this.cache) {
|
|
76
|
+
if (!oldest || entry.timestamp < oldest.timestamp) {
|
|
77
|
+
oldest = { key, timestamp: entry.timestamp };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (oldest) {
|
|
81
|
+
const entry = this.cache.get(oldest.key);
|
|
82
|
+
if (entry) {
|
|
83
|
+
this.currentSize -= entry.size;
|
|
84
|
+
this.cache.delete(oldest.key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getStats() {
|
|
89
|
+
return {
|
|
90
|
+
entries: this.cache.size,
|
|
91
|
+
sizeMB: Math.round((this.currentSize / 1024 / 1024) * 100) / 100,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const globalFileCache = new FileCache(512, true);
|
|
96
|
+
async function parallelExecute(items, workerCount, taskFn) {
|
|
97
|
+
return parallelExec(items, taskFn, {
|
|
98
|
+
concurrency: workerCount,
|
|
99
|
+
priority: 5,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export async function acceleratedReadFile(absolutePath, useCache = true) {
|
|
103
|
+
const cached = useCache ? globalFileCache.get(absolutePath) : undefined;
|
|
104
|
+
if (cached !== undefined) {
|
|
105
|
+
return Buffer.from(cached, "utf-8");
|
|
106
|
+
}
|
|
107
|
+
const content = await fsReadFile(absolutePath);
|
|
108
|
+
if (useCache && content.length < 1024 * 1024) {
|
|
109
|
+
globalFileCache.set(absolutePath, content.toString("utf-8"));
|
|
110
|
+
}
|
|
111
|
+
return content;
|
|
112
|
+
}
|
|
113
|
+
export async function acceleratedWriteFile(absolutePath, content) {
|
|
114
|
+
const dir = dirname(absolutePath);
|
|
115
|
+
await mkdir(dir, { recursive: true });
|
|
116
|
+
await fsWriteFile(absolutePath, content, "utf-8");
|
|
117
|
+
globalFileCache.invalidate(absolutePath);
|
|
118
|
+
}
|
|
119
|
+
export async function parallelReadFiles(paths, useCache = true) {
|
|
120
|
+
const resources = getSystemResources();
|
|
121
|
+
const workerCount = Math.min(resources.cpus, paths.length, 8);
|
|
122
|
+
return parallelExecute(paths, workerCount, async (path) => ({
|
|
123
|
+
path,
|
|
124
|
+
content: await acceleratedReadFile(path, useCache),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
export async function parallelWriteFiles(files) {
|
|
128
|
+
const resources = getSystemResources();
|
|
129
|
+
const workerCount = Math.min(resources.cpus, files.length, 8);
|
|
130
|
+
const dirs = new Set(files.map((f) => dirname(f.path)));
|
|
131
|
+
await parallelExecute(Array.from(dirs), workerCount, async (dir) => mkdir(dir, { recursive: true }));
|
|
132
|
+
return parallelExecute(files, workerCount, async (file) => {
|
|
133
|
+
await acceleratedWriteFile(file.path, file.content);
|
|
134
|
+
return {
|
|
135
|
+
path: file.path,
|
|
136
|
+
bytesWritten: Buffer.byteLength(file.content, "utf-8"),
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
export async function parallelGrep(paths, pattern) {
|
|
141
|
+
const resources = getSystemResources();
|
|
142
|
+
const workerCount = Math.min(resources.cpus, paths.length, 8);
|
|
143
|
+
const regex = new RegExp(pattern, "g");
|
|
144
|
+
return parallelExecute(paths, workerCount, async (path) => {
|
|
145
|
+
const content = await acceleratedReadFile(path, true);
|
|
146
|
+
const text = content.toString("utf-8");
|
|
147
|
+
const lines = text.split("\n");
|
|
148
|
+
const matches = [];
|
|
149
|
+
lines.forEach((line, index) => {
|
|
150
|
+
regex.lastIndex = 0;
|
|
151
|
+
if (regex.test(line)) {
|
|
152
|
+
matches.push({ line: index + 1, content: line });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return { path, matches };
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export async function parallelReplace(paths, pattern, replacement) {
|
|
159
|
+
const resources = getSystemResources();
|
|
160
|
+
const workerCount = Math.min(resources.cpus, paths.length, 8);
|
|
161
|
+
const regex = new RegExp(pattern, "g");
|
|
162
|
+
return parallelExecute(paths, workerCount, async (path) => {
|
|
163
|
+
const buffer = await acceleratedReadFile(path, false);
|
|
164
|
+
const content = buffer.toString("utf-8");
|
|
165
|
+
let matchCount = 0;
|
|
166
|
+
const newContent = content.replace(regex, (match) => {
|
|
167
|
+
matchCount++;
|
|
168
|
+
return replacement;
|
|
169
|
+
});
|
|
170
|
+
if (matchCount > 0) {
|
|
171
|
+
await acceleratedWriteFile(path, newContent);
|
|
172
|
+
}
|
|
173
|
+
return { path, replacements: matchCount };
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
export function getCacheStats() {
|
|
177
|
+
return globalFileCache.getStats();
|
|
178
|
+
}
|
|
179
|
+
export function clearFileCache() {
|
|
180
|
+
globalFileCache.clear();
|
|
181
|
+
}
|
|
182
|
+
export function getAcceleratorResources() {
|
|
183
|
+
return getSystemResources();
|
|
184
|
+
}
|
|
185
|
+
let acceleratorConfig = {
|
|
186
|
+
enabled: true,
|
|
187
|
+
cacheEnabled: true,
|
|
188
|
+
maxCacheSizeMB: 256,
|
|
189
|
+
maxWorkers: Math.min(cpus().length, 8),
|
|
190
|
+
};
|
|
191
|
+
export function configureAccelerator(config) {
|
|
192
|
+
acceleratorConfig = { ...acceleratorConfig, ...config };
|
|
193
|
+
}
|
|
194
|
+
export function isAcceleratorEnabled() {
|
|
195
|
+
return acceleratorConfig.enabled;
|
|
196
|
+
}
|
|
197
|
+
export { globalFileCache, getSystemResources };
|
|
198
|
+
//# sourceMappingURL=local-accelerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-accelerator.js","sourceRoot":"","sources":["../../../src/core/tools/local-accelerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile as fsReadFile, writeFile as fsWriteFile, mkdir } from \"fs/promises\";\nimport { cpus, freemem, totalmem } from \"os\";\nimport { dirname, join } from \"path\";\nimport { parallelExecute as parallelExec } from \"./parallel-executor.js\";\n\ninterface SystemResources {\n\tcpus: number;\n\ttotalMemory: number;\n\tfreeMemory: number;\n\tgpuAvailable: boolean;\n\tgpuType?: string;\n}\ninterface CacheEntry {\n\tdata: string;\n\ttimestamp: number;\n\tsize: number;\n}\nfunction getSystemResources(): SystemResources {\n\tconst cpuCount = cpus().length;\n\tconst totalMem = totalmem();\n\tconst freeMem = freemem();\n\tlet gpuAvailable = false;\n\tlet gpuType: string | undefined;\n\tif (process.env.CUDA_VISIBLE_DEVICES !== undefined) {\n\t\tgpuAvailable = true;\n\t\tgpuType = \"cuda\";\n\t} else if (process.platform === \"darwin\" && process.arch === \"arm64\") {\n\t\tgpuAvailable = true;\n\t\tgpuType = \"metal\";\n\t}\n\treturn {\n\t\tcpus: cpuCount,\n\t\ttotalMemory: totalMem,\n\t\tfreeMemory: freeMem,\n\t\tgpuAvailable,\n\t\tgpuType,\n\t};\n}\nclass FileCache {\n\tprivate cache = new Map<string, CacheEntry>();\n\tprivate maxSize: number;\n\tprivate currentSize = 0;\n\tprivate enabled: boolean;\n\tconstructor(maxMemoryMB: number = 512, enabled: boolean = true) {\n\t\tthis.maxSize = maxMemoryMB * 1024 * 1024;\n\t\tthis.enabled = enabled;\n\t}\n\tget(key: string): string | undefined {\n\t\tif (!this.enabled) return undefined;\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tentry.timestamp = Date.now();\n\t\t\treturn entry.data;\n\t\t}\n\t\treturn undefined;\n\t}\n\tset(key: string, data: string): void {\n\t\tif (!this.enabled) return;\n\t\tconst size = Buffer.byteLength(data, \"utf-8\");\n\t\tif (size > this.maxSize / 4) return;\n\t\twhile (this.currentSize + size > this.maxSize && this.cache.size > 0) {\n\t\t\tthis.evictLRU();\n\t\t}\n\t\tthis.cache.set(key, {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t\tsize,\n\t\t});\n\t\tthis.currentSize += size;\n\t}\n\tinvalidate(key: string): void {\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tthis.currentSize -= entry.size;\n\t\t\tthis.cache.delete(key);\n\t\t}\n\t}\n\tclear(): void {\n\t\tthis.cache.clear();\n\t\tthis.currentSize = 0;\n\t}\n\tprivate evictLRU(): void {\n\t\tlet oldest: { key: string; timestamp: number } | null = null;\n\t\tfor (const [key, entry] of this.cache) {\n\t\t\tif (!oldest || entry.timestamp < oldest.timestamp) {\n\t\t\t\toldest = { key, timestamp: entry.timestamp };\n\t\t\t}\n\t\t}\n\t\tif (oldest) {\n\t\t\tconst entry = this.cache.get(oldest.key);\n\t\t\tif (entry) {\n\t\t\t\tthis.currentSize -= entry.size;\n\t\t\t\tthis.cache.delete(oldest.key);\n\t\t\t}\n\t\t}\n\t}\n\tgetStats(): { entries: number; sizeMB: number } {\n\t\treturn {\n\t\t\tentries: this.cache.size,\n\t\t\tsizeMB: Math.round((this.currentSize / 1024 / 1024) * 100) / 100,\n\t\t};\n\t}\n}\nconst globalFileCache = new FileCache(512, true);\nasync function parallelExecute<T, R>(items: T[], workerCount: number, taskFn: (item: T) => Promise<R>): Promise<R[]> {\n\treturn parallelExec(items, taskFn, {\n\t\tconcurrency: workerCount,\n\t\tpriority: 5,\n\t});\n}\nexport async function acceleratedReadFile(absolutePath: string, useCache: boolean = true): Promise<Buffer> {\n\tconst cached = useCache ? globalFileCache.get(absolutePath) : undefined;\n\tif (cached !== undefined) {\n\t\treturn Buffer.from(cached, \"utf-8\");\n\t}\n\tconst content = await fsReadFile(absolutePath);\n\tif (useCache && content.length < 1024 * 1024) {\n\t\tglobalFileCache.set(absolutePath, content.toString(\"utf-8\"));\n\t}\n\treturn content;\n}\nexport async function acceleratedWriteFile(absolutePath: string, content: string): Promise<void> {\n\tconst dir = dirname(absolutePath);\n\tawait mkdir(dir, { recursive: true });\n\tawait fsWriteFile(absolutePath, content, \"utf-8\");\n\tglobalFileCache.invalidate(absolutePath);\n}\nexport async function parallelReadFiles(\n\tpaths: string[],\n\tuseCache: boolean = true,\n): Promise<{ path: string; content: Buffer }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\treturn parallelExecute(paths, workerCount, async (path) => ({\n\t\tpath,\n\t\tcontent: await acceleratedReadFile(path, useCache),\n\t}));\n}\nexport async function parallelWriteFiles(\n\tfiles: { path: string; content: string }[],\n): Promise<{ path: string; bytesWritten: number }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, files.length, 8);\n\tconst dirs = new Set(files.map((f) => dirname(f.path)));\n\tawait parallelExecute(Array.from(dirs), workerCount, async (dir) => mkdir(dir, { recursive: true }));\n\treturn parallelExecute(files, workerCount, async (file) => {\n\t\tawait acceleratedWriteFile(file.path, file.content);\n\t\treturn {\n\t\t\tpath: file.path,\n\t\t\tbytesWritten: Buffer.byteLength(file.content, \"utf-8\"),\n\t\t};\n\t});\n}\nexport async function parallelGrep(\n\tpaths: string[],\n\tpattern: string,\n): Promise<{ path: string; matches: { line: number; content: string }[] }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\tconst regex = new RegExp(pattern, \"g\");\n\treturn parallelExecute(paths, workerCount, async (path) => {\n\t\tconst content = await acceleratedReadFile(path, true);\n\t\tconst text = content.toString(\"utf-8\");\n\t\tconst lines = text.split(\"\\n\");\n\t\tconst matches: { line: number; content: string }[] = [];\n\t\tlines.forEach((line, index) => {\n\t\t\tregex.lastIndex = 0;\n\t\t\tif (regex.test(line)) {\n\t\t\t\tmatches.push({ line: index + 1, content: line });\n\t\t\t}\n\t\t});\n\t\treturn { path, matches };\n\t});\n}\nexport async function parallelReplace(\n\tpaths: string[],\n\tpattern: string,\n\treplacement: string,\n): Promise<{ path: string; replacements: number }[]> {\n\tconst resources = getSystemResources();\n\tconst workerCount = Math.min(resources.cpus, paths.length, 8);\n\tconst regex = new RegExp(pattern, \"g\");\n\treturn parallelExecute(paths, workerCount, async (path) => {\n\t\tconst buffer = await acceleratedReadFile(path, false);\n\t\tconst content = buffer.toString(\"utf-8\");\n\t\tlet matchCount = 0;\n\t\tconst newContent = content.replace(regex, (match) => {\n\t\t\tmatchCount++;\n\t\t\treturn replacement;\n\t\t});\n\t\tif (matchCount > 0) {\n\t\t\tawait acceleratedWriteFile(path, newContent);\n\t\t}\n\t\treturn { path, replacements: matchCount };\n\t});\n}\nexport function getCacheStats(): { entries: number; sizeMB: number } {\n\treturn globalFileCache.getStats();\n}\nexport function clearFileCache(): void {\n\tglobalFileCache.clear();\n}\nexport function getAcceleratorResources(): SystemResources {\n\treturn getSystemResources();\n}\nexport interface AcceleratorConfig {\n\tenabled: boolean;\n\tcacheEnabled: boolean;\n\tmaxCacheSizeMB: number;\n\tmaxWorkers: number;\n}\nlet acceleratorConfig: AcceleratorConfig = {\n\tenabled: true,\n\tcacheEnabled: true,\n\tmaxCacheSizeMB: 256,\n\tmaxWorkers: Math.min(cpus().length, 8),\n};\nexport function configureAccelerator(config: Partial<AcceleratorConfig>): void {\n\tacceleratorConfig = { ...acceleratorConfig, ...config };\n}\nexport function isAcceleratorEnabled(): boolean {\n\treturn acceleratorConfig.enabled;\n}\nexport { globalFileCache, getSystemResources };\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
2
|
+
import { type Static } from "@sinclair/typebox";
|
|
3
|
+
import { type TruncationResult } from "./truncate.js";
|
|
4
|
+
declare const lsSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
7
|
+
}>;
|
|
8
|
+
export type LsToolInput = Static<typeof lsSchema>;
|
|
9
|
+
export interface LsToolDetails {
|
|
10
|
+
truncation?: TruncationResult;
|
|
11
|
+
entryLimitReached?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface LsOperations {
|
|
14
|
+
exists: (absolutePath: string) => Promise<boolean> | boolean;
|
|
15
|
+
stat: (absolutePath: string) => Promise<{
|
|
16
|
+
isDirectory: () => boolean;
|
|
17
|
+
}> | {
|
|
18
|
+
isDirectory: () => boolean;
|
|
19
|
+
};
|
|
20
|
+
readdir: (absolutePath: string) => Promise<string[]> | string[];
|
|
21
|
+
}
|
|
22
|
+
export interface LsToolOptions {
|
|
23
|
+
operations?: LsOperations;
|
|
24
|
+
}
|
|
25
|
+
export declare function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<typeof lsSchema>;
|
|
26
|
+
export declare const lsTool: AgentTool<import("@sinclair/typebox").TObject<{
|
|
27
|
+
path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
28
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
29
|
+
}>, any>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=ls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEnG,QAAA,MAAM,QAAQ;;;EAGZ,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC;AAElD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AACD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACzG,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CAChE;AAMD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,YAAY,CAAC;CAC1B;AACD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CA4F7F;AACD,eAAO,MAAM,MAAM;;;QAA8B,CAAC","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { existsSync, readdirSync, statSync } from \"fs\";\nimport nodePath from \"path\";\nimport { resolveToCwd } from \"./path-utils.js\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.js\";\n\nconst lsSchema = Type.Object({\n\tpath: Type.Optional(Type.String({ description: \"Directory to list (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of entries to return (default: 500)\" })),\n});\nexport type LsToolInput = Static<typeof lsSchema>;\nconst DEFAULT_LIMIT = 500;\nexport interface LsToolDetails {\n\ttruncation?: TruncationResult;\n\tentryLimitReached?: number;\n}\nexport interface LsOperations {\n\texists: (absolutePath: string) => Promise<boolean> | boolean;\n\tstat: (absolutePath: string) => Promise<{ isDirectory: () => boolean }> | { isDirectory: () => boolean };\n\treaddir: (absolutePath: string) => Promise<string[]> | string[];\n}\nconst defaultLsOperations: LsOperations = {\n\texists: existsSync,\n\tstat: statSync,\n\treaddir: readdirSync,\n};\nexport interface LsToolOptions {\n\toperations?: LsOperations;\n}\nexport function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<typeof lsSchema> {\n\tconst ops = options?.operations ?? defaultLsOperations;\n\treturn {\n\t\tname: \"ls\",\n\t\tlabel: \"ls\",\n\t\tdescription: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tparameters: lsSchema,\n\t\texecute: async (\n\t\t\t_toolCallId: string,\n\t\t\t{ path, limit }: { path?: string; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst onAbort = () => reject(new Error(\"Operation aborted\"));\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst dirPath = resolveToCwd(path || \".\", cwd);\n\t\t\t\t\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\t\t\t\t\t\tif (!(await ops.exists(dirPath))) {\n\t\t\t\t\t\t\treject(new Error(`Path not found: ${dirPath}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stat = await ops.stat(dirPath);\n\t\t\t\t\t\tif (!stat.isDirectory()) {\n\t\t\t\t\t\t\treject(new Error(`Not a directory: ${dirPath}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet entries: string[];\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tentries = await ops.readdir(dirPath);\n\t\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\t\treject(new Error(`Cannot read directory: ${e.message}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n\t\t\t\t\t\tconst results: string[] = [];\n\t\t\t\t\t\tlet entryLimitReached = false;\n\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\tif (results.length >= effectiveLimit) {\n\t\t\t\t\t\t\t\tentryLimitReached = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst fullPath = nodePath.join(dirPath, entry);\n\t\t\t\t\t\t\tlet suffix = \"\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst entryStat = await ops.stat(fullPath);\n\t\t\t\t\t\t\t\tif (entryStat.isDirectory()) {\n\t\t\t\t\t\t\t\t\tsuffix = \"/\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresults.push(entry + suffix);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tresolve({ content: [{ type: \"text\", text: \"(empty directory)\" }], details: undefined });\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst rawOutput = results.join(\"\\n\");\n\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\tlet output = truncation.content;\n\t\t\t\t\t\tconst details: LsToolDetails = {};\n\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\tif (entryLimitReached) {\n\t\t\t\t\t\t\tnotices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);\n\t\t\t\t\t\t\tdetails.entryLimitReached = effectiveLimit;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\toutput += `\\n\\n[${notices.join(\". \")}]`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t});\n\t\t},\n\t};\n}\nexport const lsTool = createLsTool(process.cwd());\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { existsSync, readdirSync, statSync } from "fs";
|
|
3
|
+
import nodePath from "path";
|
|
4
|
+
import { resolveToCwd } from "./path-utils.js";
|
|
5
|
+
import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "./truncate.js";
|
|
6
|
+
const lsSchema = Type.Object({
|
|
7
|
+
path: Type.Optional(Type.String({ description: "Directory to list (default: current directory)" })),
|
|
8
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of entries to return (default: 500)" })),
|
|
9
|
+
});
|
|
10
|
+
const DEFAULT_LIMIT = 500;
|
|
11
|
+
const defaultLsOperations = {
|
|
12
|
+
exists: existsSync,
|
|
13
|
+
stat: statSync,
|
|
14
|
+
readdir: readdirSync,
|
|
15
|
+
};
|
|
16
|
+
export function createLsTool(cwd, options) {
|
|
17
|
+
const ops = options?.operations ?? defaultLsOperations;
|
|
18
|
+
return {
|
|
19
|
+
name: "ls",
|
|
20
|
+
label: "ls",
|
|
21
|
+
description: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,
|
|
22
|
+
parameters: lsSchema,
|
|
23
|
+
execute: async (_toolCallId, { path, limit }, signal) => {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
if (signal?.aborted) {
|
|
26
|
+
reject(new Error("Operation aborted"));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const onAbort = () => reject(new Error("Operation aborted"));
|
|
30
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
31
|
+
(async () => {
|
|
32
|
+
try {
|
|
33
|
+
const dirPath = resolveToCwd(path || ".", cwd);
|
|
34
|
+
const effectiveLimit = limit ?? DEFAULT_LIMIT;
|
|
35
|
+
if (!(await ops.exists(dirPath))) {
|
|
36
|
+
reject(new Error(`Path not found: ${dirPath}`));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const stat = await ops.stat(dirPath);
|
|
40
|
+
if (!stat.isDirectory()) {
|
|
41
|
+
reject(new Error(`Not a directory: ${dirPath}`));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let entries;
|
|
45
|
+
try {
|
|
46
|
+
entries = await ops.readdir(dirPath);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
reject(new Error(`Cannot read directory: ${e.message}`));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
entries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
53
|
+
const results = [];
|
|
54
|
+
let entryLimitReached = false;
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (results.length >= effectiveLimit) {
|
|
57
|
+
entryLimitReached = true;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const fullPath = nodePath.join(dirPath, entry);
|
|
61
|
+
let suffix = "";
|
|
62
|
+
try {
|
|
63
|
+
const entryStat = await ops.stat(fullPath);
|
|
64
|
+
if (entryStat.isDirectory()) {
|
|
65
|
+
suffix = "/";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
results.push(entry + suffix);
|
|
72
|
+
}
|
|
73
|
+
signal?.removeEventListener("abort", onAbort);
|
|
74
|
+
if (results.length === 0) {
|
|
75
|
+
resolve({ content: [{ type: "text", text: "(empty directory)" }], details: undefined });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const rawOutput = results.join("\n");
|
|
79
|
+
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
80
|
+
let output = truncation.content;
|
|
81
|
+
const details = {};
|
|
82
|
+
const notices = [];
|
|
83
|
+
if (entryLimitReached) {
|
|
84
|
+
notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);
|
|
85
|
+
details.entryLimitReached = effectiveLimit;
|
|
86
|
+
}
|
|
87
|
+
if (truncation.truncated) {
|
|
88
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
89
|
+
details.truncation = truncation;
|
|
90
|
+
}
|
|
91
|
+
if (notices.length > 0) {
|
|
92
|
+
output += `\n\n[${notices.join(". ")}]`;
|
|
93
|
+
}
|
|
94
|
+
resolve({
|
|
95
|
+
content: [{ type: "text", text: output }],
|
|
96
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
signal?.removeEventListener("abort", onAbort);
|
|
101
|
+
reject(e);
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export const lsTool = createLsTool(process.cwd());
|
|
109
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/core/tools/ls.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { existsSync, readdirSync, statSync } from \"fs\";\nimport nodePath from \"path\";\nimport { resolveToCwd } from \"./path-utils.js\";\nimport { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from \"./truncate.js\";\n\nconst lsSchema = Type.Object({\n\tpath: Type.Optional(Type.String({ description: \"Directory to list (default: current directory)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of entries to return (default: 500)\" })),\n});\nexport type LsToolInput = Static<typeof lsSchema>;\nconst DEFAULT_LIMIT = 500;\nexport interface LsToolDetails {\n\ttruncation?: TruncationResult;\n\tentryLimitReached?: number;\n}\nexport interface LsOperations {\n\texists: (absolutePath: string) => Promise<boolean> | boolean;\n\tstat: (absolutePath: string) => Promise<{ isDirectory: () => boolean }> | { isDirectory: () => boolean };\n\treaddir: (absolutePath: string) => Promise<string[]> | string[];\n}\nconst defaultLsOperations: LsOperations = {\n\texists: existsSync,\n\tstat: statSync,\n\treaddir: readdirSync,\n};\nexport interface LsToolOptions {\n\toperations?: LsOperations;\n}\nexport function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<typeof lsSchema> {\n\tconst ops = options?.operations ?? defaultLsOperations;\n\treturn {\n\t\tname: \"ls\",\n\t\tlabel: \"ls\",\n\t\tdescription: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,\n\t\tparameters: lsSchema,\n\t\texecute: async (\n\t\t\t_toolCallId: string,\n\t\t\t{ path, limit }: { path?: string; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst onAbort = () => reject(new Error(\"Operation aborted\"));\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst dirPath = resolveToCwd(path || \".\", cwd);\n\t\t\t\t\t\tconst effectiveLimit = limit ?? DEFAULT_LIMIT;\n\t\t\t\t\t\tif (!(await ops.exists(dirPath))) {\n\t\t\t\t\t\t\treject(new Error(`Path not found: ${dirPath}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst stat = await ops.stat(dirPath);\n\t\t\t\t\t\tif (!stat.isDirectory()) {\n\t\t\t\t\t\t\treject(new Error(`Not a directory: ${dirPath}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet entries: string[];\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tentries = await ops.readdir(dirPath);\n\t\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\t\treject(new Error(`Cannot read directory: ${e.message}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n\t\t\t\t\t\tconst results: string[] = [];\n\t\t\t\t\t\tlet entryLimitReached = false;\n\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\tif (results.length >= effectiveLimit) {\n\t\t\t\t\t\t\t\tentryLimitReached = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst fullPath = nodePath.join(dirPath, entry);\n\t\t\t\t\t\t\tlet suffix = \"\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst entryStat = await ops.stat(fullPath);\n\t\t\t\t\t\t\t\tif (entryStat.isDirectory()) {\n\t\t\t\t\t\t\t\t\tsuffix = \"/\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresults.push(entry + suffix);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tresolve({ content: [{ type: \"text\", text: \"(empty directory)\" }], details: undefined });\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst rawOutput = results.join(\"\\n\");\n\t\t\t\t\t\tconst truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\t\tlet output = truncation.content;\n\t\t\t\t\t\tconst details: LsToolDetails = {};\n\t\t\t\t\t\tconst notices: string[] = [];\n\t\t\t\t\t\tif (entryLimitReached) {\n\t\t\t\t\t\t\tnotices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);\n\t\t\t\t\t\t\tdetails.entryLimitReached = effectiveLimit;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\t\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);\n\t\t\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (notices.length > 0) {\n\t\t\t\t\t\t\toutput += `\\n\\n[${notices.join(\". \")}]`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: Object.keys(details).length > 0 ? details : undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t});\n\t\t},\n\t};\n}\nexport const lsTool = createLsTool(process.cwd());\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
declare const MAX_CONCURRENCY: number;
|
|
2
|
+
interface SystemResources {
|
|
3
|
+
cpus: number;
|
|
4
|
+
totalMemory: number;
|
|
5
|
+
freeMemory: number;
|
|
6
|
+
gpuAvailable: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare function getSystemResources(): SystemResources;
|
|
9
|
+
export declare function parallelExecute<T, R>(items: T[], mapper: (item: T, index: number) => Promise<R> | R, options?: {
|
|
10
|
+
concurrency?: number;
|
|
11
|
+
priority?: number;
|
|
12
|
+
}): Promise<R[]>;
|
|
13
|
+
export declare class BatchProcessor<T, R> {
|
|
14
|
+
private processor;
|
|
15
|
+
private queue;
|
|
16
|
+
private processing;
|
|
17
|
+
private results;
|
|
18
|
+
private readonly concurrency;
|
|
19
|
+
constructor(processor: (items: T[]) => Promise<R[]>, options?: {
|
|
20
|
+
concurrency?: number;
|
|
21
|
+
batchSize?: number;
|
|
22
|
+
});
|
|
23
|
+
add(item: T): Promise<R>;
|
|
24
|
+
private processBatch;
|
|
25
|
+
}
|
|
26
|
+
export declare class MemoryMappedCache {
|
|
27
|
+
private cache;
|
|
28
|
+
private maxSize;
|
|
29
|
+
private currentSize;
|
|
30
|
+
constructor(maxSizeMB?: number);
|
|
31
|
+
get(key: string): Buffer | undefined;
|
|
32
|
+
set(key: string, data: Buffer): void;
|
|
33
|
+
private evictLRU;
|
|
34
|
+
clear(): void;
|
|
35
|
+
getStats(): {
|
|
36
|
+
entries: number;
|
|
37
|
+
sizeMB: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare class PerformanceMetrics {
|
|
41
|
+
private metrics;
|
|
42
|
+
record(operation: string, duration: number): void;
|
|
43
|
+
getStats(operation: string): {
|
|
44
|
+
avg: number;
|
|
45
|
+
min: number;
|
|
46
|
+
max: number;
|
|
47
|
+
count: number;
|
|
48
|
+
} | undefined;
|
|
49
|
+
getAllStats(): Record<string, {
|
|
50
|
+
avg: number;
|
|
51
|
+
min: number;
|
|
52
|
+
max: number;
|
|
53
|
+
count: number;
|
|
54
|
+
}>;
|
|
55
|
+
reset(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const globalMetrics: PerformanceMetrics;
|
|
58
|
+
export declare const globalCache: MemoryMappedCache;
|
|
59
|
+
export { getSystemResources, MAX_CONCURRENCY };
|
|
60
|
+
//# sourceMappingURL=parallel-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../../../src/core/tools/parallel-executor.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,eAAe,QAAiC,CAAC;AASvD,UAAU,eAAe;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACtB;AACD,iBAAS,kBAAkB,IAAI,eAAe,CAO7C;AAwED,wBAAsB,eAAe,CAAC,CAAC,EAAE,CAAC,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAClD,OAAO,GAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACb,GACJ,OAAO,CAAC,CAAC,EAAE,CAAC,CAuBd;AACD,qBAAa,cAAc,CAAC,CAAC,EAAE,CAAC;IAM9B,OAAO,CAAC,SAAS;IALlB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,YACS,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EAC/C,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,EAG1D;IACK,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAqB7B;YACa,YAAY;CAqB1B;AACD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA0D;IACvE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,YAAY,SAAS,GAAE,MAAY,EAElC;IACD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOnC;IACD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQnC;IACD,OAAO,CAAC,QAAQ;IAehB,KAAK,IAAI,IAAI,CAGZ;IACD,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAK9C;CACD;AACD,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,OAAO,CAA+B;IAC9C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKhD;IACD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAUhG;IACD,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAOtF;IACD,KAAK,IAAI,IAAI,CAEZ;CACD;AACD,eAAO,MAAM,aAAa,oBAA2B,CAAC;AACtD,eAAO,MAAM,WAAW,mBAA6B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import { cpus, freemem, totalmem } from \"os\";\n\nconst MAX_CONCURRENCY = Math.max(4, cpus().length * 2);\ninterface Task<T = any> {\n\tid: string;\n\tfn: () => Promise<T> | T;\n\tresolve: (value: T) => void;\n\treject: (error: Error) => void;\n\tpriority: number;\n\ttimestamp: number;\n}\ninterface SystemResources {\n\tcpus: number;\n\ttotalMemory: number;\n\tfreeMemory: number;\n\tgpuAvailable: boolean;\n}\nfunction getSystemResources(): SystemResources {\n\treturn {\n\t\tcpus: cpus().length,\n\t\ttotalMemory: totalmem(),\n\t\tfreeMemory: freemem(),\n\t\tgpuAvailable: process.env.CUDA_VISIBLE_DEVICES !== undefined,\n\t};\n}\nclass PriorityTaskQueue<T> {\n\tprivate queues: Map<number, Task<T>[]> = new Map();\n\tprivate taskMap: Map<string, Task<T>> = new Map();\n\tprivate priorities: number[] = [];\n\tenqueue(task: Task<T>): void {\n\t\tconst { priority } = task;\n\t\tif (!this.queues.has(priority)) {\n\t\t\tthis.queues.set(priority, []);\n\t\t\tthis.priorities = Array.from(this.queues.keys()).sort((a, b) => b - a);\n\t\t}\n\t\tthis.queues.get(priority)!.push(task);\n\t\tthis.taskMap.set(task.id, task);\n\t}\n\tdequeue(): Task<T> | undefined {\n\t\tfor (const priority of this.priorities) {\n\t\t\tconst queue = this.queues.get(priority);\n\t\t\tif (queue && queue.length > 0) {\n\t\t\t\tconst task = queue.shift()!;\n\t\t\t\tthis.taskMap.delete(task.id);\n\t\t\t\treturn task;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\tget size(): number {\n\t\treturn this.taskMap.size;\n\t}\n\tget isEmpty(): boolean {\n\t\treturn this.taskMap.size === 0;\n\t}\n}\nclass AsyncTaskExecutor {\n\tprivate queue = new PriorityTaskQueue<any>();\n\tprivate running = 0;\n\tprivate maxConcurrency: number;\n\tconstructor(maxConcurrency: number = MAX_CONCURRENCY) {\n\t\tthis.maxConcurrency = maxConcurrency;\n\t}\n\texecute<T>(fn: () => Promise<T> | T, priority: number = 5): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst task: Task<T> = {\n\t\t\t\tid: Math.random().toString(36).substring(2),\n\t\t\t\tfn,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tpriority,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tthis.queue.enqueue(task);\n\t\t\tthis.processQueue();\n\t\t});\n\t}\n\tprivate async processQueue(): Promise<void> {\n\t\tif (this.running >= this.maxConcurrency || this.queue.isEmpty) {\n\t\t\treturn;\n\t\t}\n\t\tconst task = this.queue.dequeue();\n\t\tif (!task) return;\n\t\tthis.running++;\n\t\ttry {\n\t\t\tconst result = await task.fn();\n\t\t\ttask.resolve(result);\n\t\t} catch (error) {\n\t\t\ttask.reject(error instanceof Error ? error : new Error(String(error)));\n\t\t} finally {\n\t\t\tthis.running--;\n\t\t\tsetImmediate(() => this.processQueue());\n\t\t}\n\t}\n}\nconst globalExecutor = new AsyncTaskExecutor();\nexport async function parallelExecute<T, R>(\n\titems: T[],\n\tmapper: (item: T, index: number) => Promise<R> | R,\n\toptions: {\n\t\tconcurrency?: number;\n\t\tpriority?: number;\n\t} = {},\n): Promise<R[]> {\n\tconst { concurrency = MAX_CONCURRENCY, priority = 5 } = options;\n\tif (items.length === 0) return [];\n\tif (items.length === 1) return [await mapper(items[0], 0)];\n\tif (items.length <= 4) {\n\t\treturn Promise.all(items.map((item, index) => mapper(item, index)));\n\t}\n\tconst results: (R | undefined)[] = new Array(items.length);\n\tconst iterator = items.entries();\n\tasync function worker(): Promise<void> {\n\t\tfor (const [index, item] of iterator) {\n\t\t\ttry {\n\t\t\t\tresults[index] = await mapper(item, index);\n\t\t\t} catch (error) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tconst workers = Array(Math.min(concurrency, items.length))\n\t\t.fill(null)\n\t\t.map(() => worker());\n\tawait Promise.all(workers);\n\treturn results as R[];\n}\nexport class BatchProcessor<T, R> {\n\tprivate queue: T[] = [];\n\tprivate processing = false;\n\tprivate results: Map<string, R> = new Map();\n\tprivate readonly concurrency: number;\n\tconstructor(\n\t\tprivate processor: (items: T[]) => Promise<R[]>,\n\t\toptions: { concurrency?: number; batchSize?: number } = {},\n\t) {\n\t\tthis.concurrency = options.concurrency || MAX_CONCURRENCY;\n\t}\n\tasync add(item: T): Promise<R> {\n\t\tconst id = Math.random().toString(36).substring(2);\n\t\tthis.queue.push(item);\n\t\tif (!this.processing) {\n\t\t\tthis.processing = true;\n\t\t\tsetImmediate(() => this.processBatch());\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst check = () => {\n\t\t\t\tif (this.results.has(id)) {\n\t\t\t\t\tconst result = this.results.get(id)!;\n\t\t\t\t\tthis.results.delete(id);\n\t\t\t\t\tresolve(result);\n\t\t\t\t} else if (this.queue.length === 0 && !this.processing) {\n\t\t\t\t\treject(new Error(\"Processing failed\"));\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(check, 10);\n\t\t\t\t}\n\t\t\t};\n\t\t\tcheck();\n\t\t});\n\t}\n\tprivate async processBatch(): Promise<void> {\n\t\tif (this.queue.length === 0) {\n\t\t\tthis.processing = false;\n\t\t\treturn;\n\t\t}\n\t\tconst batch = this.queue.splice(0, this.concurrency);\n\t\ttry {\n\t\t\tconst results = await this.processor(batch);\n\t\t\tresults.forEach((result, index) => {\n\t\t\t\tconst id = Math.random().toString(36).substring(2);\n\t\t\t\tthis.results.set(id, result);\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Batch processing error:\", error);\n\t\t}\n\t\tif (this.queue.length > 0) {\n\t\t\tsetImmediate(() => this.processBatch());\n\t\t} else {\n\t\t\tthis.processing = false;\n\t\t}\n\t}\n}\nexport class MemoryMappedCache {\n\tprivate cache = new Map<string, { data: Buffer; timestamp: number }>();\n\tprivate maxSize: number;\n\tprivate currentSize = 0;\n\tconstructor(maxSizeMB: number = 512) {\n\t\tthis.maxSize = maxSizeMB * 1024 * 1024;\n\t}\n\tget(key: string): Buffer | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tentry.timestamp = Date.now();\n\t\t\treturn entry.data;\n\t\t}\n\t\treturn undefined;\n\t}\n\tset(key: string, data: Buffer): void {\n\t\tconst size = data.length;\n\t\tif (size > this.maxSize / 4) return;\n\t\twhile (this.currentSize + size > this.maxSize && this.cache.size > 0) {\n\t\t\tthis.evictLRU();\n\t\t}\n\t\tthis.cache.set(key, { data, timestamp: Date.now() });\n\t\tthis.currentSize += size;\n\t}\n\tprivate evictLRU(): void {\n\t\tlet oldest: { key: string; timestamp: number } | null = null;\n\t\tfor (const [key, entry] of this.cache) {\n\t\t\tif (!oldest || entry.timestamp < oldest.timestamp) {\n\t\t\t\toldest = { key, timestamp: entry.timestamp };\n\t\t\t}\n\t\t}\n\t\tif (oldest) {\n\t\t\tconst entry = this.cache.get(oldest.key);\n\t\t\tif (entry) {\n\t\t\t\tthis.currentSize -= entry.data.length;\n\t\t\t\tthis.cache.delete(oldest.key);\n\t\t\t}\n\t\t}\n\t}\n\tclear(): void {\n\t\tthis.cache.clear();\n\t\tthis.currentSize = 0;\n\t}\n\tgetStats(): { entries: number; sizeMB: number } {\n\t\treturn {\n\t\t\tentries: this.cache.size,\n\t\t\tsizeMB: Math.round((this.currentSize / 1024 / 1024) * 100) / 100,\n\t\t};\n\t}\n}\nexport class PerformanceMetrics {\n\tprivate metrics = new Map<string, number[]>();\n\trecord(operation: string, duration: number): void {\n\t\tif (!this.metrics.has(operation)) {\n\t\t\tthis.metrics.set(operation, []);\n\t\t}\n\t\tthis.metrics.get(operation)!.push(duration);\n\t}\n\tgetStats(operation: string): { avg: number; min: number; max: number; count: number } | undefined {\n\t\tconst times = this.metrics.get(operation);\n\t\tif (!times || times.length === 0) return undefined;\n\t\tconst sum = times.reduce((a, b) => a + b, 0);\n\t\treturn {\n\t\t\tavg: Math.round(sum / times.length),\n\t\t\tmin: Math.min(...times),\n\t\t\tmax: Math.max(...times),\n\t\t\tcount: times.length,\n\t\t};\n\t}\n\tgetAllStats(): Record<string, { avg: number; min: number; max: number; count: number }> {\n\t\tconst stats: Record<string, { avg: number; min: number; max: number; count: number }> = {};\n\t\tfor (const [op] of this.metrics) {\n\t\t\tconst s = this.getStats(op);\n\t\t\tif (s) stats[op] = s;\n\t\t}\n\t\treturn stats;\n\t}\n\treset(): void {\n\t\tthis.metrics.clear();\n\t}\n}\nexport const globalMetrics = new PerformanceMetrics();\nexport const globalCache = new MemoryMappedCache(512);\nexport { getSystemResources, MAX_CONCURRENCY };\n"]}
|