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
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;AACrB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,0BAA0B,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,CAChB,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjC,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,2BAA2B,MAAM,MAAM,CAAC,CAAC;IACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,CAChB,CAAC,CAAC;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,mBAAmB,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC7C,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;AAChD,IAAI,CAAC;IACJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,EAAE,CAAC,cAAc,CAChB,WAAW,EACX,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CACxG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC","sourcesContent":["#!/usr/bin/env node\nprocess.title = \"pi\";\nprocess.on(\"uncaughtException\", (error) => {\n\tconsole.error(\"\\n[CRASH] Uncaught Exception:\");\n\tconsole.error(error);\n\tfs.appendFileSync(\"crash.log\", `[${new Date().toISOString()}] Uncaught Exception:\\n${error.stack}\\n\\n`);\n\tprocess.exit(1);\n});\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n\tconsole.error(\"\\n[CRASH] Unhandled Rejection at:\", promise);\n\tconsole.error(\"Reason:\", reason);\n\tfs.appendFileSync(\"crash.log\", `[${new Date().toISOString()}] Unhandled Rejection:\\n${reason}\\n\\n`);\n\tprocess.exit(1);\n});\n\nimport { setBedrockProviderModule } from \"@mariozechner/pi-ai\";\nimport { bedrockProviderModule } from \"@mariozechner/pi-ai/bedrock-provider\";\nimport fs from \"fs\";\nimport { EnvHttpProxyAgent, setGlobalDispatcher } from \"undici\";\nimport { main } from \"./main.js\";\n\nsetGlobalDispatcher(new EnvHttpProxyAgent());\nsetBedrockProviderModule(bedrockProviderModule);\ntry {\n\tmain(process.argv.slice(2));\n} catch (error) {\n\tconsole.error(\"\\n[CRASH] Main function error:\");\n\tconsole.error(error);\n\tfs.appendFileSync(\n\t\t\"crash.log\",\n\t\t`[${new Date().toISOString()}] Main Error:\\n${error instanceof Error ? error.stack : String(error)}\\n\\n`,\n\t);\n\tprocess.exit(1);\n}\n"]}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const isBunBinary: boolean;
|
|
2
|
+
export declare const isBunRuntime: boolean;
|
|
3
|
+
export type InstallMethod = "bun-binary" | "npm" | "pnpm" | "yarn" | "bun" | "unknown";
|
|
4
|
+
export declare function detectInstallMethod(): InstallMethod;
|
|
5
|
+
export declare function getUpdateInstruction(packageName: string): string;
|
|
6
|
+
export declare function getPackageDir(): string;
|
|
7
|
+
export declare function getThemesDir(): string;
|
|
8
|
+
export declare function getExportTemplateDir(): string;
|
|
9
|
+
export declare function getPackageJsonPath(): string;
|
|
10
|
+
export declare function getReadmePath(): string;
|
|
11
|
+
export declare function getDocsPath(): string;
|
|
12
|
+
export declare function getExamplesPath(): string;
|
|
13
|
+
export declare function getChangelogPath(): string;
|
|
14
|
+
export declare const APP_NAME: string;
|
|
15
|
+
export declare const CONFIG_DIR_NAME: string;
|
|
16
|
+
export declare const VERSION: string;
|
|
17
|
+
export declare const ENV_AGENT_DIR: string;
|
|
18
|
+
export declare function getShareViewerUrl(gistId: string): string;
|
|
19
|
+
export declare function getAgentDir(): string;
|
|
20
|
+
export declare function getCustomThemesDir(): string;
|
|
21
|
+
export declare function getModelsPath(): string;
|
|
22
|
+
export declare function getAuthPath(): string;
|
|
23
|
+
export declare function getSettingsPath(): string;
|
|
24
|
+
export declare function getToolsDir(): string;
|
|
25
|
+
export declare function getBinDir(): string;
|
|
26
|
+
export declare function getPromptsDir(): string;
|
|
27
|
+
export declare function getSessionsDir(): string;
|
|
28
|
+
export declare function getDebugLogPath(): string;
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,SACqF,CAAC;AAE9G,eAAO,MAAM,YAAY,SAAyB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAEvF,wBAAgB,mBAAmB,IAAI,aAAa,CAqBnD;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgBhE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAmBtC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAID,eAAO,MAAM,QAAQ,EAAE,MAAmC,CAAC;AAC3D,eAAO,MAAM,eAAe,EAAE,MAAyC,CAAC;AACxE,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC;AAE3C,eAAO,MAAM,aAAa,QAA+C,CAAC;AAI1E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAQpC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\nexport const isBunRuntime = !!process.versions.bun;\n\nexport type InstallMethod = \"bun-binary\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase();\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\") || resolvedPath.includes(\"\\\\pnpm\\\\\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\") || resolvedPath.includes(\"\\\\yarn\\\\\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\") || resolvedPath.includes(\"\\\\npm\\\\\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\t\treturn `Download from: https://github.com/badlogic/pi-mono/releases/latest`;\n\t\tcase \"pnpm\":\n\t\t\treturn `Run: pnpm install -g ${packageName}`;\n\t\tcase \"yarn\":\n\t\t\treturn `Run: yarn global add ${packageName}`;\n\t\tcase \"bun\":\n\t\t\treturn `Run: bun install -g ${packageName}`;\n\t\tcase \"npm\":\n\t\t\treturn `Run: npm install -g ${packageName}`;\n\t\tdefault:\n\t\t\treturn `Run: npm install -g ${packageName}`;\n\t}\n}\n\nexport function getPackageDir(): string {\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\treturn dirname(process.execPath);\n\t}\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n}\n\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(dirname(process.execPath), \"theme\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(dirname(process.execPath), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\nexport function getReadmePath(): string {\n\treturn resolve(join(getPackageDir(), \"README.md\"));\n}\n\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\nexport function getExamplesPath(): string {\n\treturn resolve(join(getPackageDir(), \"examples\"));\n}\n\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\"));\n\nexport const APP_NAME: string = pkg.piConfig?.name || \"pi\";\nexport const CONFIG_DIR_NAME: string = pkg.piConfig?.configDir || \".pi\";\nexport const VERSION: string = pkg.version;\n\nexport const ENV_AGENT_DIR = `${APP_NAME.toUpperCase()}_CODING_AGENT_DIR`;\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME, \"agent\");\n}\n\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\nexport function getModelsPath(): string {\n\treturn join(getAgentDir(), \"models.json\");\n}\n\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\nexport function getSettingsPath(): string {\n\treturn join(getAgentDir(), \"settings.json\");\n}\n\nexport function getToolsDir(): string {\n\treturn join(getAgentDir(), \"tools\");\n}\n\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\nexport function getPromptsDir(): string {\n\treturn join(getAgentDir(), \"prompts\");\n}\n\nexport function getSessionsDir(): string {\n\treturn join(getAgentDir(), \"sessions\");\n}\n\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { dirname, join, resolve } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
export const isBunBinary = import.meta.url.includes("$bunfs") || import.meta.url.includes("~BUN") || import.meta.url.includes("%7EBUN");
|
|
8
|
+
export const isBunRuntime = !!process.versions.bun;
|
|
9
|
+
export function detectInstallMethod() {
|
|
10
|
+
if (isBunBinary) {
|
|
11
|
+
return "bun-binary";
|
|
12
|
+
}
|
|
13
|
+
const resolvedPath = `${__dirname}\0${process.execPath || ""}`.toLowerCase();
|
|
14
|
+
if (resolvedPath.includes("/pnpm/") || resolvedPath.includes("/.pnpm/") || resolvedPath.includes("\\pnpm\\")) {
|
|
15
|
+
return "pnpm";
|
|
16
|
+
}
|
|
17
|
+
if (resolvedPath.includes("/yarn/") || resolvedPath.includes("/.yarn/") || resolvedPath.includes("\\yarn\\")) {
|
|
18
|
+
return "yarn";
|
|
19
|
+
}
|
|
20
|
+
if (isBunRuntime) {
|
|
21
|
+
return "bun";
|
|
22
|
+
}
|
|
23
|
+
if (resolvedPath.includes("/npm/") || resolvedPath.includes("/node_modules/") || resolvedPath.includes("\\npm\\")) {
|
|
24
|
+
return "npm";
|
|
25
|
+
}
|
|
26
|
+
return "unknown";
|
|
27
|
+
}
|
|
28
|
+
export function getUpdateInstruction(packageName) {
|
|
29
|
+
const method = detectInstallMethod();
|
|
30
|
+
switch (method) {
|
|
31
|
+
case "bun-binary":
|
|
32
|
+
return `Download from: https://github.com/badlogic/pi-mono/releases/latest`;
|
|
33
|
+
case "pnpm":
|
|
34
|
+
return `Run: pnpm install -g ${packageName}`;
|
|
35
|
+
case "yarn":
|
|
36
|
+
return `Run: yarn global add ${packageName}`;
|
|
37
|
+
case "bun":
|
|
38
|
+
return `Run: bun install -g ${packageName}`;
|
|
39
|
+
case "npm":
|
|
40
|
+
return `Run: npm install -g ${packageName}`;
|
|
41
|
+
default:
|
|
42
|
+
return `Run: npm install -g ${packageName}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function getPackageDir() {
|
|
46
|
+
const envDir = process.env.PI_PACKAGE_DIR;
|
|
47
|
+
if (envDir) {
|
|
48
|
+
if (envDir === "~")
|
|
49
|
+
return homedir();
|
|
50
|
+
if (envDir.startsWith("~/"))
|
|
51
|
+
return homedir() + envDir.slice(1);
|
|
52
|
+
return envDir;
|
|
53
|
+
}
|
|
54
|
+
if (isBunBinary) {
|
|
55
|
+
return dirname(process.execPath);
|
|
56
|
+
}
|
|
57
|
+
let dir = __dirname;
|
|
58
|
+
while (dir !== dirname(dir)) {
|
|
59
|
+
if (existsSync(join(dir, "package.json"))) {
|
|
60
|
+
return dir;
|
|
61
|
+
}
|
|
62
|
+
dir = dirname(dir);
|
|
63
|
+
}
|
|
64
|
+
return __dirname;
|
|
65
|
+
}
|
|
66
|
+
export function getThemesDir() {
|
|
67
|
+
if (isBunBinary) {
|
|
68
|
+
return join(dirname(process.execPath), "theme");
|
|
69
|
+
}
|
|
70
|
+
const packageDir = getPackageDir();
|
|
71
|
+
const srcOrDist = existsSync(join(packageDir, "src")) ? "src" : "dist";
|
|
72
|
+
return join(packageDir, srcOrDist, "modes", "interactive", "theme");
|
|
73
|
+
}
|
|
74
|
+
export function getExportTemplateDir() {
|
|
75
|
+
if (isBunBinary) {
|
|
76
|
+
return join(dirname(process.execPath), "export-html");
|
|
77
|
+
}
|
|
78
|
+
const packageDir = getPackageDir();
|
|
79
|
+
const srcOrDist = existsSync(join(packageDir, "src")) ? "src" : "dist";
|
|
80
|
+
return join(packageDir, srcOrDist, "core", "export-html");
|
|
81
|
+
}
|
|
82
|
+
export function getPackageJsonPath() {
|
|
83
|
+
return join(getPackageDir(), "package.json");
|
|
84
|
+
}
|
|
85
|
+
export function getReadmePath() {
|
|
86
|
+
return resolve(join(getPackageDir(), "README.md"));
|
|
87
|
+
}
|
|
88
|
+
export function getDocsPath() {
|
|
89
|
+
return resolve(join(getPackageDir(), "docs"));
|
|
90
|
+
}
|
|
91
|
+
export function getExamplesPath() {
|
|
92
|
+
return resolve(join(getPackageDir(), "examples"));
|
|
93
|
+
}
|
|
94
|
+
export function getChangelogPath() {
|
|
95
|
+
return resolve(join(getPackageDir(), "CHANGELOG.md"));
|
|
96
|
+
}
|
|
97
|
+
const pkg = JSON.parse(readFileSync(getPackageJsonPath(), "utf-8"));
|
|
98
|
+
export const APP_NAME = pkg.piConfig?.name || "pi";
|
|
99
|
+
export const CONFIG_DIR_NAME = pkg.piConfig?.configDir || ".pi";
|
|
100
|
+
export const VERSION = pkg.version;
|
|
101
|
+
export const ENV_AGENT_DIR = `${APP_NAME.toUpperCase()}_CODING_AGENT_DIR`;
|
|
102
|
+
const DEFAULT_SHARE_VIEWER_URL = "https://pi.dev/session/";
|
|
103
|
+
export function getShareViewerUrl(gistId) {
|
|
104
|
+
const baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;
|
|
105
|
+
return `${baseUrl}#${gistId}`;
|
|
106
|
+
}
|
|
107
|
+
export function getAgentDir() {
|
|
108
|
+
const envDir = process.env[ENV_AGENT_DIR];
|
|
109
|
+
if (envDir) {
|
|
110
|
+
if (envDir === "~")
|
|
111
|
+
return homedir();
|
|
112
|
+
if (envDir.startsWith("~/"))
|
|
113
|
+
return homedir() + envDir.slice(1);
|
|
114
|
+
return envDir;
|
|
115
|
+
}
|
|
116
|
+
return join(homedir(), CONFIG_DIR_NAME, "agent");
|
|
117
|
+
}
|
|
118
|
+
export function getCustomThemesDir() {
|
|
119
|
+
return join(getAgentDir(), "themes");
|
|
120
|
+
}
|
|
121
|
+
export function getModelsPath() {
|
|
122
|
+
return join(getAgentDir(), "models.json");
|
|
123
|
+
}
|
|
124
|
+
export function getAuthPath() {
|
|
125
|
+
return join(getAgentDir(), "auth.json");
|
|
126
|
+
}
|
|
127
|
+
export function getSettingsPath() {
|
|
128
|
+
return join(getAgentDir(), "settings.json");
|
|
129
|
+
}
|
|
130
|
+
export function getToolsDir() {
|
|
131
|
+
return join(getAgentDir(), "tools");
|
|
132
|
+
}
|
|
133
|
+
export function getBinDir() {
|
|
134
|
+
return join(getAgentDir(), "bin");
|
|
135
|
+
}
|
|
136
|
+
export function getPromptsDir() {
|
|
137
|
+
return join(getAgentDir(), "prompts");
|
|
138
|
+
}
|
|
139
|
+
export function getSessionsDir() {
|
|
140
|
+
return join(getAgentDir(), "sessions");
|
|
141
|
+
}
|
|
142
|
+
export function getDebugLogPath() {
|
|
143
|
+
return join(getAgentDir(), `${APP_NAME}-debug.log`);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const isBunBinary =\n\timport.meta.url.includes(\"$bunfs\") || import.meta.url.includes(\"~BUN\") || import.meta.url.includes(\"%7EBUN\");\n\nexport const isBunRuntime = !!process.versions.bun;\n\nexport type InstallMethod = \"bun-binary\" | \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\nexport function detectInstallMethod(): InstallMethod {\n\tif (isBunBinary) {\n\t\treturn \"bun-binary\";\n\t}\n\n\tconst resolvedPath = `${__dirname}\\0${process.execPath || \"\"}`.toLowerCase();\n\n\tif (resolvedPath.includes(\"/pnpm/\") || resolvedPath.includes(\"/.pnpm/\") || resolvedPath.includes(\"\\\\pnpm\\\\\")) {\n\t\treturn \"pnpm\";\n\t}\n\tif (resolvedPath.includes(\"/yarn/\") || resolvedPath.includes(\"/.yarn/\") || resolvedPath.includes(\"\\\\yarn\\\\\")) {\n\t\treturn \"yarn\";\n\t}\n\tif (isBunRuntime) {\n\t\treturn \"bun\";\n\t}\n\tif (resolvedPath.includes(\"/npm/\") || resolvedPath.includes(\"/node_modules/\") || resolvedPath.includes(\"\\\\npm\\\\\")) {\n\t\treturn \"npm\";\n\t}\n\n\treturn \"unknown\";\n}\n\nexport function getUpdateInstruction(packageName: string): string {\n\tconst method = detectInstallMethod();\n\tswitch (method) {\n\t\tcase \"bun-binary\":\n\t\t\treturn `Download from: https://github.com/badlogic/pi-mono/releases/latest`;\n\t\tcase \"pnpm\":\n\t\t\treturn `Run: pnpm install -g ${packageName}`;\n\t\tcase \"yarn\":\n\t\t\treturn `Run: yarn global add ${packageName}`;\n\t\tcase \"bun\":\n\t\t\treturn `Run: bun install -g ${packageName}`;\n\t\tcase \"npm\":\n\t\t\treturn `Run: npm install -g ${packageName}`;\n\t\tdefault:\n\t\t\treturn `Run: npm install -g ${packageName}`;\n\t}\n}\n\nexport function getPackageDir(): string {\n\tconst envDir = process.env.PI_PACKAGE_DIR;\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\n\tif (isBunBinary) {\n\t\treturn dirname(process.execPath);\n\t}\n\tlet dir = __dirname;\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n}\n\nexport function getThemesDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(dirname(process.execPath), \"theme\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"modes\", \"interactive\", \"theme\");\n}\n\nexport function getExportTemplateDir(): string {\n\tif (isBunBinary) {\n\t\treturn join(dirname(process.execPath), \"export-html\");\n\t}\n\tconst packageDir = getPackageDir();\n\tconst srcOrDist = existsSync(join(packageDir, \"src\")) ? \"src\" : \"dist\";\n\treturn join(packageDir, srcOrDist, \"core\", \"export-html\");\n}\n\nexport function getPackageJsonPath(): string {\n\treturn join(getPackageDir(), \"package.json\");\n}\n\nexport function getReadmePath(): string {\n\treturn resolve(join(getPackageDir(), \"README.md\"));\n}\n\nexport function getDocsPath(): string {\n\treturn resolve(join(getPackageDir(), \"docs\"));\n}\n\nexport function getExamplesPath(): string {\n\treturn resolve(join(getPackageDir(), \"examples\"));\n}\n\nexport function getChangelogPath(): string {\n\treturn resolve(join(getPackageDir(), \"CHANGELOG.md\"));\n}\n\nconst pkg = JSON.parse(readFileSync(getPackageJsonPath(), \"utf-8\"));\n\nexport const APP_NAME: string = pkg.piConfig?.name || \"pi\";\nexport const CONFIG_DIR_NAME: string = pkg.piConfig?.configDir || \".pi\";\nexport const VERSION: string = pkg.version;\n\nexport const ENV_AGENT_DIR = `${APP_NAME.toUpperCase()}_CODING_AGENT_DIR`;\n\nconst DEFAULT_SHARE_VIEWER_URL = \"https://pi.dev/session/\";\n\nexport function getShareViewerUrl(gistId: string): string {\n\tconst baseUrl = process.env.PI_SHARE_VIEWER_URL || DEFAULT_SHARE_VIEWER_URL;\n\treturn `${baseUrl}#${gistId}`;\n}\n\nexport function getAgentDir(): string {\n\tconst envDir = process.env[ENV_AGENT_DIR];\n\tif (envDir) {\n\t\tif (envDir === \"~\") return homedir();\n\t\tif (envDir.startsWith(\"~/\")) return homedir() + envDir.slice(1);\n\t\treturn envDir;\n\t}\n\treturn join(homedir(), CONFIG_DIR_NAME, \"agent\");\n}\n\nexport function getCustomThemesDir(): string {\n\treturn join(getAgentDir(), \"themes\");\n}\n\nexport function getModelsPath(): string {\n\treturn join(getAgentDir(), \"models.json\");\n}\n\nexport function getAuthPath(): string {\n\treturn join(getAgentDir(), \"auth.json\");\n}\n\nexport function getSettingsPath(): string {\n\treturn join(getAgentDir(), \"settings.json\");\n}\n\nexport function getToolsDir(): string {\n\treturn join(getAgentDir(), \"tools\");\n}\n\nexport function getBinDir(): string {\n\treturn join(getAgentDir(), \"bin\");\n}\n\nexport function getPromptsDir(): string {\n\treturn join(getAgentDir(), \"prompts\");\n}\n\nexport function getSessionsDir(): string {\n\treturn join(getAgentDir(), \"sessions\");\n}\n\nexport function getDebugLogPath(): string {\n\treturn join(getAgentDir(), `${APP_NAME}-debug.log`);\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AssistantMessage, Context, Model } from "@mariozechner/pi-ai";
|
|
2
|
+
interface BatchRequestOptions {
|
|
3
|
+
model: Model<any>;
|
|
4
|
+
context: Context;
|
|
5
|
+
options?: any;
|
|
6
|
+
}
|
|
7
|
+
interface RateLimiterConfig {
|
|
8
|
+
maxRequestsPerSecond?: number;
|
|
9
|
+
maxRequestsPerMinute?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class AcceleratedAPIClient {
|
|
12
|
+
private executor;
|
|
13
|
+
private rateLimiter;
|
|
14
|
+
constructor(options?: {
|
|
15
|
+
concurrency?: number;
|
|
16
|
+
rateLimiter?: RateLimiterConfig;
|
|
17
|
+
});
|
|
18
|
+
singleRequest(model: Model<any>, context: Context, options?: any): Promise<AssistantMessage>;
|
|
19
|
+
singleStreamRequest(model: Model<any>, context: Context, options?: any): AsyncGenerator<any, void, void>;
|
|
20
|
+
batchRequest(requests: BatchRequestOptions[], options?: {
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}): Promise<AssistantMessage[]>;
|
|
23
|
+
streamBatch(requests: BatchRequestOptions[], options?: {
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
}): AsyncGenerator<{
|
|
26
|
+
index: number;
|
|
27
|
+
result: AssistantMessage;
|
|
28
|
+
}, void, void>;
|
|
29
|
+
throttledBatch(requests: BatchRequestOptions[], requestsPerSecond?: number): Promise<AssistantMessage[]>;
|
|
30
|
+
getStats(): {
|
|
31
|
+
concurrency: import("./api-concurrency.js").ConcurrencyStats;
|
|
32
|
+
rateLimiter: {
|
|
33
|
+
requestsThisSecond: number;
|
|
34
|
+
requestsThisMinute: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
setConcurrency(concurrency: number): void;
|
|
38
|
+
clear(): void;
|
|
39
|
+
}
|
|
40
|
+
export declare const globalAcceleratedClient: AcceleratedAPIClient;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=accelerated-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accelerated-client.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjF,UAAU,mBAAmB;IAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,GAAG,CAAC;CACd;AACD,UAAU,iBAAiB;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAkCD,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,WAAW,CAAc;IACjC,YAAY,OAAO,CAAC,EAAE;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,iBAAiB,CAAC;KAChC,EAGA;IACK,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKjG;IACM,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAK9G;IACK,YAAY,CACjB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK7B;IACM,WAAW,CACjB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChC,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAKzE;IACK,cAAc,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,iBAAiB,SAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAezG;IACD,QAAQ;;;;;;MAKP;IACD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IACD,KAAK,IAAI,IAAI,CAEZ;CACD;AACD,eAAO,MAAM,uBAAuB,sBAA6B,CAAC","sourcesContent":["import type { Api, AssistantMessage, Context, Model } from \"@mariozechner/pi-ai\";\nimport { APIParallelExecutor } from \"./api-concurrency.js\";\nimport { accelerateStream } from \"./response-accelerator.js\";\n\ninterface BatchRequestOptions {\n\tmodel: Model<any>;\n\tcontext: Context;\n\toptions?: any;\n}\ninterface RateLimiterConfig {\n\tmaxRequestsPerSecond?: number;\n\tmaxRequestsPerMinute?: number;\n}\nclass RateLimiter {\n\tprivate requests: number[] = [];\n\tprivate maxPerSecond: number;\n\tprivate maxPerMinute: number;\n\tconstructor(config: RateLimiterConfig = {}) {\n\t\tthis.maxPerSecond = config.maxRequestsPerSecond ?? 60;\n\t\tthis.maxPerMinute = (config as any).maxRequestsPerMinute ?? 600;\n\t}\n\tasync acquire(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.requests = this.requests.filter((timestamp) => now - timestamp < 60000);\n\t\tif (this.requests.length >= this.maxPerMinute) {\n\t\t\tconst oldestRequest = this.requests[0];\n\t\t\tconst waitTime = 60000 - (now - oldestRequest) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tconst recentRequests = this.requests.filter((timestamp) => now - timestamp < 1000);\n\t\tif (recentRequests.length >= this.maxPerSecond) {\n\t\t\tconst oldestRecent = recentRequests[0];\n\t\t\tconst waitTime = 1000 - (now - oldestRecent) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tthis.requests.push(now);\n\t}\n\tgetStats(): { requestsThisSecond: number; requestsThisMinute: number } {\n\t\tconst now = Date.now();\n\t\tconst requestsThisSecond = this.requests.filter((timestamp) => now - timestamp < 1000).length;\n\t\tconst requestsThisMinute = this.requests.length;\n\t\treturn { requestsThisSecond, requestsThisMinute };\n\t}\n}\nexport class AcceleratedAPIClient {\n\tprivate executor: APIParallelExecutor;\n\tprivate rateLimiter: RateLimiter;\n\tconstructor(options?: {\n\t\tconcurrency?: number;\n\t\trateLimiter?: RateLimiterConfig;\n\t}) {\n\t\tthis.executor = new APIParallelExecutor(options?.concurrency);\n\t\tthis.rateLimiter = new RateLimiter(options?.rateLimiter);\n\t}\n\tasync singleRequest(model: Model<any>, context: Context, options?: any): Promise<AssistantMessage> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\treturn response.result();\n\t}\n\tasync *singleStreamRequest(model: Model<any>, context: Context, options?: any): AsyncGenerator<any, void, void> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\tyield* accelerateStream(response as any, { priority: \"speed\" });\n\t}\n\tasync batchRequest(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): Promise<AssistantMessage[]> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\treturn this.executor.batchRequest(requests, options);\n\t}\n\tasync *streamBatch(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): AsyncGenerator<{ index: number; result: AssistantMessage }, void, void> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\tyield* this.executor.streamBatch(requests, options);\n\t}\n\tasync throttledBatch(requests: BatchRequestOptions[], requestsPerSecond = 10): Promise<AssistantMessage[]> {\n\t\tconst delay = 1000 / requestsPerSecond;\n\t\tconst results: AssistantMessage[] = [];\n\t\tconst concurrency = this.executor.getOptimalConcurrency();\n\t\tfor (let i = 0; i < requests.length; i += concurrency) {\n\t\t\tconst batch = requests.slice(i, i + concurrency);\n\t\t\tawait this.rateLimiter.acquire();\n\t\t\tconst batchPromises = batch.map((req) => this.singleRequest(req.model, req.context, req.options));\n\t\t\tconst batchResults = await Promise.all(batchPromises);\n\t\t\tresults.push(...batchResults);\n\t\t\tif (i + concurrency < requests.length) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\tgetStats() {\n\t\treturn {\n\t\t\tconcurrency: this.executor.getStats(),\n\t\t\trateLimiter: this.rateLimiter.getStats(),\n\t\t};\n\t}\n\tsetConcurrency(concurrency: number): void {\n\t\tthis.executor.setConcurrency(concurrency);\n\t}\n\tclear(): void {\n\t\tthis.executor.clear();\n\t}\n}\nexport const globalAcceleratedClient = new AcceleratedAPIClient();\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { APIParallelExecutor } from "./api-concurrency.js";
|
|
2
|
+
import { accelerateStream } from "./response-accelerator.js";
|
|
3
|
+
class RateLimiter {
|
|
4
|
+
requests = [];
|
|
5
|
+
maxPerSecond;
|
|
6
|
+
maxPerMinute;
|
|
7
|
+
constructor(config = {}) {
|
|
8
|
+
this.maxPerSecond = config.maxRequestsPerSecond ?? 60;
|
|
9
|
+
this.maxPerMinute = config.maxRequestsPerMinute ?? 600;
|
|
10
|
+
}
|
|
11
|
+
async acquire() {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
this.requests = this.requests.filter((timestamp) => now - timestamp < 60000);
|
|
14
|
+
if (this.requests.length >= this.maxPerMinute) {
|
|
15
|
+
const oldestRequest = this.requests[0];
|
|
16
|
+
const waitTime = 60000 - (now - oldestRequest) + 100;
|
|
17
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
18
|
+
return this.acquire();
|
|
19
|
+
}
|
|
20
|
+
const recentRequests = this.requests.filter((timestamp) => now - timestamp < 1000);
|
|
21
|
+
if (recentRequests.length >= this.maxPerSecond) {
|
|
22
|
+
const oldestRecent = recentRequests[0];
|
|
23
|
+
const waitTime = 1000 - (now - oldestRecent) + 100;
|
|
24
|
+
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
25
|
+
return this.acquire();
|
|
26
|
+
}
|
|
27
|
+
this.requests.push(now);
|
|
28
|
+
}
|
|
29
|
+
getStats() {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const requestsThisSecond = this.requests.filter((timestamp) => now - timestamp < 1000).length;
|
|
32
|
+
const requestsThisMinute = this.requests.length;
|
|
33
|
+
return { requestsThisSecond, requestsThisMinute };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class AcceleratedAPIClient {
|
|
37
|
+
executor;
|
|
38
|
+
rateLimiter;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.executor = new APIParallelExecutor(options?.concurrency);
|
|
41
|
+
this.rateLimiter = new RateLimiter(options?.rateLimiter);
|
|
42
|
+
}
|
|
43
|
+
async singleRequest(model, context, options) {
|
|
44
|
+
await this.rateLimiter.acquire();
|
|
45
|
+
const stream = await import("@mariozechner/pi-ai");
|
|
46
|
+
const response = await stream.streamSimple(model, context, options);
|
|
47
|
+
return response.result();
|
|
48
|
+
}
|
|
49
|
+
async *singleStreamRequest(model, context, options) {
|
|
50
|
+
await this.rateLimiter.acquire();
|
|
51
|
+
const stream = await import("@mariozechner/pi-ai");
|
|
52
|
+
const response = await stream.streamSimple(model, context, options);
|
|
53
|
+
yield* accelerateStream(response, { priority: "speed" });
|
|
54
|
+
}
|
|
55
|
+
async batchRequest(requests, options) {
|
|
56
|
+
for (let i = 0; i < requests.length; i++) {
|
|
57
|
+
await this.rateLimiter.acquire();
|
|
58
|
+
}
|
|
59
|
+
return this.executor.batchRequest(requests, options);
|
|
60
|
+
}
|
|
61
|
+
async *streamBatch(requests, options) {
|
|
62
|
+
for (let i = 0; i < requests.length; i++) {
|
|
63
|
+
await this.rateLimiter.acquire();
|
|
64
|
+
}
|
|
65
|
+
yield* this.executor.streamBatch(requests, options);
|
|
66
|
+
}
|
|
67
|
+
async throttledBatch(requests, requestsPerSecond = 10) {
|
|
68
|
+
const delay = 1000 / requestsPerSecond;
|
|
69
|
+
const results = [];
|
|
70
|
+
const concurrency = this.executor.getOptimalConcurrency();
|
|
71
|
+
for (let i = 0; i < requests.length; i += concurrency) {
|
|
72
|
+
const batch = requests.slice(i, i + concurrency);
|
|
73
|
+
await this.rateLimiter.acquire();
|
|
74
|
+
const batchPromises = batch.map((req) => this.singleRequest(req.model, req.context, req.options));
|
|
75
|
+
const batchResults = await Promise.all(batchPromises);
|
|
76
|
+
results.push(...batchResults);
|
|
77
|
+
if (i + concurrency < requests.length) {
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
getStats() {
|
|
84
|
+
return {
|
|
85
|
+
concurrency: this.executor.getStats(),
|
|
86
|
+
rateLimiter: this.rateLimiter.getStats(),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
setConcurrency(concurrency) {
|
|
90
|
+
this.executor.setConcurrency(concurrency);
|
|
91
|
+
}
|
|
92
|
+
clear() {
|
|
93
|
+
this.executor.clear();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const globalAcceleratedClient = new AcceleratedAPIClient();
|
|
97
|
+
//# sourceMappingURL=accelerated-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accelerated-client.js","sourceRoot":"","sources":["../../src/core/accelerated-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, AssistantMessage, Context, Model } from \"@mariozechner/pi-ai\";\nimport { APIParallelExecutor } from \"./api-concurrency.js\";\nimport { accelerateStream } from \"./response-accelerator.js\";\n\ninterface BatchRequestOptions {\n\tmodel: Model<any>;\n\tcontext: Context;\n\toptions?: any;\n}\ninterface RateLimiterConfig {\n\tmaxRequestsPerSecond?: number;\n\tmaxRequestsPerMinute?: number;\n}\nclass RateLimiter {\n\tprivate requests: number[] = [];\n\tprivate maxPerSecond: number;\n\tprivate maxPerMinute: number;\n\tconstructor(config: RateLimiterConfig = {}) {\n\t\tthis.maxPerSecond = config.maxRequestsPerSecond ?? 60;\n\t\tthis.maxPerMinute = (config as any).maxRequestsPerMinute ?? 600;\n\t}\n\tasync acquire(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.requests = this.requests.filter((timestamp) => now - timestamp < 60000);\n\t\tif (this.requests.length >= this.maxPerMinute) {\n\t\t\tconst oldestRequest = this.requests[0];\n\t\t\tconst waitTime = 60000 - (now - oldestRequest) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tconst recentRequests = this.requests.filter((timestamp) => now - timestamp < 1000);\n\t\tif (recentRequests.length >= this.maxPerSecond) {\n\t\t\tconst oldestRecent = recentRequests[0];\n\t\t\tconst waitTime = 1000 - (now - oldestRecent) + 100;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, waitTime));\n\t\t\treturn this.acquire();\n\t\t}\n\t\tthis.requests.push(now);\n\t}\n\tgetStats(): { requestsThisSecond: number; requestsThisMinute: number } {\n\t\tconst now = Date.now();\n\t\tconst requestsThisSecond = this.requests.filter((timestamp) => now - timestamp < 1000).length;\n\t\tconst requestsThisMinute = this.requests.length;\n\t\treturn { requestsThisSecond, requestsThisMinute };\n\t}\n}\nexport class AcceleratedAPIClient {\n\tprivate executor: APIParallelExecutor;\n\tprivate rateLimiter: RateLimiter;\n\tconstructor(options?: {\n\t\tconcurrency?: number;\n\t\trateLimiter?: RateLimiterConfig;\n\t}) {\n\t\tthis.executor = new APIParallelExecutor(options?.concurrency);\n\t\tthis.rateLimiter = new RateLimiter(options?.rateLimiter);\n\t}\n\tasync singleRequest(model: Model<any>, context: Context, options?: any): Promise<AssistantMessage> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\treturn response.result();\n\t}\n\tasync *singleStreamRequest(model: Model<any>, context: Context, options?: any): AsyncGenerator<any, void, void> {\n\t\tawait this.rateLimiter.acquire();\n\t\tconst stream = await import(\"@mariozechner/pi-ai\");\n\t\tconst response = await stream.streamSimple(model, context, options);\n\t\tyield* accelerateStream(response as any, { priority: \"speed\" });\n\t}\n\tasync batchRequest(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): Promise<AssistantMessage[]> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\treturn this.executor.batchRequest(requests, options);\n\t}\n\tasync *streamBatch(\n\t\trequests: BatchRequestOptions[],\n\t\toptions?: { signal?: AbortSignal },\n\t): AsyncGenerator<{ index: number; result: AssistantMessage }, void, void> {\n\t\tfor (let i = 0; i < requests.length; i++) {\n\t\t\tawait this.rateLimiter.acquire();\n\t\t}\n\t\tyield* this.executor.streamBatch(requests, options);\n\t}\n\tasync throttledBatch(requests: BatchRequestOptions[], requestsPerSecond = 10): Promise<AssistantMessage[]> {\n\t\tconst delay = 1000 / requestsPerSecond;\n\t\tconst results: AssistantMessage[] = [];\n\t\tconst concurrency = this.executor.getOptimalConcurrency();\n\t\tfor (let i = 0; i < requests.length; i += concurrency) {\n\t\t\tconst batch = requests.slice(i, i + concurrency);\n\t\t\tawait this.rateLimiter.acquire();\n\t\t\tconst batchPromises = batch.map((req) => this.singleRequest(req.model, req.context, req.options));\n\t\t\tconst batchResults = await Promise.all(batchPromises);\n\t\t\tresults.push(...batchResults);\n\t\t\tif (i + concurrency < requests.length) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\tgetStats() {\n\t\treturn {\n\t\t\tconcurrency: this.executor.getStats(),\n\t\t\trateLimiter: this.rateLimiter.getStats(),\n\t\t};\n\t}\n\tsetConcurrency(concurrency: number): void {\n\t\tthis.executor.setConcurrency(concurrency);\n\t}\n\tclear(): void {\n\t\tthis.executor.clear();\n\t}\n}\nexport const globalAcceleratedClient = new AcceleratedAPIClient();\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AssistantMessage, AssistantMessageEvent } from "@mariozechner/pi-ai";
|
|
2
|
+
interface StreamProcessorConfig {
|
|
3
|
+
enableParallelProcessing?: boolean;
|
|
4
|
+
bufferSize?: number;
|
|
5
|
+
workerCount?: number;
|
|
6
|
+
}
|
|
7
|
+
interface ProcessingStats {
|
|
8
|
+
totalChunks: number;
|
|
9
|
+
processedChunks: number;
|
|
10
|
+
bufferedChunks: number;
|
|
11
|
+
processingTime: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class AcceleratedStream {
|
|
14
|
+
private config;
|
|
15
|
+
private stats;
|
|
16
|
+
constructor(config?: StreamProcessorConfig);
|
|
17
|
+
process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void>;
|
|
18
|
+
accelerateResponse(stream: AsyncGenerator<AssistantMessageEvent>, options?: {
|
|
19
|
+
onChunk?: (chunk: AssistantMessageEvent) => void;
|
|
20
|
+
transformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;
|
|
21
|
+
}): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void>;
|
|
22
|
+
private getFinalMessage;
|
|
23
|
+
processMultipleStreams<T>(streams: AsyncIterable<T>[], processor: (chunk: T) => T | Promise<T>): Promise<AsyncGenerator<T>[]>;
|
|
24
|
+
getStats(): ProcessingStats;
|
|
25
|
+
resetStats(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare class StreamMerger {
|
|
28
|
+
private buffer;
|
|
29
|
+
private completedStreams;
|
|
30
|
+
merge<T>(streams: Map<string, AsyncIterable<T>>, options?: {
|
|
31
|
+
bufferSize?: number;
|
|
32
|
+
}): AsyncGenerator<{
|
|
33
|
+
source: string;
|
|
34
|
+
data: T;
|
|
35
|
+
}, void, void>;
|
|
36
|
+
private racePromises;
|
|
37
|
+
}
|
|
38
|
+
export declare const globalAcceleratedStream: AcceleratedStream;
|
|
39
|
+
export declare const globalStreamMerger: StreamMerger;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=accelerated-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accelerated-stream.d.ts","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,UAAU,qBAAqB;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,eAAe;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACvB;AACD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAKX;IACF,YAAY,MAAM,GAAE,qBAA0B,EAM7C;IACM,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBlH;IACM,kBAAkB,CACxB,MAAM,EAAE,cAAc,CAAC,qBAAqB,CAAC,EAC7C,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;QACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,qBAAqB,CAAC;KACzE,GACC,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAgC/D;YACa,eAAe;IAGvB,sBAAsB,CAAC,CAAC,EAC7B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAE9B;IACD,QAAQ,IAAI,eAAe,CAE1B;IACD,UAAU,IAAI,IAAI,CAOjB;CACD;AACD,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,gBAAgB,CAA0B;IAC3C,KAAK,CAAC,CAAC,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAyBzD;YACa,YAAY;CAM1B;AACD,eAAO,MAAM,uBAAuB,mBAA0B,CAAC;AAC/D,eAAO,MAAM,kBAAkB,cAAqB,CAAC","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(stream: AsyncGenerator<AssistantMessageEvent>): Promise<AssistantMessage> {\n\t\treturn {} as AssistantMessage;\n\t}\n\tasync processMultipleStreams<T>(\n\t\tstreams: AsyncIterable<T>[],\n\t\tprocessor: (chunk: T) => T | Promise<T>,\n\t): Promise<AsyncGenerator<T>[]> {\n\t\treturn streams.map((stream) => this.process(stream, processor));\n\t}\n\tgetStats(): ProcessingStats {\n\t\treturn { ...this.stats };\n\t}\n\tresetStats(): void {\n\t\tthis.stats = {\n\t\t\ttotalChunks: 0,\n\t\t\tprocessedChunks: 0,\n\t\t\tbufferedChunks: 0,\n\t\t\tprocessingTime: 0,\n\t\t};\n\t}\n}\nexport class StreamMerger {\n\tprivate buffer: Map<string, any[]> = new Map();\n\tprivate completedStreams: Set<string> = new Set();\n\tasync *merge<T>(\n\t\tstreams: Map<string, AsyncIterable<T>>,\n\t\toptions?: { bufferSize?: number },\n\t): AsyncGenerator<{ source: string; data: T }, void, void> {\n\t\tconst bufferSize = options?.bufferSize ?? 100;\n\t\tconst iterators = new Map<string, AsyncIterator<T>>();\n\t\tfor (const [name, stream] of streams) {\n\t\t\titerators.set(name, stream[Symbol.asyncIterator]());\n\t\t\tthis.buffer.set(name, []);\n\t\t}\n\t\tconst pendingReads = new Map<string, Promise<IteratorResult<T>>>();\n\t\tfor (const [name, iterator] of iterators) {\n\t\t\tpendingReads.set(name, iterator.next());\n\t\t}\n\t\twhile (pendingReads.size > 0) {\n\t\t\tconst [name, result] = await this.racePromises(pendingReads);\n\t\t\tif (result.done) {\n\t\t\t\tthis.completedStreams.add(name);\n\t\t\t\tpendingReads.delete(name);\n\t\t\t\titerators.delete(name);\n\t\t\t} else {\n\t\t\t\tyield { source: name, data: result.value };\n\t\t\t\tconst iterator = iterators.get(name);\n\t\t\t\tif (iterator) {\n\t\t\t\t\tpendingReads.set(name, iterator.next());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async racePromises<T>(promises: Map<string, Promise<T>>): Promise<[string, T]> {\n\t\tconst entries = Array.from(promises.entries());\n\t\tconst racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));\n\t\tconst winner = await Promise.race(racing);\n\t\treturn [winner.name, winner.result];\n\t}\n}\nexport const globalAcceleratedStream = new AcceleratedStream();\nexport const globalStreamMerger = new StreamMerger();\n"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { globalMultiGPUExecutor } from "./multi-gpu-executor.js";
|
|
2
|
+
export class AcceleratedStream {
|
|
3
|
+
config;
|
|
4
|
+
stats = {
|
|
5
|
+
totalChunks: 0,
|
|
6
|
+
processedChunks: 0,
|
|
7
|
+
bufferedChunks: 0,
|
|
8
|
+
processingTime: 0,
|
|
9
|
+
};
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.config = {
|
|
12
|
+
enableParallelProcessing: config.enableParallelProcessing ?? true,
|
|
13
|
+
bufferSize: config.bufferSize ?? 20,
|
|
14
|
+
workerCount: config.workerCount ?? 4,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async *process(source, processor) {
|
|
18
|
+
if (!this.config.enableParallelProcessing) {
|
|
19
|
+
for await (const chunk of source) {
|
|
20
|
+
yield await processor(chunk);
|
|
21
|
+
}
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const buffer = [];
|
|
25
|
+
const startTime = Date.now();
|
|
26
|
+
for await (const chunk of source) {
|
|
27
|
+
this.stats.totalChunks++;
|
|
28
|
+
const processedPromise = globalMultiGPUExecutor.compute(chunk, processor);
|
|
29
|
+
buffer.push(processedPromise);
|
|
30
|
+
if (buffer.length >= this.config.bufferSize) {
|
|
31
|
+
const result = await buffer.shift();
|
|
32
|
+
this.stats.processedChunks++;
|
|
33
|
+
yield result;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
while (buffer.length > 0) {
|
|
37
|
+
const result = await buffer.shift();
|
|
38
|
+
this.stats.processedChunks++;
|
|
39
|
+
yield result;
|
|
40
|
+
}
|
|
41
|
+
this.stats.processingTime += Date.now() - startTime;
|
|
42
|
+
}
|
|
43
|
+
async *accelerateResponse(stream, options) {
|
|
44
|
+
const buffer = [];
|
|
45
|
+
let finalMessage = null;
|
|
46
|
+
const startTime = Date.now();
|
|
47
|
+
for await (const event of stream) {
|
|
48
|
+
this.stats.totalChunks++;
|
|
49
|
+
const processedEvent = options?.transformChunk
|
|
50
|
+
? await globalMultiGPUExecutor.compute(event, options.transformChunk)
|
|
51
|
+
: event;
|
|
52
|
+
options?.onChunk?.(processedEvent);
|
|
53
|
+
buffer.push(processedEvent);
|
|
54
|
+
if (buffer.length >= this.config.bufferSize) {
|
|
55
|
+
const toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));
|
|
56
|
+
for (const e of toYield) {
|
|
57
|
+
this.stats.processedChunks++;
|
|
58
|
+
yield e;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (event.type === "done" || event.type === "error") {
|
|
62
|
+
finalMessage = await this.getFinalMessage(stream);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
for (const event of buffer) {
|
|
67
|
+
this.stats.processedChunks++;
|
|
68
|
+
yield event;
|
|
69
|
+
}
|
|
70
|
+
this.stats.processingTime += Date.now() - startTime;
|
|
71
|
+
if (!finalMessage) {
|
|
72
|
+
throw new Error("Stream ended without final message");
|
|
73
|
+
}
|
|
74
|
+
return finalMessage;
|
|
75
|
+
}
|
|
76
|
+
async getFinalMessage(stream) {
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
async processMultipleStreams(streams, processor) {
|
|
80
|
+
return streams.map((stream) => this.process(stream, processor));
|
|
81
|
+
}
|
|
82
|
+
getStats() {
|
|
83
|
+
return { ...this.stats };
|
|
84
|
+
}
|
|
85
|
+
resetStats() {
|
|
86
|
+
this.stats = {
|
|
87
|
+
totalChunks: 0,
|
|
88
|
+
processedChunks: 0,
|
|
89
|
+
bufferedChunks: 0,
|
|
90
|
+
processingTime: 0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export class StreamMerger {
|
|
95
|
+
buffer = new Map();
|
|
96
|
+
completedStreams = new Set();
|
|
97
|
+
async *merge(streams, options) {
|
|
98
|
+
const bufferSize = options?.bufferSize ?? 100;
|
|
99
|
+
const iterators = new Map();
|
|
100
|
+
for (const [name, stream] of streams) {
|
|
101
|
+
iterators.set(name, stream[Symbol.asyncIterator]());
|
|
102
|
+
this.buffer.set(name, []);
|
|
103
|
+
}
|
|
104
|
+
const pendingReads = new Map();
|
|
105
|
+
for (const [name, iterator] of iterators) {
|
|
106
|
+
pendingReads.set(name, iterator.next());
|
|
107
|
+
}
|
|
108
|
+
while (pendingReads.size > 0) {
|
|
109
|
+
const [name, result] = await this.racePromises(pendingReads);
|
|
110
|
+
if (result.done) {
|
|
111
|
+
this.completedStreams.add(name);
|
|
112
|
+
pendingReads.delete(name);
|
|
113
|
+
iterators.delete(name);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
yield { source: name, data: result.value };
|
|
117
|
+
const iterator = iterators.get(name);
|
|
118
|
+
if (iterator) {
|
|
119
|
+
pendingReads.set(name, iterator.next());
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async racePromises(promises) {
|
|
125
|
+
const entries = Array.from(promises.entries());
|
|
126
|
+
const racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));
|
|
127
|
+
const winner = await Promise.race(racing);
|
|
128
|
+
return [winner.name, winner.result];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export const globalAcceleratedStream = new AcceleratedStream();
|
|
132
|
+
export const globalStreamMerger = new StreamMerger();
|
|
133
|
+
//# sourceMappingURL=accelerated-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accelerated-stream.js","sourceRoot":"","sources":["../../src/core/accelerated-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"@mariozechner/pi-ai\";\nimport { globalMultiGPUExecutor } from \"./multi-gpu-executor.js\";\n\ninterface StreamProcessorConfig {\n\tenableParallelProcessing?: boolean;\n\tbufferSize?: number;\n\tworkerCount?: number;\n}\ninterface ProcessingStats {\n\ttotalChunks: number;\n\tprocessedChunks: number;\n\tbufferedChunks: number;\n\tprocessingTime: number;\n}\nexport class AcceleratedStream {\n\tprivate config: Required<StreamProcessorConfig>;\n\tprivate stats: ProcessingStats = {\n\t\ttotalChunks: 0,\n\t\tprocessedChunks: 0,\n\t\tbufferedChunks: 0,\n\t\tprocessingTime: 0,\n\t};\n\tconstructor(config: StreamProcessorConfig = {}) {\n\t\tthis.config = {\n\t\t\tenableParallelProcessing: config.enableParallelProcessing ?? true,\n\t\t\tbufferSize: config.bufferSize ?? 20,\n\t\t\tworkerCount: config.workerCount ?? 4,\n\t\t};\n\t}\n\tasync *process<T>(source: AsyncIterable<T>, processor: (chunk: T) => T | Promise<T>): AsyncGenerator<T, void, void> {\n\t\tif (!this.config.enableParallelProcessing) {\n\t\t\tfor await (const chunk of source) {\n\t\t\t\tyield await processor(chunk);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst buffer: Promise<T>[] = [];\n\t\tconst startTime = Date.now();\n\t\tfor await (const chunk of source) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedPromise = globalMultiGPUExecutor.compute(chunk, processor);\n\t\t\tbuffer.push(processedPromise);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst result = await buffer.shift()!;\n\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\tyield result;\n\t\t\t}\n\t\t}\n\t\twhile (buffer.length > 0) {\n\t\t\tconst result = await buffer.shift()!;\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield result;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t}\n\tasync *accelerateResponse(\n\t\tstream: AsyncGenerator<AssistantMessageEvent>,\n\t\toptions?: {\n\t\t\tonChunk?: (chunk: AssistantMessageEvent) => void;\n\t\t\ttransformChunk?: (chunk: AssistantMessageEvent) => AssistantMessageEvent;\n\t\t},\n\t): AsyncGenerator<AssistantMessageEvent, AssistantMessage, void> {\n\t\tconst buffer: AssistantMessageEvent[] = [];\n\t\tlet finalMessage: AssistantMessage | null = null;\n\t\tconst startTime = Date.now();\n\t\tfor await (const event of stream) {\n\t\t\tthis.stats.totalChunks++;\n\t\t\tconst processedEvent = options?.transformChunk\n\t\t\t\t? await globalMultiGPUExecutor.compute(event, options.transformChunk)\n\t\t\t\t: event;\n\t\t\toptions?.onChunk?.(processedEvent);\n\t\t\tbuffer.push(processedEvent);\n\t\t\tif (buffer.length >= this.config.bufferSize) {\n\t\t\t\tconst toYield = buffer.splice(0, buffer.length - Math.floor(this.config.bufferSize / 2));\n\t\t\t\tfor (const e of toYield) {\n\t\t\t\t\tthis.stats.processedChunks++;\n\t\t\t\t\tyield e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\tfinalMessage = await this.getFinalMessage(stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (const event of buffer) {\n\t\t\tthis.stats.processedChunks++;\n\t\t\tyield event;\n\t\t}\n\t\tthis.stats.processingTime += Date.now() - startTime;\n\t\tif (!finalMessage) {\n\t\t\tthrow new Error(\"Stream ended without final message\");\n\t\t}\n\t\treturn finalMessage;\n\t}\n\tprivate async getFinalMessage(stream: AsyncGenerator<AssistantMessageEvent>): Promise<AssistantMessage> {\n\t\treturn {} as AssistantMessage;\n\t}\n\tasync processMultipleStreams<T>(\n\t\tstreams: AsyncIterable<T>[],\n\t\tprocessor: (chunk: T) => T | Promise<T>,\n\t): Promise<AsyncGenerator<T>[]> {\n\t\treturn streams.map((stream) => this.process(stream, processor));\n\t}\n\tgetStats(): ProcessingStats {\n\t\treturn { ...this.stats };\n\t}\n\tresetStats(): void {\n\t\tthis.stats = {\n\t\t\ttotalChunks: 0,\n\t\t\tprocessedChunks: 0,\n\t\t\tbufferedChunks: 0,\n\t\t\tprocessingTime: 0,\n\t\t};\n\t}\n}\nexport class StreamMerger {\n\tprivate buffer: Map<string, any[]> = new Map();\n\tprivate completedStreams: Set<string> = new Set();\n\tasync *merge<T>(\n\t\tstreams: Map<string, AsyncIterable<T>>,\n\t\toptions?: { bufferSize?: number },\n\t): AsyncGenerator<{ source: string; data: T }, void, void> {\n\t\tconst bufferSize = options?.bufferSize ?? 100;\n\t\tconst iterators = new Map<string, AsyncIterator<T>>();\n\t\tfor (const [name, stream] of streams) {\n\t\t\titerators.set(name, stream[Symbol.asyncIterator]());\n\t\t\tthis.buffer.set(name, []);\n\t\t}\n\t\tconst pendingReads = new Map<string, Promise<IteratorResult<T>>>();\n\t\tfor (const [name, iterator] of iterators) {\n\t\t\tpendingReads.set(name, iterator.next());\n\t\t}\n\t\twhile (pendingReads.size > 0) {\n\t\t\tconst [name, result] = await this.racePromises(pendingReads);\n\t\t\tif (result.done) {\n\t\t\t\tthis.completedStreams.add(name);\n\t\t\t\tpendingReads.delete(name);\n\t\t\t\titerators.delete(name);\n\t\t\t} else {\n\t\t\t\tyield { source: name, data: result.value };\n\t\t\t\tconst iterator = iterators.get(name);\n\t\t\t\tif (iterator) {\n\t\t\t\t\tpendingReads.set(name, iterator.next());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async racePromises<T>(promises: Map<string, Promise<T>>): Promise<[string, T]> {\n\t\tconst entries = Array.from(promises.entries());\n\t\tconst racing = entries.map(([name, promise]) => promise.then((result) => ({ name, result })));\n\t\tconst winner = await Promise.race(racing);\n\t\treturn [winner.name, winner.result];\n\t}\n}\nexport const globalAcceleratedStream = new AcceleratedStream();\nexport const globalStreamMerger = new StreamMerger();\n"]}
|