beth-copilot 1.0.18 → 2.0.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.
- package/CHANGELOG.md +79 -28
- package/README.md +127 -298
- package/assets/beth-questioning.png +0 -0
- package/assets/yellowstone-beth.png +0 -0
- package/bin/cli.js +124 -715
- package/dist/__tests__/inject-skills.test.d.ts +9 -0
- package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
- package/dist/__tests__/inject-skills.test.js +143 -0
- package/dist/__tests__/inject-skills.test.js.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.js +192 -0
- package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.js +173 -0
- package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
- package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
- package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.js +723 -0
- package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
- package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +62 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/verify-skills.test.d.ts +9 -0
- package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
- package/dist/__tests__/verify-skills.test.js +78 -0
- package/dist/__tests__/verify-skills.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +15 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +585 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +54 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +11 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +71 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +95 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +13 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +254 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +7 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.e2e.test.js +3 -59
- package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
- package/dist/cli/commands/doctor.js +38 -18
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +32 -25
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +118 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +5 -9
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +315 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/init.test.js +4 -21
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/land.d.ts +130 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +592 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +19 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +567 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +24 -31
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +28 -31
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +74 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +212 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +14 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +314 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +152 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts +0 -1
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +9 -83
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +8 -129
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts +35 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.d.ts +24 -0
- package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.js +240 -0
- package/dist/cli/commands/update.e2e.test.js.map +1 -0
- package/dist/cli/commands/update.js +255 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/core/agents/frontmatter.test.js +1 -1
- package/dist/core/agents/frontmatter.test.js.map +1 -1
- package/dist/core/agents/handoffs.test.js +1 -1
- package/dist/core/agents/handoffs.test.js.map +1 -1
- package/dist/core/agents/loader.d.ts +4 -2
- package/dist/core/agents/loader.d.ts.map +1 -1
- package/dist/core/agents/loader.js +5 -3
- package/dist/core/agents/loader.js.map +1 -1
- package/dist/core/agents/loader.test.js +42 -4
- package/dist/core/agents/loader.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +12 -9
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +15 -9
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/core/agents/types.test.js +1 -1
- package/dist/core/agents/types.test.js.map +1 -1
- package/dist/core/skills/loader.test.js +1 -1
- package/dist/core/skills/loader.test.js.map +1 -1
- package/dist/index.d.ts +3 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/pathValidation.d.ts +0 -5
- package/dist/lib/pathValidation.d.ts.map +1 -1
- package/dist/lib/pathValidation.js +0 -11
- package/dist/lib/pathValidation.js.map +1 -1
- package/dist/lib/pathValidation.test.js +2 -14
- package/dist/lib/pathValidation.test.js.map +1 -1
- package/package.json +13 -10
- package/sbom.json +1927 -847
- package/templates/.github/agents/beth.agent.md +331 -105
- package/templates/.github/agents/developer.agent.md +73 -102
- package/templates/.github/agents/product-manager.agent.md +24 -68
- package/templates/.github/agents/researcher.agent.md +21 -69
- package/templates/.github/agents/security-reviewer.agent.md +39 -82
- package/templates/.github/agents/tester.agent.md +44 -65
- package/templates/.github/agents/ux-designer.agent.md +25 -76
- package/templates/.github/copilot-instructions.md +246 -225
- package/templates/.github/copilot-mcp-config.json +12 -0
- package/templates/.github/dependabot.yml +68 -0
- package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
- package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
- package/templates/.github/hooks/skill-enforcement.json +18 -0
- package/templates/.github/pull_request_template.md +48 -0
- package/templates/.github/skills/framer-components/SKILL.md +0 -0
- package/templates/.github/skills/prd/SKILL.md +0 -0
- package/templates/.github/skills/security-analysis/SKILL.md +798 -798
- package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
- package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
- package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
- package/templates/.vscode/settings.json +16 -16
- package/templates/AGENTS.md +103 -54
- package/templates/Backlog.md +80 -80
- package/templates/mcp.json.example +0 -3
- package/assets/beth-portrait-small.txt +0 -13
- package/assets/beth-portrait.txt +0 -60
- package/bin/beth-animation.sh +0 -155
- package/bin/lib/animation.js +0 -189
- package/bin/lib/pathValidation.js +0 -233
- package/bin/lib/pathValidation.test.js +0 -280
- package/dist/cli/commands/client-config.d.ts +0 -31
- package/dist/cli/commands/client-config.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
- package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.js +0 -556
- package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
- package/dist/cli/commands/client-config.js +0 -73
- package/dist/cli/commands/client-config.js.map +0 -1
- package/dist/cli/commands/client-config.test.d.ts +0 -6
- package/dist/cli/commands/client-config.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.test.js +0 -133
- package/dist/cli/commands/client-config.test.js.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
- package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- package/dist/tools/types.test.js.map +0 -1
- package/templates/.vscode/mcp.json +0 -20
- package/templates/CLAUDE.md +0 -129
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM Provider Interface
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class and interfaces for LLM provider implementations.
|
|
5
|
-
* Designed to be provider-agnostic, enabling support for Azure OpenAI,
|
|
6
|
-
* Claude, Ollama, and other providers.
|
|
7
|
-
*/
|
|
8
|
-
// =============================================================================
|
|
9
|
-
// Provider Interface
|
|
10
|
-
// =============================================================================
|
|
11
|
-
/**
|
|
12
|
-
* Abstract base class for LLM provider implementations.
|
|
13
|
-
*
|
|
14
|
-
* Provides a unified interface for interacting with different LLM providers.
|
|
15
|
-
* Concrete implementations handle provider-specific API details while
|
|
16
|
-
* conforming to this common contract.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* class AzureOpenAIProvider extends LLMProviderBase {
|
|
21
|
-
* get name() { return 'azure-openai'; }
|
|
22
|
-
* get isConfigured() { return !!this.config.apiKey; }
|
|
23
|
-
*
|
|
24
|
-
* async chat(messages, options) {
|
|
25
|
-
* // Azure-specific implementation
|
|
26
|
-
* }
|
|
27
|
-
*
|
|
28
|
-
* async *chatStream(messages, options) {
|
|
29
|
-
* // Azure-specific streaming implementation
|
|
30
|
-
* }
|
|
31
|
-
*
|
|
32
|
-
* async countTokens(messages) {
|
|
33
|
-
* // Token counting implementation
|
|
34
|
-
* }
|
|
35
|
-
* }
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export class LLMProviderBase {
|
|
39
|
-
/** Provider configuration */
|
|
40
|
-
config;
|
|
41
|
-
/**
|
|
42
|
-
* Create a new provider instance.
|
|
43
|
-
*
|
|
44
|
-
* @param config - Provider configuration including credentials and model settings
|
|
45
|
-
*/
|
|
46
|
-
constructor(config) {
|
|
47
|
-
this.config = config;
|
|
48
|
-
}
|
|
49
|
-
// ===========================================================================
|
|
50
|
-
// Utility Methods
|
|
51
|
-
// ===========================================================================
|
|
52
|
-
/**
|
|
53
|
-
* Get the configured model name or deployment.
|
|
54
|
-
*
|
|
55
|
-
* Returns the model specified in the provider configuration.
|
|
56
|
-
*/
|
|
57
|
-
get model() {
|
|
58
|
-
return this.config.model;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Get a redacted summary of the configuration for logging.
|
|
62
|
-
*
|
|
63
|
-
* Returns configuration information safe for logging, with
|
|
64
|
-
* sensitive values (endpoints) masked. Credential type is shown
|
|
65
|
-
* but no secrets are exposed.
|
|
66
|
-
*/
|
|
67
|
-
getConfigSummary() {
|
|
68
|
-
return {
|
|
69
|
-
provider: this.name,
|
|
70
|
-
model: this.config.model,
|
|
71
|
-
endpoint: this.maskEndpoint(this.config.endpoint),
|
|
72
|
-
auth: 'Entra ID (TokenCredential)',
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Mask an endpoint URL for safe logging.
|
|
77
|
-
*
|
|
78
|
-
* Preserves the host but masks path segments to avoid leaking
|
|
79
|
-
* deployment names or resource identifiers.
|
|
80
|
-
*
|
|
81
|
-
* @param endpoint - Full endpoint URL
|
|
82
|
-
* @returns Masked endpoint safe for logging
|
|
83
|
-
*/
|
|
84
|
-
maskEndpoint(endpoint) {
|
|
85
|
-
try {
|
|
86
|
-
const url = new URL(endpoint);
|
|
87
|
-
return `${url.protocol}//${url.host}/***`;
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
return '(invalid url)';
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=interface.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2CH,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAgB,eAAe;IACnC,6BAA6B;IACV,MAAM,CAAY;IAErC;;;;OAIG;IACH,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IA2GD,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;OAIG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB;QACd,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjD,IAAI,EAAE,4BAA4B;SACnC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry Utility for LLM API Calls
|
|
3
|
-
*
|
|
4
|
-
* Provides exponential backoff retry logic with jitter for handling
|
|
5
|
-
* transient errors in LLM API calls. Designed to prevent thundering herd
|
|
6
|
-
* problems and gracefully handle rate limits and temporary failures.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Options for configuring retry behavior.
|
|
10
|
-
*/
|
|
11
|
-
export interface RetryOptions {
|
|
12
|
-
/** Maximum number of retry attempts (default: 3) */
|
|
13
|
-
maxRetries?: number;
|
|
14
|
-
/** Base delay in milliseconds before first retry (default: 1000) */
|
|
15
|
-
baseDelay?: number;
|
|
16
|
-
/** Maximum delay in milliseconds between retries (default: 30000) */
|
|
17
|
-
maxDelay?: number;
|
|
18
|
-
/** Whether to add randomized jitter to prevent thundering herd (default: true) */
|
|
19
|
-
jitter?: boolean;
|
|
20
|
-
/** HTTP status codes that should trigger a retry (default: [429, 500, 502, 503, 504]) */
|
|
21
|
-
retryableStatuses?: number[];
|
|
22
|
-
/** Optional callback invoked before each retry attempt */
|
|
23
|
-
onRetry?: (error: Error, attempt: number, delay: number) => void;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Error thrown when all retry attempts have been exhausted.
|
|
27
|
-
*/
|
|
28
|
-
export declare class RetryError extends Error {
|
|
29
|
-
/** Number of attempts made before giving up */
|
|
30
|
-
readonly attempts: number;
|
|
31
|
-
/** The last error that caused the final retry to fail */
|
|
32
|
-
readonly lastError: Error;
|
|
33
|
-
/**
|
|
34
|
-
* Create a new RetryError
|
|
35
|
-
* @param message - Human-readable error message
|
|
36
|
-
* @param attempts - Number of retry attempts made
|
|
37
|
-
* @param lastError - The error from the final attempt
|
|
38
|
-
*/
|
|
39
|
-
constructor(message: string, attempts: number, lastError: Error);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Calculate the delay before the next retry attempt.
|
|
43
|
-
*
|
|
44
|
-
* Uses exponential backoff: `baseDelay * 2^attempt`, capped at `maxDelay`.
|
|
45
|
-
* When jitter is enabled, multiplies by a random factor between 0.5 and 1.5.
|
|
46
|
-
*
|
|
47
|
-
* @param attempt - Zero-based attempt number (0 = first retry)
|
|
48
|
-
* @param baseDelay - Base delay in milliseconds
|
|
49
|
-
* @param maxDelay - Maximum delay cap in milliseconds
|
|
50
|
-
* @param jitter - Whether to apply random jitter
|
|
51
|
-
* @returns Calculated delay in milliseconds
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* // First retry, base 1000ms, no jitter
|
|
56
|
-
* calculateDelay(0, 1000, 30000, false); // 1000
|
|
57
|
-
*
|
|
58
|
-
* // Second retry, base 1000ms, no jitter
|
|
59
|
-
* calculateDelay(1, 1000, 30000, false); // 2000
|
|
60
|
-
*
|
|
61
|
-
* // With jitter, result varies between 500-1500 for first retry
|
|
62
|
-
* calculateDelay(0, 1000, 30000, true); // 500-1500
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
export declare function calculateDelay(attempt: number, baseDelay: number, maxDelay: number, jitter: boolean): number;
|
|
66
|
-
/**
|
|
67
|
-
* Determine if an error is transient and should be retried.
|
|
68
|
-
*
|
|
69
|
-
* Checks for:
|
|
70
|
-
* - HTTP status codes: 429 (rate limit), 500, 502, 503, 504 (server errors)
|
|
71
|
-
* - Network errors: ECONNRESET, ETIMEDOUT, ECONNREFUSED, etc.
|
|
72
|
-
*
|
|
73
|
-
* @param error - The error to check
|
|
74
|
-
* @param retryableStatuses - HTTP status codes considered retryable
|
|
75
|
-
* @returns True if the error is transient and should be retried
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* ```typescript
|
|
79
|
-
* // HTTP 429 Too Many Requests
|
|
80
|
-
* const rateLimitError = new Error('Rate limited');
|
|
81
|
-
* (rateLimitError as any).status = 429;
|
|
82
|
-
* isTransientError(rateLimitError); // true
|
|
83
|
-
*
|
|
84
|
-
* // Network error
|
|
85
|
-
* const networkError = new Error('Connection reset');
|
|
86
|
-
* (networkError as any).code = 'ECONNRESET';
|
|
87
|
-
* isTransientError(networkError); // true
|
|
88
|
-
*
|
|
89
|
-
* // Client error (not retryable)
|
|
90
|
-
* const clientError = new Error('Bad request');
|
|
91
|
-
* (clientError as any).status = 400;
|
|
92
|
-
* isTransientError(clientError); // false
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
export declare function isTransientError(error: Error, retryableStatuses?: number[]): boolean;
|
|
96
|
-
/**
|
|
97
|
-
* Execute an async function with automatic retry on transient failures.
|
|
98
|
-
*
|
|
99
|
-
* Uses exponential backoff with optional jitter to retry failed operations.
|
|
100
|
-
* Only retries on transient errors (rate limits, server errors, network issues).
|
|
101
|
-
*
|
|
102
|
-
* @typeParam T - The return type of the async function
|
|
103
|
-
* @param fn - The async function to execute
|
|
104
|
-
* @param options - Retry configuration options
|
|
105
|
-
* @returns The result of the successful function call
|
|
106
|
-
* @throws {RetryError} When all retry attempts are exhausted
|
|
107
|
-
* @throws {Error} When a non-transient error occurs
|
|
108
|
-
*
|
|
109
|
-
* @example
|
|
110
|
-
* ```typescript
|
|
111
|
-
* // Basic usage
|
|
112
|
-
* const result = await retry(() => fetchFromLLM(prompt));
|
|
113
|
-
*
|
|
114
|
-
* // With custom options
|
|
115
|
-
* const result = await retry(
|
|
116
|
-
* () => fetchFromLLM(prompt),
|
|
117
|
-
* {
|
|
118
|
-
* maxRetries: 5,
|
|
119
|
-
* baseDelay: 2000,
|
|
120
|
-
* onRetry: (error, attempt, delay) => {
|
|
121
|
-
* console.log(`Retry ${attempt} after ${delay}ms: ${error.message}`);
|
|
122
|
-
* }
|
|
123
|
-
* }
|
|
124
|
-
* );
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
128
|
-
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAE1B;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK;CAWhE;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GACd,MAAM,CAcR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,iBAAiB,GAAE,MAAM,EAA+B,GACvD,OAAO,CAgBT;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA4DZ"}
|
package/dist/providers/retry.js
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry Utility for LLM API Calls
|
|
3
|
-
*
|
|
4
|
-
* Provides exponential backoff retry logic with jitter for handling
|
|
5
|
-
* transient errors in LLM API calls. Designed to prevent thundering herd
|
|
6
|
-
* problems and gracefully handle rate limits and temporary failures.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Network error codes that indicate transient failures.
|
|
10
|
-
*/
|
|
11
|
-
const TRANSIENT_ERROR_CODES = new Set([
|
|
12
|
-
'ECONNRESET',
|
|
13
|
-
'ETIMEDOUT',
|
|
14
|
-
'ECONNREFUSED',
|
|
15
|
-
'ENOTFOUND',
|
|
16
|
-
'ENETUNREACH',
|
|
17
|
-
'EHOSTUNREACH',
|
|
18
|
-
'EPIPE',
|
|
19
|
-
'EAI_AGAIN',
|
|
20
|
-
]);
|
|
21
|
-
/**
|
|
22
|
-
* HTTP status codes that indicate retryable errors.
|
|
23
|
-
*/
|
|
24
|
-
const DEFAULT_RETRYABLE_STATUSES = [429, 500, 502, 503, 504];
|
|
25
|
-
/**
|
|
26
|
-
* Error thrown when all retry attempts have been exhausted.
|
|
27
|
-
*/
|
|
28
|
-
export class RetryError extends Error {
|
|
29
|
-
/** Number of attempts made before giving up */
|
|
30
|
-
attempts;
|
|
31
|
-
/** The last error that caused the final retry to fail */
|
|
32
|
-
lastError;
|
|
33
|
-
/**
|
|
34
|
-
* Create a new RetryError
|
|
35
|
-
* @param message - Human-readable error message
|
|
36
|
-
* @param attempts - Number of retry attempts made
|
|
37
|
-
* @param lastError - The error from the final attempt
|
|
38
|
-
*/
|
|
39
|
-
constructor(message, attempts, lastError) {
|
|
40
|
-
super(message);
|
|
41
|
-
this.name = 'RetryError';
|
|
42
|
-
this.attempts = attempts;
|
|
43
|
-
this.lastError = lastError;
|
|
44
|
-
// Maintain proper stack trace in V8 environments
|
|
45
|
-
if (Error.captureStackTrace) {
|
|
46
|
-
Error.captureStackTrace(this, RetryError);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Calculate the delay before the next retry attempt.
|
|
52
|
-
*
|
|
53
|
-
* Uses exponential backoff: `baseDelay * 2^attempt`, capped at `maxDelay`.
|
|
54
|
-
* When jitter is enabled, multiplies by a random factor between 0.5 and 1.5.
|
|
55
|
-
*
|
|
56
|
-
* @param attempt - Zero-based attempt number (0 = first retry)
|
|
57
|
-
* @param baseDelay - Base delay in milliseconds
|
|
58
|
-
* @param maxDelay - Maximum delay cap in milliseconds
|
|
59
|
-
* @param jitter - Whether to apply random jitter
|
|
60
|
-
* @returns Calculated delay in milliseconds
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* // First retry, base 1000ms, no jitter
|
|
65
|
-
* calculateDelay(0, 1000, 30000, false); // 1000
|
|
66
|
-
*
|
|
67
|
-
* // Second retry, base 1000ms, no jitter
|
|
68
|
-
* calculateDelay(1, 1000, 30000, false); // 2000
|
|
69
|
-
*
|
|
70
|
-
* // With jitter, result varies between 500-1500 for first retry
|
|
71
|
-
* calculateDelay(0, 1000, 30000, true); // 500-1500
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
export function calculateDelay(attempt, baseDelay, maxDelay, jitter) {
|
|
75
|
-
// Exponential backoff: baseDelay * 2^attempt
|
|
76
|
-
const exponentialDelay = baseDelay * Math.pow(2, attempt);
|
|
77
|
-
// Cap at maxDelay
|
|
78
|
-
const cappedDelay = Math.min(exponentialDelay, maxDelay);
|
|
79
|
-
// Apply jitter: multiply by random factor between 0.5 and 1.5
|
|
80
|
-
if (jitter) {
|
|
81
|
-
const jitterFactor = 0.5 + Math.random();
|
|
82
|
-
return Math.floor(cappedDelay * jitterFactor);
|
|
83
|
-
}
|
|
84
|
-
return cappedDelay;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Determine if an error is transient and should be retried.
|
|
88
|
-
*
|
|
89
|
-
* Checks for:
|
|
90
|
-
* - HTTP status codes: 429 (rate limit), 500, 502, 503, 504 (server errors)
|
|
91
|
-
* - Network errors: ECONNRESET, ETIMEDOUT, ECONNREFUSED, etc.
|
|
92
|
-
*
|
|
93
|
-
* @param error - The error to check
|
|
94
|
-
* @param retryableStatuses - HTTP status codes considered retryable
|
|
95
|
-
* @returns True if the error is transient and should be retried
|
|
96
|
-
*
|
|
97
|
-
* @example
|
|
98
|
-
* ```typescript
|
|
99
|
-
* // HTTP 429 Too Many Requests
|
|
100
|
-
* const rateLimitError = new Error('Rate limited');
|
|
101
|
-
* (rateLimitError as any).status = 429;
|
|
102
|
-
* isTransientError(rateLimitError); // true
|
|
103
|
-
*
|
|
104
|
-
* // Network error
|
|
105
|
-
* const networkError = new Error('Connection reset');
|
|
106
|
-
* (networkError as any).code = 'ECONNRESET';
|
|
107
|
-
* isTransientError(networkError); // true
|
|
108
|
-
*
|
|
109
|
-
* // Client error (not retryable)
|
|
110
|
-
* const clientError = new Error('Bad request');
|
|
111
|
-
* (clientError as any).status = 400;
|
|
112
|
-
* isTransientError(clientError); // false
|
|
113
|
-
* ```
|
|
114
|
-
*/
|
|
115
|
-
export function isTransientError(error, retryableStatuses = DEFAULT_RETRYABLE_STATUSES) {
|
|
116
|
-
const errorWithStatus = error;
|
|
117
|
-
// Check for HTTP status codes
|
|
118
|
-
const statusCode = errorWithStatus.statusCode ?? errorWithStatus.status;
|
|
119
|
-
if (statusCode !== undefined && retryableStatuses.includes(statusCode)) {
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
// Check for network error codes
|
|
123
|
-
const errorCode = errorWithStatus.code;
|
|
124
|
-
if (errorCode !== undefined && TRANSIENT_ERROR_CODES.has(errorCode)) {
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Sleep for a specified duration.
|
|
131
|
-
* @param ms - Duration in milliseconds
|
|
132
|
-
* @returns Promise that resolves after the duration
|
|
133
|
-
*/
|
|
134
|
-
function sleep(ms) {
|
|
135
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Execute an async function with automatic retry on transient failures.
|
|
139
|
-
*
|
|
140
|
-
* Uses exponential backoff with optional jitter to retry failed operations.
|
|
141
|
-
* Only retries on transient errors (rate limits, server errors, network issues).
|
|
142
|
-
*
|
|
143
|
-
* @typeParam T - The return type of the async function
|
|
144
|
-
* @param fn - The async function to execute
|
|
145
|
-
* @param options - Retry configuration options
|
|
146
|
-
* @returns The result of the successful function call
|
|
147
|
-
* @throws {RetryError} When all retry attempts are exhausted
|
|
148
|
-
* @throws {Error} When a non-transient error occurs
|
|
149
|
-
*
|
|
150
|
-
* @example
|
|
151
|
-
* ```typescript
|
|
152
|
-
* // Basic usage
|
|
153
|
-
* const result = await retry(() => fetchFromLLM(prompt));
|
|
154
|
-
*
|
|
155
|
-
* // With custom options
|
|
156
|
-
* const result = await retry(
|
|
157
|
-
* () => fetchFromLLM(prompt),
|
|
158
|
-
* {
|
|
159
|
-
* maxRetries: 5,
|
|
160
|
-
* baseDelay: 2000,
|
|
161
|
-
* onRetry: (error, attempt, delay) => {
|
|
162
|
-
* console.log(`Retry ${attempt} after ${delay}ms: ${error.message}`);
|
|
163
|
-
* }
|
|
164
|
-
* }
|
|
165
|
-
* );
|
|
166
|
-
* ```
|
|
167
|
-
*/
|
|
168
|
-
export async function retry(fn, options = {}) {
|
|
169
|
-
const { maxRetries = 3, baseDelay = 1000, maxDelay = 30000, jitter = true, retryableStatuses = DEFAULT_RETRYABLE_STATUSES, onRetry, } = options;
|
|
170
|
-
let lastError;
|
|
171
|
-
let attempt = 0;
|
|
172
|
-
// Total attempts = 1 initial + maxRetries
|
|
173
|
-
const totalAttempts = maxRetries + 1;
|
|
174
|
-
while (attempt < totalAttempts) {
|
|
175
|
-
try {
|
|
176
|
-
return await fn();
|
|
177
|
-
}
|
|
178
|
-
catch (error) {
|
|
179
|
-
// Ensure we have an Error object
|
|
180
|
-
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
181
|
-
lastError = errorObj;
|
|
182
|
-
// Check if we've exhausted retries
|
|
183
|
-
if (attempt >= maxRetries) {
|
|
184
|
-
throw new RetryError(`All ${totalAttempts} attempts failed. Last error: ${errorObj.message}`, totalAttempts, errorObj);
|
|
185
|
-
}
|
|
186
|
-
// Check if error is retryable
|
|
187
|
-
if (!isTransientError(errorObj, retryableStatuses)) {
|
|
188
|
-
// Non-transient error, don't retry
|
|
189
|
-
throw errorObj;
|
|
190
|
-
}
|
|
191
|
-
// Calculate delay for next retry
|
|
192
|
-
const delay = calculateDelay(attempt, baseDelay, maxDelay, jitter);
|
|
193
|
-
// Invoke onRetry callback if provided
|
|
194
|
-
if (onRetry) {
|
|
195
|
-
onRetry(errorObj, attempt + 1, delay);
|
|
196
|
-
}
|
|
197
|
-
// Wait before retrying
|
|
198
|
-
await sleep(delay);
|
|
199
|
-
attempt++;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
// This should never be reached, but TypeScript needs it
|
|
203
|
-
throw new RetryError(`All ${totalAttempts} attempts failed.`, totalAttempts, lastError ?? new Error('Unknown error'));
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=retry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../src/providers/retry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|