helixmind 0.1.0
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.
Potentially problematic release.
This version of helixmind might be problematic. Click here for more details.
- package/LICENSE +20 -0
- package/README.md +207 -0
- package/dist/cli/agent/autonomous.d.ts +10 -0
- package/dist/cli/agent/autonomous.d.ts.map +1 -0
- package/dist/cli/agent/autonomous.js +172 -0
- package/dist/cli/agent/autonomous.js.map +1 -0
- package/dist/cli/agent/loop.d.ts +76 -0
- package/dist/cli/agent/loop.d.ts.map +1 -0
- package/dist/cli/agent/loop.js +333 -0
- package/dist/cli/agent/loop.js.map +1 -0
- package/dist/cli/agent/permissions.d.ts +28 -0
- package/dist/cli/agent/permissions.d.ts.map +1 -0
- package/dist/cli/agent/permissions.js +180 -0
- package/dist/cli/agent/permissions.js.map +1 -0
- package/dist/cli/agent/sandbox.d.ts +17 -0
- package/dist/cli/agent/sandbox.d.ts.map +1 -0
- package/dist/cli/agent/sandbox.js +124 -0
- package/dist/cli/agent/sandbox.js.map +1 -0
- package/dist/cli/agent/tools/edit-file.d.ts +2 -0
- package/dist/cli/agent/tools/edit-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/edit-file.js +49 -0
- package/dist/cli/agent/tools/edit-file.js.map +1 -0
- package/dist/cli/agent/tools/find.d.ts +2 -0
- package/dist/cli/agent/tools/find.d.ts.map +1 -0
- package/dist/cli/agent/tools/find.js +35 -0
- package/dist/cli/agent/tools/find.js.map +1 -0
- package/dist/cli/agent/tools/git-commit.d.ts +2 -0
- package/dist/cli/agent/tools/git-commit.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-commit.js +51 -0
- package/dist/cli/agent/tools/git-commit.js.map +1 -0
- package/dist/cli/agent/tools/git-diff.d.ts +2 -0
- package/dist/cli/agent/tools/git-diff.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-diff.js +36 -0
- package/dist/cli/agent/tools/git-diff.js.map +1 -0
- package/dist/cli/agent/tools/git-log.d.ts +2 -0
- package/dist/cli/agent/tools/git-log.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-log.js +32 -0
- package/dist/cli/agent/tools/git-log.js.map +1 -0
- package/dist/cli/agent/tools/git-status.d.ts +2 -0
- package/dist/cli/agent/tools/git-status.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-status.js +38 -0
- package/dist/cli/agent/tools/git-status.js.map +1 -0
- package/dist/cli/agent/tools/list-dir.d.ts +2 -0
- package/dist/cli/agent/tools/list-dir.d.ts.map +1 -0
- package/dist/cli/agent/tools/list-dir.js +73 -0
- package/dist/cli/agent/tools/list-dir.js.map +1 -0
- package/dist/cli/agent/tools/read-file.d.ts +2 -0
- package/dist/cli/agent/tools/read-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/read-file.js +45 -0
- package/dist/cli/agent/tools/read-file.js.map +1 -0
- package/dist/cli/agent/tools/registry.d.ts +18 -0
- package/dist/cli/agent/tools/registry.d.ts.map +1 -0
- package/dist/cli/agent/tools/registry.js +31 -0
- package/dist/cli/agent/tools/registry.js.map +1 -0
- package/dist/cli/agent/tools/run-command.d.ts +2 -0
- package/dist/cli/agent/tools/run-command.d.ts.map +1 -0
- package/dist/cli/agent/tools/run-command.js +79 -0
- package/dist/cli/agent/tools/run-command.js.map +1 -0
- package/dist/cli/agent/tools/search.d.ts +2 -0
- package/dist/cli/agent/tools/search.d.ts.map +1 -0
- package/dist/cli/agent/tools/search.js +104 -0
- package/dist/cli/agent/tools/search.js.map +1 -0
- package/dist/cli/agent/tools/spiral-query.d.ts +2 -0
- package/dist/cli/agent/tools/spiral-query.d.ts.map +1 -0
- package/dist/cli/agent/tools/spiral-query.js +52 -0
- package/dist/cli/agent/tools/spiral-query.js.map +1 -0
- package/dist/cli/agent/tools/spiral-store.d.ts +2 -0
- package/dist/cli/agent/tools/spiral-store.d.ts.map +1 -0
- package/dist/cli/agent/tools/spiral-store.js +37 -0
- package/dist/cli/agent/tools/spiral-store.js.map +1 -0
- package/dist/cli/agent/tools/web-research.d.ts +2 -0
- package/dist/cli/agent/tools/web-research.d.ts.map +1 -0
- package/dist/cli/agent/tools/web-research.js +96 -0
- package/dist/cli/agent/tools/web-research.js.map +1 -0
- package/dist/cli/agent/tools/write-file.d.ts +2 -0
- package/dist/cli/agent/tools/write-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/write-file.js +91 -0
- package/dist/cli/agent/tools/write-file.js.map +1 -0
- package/dist/cli/agent/undo.d.ts +30 -0
- package/dist/cli/agent/undo.d.ts.map +1 -0
- package/dist/cli/agent/undo.js +48 -0
- package/dist/cli/agent/undo.js.map +1 -0
- package/dist/cli/auth/callback-server.d.ts +15 -0
- package/dist/cli/auth/callback-server.d.ts.map +1 -0
- package/dist/cli/auth/callback-server.js +168 -0
- package/dist/cli/auth/callback-server.js.map +1 -0
- package/dist/cli/auth/feature-gate.d.ts +19 -0
- package/dist/cli/auth/feature-gate.d.ts.map +1 -0
- package/dist/cli/auth/feature-gate.js +74 -0
- package/dist/cli/auth/feature-gate.js.map +1 -0
- package/dist/cli/auth/guard.d.ts +10 -0
- package/dist/cli/auth/guard.d.ts.map +1 -0
- package/dist/cli/auth/guard.js +46 -0
- package/dist/cli/auth/guard.js.map +1 -0
- package/dist/cli/auth/login.d.ts +22 -0
- package/dist/cli/auth/login.d.ts.map +1 -0
- package/dist/cli/auth/login.js +194 -0
- package/dist/cli/auth/login.js.map +1 -0
- package/dist/cli/auth/logout.d.ts +6 -0
- package/dist/cli/auth/logout.d.ts.map +1 -0
- package/dist/cli/auth/logout.js +36 -0
- package/dist/cli/auth/logout.js.map +1 -0
- package/dist/cli/bench/dataset.d.ts +13 -0
- package/dist/cli/bench/dataset.d.ts.map +1 -0
- package/dist/cli/bench/dataset.js +97 -0
- package/dist/cli/bench/dataset.js.map +1 -0
- package/dist/cli/bench/harness.d.ts +7 -0
- package/dist/cli/bench/harness.d.ts.map +1 -0
- package/dist/cli/bench/harness.js +135 -0
- package/dist/cli/bench/harness.js.map +1 -0
- package/dist/cli/bench/metrics.d.ts +15 -0
- package/dist/cli/bench/metrics.d.ts.map +1 -0
- package/dist/cli/bench/metrics.js +98 -0
- package/dist/cli/bench/metrics.js.map +1 -0
- package/dist/cli/bench/output.d.ts +42 -0
- package/dist/cli/bench/output.d.ts.map +1 -0
- package/dist/cli/bench/output.js +140 -0
- package/dist/cli/bench/output.js.map +1 -0
- package/dist/cli/bench/prompt.d.ts +13 -0
- package/dist/cli/bench/prompt.d.ts.map +1 -0
- package/dist/cli/bench/prompt.js +106 -0
- package/dist/cli/bench/prompt.js.map +1 -0
- package/dist/cli/bench/runner.d.ts +14 -0
- package/dist/cli/bench/runner.d.ts.map +1 -0
- package/dist/cli/bench/runner.js +334 -0
- package/dist/cli/bench/runner.js.map +1 -0
- package/dist/cli/bench/types.d.ts +109 -0
- package/dist/cli/bench/types.d.ts.map +1 -0
- package/dist/cli/bench/types.js +2 -0
- package/dist/cli/bench/types.js.map +1 -0
- package/dist/cli/bench/ui.d.ts +12 -0
- package/dist/cli/bench/ui.d.ts.map +1 -0
- package/dist/cli/bench/ui.js +126 -0
- package/dist/cli/bench/ui.js.map +1 -0
- package/dist/cli/brain/archive.d.ts +33 -0
- package/dist/cli/brain/archive.d.ts.map +1 -0
- package/dist/cli/brain/archive.js +159 -0
- package/dist/cli/brain/archive.js.map +1 -0
- package/dist/cli/brain/control-protocol.d.ts +159 -0
- package/dist/cli/brain/control-protocol.d.ts.map +1 -0
- package/dist/cli/brain/control-protocol.js +41 -0
- package/dist/cli/brain/control-protocol.js.map +1 -0
- package/dist/cli/brain/exporter.d.ts +34 -0
- package/dist/cli/brain/exporter.d.ts.map +1 -0
- package/dist/cli/brain/exporter.js +37 -0
- package/dist/cli/brain/exporter.js.map +1 -0
- package/dist/cli/brain/generator.d.ts +67 -0
- package/dist/cli/brain/generator.d.ts.map +1 -0
- package/dist/cli/brain/generator.js +239 -0
- package/dist/cli/brain/generator.js.map +1 -0
- package/dist/cli/brain/relay-client.d.ts +8 -0
- package/dist/cli/brain/relay-client.d.ts.map +1 -0
- package/dist/cli/brain/relay-client.js +173 -0
- package/dist/cli/brain/relay-client.js.map +1 -0
- package/dist/cli/brain/server.d.ts +34 -0
- package/dist/cli/brain/server.d.ts.map +1 -0
- package/dist/cli/brain/server.js +425 -0
- package/dist/cli/brain/server.js.map +1 -0
- package/dist/cli/brain/template.d.ts +3 -0
- package/dist/cli/brain/template.d.ts.map +1 -0
- package/dist/cli/brain/template.js +2072 -0
- package/dist/cli/brain/template.js.map +1 -0
- package/dist/cli/checkpoints/browser.d.ts +27 -0
- package/dist/cli/checkpoints/browser.d.ts.map +1 -0
- package/dist/cli/checkpoints/browser.js +238 -0
- package/dist/cli/checkpoints/browser.js.map +1 -0
- package/dist/cli/checkpoints/keybinding.d.ts +22 -0
- package/dist/cli/checkpoints/keybinding.d.ts.map +1 -0
- package/dist/cli/checkpoints/keybinding.js +43 -0
- package/dist/cli/checkpoints/keybinding.js.map +1 -0
- package/dist/cli/checkpoints/revert.d.ts +37 -0
- package/dist/cli/checkpoints/revert.d.ts.map +1 -0
- package/dist/cli/checkpoints/revert.js +144 -0
- package/dist/cli/checkpoints/revert.js.map +1 -0
- package/dist/cli/checkpoints/store.d.ts +48 -0
- package/dist/cli/checkpoints/store.d.ts.map +1 -0
- package/dist/cli/checkpoints/store.js +188 -0
- package/dist/cli/checkpoints/store.js.map +1 -0
- package/dist/cli/commands/archive.d.ts +7 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +66 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +44 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/bench.d.ts +25 -0
- package/dist/cli/commands/bench.d.ts.map +1 -0
- package/dist/cli/commands/bench.js +114 -0
- package/dist/cli/commands/bench.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +11 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +2321 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +4 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +41 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/feed.d.ts +6 -0
- package/dist/cli/commands/feed.d.ts.map +1 -0
- package/dist/cli/commands/feed.js +95 -0
- package/dist/cli/commands/feed.js.map +1 -0
- package/dist/cli/commands/helix-menu.d.ts +4 -0
- package/dist/cli/commands/helix-menu.d.ts.map +1 -0
- package/dist/cli/commands/helix-menu.js +400 -0
- package/dist/cli/commands/helix-menu.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +26 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +20 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +314 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/spiral.d.ts +4 -0
- package/dist/cli/commands/spiral.d.ts.map +1 -0
- package/dist/cli/commands/spiral.js +81 -0
- package/dist/cli/commands/spiral.js.map +1 -0
- package/dist/cli/config/store.d.ts +72 -0
- package/dist/cli/config/store.d.ts.map +1 -0
- package/dist/cli/config/store.js +241 -0
- package/dist/cli/config/store.js.map +1 -0
- package/dist/cli/context/assembler.d.ts +8 -0
- package/dist/cli/context/assembler.d.ts.map +1 -0
- package/dist/cli/context/assembler.js +124 -0
- package/dist/cli/context/assembler.js.map +1 -0
- package/dist/cli/context/project.d.ts +13 -0
- package/dist/cli/context/project.d.ts.map +1 -0
- package/dist/cli/context/project.js +126 -0
- package/dist/cli/context/project.js.map +1 -0
- package/dist/cli/context/session-buffer.d.ts +57 -0
- package/dist/cli/context/session-buffer.d.ts.map +1 -0
- package/dist/cli/context/session-buffer.js +268 -0
- package/dist/cli/context/session-buffer.js.map +1 -0
- package/dist/cli/context/trimmer.d.ts +26 -0
- package/dist/cli/context/trimmer.d.ts.map +1 -0
- package/dist/cli/context/trimmer.js +105 -0
- package/dist/cli/context/trimmer.js.map +1 -0
- package/dist/cli/feed/analyzer.d.ts +17 -0
- package/dist/cli/feed/analyzer.d.ts.map +1 -0
- package/dist/cli/feed/analyzer.js +220 -0
- package/dist/cli/feed/analyzer.js.map +1 -0
- package/dist/cli/feed/intent.d.ts +8 -0
- package/dist/cli/feed/intent.d.ts.map +1 -0
- package/dist/cli/feed/intent.js +70 -0
- package/dist/cli/feed/intent.js.map +1 -0
- package/dist/cli/feed/parser.d.ts +23 -0
- package/dist/cli/feed/parser.d.ts.map +1 -0
- package/dist/cli/feed/parser.js +166 -0
- package/dist/cli/feed/parser.js.map +1 -0
- package/dist/cli/feed/pipeline.d.ts +32 -0
- package/dist/cli/feed/pipeline.d.ts.map +1 -0
- package/dist/cli/feed/pipeline.js +242 -0
- package/dist/cli/feed/pipeline.js.map +1 -0
- package/dist/cli/feed/reader.d.ts +10 -0
- package/dist/cli/feed/reader.d.ts.map +1 -0
- package/dist/cli/feed/reader.js +61 -0
- package/dist/cli/feed/reader.js.map +1 -0
- package/dist/cli/feed/scanner.d.ts +10 -0
- package/dist/cli/feed/scanner.d.ts.map +1 -0
- package/dist/cli/feed/scanner.js +124 -0
- package/dist/cli/feed/scanner.js.map +1 -0
- package/dist/cli/feed/watcher.d.ts +14 -0
- package/dist/cli/feed/watcher.d.ts.map +1 -0
- package/dist/cli/feed/watcher.js +76 -0
- package/dist/cli/feed/watcher.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +204 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/providers/anthropic.d.ts +10 -0
- package/dist/cli/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/providers/anthropic.js +117 -0
- package/dist/cli/providers/anthropic.js.map +1 -0
- package/dist/cli/providers/ollama.d.ts +37 -0
- package/dist/cli/providers/ollama.d.ts.map +1 -0
- package/dist/cli/providers/ollama.js +151 -0
- package/dist/cli/providers/ollama.js.map +1 -0
- package/dist/cli/providers/openai.d.ts +13 -0
- package/dist/cli/providers/openai.d.ts.map +1 -0
- package/dist/cli/providers/openai.js +283 -0
- package/dist/cli/providers/openai.js.map +1 -0
- package/dist/cli/providers/rate-limiter.d.ts +51 -0
- package/dist/cli/providers/rate-limiter.d.ts.map +1 -0
- package/dist/cli/providers/rate-limiter.js +164 -0
- package/dist/cli/providers/rate-limiter.js.map +1 -0
- package/dist/cli/providers/registry.d.ts +16 -0
- package/dist/cli/providers/registry.d.ts.map +1 -0
- package/dist/cli/providers/registry.js +99 -0
- package/dist/cli/providers/registry.js.map +1 -0
- package/dist/cli/providers/types.d.ts +61 -0
- package/dist/cli/providers/types.d.ts.map +1 -0
- package/dist/cli/providers/types.js +2 -0
- package/dist/cli/providers/types.js.map +1 -0
- package/dist/cli/sessions/manager.d.ts +69 -0
- package/dist/cli/sessions/manager.d.ts.map +1 -0
- package/dist/cli/sessions/manager.js +200 -0
- package/dist/cli/sessions/manager.js.map +1 -0
- package/dist/cli/sessions/session.d.ts +54 -0
- package/dist/cli/sessions/session.d.ts.map +1 -0
- package/dist/cli/sessions/session.js +70 -0
- package/dist/cli/sessions/session.js.map +1 -0
- package/dist/cli/sessions/tab-view.d.ts +18 -0
- package/dist/cli/sessions/tab-view.d.ts.map +1 -0
- package/dist/cli/sessions/tab-view.js +134 -0
- package/dist/cli/sessions/tab-view.js.map +1 -0
- package/dist/cli/ui/activity.d.ts +82 -0
- package/dist/cli/ui/activity.d.ts.map +1 -0
- package/dist/cli/ui/activity.js +309 -0
- package/dist/cli/ui/activity.js.map +1 -0
- package/dist/cli/ui/chat-view.d.ts +10 -0
- package/dist/cli/ui/chat-view.d.ts.map +1 -0
- package/dist/cli/ui/chat-view.js +165 -0
- package/dist/cli/ui/chat-view.js.map +1 -0
- package/dist/cli/ui/command-suggest.d.ts +22 -0
- package/dist/cli/ui/command-suggest.d.ts.map +1 -0
- package/dist/cli/ui/command-suggest.js +115 -0
- package/dist/cli/ui/command-suggest.js.map +1 -0
- package/dist/cli/ui/logo.d.ts +3 -0
- package/dist/cli/ui/logo.d.ts.map +1 -0
- package/dist/cli/ui/logo.js +25 -0
- package/dist/cli/ui/logo.js.map +1 -0
- package/dist/cli/ui/progress.d.ts +21 -0
- package/dist/cli/ui/progress.d.ts.map +1 -0
- package/dist/cli/ui/progress.js +125 -0
- package/dist/cli/ui/progress.js.map +1 -0
- package/dist/cli/ui/select-menu.d.ts +22 -0
- package/dist/cli/ui/select-menu.d.ts.map +1 -0
- package/dist/cli/ui/select-menu.js +152 -0
- package/dist/cli/ui/select-menu.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +3 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +14 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/statusbar.d.ts +65 -0
- package/dist/cli/ui/statusbar.d.ts.map +1 -0
- package/dist/cli/ui/statusbar.js +272 -0
- package/dist/cli/ui/statusbar.js.map +1 -0
- package/dist/cli/ui/theme.d.ts +20 -0
- package/dist/cli/ui/theme.d.ts.map +1 -0
- package/dist/cli/ui/theme.js +25 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/ui/tool-output.d.ts +25 -0
- package/dist/cli/ui/tool-output.d.ts.map +1 -0
- package/dist/cli/ui/tool-output.js +171 -0
- package/dist/cli/ui/tool-output.js.map +1 -0
- package/dist/cli/validation/autofix.d.ts +32 -0
- package/dist/cli/validation/autofix.d.ts.map +1 -0
- package/dist/cli/validation/autofix.js +148 -0
- package/dist/cli/validation/autofix.js.map +1 -0
- package/dist/cli/validation/classifier.d.ts +17 -0
- package/dist/cli/validation/classifier.d.ts.map +1 -0
- package/dist/cli/validation/classifier.js +174 -0
- package/dist/cli/validation/classifier.js.map +1 -0
- package/dist/cli/validation/criteria.d.ts +22 -0
- package/dist/cli/validation/criteria.d.ts.map +1 -0
- package/dist/cli/validation/criteria.js +188 -0
- package/dist/cli/validation/criteria.js.map +1 -0
- package/dist/cli/validation/dynamic-checks.d.ts +16 -0
- package/dist/cli/validation/dynamic-checks.d.ts.map +1 -0
- package/dist/cli/validation/dynamic-checks.js +109 -0
- package/dist/cli/validation/dynamic-checks.js.map +1 -0
- package/dist/cli/validation/model.d.ts +16 -0
- package/dist/cli/validation/model.d.ts.map +1 -0
- package/dist/cli/validation/model.js +59 -0
- package/dist/cli/validation/model.js.map +1 -0
- package/dist/cli/validation/reporter.d.ts +18 -0
- package/dist/cli/validation/reporter.d.ts.map +1 -0
- package/dist/cli/validation/reporter.js +167 -0
- package/dist/cli/validation/reporter.js.map +1 -0
- package/dist/cli/validation/spiral-checks.d.ts +12 -0
- package/dist/cli/validation/spiral-checks.d.ts.map +1 -0
- package/dist/cli/validation/spiral-checks.js +167 -0
- package/dist/cli/validation/spiral-checks.js.map +1 -0
- package/dist/cli/validation/static-checks.d.ts +26 -0
- package/dist/cli/validation/static-checks.d.ts.map +1 -0
- package/dist/cli/validation/static-checks.js +492 -0
- package/dist/cli/validation/static-checks.js.map +1 -0
- package/dist/cli/validation/stats.d.ts +29 -0
- package/dist/cli/validation/stats.d.ts.map +1 -0
- package/dist/cli/validation/stats.js +137 -0
- package/dist/cli/validation/stats.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +43 -0
- package/dist/server.js.map +1 -0
- package/dist/spiral/cloud/content-extractor.d.ts +27 -0
- package/dist/spiral/cloud/content-extractor.d.ts.map +1 -0
- package/dist/spiral/cloud/content-extractor.js +175 -0
- package/dist/spiral/cloud/content-extractor.js.map +1 -0
- package/dist/spiral/cloud/search-provider.d.ts +22 -0
- package/dist/spiral/cloud/search-provider.d.ts.map +1 -0
- package/dist/spiral/cloud/search-provider.js +212 -0
- package/dist/spiral/cloud/search-provider.js.map +1 -0
- package/dist/spiral/cloud/topic-detector.d.ts +25 -0
- package/dist/spiral/cloud/topic-detector.d.ts.map +1 -0
- package/dist/spiral/cloud/topic-detector.js +196 -0
- package/dist/spiral/cloud/topic-detector.js.map +1 -0
- package/dist/spiral/cloud/web-enricher.d.ts +58 -0
- package/dist/spiral/cloud/web-enricher.d.ts.map +1 -0
- package/dist/spiral/cloud/web-enricher.js +170 -0
- package/dist/spiral/cloud/web-enricher.js.map +1 -0
- package/dist/spiral/compression.d.ts +54 -0
- package/dist/spiral/compression.d.ts.map +1 -0
- package/dist/spiral/compression.js +175 -0
- package/dist/spiral/compression.js.map +1 -0
- package/dist/spiral/embeddings.d.ts +24 -0
- package/dist/spiral/embeddings.d.ts.map +1 -0
- package/dist/spiral/embeddings.js +69 -0
- package/dist/spiral/embeddings.js.map +1 -0
- package/dist/spiral/engine.d.ts +95 -0
- package/dist/spiral/engine.d.ts.map +1 -0
- package/dist/spiral/engine.js +271 -0
- package/dist/spiral/engine.js.map +1 -0
- package/dist/spiral/injection.d.ts +29 -0
- package/dist/spiral/injection.d.ts.map +1 -0
- package/dist/spiral/injection.js +164 -0
- package/dist/spiral/injection.js.map +1 -0
- package/dist/spiral/relevance.d.ts +37 -0
- package/dist/spiral/relevance.d.ts.map +1 -0
- package/dist/spiral/relevance.js +75 -0
- package/dist/spiral/relevance.js.map +1 -0
- package/dist/storage/database.d.ts +11 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +141 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/edges.d.ts +25 -0
- package/dist/storage/edges.d.ts.map +1 -0
- package/dist/storage/edges.js +69 -0
- package/dist/storage/edges.js.map +1 -0
- package/dist/storage/nodes.d.ts +45 -0
- package/dist/storage/nodes.d.ts.map +1 -0
- package/dist/storage/nodes.js +124 -0
- package/dist/storage/nodes.js.map +1 -0
- package/dist/storage/vectors.d.ts +25 -0
- package/dist/storage/vectors.d.ts.map +1 -0
- package/dist/storage/vectors.js +110 -0
- package/dist/storage/vectors.js.map +1 -0
- package/dist/tools/spiral-compact.d.ts +14 -0
- package/dist/tools/spiral-compact.d.ts.map +1 -0
- package/dist/tools/spiral-compact.js +14 -0
- package/dist/tools/spiral-compact.js.map +1 -0
- package/dist/tools/spiral-query.d.ts +18 -0
- package/dist/tools/spiral-query.d.ts.map +1 -0
- package/dist/tools/spiral-query.js +16 -0
- package/dist/tools/spiral-query.js.map +1 -0
- package/dist/tools/spiral-relate.d.ts +21 -0
- package/dist/tools/spiral-relate.d.ts.map +1 -0
- package/dist/tools/spiral-relate.js +21 -0
- package/dist/tools/spiral-relate.js.map +1 -0
- package/dist/tools/spiral-status.d.ts +8 -0
- package/dist/tools/spiral-status.d.ts.map +1 -0
- package/dist/tools/spiral-status.js +10 -0
- package/dist/tools/spiral-status.js.map +1 -0
- package/dist/tools/spiral-store.d.ts +41 -0
- package/dist/tools/spiral-store.d.ts.map +1 -0
- package/dist/tools/spiral-store.js +22 -0
- package/dist/tools/spiral-store.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +44 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/tokens.d.ts +21 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +33 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { waitIfNeeded, reportSuccess, handleRateLimitError, isRateLimitError, detectCreditsExhausted, } from './rate-limiter.js';
|
|
3
|
+
export class OpenAIProvider {
|
|
4
|
+
name;
|
|
5
|
+
model;
|
|
6
|
+
client;
|
|
7
|
+
systemRole;
|
|
8
|
+
constructor(apiKey, model = 'gpt-4o', baseURL, providerName) {
|
|
9
|
+
this.model = model;
|
|
10
|
+
this.name = providerName ?? 'openai';
|
|
11
|
+
// Only native OpenAI supports the 'developer' role; all others use 'system'
|
|
12
|
+
this.systemRole = this.name === 'openai' ? 'developer' : 'system';
|
|
13
|
+
this.client = new OpenAI({
|
|
14
|
+
apiKey,
|
|
15
|
+
...(baseURL ? { baseURL } : {}),
|
|
16
|
+
timeout: 120_000, // 2 minute timeout — prevents infinite hang on slow/unresponsive APIs
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/** Check if the current model is a reasoning model (DeepSeek-R1 etc.) */
|
|
20
|
+
isReasonerModel() {
|
|
21
|
+
const m = this.model.toLowerCase();
|
|
22
|
+
return m.includes('reasoner') || m.includes('-r1');
|
|
23
|
+
}
|
|
24
|
+
async *stream(messages, systemPrompt) {
|
|
25
|
+
let fullText = '';
|
|
26
|
+
try {
|
|
27
|
+
const stream = await this.client.chat.completions.create({
|
|
28
|
+
model: this.model,
|
|
29
|
+
stream: true,
|
|
30
|
+
messages: [
|
|
31
|
+
{ role: this.systemRole, content: systemPrompt },
|
|
32
|
+
...messages.map(m => ({
|
|
33
|
+
role: m.role,
|
|
34
|
+
content: m.content,
|
|
35
|
+
})),
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
for await (const chunk of stream) {
|
|
39
|
+
const content = chunk.choices?.[0]?.delta?.content;
|
|
40
|
+
if (content) {
|
|
41
|
+
fullText += content;
|
|
42
|
+
yield { type: 'text', content };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
yield { type: 'done', content: fullText };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
yield {
|
|
49
|
+
type: 'error',
|
|
50
|
+
content: err instanceof Error ? err.message : String(err),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async chatWithTools(messages, systemPrompt, tools, signal) {
|
|
55
|
+
// Convert to OpenAI format
|
|
56
|
+
const openaiMessages = [
|
|
57
|
+
{ role: this.systemRole, content: systemPrompt },
|
|
58
|
+
];
|
|
59
|
+
for (const msg of messages) {
|
|
60
|
+
if (msg.role === 'user') {
|
|
61
|
+
if (typeof msg.content === 'string') {
|
|
62
|
+
openaiMessages.push({ role: 'user', content: msg.content });
|
|
63
|
+
}
|
|
64
|
+
else if (Array.isArray(msg.content)) {
|
|
65
|
+
// Check if it's tool results
|
|
66
|
+
const first = msg.content[0];
|
|
67
|
+
if (first && 'type' in first && first.type === 'tool_result') {
|
|
68
|
+
for (const block of msg.content) {
|
|
69
|
+
if ('tool_use_id' in block) {
|
|
70
|
+
openaiMessages.push({
|
|
71
|
+
role: 'tool',
|
|
72
|
+
tool_call_id: block.tool_use_id,
|
|
73
|
+
content: block.content,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Text content blocks
|
|
80
|
+
const text = msg.content
|
|
81
|
+
.filter((b) => b.type === 'text')
|
|
82
|
+
.map(b => b.text)
|
|
83
|
+
.join('');
|
|
84
|
+
if (text)
|
|
85
|
+
openaiMessages.push({ role: 'user', content: text });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (msg.role === 'assistant') {
|
|
90
|
+
if (typeof msg.content === 'string') {
|
|
91
|
+
openaiMessages.push({ role: 'assistant', content: msg.content });
|
|
92
|
+
}
|
|
93
|
+
else if (Array.isArray(msg.content)) {
|
|
94
|
+
const textParts = msg.content
|
|
95
|
+
.filter((b) => b.type === 'text')
|
|
96
|
+
.map(b => b.text)
|
|
97
|
+
.join('');
|
|
98
|
+
const toolCalls = msg.content
|
|
99
|
+
.filter((b) => b.type === 'tool_use')
|
|
100
|
+
.map(b => ({
|
|
101
|
+
id: b.id,
|
|
102
|
+
type: 'function',
|
|
103
|
+
function: {
|
|
104
|
+
name: b.name,
|
|
105
|
+
arguments: JSON.stringify(b.input),
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
// Restore reasoning_content for DeepSeek-R1 models
|
|
109
|
+
const reasoningBlocks = msg.content
|
|
110
|
+
.filter((b) => b.type === 'reasoning');
|
|
111
|
+
const reasoningParts = reasoningBlocks.map(b => b.text).join('');
|
|
112
|
+
const assistantMsg = {
|
|
113
|
+
role: 'assistant',
|
|
114
|
+
content: textParts || null,
|
|
115
|
+
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
116
|
+
};
|
|
117
|
+
// Include reasoning_content if present or if using a reasoner model
|
|
118
|
+
// DeepSeek-R1 REQUIRES this field on ALL assistant messages in history
|
|
119
|
+
if (reasoningBlocks.length > 0) {
|
|
120
|
+
assistantMsg.reasoning_content = reasoningParts;
|
|
121
|
+
}
|
|
122
|
+
else if (this.isReasonerModel()) {
|
|
123
|
+
assistantMsg.reasoning_content = '';
|
|
124
|
+
}
|
|
125
|
+
openaiMessages.push(assistantMsg);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const openaiTools = tools.map(t => ({
|
|
130
|
+
type: 'function',
|
|
131
|
+
function: {
|
|
132
|
+
name: t.name,
|
|
133
|
+
description: t.description,
|
|
134
|
+
parameters: t.input_schema,
|
|
135
|
+
},
|
|
136
|
+
}));
|
|
137
|
+
let response;
|
|
138
|
+
const maxRetries = 5;
|
|
139
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
140
|
+
await waitIfNeeded(signal);
|
|
141
|
+
try {
|
|
142
|
+
response = await this.client.chat.completions.create({
|
|
143
|
+
model: this.model,
|
|
144
|
+
messages: openaiMessages,
|
|
145
|
+
tools: openaiTools,
|
|
146
|
+
}, signal ? { signal } : undefined);
|
|
147
|
+
reportSuccess();
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
if (signal?.aborted)
|
|
152
|
+
throw err;
|
|
153
|
+
// Credits exhausted — don't retry, throw immediately with clear message
|
|
154
|
+
const creditsReason = detectCreditsExhausted(err);
|
|
155
|
+
if (creditsReason) {
|
|
156
|
+
const freeHint = this.name === 'zai'
|
|
157
|
+
? ' Switch to a free model: /model → glm-4.7-flash or glm-4.5-flash'
|
|
158
|
+
: '';
|
|
159
|
+
throw new Error(`\u274C ${creditsReason}.${freeHint}`);
|
|
160
|
+
}
|
|
161
|
+
if (isRateLimitError(err)) {
|
|
162
|
+
const waitMs = handleRateLimitError(err);
|
|
163
|
+
if (attempt < maxRetries) {
|
|
164
|
+
process.stdout.write(`\r\x1b[K \u23F3 Rate limited \u2014 waiting ${Math.ceil(waitMs / 1000)}s (attempt ${attempt + 1}/${maxRetries})...`);
|
|
165
|
+
await new Promise((resolve, reject) => {
|
|
166
|
+
const timer = setTimeout(resolve, waitMs);
|
|
167
|
+
signal?.addEventListener('abort', () => { clearTimeout(timer); reject(new Error('Aborted')); }, { once: true });
|
|
168
|
+
});
|
|
169
|
+
process.stdout.write('\r\x1b[K');
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!response)
|
|
177
|
+
throw new Error('Max retries exceeded');
|
|
178
|
+
const choice = response.choices[0];
|
|
179
|
+
const content = [];
|
|
180
|
+
// Capture reasoning_content from DeepSeek-R1 models (chain-of-thought)
|
|
181
|
+
// Must capture even empty strings — DeepSeek requires this field on ALL assistant messages
|
|
182
|
+
const rawMessage = choice.message;
|
|
183
|
+
if (rawMessage.reasoning_content !== undefined && rawMessage.reasoning_content !== null) {
|
|
184
|
+
content.push({ type: 'reasoning', text: String(rawMessage.reasoning_content) });
|
|
185
|
+
}
|
|
186
|
+
else if (this.isReasonerModel()) {
|
|
187
|
+
// Reasoner models MUST have this field — insert empty marker
|
|
188
|
+
content.push({ type: 'reasoning', text: '' });
|
|
189
|
+
}
|
|
190
|
+
if (choice.message.content) {
|
|
191
|
+
content.push({ type: 'text', text: choice.message.content });
|
|
192
|
+
}
|
|
193
|
+
if (choice.message.tool_calls) {
|
|
194
|
+
for (const tc of choice.message.tool_calls) {
|
|
195
|
+
let input;
|
|
196
|
+
try {
|
|
197
|
+
input = JSON.parse(tc.function.arguments);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Truncated JSON (model hit max_tokens mid-argument) — attempt repair
|
|
201
|
+
input = repairTruncatedJSON(tc.function.arguments);
|
|
202
|
+
}
|
|
203
|
+
content.push({
|
|
204
|
+
type: 'tool_use',
|
|
205
|
+
id: tc.id,
|
|
206
|
+
name: tc.function.name,
|
|
207
|
+
input,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Map OpenAI finish_reason to our stop_reason
|
|
212
|
+
const stopReason = choice.finish_reason === 'tool_calls'
|
|
213
|
+
? 'tool_use'
|
|
214
|
+
: choice.finish_reason === 'length'
|
|
215
|
+
? 'max_tokens'
|
|
216
|
+
: 'end_turn';
|
|
217
|
+
return {
|
|
218
|
+
content,
|
|
219
|
+
stop_reason: stopReason,
|
|
220
|
+
usage: response.usage ? {
|
|
221
|
+
input_tokens: response.usage.prompt_tokens ?? 0,
|
|
222
|
+
output_tokens: response.usage.completion_tokens ?? 0,
|
|
223
|
+
} : undefined,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Attempt to repair truncated JSON from a model that hit max_tokens.
|
|
229
|
+
* Tries progressively more aggressive fixes:
|
|
230
|
+
* 1. Close open strings and braces
|
|
231
|
+
* 2. Return a minimal error object if unfixable
|
|
232
|
+
*/
|
|
233
|
+
function repairTruncatedJSON(raw) {
|
|
234
|
+
// Try closing open strings and brackets
|
|
235
|
+
let attempt = raw;
|
|
236
|
+
// Count open/close braces and brackets
|
|
237
|
+
let openBraces = 0;
|
|
238
|
+
let openBrackets = 0;
|
|
239
|
+
let inString = false;
|
|
240
|
+
let escaped = false;
|
|
241
|
+
for (const ch of attempt) {
|
|
242
|
+
if (escaped) {
|
|
243
|
+
escaped = false;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (ch === '\\') {
|
|
247
|
+
escaped = true;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (ch === '"') {
|
|
251
|
+
inString = !inString;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (inString)
|
|
255
|
+
continue;
|
|
256
|
+
if (ch === '{')
|
|
257
|
+
openBraces++;
|
|
258
|
+
if (ch === '}')
|
|
259
|
+
openBraces--;
|
|
260
|
+
if (ch === '[')
|
|
261
|
+
openBrackets++;
|
|
262
|
+
if (ch === ']')
|
|
263
|
+
openBrackets--;
|
|
264
|
+
}
|
|
265
|
+
// If we're inside a string, close it
|
|
266
|
+
if (inString)
|
|
267
|
+
attempt += '"';
|
|
268
|
+
// Remove trailing comma if present
|
|
269
|
+
attempt = attempt.replace(/,\s*$/, '');
|
|
270
|
+
// Close open brackets and braces
|
|
271
|
+
for (let i = 0; i < openBrackets; i++)
|
|
272
|
+
attempt += ']';
|
|
273
|
+
for (let i = 0; i < openBraces; i++)
|
|
274
|
+
attempt += '}';
|
|
275
|
+
try {
|
|
276
|
+
return JSON.parse(attempt);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// Last resort: return a marker object so the agent loop can handle it
|
|
280
|
+
return { _truncated: true, _raw: raw.slice(0, 200) };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/cli/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent rate limiter with exponential backoff and proactive throttling.
|
|
3
|
+
* Tracks API call timing, parses retry-after headers from errors,
|
|
4
|
+
* and preemptively delays when approaching rate limits.
|
|
5
|
+
*/
|
|
6
|
+
export interface RateLimitState {
|
|
7
|
+
/** Timestamps of recent API calls (ms) */
|
|
8
|
+
callTimestamps: number[];
|
|
9
|
+
/** When we can next make a call (ms, 0 = no limit) */
|
|
10
|
+
nextAllowedAt: number;
|
|
11
|
+
/** Current backoff level (resets on success) */
|
|
12
|
+
backoffLevel: number;
|
|
13
|
+
/** Total retries this session */
|
|
14
|
+
totalRetries: number;
|
|
15
|
+
}
|
|
16
|
+
/** Listener for rate limit wait events */
|
|
17
|
+
type WaitListener = (waitMs: number, reason: string) => void;
|
|
18
|
+
/** Register a listener for rate limit wait events */
|
|
19
|
+
export declare function onRateLimitWait(listener: WaitListener): void;
|
|
20
|
+
/**
|
|
21
|
+
* Wait if needed before making an API call.
|
|
22
|
+
* Call this BEFORE every LLM API request.
|
|
23
|
+
* Returns the actual wait time in ms (0 if no wait needed).
|
|
24
|
+
*/
|
|
25
|
+
export declare function waitIfNeeded(signal?: AbortSignal): Promise<number>;
|
|
26
|
+
/**
|
|
27
|
+
* Report a successful API call. Resets backoff.
|
|
28
|
+
*/
|
|
29
|
+
export declare function reportSuccess(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Handle a rate limit error. Parses retry-after and applies backoff.
|
|
32
|
+
* Returns the recommended wait time in ms.
|
|
33
|
+
*/
|
|
34
|
+
export declare function handleRateLimitError(error: unknown): number;
|
|
35
|
+
/**
|
|
36
|
+
* Check if an error is a rate limit error (429).
|
|
37
|
+
*/
|
|
38
|
+
export declare function isRateLimitError(error: unknown): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Check if an error indicates exhausted credits/balance (402/403).
|
|
41
|
+
* Returns a human-readable reason if detected, null otherwise.
|
|
42
|
+
*/
|
|
43
|
+
export declare function detectCreditsExhausted(error: unknown): string | null;
|
|
44
|
+
/** Get current rate limiter stats */
|
|
45
|
+
export declare function getRateLimitStats(): {
|
|
46
|
+
callsInWindow: number;
|
|
47
|
+
backoffLevel: number;
|
|
48
|
+
totalRetries: number;
|
|
49
|
+
};
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAqBD,0CAA0C;AAC1C,KAAK,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAG7D,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE5D;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDxE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiC3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkBpE;AAED,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAQzG"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent rate limiter with exponential backoff and proactive throttling.
|
|
3
|
+
* Tracks API call timing, parses retry-after headers from errors,
|
|
4
|
+
* and preemptively delays when approaching rate limits.
|
|
5
|
+
*/
|
|
6
|
+
/** Backoff delays in ms: 2s, 5s, 10s, 20s, 30s, 60s */
|
|
7
|
+
const BACKOFF_DELAYS = [2000, 5000, 10000, 20000, 30000, 60000];
|
|
8
|
+
/** Window size for tracking calls (60 seconds) */
|
|
9
|
+
const WINDOW_MS = 60_000;
|
|
10
|
+
/** Max calls per window before proactive throttling */
|
|
11
|
+
const PROACTIVE_THRESHOLD = 25;
|
|
12
|
+
/** Minimum gap between calls in ms (prevents burst) */
|
|
13
|
+
const MIN_GAP_MS = 500;
|
|
14
|
+
let state = {
|
|
15
|
+
callTimestamps: [],
|
|
16
|
+
nextAllowedAt: 0,
|
|
17
|
+
backoffLevel: 0,
|
|
18
|
+
totalRetries: 0,
|
|
19
|
+
};
|
|
20
|
+
let onWait = null;
|
|
21
|
+
/** Register a listener for rate limit wait events */
|
|
22
|
+
export function onRateLimitWait(listener) {
|
|
23
|
+
onWait = listener;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wait if needed before making an API call.
|
|
27
|
+
* Call this BEFORE every LLM API request.
|
|
28
|
+
* Returns the actual wait time in ms (0 if no wait needed).
|
|
29
|
+
*/
|
|
30
|
+
export async function waitIfNeeded(signal) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
// Clean old timestamps outside the window
|
|
33
|
+
state.callTimestamps = state.callTimestamps.filter(t => now - t < WINDOW_MS);
|
|
34
|
+
let waitMs = 0;
|
|
35
|
+
let reason = '';
|
|
36
|
+
// 1. Hard limit from previous rate limit error
|
|
37
|
+
if (state.nextAllowedAt > now) {
|
|
38
|
+
waitMs = state.nextAllowedAt - now;
|
|
39
|
+
reason = 'rate limit cooldown';
|
|
40
|
+
}
|
|
41
|
+
// 2. Proactive throttling: if approaching rate limit within window
|
|
42
|
+
if (waitMs === 0 && state.callTimestamps.length >= PROACTIVE_THRESHOLD) {
|
|
43
|
+
// Calculate average gap needed to spread calls evenly
|
|
44
|
+
const oldest = state.callTimestamps[0];
|
|
45
|
+
const elapsed = now - oldest;
|
|
46
|
+
const avgGap = elapsed / state.callTimestamps.length;
|
|
47
|
+
const neededGap = WINDOW_MS / PROACTIVE_THRESHOLD;
|
|
48
|
+
if (avgGap < neededGap) {
|
|
49
|
+
waitMs = Math.min(neededGap - avgGap, 5000);
|
|
50
|
+
reason = 'proactive throttle';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 3. Minimum gap between calls
|
|
54
|
+
if (waitMs === 0 && state.callTimestamps.length > 0) {
|
|
55
|
+
const lastCall = state.callTimestamps[state.callTimestamps.length - 1];
|
|
56
|
+
const gap = now - lastCall;
|
|
57
|
+
if (gap < MIN_GAP_MS) {
|
|
58
|
+
waitMs = MIN_GAP_MS - gap;
|
|
59
|
+
reason = 'min gap';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (waitMs > 0) {
|
|
63
|
+
onWait?.(waitMs, reason);
|
|
64
|
+
await sleep(waitMs, signal);
|
|
65
|
+
}
|
|
66
|
+
// Record this call
|
|
67
|
+
state.callTimestamps.push(Date.now());
|
|
68
|
+
return waitMs;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Report a successful API call. Resets backoff.
|
|
72
|
+
*/
|
|
73
|
+
export function reportSuccess() {
|
|
74
|
+
state.backoffLevel = 0;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handle a rate limit error. Parses retry-after and applies backoff.
|
|
78
|
+
* Returns the recommended wait time in ms.
|
|
79
|
+
*/
|
|
80
|
+
export function handleRateLimitError(error) {
|
|
81
|
+
state.totalRetries++;
|
|
82
|
+
// Try to parse retry-after from error message or headers
|
|
83
|
+
let retryAfterMs = 0;
|
|
84
|
+
if (error instanceof Error) {
|
|
85
|
+
const msg = error.message;
|
|
86
|
+
// Parse "retry-after" seconds from error body
|
|
87
|
+
const retryMatch = msg.match(/retry.?after[:\s]*(\d+)/i);
|
|
88
|
+
if (retryMatch) {
|
|
89
|
+
retryAfterMs = parseInt(retryMatch[1], 10) * 1000;
|
|
90
|
+
}
|
|
91
|
+
// Parse Anthropic-specific rate limit info
|
|
92
|
+
const tokenMatch = msg.match(/(\d+[,.]?\d*)\s*input tokens per minute/i);
|
|
93
|
+
if (tokenMatch && !retryAfterMs) {
|
|
94
|
+
// Wait proportional to the window — typically 30-60s
|
|
95
|
+
retryAfterMs = 30_000;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Apply exponential backoff if no retry-after
|
|
99
|
+
if (retryAfterMs === 0) {
|
|
100
|
+
const level = Math.min(state.backoffLevel, BACKOFF_DELAYS.length - 1);
|
|
101
|
+
retryAfterMs = BACKOFF_DELAYS[level];
|
|
102
|
+
}
|
|
103
|
+
state.backoffLevel++;
|
|
104
|
+
state.nextAllowedAt = Date.now() + retryAfterMs;
|
|
105
|
+
return retryAfterMs;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if an error is a rate limit error (429).
|
|
109
|
+
*/
|
|
110
|
+
export function isRateLimitError(error) {
|
|
111
|
+
if (!(error instanceof Error))
|
|
112
|
+
return false;
|
|
113
|
+
const msg = error.message.toLowerCase();
|
|
114
|
+
return msg.includes('429') ||
|
|
115
|
+
msg.includes('rate_limit') ||
|
|
116
|
+
msg.includes('rate limit') ||
|
|
117
|
+
msg.includes('too many requests');
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if an error indicates exhausted credits/balance (402/403).
|
|
121
|
+
* Returns a human-readable reason if detected, null otherwise.
|
|
122
|
+
*/
|
|
123
|
+
export function detectCreditsExhausted(error) {
|
|
124
|
+
if (!(error instanceof Error))
|
|
125
|
+
return null;
|
|
126
|
+
const msg = error.message.toLowerCase();
|
|
127
|
+
// HTTP 402 Payment Required
|
|
128
|
+
if (msg.includes('402'))
|
|
129
|
+
return 'Credits balance is 0 — payment required';
|
|
130
|
+
// Common API error patterns for exhausted credits
|
|
131
|
+
if (msg.includes('insufficient') && (msg.includes('balance') || msg.includes('credit') || msg.includes('quota') || msg.includes('fund')))
|
|
132
|
+
return 'Insufficient credits balance';
|
|
133
|
+
if (msg.includes('quota') && msg.includes('exceed'))
|
|
134
|
+
return 'API quota exceeded';
|
|
135
|
+
if (msg.includes('billing') || msg.includes('payment'))
|
|
136
|
+
return 'Billing/payment issue — check your account';
|
|
137
|
+
if (msg.includes('403') && (msg.includes('denied') || msg.includes('forbidden')))
|
|
138
|
+
return 'Access denied — API key may be invalid or credits exhausted';
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/** Get current rate limiter stats */
|
|
142
|
+
export function getRateLimitStats() {
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
state.callTimestamps = state.callTimestamps.filter(t => now - t < WINDOW_MS);
|
|
145
|
+
return {
|
|
146
|
+
callsInWindow: state.callTimestamps.length,
|
|
147
|
+
backoffLevel: state.backoffLevel,
|
|
148
|
+
totalRetries: state.totalRetries,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function sleep(ms, signal) {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
if (signal?.aborted) {
|
|
154
|
+
reject(new Error('Aborted'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const timer = setTimeout(resolve, ms);
|
|
158
|
+
signal?.addEventListener('abort', () => {
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
reject(new Error('Aborted'));
|
|
161
|
+
}, { once: true });
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/cli/providers/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LLMProvider } from './types.js';
|
|
2
|
+
/** Known providers with their base URLs and default models */
|
|
3
|
+
export declare const KNOWN_PROVIDERS: Record<string, {
|
|
4
|
+
type: 'anthropic' | 'openai-compatible';
|
|
5
|
+
baseURL?: string;
|
|
6
|
+
models: string[];
|
|
7
|
+
defaultModel: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function createProvider(provider: string, apiKey: string, model: string, baseURL?: string): LLMProvider;
|
|
10
|
+
/** Get all known provider names */
|
|
11
|
+
export declare function getProviderNames(): string[];
|
|
12
|
+
/** Models that are completely free to use (no cost per token) */
|
|
13
|
+
export declare const FREE_MODELS: Set<string>;
|
|
14
|
+
/** Check if a model is free */
|
|
15
|
+
export declare function isModelFree(model: string): boolean;
|
|
16
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAC3C,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAwEA,CAAC;AAEF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,iEAAiE;AACjE,eAAO,MAAM,WAAW,aAGtB,CAAC;AAEH,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { AnthropicProvider } from './anthropic.js';
|
|
2
|
+
import { OpenAIProvider } from './openai.js';
|
|
3
|
+
/** Known providers with their base URLs and default models */
|
|
4
|
+
export const KNOWN_PROVIDERS = {
|
|
5
|
+
anthropic: {
|
|
6
|
+
type: 'anthropic',
|
|
7
|
+
models: ['claude-sonnet-4-6', 'claude-opus-4-6', 'claude-haiku-4-5-20251001'],
|
|
8
|
+
defaultModel: 'claude-sonnet-4-6',
|
|
9
|
+
},
|
|
10
|
+
openai: {
|
|
11
|
+
type: 'openai-compatible',
|
|
12
|
+
models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o1-mini', 'o3-mini'],
|
|
13
|
+
defaultModel: 'gpt-4o',
|
|
14
|
+
},
|
|
15
|
+
deepseek: {
|
|
16
|
+
type: 'openai-compatible',
|
|
17
|
+
baseURL: 'https://api.deepseek.com',
|
|
18
|
+
models: ['deepseek-chat', 'deepseek-reasoner'],
|
|
19
|
+
defaultModel: 'deepseek-chat',
|
|
20
|
+
},
|
|
21
|
+
groq: {
|
|
22
|
+
type: 'openai-compatible',
|
|
23
|
+
baseURL: 'https://api.groq.com/openai/v1',
|
|
24
|
+
models: ['llama-3.3-70b-versatile', 'llama-3.1-8b-instant', 'mixtral-8x7b-32768'],
|
|
25
|
+
defaultModel: 'llama-3.3-70b-versatile',
|
|
26
|
+
},
|
|
27
|
+
together: {
|
|
28
|
+
type: 'openai-compatible',
|
|
29
|
+
baseURL: 'https://api.together.xyz/v1',
|
|
30
|
+
models: ['meta-llama/Llama-3.3-70B-Instruct-Turbo', 'mistralai/Mixtral-8x22B-Instruct-v0.1'],
|
|
31
|
+
defaultModel: 'meta-llama/Llama-3.3-70B-Instruct-Turbo',
|
|
32
|
+
},
|
|
33
|
+
ollama: {
|
|
34
|
+
type: 'openai-compatible',
|
|
35
|
+
baseURL: 'http://localhost:11434/v1',
|
|
36
|
+
models: [
|
|
37
|
+
'qwen3-coder:30b',
|
|
38
|
+
'qwen2.5-coder:32b',
|
|
39
|
+
'qwen2.5-coder:14b',
|
|
40
|
+
'qwen2.5-coder:7b',
|
|
41
|
+
'deepseek-r1:32b',
|
|
42
|
+
'deepseek-r1:14b',
|
|
43
|
+
'deepseek-coder-v2:16b',
|
|
44
|
+
'llama3.3',
|
|
45
|
+
'codellama:34b',
|
|
46
|
+
],
|
|
47
|
+
defaultModel: 'qwen2.5-coder:32b',
|
|
48
|
+
},
|
|
49
|
+
zai: {
|
|
50
|
+
type: 'openai-compatible',
|
|
51
|
+
baseURL: 'https://api.z.ai/api/paas/v4',
|
|
52
|
+
models: [
|
|
53
|
+
// Premium
|
|
54
|
+
'glm-5',
|
|
55
|
+
'glm-5-code',
|
|
56
|
+
// Standard
|
|
57
|
+
'glm-4.7',
|
|
58
|
+
'glm-4.7-flashx',
|
|
59
|
+
'glm-4.6',
|
|
60
|
+
'glm-4.5',
|
|
61
|
+
'glm-4.5-x',
|
|
62
|
+
'glm-4.5-air',
|
|
63
|
+
'glm-4.5-airx',
|
|
64
|
+
// Free
|
|
65
|
+
'glm-4.7-flash',
|
|
66
|
+
'glm-4.5-flash',
|
|
67
|
+
],
|
|
68
|
+
defaultModel: 'glm-5',
|
|
69
|
+
},
|
|
70
|
+
openrouter: {
|
|
71
|
+
type: 'openai-compatible',
|
|
72
|
+
baseURL: 'https://openrouter.ai/api/v1',
|
|
73
|
+
models: ['anthropic/claude-sonnet-4', 'openai/gpt-4o', 'google/gemini-2.0-flash-exp'],
|
|
74
|
+
defaultModel: 'anthropic/claude-sonnet-4',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
export function createProvider(provider, apiKey, model, baseURL) {
|
|
78
|
+
const known = KNOWN_PROVIDERS[provider];
|
|
79
|
+
if (provider === 'anthropic') {
|
|
80
|
+
return new AnthropicProvider(apiKey, model);
|
|
81
|
+
}
|
|
82
|
+
// All other providers use OpenAI-compatible client
|
|
83
|
+
const url = baseURL ?? known?.baseURL;
|
|
84
|
+
return new OpenAIProvider(apiKey, model, url, provider);
|
|
85
|
+
}
|
|
86
|
+
/** Get all known provider names */
|
|
87
|
+
export function getProviderNames() {
|
|
88
|
+
return Object.keys(KNOWN_PROVIDERS);
|
|
89
|
+
}
|
|
90
|
+
/** Models that are completely free to use (no cost per token) */
|
|
91
|
+
export const FREE_MODELS = new Set([
|
|
92
|
+
'glm-4.7-flash',
|
|
93
|
+
'glm-4.5-flash',
|
|
94
|
+
]);
|
|
95
|
+
/** Check if a model is free */
|
|
96
|
+
export function isModelFree(model) {
|
|
97
|
+
return FREE_MODELS.has(model);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAKvB;IACH,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,2BAA2B,CAAC;QAC7E,YAAY,EAAE,mBAAmB;KAClC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC;QAC5E,YAAY,EAAE,QAAQ;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,CAAC,eAAe,EAAE,mBAAmB,CAAC;QAC9C,YAAY,EAAE,eAAe;KAC9B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,gCAAgC;QACzC,MAAM,EAAE,CAAC,yBAAyB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;QACjF,YAAY,EAAE,yBAAyB;KACxC;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,6BAA6B;QACtC,MAAM,EAAE,CAAC,yCAAyC,EAAE,uCAAuC,CAAC;QAC5F,YAAY,EAAE,yCAAyC;KACxD;IACD,MAAM,EAAE;QACN,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,2BAA2B;QACpC,MAAM,EAAE;YACN,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;YAClB,iBAAiB;YACjB,iBAAiB;YACjB,uBAAuB;YACvB,UAAU;YACV,eAAe;SAChB;QACD,YAAY,EAAE,mBAAmB;KAClC;IACD,GAAG,EAAE;QACH,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE;YACN,UAAU;YACV,OAAO;YACP,YAAY;YACZ,WAAW;YACX,SAAS;YACT,gBAAgB;YAChB,SAAS;YACT,SAAS;YACT,WAAW;YACX,aAAa;YACb,cAAc;YACd,OAAO;YACP,eAAe;YACf,eAAe;SAChB;QACD,YAAY,EAAE,OAAO;KACtB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,CAAC,2BAA2B,EAAE,eAAe,EAAE,6BAA6B,CAAC;QACrF,YAAY,EAAE,2BAA2B;KAC1C;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,MAAc,EACd,KAAa,EACb,OAAgB;IAEhB,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,mDAAmD;IACnD,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC;IACtC,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,eAAe;IACf,eAAe;CAChB,CAAC,CAAC;AAEH,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|